def deserialise_inner (ss, i): if ss[i] == 'Leaf': return (i + 1, ProofNode ('Leaf')) elif ss[i] == 'Restr': point = int (ss[i + 1]) tag = ss[i + 2] kind = ss[i + 3] assert kind in ['Number', 'Offset'], (kind, i) x = int (ss[i + 4]) y = int (ss[i + 5]) (i, p1) = deserialise_inner (ss, i + 6) return (i, ProofNode ('Restr', (point, (kind, (x, y))), [p1])) elif ss[i] == 'Split': n = int (ss[i + 1]) loop_r_max = int (ss[i + 2]) (i, l_details) = deserialise_details (ss, i + 3) (i, r_details) = deserialise_details (ss, i) (i, eqs) = syntax.parse_list (deserialise_double_lambda, ss, i) (i, p1) = deserialise_inner (ss, i) (i, p2) = deserialise_inner (ss, i) return (i, ProofNode ('Split', (l_details, r_details, eqs, n, loop_r_max), [p1, p2])) elif ss[i] == 'CaseSplit': n = int (ss[i + 1]) tag = ss[i + 2] (i, p1) = deserialise_inner (ss, i + 3) (i, p2) = deserialise_inner (ss, i) return (i, ProofNode ('CaseSplit', (n, tag), [p1, p2])) else: assert not 'proof node type understood', (ss, i)
def deserialise_inner(ss, i): if ss[i] == 'Leaf': return (i + 1, ProofNode('Leaf')) elif ss[i] == 'Restr': point = int(ss[i + 1]) tag = ss[i + 2] kind = ss[i + 3] assert kind in ['Number', 'Offset'], (kind, i) x = int(ss[i + 4]) y = int(ss[i + 5]) (i, p1) = deserialise_inner(ss, i + 6) return (i, ProofNode('Restr', (point, (kind, (x, y))), [p1])) elif ss[i] == 'SingleRevInduct': point = int(ss[i + 1]) tag = ss[i + 2] n = int(ss[i + 3]) (i, eqs) = syntax.parse_list(deserialise_double_lambda, ss, i + 4) (i, pred) = syntax.parse_term(ss, i) n_bound = int(ss[i]) (i, p1) = deserialise_inner(ss, i + 1) return (i, ProofNode('SingleRevInduct', (point, (eqs, n), (pred, n_bound)), [p1])) elif ss[i] == 'Split': n = int(ss[i + 1]) loop_r_max = int(ss[i + 2]) (i, l_details) = deserialise_details(ss, i + 3) (i, r_details) = deserialise_details(ss, i) (i, eqs) = syntax.parse_list(deserialise_double_lambda, ss, i) (i, p1) = deserialise_inner(ss, i) (i, p2) = deserialise_inner(ss, i) return (i, ProofNode('Split', (l_details, r_details, eqs, n, loop_r_max), [p1, p2])) elif ss[i] == 'CaseSplit': n = int(ss[i + 1]) tag = ss[i + 2] (i, p1) = deserialise_inner(ss, i + 3) (i, p2) = deserialise_inner(ss, i) return (i, ProofNode('CaseSplit', (n, tag), [p1, p2])) else: assert not 'proof node type understood', (ss, i)
def deserialise (name, lines): assert lines[0] == 'Problem', lines[0] assert lines[-1] == 'EndProblem', lines[-1] i = 1 # not easy to reconstruct pairing p = Problem (pairing = None, name = name) while lines[i].startswith ('Entry'): bits = lines[i].split () en = int (bits[1]) tag = bits[2] fname = bits[3] (n, inputs) = syntax.parse_list (syntax.parse_lval, bits, 4) (n, outputs) = syntax.parse_list (syntax.parse_lval, bits, n) assert n == len (bits), (n, bits) p.entries.append ((en, tag, fname, inputs)) p.outputs[tag] = outputs i += 1 for i in range (i, len (lines) - 1): bits = lines[i].split () n = int (bits[0]) node = syntax.parse_node (bits, 1) p.nodes[n] = node return p
def deserialise(name, lines): assert lines[0] == 'Problem', lines[0] assert lines[-1] == 'EndProblem', lines[-1] i = 1 # not easy to reconstruct pairing p = Problem(pairing=None, name=name) while lines[i].startswith('Entry'): bits = lines[i].split() en = int(bits[1]) tag = bits[2] fname = bits[3] (n, inputs) = syntax.parse_list(syntax.parse_lval, bits, 4) (n, outputs) = syntax.parse_list(syntax.parse_lval, bits, n) assert n == len(bits), (n, bits) p.entries.append((en, tag, fname, inputs)) p.outputs[tag] = outputs i += 1 for i in range(i, len(lines) - 1): bits = lines[i].split() n = int(bits[0]) node = syntax.parse_node(bits, 1) p.nodes[n] = node return p
def deserialise_details(ss, i): (split, seq_start, step) = [int(x) for x in ss[i:i + 3]] (i, eqs) = syntax.parse_list(deserialise_lambda, ss, i + 3) return (i, (split, (seq_start, step), eqs))
def parse_ctxt(bits, n): return syntax.parse_list(parse_ctxt_id, bits, n)
ls = list(f) f.close() except IOError, e: ls = [] from syntax import parse_int, parse_list for l in ls: bits = l.split() if bits[:1] not in [["LoopBound"], ["GlobalLoopBound"]]: continue (n, (addr, bound)) = parse_bound(bits, 1) (n, ctxt) = parse_ctxt(bits, n) prob_hash = parse_int(bits[n]) n += 1 if bits[0] == "LoopBound": (n, prev_bounds) = parse_list(parse_bound, bits, n) assert n == len(bits), bits known = known_bounds.setdefault(addr, []) known.append((ctxt, prob_hash, prev_bounds, bound)) else: assert n == len(bits), bits known = known_bounds.setdefault((addr, "Global"), []) known.append((ctxt, prob_hash, bound)) known_bounds["Loaded"] = True def get_bound_ctxt(split, call_ctxt): trace("Getting bound for 0x%x in context %s." % (split, call_ctxt)) (p, hyps, addr_map) = get_call_ctxt_problem(split, call_ctxt) orig_split = split
def deserialise_details (ss, i): (split, seq_start, step) = [int (x) for x in ss[i : i + 3]] (i, eqs) = syntax.parse_list (deserialise_lambda, ss, i + 3) return (i, (split, (seq_start, step), eqs))
f = open('%s/LoopBounds.txt' % target_objects.target_dir) ls = list(f) f.close() except IOError, e: ls = [] from syntax import parse_int, parse_list for l in ls: bits = l.split() if bits[:1] not in [['LoopBound'], ['GlobalLoopBound']]: continue (n, (addr, bound)) = parse_bound(bits, 1) (n, ctxt) = parse_ctxt(bits, n) prob_hash = parse_int(bits[n]) n += 1 if bits[0] == 'LoopBound': (n, prev_bounds) = parse_list(parse_bound, bits, n) assert n == len(bits), bits known = known_bounds.setdefault(addr, []) known.append((ctxt, prob_hash, prev_bounds, bound)) else: assert n == len(bits), bits known = known_bounds.setdefault((addr, 'Global'), []) known.append((ctxt, prob_hash, bound)) known_bounds['Loaded'] = True def get_bound_ctxt(split, call_ctxt, use_cache=True): trace('Getting bound for 0x%x in context %s.' % (split, call_ctxt)) (p, hyps, addr_map) = get_call_ctxt_problem(split, call_ctxt) orig_split = split