X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FAST%2Felement.cc;h=d09db20631e9a56e4ca8162ce4fbcf690025b513;hp=e47d195eff65058896da811c77e90ef79c713c1f;hb=8806dcf7185b7d3dd770ca64bbc0774bcbe8c90c;hpb=b03787cd7584eea5b44ae5303576295e52b01289 diff --git a/src/AST/element.cc b/src/AST/element.cc index e47d195..d09db20 100644 --- a/src/AST/element.cc +++ b/src/AST/element.cc @@ -16,46 +16,24 @@ 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++) - array[i]->parents.push(this); + functionencoding(this), + function(_function) { } -ElementConst::ElementConst(uint64_t _value, VarType _type, Set *_set) : - Element(ELEMCONST), - set(_set), +ElementConst::ElementConst(uint64_t _value, Set *_set) : + ElementSet(ELEMCONST, _set), value(_value) { } -Set *getElementSet(Element *This) { - switch (This->type) { - case ELEMSET: - return ((ElementSet *)This)->set; - case ELEMCONST: - return ((ElementConst *)This)->set; - case ELEMFUNCRETURN: { - Function *func = ((ElementFunction *)This)->function; - switch (func->type) { - case TABLEFUNC: - return ((FunctionTable *)func)->table->range; - case OPERATORFUNC: - return ((FunctionOperator *)func)->range; - default: - ASSERT(0); - } - } - default: - ASSERT(0); - } - ASSERT(0); - return NULL; -} - Element *ElementConst::clone(CSolver *solver, CloneMap *map) { return solver->getElementConst(type, value); } @@ -65,7 +43,7 @@ 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); return e; } @@ -77,3 +55,93 @@ Element *ElementFunction::clone(CSolver *solver, CloneMap *map) { Element *e = solver->applyFunction(function->clone(solver, map), array, inputs.getSize(), overflowstatus->clone(solver, map)); return e; } + +void ElementFunction::updateParents() { + for (uint i = 0; i < inputs.getSize(); i++) inputs.get(i)->parents.push(this); +} + +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 *)); +} + +void ElementSet::print() { + model_print("{ElementSet<%p>:", this); + 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<%p>: %" PRIu64 "}\n", this, 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<%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++) { + Element *input = inputs.get(i); + input->print(); + } + model_print("}\n"); +}