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++){
174 myread(&member, sizeof(Boolean *));
175 BooleanEdge tmp(member);
176 bool isNegated = tmp.isNegated();
177 ASSERT(map.contains(tmp.getBoolean()));
178 member = (Boolean*) map.get(tmp.getBoolean());
179 BooleanEdge res(member);
180 members.push( isNegated?res.negate():res );
182 map.put(bl_ptr, solver->applyLogicalOperation(op, members.expose(), size).getBoolean());
185 void Deserializer::deserializeBooleanPredicate(){
186 BooleanPredicate *bp_ptr;
187 myread(&bp_ptr, sizeof(BooleanPredicate *));
188 Predicate* predicate;
189 myread(&predicate, sizeof(Predicate*));
190 ASSERT(map.contains(predicate));
191 predicate = (Predicate*) map.get(predicate);
193 myread(&size, sizeof(uint));
194 Vector<Element*> members;
195 for(uint i=0; i<size; i++){
197 myread(&input, sizeof(Element *));
198 ASSERT(map.contains(input));
199 input = (Element*) map.get(input);
204 myread(&stat_ptr, sizeof(Boolean *));
205 BooleanEdge undefStatus;
206 if(stat_ptr != NULL){
207 BooleanEdge tmp(stat_ptr);
208 bool isNegated = tmp.isNegated();
209 ASSERT(map.contains(tmp.getBoolean()));
210 stat_ptr = (Boolean*) map.get(tmp.getBoolean());
211 BooleanEdge res(stat_ptr);
212 undefStatus = isNegated?res.negate():res;
216 map.put(bp_ptr, solver->applyPredicateTable(predicate, members.expose(), size, undefStatus).getBoolean());
219 void Deserializer::deserializePredicateTable(){
220 PredicateTable *pt_ptr;
221 myread(&pt_ptr, sizeof(PredicateTable *));
223 myread(&table, sizeof(Table*));
224 ASSERT(map.contains(table));
225 table = (Table*) map.get(table);
226 UndefinedBehavior undefinedbehavior;
227 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
229 map.put(pt_ptr, solver->createPredicateTable(table, undefinedbehavior));
232 void Deserializer::deserializePredicateOperator(){
233 PredicateOperator *po_ptr;
234 myread(&po_ptr, sizeof(PredicateOperator *));
236 myread(&op, sizeof(CompOp));
238 myread(&size, sizeof(uint));
239 Vector<Set*> domains;
240 for(uint i=0; i<size; i++){
242 myread(&domain, sizeof(Set*));
243 ASSERT(map.contains(domain));
244 domain = (Set*) map.get(domain);
245 domains.push(domain);
248 map.put(po_ptr, solver->createPredicateOperator(op, domains.expose(), size));
251 void Deserializer::deserializeTable(){
253 myread(&t_ptr, sizeof(Table *));
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 myread(&range, sizeof(Set*));
267 ASSERT(map.contains(range));
268 range = (Set*) map.get(range);
270 Table* table = solver->createTable(domains.expose(), size, range);
271 myread(&size, sizeof(uint));
272 for(uint i=0; i<size; i++){
274 myread(&output, sizeof(uint64_t));
276 myread(&inputSize, sizeof(uint));
277 Vector<uint64_t> inputs;
278 inputs.setSize(inputSize);
279 myread(inputs.expose(), sizeof(uint64_t)*inputSize);
280 table->addNewTableEntry(inputs.expose(), inputSize, output);
283 map.put(t_ptr, table);
287 void Deserializer::deserializeElementSet(){
289 myread(&es_ptr, sizeof(ElementSet*));
291 myread(&set, sizeof(Set *));
292 ASSERT(map.contains(set));
293 set = (Set*) map.get(set);
294 map.put(es_ptr, solver->getElementVar(set));
297 void Deserializer::deserializeElementConst(){
299 myread(&es_ptr, sizeof(ElementSet*));
301 myread(&type, sizeof(VarType));
303 myread(&value, sizeof(uint64_t));
304 map.put(es_ptr, solver->getElementConst(type, value));
307 void Deserializer::deserializeElementFunction(){
308 ElementFunction *ef_ptr;
309 myread(&ef_ptr, sizeof(ElementFunction *));
311 myread(&function, sizeof(Function*));
312 ASSERT(map.contains(function));
313 function = (Function*) map.get(function);
315 myread(&size, sizeof(uint));
316 Vector<Element*> members;
317 for(uint i=0; i<size; i++){
319 myread(&input, sizeof(Element *));
320 ASSERT(map.contains(input));
321 input = (Element*) map.get(input);
325 Boolean* overflowstatus;
326 myread(&overflowstatus, sizeof(Boolean *));
327 BooleanEdge tmp(overflowstatus);
328 bool isNegated = tmp.isNegated();
329 ASSERT(map.contains(tmp.getBoolean()));
330 overflowstatus = (Boolean*) map.get(tmp.getBoolean());
331 BooleanEdge res(overflowstatus);
332 BooleanEdge undefStatus = isNegated?res.negate():res;
334 map.put(ef_ptr, solver->applyFunction(function, members.expose(), size, undefStatus));
338 void Deserializer::deserializeFunctionOperator(){
339 FunctionOperator *fo_ptr;
340 myread(&fo_ptr, sizeof(FunctionOperator *));
342 myread(&op, sizeof(ArithOp));
344 myread(&size, sizeof(uint));
345 Vector<Set*> domains;
346 for(uint i=0; i<size; i++){
348 myread(&domain, sizeof(Set*));
349 ASSERT(map.contains(domain));
350 domain = (Set*) map.get(domain);
351 domains.push(domain);
354 myread(&range, sizeof(Set*));
355 ASSERT(map.contains(range));
356 range = (Set*) map.get(range);
357 OverFlowBehavior overflowbehavior;
358 myread(&overflowbehavior, sizeof(OverFlowBehavior));
359 map.put(fo_ptr, solver->createFunctionOperator(op, domains.expose(), size, range, overflowbehavior));
362 void Deserializer::deserializeFunctionTable(){
363 FunctionTable *ft_ptr;
364 myread(&ft_ptr, sizeof(FunctionTable *));
366 myread(&table, sizeof(Table*));
367 ASSERT(map.contains(table));
368 table = (Table*) map.get(table);
369 UndefinedBehavior undefinedbehavior;
370 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
372 map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));