fc4cd7bab1faa3f30191d05c9ebe8385830b57f4
[satune.git] / src / Serialize / deserializer.cc
1
2 /* 
3  * File:   deserializer.cc
4  * Author: hamed
5  * 
6  * Created on September 7, 2017, 6:08 PM
7  */
8
9 #include "deserializer.h"
10 #include "csolver.h"
11 #include "unistd.h"
12 #include "fcntl.h"
13 #include "predicate.h"
14 #include "table.h"
15 #include "element.h"
16 #include "mutableset.h"
17
18 Deserializer::Deserializer(const char* file):
19         solver(new CSolver())
20 {
21         filedesc = open(file, O_RDONLY);
22  
23         if (filedesc < 0) {
24                 exit(-1);
25         }
26 }
27
28 Deserializer::~Deserializer() {
29         delete solver;
30         
31         if (-1 == close(filedesc)){
32                 exit(-1);
33         }
34 }
35
36 ssize_t Deserializer::myread(void* __buf, size_t __nbytes){
37         return read (filedesc, __buf, __nbytes);
38 }
39
40 CSolver * Deserializer::deserialize(){
41         ASTNodeType nodeType;
42         while(myread(&nodeType, sizeof(ASTNodeType) ) >0){
43                 switch(nodeType){
44                         case BOOLEANEDGE:
45                                 deserializeBooleanEdge();
46                                 break;
47                         case BOOLEANVAR:
48                                 deserializeBooleanVar();
49                                 break;
50                         case ORDERCONST:
51                                 deserializeBooleanOrder();
52                                 break;
53                         case ORDERTYPE:
54                                 deserializeOrder();
55                                 break;
56                         case SETTYPE:
57                                 deserializeSet();
58                                 break;
59                         case LOGICOP:
60                                 deserializeBooleanLogic();
61                                 break;
62                         case PREDICATEOP:
63                                 deserializeBooleanPredicate();
64                                 break;
65                         case PREDTABLETYPE:
66                                 deserializePredicateTable();
67                                 break;
68                         case PREDOPERTYPE:
69                                 deserializePredicateOperator();
70                                 break;
71                         case TABLETYPE:
72                                 deserializeTable();
73                                 break;
74                         case ELEMSET:
75                                 deserializeElementSet();
76                                 break;
77                         case ELEMCONST:
78                                 deserializeElementConst();
79                                 break;
80                         case ELEMFUNCRETURN:
81                                 deserializeElementFunction();
82                                 break;
83                         case FUNCOPTYPE:
84                                 deserializeFunctionOperator();
85                                 break;
86                         case FUNCTABLETYPE:
87                                 deserializeFunctionTable();
88                                 break;
89                         default:
90                                 ASSERT(0);
91                 }
92         }
93         return solver;
94 }
95
96 void Deserializer::deserializeBooleanEdge(){
97         Boolean *b;
98         myread(&b, sizeof(Boolean*));
99         BooleanEdge tmp(b);
100         bool isNegated = tmp.isNegated();
101         ASSERT(map.contains(tmp.getBoolean()));
102         b = (Boolean*) map.get(tmp.getBoolean());
103         BooleanEdge res(b);
104         solver->addConstraint(isNegated?res.negate():res);
105 }
106
107 void Deserializer::deserializeBooleanVar(){
108         BooleanVar *b;
109         myread(&b, sizeof(BooleanVar*));
110         VarType vtype;
111         myread(&vtype, sizeof(VarType));
112         map.put(b, solver->getBooleanVar(vtype).getBoolean());
113 }
114
115 void Deserializer::deserializeBooleanOrder(){
116         BooleanOrder* bo_ptr;
117         myread(&bo_ptr, sizeof(BooleanOrder*));
118         Order* order;
119         myread(&order, sizeof(Order*));
120         ASSERT(map.contains(order));
121         order  = (Order*) map.get(order);
122         uint64_t first;
123         myread(&first, sizeof(uint64_t));
124         uint64_t second;
125         myread(&second, sizeof(uint64_t));
126         map.put(bo_ptr, solver->orderConstraint(order, first, second).getBoolean());
127 }
128
129 void Deserializer::deserializeOrder(){
130         Order* o_ptr;
131         myread(&o_ptr, sizeof(Order*));
132         OrderType type;
133         myread(&type, sizeof(OrderType));
134         Set * set_ptr;
135         myread(&set_ptr, sizeof(Set *));
136         ASSERT(map.contains(set_ptr));
137         Set* set  = (Set*) map.get(set_ptr);
138         map.put(o_ptr, solver->createOrder(type, set));
139 }
140
141 void Deserializer::deserializeSet(){
142         Set *s_ptr;
143         myread(&s_ptr, sizeof(Set*));
144         VarType type;
145         myread(&type, sizeof(VarType));
146         bool isRange;
147         myread(&isRange, sizeof(bool));
148         uint64_t low;
149         myread(&low, sizeof(uint64_t));
150         uint64_t high;
151         myread(&high, sizeof(uint64_t));
152         bool isMutable;
153         myread(&isMutable, sizeof(bool));
154         Set *set;
155         if(isMutable){
156                 set = new MutableSet(type);
157         }
158         uint size;
159         myread(&size, sizeof(uint));
160         Vector<uint64_t> members;
161         for(uint i=0; i<size; i++){
162                 uint64_t mem;
163                 myread(&mem, sizeof(uint64_t));
164                 if(isMutable) {
165                         ((MutableSet*) set)->addElementMSet(mem);
166                 }else {
167                         members.push(mem);
168                 }
169         }
170         if(!isMutable){
171                 set = isRange? solver->createRangeSet(type, low, high):
172                         solver->createSet(type, members.expose(), size);
173         }
174         map.put(s_ptr, set);
175 }
176
177 void Deserializer::deserializeBooleanLogic(){
178         BooleanLogic *bl_ptr;
179         myread(&bl_ptr, sizeof(BooleanLogic *));
180         LogicOp op;
181         myread(&op, sizeof(LogicOp));
182         uint size;
183         myread(&size, sizeof(uint));
184         Vector<BooleanEdge> members;
185         for(uint i=0; i<size; i++){
186                 Boolean* member;
187                 myread(&member, sizeof(Boolean *));
188                 BooleanEdge tmp(member);
189                 bool isNegated = tmp.isNegated();
190                 ASSERT(map.contains(tmp.getBoolean()));
191                 member = (Boolean*) map.get(tmp.getBoolean());
192                 BooleanEdge res(member);
193                 members.push( isNegated?res.negate():res );
194         }
195         map.put(bl_ptr, solver->applyLogicalOperation(op, members.expose(), size).getBoolean());
196 }
197
198 void Deserializer::deserializeBooleanPredicate(){
199         BooleanPredicate *bp_ptr;
200         myread(&bp_ptr, sizeof(BooleanPredicate *));
201         Predicate* predicate;
202         myread(&predicate, sizeof(Predicate*));
203         ASSERT(map.contains(predicate));
204         predicate = (Predicate*) map.get(predicate);
205         uint size;
206         myread(&size, sizeof(uint));
207         Vector<Element*> members;
208         for(uint i=0; i<size; i++){
209                 Element* input;
210                 myread(&input, sizeof(Element *));
211                 ASSERT(map.contains(input));
212                 input = (Element*) map.get(input);
213                 members.push(input);
214         }
215         
216         Boolean* stat_ptr;
217         myread(&stat_ptr, sizeof(Boolean *));
218         BooleanEdge undefStatus;
219         if(stat_ptr != NULL){
220                 BooleanEdge tmp(stat_ptr);
221                 bool isNegated = tmp.isNegated();
222                 ASSERT(map.contains(tmp.getBoolean()));
223                 stat_ptr = (Boolean*) map.get(tmp.getBoolean());
224                 BooleanEdge res(stat_ptr);
225                 undefStatus = isNegated?res.negate():res;
226         } else {
227                 undefStatus = NULL;
228         }
229         map.put(bp_ptr, solver->applyPredicateTable(predicate, members.expose(), size, undefStatus).getBoolean());
230 }
231
232 void Deserializer::deserializePredicateTable(){
233         PredicateTable *pt_ptr;
234         myread(&pt_ptr, sizeof(PredicateTable *));
235         Table* table;
236         myread(&table, sizeof(Table*));
237         ASSERT(map.contains(table));
238         table = (Table*) map.get(table);
239         UndefinedBehavior undefinedbehavior;
240         myread(&undefinedbehavior, sizeof(UndefinedBehavior));
241         
242         map.put(pt_ptr, solver->createPredicateTable(table, undefinedbehavior));
243 }
244
245 void Deserializer::deserializePredicateOperator(){
246         PredicateOperator *po_ptr;
247         myread(&po_ptr, sizeof(PredicateOperator *));
248         CompOp op;
249         myread(&op, sizeof(CompOp));
250         uint size;
251         myread(&size, sizeof(uint));
252         Vector<Set*> domains;
253         for(uint i=0; i<size; i++){
254                 Set* domain;
255                 myread(&domain, sizeof(Set*));
256                 ASSERT(map.contains(domain));
257                 domain = (Set*) map.get(domain);
258                 domains.push(domain);
259         }
260
261         map.put(po_ptr, solver->createPredicateOperator(op, domains.expose(), size));
262 }
263
264 void Deserializer::deserializeTable(){
265         Table *t_ptr;
266         myread(&t_ptr, sizeof(Table *));
267         uint size;
268         myread(&size, sizeof(uint));
269         Vector<Set*> domains;
270         for(uint i=0; i<size; i++){
271                 Set* domain;
272                 myread(&domain, sizeof(Set*));
273                 ASSERT(map.contains(domain));
274                 domain = (Set*) map.get(domain);
275                 domains.push(domain);
276         }
277         Set* range;
278         myread(&range, sizeof(Set*));
279         if(range != NULL){
280                 ASSERT(map.contains(range));
281                 range = (Set*) map.get(range);
282         }
283         Table* table = solver->createTable(domains.expose(), size, range);
284         myread(&size, sizeof(uint));
285         for(uint i=0; i<size; i++){
286                 uint64_t output;
287                 myread(&output, sizeof(uint64_t));
288                 uint inputSize;
289                 myread(&inputSize, sizeof(uint));
290                 Vector<uint64_t> inputs;
291                 inputs.setSize(inputSize);
292                 myread(inputs.expose(), sizeof(uint64_t)*inputSize);
293                 table->addNewTableEntry(inputs.expose(), inputSize, output);
294         }
295         
296         map.put(t_ptr, table);
297 }
298
299
300 void Deserializer::deserializeElementSet(){
301         ElementSet* es_ptr;
302         myread(&es_ptr, sizeof(ElementSet*));
303         Set * set;
304         myread(&set, sizeof(Set *));
305         ASSERT(map.contains(set));
306         set  = (Set*) map.get(set);
307         map.put(es_ptr, solver->getElementVar(set));
308 }
309
310 void Deserializer::deserializeElementConst(){
311         ElementSet* es_ptr;
312         myread(&es_ptr, sizeof(ElementSet*));
313         VarType type;
314         myread(&type, sizeof(VarType));
315         uint64_t value;
316         myread(&value, sizeof(uint64_t));
317         map.put(es_ptr, solver->getElementConst(type, value));
318 }
319
320 void Deserializer::deserializeElementFunction(){
321         ElementFunction *ef_ptr;
322         myread(&ef_ptr, sizeof(ElementFunction *));
323         Function *function;
324         myread(&function, sizeof(Function*));
325         ASSERT(map.contains(function));
326         function = (Function*) map.get(function);
327         uint size;
328         myread(&size, sizeof(uint));
329         Vector<Element*> members;
330         for(uint i=0; i<size; i++){
331                 Element* input;
332                 myread(&input, sizeof(Element *));
333                 ASSERT(map.contains(input));
334                 input = (Element*) map.get(input);
335                 members.push(input);
336         }
337         
338         Boolean* overflowstatus;
339         myread(&overflowstatus, sizeof(Boolean *));
340         BooleanEdge tmp(overflowstatus);
341         bool isNegated = tmp.isNegated();
342         ASSERT(map.contains(tmp.getBoolean()));
343         overflowstatus = (Boolean*) map.get(tmp.getBoolean());
344         BooleanEdge res(overflowstatus);
345         BooleanEdge undefStatus = isNegated?res.negate():res;
346         
347         map.put(ef_ptr, solver->applyFunction(function, members.expose(), size, undefStatus));
348 }
349
350
351 void Deserializer::deserializeFunctionOperator(){
352         FunctionOperator *fo_ptr;
353         myread(&fo_ptr, sizeof(FunctionOperator *));
354         ArithOp op;
355         myread(&op, sizeof(ArithOp));
356         uint size;
357         myread(&size, sizeof(uint));
358         Vector<Set*> domains;
359         for(uint i=0; i<size; i++){
360                 Set* domain;
361                 myread(&domain, sizeof(Set*));
362                 ASSERT(map.contains(domain));
363                 domain = (Set*) map.get(domain);
364                 domains.push(domain);
365         }
366         Set* range;
367         myread(&range, sizeof(Set*));
368         ASSERT(map.contains(range));
369         range = (Set*) map.get(range);
370         OverFlowBehavior overflowbehavior;
371         myread(&overflowbehavior, sizeof(OverFlowBehavior));
372         map.put(fo_ptr, solver->createFunctionOperator(op, domains.expose(), size, range, overflowbehavior));
373 }
374
375 void Deserializer::deserializeFunctionTable(){
376         FunctionTable *ft_ptr;
377         myread(&ft_ptr, sizeof(FunctionTable *));
378         Table* table;
379         myread(&table, sizeof(Table*));
380         ASSERT(map.contains(table));
381         table = (Table*) map.get(table);
382         UndefinedBehavior undefinedbehavior;
383         myread(&undefinedbehavior, sizeof(UndefinedBehavior));
384         
385         map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));
386 }