3 * File: deserializer.cc
6 * Created on September 7, 2017, 6:08 PM
9 #include "deserializer.h"
13 #include "predicate.h"
17 Deserializer::Deserializer(const char* file):
20 filedesc = open(file, O_RDONLY);
27 Deserializer::~Deserializer() {
30 if (-1 == close(filedesc)){
35 ssize_t Deserializer::myread(void* __buf, size_t __nbytes){
36 return read (filedesc, __buf, __nbytes);
39 CSolver * Deserializer::deserialize(){
41 while(myread(&nodeType, sizeof(ASTNodeType) ) >0){
44 deserializeBooleanEdge();
47 deserializeBooleanVar();
50 deserializeBooleanOrder();
59 deserializeBooleanLogic();
62 deserializeBooleanPredicate();
65 deserializePredicateTable();
68 deserializePredicateOperator();
74 deserializeElementSet();
77 deserializeElementConst();
80 deserializeElementFunction();
83 deserializeFunctionOperator();
86 deserializeFunctionTable();
95 void Deserializer::deserializeBooleanEdge(){
97 myread(&b, sizeof(Boolean*));
99 bool isNegated = tmp.isNegated();
100 ASSERT(map.contains(tmp.getBoolean()));
101 b = (Boolean*) map.get(tmp.getBoolean());
103 solver->addConstraint(isNegated?res.negate():res);
106 void Deserializer::deserializeBooleanVar(){
108 myread(&b, sizeof(BooleanVar*));
110 myread(&vtype, sizeof(VarType));
111 map.put(b, solver->getBooleanVar(vtype).getBoolean());
114 void Deserializer::deserializeBooleanOrder(){
115 BooleanOrder* bo_ptr;
116 myread(&bo_ptr, sizeof(BooleanOrder*));
118 myread(&order, sizeof(Order*));
119 ASSERT(map.contains(order));
120 order = (Order*) map.get(order);
122 myread(&first, sizeof(uint64_t));
124 myread(&second, sizeof(uint64_t));
125 map.put(bo_ptr, solver->orderConstraint(order, first, second).getBoolean());
128 void Deserializer::deserializeOrder(){
130 myread(&o_ptr, sizeof(Order*));
132 myread(&type, sizeof(OrderType));
134 myread(&set_ptr, sizeof(Set *));
135 ASSERT(map.contains(set_ptr));
136 Set* set = (Set*) map.get(set_ptr);
137 map.put(o_ptr, solver->createOrder(type, set));
140 void Deserializer::deserializeSet(){
142 myread(&s_ptr, sizeof(Set*));
144 myread(&type, sizeof(VarType));
146 myread(&isRange, sizeof(bool));
148 myread(&low, sizeof(uint64_t));
150 myread(&high, sizeof(uint64_t));
152 myread(&size, sizeof(uint));
153 Vector<uint64_t> members;
154 for(uint i=0; i<size; i++){
156 myread(&mem, sizeof(uint64_t));
159 Set *set = isRange? solver->createRangeSet(type, low, high):
160 solver->createSet(type, members.expose(), size);
164 void Deserializer::deserializeBooleanLogic(){
165 BooleanLogic *bl_ptr;
166 myread(&bl_ptr, sizeof(BooleanLogic *));
168 myread(&op, sizeof(LogicOp));
170 myread(&size, sizeof(uint));
171 Vector<BooleanEdge> members;
172 for(uint i=0; i<size; i++){
175 map.put(bl_ptr, solver->applyLogicalOperation(op, members.expose(), size).getBoolean());
178 void Deserializer::deserializeBooleanPredicate(){
179 BooleanPredicate *bp_ptr;
180 myread(&bp_ptr, sizeof(BooleanPredicate *));
181 Predicate* predicate;
182 myread(&predicate, sizeof(Predicate*));
183 ASSERT(map.contains(predicate));
184 predicate = (Predicate*) map.get(predicate);
186 myread(&size, sizeof(uint));
187 Vector<Element*> members;
188 for(uint i=0; i<size; i++){
190 myread(&input, sizeof(Element *));
191 ASSERT(map.contains(input));
192 input = (Element*) map.get(input);
197 myread(&stat_ptr, sizeof(Boolean *));
198 BooleanEdge undefStatus;
199 if(stat_ptr != NULL){
200 BooleanEdge tmp(stat_ptr);
201 bool isNegated = tmp.isNegated();
202 ASSERT(map.contains(tmp.getBoolean()));
203 stat_ptr = (Boolean*) map.get(tmp.getBoolean());
204 BooleanEdge res(stat_ptr);
205 undefStatus = isNegated?res.negate():res;
209 map.put(bp_ptr, solver->applyPredicateTable(predicate, members.expose(), size, undefStatus).getBoolean());
212 void Deserializer::deserializePredicateTable(){
213 PredicateTable *pt_ptr;
214 myread(&pt_ptr, sizeof(PredicateTable *));
216 myread(&table, sizeof(Table*));
217 ASSERT(map.contains(table));
218 table = (Table*) map.get(table);
219 UndefinedBehavior undefinedbehavior;
220 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
222 map.put(pt_ptr, solver->createPredicateTable(table, undefinedbehavior));
225 void Deserializer::deserializePredicateOperator(){
226 PredicateOperator *po_ptr;
227 myread(&po_ptr, sizeof(PredicateOperator *));
229 myread(&op, sizeof(CompOp));
231 myread(&size, sizeof(uint));
232 Vector<Set*> domains;
233 for(uint i=0; i<size; i++){
235 myread(&domain, sizeof(Set*));
236 ASSERT(map.contains(domain));
237 domain = (Set*) map.get(domain);
238 domains.push(domain);
241 map.put(po_ptr, solver->createPredicateOperator(op, domains.expose(), size));
244 void Deserializer::deserializeTable(){
246 myread(&t_ptr, sizeof(Table *));
248 myread(&size, sizeof(uint));
249 Vector<Set*> domains;
250 for(uint i=0; i<size; i++){
252 myread(&domain, sizeof(Set*));
253 ASSERT(map.contains(domain));
254 domain = (Set*) map.get(domain);
255 domains.push(domain);
258 myread(&range, sizeof(Set*));
260 ASSERT(map.contains(range));
261 range = (Set*) map.get(range);
263 Table* table = solver->createTable(domains.expose(), size, range);
264 myread(&size, sizeof(uint));
265 for(uint i=0; i<size; i++){
267 myread(&output, sizeof(uint64_t));
269 myread(&inputSize, sizeof(uint));
270 Vector<uint64_t> inputs;
271 inputs.setSize(inputSize);
272 myread(inputs.expose(), sizeof(uint64_t)*inputSize);
273 table->addNewTableEntry(inputs.expose(), inputSize, output);
276 map.put(t_ptr, table);
280 void Deserializer::deserializeElementSet(){
282 myread(&es_ptr, sizeof(ElementSet*));
284 myread(&set, sizeof(Set *));
285 ASSERT(map.contains(set));
286 set = (Set*) map.get(set);
287 map.put(es_ptr, solver->getElementVar(set));
290 void Deserializer::deserializeElementConst(){
292 myread(&es_ptr, sizeof(ElementSet*));
294 myread(&type, sizeof(VarType));
296 myread(&value, sizeof(uint64_t));
297 map.put(es_ptr, solver->getElementConst(type, value));
300 void Deserializer::deserializeElementFunction(){
301 ElementFunction *ef_ptr;
302 myread(&ef_ptr, sizeof(ElementFunction *));
304 myread(&function, sizeof(Function*));
305 ASSERT(map.contains(function));
306 function = (Function*) map.get(function);
308 myread(&size, sizeof(uint));
309 Vector<Element*> members;
310 for(uint i=0; i<size; i++){
312 myread(&input, sizeof(Element *));
313 ASSERT(map.contains(input));
314 input = (Element*) map.get(input);
318 Boolean* overflowstatus;
319 myread(&overflowstatus, sizeof(Boolean *));
320 BooleanEdge tmp(overflowstatus);
321 bool isNegated = tmp.isNegated();
322 ASSERT(map.contains(tmp.getBoolean()));
323 overflowstatus = (Boolean*) map.get(tmp.getBoolean());
324 BooleanEdge res(overflowstatus);
325 BooleanEdge undefStatus = isNegated?res.negate():res;
327 map.put(ef_ptr, solver->applyFunction(function, members.expose(), size, undefStatus));
331 void Deserializer::deserializeFunctionOperator(){
332 FunctionOperator *fo_ptr;
333 myread(&fo_ptr, sizeof(FunctionOperator *));
335 myread(&op, sizeof(ArithOp));
337 myread(&size, sizeof(uint));
338 Vector<Set*> domains;
339 for(uint i=0; i<size; i++){
341 myread(&domain, sizeof(Set*));
342 ASSERT(map.contains(domain));
343 domain = (Set*) map.get(domain);
344 domains.push(domain);
347 myread(&range, sizeof(Set*));
348 ASSERT(map.contains(range));
349 range = (Set*) map.get(range);
350 OverFlowBehavior overflowbehavior;
351 myread(&overflowbehavior, sizeof(OverFlowBehavior));
352 map.put(fo_ptr, solver->createFunctionOperator(op, domains.expose(), size, range, overflowbehavior));
355 void Deserializer::deserializeFunctionTable(){
356 FunctionTable *ft_ptr;
357 myread(&ft_ptr, sizeof(FunctionTable *));
359 myread(&table, sizeof(Table*));
360 ASSERT(map.contains(table));
361 table = (Table*) map.get(table);
362 UndefinedBehavior undefinedbehavior;
363 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
365 map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));