X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FAST%2Felement.cc;h=f575a9034c2565695ac2f1696d0a5af2541c5e21;hp=fd308122caee3b28cd5a71226d4f591872113f57;hb=77f32c79afdf12f29c040d511cd84f15d703ceb9;hpb=516fb5585a776bde6277eeb3c46f09620dd20a5f diff --git a/src/AST/element.cc b/src/AST/element.cc index fd30812..f575a90 100644 --- a/src/AST/element.cc +++ b/src/AST/element.cc @@ -16,44 +16,24 @@ ElementSet::ElementSet(Set *s) : set(s) { } +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) { + 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); } @@ -77,5 +57,87 @@ Element *ElementFunction::clone(CSolver *solver, CloneMap *map) { } void ElementFunction::updateParents() { - for(uint i=0;i < inputs.getSize(); i++) inputs.get(i)->parents.push(this); + 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:"); + 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"); }