completed serializer/deserializer
[satune.git] / src / Serialize / deserializer.cc
index 7616cd7e31a9186b6424eb06bb25704a61fe9c0c..2b431debcafeeca4e1fb15f989f2b6c339532cc1 100644 (file)
@@ -10,6 +10,9 @@
 #include "csolver.h"
 #include "unistd.h"
 #include "fcntl.h"
+#include "predicate.h"
+#include "table.h"
+#include "element.h"
 
 Deserializer::Deserializer(const char* file):
        solver(new CSolver())
@@ -48,6 +51,36 @@ CSolver * Deserializer::deserialize(){
                        case SETTYPE:
                                deserializeSet();
                                break;
+                       case LOGICOP:
+                               deserializeBooleanLogic();
+                               break;
+                       case PREDICATEOP:
+                               deserializeBooleanPredicate();
+                               break;
+                       case PREDTABLETYPE:
+                               deserializePredicateTable();
+                               break;
+                       case PREDOPERTYPE:
+                               deserializePredicateOperator();
+                               break;
+                       case TABLETYPE:
+                               deserializeTable();
+                               break;
+                       case ELEMSET:
+                               deserializeElementSet();
+                               break;
+                       case ELEMCONST:
+                               deserializeElementConst();
+                               break;
+                       case ELEMFUNCRETURN:
+                               deserializeElementFunction();
+                               break;
+                       case FUNCOPTYPE:
+                               deserializeFunctionOperator();
+                               break;
+                       case FUNCTABLETYPE:
+                               deserializeFunctionTable();
+                               break;
                        default:
                                ASSERT(0);
                }
@@ -123,3 +156,202 @@ void Deserializer::deserializeSet(){
                solver->createSet(type, members.expose(), size);
        map.put(s_ptr, set);
 }
+
+void Deserializer::deserializeBooleanLogic(){
+       BooleanLogic *bl_ptr;
+       myread(&bl_ptr, sizeof(BooleanLogic *));
+       LogicOp op;
+       myread(&op, sizeof(LogicOp));
+       uint size;
+       myread(&size, sizeof(uint));
+       Vector<BooleanEdge> members;
+       for(uint i=0; i<size; i++){
+               
+       }
+       map.put(bl_ptr, solver->applyLogicalOperation(op, members.expose(), size).getBoolean());
+}
+
+void Deserializer::deserializeBooleanPredicate(){
+       BooleanPredicate *bp_ptr;
+       myread(&bp_ptr, sizeof(BooleanPredicate *));
+       Predicate* predicate;
+       myread(&predicate, sizeof(Predicate*));
+       ASSERT(map.contains(predicate));
+       predicate = (Predicate*) map.get(predicate);
+       uint size;
+       myread(&size, sizeof(uint));
+       Vector<Element*> members;
+       for(uint i=0; i<size; i++){
+               Element* input;
+               myread(&input, sizeof(Element *));
+               ASSERT(map.contains(input));
+               input = (Element*) map.get(input);
+               members.push(input);
+       }
+       
+       Boolean* stat_ptr;
+       myread(&stat_ptr, sizeof(Boolean *));
+       BooleanEdge tmp(stat_ptr);
+       bool isNegated = tmp.isNegated();
+       ASSERT(map.contains(tmp.getBoolean()));
+       stat_ptr = (Boolean*) map.get(tmp.getBoolean());
+       BooleanEdge res(stat_ptr);
+       BooleanEdge undefStatus = isNegated?res.negate():res;
+       
+       map.put(bp_ptr, solver->applyPredicateTable(predicate, members.expose(), size, undefStatus).getBoolean());
+}
+
+void Deserializer::deserializePredicateTable(){
+       PredicateTable *pt_ptr;
+       myread(&pt_ptr, sizeof(PredicateTable *));
+       Table* table;
+       myread(&table, sizeof(Table*));
+       ASSERT(map.contains(table));
+       table = (Table*) map.get(table);
+       UndefinedBehavior undefinedbehavior;
+       myread(&undefinedbehavior, sizeof(UndefinedBehavior));
+       
+       map.put(pt_ptr, solver->createPredicateTable(table, undefinedbehavior));
+}
+
+void Deserializer::deserializePredicateOperator(){
+       PredicateOperator *po_ptr;
+       myread(&po_ptr, sizeof(PredicateOperator *));
+       CompOp op;
+       myread(&op, sizeof(CompOp));
+       uint size;
+       myread(&size, sizeof(uint));
+       Vector<Set*> domains;
+       for(uint i=0; i<size; i++){
+               Set* domain;
+               myread(&domain, sizeof(Set*));
+               ASSERT(map.contains(domain));
+               domain = (Set*) map.get(domain);
+               domains.push(domain);
+       }
+
+       map.put(po_ptr, solver->createPredicateOperator(op, domains.expose(), size));
+}
+
+void Deserializer::deserializeTable(){
+       Table *t_ptr;
+       myread(&t_ptr, sizeof(Table *));
+       uint size;
+       myread(&size, sizeof(uint));
+       Vector<Set*> domains;
+       for(uint i=0; i<size; i++){
+               Set* domain;
+               myread(&domain, sizeof(Set*));
+               ASSERT(map.contains(domain));
+               domain = (Set*) map.get(domain);
+               domains.push(domain);
+       }
+       Set* range;
+       myread(&range, sizeof(Set*));
+       ASSERT(map.contains(range));
+       range = (Set*) map.get(range);
+       Table* table = solver->createTable(domains.expose(), size, range);
+       myread(&size, sizeof(uint));
+       for(uint i=0; i<size; i++){
+               uint64_t output;
+               myread(&output, sizeof(uint64_t));
+               uint inputSize;
+               myread(&inputSize, sizeof(uint));
+               Vector<uint64_t> inputs;
+               inputs.setSize(inputSize);
+               myread(inputs.expose(), sizeof(uint64_t)*inputSize);
+               ASSERT(0);
+               table->addNewTableEntry(inputs.expose(), inputSize, output);
+       }
+       
+       map.put(t_ptr, table);
+}
+
+
+void Deserializer::deserializeElementSet(){
+       ElementSet* es_ptr;
+       myread(&es_ptr, sizeof(ElementSet*));
+       Set * set;
+       myread(&set, sizeof(Set *));
+       ASSERT(map.contains(set));
+       set  = (Set*) map.get(set);
+       map.put(es_ptr, solver->getElementVar(set));
+}
+
+void Deserializer::deserializeElementConst(){
+       ElementSet* es_ptr;
+       myread(&es_ptr, sizeof(ElementSet*));
+       VarType type;
+       myread(&type, sizeof(VarType));
+       uint64_t value;
+       myread(&value, sizeof(uint64_t));
+       map.put(es_ptr, solver->getElementConst(type, value));
+}
+
+void Deserializer::deserializeElementFunction(){
+       ElementFunction *ef_ptr;
+       myread(&ef_ptr, sizeof(ElementFunction *));
+       Function *function;
+       myread(&function, sizeof(Function*));
+       ASSERT(map.contains(function));
+       function = (Function*) map.get(function);
+       uint size;
+       myread(&size, sizeof(uint));
+       Vector<Element*> members;
+       for(uint i=0; i<size; i++){
+               Element* input;
+               myread(&input, sizeof(Element *));
+               ASSERT(map.contains(input));
+               input = (Element*) map.get(input);
+               members.push(input);
+       }
+       
+       Boolean* overflowstatus;
+       myread(&overflowstatus, sizeof(Boolean *));
+       BooleanEdge tmp(overflowstatus);
+       bool isNegated = tmp.isNegated();
+       ASSERT(map.contains(tmp.getBoolean()));
+       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));
+}
+
+
+void Deserializer::deserializeFunctionOperator(){
+       FunctionOperator *fo_ptr;
+       myread(&fo_ptr, sizeof(FunctionOperator *));
+       ArithOp op;
+       myread(&op, sizeof(ArithOp));
+       uint size;
+       myread(&size, sizeof(uint));
+       Vector<Set*> domains;
+       for(uint i=0; i<size; i++){
+               Set* domain;
+               myread(&domain, sizeof(Set*));
+               ASSERT(map.contains(domain));
+               domain = (Set*) map.get(domain);
+               domains.push(domain);
+       }
+       Set* range;
+       myread(&range, sizeof(Set*));
+       ASSERT(map.contains(range));
+       range = (Set*) map.get(range);
+       OverFlowBehavior overflowbehavior;
+       myread(&overflowbehavior, sizeof(OverFlowBehavior));
+       map.put(fo_ptr, solver->createFunctionOperator(op, domains.expose(), size, range, overflowbehavior));
+}
+
+void Deserializer::deserializeFunctionTable(){
+       FunctionTable *ft_ptr;
+       myread(&ft_ptr, sizeof(FunctionTable *));
+       Table* table;
+       myread(&table, sizeof(Table*));
+       ASSERT(map.contains(table));
+       table = (Table*) map.get(table);
+       UndefinedBehavior undefinedbehavior;
+       myread(&undefinedbehavior, sizeof(UndefinedBehavior));
+       
+       map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));
+}
\ No newline at end of file