#include "boolean.h"
+#include "structs.h"
+#include "csolver.h"
Boolean* allocBoolean(VarType t) {
BooleanVar* tmp=(BooleanVar *) ourmalloc(sizeof (BooleanVar));
GETBOOLEANTYPE(tmp)=BOOLEANVAR;
tmp->vtype=t;
+ tmp->var=NULL;
return & tmp->base;
}
return & tmp -> base;
}
+Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs){
+ BooleanPredicate* bp = (BooleanPredicate*) ourmalloc(sizeof(BooleanPredicate));
+ GETBOOLEANTYPE(bp)= PREDICATEOP;
+ bp->predicate=predicate;
+ bp->inputs= allocVectorArrayElement (numInputs,inputs);
+ return & bp->base;
+}
+
+Boolean * allocBooleanLogic(LogicOp op, Boolean * left, Boolean* right){
+ BooleanLogic* bl = (BooleanLogic*) ourmalloc(sizeof(BooleanLogic));
+ GETBOOLEANTYPE(bl) = LOGICOP;
+ bl->op=op;
+ bl->left=left;
+ bl->right=right;
+ return &bl->base;
+}
+Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize){
+ ASSERT(asize>=2);
+ Boolean* boolean = allocBooleanLogic(op,array[0], array[1]);
+ pushVectorBoolean(solver->allBooleans,boolean);
+ for(uint i=2; i<asize; i++){
+ boolean=allocBooleanLogic(op,boolean, array[i]);
+ pushVectorBoolean(solver->allBooleans,boolean);
+ }
+ return boolean;
+}
+
void deleteBoolean(Boolean * This) {
ourfree(This);
}
#include "classlist.h"
#include "mymemory.h"
#include "ops.h"
+#include "structs.h"
/**
This is a little sketchy, but apparently legit.
struct BooleanVar {
Boolean base;
VarType vtype;
+ Constraint * var;
};
struct BooleanLogic {
Boolean * right;
};
+struct BooleanPredicate{
+ Boolean base;
+ Predicate * predicate;
+ VectorElement* inputs;
+};
Boolean * allocBoolean(VarType t);
Boolean * allocBooleanOrder(Order * order, uint64_t first, uint64_t second);
+Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs);
+Boolean * allocBooleanLogic(LogicOp op, Boolean * left, Boolean* right);
+/**
+ * This function also save new boooleans to solver->allbooleans
+ * @param solver
+ * @param op
+ * @param array
+ * @param asize
+ * @return
+ */
+Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize);
void deleteBoolean(Boolean * This);
#endif
#include "element.h"
-
+#include "structs.h"
-
- Element *allocElementSet(Set * s) {
- ElementSet * tmp=(ElementSet *)ourmalloc(sizeof(ElementSet));
++//FIXME: ELEMENTSET?
+ Element *allocElement(Set * s) {
+ Element * tmp=(Element *)ourmalloc(sizeof(Element));
+ GETELEMENTTYPE(tmp)= ELEMSET;
tmp->set=s;
- return &tmp->base;
+ tmp->encoding=NULL;
+ return tmp;
}
+Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus){
+ ElementFunction* ef = (ElementFunction*) ourmalloc(sizeof(ElementFunction));
+ GETELEMENTTYPE(ef)= ELEMFUNCRETURN;
+ ef->function=function;
+ ef->overflowstatus = overflowstatus;
+ ef->Elements = allocVectorArrayElement(numArrays, array);
+ return &ef->base;
+}
+
void deleteElement(Element *This) {
ourfree(This);
}
#define ELEMENT_H
#include "classlist.h"
#include "mymemory.h"
+#include "ops.h"
+#include "structs.h"
+#define GETELEMENTTYPE(o) (((Element*)o)->type)
+
++//FIXME:TALK ABOUT ELEMENT
struct Element {
- ElementType type;
++ ElementType type;
+ Set * set;
+ ElementEncoding * encoding;
};
- Element * allocElementSet(Set *s);
+struct ElementSet {
+ Element base;
+ Set * set;
+};
+
+struct ElementFunction{
+ Element base;
+ Function * function;
+ VectorElement* Elements;
+ Boolean * overflowstatus;
+};
+
+ Element * allocElement(Set *s);
+Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus);
void deleteElement(Element *This);
#endif
#ifndef OPS_H
#define OPS_H
- enum LogicOp {AND, OR, NOT, XOR, IMPLIES};
+ enum LogicOp {L_AND, L_OR, L_NOT, L_XOR, L_IMPLIES};
typedef enum LogicOp LogicOp;
enum ArithOp {ADD, SUB};
enum OverFlowBehavior {IGNORE, WRAPAROUND, FLAGFORCESOVERFLOW, OVERFLOWSETSFLAG, FLAGIFFOVERFLOW, NOOVERFLOW};
typedef enum OverFlowBehavior OverFlowBehavior;
-enum BooleanType {ORDERCONST, BOOLEANVAR, LOGICOP, COMPARE};
+enum BooleanType {ORDERCONST, BOOLEANVAR, LOGICOP, COMPARE, PREDICATEOP};
typedef enum BooleanType BooleanType;
enum FunctionType {TABLEFUNC, OPERATORFUNC};
typedef enum FunctionType FunctionType;
+
+enum ElementType {ELEMSET, ELEMFUNCRETURN};
+typedef enum ElementType ElementType;
#endif
struct CSolver;
typedef struct CSolver CSolver;
+ struct SATEncoder;
+ typedef struct SATEncoder SATEncoder;
+
struct Constraint;
typedef struct Constraint Constraint;
typedef struct BooleanVar BooleanVar;
typedef struct BooleanLogic BooleanLogic;
typedef struct BooleanComp BooleanComp;
+typedef struct BooleanPredicate BooleanPredicate;
struct Boolean;
typedef struct Boolean Boolean;
struct Set;
typedef struct Set Set;
-
typedef struct Set MutableSet;
+typedef struct ElementFunction ElementFunction;
+typedef struct ElementSet ElementSet;
+
struct Element;
typedef struct Element Element;
struct FunctionEncoding;
typedef struct FunctionEncoding FunctionEncoding;
+ struct OrderEncoding;
+ typedef struct OrderEncoding OrderEncoding;
+
struct TableEntry;
typedef struct TableEntry TableEntry;
for(uint i=0;i<size;i++) {
deleteBoolean(getVectorBoolean(This->allBooleans, i));
}
-
deleteVectorBoolean(This->allBooleans);
size=getSizeVectorSet(This->allSets);
for(uint i=0;i<size;i++) {
deleteSet(getVectorSet(This->allSets, i));
}
-
deleteVectorSet(This->allSets);
size=getSizeVectorElement(This->allElements);
for(uint i=0;i<size;i++) {
deleteElement(getVectorElement(This->allElements, i));
}
+ deleteVectorElement(This->allElements);
+
size=getSizeVectorTable(This->allTables);
for(uint i=0;i<size;i++) {
deleteTable(getVectorTable(This->allTables, i));
}
+ deleteVectorTable(This->allTables);
+
size=getSizeVectorPredicate(This->allPredicates);
for(uint i=0;i<size;i++) {
deletePredicate(getVectorPredicate(This->allPredicates, i));
}
+ deleteVectorPredicate(This->allPredicates);
+
size=getSizeVectorOrder(This->allOrders);
for(uint i=0;i<size;i++) {
deleteOrder(getVectorOrder(This->allOrders, i));
}
deleteVectorOrder(This->allOrders);
+
size=getSizeVectorFunction(This->allFunctions);
for(uint i=0;i<size;i++) {
deleteFunction(getVectorFunction(This->allFunctions, i));
}
Element * getElementVar(CSolver *This, Set * set) {
- Element * element=allocElementSet(set);
+ Element * element=allocElement(set);
pushVectorElement(This->allElements, element);
return element;
}
}
Element * applyFunction(CSolver *solver, Function * function, Element ** array, uint numArrays, Boolean * overflowstatus) {
- return NULL;
+ Element* element= allocElementFunction(function,array,numArrays,overflowstatus);
+ pushVectorElement(solver->allElements, element);
+ return element;
}
Boolean * applyPredicate(CSolver *solver, Predicate * predicate, Element ** inputs, uint numInputs) {
- return NULL;
+ Boolean* boolean= allocBooleanPredicate(predicate, inputs, numInputs);
+ pushVectorBoolean(solver->allBooleans, boolean);
+ return boolean;
}
-Boolean * applyLogicalOperation(CSolver *solver, LogicOp op, Boolean ** array) {
- return NULL;
+Boolean * applyLogicalOperation(CSolver *solver, LogicOp op, Boolean ** array, uint asize) {
+ return allocBooleanLogicArray(solver, op, array, asize);
}
void addBoolean(CSolver *This, Boolean * constraint) {