Add CIRCUIT Encoding for Equals
authorbdemsky <bdemsky@uci.edu>
Wed, 12 Jul 2017 03:22:29 +0000 (20:22 -0700)
committerbdemsky <bdemsky@uci.edu>
Wed, 12 Jul 2017 03:22:29 +0000 (20:22 -0700)
src/Backend/satfuncencoder.c
src/Backend/satfuncencoder.h
src/Encoders/elementencoding.h

index 801d4ffd7b925290e6d0c5e490ef1bef4f5c470c..89388249af184347248df967f4cf6236ef9e20e8 100644 (file)
@@ -56,6 +56,35 @@ Edge encodeOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * con
        return E_BOGUS;
 }
 
+Edge encodeCircuitOperatorPredicateEncoder(SATEncoder *This, BooleanPredicate * constraint) {
+       PredicateOperator * predicate = (PredicateOperator*) constraint->predicate;
+       
+       switch(predicate->op) {
+       case EQUALS: {
+               return encodeCircuitEquals(This, constraint);
+       }
+       default:
+               ASSERT(0);
+       }
+       exit(-1);
+}
+
+Edge encodeCircuitEquals(SATEncoder * This, BooleanPredicate * constraint) {
+       PredicateOperator * predicate = (PredicateOperator*) constraint->predicate;
+       ASSERT(getSizeArraySet(&predicate->domains) == 2);
+       Element *elem0 = getArrayElement( &constraint->inputs, 0);
+       Element *elem1 = getArrayElement( &constraint->inputs, 1);
+       ElementEncoding *ee0=getElementEncoding(elem0);
+       ElementEncoding *ee1=getElementEncoding(elem1);
+       ASSERT(ee0->numVars==ee1->numVars);
+       uint numVars=ee0->numVars;
+       Edge carray[numVars];
+       for (uint i=0; i<numVars; i++) {
+               carray[i]=constraintIFF(This->cnf, ee0->variables[i], ee1->variables[i]);
+       }
+       return constraintAND(This->cnf, numVars, carray);
+}
+
 Edge encodeEnumOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint) {
        PredicateOperator* predicate = (PredicateOperator*)constraint->predicate;
        uint numDomains=getSizeArraySet(&predicate->domains);
index b24fc1f3c2b8889e71d2dcd46b0c7f8fcfc17254..02dc85878392fec8ce9a37cefd76def7bb310911 100644 (file)
@@ -6,5 +6,7 @@ Edge encodeOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * con
 Edge encodeEnumOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint);
 void encodeOperatorElementFunctionSATEncoder(SATEncoder* encoder,ElementFunction* This);
 void encodeEnumTableElemFunctionSATEncoder(SATEncoder* encoder, ElementFunction* This);
+Edge encodeCircuitOperatorPredicateEncoder(SATEncoder *This, BooleanPredicate * constraint);
+Edge encodeCircuitEquals(SATEncoder * This, BooleanPredicate * constraint);
 
 #endif
index 385f5c27d1fe66a4408987cc13a1995f2479119b..72cae3d21d70ff2f9b73f5a540bf3468ce421ba6 100644 (file)
@@ -28,6 +28,7 @@ void allocEncodingArrayElement(ElementEncoding *This, uint size);
 void allocInUseArrayElement(ElementEncoding *This, uint size);
 void generateBinaryIndexEncodingVars(SATEncoder* encode, ElementEncoding* This);
 void generateElementEncodingVariables(SATEncoder* encoder, ElementEncoding* This);
+static inline uint numEncodingVars(ElementEncoding *This) {return This->numVars;}
 
 static inline bool isinUseElement(ElementEncoding *This, uint offset) {
        return (This->inUseArray[(offset>>6)] >> (offset & 63)) &0x1;