Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/constraint_compiler into...
[satune.git] / src / ASTTransform / preprocess.cc
1 #include "preprocess.h"
2 #include "boolean.h"
3 #include "csolver.h"
4 #include "tunable.h"
5
6 Preprocess::Preprocess(CSolver *_solver)
7         : Transform(_solver)
8 {
9 }
10
11 Preprocess::~Preprocess() {
12 }
13
14 void Preprocess::doTransform() {
15         if (solver->getTuner()->getTunable(PREPROCESS, &onoff) == 0)
16                 return;
17         
18         SetIteratorBooleanEdge *iterator = solver->getConstraints();
19         while (iterator->hasNext()) {
20                 BooleanEdge boolean = iterator->next();
21                 Boolean *b = boolean.getBoolean();
22                 transformBoolean(b);
23         }
24         delete iterator;
25         resolveBooleanVars();
26 }
27
28 void Preprocess::resolveBooleanVars() {
29         SetIteratorBoolean * iterator = toremove.iterator();
30         while (iterator->hasNext()) {
31                 BooleanVar *bv = (BooleanVar *) iterator->next();
32                 if (bv->polarity == P_TRUE) {
33                         solver->replaceBooleanWithTrue(BooleanEdge(bv));
34                 } else if (bv->polarity == P_FALSE) {
35                         solver->replaceBooleanWithFalse(BooleanEdge(bv));
36                 }
37         }
38         delete iterator;
39 }
40
41 void Preprocess::transformBoolean(Boolean *b) {
42         if (!processed.add(b))
43                 return;
44         switch (b->type) {
45         case BOOLEANVAR:
46                 processBooleanVar((BooleanVar *)b);
47                 break;
48         case LOGICOP:
49                 processLogicOp((BooleanLogic *)b);
50                 break;
51         default:
52                 break;
53         }
54 }
55
56 void Preprocess::processBooleanVar(BooleanVar * b) {
57         if (b->polarity==P_TRUE ||
58                         b->polarity==P_FALSE) {
59                 toremove.add(b);
60         }
61 }
62
63 void Preprocess::processLogicOp(BooleanLogic * b) {
64         for(uint i=0; i < b->inputs.getSize(); i++)
65                 transformBoolean(b->inputs.get(i).getBoolean());
66 }