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
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
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
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)
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
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'])
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)