f452dac2fc7660940bed0fa351695ec0abdd3bbd
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
1 #ifndef ENCODINGGRAPH_H
2 #define ENCODINGGRAPH_H
3 #include "classlist.h"
4 #include "structs.h"
5
6 uint hashEncodingEdge(EncodingEdge *edge);
7 bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
8 class EncodingSubGraph;
9
10
11 typedef Hashtable<EncodingEdge *, EncodingEdge *, uintptr_t, PTRSHIFT, hashEncodingEdge, equalsEncodingEdge> HashtableEdge;
12 typedef Hashset<EncodingNode *, uintptr_t, PTRSHIFT> HashsetEncodingNode;
13 typedef SetIterator<EncodingNode *, uintptr_t, PTRSHIFT> SetIteratorEncodingNode;
14 typedef Hashset<EncodingEdge *, uintptr_t, PTRSHIFT> HashsetEncodingEdge;
15 typedef SetIterator<EncodingEdge *, uintptr_t, PTRSHIFT> SetIteratorEncodingEdge;
16
17 typedef Hashtable<EncodingNode *, EncodingSubGraph *, uintptr_t, PTRSHIFT> HashtableNodeToSubGraph;
18
19 class EncodingGraph {
20  public:
21         EncodingGraph(CSolver * solver);
22         void buildGraph();
23         
24         CMEMALLOC;
25  private:
26         CSolver * solver;
27         HashtableEncoding encodingMap;
28         HashtableEdge edgeMap;
29         Vector<EncodingEdge *> edgeVector;
30         HashsetElement discovered;
31         HashtableNodeToSubGraph graphMap;
32
33         void decideEdges();
34         void mergeNodes(EncodingNode *first, EncodingNode *second);
35         void processElement(Element *e);
36         void processFunction(ElementFunction *f);
37         void processPredicate(BooleanPredicate *b);
38         EncodingNode * createNode(Element *e);
39         EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
40 };
41
42 class EncodingNode {
43  public:
44         EncodingNode(Set *_s);
45         void addElement(Element *e);
46         uint getSize() const;
47         VarType getType() const;
48         void setEncoding(ElementEncodingType e) {encoding=e;}
49         
50         CMEMALLOC;
51  private:
52         Set *s;
53         HashsetElement elements;
54         HashsetEncodingEdge edges;
55         ElementEncodingType encoding;
56         friend class EncodingGraph;
57         friend class EncodingSubGraph;
58 };
59
60 class EncodingSubGraph {
61  public:
62         EncodingSubGraph();
63         void addNode(EncodingNode *n);
64         SetIteratorEncodingNode * nodeIterator();
65         
66         CMEMALLOC;
67  private:
68         uint estimateNewSize(EncodingNode *n);
69         uint estimateNewSize(EncodingSubGraph *sg);
70
71         HashsetEncodingNode nodes;
72         uint encodingSize;
73         uint numElements;
74
75         friend class EncodingGraph;
76 };
77
78 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
79 typedef enum EdgeEncodingType EdgeEncodingType;
80
81 class EncodingEdge {
82  public:
83         EncodingEdge(EncodingNode *_l, EncodingNode *_r);
84         EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
85         void setEncoding(EdgeEncodingType e) {encoding=e;}
86         uint64_t getValue() const;
87         CMEMALLOC;
88         
89  private:
90         EncodingNode *left;
91         EncodingNode *right;
92         EncodingNode *dst;
93         EdgeEncodingType encoding;
94         uint numArithOps;
95         uint numEquals;
96         uint numComparisons;
97         friend uint hashEncodingEdge(EncodingEdge *edge);
98         friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
99         friend class EncodingGraph;
100         friend class EncodingSubGraph;
101 };
102
103 #endif