X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FASTAnalyses%2FEncoding%2Fencodinggraph.h;h=0c94c3892be692822f885d3f554f2d625414a15c;hp=452a0348e67ad2f0c4e44dba7ba4fec9a4bd727a;hb=7fe0a11814834cc8f5937d059602513eea746c9f;hpb=565c3f059645ed4d4a61ae4d24cdb0393f29433b diff --git a/src/ASTAnalyses/Encoding/encodinggraph.h b/src/ASTAnalyses/Encoding/encodinggraph.h index 452a034..0c94c38 100644 --- a/src/ASTAnalyses/Encoding/encodinggraph.h +++ b/src/ASTAnalyses/Encoding/encodinggraph.h @@ -2,34 +2,75 @@ #define ENCODINGGRAPH_H #include "classlist.h" #include "structs.h" +#include "graphstructs.h" class EncodingGraph { public: EncodingGraph(CSolver * solver); - EncodingNode * getNode(Element * element); void buildGraph(); + void encode(); CMEMALLOC; private: CSolver * solver; - HashTableEncoding encodingMap; + HashtableEncoding encodingMap; + HashtableEdge edgeMap; + Vector edgeVector; + HashsetElement discovered; + HashtableNodeToSubGraph graphMap; + HashsetEncodingSubGraph subgraphs; + + void decideEdges(); + void mergeNodes(EncodingNode *first, EncodingNode *second); void processElement(Element *e); - + void processFunction(ElementFunction *f); + void processPredicate(BooleanPredicate *b); + EncodingNode * createNode(Element *e); + EncodingNode * getNode(Element *e); + EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst); }; class EncodingNode { public: - + EncodingNode(Set *_s); + void addElement(Element *e); + uint getSize() const; + VarType getType() const; + void setEncoding(ElementEncodingType e) {encoding=e;} + ElementEncodingType getEncoding() {return encoding;} CMEMALLOC; private: - + Set *s; + HashsetElement elements; + 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: - + EncodingEdge(EncodingNode *_l, EncodingNode *_r); + EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d); + void setEncoding(EdgeEncodingType e) {encoding=e;} + uint64_t getValue() const; CMEMALLOC; + 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