62e3b8fa92de5b15ddf8c489d7eeb2eaceaf5cdf
[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
9 typedef Hashtable<EncodingEdge *, EncodingEdge *, uintptr_t, PTRSHIFT, hashEncodingEdge, equalsEncodingEdge> HashtableEdge;
10
11 class EncodingGraph {
12  public:
13         EncodingGraph(CSolver * solver);
14         void buildGraph();
15         
16         CMEMALLOC;
17  private:
18         CSolver * solver;
19         HashtableEncoding encodingMap;
20         HashtableEdge edgeMap;
21         HashsetElement discovered;
22         void processElement(Element *e);
23         void processFunction(ElementFunction *f);
24         void processPredicate(BooleanPredicate *b);
25         EncodingNode * createNode(Element *e);
26         EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
27 };
28
29 class EncodingNode {
30  public:
31         EncodingNode(Set *_s);
32         void addElement(Element *e);
33         uint getSize();
34         VarType getType();
35         void setEncoding(ElementEncodingType e) {encoding=e;}
36         
37         CMEMALLOC;
38  private:
39         Set *s;
40         HashsetElement elements;
41         uint numElements;
42         ElementEncodingType encoding;
43         friend class EncodingGraph;
44 };
45
46 class EncodingEdge {
47  public:
48         EncodingEdge(EncodingNode *_l, EncodingNode *_r);
49         EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
50         CMEMALLOC;
51  private:
52         EncodingNode *left;
53         EncodingNode *right;
54         EncodingNode *dst;
55         uint numArithOps;
56         uint numEquals;
57         uint numComparisons;
58         friend uint hashEncodingEdge(EncodingEdge *edge);
59         friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
60         friend class EncodingGraph;
61 };
62 #endif