X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2FAST%2Felement.cc;h=f575a9034c2565695ac2f1696d0a5af2541c5e21;hb=77f32c79afdf12f29c040d511cd84f15d703ceb9;hp=32b372a0ba3d279aca029c9428e2e61515258cff;hpb=7ab5516d0205e463969af92c1b200a316d4a08f0;p=satune.git diff --git a/src/AST/element.cc b/src/AST/element.cc index 32b372a..f575a90 100644 --- a/src/AST/element.cc +++ b/src/AST/element.cc @@ -4,6 +4,7 @@ #include "constraint.h" #include "function.h" #include "table.h" +#include "csolver.h" Element::Element(ASTNodeType _type) : ASTNode(_type), @@ -15,51 +16,128 @@ ElementSet::ElementSet(Set *s) : set(s) { } -ElementFunction::ElementFunction(Function *_function, Element **array, uint numArrays, Boolean *_overflowstatus) : +ElementSet::ElementSet(ASTNodeType _type, Set *s) : + Element(_type), + set(s) { +} + +ElementFunction::ElementFunction(Function *_function, Element **array, uint numArrays, BooleanEdge _overflowstatus) : Element(ELEMFUNCRETURN), - function(_function), inputs(array, numArrays), overflowstatus(_overflowstatus), - functionencoding(this) { - for (uint i = 0; i < numArrays; i++) - GETELEMENTPARENTS(array[i])->push(this); -} - -ElementConst::ElementConst(uint64_t _value, VarType _type) : Element(ELEMCONST), value(_value) { - uint64_t array[] = {value}; - set = new Set(_type, array, 1); -} - -Set *getElementSet(Element *This) { - switch (GETELEMENTTYPE(This)) { - case ELEMSET: - return ((ElementSet *)This)->set; - case ELEMCONST: - return ((ElementConst *)This)->set; - case ELEMFUNCRETURN: { - Function *func = ((ElementFunction *)This)->function; - switch (GETFUNCTIONTYPE(func)) { - case TABLEFUNC: - return ((FunctionTable *)func)->table->range; - case OPERATORFUNC: - return ((FunctionOperator *)func)->range; - default: - ASSERT(0); - } - } - default: - ASSERT(0); + functionencoding(this), + function(_function) { +} + +ElementConst::ElementConst(uint64_t _value, Set *_set) : + ElementSet(ELEMCONST, _set), + value(_value) { +} + +Element *ElementConst::clone(CSolver *solver, CloneMap *map) { + return solver->getElementConst(type, value); +} + +Element *ElementSet::clone(CSolver *solver, CloneMap *map) { + Element *e = (Element *) map->get(this); + if (e != NULL) + return e; + e = solver->getElementVar(set->clone(solver, map)); + map->put(e, e); + return e; +} + +Element *ElementFunction::clone(CSolver *solver, CloneMap *map) { + Element *array[inputs.getSize()]; + for (uint i = 0; i < inputs.getSize(); i++) { + array[i] = inputs.get(i)->clone(solver, map); } - ASSERT(0); - return NULL; + Element *e = solver->applyFunction(function->clone(solver, map), array, inputs.getSize(), overflowstatus->clone(solver, map)); + return e; } -ElementFunction::~ElementFunction() { +void ElementFunction::updateParents() { + for (uint i = 0; i < inputs.getSize(); i++) inputs.get(i)->parents.push(this); } -ElementConst::~ElementConst() { - delete set; +Set *ElementFunction::getRange() { + return function->getRange(); +} + +void ElementSet::serialize(Serializer *serializer) { + if (serializer->isSerialized(this)) + return; + serializer->addObject(this); + + set->serialize(serializer); + + serializer->mywrite(&type, sizeof(ASTNodeType)); + ElementSet *This = this; + serializer->mywrite(&This, sizeof(ElementSet *)); + serializer->mywrite(&set, sizeof(Set *)); } -Element::~Element() { +void ElementSet::print() { + model_print("{ElementSet:"); + set->print(); + model_print(" %p ", this); + getElementEncoding()->print(); + model_print("}"); +} + +void ElementConst::serialize(Serializer *serializer) { + if (serializer->isSerialized(this)) + return; + serializer->addObject(this); + + set->serialize(serializer); + + serializer->mywrite(&type, sizeof(ASTNodeType)); + ElementSet *This = this; + serializer->mywrite(&This, sizeof(ElementSet *)); + VarType type = set->getType(); + serializer->mywrite(&type, sizeof(VarType)); + serializer->mywrite(&value, sizeof(uint64_t)); +} + +void ElementConst::print() { + model_print("{ElementConst: %" PRIu64 "}\n", value); +} + +void ElementFunction::serialize(Serializer *serializer) { + if (serializer->isSerialized(this)) + return; + serializer->addObject(this); + + function->serialize(serializer); + uint size = inputs.getSize(); + for (uint i = 0; i < size; i++) { + Element *input = inputs.get(i); + input->serialize(serializer); + } + serializeBooleanEdge(serializer, overflowstatus); + + serializer->mywrite(&type, sizeof(ASTNodeType)); + ElementFunction *This = this; + serializer->mywrite(&This, sizeof(ElementFunction *)); + serializer->mywrite(&function, sizeof(Function *)); + serializer->mywrite(&size, sizeof(uint)); + for (uint i = 0; i < size; i++) { + Element *input = inputs.get(i); + serializer->mywrite(&input, sizeof(Element *)); + } + Boolean *overflowstat = overflowstatus.getRaw(); + serializer->mywrite(&overflowstat, sizeof(Boolean *)); +} + +void ElementFunction::print() { + model_print("{ElementFunction:\n"); + function->print(); + model_print("Elements:\n"); + uint size = inputs.getSize(); + for (uint i = 0; i < size; i++) { + Element *input = inputs.get(i); + input->print(); + } + model_print("}\n"); }