X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FAST%2Felement.cc;h=4fc9f4b37d08a2e4290cef2b078d72290d8e79b3;hp=ffe7acc929bfa534e15596a037ae7b90ee5ee92a;hb=85d422935f1a6ebdb689f4108185521b022a51d9;hpb=09f6a69ae4cc6796fe901ae9d22e0cf62a5ea2fb diff --git a/src/AST/element.cc b/src/AST/element.cc index ffe7acc..4fc9f4b 100644 --- a/src/AST/element.cc +++ b/src/AST/element.cc @@ -8,7 +8,9 @@ Element::Element(ASTNodeType _type) : ASTNode(_type), - encoding(this) { + encoding(this), + anyValue(false), + frozen(false) { } ElementSet::ElementSet(Set *s) : @@ -35,7 +37,9 @@ ElementConst::ElementConst(uint64_t _value, Set *_set) : } Element *ElementConst::clone(CSolver *solver, CloneMap *map) { - return solver->getElementConst(type, value); + Element *e = solver->getElementConst(type, value); + e->anyValue = anyValue; + return e; } Element *ElementSet::clone(CSolver *solver, CloneMap *map) { @@ -43,7 +47,8 @@ Element *ElementSet::clone(CSolver *solver, CloneMap *map) { if (e != NULL) return e; e = solver->getElementVar(set->clone(solver, map)); - map->put(e, e); + map->put(this, e); + e->anyValue = anyValue; return e; } @@ -52,12 +57,16 @@ Element *ElementFunction::clone(CSolver *solver, CloneMap *map) { for (uint i = 0; i < inputs.getSize(); i++) { array[i] = inputs.get(i)->clone(solver, map); } - Element *e = solver->applyFunction(function->clone(solver, map), array, inputs.getSize(), overflowstatus->clone(solver, map)); + BooleanEdge ofstatus = overflowstatus ? cloneEdge(solver, map, overflowstatus) : BooleanEdge(); + Element *e = solver->applyFunction(function->clone(solver, map), array, inputs.getSize(), ofstatus); + e->anyValue = anyValue; return e; } void ElementFunction::updateParents() { for (uint i = 0; i < inputs.getSize(); i++) inputs.get(i)->parents.push(this); + if (overflowstatus) + overflowstatus->parents.push(this); } Set *ElementFunction::getRange() { @@ -72,6 +81,7 @@ void ElementSet::serialize(Serializer *serializer) { set->serialize(serializer); serializer->mywrite(&type, sizeof(ASTNodeType)); + serializer->mywrite(&anyValue, sizeof(bool)); ElementSet *This = this; serializer->mywrite(&This, sizeof(ElementSet *)); serializer->mywrite(&set, sizeof(Set *)); @@ -93,6 +103,7 @@ void ElementConst::serialize(Serializer *serializer) { set->serialize(serializer); serializer->mywrite(&type, sizeof(ASTNodeType)); + serializer->mywrite(&anyValue, sizeof(bool)); ElementSet *This = this; serializer->mywrite(&This, sizeof(ElementSet *)); VarType type = set->getType(); @@ -118,6 +129,7 @@ void ElementFunction::serialize(Serializer *serializer) { serializeBooleanEdge(serializer, overflowstatus); serializer->mywrite(&type, sizeof(ASTNodeType)); + serializer->mywrite(&anyValue, sizeof(bool)); ElementFunction *This = this; serializer->mywrite(&This, sizeof(ElementFunction *)); serializer->mywrite(&function, sizeof(Function *)); @@ -133,6 +145,10 @@ void ElementFunction::serialize(Serializer *serializer) { void ElementFunction::print() { model_print("{ElementFunction<%p>:\n", this); function->print(); + model_print("OverFlow Boolean Flag:\n"); + overflowstatus.getBoolean()->print(); + model_print("Range:\n"); + getRange()->print(); model_print("Elements:\n"); uint size = inputs.getSize(); for (uint i = 0; i < size; i++) {