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