Esempio n. 1
0
def test_interesting_linear_series_exprs():
    pairs = set([pair for f in pairings for pair in pairings[f]])
    notes = {}
    for pair in pairs:
        p = check.build_problem(pair)
        for n in search.init_loops_to_split(p, ()):
            intr = logic.interesting_linear_series_exprs(p, n, search.get_loop_var_analysis_at(p, n))
            if intr:
                notes[pair.name] = True
            if "Call" in str(intr):
                notes[pair.name] = "Call!"
    return notes
Esempio n. 2
0
def test_interesting_linear_series_exprs():
    pairs = set([pair for f in pairings for pair in pairings[f]])
    notes = {}
    for pair in pairs:
        p = check.build_problem(pair)
        for n in search.init_loops_to_split(p, ()):
            intr = logic.interesting_linear_series_exprs(
                p, n, search.get_loop_var_analysis_at(p, n))
            if intr:
                notes[pair.name] = True
            if 'Call' in str(intr):
                notes[pair.name] = 'Call!'
    return notes
Esempio n. 3
0
def candidate_additional_eqs(p, split):
    eq_vals = set()

    def visitor(expr):
        if expr.is_op('Equals') and expr.vals[0].typ.kind == 'Word':
            [x, y] = expr.vals
            eq_vals.update([(x, y), (y, x)])

    for n in p.loop_body(split):
        p.nodes[n].visit(lambda x: (), visitor)
    for (x, y) in list(eq_vals):
        if is_zero(x) and y.is_op('Plus'):
            [x, y] = y.vals
            eq_vals.add((x, syntax.mk_uminus(y)))
            eq_vals.add((y, syntax.mk_uminus(x)))
        elif is_zero(x) and y.is_op('Minus'):
            [x, y] = y.vals
            eq_vals.add((x, y))
            eq_vals.add((y, x))

    loop = syntax.mk_var('%i', syntax.word32T)
    minus_loop_step = syntax.mk_uminus(loop)

    vas = search.get_loop_var_analysis_at(p, split)
    ls_vas = dict([(var, [data]) for (var, data) in vas
                   if data[0] == 'LoopLinearSeries'])
    cmp_series = [(x, y, rew, offs) for (x, y) in eq_vals
                  for (_, rew, offs) in ls_vas.get(x, [])]
    odd_eqs = []
    for (x, y, rew, offs) in cmp_series:
        x_init_cmp1 = syntax.mk_less_eq(x, rew(x, minus_loop_step))
        x_init_cmp2 = syntax.mk_less_eq(rew(x, minus_loop_step), x)
        fin_cmp1 = syntax.mk_less(x, y)
        fin_cmp2 = syntax.mk_less(y, x)
        odd_eqs.append(syntax.mk_eq(x_init_cmp1, fin_cmp1))
        odd_eqs.append(syntax.mk_eq(x_init_cmp2, fin_cmp1))
        odd_eqs.append(syntax.mk_eq(x_init_cmp1, fin_cmp2))
        odd_eqs.append(syntax.mk_eq(x_init_cmp2, fin_cmp2))

    ass_eqs = []
    var_deps = p.compute_var_dependencies()
    for hook in target_objects.hooks('extra_wcet_assertions'):
        for assn in hook(var_deps[split]):
            ass_eqs.append(assn)

    return odd_eqs + ass_eqs
Esempio n. 4
0
def var_analysis(p, n):
    va = search.get_loop_var_analysis_at(p, n)
    cats = {}
    for (v, kind) in va:
        if kind[0] == 'LoopLinearSeries':
            offs = kind[2]
            kind = kind[0]
        else:
            offs = None
        cats.setdefault(kind, [])
        cats[kind].append((v, offs))
    for kind in cats:
        print '%s:' % kind
        for (v, offs) in cats[kind]:
            print '  %s   (%s)' % (syntax.pretty_expr(v),
                                   syntax.pretty_type(v.typ))
            if offs:
                print '      ++ %s' % syntax.pretty_expr(offs)
Esempio n. 5
0
def candidate_additional_eqs(p, split):
    eq_vals = set()

    def visitor(expr):
        if expr.is_op("Equals") and expr.vals[0].typ.kind == "Word":
            [x, y] = expr.vals
            eq_vals.update([(x, y), (y, x)])

    for n in p.loop_body(split):
        p.nodes[n].visit(lambda x: (), visitor)
    for (x, y) in list(eq_vals):
        if is_zero(x) and y.is_op("Plus"):
            [x, y] = y.vals
            eq_vals.add((x, syntax.mk_uminus(y)))
            eq_vals.add((y, syntax.mk_uminus(x)))
        elif is_zero(x) and y.is_op("Minus"):
            [x, y] = y.vals
            eq_vals.add((x, y))
            eq_vals.add((y, x))

    loop = syntax.mk_var("%i", syntax.word32T)
    minus_loop_step = syntax.mk_uminus(loop)

    vas = search.get_loop_var_analysis_at(p, split)
    ls_vas = dict([(var, [data]) for (var, data) in vas if data[0] == "LoopLinearSeries"])
    cmp_series = [(x, y, rew, offs) for (x, y) in eq_vals for (_, rew, offs) in ls_vas.get(x, [])]
    odd_eqs = []
    for (x, y, rew, offs) in cmp_series:
        x_init_cmp1 = syntax.mk_less_eq(x, rew(x, minus_loop_step))
        x_init_cmp2 = syntax.mk_less_eq(rew(x, minus_loop_step), x)
        fin_cmp1 = syntax.mk_less(x, y)
        fin_cmp2 = syntax.mk_less(y, x)
        odd_eqs.append(syntax.mk_eq(x_init_cmp1, fin_cmp1))
        odd_eqs.append(syntax.mk_eq(x_init_cmp2, fin_cmp1))
        odd_eqs.append(syntax.mk_eq(x_init_cmp1, fin_cmp2))
        odd_eqs.append(syntax.mk_eq(x_init_cmp2, fin_cmp2))

    ass_eqs = []
    var_deps = p.compute_var_dependencies()
    for hook in target_objects.hooks("extra_wcet_assertions"):
        for assn in hook(var_deps[split]):
            ass_eqs.append(assn)

    return odd_eqs + ass_eqs
Esempio n. 6
0
def problem_var_analysis_nonempty ((p, pn, restrs, hyps)):
	loop_head = pn.split[0][0]
	va = search.get_loop_var_analysis_at (p, loop_head)
	return bool ([v for (v, data) in va if data == 'LoopVariable'])
Esempio n. 7
0
def loop_num_leaves(p, n):
    for n in p.loop_body(n):
        va = search.get_loop_var_analysis_at(p, n)
        n_leaf = len([1 for (v, kind) in va if kind == 'LoopLeaf'])
        print(n, n_leaf)