Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/constraint_compiler into...
[satune.git] / src / Encoders / elementencoding.c
index fb2ce4aa4ea2536843c6812bd25283d309223926..2989b3b8abb48daf408e7382ea1c19e448a6c7e9 100644 (file)
@@ -1,13 +1,17 @@
 #include "elementencoding.h"
+#include "common.h"
+#include "naiveencoder.h"
+#include "element.h"
+#include "satencoder.h"
 
-ElementEncoding * allocElementEncoding(ElementEncodingType type, Element *element) {
-       ElementEncoding * This=(ElementEncoding *)ourmalloc(sizeof(ElementEncoding));
+void initElementEncoding(ElementEncoding * This, Element *element) {
        This->element=element;
-       This->type=type;
+       This->type=ELEM_UNASSIGNED;
        This->variables=NULL;
        This->encodingArray=NULL;
+       This->inUseArray=NULL;
        This->numVars=0;
-       return This;
+       This->encArraySize=0;
 }
 
 void deleteElementEncoding(ElementEncoding *This) {
@@ -17,13 +21,42 @@ void deleteElementEncoding(ElementEncoding *This) {
                ourfree(This->encodingArray);
        if (This->inUseArray!=NULL)
                ourfree(This->inUseArray);
-       ourfree(This);
 }
 
 void allocEncodingArrayElement(ElementEncoding *This, uint size) {
        This->encodingArray=ourcalloc(1, sizeof(uint64_t)*size);
+       This->encArraySize=size;
 }
 
 void allocInUseArrayElement(ElementEncoding *This, uint size) {
-       This->inUseArray=ourcalloc(1, size >> 6);
+       uint bytes = ((size + ((1 << 9)-1)) >> 6)&~7;//Depends on size of inUseArray
+       This->inUseArray=ourcalloc(1, bytes);
+}
+
+void allocElementConstraintVariables(ElementEncoding* This, uint numVars){
+       This->numVars = numVars;
+       This->variables = ourmalloc(sizeof(Edge) * numVars);
+}
+
+void setElementEncodingType(ElementEncoding* This, ElementEncodingType type){
+       This->type = type;
+}
+
+void generateBinaryIndexEncodingVars(SATEncoder* encoder, ElementEncoding* This){
+       ASSERT(This->type==BINARYINDEX);
+       allocElementConstraintVariables(This, NUMBITS(This->encArraySize-1));
+       getArrayNewVarsSATEncoder(encoder, This->numVars, This->variables);
+}
+
+void generateElementEncodingVariables(SATEncoder* encoder, ElementEncoding* This){
+       ASSERT(This->type!=ELEM_UNASSIGNED);
+       if(This->variables!=NULL)
+               return;
+       switch(This->type){
+               case BINARYINDEX:
+                       generateBinaryIndexEncodingVars(encoder, This);
+                       break;
+               default:
+                       ASSERT(0);
+       }
 }