class ElementSet : public Element {
public:
ElementSet(ASTNodeType type, Set *s);
+ virtual ~ElementSet(){}
ElementSet(Set *s);
virtual Element *clone(CSolver *solver, CloneMap *map);
virtual void serialize(Serializer *serializer);
class ElementConst : public ElementSet {
public:
ElementConst(uint64_t value, Set *_set);
+ virtual ~ElementConst(){}
uint64_t value;
virtual void serialize(Serializer *serializer);
virtual void print();
class ElementFunction : public Element {
public:
+ virtual ~ElementFunction(){}
ElementFunction(Function *function, Element **array, uint numArrays, BooleanEdge overflowstatus);
Array<Element *> inputs;
BooleanEdge overflowstatus;
serializer->mywrite(&This, sizeof(Set *));
serializer->mywrite(&type, sizeof(VarType));
serializer->mywrite(&isRange, sizeof(bool));
- serializer->mywrite(&low, sizeof(uint64_t));
- serializer->mywrite(&high, sizeof(uint64_t));
- bool isMutable = isMutableSet();
+ bool isMutable = isMutableSet();
serializer->mywrite(&isMutable, sizeof(bool));
- uint size = members->getSize();
- serializer->mywrite(&size, sizeof(uint));
- for (uint i = 0; i < size; i++) {
- uint64_t mem = members->get(i);
- serializer->mywrite(&mem, sizeof(uint64_t));
- }
+ if(isRange){
+ serializer->mywrite(&low, sizeof(uint64_t));
+ serializer->mywrite(&high, sizeof(uint64_t));
+ }else {
+ uint size = members->getSize();
+ serializer->mywrite(&size, sizeof(uint));
+ for(uint i=0; i<size; i++){
+ uint64_t mem = members->get(i);
+ serializer->mywrite(&mem, sizeof(uint64_t));
+ }
+ }
}
void Set::print() {
}
Deserializer::~Deserializer() {
- delete solver;
-
if (-1 == close(filedesc)) {
exit(-1);
}
}
void Deserializer::deserializeBooleanEdge() {
- Boolean *b;
- myread(&b, sizeof(Boolean *));
- BooleanEdge tmp(b);
+ Boolean *b_ptr;
+ myread(&b_ptr, sizeof(Boolean *));
+ BooleanEdge tmp(b_ptr);
bool isNegated = tmp.isNegated();
ASSERT(map.contains(tmp.getBoolean()));
- b = (Boolean *) map.get(tmp.getBoolean());
- BooleanEdge res(b);
- solver->addConstraint(isNegated ? res.negate() : res);
+ b_ptr = (Boolean *) map.get(tmp.getBoolean());
+ BooleanEdge res(b_ptr);
+ bool isTopLevel;
+ myread(&isTopLevel, sizeof(bool));
+ if(isTopLevel){
+ solver->addConstraint(isNegated ? res.negate() : res);
+ }
}
void Deserializer::deserializeBooleanVar() {
myread(&type, sizeof(VarType));
bool isRange;
myread(&isRange, sizeof(bool));
- uint64_t low;
- myread(&low, sizeof(uint64_t));
- uint64_t high;
- myread(&high, sizeof(uint64_t));
- bool isMutable;
+ bool isMutable;
myread(&isMutable, sizeof(bool));
- Set *set;
- if (isMutable) {
- set = new MutableSet(type);
- }
- uint size;
- myread(&size, sizeof(uint));
- Vector<uint64_t> members;
- for (uint i = 0; i < size; i++) {
- uint64_t mem;
- myread(&mem, sizeof(uint64_t));
- if (isMutable) {
- ((MutableSet *) set)->addElementMSet(mem);
- } else {
- members.push(mem);
- }
- }
- if (!isMutable) {
- set = isRange ? solver->createRangeSet(type, low, high) :
- solver->createSet(type, members.expose(), size);
- }
- map.put(s_ptr, set);
+ if(isRange){
+ uint64_t low;
+ myread(&low, sizeof(uint64_t));
+ uint64_t high;
+ myread(&high, sizeof(uint64_t));
+ map.put(s_ptr, new Set(type, low, high));
+ } else{
+ Set *set;
+ if(isMutable){
+ set = new MutableSet(type);
+ }
+ uint size;
+ myread(&size, sizeof(uint));
+ Vector<uint64_t> members;
+ for(uint i=0; i<size; i++){
+ uint64_t mem;
+ myread(&mem, sizeof(uint64_t));
+ if(isMutable) {
+ ((MutableSet*) set)->addElementMSet(mem);
+ }else {
+ members.push(mem);
+ }
+ }
+ if(!isMutable){
+ set = solver->createSet(type, members.expose(), size);
+ }
+ map.put(s_ptr, set);
+ }
}
void Deserializer::deserializeBooleanLogic() {
overflowstatus = (Boolean *) map.get(tmp.getBoolean());
BooleanEdge res(overflowstatus);
BooleanEdge undefStatus = isNegated ? res.negate() : res;
-
map.put(ef_ptr, solver->applyFunction(function, members.expose(), size, undefStatus));
}
myread(&undefinedbehavior, sizeof(UndefinedBehavior));
map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));
-}
\ No newline at end of file
+}
}
-void serializeBooleanEdge(Serializer *serializer, BooleanEdge be) {
- if (be == BooleanEdge(NULL))
- return;
+void serializeBooleanEdge(Serializer *serializer, BooleanEdge be, bool isTopLevel) {
+ if (be == BooleanEdge(NULL)){
+ return;
+ }
be.getBoolean()->serialize(serializer);
ASTNodeType type = BOOLEANEDGE;
serializer->mywrite(&type, sizeof(ASTNodeType));
Boolean *boolean = be.getRaw();
serializer->mywrite(&boolean, sizeof(Boolean *));
+ serializer->mywrite(&isTopLevel, sizeof(bool));
}
\ No newline at end of file
-void serializeBooleanEdge(Serializer *serializer, BooleanEdge be);
+void serializeBooleanEdge(Serializer *serializer, BooleanEdge be, bool isTopLevel=false);
#endif/* SERIALIZER_H */
--- /dev/null
+#include "csolver.h"
+
+
+int main(int argc, char ** argv){
+ if(argc != 2){
+ printf("You only specify the name of the file ...");
+ exit(-1);
+ }
+ CSolver* solver = CSolver::deserialize(argv[1]);
+ solver->printConstraints();
+ delete solver;
+ return 1;
+
+}
#include "time.h"
-#if 1
+#ifdef SATCHECK_CONFIG
extern int model_out;
extern int model_err;
extern int switch_alloc;
#define model_dprintf(fd, fmt, ...) do { switch_alloc = 1; dprintf(fd, fmt, ## __VA_ARGS__); switch_alloc = 0; } while (0)
+
#define model_print(fmt, ...) do { model_dprintf(model_out, fmt, ## __VA_ARGS__); } while (0)
#define model_print_err(fmt, ...) do { model_dprintf(model_err, fmt, ## __VA_ARGS__); } while (0)
#else
-#define model_print printf
+ #define model_print printf
#endif
+#define model_println(fmt, ...) do { model_print(fmt, ## __VA_ARGS__); model_print("\n");} while(0)
+
+
#define NEXTPOW2(x) ((x == 1) ? 1 : (1 << (sizeof(uint) * 8 - __builtin_clz(x - 1))))
#define NUMBITS(x) ((x == 0) ? 0 : 8 * sizeof(x) - __builtin_clz(x))
//#define CONFIG_DEBUG
#define TRACE_DEBUG
#endif
-
+//#define SATCHECK_CONFIG
#ifndef CONFIG_ASSERT
#define CONFIG_ASSERT
#endif
size = allElements.getSize();
for (uint i = 0; i < size; i++) {
- delete allElements.get(i);
+ Element* el = allElements.get(i);
+ delete el;
}
size = allTables.getSize();
return copy;
}
+CSolver* CSolver::deserialize(const char * file){
+ model_print("deserializing ...\n");
+ Deserializer deserializer(file);
+ return deserializer.deserialize();
+}
+
void CSolver::serialize() {
model_print("serializing ...\n");
- {
- Serializer serializer("dump");
- SetIteratorBooleanEdge *it = getConstraints();
- while (it->hasNext()) {
- BooleanEdge b = it->next();
- serializeBooleanEdge(&serializer, b);
- }
- delete it;
- }
- model_print("deserializing ...\n");
- {
- Deserializer deserializer("dump");
- deserializer.deserialize();
+ printConstraints();
+ Serializer serializer("dump");
+ SetIteratorBooleanEdge *it = getConstraints();
+ while (it->hasNext()) {
+ BooleanEdge b = it->next();
+ serializeBooleanEdge(&serializer, b, true);
}
+ delete it;
}
Set *CSolver::createSet(VarType type, uint64_t *elements, uint numelements) {
}
void CSolver::addConstraint(BooleanEdge constraint) {
+#ifdef TRACE_DEBUG
+ model_println("****New Constraint******");
+#endif
+ if(constraint.isNegated())
+ model_print("!");
+ constraint.getBoolean()->print();
if (isTrue(constraint))
return;
else if (isFalse(constraint)) {
//IntegerEncodingTransform iet(this);
//iet.doTransform();
- //EncodingGraph eg(this);
- //eg.buildGraph();
- //eg.encode();
- //printConstraints();
+ EncodingGraph eg(this);
+ eg.buildGraph();
+ eg.encode();
+// printConstraints();
naiveEncodingDecision(this);
satEncoder->encodeAllSATEncoder(this);
model_print("Is problem UNSAT after encoding: %d\n", unsat);
model_print("\n");
}
delete it;
-
}
void CSolver::printConstraint(BooleanEdge b) {
void replaceBooleanWithBoolean(BooleanEdge oldb, BooleanEdge newb);
CSolver *clone();
void serialize();
+ static CSolver* deserialize(const char * file);
void autoTune(uint budget);
void setTuner(Tuner *_tuner) { tuner = _tuner; }
void * ourrealloc(void *ptr, size_t size);
*/
-#if 1
+#ifdef SATCHECK_CONFIG
void *model_malloc(size_t size);
void model_free(void *ptr);
void *model_calloc(size_t count, size_t size);