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) {
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;
+ }
+ }
+ }
}
}
Set *getElementRange (Element *element);
- void mustHaveValue(Element *element);
+ void mustHaveValue(Element *element);
BooleanEdge getBooleanTrue();
void replaceBooleanWithFalse(BooleanEdge bexpr);
void replaceBooleanWithBoolean(BooleanEdge oldb, BooleanEdge newb);
CSolver *clone();
-// Set* addItemsToRange(Element* element, uint num, ...);
void serialize();
static CSolver *deserialize(const char *file);
void autoTune(uint budget);
bool unsat;
Tuner *tuner;
long long elapsedTime;
+ friend class ElementOpt;
};
+
+inline CompOp flipOp(CompOp op) {
+ switch (op) {
+ case SATC_EQUALS:
+ return SATC_EQUALS;
+ case SATC_LT:
+ return SATC_GT;
+ case SATC_GT:
+ return SATC_LT;
+ case SATC_LTE:
+ return SATC_GTE;
+ case SATC_GTE:
+ return SATC_LTE;
+ }
+ ASSERT(0);
+}
#endif