edits
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
index 452a0348e67ad2f0c4e44dba7ba4fec9a4bd727a..0c94c3892be692822f885d3f554f2d625414a15c 100644 (file)
@@ -2,34 +2,75 @@
 #define ENCODINGGRAPH_H
 #include "classlist.h"
 #include "structs.h"
 #define ENCODINGGRAPH_H
 #include "classlist.h"
 #include "structs.h"
+#include "graphstructs.h"
 
 class EncodingGraph {
  public:
        EncodingGraph(CSolver * solver);
 
 class EncodingGraph {
  public:
        EncodingGraph(CSolver * solver);
-       EncodingNode * getNode(Element * element);
        void buildGraph();
        void buildGraph();
+       void encode();
        
        CMEMALLOC;
  private:
        CSolver * solver;
        
        CMEMALLOC;
  private:
        CSolver * solver;
-       HashTableEncoding encodingMap;
+       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 processElement(Element *e);
-
+       void processFunction(ElementFunction *f);
+       void processPredicate(BooleanPredicate *b);
+       EncodingNode * createNode(Element *e);
+       EncodingNode * getNode(Element *e);
+       EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
 };
 
 class EncodingNode {
  public:
 };
 
 class EncodingNode {
  public:
-       
+       EncodingNode(Set *_s);
+       void addElement(Element *e);
+       uint getSize() const;
+       VarType getType() const;
+       void setEncoding(ElementEncodingType e) {encoding=e;}
+       ElementEncodingType getEncoding() {return encoding;}
        CMEMALLOC;
  private:
        CMEMALLOC;
  private:
-       
+       Set *s;
+       HashsetElement elements;
+       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:
 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;
        CMEMALLOC;
+       
  private:
  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
 };
 
 #endif