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