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(&low, sizeof(uint64_t));
151 myread(&high, sizeof(uint64_t));
153 myread(&isMutable, sizeof(bool));
156 set = new MutableSet(type);
159 myread(&size, sizeof(uint));
160 Vector<uint64_t> members;
161 for(uint i=0; i<size; i++){
163 myread(&mem, sizeof(uint64_t));
165 ((MutableSet*) set)->addElementMSet(mem);
171 set = isRange? solver->createRangeSet(type, low, high):
172 solver->createSet(type, members.expose(), size);
177 void Deserializer::deserializeBooleanLogic(){
178 BooleanLogic *bl_ptr;
179 myread(&bl_ptr, sizeof(BooleanLogic *));
181 myread(&op, sizeof(LogicOp));
183 myread(&size, sizeof(uint));
184 Vector<BooleanEdge> members;
185 for(uint i=0; i<size; i++){
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 );
195 map.put(bl_ptr, solver->applyLogicalOperation(op, members.expose(), size).getBoolean());
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);
206 myread(&size, sizeof(uint));
207 Vector<Element*> members;
208 for(uint i=0; i<size; i++){
210 myread(&input, sizeof(Element *));
211 ASSERT(map.contains(input));
212 input = (Element*) map.get(input);
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;
229 map.put(bp_ptr, solver->applyPredicateTable(predicate, members.expose(), size, undefStatus).getBoolean());
232 void Deserializer::deserializePredicateTable(){
233 PredicateTable *pt_ptr;
234 myread(&pt_ptr, sizeof(PredicateTable *));
236 myread(&table, sizeof(Table*));
237 ASSERT(map.contains(table));
238 table = (Table*) map.get(table);
239 UndefinedBehavior undefinedbehavior;
240 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
242 map.put(pt_ptr, solver->createPredicateTable(table, undefinedbehavior));
245 void Deserializer::deserializePredicateOperator(){
246 PredicateOperator *po_ptr;
247 myread(&po_ptr, sizeof(PredicateOperator *));
249 myread(&op, sizeof(CompOp));
251 myread(&size, sizeof(uint));
252 Vector<Set*> domains;
253 for(uint i=0; i<size; i++){
255 myread(&domain, sizeof(Set*));
256 ASSERT(map.contains(domain));
257 domain = (Set*) map.get(domain);
258 domains.push(domain);
261 map.put(po_ptr, solver->createPredicateOperator(op, domains.expose(), size));
264 void Deserializer::deserializeTable(){
266 myread(&t_ptr, sizeof(Table *));
268 myread(&size, sizeof(uint));
269 Vector<Set*> domains;
270 for(uint i=0; i<size; i++){
272 myread(&domain, sizeof(Set*));
273 ASSERT(map.contains(domain));
274 domain = (Set*) map.get(domain);
275 domains.push(domain);
278 myread(&range, sizeof(Set*));
280 ASSERT(map.contains(range));
281 range = (Set*) map.get(range);
283 Table* table = solver->createTable(domains.expose(), size, range);
284 myread(&size, sizeof(uint));
285 for(uint i=0; i<size; i++){
287 myread(&output, sizeof(uint64_t));
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);
296 map.put(t_ptr, table);
300 void Deserializer::deserializeElementSet(){
302 myread(&es_ptr, sizeof(ElementSet*));
304 myread(&set, sizeof(Set *));
305 ASSERT(map.contains(set));
306 set = (Set*) map.get(set);
307 map.put(es_ptr, solver->getElementVar(set));
310 void Deserializer::deserializeElementConst(){
312 myread(&es_ptr, sizeof(ElementSet*));
314 myread(&type, sizeof(VarType));
316 myread(&value, sizeof(uint64_t));
317 map.put(es_ptr, solver->getElementConst(type, value));
320 void Deserializer::deserializeElementFunction(){
321 ElementFunction *ef_ptr;
322 myread(&ef_ptr, sizeof(ElementFunction *));
324 myread(&function, sizeof(Function*));
325 ASSERT(map.contains(function));
326 function = (Function*) map.get(function);
328 myread(&size, sizeof(uint));
329 Vector<Element*> members;
330 for(uint i=0; i<size; i++){
332 myread(&input, sizeof(Element *));
333 ASSERT(map.contains(input));
334 input = (Element*) map.get(input);
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;
347 map.put(ef_ptr, solver->applyFunction(function, members.expose(), size, undefStatus));
351 void Deserializer::deserializeFunctionOperator(){
352 FunctionOperator *fo_ptr;
353 myread(&fo_ptr, sizeof(FunctionOperator *));
355 myread(&op, sizeof(ArithOp));
357 myread(&size, sizeof(uint));
358 Vector<Set*> domains;
359 for(uint i=0; i<size; i++){
361 myread(&domain, sizeof(Set*));
362 ASSERT(map.contains(domain));
363 domain = (Set*) map.get(domain);
364 domains.push(domain);
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));
375 void Deserializer::deserializeFunctionTable(){
376 FunctionTable *ft_ptr;
377 myread(&ft_ptr, sizeof(FunctionTable *));
379 myread(&table, sizeof(Table*));
380 ASSERT(map.contains(table));
381 table = (Table*) map.get(table);
382 UndefinedBehavior undefinedbehavior;
383 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
385 map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));