edits
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
1 #ifndef ENCODINGGRAPH_H
2 #define ENCODINGGRAPH_H
3 #include "classlist.h"
4 #include "structs.h"
5 #include "graphstructs.h"
6
7 class EncodingGraph {
8  public:
9         EncodingGraph(CSolver * solver);
10         void buildGraph();
11         void encode();
12         
13         CMEMALLOC;
14  private:
15         CSolver * solver;
16         HashtableEncoding encodingMap;
17         HashtableEdge edgeMap;
18         Vector<EncodingEdge *> edgeVector;
19         HashsetElement discovered;
20         HashtableNodeToSubGraph graphMap;
21         HashsetEncodingSubGraph subgraphs;
22         
23         void decideEdges();
24         void mergeNodes(EncodingNode *first, EncodingNode *second);
25         void processElement(Element *e);
26         void processFunction(ElementFunction *f);
27         void processPredicate(BooleanPredicate *b);
28         EncodingNode * createNode(Element *e);
29         EncodingNode * getNode(Element *e);
30         EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
31 };
32
33 class EncodingNode {
34  public:
35         EncodingNode(Set *_s);
36         void addElement(Element *e);
37         uint getSize() const;
38         VarType getType() const;
39         void setEncoding(ElementEncodingType e) {encoding=e;}
40         ElementEncodingType getEncoding() {return encoding;}
41         CMEMALLOC;
42  private:
43         Set *s;
44         HashsetElement elements;
45         HashsetEncodingEdge edges;
46         ElementEncodingType encoding;
47         friend class EncodingGraph;
48         friend class EncodingSubGraph;
49 };
50
51 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
52 typedef enum EdgeEncodingType EdgeEncodingType;
53
54 class EncodingEdge {
55  public:
56         EncodingEdge(EncodingNode *_l, EncodingNode *_r);
57         EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
58         void setEncoding(EdgeEncodingType e) {encoding=e;}
59         uint64_t getValue() const;
60         CMEMALLOC;
61         
62  private:
63         EncodingNode *left;
64         EncodingNode *right;
65         EncodingNode *dst;
66         EdgeEncodingType encoding;
67         uint numArithOps;
68         uint numEquals;
69         uint numComparisons;
70         friend uint hashEncodingEdge(EncodingEdge *edge);
71         friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
72         friend class EncodingGraph;
73         friend class EncodingSubGraph;
74 };
75
76 #endif