X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FASTAnalyses%2FEncoding%2Fencodinggraph.h;h=ab9cac6cc3621e5d1f340cac4e95305c807f390a;hp=a7ccace7e109d5a8d57cd58f1c890afe5dd58a58;hb=457ee300c637089a095444672c9d4628faf901e7;hpb=d9b1da6e3af3c3272e4782ca3983ff7771c03b36 diff --git a/src/ASTAnalyses/Encoding/encodinggraph.h b/src/ASTAnalyses/Encoding/encodinggraph.h index a7ccace..ab9cac6 100644 --- a/src/ASTAnalyses/Encoding/encodinggraph.h +++ b/src/ASTAnalyses/Encoding/encodinggraph.h @@ -2,55 +2,81 @@ #define ENCODINGGRAPH_H #include "classlist.h" #include "structs.h" - -uint hashEncodingEdge(EncodingEdge *edge); -bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2); - -typedef Hashtable HashtableEdge; +#include "graphstructs.h" class EncodingGraph { - public: - EncodingGraph(CSolver * solver); +public: + EncodingGraph(CSolver *solver); + ~EncodingGraph(); void buildGraph(); - + void encode(); + CMEMALLOC; - private: - CSolver * solver; +private: + CSolver *solver; HashtableEncoding encodingMap; HashtableEdge edgeMap; + Vector edgeVector; HashsetElement discovered; + HashtableNodeToSubGraph graphMap; + HashsetEncodingSubGraph subgraphs; + + void encodeParent(Element *e); + void decideEdges(); + void mergeNodes(EncodingNode *first, EncodingNode *second); void processElement(Element *e); void processFunction(ElementFunction *f); void processPredicate(BooleanPredicate *b); - EncodingNode * createNode(Element *e); - EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst); + 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 { - public: +public: EncodingNode(Set *_s); void addElement(Element *e); + uint getSize() const; + VarType getType() const; + void setEncoding(ElementEncodingType e) {encoding = e;} + ElementEncodingType getEncoding() {return encoding;} + bool couldBeBinaryIndex() {return encoding == BINARYINDEX || encoding == ELEM_UNASSIGNED;} CMEMALLOC; - private: +private: Set *s; HashsetElement elements; - uint numElements; + HashsetEncodingEdge edges; + ElementEncodingType encoding; friend class EncodingGraph; + friend class EncodingSubGraph; }; +enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH}; +typedef enum EdgeEncodingType EdgeEncodingType; + class EncodingEdge { - public: +public: EncodingEdge(EncodingNode *_l, EncodingNode *_r); EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d); + void setEncoding(EdgeEncodingType e) {encoding = e;} + uint64_t getValue() const; + EdgeEncodingType getEncoding() {return encoding;} + CMEMALLOC; - private: + +private: EncodingNode *left; EncodingNode *right; EncodingNode *dst; + EdgeEncodingType encoding; uint numArithOps; uint numEquals; uint numComparisons; friend uint hashEncodingEdge(EncodingEdge *edge); friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2); + friend class EncodingGraph; + friend class EncodingSubGraph; }; + #endif