More code
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
index 7f7b8b41b6d43f9083c5727a8d57f4793577f118..5fe6d2ad023ee53c93ffc98f289dd88dbaaffa1c 100644 (file)
@@ -2,23 +2,26 @@
 #define ENCODINGGRAPH_H
 #include "classlist.h"
 #include "structs.h"
-
-uint hashEncodingEdge(EncodingEdge *edge);
-bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
-
-typedef Hashtable<EncodingEdge *, EncodingEdge *, uintptr_t, PTRSHIFT, hashEncodingEdge, equalsEncodingEdge> HashtableEdge;
+#include "graphstructs.h"
 
 class EncodingGraph {
  public:
        EncodingGraph(CSolver * solver);
        void buildGraph();
+       void encode();
        
        CMEMALLOC;
  private:
        CSolver * solver;
        HashtableEncoding encodingMap;
        HashtableEdge edgeMap;
+       Vector<EncodingEdge *> edgeVector;
        HashsetElement discovered;
+       HashtableNodeToSubGraph graphMap;
+       HashsetEncodingSubGraph subgraphs;
+       
+       void decideEdges();
+       void mergeNodes(EncodingNode *first, EncodingNode *second);
        void processElement(Element *e);
        void processFunction(ElementFunction *f);
        void processPredicate(BooleanPredicate *b);
@@ -30,29 +33,43 @@ class EncodingNode {
  public:
        EncodingNode(Set *_s);
        void addElement(Element *e);
-       uint getSize();
+       uint getSize() const;
+       VarType getType() const;
+       void setEncoding(ElementEncodingType e) {encoding=e;}
+       
        CMEMALLOC;
  private:
        Set *s;
        HashsetElement elements;
-       uint numElements;
+       HashsetEncodingEdge edges;
+       ElementEncodingType encoding;
        friend class EncodingGraph;
+       friend class EncodingSubGraph;
 };
 
+enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
+typedef enum EdgeEncodingType EdgeEncodingType;
+
 class EncodingEdge {
  public:
        EncodingEdge(EncodingNode *_l, EncodingNode *_r);
        EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
+       void setEncoding(EdgeEncodingType e) {encoding=e;}
+       uint64_t getValue() const;
        CMEMALLOC;
+       
  private:
        EncodingNode *left;
        EncodingNode *right;
        EncodingNode *dst;
+       EdgeEncodingType encoding;
        uint numArithOps;
        uint numEquals;
        uint numComparisons;
        friend uint hashEncodingEdge(EncodingEdge *edge);
        friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
        friend class EncodingGraph;
+       friend class EncodingSubGraph;
 };
+
 #endif