BooleanPredicate* This = (BooleanPredicate*) ourmalloc(sizeof(BooleanPredicate));
GETBOOLEANTYPE(This)= PREDICATEOP;
This->predicate=predicate;
- This->inputs=ourmalloc(sizeof(Element*)*numInputs);
- memcpy(This->inputs, inputs, sizeof(Element*)*numInputs);
- This->numInputs=numInputs;
+ allocInlineArrayInitElement(&This->inputs, inputs, numInputs);
allocInlineDefVectorBoolean(GETBOOLEANPARENTS(This));
for(uint i=0;i<numInputs;i++) {
Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize){
BooleanLogic * This = ourmalloc(sizeof(BooleanLogic));
allocInlineDefVectorBoolean(GETBOOLEANPARENTS(This));
- This->array=ourmalloc(sizeof(Boolean *)*asize);
- memcpy(This->array, array, sizeof(Boolean *)*asize);
- for(uint i=0;i<asize;i++) {
- pushVectorBoolean(GETBOOLEANPARENTS(array[i]), (Boolean *)This);
- }
+ allocInlineArrayInitBoolean(&This->inputs, array, asize);
pushVectorBoolean(solver->allBooleans, (Boolean *) This);
return & This->base;
}
void deleteBoolean(Boolean * This) {
switch(GETBOOLEANTYPE(This)){
case PREDICATEOP:
- ourfree(((BooleanPredicate*)This)->inputs );
+ deleteInlineArrayElement(& ((BooleanPredicate*)This)->inputs );
break;
default:
break;
struct BooleanLogic {
Boolean base;
LogicOp op;
- Boolean ** array;
- uint numArray;
+ ArrayBoolean inputs;
};
struct BooleanPredicate {
Boolean base;
Predicate * predicate;
- Element** inputs;
- int numInputs;
+ ArrayElement inputs;
};
Boolean * allocBoolean(VarType t);
GETELEMENTTYPE(tmp)= ELEMFUNCRETURN;
tmp->function=function;
tmp->overflowstatus = overflowstatus;
- tmp->inputs=ourmalloc(sizeof(Element *)*numArrays);
- tmp->numInputs=numArrays;
- memcpy(tmp->inputs, array, numArrays*sizeof(Element *));
+ allocInlineArrayInitElement(&tmp->inputs, array, numArrays);
allocInlineDefVectorASTNode(GETELEMENTPARENTS(tmp));
for(uint i=0;i<numArrays;i++)
pushVectorASTNode(GETELEMENTPARENTS(array[i]), (ASTNode *) tmp);
void deleteElement(Element *This) {
switch(GETELEMENTTYPE(This)) {
case ELEMFUNCRETURN:
- ourfree(((ElementFunction *)This)->inputs);
+ deleteInlineArrayElement(&((ElementFunction *)This)->inputs);
break;
default:
;
struct ElementFunction {
Element base;
Function * function;
- Element ** inputs;
- uint numInputs;
+ ArrayElement inputs;
Boolean * overflowstatus;
};
Function* allocFunctionOperator( ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior){
FunctionOperator* This = (FunctionOperator*) ourmalloc(sizeof(FunctionOperator));
GETFUNCTIONTYPE(This)=OPERATORFUNC;
- This->numDomains=numDomain;
- This->domains = ourmalloc(numDomain * sizeof(Set *));
- memcpy(This->domains, domain, numDomain * sizeof(Set *));
+ allocInlineArrayInitSet(&This->domains, domain, numDomain);
This->op=op;
This->overflowbehavior = overflowbehavior;
This->range=range;
case TABLEFUNC:
break;
case OPERATORFUNC:
- ourfree(((FunctionOperator*) This)->domains);
+ deleteInlineArraySet(&((FunctionOperator*) This)->domains);
break;
default:
ASSERT(0);
struct FunctionOperator {
Function base;
ArithOp op;
- uint numDomains;
- Set ** domains;
+ ArraySet domains;
Set * range;
OverFlowBehavior overflowbehavior;
};
enum PredicateType {TABLEPRED, OPERATORPRED};
typedef enum PredicateType PredicateType;
-enum ASTNodeType {ORDERCONST, BOOLEANVAR, LOGICOP, PREDICATEOP, TABLEPREDICATEOP, ELEMSET, ELEMFUNCRETURN};
+enum ASTNodeType {ORDERCONST, BOOLEANVAR, LOGICOP, PREDICATEOP, ELEMSET, ELEMFUNCRETURN};
typedef enum ASTNodeType ASTNodeType;
#endif
Order* allocOrder(OrderType type, Set * set){
- Order* order = (Order*)ourmalloc(sizeof(Order));
- order->set=set;
- order->constraints = allocDefVectorBoolean();
- order->type=type;
- return order;
+ Order* order = (Order*)ourmalloc(sizeof(Order));
+ order->set=set;
+ order->constraints = allocDefVectorBoolean();
+ order->type=type;
+ return order;
}
void deleteOrder(Order* order){
- uint size = getSizeVectorBoolean( order->constraints );
- for(uint i=0; i<size; i++){
- deleteBoolean( getVectorBoolean(order->constraints, i) );
- }
- deleteSet( order->set);
- ourfree(order);
-}
\ No newline at end of file
+ uint size = getSizeVectorBoolean( order->constraints );
+ for(uint i=0; i<size; i++){
+ deleteBoolean( getVectorBoolean(order->constraints, i) );
+ }
+ deleteSet( order->set);
+ ourfree(order);
+}
#include "predicate.h"
-#include "structs.h"
-
Predicate* allocPredicate(CompOp op, Set ** domain, uint numDomain){
PredicateOperator* predicate = ourmalloc(sizeof(PredicateOperator));
GETPREDICATETYPE(predicate)=OPERATORPRED;
- predicate->numDomains=numDomain;
- predicate->domains = ourmalloc(numDomain * sizeof(Set *));
- memcpy(predicate->domains, domain, numDomain * sizeof(Set *));
+ allocInlineArrayInitSet(&predicate->domains, domain, numDomain);
predicate->op=op;
return &predicate->base;
}
switch(GETPREDICATETYPE(predicate)) {
case OPERATORPRED: {
PredicateOperator * operpred=(PredicateOperator *) predicate;
- ourfree(operpred->domains);
+ deleteInlineArraySet(&operpred->domains);
break;
}
case TABLEPRED: {
#include "classlist.h"
#include "mymemory.h"
#include "ops.h"
-
+#include "structs.h"
#define GETPREDICATETYPE(o) (((Predicate *)(o))->type)
struct PredicateOperator {
Predicate base;
CompOp op;
- Set ** domains;
- uint numDomains;
+ ArraySet domains;
};
struct PredicateTable {
Table * allocTable(Set **domains, uint numDomain, Set * range){
Table* table = (Table*) ourmalloc(sizeof(Table));
- table->numDomains=numDomain;
- table->domains = ourmalloc(numDomain*sizeof(Set *));
- memcpy(table->domains, domains, numDomain * sizeof(Set *));
+ allocInlineArrayInitSet(&table->domains, domains, numDomain);
table->range =range;
return table;
}
}
void deleteTable(Table* table){
- ourfree(table->domains);
+ deleteInlineArraySet(&table->domains);
uint size = getSizeVectorTableEntry(table->entries);
for(uint i=0; i<size; i++){
deleteTableEntry(getVectorTableEntry(table->entries, i));
#include "structs.h"
struct Table {
- Set ** domains;
+ ArraySet domains;
Set * range;
- uint numDomains;
VectorTableEntry* entries;
};
#include "tableentry.h"
+#include <string.h>
TableEntry* allocTableEntry(uint64_t* inputs, uint inputSize, uint64_t result){
- TableEntry* te = (TableEntry*) ourmalloc(sizeof(TableEntry)+inputSize*sizeof(uint64_t));
- te->output=result;
- for(int i=0; i<inputSize; i++){
- te->inputs[i]=inputs[i];
- }
- return te;
+ TableEntry* te = (TableEntry*) ourmalloc(sizeof(TableEntry)+inputSize*sizeof(uint64_t));
+ te->output=result;
+ memcpy(te->inputs, inputs, inputSize * sizeof(uint64_t));
+ return te;
}
void deleteTableEntry(TableEntry* tableEntry){
- ourfree(tableEntry);
-}
\ No newline at end of file
+ ourfree(tableEntry);
+}
return encodeVarSATEncoder(This, (BooleanVar *) constraint);
case LOGICOP:
return encodeLogicSATEncoder(This, (BooleanLogic *) constraint);
+ case PREDICATEOP:
+ return encodePredicateSATEncoder(This, (BooleanPredicate *) constraint);
default:
model_print("Unhandled case in encodeConstraintSATEncoder %u", GETBOOLEANTYPE(constraint));
exit(-1);
}
}
-Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
- return NULL;
-}
-
Constraint * getNewVarSATEncoder(SATEncoder *This) {
Constraint * var=allocVarConstraint(VAR, This->varcount);
Constraint * varneg=allocVarConstraint(NOTVAR, This->varcount++);
}
Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint) {
- Constraint * array[constraint->numArray];
- for(uint i=0;i<constraint->numArray;i++)
- array[i]=encodeConstraintSATEncoder(This, constraint->array[i]);
+ Constraint * array[getSizeArrayBoolean(&constraint->inputs)];
+ for(uint i=0;i<getSizeArrayBoolean(&constraint->inputs);i++)
+ array[i]=encodeConstraintSATEncoder(This, getArrayBoolean(&constraint->inputs, i));
switch(constraint->op) {
case L_AND:
- return allocArrayConstraint(AND, constraint->numArray, array);
+ return allocArrayConstraint(AND, getSizeArrayBoolean(&constraint->inputs), array);
case L_OR:
- return allocArrayConstraint(OR, constraint->numArray, array);
+ return allocArrayConstraint(OR, getSizeArrayBoolean(&constraint->inputs), array);
case L_NOT:
- return negateConstraint(allocConstraint(OR, array[0], NULL));
+ ASSERT(constraint->numArray==1);
+ return negateConstraint(array[0]);
case L_XOR: {
+ ASSERT(constraint->numArray==2);
Constraint * nleft=negateConstraint(cloneConstraint(array[0]));
Constraint * nright=negateConstraint(cloneConstraint(array[1]));
return allocConstraint(OR,
allocConstraint(AND, nleft, array[1]));
}
case L_IMPLIES:
+ ASSERT(constraint->numArray==2);
return allocConstraint(IMPLIES, array[0], array[1]);
default:
model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);
exit(-1);
}
}
+
+Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
+ //TO IMPLEMENT
+ return NULL;
+}
+
+Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint) {
+ //TO IMPLEMENT
+ return NULL;
+}
uint varcount;
};
-
SATEncoder * allocSATEncoder();
void deleteSATEncoder(SATEncoder *This);
void encodeAllSATEncoder(SATEncoder *This, CSolver *csolver);
Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint);
Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint);
Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint);
-
+Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint);
#endif
--- /dev/null
+#ifndef ARRAY_H
+#define ARRAY_H
+
+#define ArrayDef(name, type) \
+ struct Array ## name { \
+ type * array; \
+ uint size; \
+ }; \
+ typedef struct Array ## name Array ## name; \
+ inline Array ## name * allocArray ## name(uint size) { \
+ Array ## name * tmp = (Array ## name *)ourmalloc(sizeof(type)); \
+ tmp->size = size; \
+ tmp->array = (type *) ourcalloc(1, sizeof(type) * size); \
+ return tmp; \
+ } \
+ inline Array ## name * allocArrayInit ## name(type * array, uint size) { \
+ Array ## name * tmp = allocArray ## name(size); \
+ memcpy(tmp->array, array, size * sizeof(type)); \
+ return tmp; \
+ } \
+ inline type getArray ## name(Array ## name * This, uint index) { \
+ return This->array[index]; \
+ } \
+ inline void setArray ## name(Array ## name * This, uint index, type item) { \
+ This->array[index]=item; \
+ } \
+ inline uint getSizeArray ## name(Array ## name *This) { \
+ return This->size; \
+ } \
+ inline void deleteArray ## name(Array ## name *This) { \
+ ourfree(This->array); \
+ ourfree(This); \
+ } \
+ inline type * exposeCArray ## name(Array ## name * This) { \
+ return This->array; \
+ } \
+ inline void deleteInlineArray ## name(Array ## name *This) { \
+ ourfree(This->array); \
+ } \
+ inline void allocInlineArray ## name(Array ## name * This, uint size) { \
+ This->size = size; \
+ This->array = (type *) ourcalloc(1, sizeof(type) * size); \
+ } \
+ inline void allocInlineArrayInit ## name(Array ## name * This, type *array, uint size) { \
+ allocInlineArray ##name(This, size); \
+ memcpy(This->array, array, size * sizeof(type)); \
+ }
+
+#endif
#include "hashtable.h"
#include "hashset.h"
#include "classlist.h"
+#include "array.h"
+ArrayDef(Element, Element *);
+ArrayDef(Boolean, Boolean *);
+ArrayDef(Set, Set *);
VectorDef(Int, uint64_t, 4);
VectorDef(Boolean, Boolean *, 4);
VectorDef(Constraint, Constraint *, 4);
} \
Vector ## name * allocVectorArray ## name(uint capacity, type * array) { \
Vector ## name * tmp = allocVector ## name(capacity); \
- memcpy(tmp->array, array, capacity * sizeof(type)); \
+ tmp->size=capacity; \
+ memcpy(tmp->array, array, capacity * sizeof(type)); \
return tmp; \
} \
void pushVector ## name(Vector ## name *vector, type item) { \
} \
void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array) { \
allocInlineVector ##name(vector, capacity); \
- memcpy(vector->array, array, capacity * sizeof(type)); \
+ vector->size=capacity; \
+ memcpy(vector->array, array, capacity * sizeof(type)); \
}
#endif