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);
180 void Deserializer::deserializeBooleanLogic() {
181 BooleanLogic *bl_ptr;
182 myread(&bl_ptr, sizeof(BooleanLogic *));
184 myread(&op, sizeof(LogicOp));
186 myread(&size, sizeof(uint));
187 Vector<BooleanEdge> members;
188 for (uint i = 0; i < size; i++) {
190 myread(&member, sizeof(Boolean *));
191 BooleanEdge tmp(member);
192 bool isNegated = tmp.isNegated();
193 ASSERT(map.contains(tmp.getBoolean()));
194 member = (Boolean *) map.get(tmp.getBoolean());
195 BooleanEdge res(member);
196 members.push( isNegated ? res.negate() : res );
198 map.put(bl_ptr, solver->applyLogicalOperation(op, members.expose(), size).getBoolean());
201 void Deserializer::deserializeBooleanPredicate() {
202 BooleanPredicate *bp_ptr;
203 myread(&bp_ptr, sizeof(BooleanPredicate *));
204 Predicate *predicate;
205 myread(&predicate, sizeof(Predicate *));
206 ASSERT(map.contains(predicate));
207 predicate = (Predicate *) map.get(predicate);
209 myread(&size, sizeof(uint));
210 Vector<Element *> members;
211 for (uint i = 0; i < size; i++) {
213 myread(&input, sizeof(Element *));
214 ASSERT(map.contains(input));
215 input = (Element *) map.get(input);
220 myread(&stat_ptr, sizeof(Boolean *));
221 BooleanEdge undefStatus;
222 if (stat_ptr != NULL) {
223 BooleanEdge tmp(stat_ptr);
224 bool isNegated = tmp.isNegated();
225 ASSERT(map.contains(tmp.getBoolean()));
226 stat_ptr = (Boolean *) map.get(tmp.getBoolean());
227 BooleanEdge res(stat_ptr);
228 undefStatus = isNegated ? res.negate() : res;
232 map.put(bp_ptr, solver->applyPredicateTable(predicate, members.expose(), size, undefStatus).getBoolean());
235 void Deserializer::deserializePredicateTable() {
236 PredicateTable *pt_ptr;
237 myread(&pt_ptr, sizeof(PredicateTable *));
239 myread(&table, sizeof(Table *));
240 ASSERT(map.contains(table));
241 table = (Table *) map.get(table);
242 UndefinedBehavior undefinedbehavior;
243 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
245 map.put(pt_ptr, solver->createPredicateTable(table, undefinedbehavior));
248 void Deserializer::deserializePredicateOperator() {
249 PredicateOperator *po_ptr;
250 myread(&po_ptr, sizeof(PredicateOperator *));
252 myread(&op, sizeof(CompOp));
254 myread(&size, sizeof(uint));
255 Vector<Set *> domains;
256 for (uint i = 0; i < size; i++) {
258 myread(&domain, sizeof(Set *));
259 ASSERT(map.contains(domain));
260 domain = (Set *) map.get(domain);
261 domains.push(domain);
264 map.put(po_ptr, solver->createPredicateOperator(op, domains.expose(), size));
267 void Deserializer::deserializeTable() {
269 myread(&t_ptr, sizeof(Table *));
271 myread(&size, sizeof(uint));
272 Vector<Set *> domains;
273 for (uint i = 0; i < size; i++) {
275 myread(&domain, sizeof(Set *));
276 ASSERT(map.contains(domain));
277 domain = (Set *) map.get(domain);
278 domains.push(domain);
281 myread(&range, sizeof(Set *));
283 ASSERT(map.contains(range));
284 range = (Set *) map.get(range);
286 Table *table = solver->createTable(domains.expose(), size, range);
287 myread(&size, sizeof(uint));
288 for (uint i = 0; i < size; i++) {
290 myread(&output, sizeof(uint64_t));
292 myread(&inputSize, sizeof(uint));
293 Vector<uint64_t> inputs;
294 inputs.setSize(inputSize);
295 myread(inputs.expose(), sizeof(uint64_t) * inputSize);
296 table->addNewTableEntry(inputs.expose(), inputSize, output);
299 map.put(t_ptr, table);
303 void Deserializer::deserializeElementSet() {
305 myread(&es_ptr, sizeof(ElementSet *));
307 myread(&set, sizeof(Set *));
308 ASSERT(map.contains(set));
309 set = (Set *) map.get(set);
310 map.put(es_ptr, solver->getElementVar(set));
313 void Deserializer::deserializeElementConst() {
315 myread(&es_ptr, sizeof(ElementSet *));
317 myread(&type, sizeof(VarType));
319 myread(&value, sizeof(uint64_t));
320 map.put(es_ptr, solver->getElementConst(type, value));
323 void Deserializer::deserializeElementFunction() {
324 ElementFunction *ef_ptr;
325 myread(&ef_ptr, sizeof(ElementFunction *));
327 myread(&function, sizeof(Function *));
328 ASSERT(map.contains(function));
329 function = (Function *) map.get(function);
331 myread(&size, sizeof(uint));
332 Vector<Element *> members;
333 for (uint i = 0; i < size; i++) {
335 myread(&input, sizeof(Element *));
336 ASSERT(map.contains(input));
337 input = (Element *) map.get(input);
341 Boolean *overflowstatus;
342 myread(&overflowstatus, sizeof(Boolean *));
343 BooleanEdge tmp(overflowstatus);
344 bool isNegated = tmp.isNegated();
345 ASSERT(map.contains(tmp.getBoolean()));
346 overflowstatus = (Boolean *) map.get(tmp.getBoolean());
347 BooleanEdge res(overflowstatus);
348 BooleanEdge undefStatus = isNegated ? res.negate() : res;
350 map.put(ef_ptr, solver->applyFunction(function, members.expose(), size, undefStatus));
354 void Deserializer::deserializeFunctionOperator() {
355 FunctionOperator *fo_ptr;
356 myread(&fo_ptr, sizeof(FunctionOperator *));
358 myread(&op, sizeof(ArithOp));
360 myread(&size, sizeof(uint));
361 Vector<Set *> domains;
362 for (uint i = 0; i < size; i++) {
364 myread(&domain, sizeof(Set *));
365 ASSERT(map.contains(domain));
366 domain = (Set *) map.get(domain);
367 domains.push(domain);
370 myread(&range, sizeof(Set *));
371 ASSERT(map.contains(range));
372 range = (Set *) map.get(range);
373 OverFlowBehavior overflowbehavior;
374 myread(&overflowbehavior, sizeof(OverFlowBehavior));
375 map.put(fo_ptr, solver->createFunctionOperator(op, domains.expose(), size, range, overflowbehavior));
378 void Deserializer::deserializeFunctionTable() {
379 FunctionTable *ft_ptr;
380 myread(&ft_ptr, sizeof(FunctionTable *));
382 myread(&table, sizeof(Table *));
383 ASSERT(map.contains(table));
384 table = (Table *) map.get(table);
385 UndefinedBehavior undefinedbehavior;
386 myread(&undefinedbehavior, sizeof(UndefinedBehavior));
388 map.put(ft_ptr, solver->completeTable(table, undefinedbehavior));