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));