From 2f171b5db8479462cc953b2663bdaa26c2b3b115 Mon Sep 17 00:00:00 2001 From: Hamed Date: Mon, 3 Jul 2017 14:43:47 -0700 Subject: [PATCH] Adding predicateOperator (equality operation ...) --- src/AST/predicate.c | 25 +++++++++++++++++++++++++ src/AST/predicate.h | 2 ++ src/Backend/satencoder.c | 30 ++++++++++++++++++++++++++---- src/Backend/satencoder.h | 1 + 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/AST/predicate.c b/src/AST/predicate.c index ebb3c14..116f152 100644 --- a/src/AST/predicate.c +++ b/src/AST/predicate.c @@ -1,4 +1,6 @@ #include "predicate.h" +#include "boolean.h" +#include "set.h" Predicate* allocPredicateOperator(CompOp op, Set ** domain, uint numDomain){ PredicateOperator* predicate = ourmalloc(sizeof(PredicateOperator)); @@ -16,6 +18,29 @@ Predicate* allocPredicateTable(Table* table, UndefinedBehavior undefBehavior){ return &predicate->base; } +void getEqualitySetIntersection(PredicateOperator* predicate, uint* size, uint64_t* result){ + ASSERT( predicate->op == EQUALS); + //make sure equality has 2 operands + ASSERT(getSizeArraySet( &predicate->domains) == 2); + *size=0; + VectorInt* mems1 = getArraySet(&predicate->domains, 0)->members; + uint size1 = getSizeVectorInt(mems1); + VectorInt* mems2 = getArraySet(&predicate->domains, 1)->members; + uint size2 = getSizeVectorInt(mems2); + //FIXME:This isn't efficient, if we a hashset datastructure for Set, we + // can reduce it to O(n), but for now .... HG + for(uint i=0; ipredicate) ){ case TABLEPRED: return encodeTablePredicateSATEncoder(This, constraint); case OPERATORPRED: @@ -311,7 +311,7 @@ Constraint * encodeEnumTablePredicateSATEncoder(SATEncoder * This, BooleanPredic VectorTableEntry* entries = &(((PredicateTable*)constraint->predicate)->table->entries); FunctionEncodingType encType = constraint->encoding.type; uint size = getSizeVectorTableEntry(entries); - Constraint* constraints[size]; //FIXME: should add a space for the case that didn't match any entries + Constraint* constraints[size]; for(uint i=0; ioutput!= true) @@ -323,19 +323,21 @@ Constraint * encodeEnumTablePredicateSATEncoder(SATEncoder * This, BooleanPredic Constraint* carray[inputNum]; Element* el = getArrayElement(inputs, i); for(uint j=0; jinputs[j]); + carray[j] = getElementValueConstraint(el, entry->inputs[j]); } constraints[i]=allocArrayConstraint(AND, inputNum, carray); } Constraint* result= allocArrayConstraint(OR, size, constraints); + //FIXME: if it didn't match with any entry return encType==ENUMERATEIMPLICATIONS? result: negateConstraint(result); } Constraint * encodeOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint){ switch(constraint->encoding.type){ case ENUMERATEIMPLICATIONS: - break; + return encodeEnumOperatorPredicateSATEncoder(This, constraint); case CIRCUIT: + ASSERT(0); break; default: ASSERT(0); @@ -343,6 +345,26 @@ Constraint * encodeOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredica return NULL; } +Constraint * encodeEnumOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint){ + ASSERT(GETPREDICATETYPE(constraint)==OPERATORPRED); + PredicateOperator* predicate = (PredicateOperator*)constraint->predicate; + ASSERT(predicate->op == EQUALS); //For now, we just only support equals + //getting maximum size of in common elements between two sets! + uint size=getSizeVectorInt( getArraySet( &predicate->domains, 0)->members); + uint64_t commonElements [size]; + getEqualitySetIntersection(predicate, &size, commonElements); + Constraint* carray[size]; + Element* elem1 = getArrayElement( &constraint->inputs, 0); + Element* elem2 = getArrayElement( &constraint->inputs, 1); + for(uint i=0; ifunction)){ case TABLEFUNC: diff --git a/src/Backend/satencoder.h b/src/Backend/satencoder.h index 46419a4..6963fee 100644 --- a/src/Backend/satencoder.h +++ b/src/Backend/satencoder.h @@ -27,6 +27,7 @@ Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * con Constraint * encodeTablePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint); Constraint * encodeEnumTablePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint); Constraint * encodeOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint); +Constraint * encodeEnumOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint); Constraint * getElementValueBinaryIndexConstraint(Element* This, uint64_t value); Constraint * getElementValueConstraint(Element* This, uint64_t value); -- 2.34.1