1 #include "encodinggraph.h"
10 EncodingGraph::EncodingGraph(CSolver * _solver) :
16 void EncodingGraph::buildGraph() {
17 ElementIterator it(solver);
19 Element * e = it.next();
33 void EncodingGraph::processElement(Element *e) {
34 uint size=e->parents.getSize();
35 for(uint i=0;i<size;i++) {
36 ASTNode * n = e->parents.get(i);
39 processPredicate((BooleanPredicate *)n);
42 processFunction((ElementFunction *)n);
50 void EncodingGraph::processFunction(ElementFunction *ef) {
51 Function *f=ef->getFunction();
52 if (f->type==OPERATORFUNC) {
53 FunctionOperator *fo=(FunctionOperator*)f;
54 ASSERT(ef->inputs.getSize() == 2);
55 EncodingNode *left=createNode(ef->inputs.get(0));
56 EncodingNode *right=createNode(ef->inputs.get(1));
57 if (left == NULL && right == NULL)
59 EncodingNode *dst=createNode(ef);
60 EncodingEdge *edge=getEdge(left, right, dst);
65 void EncodingGraph::processPredicate(BooleanPredicate *b) {
66 Predicate *p=b->getPredicate();
67 if (p->type==OPERATORPRED) {
68 PredicateOperator *po=(PredicateOperator *)p;
69 ASSERT(b->inputs.getSize()==2);
70 EncodingNode *left=createNode(b->inputs.get(0));
71 EncodingNode *right=createNode(b->inputs.get(1));
72 if (left == NULL || right == NULL)
74 EncodingEdge *edge=getEdge(left, right, NULL);
75 CompOp op=po->getOp();
84 edge->numComparisons++;
92 EncodingEdge * EncodingGraph::getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst) {
93 EncodingEdge e(left, right, dst);
94 EncodingEdge *result = edgeMap.get(&e);
96 result=new EncodingEdge(left, right, dst);
97 edgeMap.put(result, result);
102 EncodingNode::EncodingNode(Set *_s) :
107 uint EncodingNode::getSize() {
111 VarType EncodingNode::getType() {
115 //ELEM_UNASSIGNED, ONEHOT, UNARY, BINARYINDEX, ONEHOTBINARY, BINARYVAL
117 static TunableDesc NodeEncodingType(ELEM_UNASSIGNED, BINARYVAL, ELEM_UNASSIGNED);
119 EncodingNode * EncodingGraph::createNode(Element *e) {
120 if (e->type == ELEMCONST)
122 Set *s = e->getRange();
123 EncodingNode *n = encodingMap.get(s);
125 n = new EncodingNode(s);
126 n->setEncoding((ElementEncodingType)solver->getTuner()->getVarTunable(n->getType(), NODEENCODING, &NodeEncodingType));
127 encodingMap.put(s, n);
130 if (discovered.add(e))
135 void EncodingNode::addElement(Element *e) {
139 EncodingEdge::EncodingEdge(EncodingNode *_l, EncodingNode *_r) :
149 EncodingEdge::EncodingEdge(EncodingNode *_left, EncodingNode *_right, EncodingNode *_dst) :
159 uint hashEncodingEdge(EncodingEdge *edge) {
160 uintptr_t hash=(((uintptr_t) edge->left) >> 2) ^ (((uintptr_t)edge->right) >> 4) ^ (((uintptr_t)edge->dst) >> 6);
164 bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2) {
165 return e1->left == e2->left && e1->right == e2->right && e1->dst == e2->dst;