示例#1
0
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)
示例#2
0
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)
示例#3
0
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
示例#4
0
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
示例#5
0
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))
示例#6
0
def parse_ctxt(bits, n):
    return syntax.parse_list(parse_ctxt_id, bits, n)
示例#7
0
        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
示例#8
0
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))
示例#9
0
def parse_ctxt(bits, n):
    return syntax.parse_list(parse_ctxt_id, bits, n)
示例#10
0
        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