more code
[satune.git] / src / ASTTransform / elementopt.cc
index 5fa38e6684cf2baf772e2440654df485575f7263..c9ccc443531224c82bb51b87a5ebd54276f1364e 100755 (executable)
@@ -17,13 +17,18 @@ ElementOpt::~ElementOpt() {
 void ElementOpt::doTransform() {
        if (solver->getTuner()->getTunable(ELEMENTOPT, &onoff) == 0)
                return;
-
-       BooleanIterator bit(solver);
-       while (bit.hasNext()) {
-               Boolean *b = bit.next();
-               if (b->type == PREDICATEOP)
-                       processPredicate((BooleanPredicate *)b);
+       
+       SetIteratorBooleanEdge *iterator = solver->getConstraints();
+       while (iterator->hasNext()) {
+               BooleanEdge constraint = iterator->next();
+               if (constraint->type == PREDICATEOP)
+                       workList.push((BooleanPredicate *)constraint.getBoolean());
+       }
+       while (workList.getSize() != 0) {
+               BooleanPredicate * pred = workList.last(); workList.pop();
+               processPredicate(pred);
        }
+       delete iterator;
 }
 
 void ElementOpt::processPredicate(BooleanPredicate * pred) {
@@ -42,10 +47,51 @@ void ElementOpt::processPredicate(BooleanPredicate * pred) {
        Element * right = pred->inputs.get(1);
 
        if (left->type == ELEMCONST) {
+               Element * tmp = left;
+               left = right;
+               right = tmp;
+               op = flipOp(op);
+       } else if (right->type != ELEMCONST)
+               return;
 
-       } else if (right->type == ELEMCONST) {
-
-       } else {
+       if (left->type !=ELEMSET)
                return;
+       
+       if (op == SATC_EQUALS) {
+               handlePredicateEquals(pred, (ElementSet *) left, (ElementConst *) right);
+       } else {
+               handlePredicateInequality(pred, (ElementSet *) left, (ElementConst *) right);
+       }
+}
+
+void ElementOpt::handlePredicateEquals(BooleanPredicate *pred, ElementSet *left, ElementConst *right) {
+       if (pred->isTrue()) {
+               replaceVarWithConst(pred, left, right);
+       } else if (pred->isFalse()) {
+               
+       } else ASSERT(0);
+}
+
+void ElementOpt::handlePredicateInequality(BooleanPredicate *pred, ElementSet *left, ElementConst *right) {
+
+}
+
+void ElementOpt::replaceVarWithConst(BooleanPredicate * pred, ElementSet *var, ElementConst * value) {
+       uint size = var->parents.getSize();
+       for(uint i=0; i < size; i++) {
+               ASTNode * parent = var->parents.get(i);
+               if (parent->type == PREDICATEOP && pred != parent) {
+                       BooleanPredicate * newpred = (BooleanPredicate *) parent;
+                       for(uint j=0; j < newpred->inputs.getSize(); j++) {
+                               Element * e = newpred->inputs.get(j);
+                               if (e == var) {
+                                       solver->boolMap.remove(newpred);
+                                       newpred->inputs.set(j, value);
+                                       solver->boolMap.put(newpred, newpred);
+                                       workList.push(newpred);
+                                       break;
+                               }
+                       }
+               }
        }
 }