X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FAST%2Fboolean.cc;h=c576268058f3b5203687a2d6cef9e496a90bcf2e;hp=4ca9c404522deb2e324fc617580e8243d2159b37;hb=8806dcf7185b7d3dd770ca64bbc0774bcbe8c90c;hpb=3b44d67aa34198bde59d8b346ea316ba7fb6d73d diff --git a/src/AST/boolean.cc b/src/AST/boolean.cc index 4ca9c40..c576268 100644 --- a/src/AST/boolean.cc +++ b/src/AST/boolean.cc @@ -28,6 +28,9 @@ BooleanOrder::BooleanOrder(Order *_order, uint64_t _first, uint64_t _second) : order(_order), first(_first), second(_second) { +} + +void BooleanOrder::updateParents() { order->constraints.push(this); } @@ -37,9 +40,6 @@ BooleanPredicate::BooleanPredicate(Predicate *_predicate, Element **_inputs, uin encoding(this), inputs(_inputs, _numInputs), undefStatus(_undefinedStatus) { - for (uint i = 0; i < _numInputs; i++) { - _inputs[i]->parents.push(this); - } } BooleanLogic::BooleanLogic(CSolver *solver, LogicOp _op, BooleanEdge *array, uint asize) : @@ -47,15 +47,12 @@ BooleanLogic::BooleanLogic(CSolver *solver, LogicOp _op, BooleanEdge *array, uin op(_op), replaced(false), inputs(array, asize) { - for (uint i = 0; i < asize; i++) { - array[i]->parents.push(this); - } } BooleanEdge cloneEdge(CSolver *solver, CloneMap *map, BooleanEdge e) { - bool isnegated=e.isNegated(); - Boolean *b=e->clone(solver, map); - BooleanEdge be=BooleanEdge(b); + bool isnegated = e.isNegated(); + Boolean *b = e->clone(solver, map); + BooleanEdge be = BooleanEdge(b); return isnegated ? be.negate() : be; } @@ -68,7 +65,7 @@ Boolean *BooleanVar::clone(CSolver *solver, CloneMap *map) { if (b != NULL) return b; BooleanEdge bvar = solver->getBooleanVar(type); - Boolean * base=bvar.getRaw(); + Boolean *base = bvar.getRaw(); map->put(this, base); return base; } @@ -96,3 +93,124 @@ Boolean *BooleanPredicate::clone(CSolver *solver, CloneMap *map) { return solver->applyPredicateTable(pred, array, inputs.getSize(), defstatus).getRaw(); } + +void BooleanPredicate::updateParents() { + for (uint i = 0; i < inputs.getSize(); i++) inputs.get(i)->parents.push(this); + if (undefStatus) + undefStatus->parents.push(this); +} + +void BooleanLogic::updateParents() { + for (uint i = 0; i < inputs.getSize(); i++) inputs.get(i)->parents.push(this); +} + +void BooleanVar::serialize(Serializer *serializer) { + if (serializer->isSerialized(this)) + return; + serializer->addObject(this); + serializer->mywrite(&type, sizeof(ASTNodeType)); + BooleanVar *This = this; + serializer->mywrite(&This, sizeof(BooleanVar *)); + serializer->mywrite(&vtype, sizeof(VarType)); +} + +void BooleanVar::print() { + model_print("BooleanVar<%p>\n", this); +} + +void BooleanConst::print() { + model_print("BooleanConst<%p>:%s\n", this, istrue ? "TRUE" : "FALSE"); +} + +void BooleanOrder::serialize(Serializer *serializer) { + if (serializer->isSerialized(this)) + return; + serializer->addObject(this); + order->serialize(serializer); + + serializer->mywrite(&type, sizeof(ASTNodeType)); + BooleanOrder *This = this; + serializer->mywrite(&This, sizeof(BooleanOrder *)); + serializer->mywrite(&order, sizeof(Order *)); + serializer->mywrite(&first, sizeof(uint64_t)); + serializer->mywrite(&second, sizeof(uint64_t)); +} + +void BooleanOrder::print() { + model_print("{BooleanOrder<%p>: First= %lu, Second = %lu on Order:\n", this, first, second); + order->print(); + model_print("}\n"); +} + +void BooleanPredicate::serialize(Serializer *serializer) { + if (serializer->isSerialized(this)) + return; + serializer->addObject(this); + + predicate->serialize(serializer); + uint size = inputs.getSize(); + for (uint i = 0; i < size; i++) { + Element *input = inputs.get(i); + input->serialize(serializer); + } + serializeBooleanEdge(serializer, undefStatus); + + serializer->mywrite(&type, sizeof(ASTNodeType)); + BooleanPredicate *This = this; + serializer->mywrite(&This, sizeof(BooleanPredicate *)); + serializer->mywrite(&predicate, sizeof(Predicate *)); + serializer->mywrite(&size, sizeof(uint)); + for (uint i = 0; i < size; i++) { + Element *input = inputs.get(i); + serializer->mywrite(&input, sizeof(Element *)); + } + Boolean *undefStat = undefStatus != BooleanEdge(NULL) ? undefStatus.getRaw() : NULL; + serializer->mywrite(&undefStat, sizeof(Boolean *)); +} + +void BooleanPredicate::print() { + model_print("{BooleanPredicate<%p>:\n", this); + predicate->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"); +} + +void BooleanLogic::serialize(Serializer *serializer) { + if (serializer->isSerialized(this)) + return; + serializer->addObject(this); + uint size = inputs.getSize(); + for (uint i = 0; i < size; i++) { + BooleanEdge input = inputs.get(i); + serializeBooleanEdge(serializer, input); + } + serializer->mywrite(&type, sizeof(ASTNodeType)); + BooleanLogic *This = this; + serializer->mywrite(&This, sizeof(BooleanLogic *)); + serializer->mywrite(&op, sizeof(LogicOp)); + serializer->mywrite(&size, sizeof(uint)); + for (uint i = 0; i < size; i++) { + Boolean *input = inputs.get(i).getRaw(); + serializer->mywrite(&input, sizeof(Boolean *)); + } +} + +void BooleanLogic::print() { + model_print("{BooleanLogic<%p>: %s\n", this, + op == SATC_AND ? "AND" : op == SATC_OR ? "OR" : op == SATC_NOT ? "NOT" : + op == SATC_XOR ? "XOR" : op == SATC_IFF ? "IFF" : "IMPLIES"); + uint size = inputs.getSize(); + for (uint i = 0; i < size; i++) { + BooleanEdge input = inputs.get(i); + if (input.isNegated()) + model_print("!"); + input.getBoolean()->print(); + } + model_print("}\n"); +} +