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