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) :
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) {
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);
+}
+
+void BooleanLogic::updateParents() {
+ for(uint i=0;i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
+}
Polarity polarity;
BooleanValue boolVal;
Vector<Boolean *> parents;
-
+ virtual void updateParents() {}
+
CMEMALLOC;
};
Array<Element *> inputs;
BooleanEdge undefStatus;
FunctionEncoding *getFunctionEncoding() {return &encoding;}
+ void updateParents();
+
CMEMALLOC;
};
LogicOp op;
bool replaced;
Array<BooleanEdge> inputs;
+ void updateParents();
+
CMEMALLOC;
};
BooleanEdge cloneEdge(CSolver *solver, CloneMap *map, BooleanEdge e);
inputs(array, numArrays),
overflowstatus(_overflowstatus),
functionencoding(this) {
- for (uint i = 0; i < numArrays; i++)
- array[i]->parents.push(this);
}
ElementConst::ElementConst(uint64_t _value, VarType _type, Set *_set) :
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);
+}
Vector<ASTNode *> parents;
ElementEncoding encoding;
virtual Element *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;};
-
+ virtual void updateParents() {}
+
CMEMALLOC;
};
BooleanEdge overflowstatus;
FunctionEncoding functionencoding;
Element *clone(CSolver *solver, CloneMap *map);
+ void updateParents();
CMEMALLOC;
};
#include "set.h"
#include "csolver.h"
-FunctionOperator::FunctionOperator(ArithOp _op, Set **domain, uint numDomain, Set *_range, OverFlowBehavior _overflowbehavior) : Function(OPERATORFUNC), op(_op), domains(domain, numDomain), range(_range), overflowbehavior(_overflowbehavior) {
+FunctionOperator::FunctionOperator(ArithOp _op, Set **domain, uint numDomain, Set *_range, OverFlowBehavior _overflowbehavior) :
+ Function(OPERATORFUNC),
+ op(_op),
+ domains(domain, numDomain),
+ range(_range),
+ overflowbehavior(_overflowbehavior) {
}
-FunctionTable::FunctionTable (Table *_table, UndefinedBehavior _undefBehavior) : Function(TABLEFUNC), table(_table), undefBehavior(_undefBehavior) {
+FunctionTable::FunctionTable (Table *_table, UndefinedBehavior _undefBehavior) :
+ Function(TABLEFUNC),
+ table(_table),
+ undefBehavior(_undefBehavior) {
}
uint64_t FunctionOperator::applyFunctionOperator(uint numVals, uint64_t *values) {
Element *element = new ElementFunction(function,array,numArrays,overflowstatus);
Element *e = elemMap.get(element);
if (e == NULL) {
+ element->updateParents();
allElements.push(element);
elemMap.put(element, element);
return element;
BooleanPredicate *boolean = new BooleanPredicate(predicate, inputs, numInputs, undefinedStatus);
Boolean *b = boolMap.get(boolean);
if (b == NULL) {
+ boolean->updateParents();
boolMap.put(boolean, boolean);
allBooleans.push(boolean);
return BooleanEdge(boolean);
Boolean *boolean = new BooleanLogic(this, op, array, asize);
Boolean *b = boolMap.get(boolean);
if (b == NULL) {
+ boolean->updateParents();
boolMap.put(boolean, boolean);
allBooleans.push(boolean);
return BooleanEdge(boolean);
void * ourrealloc(void *ptr, size_t size);
*/
-#if 0
+#if 1
void * model_malloc(size_t size);
void model_free(void *ptr);
void * model_calloc(size_t count, size_t size);