X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FAST%2Felement.cc;h=565187afc1ab5996f85be63b8a4c8a79790b2223;hp=e47d195eff65058896da811c77e90ef79c713c1f;hb=27413a58e0ac937614ba6c6e88e1d85d0e526e49;hpb=db18e3357fda778cdf03b6338a0301b4bd9525c2 diff --git a/src/AST/element.cc b/src/AST/element.cc index e47d195..565187a 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; } @@ -74,6 +52,97 @@ 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); 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"); +}