14f6e2bc887e24130e407bf2b0bd8d6aef3845ef
[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         ~EncodingGraph();
11         void buildGraph();
12         void encode();
13         void validate();
14
15         CMEMALLOC;
16 private:
17         CSolver *solver;
18         HashtableEncoding encodingMap;
19         HashtableEdge edgeMap;
20         Vector<EncodingEdge *> edgeVector;
21         HashsetElement discovered;
22         HashtableNodeToSubGraph graphMap;
23         HashsetEncodingSubGraph subgraphs;
24
25         void encodeParent(Element *e);
26         void decideEdges();
27         void mergeNodes(EncodingNode *first, EncodingNode *second);
28         void processElement(Element *e);
29         void processFunction(ElementFunction *f);
30         void processPredicate(BooleanPredicate *b);
31         EncodingNode *createNode(Element *e);
32         EncodingNode *getNode(Element *e);
33         EncodingEdge *getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
34         EncodingEdge *createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
35 };
36
37 class EncodingNode {
38 public:
39         EncodingNode(Set *_s);
40         void addElement(Element *e);
41         uint getSize() const;
42         VarType getType() const;
43         void setEncoding(ElementEncodingType e) {encoding = e;}
44         ElementEncodingType getEncoding() {return encoding;}
45         bool couldBeBinaryIndex() {return encoding == BINARYINDEX || encoding == ELEM_UNASSIGNED;}
46         CMEMALLOC;
47 private:
48         Set *s;
49         HashsetElement elements;
50         HashsetEncodingEdge edges;
51         ElementEncodingType encoding;
52         friend class EncodingGraph;
53         friend class EncodingSubGraph;
54 };
55
56 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
57 typedef enum EdgeEncodingType EdgeEncodingType;
58
59 class EncodingEdge {
60 public:
61         EncodingEdge(EncodingNode *_l, EncodingNode *_r);
62         EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
63         void setEncoding(EdgeEncodingType e) {encoding = e;}
64         uint64_t getValue() const;
65         EdgeEncodingType getEncoding() {return encoding;}
66
67         CMEMALLOC;
68
69 private:
70         EncodingNode *left;
71         EncodingNode *right;
72         EncodingNode *dst;
73         EdgeEncodingType encoding;
74         uint numArithOps;
75         uint numEquals;
76         uint numComparisons;
77         friend uint hashEncodingEdge(EncodingEdge *edge);
78         friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
79         friend class EncodingGraph;
80         friend class EncodingSubGraph;
81 };
82
83 #endif