3 * File: deserializer.cc
6 * Created on September 7, 2017, 6:08 PM
9 #include "deserializer.h"
13 #include "predicate.h"
16 #include "mutableset.h"
18 Deserializer::Deserializer(const char* file):
21 filedesc = open(file, O_RDONLY);
28 Deserializer::~Deserializer() {
31 if (-1 == close(filedesc)){
36 ssize_t Deserializer::myread(void* __buf, size_t __nbytes){
37 return read (filedesc, __buf, __nbytes);
40 CSolver * Deserializer::deserialize(){
42 while(myread(&nodeType, sizeof(ASTNodeType) ) >0){
45 deserializeBooleanEdge();
48 deserializeBooleanVar();
51 deserializeBooleanOrder();
60 deserializeBooleanLogic();
63 deserializeBooleanPredicate();
66 deserializePredicateTable();
69 deserializePredicateOperator();
75 deserializeElementSet();
78 deserializeElementConst();
81 deserializeElementFunction();
84 deserializeFunctionOperator();
87 deserializeFunctionTable();
96 void Deserializer::deserializeBooleanEdge(){
98 myread(&b, sizeof(Boolean*));
100 bool isNegated = tmp.isNegated();
101 ASSERT(map.contains(tmp.getBoolean()));
102 b = (Boolean*) map.get(tmp.getBoolean());
104 solver->addConstraint(isNegated?res.negate():res);
107 void Deserializer::deserializeBooleanVar(){
109 myread(&b, sizeof(BooleanVar*));
111 myread(&vtype, sizeof(VarType));
112 map.put(b, solver->getBooleanVar(vtype).getBoolean());
115 void Deserializer::deserializeBooleanOrder(){
116 BooleanOrder* bo_ptr;
117 myread(&bo_ptr, sizeof(BooleanOrder*));
119 myread(&order, sizeof(Order*));
120 ASSERT(map.contains(order));
121 order = (Order*) map.get(order);
123 myread(&first, sizeof(uint64_t));
125 myread(&second, sizeof(uint64_t));
126 map.put(bo_ptr, solver->orderConstraint(order, first, second).getBoolean());
129 void Deserializer::deserializeOrder(){
131 myread(&o_ptr, sizeof(Order*));
133 myread(&type, sizeof(OrderType));
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));
141 void Deserializer::deserializeSet(){
143 myread(&s_ptr, sizeof(Set*));
145 myread(&type, sizeof(VarType));
147 myread(&isRange, sizeof(bool));
149 myread(&isMutable, sizeof(bool));
152 myread(&low, sizeof(uint64_t));
154 myread(&high, sizeof(uint64_t));
155 map.put(s_ptr, new Set(type, low, high));
159 set = new MutableSet(type);
162 myread(&size, sizeof(uint));
163 Vector<uint64_t> members;
164 for(uint i=0; i<size; i++){
166 myread(&mem, sizeof(uint64_t));
168 ((MutableSet*) set)->addElementMSet(mem);
174 set = solver->createSet(type, members.expose(), size);
181 void Deserializer::deserializeBooleanLogic(){
182 BooleanLogic *bl_ptr;
183 myread(&bl_ptr, sizeof(BooleanLogic *));
185 myread(&op, sizeof(LogicOp));
187 myread(&size, sizeof(uint));
188 Vector<BooleanEdge> members;
189 for(uint i=0; i<size; i++){
191 myread(&member, sizeof(Boolean *));
192 BooleanEdge tmp(member);
193 bool isNegated = tmp.isNegated();
194 ASSERT(map.contains(tmp.getBoolean()));
195 member = (Boolean*) map.get(tmp.getBoolean());
196 BooleanEdge res(member);
197 members.push( isNegated?res.negate():res );
199 map.put(bl_ptr, solver->applyLogicalOperation(op, members.expose(), size).getBoolean());
202 void Deserializer::deserializeBooleanPredicate(){
203 BooleanPredicate *bp_ptr;
204 myread(&bp_ptr, sizeof(BooleanPredicate *));
205 Predicate* predicate;
206 myread(&predicate, sizeof(Predicate*));
207 ASSERT(map.contains(predicate));
208 predicate = (Predicate*) map.get(predicate);
210 myread(&size, sizeof(uint));
211 Vector<Element*> members;
212 for(uint i=0; i<size; i++){
214 myread(&input, sizeof(Element *));
215 ASSERT(map.contains(input));
216 input = (Element*) map.get(input);
221 myread(&stat_ptr, sizeof(Boolean *));
222 BooleanEdge undefStatus;
223 if(stat_ptr != NULL){
224 BooleanEdge tmp(stat_ptr);
225 bool isNegated = tmp.isNegated();
226 ASSERT(map.contains(tmp.getBoolean()));
227 stat_ptr = (Boolean*) map.get(tmp.getBoolean());
228 BooleanEdge res(stat_ptr);
229 undefStatus = isNegated?res.negate():res;
233 map.put(bp_ptr, solver->applyPredicateTable(predicate, members.expose(), size, undefStatus).getBoolean());
236 void Deserializer::deserializePredicateTable(){
237 PredicateTable *pt_ptr;
238 myread(&pt_ptr, sizeof(PredicateTable *));
240 myread(&table, sizeof(Table*));
241 ASSERT(map.contains(table));
242 table = (Table*) map.get(table);
243 UndefinedBehavior undefinedbehavior;
244 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
246 map.put(pt_ptr, solver->createPredicateTable(table, undefinedbehavior));
249 void Deserializer::deserializePredicateOperator(){
250 PredicateOperator *po_ptr;
251 myread(&po_ptr, sizeof(PredicateOperator *));
253 myread(&op, sizeof(CompOp));
255 myread(&size, sizeof(uint));
256 Vector<Set*> domains;
257 for(uint i=0; i<size; i++){
259 myread(&domain, sizeof(Set*));
260 ASSERT(map.contains(domain));
261 domain = (Set*) map.get(domain);
262 domains.push(domain);
265 map.put(po_ptr, solver->createPredicateOperator(op, domains.expose(), size));
268 void Deserializer::deserializeTable(){
270 myread(&t_ptr, sizeof(Table *));
272 myread(&size, sizeof(uint));
273 Vector<Set*> domains;
274 for(uint i=0; i<size; i++){
276 myread(&domain, sizeof(Set*));
277 ASSERT(map.contains(domain));
278 domain = (Set*) map.get(domain);
279 domains.push(domain);
282 myread(&range, sizeof(Set*));
284 ASSERT(map.contains(range));
285 range = (Set*) map.get(range);
287 Table* table = solver->createTable(domains.expose(), size, range);
288 myread(&size, sizeof(uint));
289 for(uint i=0; i<size; i++){
291 myread(&output, sizeof(uint64_t));
293 myread(&inputSize, sizeof(uint));
294 Vector<uint64_t> inputs;
295 inputs.setSize(inputSize);
296 myread(inputs.expose(), sizeof(uint64_t)*inputSize);
297 table->addNewTableEntry(inputs.expose(), inputSize, output);
300 map.put(t_ptr, table);
304 void Deserializer::deserializeElementSet(){
306 myread(&es_ptr, sizeof(ElementSet*));
308 myread(&set, sizeof(Set *));
309 ASSERT(map.contains(set));
310 set = (Set*) map.get(set);
311 map.put(es_ptr, solver->getElementVar(set));
314 void Deserializer::deserializeElementConst(){
316 myread(&es_ptr, sizeof(ElementSet*));
318 myread(&type, sizeof(VarType));
320 myread(&value, sizeof(uint64_t));
321 map.put(es_ptr, solver->getElementConst(type, value));
324 void Deserializer::deserializeElementFunction(){
325 ElementFunction *ef_ptr;
326 myread(&ef_ptr, sizeof(ElementFunction *));
328 myread(&function, sizeof(Function*));
329 ASSERT(map.contains(function));
330 function = (Function*) map.get(function);
332 myread(&size, sizeof(uint));
333 Vector<Element*> members;
334 for(uint i=0; i<size; i++){
336 myread(&input, sizeof(Element *));
337 ASSERT(map.contains(input));
338 input = (Element*) map.get(input);
342 Boolean* overflowstatus;
343 myread(&overflowstatus, sizeof(Boolean *));
344 BooleanEdge tmp(overflowstatus);
345 bool isNegated = tmp.isNegated();
346 ASSERT(map.contains(tmp.getBoolean()));
347 overflowstatus = (Boolean*) map.get(tmp.getBoolean());
348 BooleanEdge res(overflowstatus);
349 BooleanEdge undefStatus = isNegated?res.negate():res;
351 map.put(ef_ptr, solver->applyFunction(function, members.expose(), size, undefStatus));
355 void Deserializer::deserializeFunctionOperator(){
356 FunctionOperator *fo_ptr;
357 myread(&fo_ptr, sizeof(FunctionOperator *));
359 myread(&op, sizeof(ArithOp));
361 myread(&size, sizeof(uint));
362 Vector<Set*> domains;
363 for(uint i=0; i<size; i++){
365 myread(&domain, sizeof(Set*));
366 ASSERT(map.contains(domain));
367 domain = (Set*) map.get(domain);
368 domains.push(domain);
371 myread(&range, sizeof(Set*));
372 ASSERT(map.contains(range));
373 range = (Set*) map.get(range);
374 OverFlowBehavior overflowbehavior;
375 myread(&overflowbehavior, sizeof(OverFlowBehavior));
376 map.put(fo_ptr, solver->createFunctionOperator(op, domains.expose(), size, range, overflowbehavior));
379 void Deserializer::deserializeFunctionTable(){
380 FunctionTable *ft_ptr;
381 myread(&ft_ptr, sizeof(FunctionTable *));
383 myread(&table, sizeof(Table*));
384 ASSERT(map.contains(table));
385 table = (Table*) map.get(table);
386 UndefinedBehavior undefinedbehavior;
387 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
389 map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));