From f8114fde2e6b5498e21b632906282284fd22e8aa Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 19 Sep 2017 17:15:38 -0700 Subject: [PATCH] edits --- src/ASTAnalyses/Encoding/encodinggraph.cc | 38 +++++++++++++++++++++-- src/ASTAnalyses/Encoding/encodinggraph.h | 4 +++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/ASTAnalyses/Encoding/encodinggraph.cc b/src/ASTAnalyses/Encoding/encodinggraph.cc index 3bcf68e..9b446fa 100644 --- a/src/ASTAnalyses/Encoding/encodinggraph.cc +++ b/src/ASTAnalyses/Encoding/encodinggraph.cc @@ -88,8 +88,34 @@ void EncodingGraph::encode() { default: break; } + encodeParent(e); + } +} + +void EncodingGraph::encodeParent(Element *e) { + uint size=e->parents.getSize(); + for(uint i=0;iparents.get(i); + if (n->type==PREDICATEOP) { + BooleanPredicate *b=(BooleanPredicate *)n; + FunctionEncoding *fenc=b->getFunctionEncoding(); + if (fenc->getFunctionEncodingType() != FUNC_UNASSIGNED) + continue; + Predicate *p=b->getPredicate(); + if (p->type==OPERATORPRED) { + PredicateOperator *po=(PredicateOperator *)p; + ASSERT(b->inputs.getSize()==2); + EncodingNode *left=createNode(b->inputs.get(0)); + EncodingNode *right=createNode(b->inputs.get(1)); + if (left == NULL || right == NULL) + return; + EncodingEdge *edge=getEdge(left, right, NULL); + if (edge != NULL && edge->getEncoding() == EDGE_MATCH) { + fenc->setFunctionEncodingType(CIRCUIT); + } + } + } } - } void EncodingGraph::mergeNodes(EncodingNode *first, EncodingNode *second) { @@ -152,7 +178,7 @@ void EncodingGraph::processFunction(ElementFunction *ef) { if (left == NULL && right == NULL) return; EncodingNode *dst=createNode(ef); - EncodingEdge *edge=getEdge(left, right, dst); + EncodingEdge *edge=createEdge(left, right, dst); edge->numArithOps++; } } @@ -166,7 +192,7 @@ void EncodingGraph::processPredicate(BooleanPredicate *b) { EncodingNode *right=createNode(b->inputs.get(1)); if (left == NULL || right == NULL) return; - EncodingEdge *edge=getEdge(left, right, NULL); + EncodingEdge *edge=createEdge(left, right, NULL); CompOp op=po->getOp(); switch(op) { case SATC_EQUALS: @@ -251,6 +277,12 @@ void EncodingGraph::decideEdges() { static TunableDesc EdgeEncodingDesc(EDGE_UNASSIGNED, EDGE_MATCH, EDGE_UNASSIGNED); EncodingEdge * EncodingGraph::getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst) { + EncodingEdge e(left, right, dst); + EncodingEdge *result = edgeMap.get(&e); + return result; +} + +EncodingEdge * EncodingGraph::createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst) { EncodingEdge e(left, right, dst); EncodingEdge *result = edgeMap.get(&e); if (result == NULL) { diff --git a/src/ASTAnalyses/Encoding/encodinggraph.h b/src/ASTAnalyses/Encoding/encodinggraph.h index 0c94c38..ccd2a5c 100644 --- a/src/ASTAnalyses/Encoding/encodinggraph.h +++ b/src/ASTAnalyses/Encoding/encodinggraph.h @@ -20,6 +20,7 @@ class EncodingGraph { HashtableNodeToSubGraph graphMap; HashsetEncodingSubGraph subgraphs; + void encodeParent(Element *e); void decideEdges(); void mergeNodes(EncodingNode *first, EncodingNode *second); void processElement(Element *e); @@ -28,6 +29,7 @@ class EncodingGraph { EncodingNode * createNode(Element *e); EncodingNode * getNode(Element *e); EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst); + EncodingEdge * createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst); }; class EncodingNode { @@ -57,6 +59,8 @@ class EncodingEdge { EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d); void setEncoding(EdgeEncodingType e) {encoding=e;} uint64_t getValue() const; + EdgeEncodingType getEncoding() {return encoding;} + CMEMALLOC; private: -- 2.34.1