def add_impl_fun(impl_fname, regspecs): l_fname = 'l_' + impl_fname r_fname = 'r_' + impl_fname if l_fname in functions: return assert r_fname not in functions ident_v = ("inst_ident", syntax.builtinTs['Token']) inps = [s for s in regspecs if s == 'I'] inps = ['reg_val%d' % (i + 1) for (i, s) in enumerate(inps)] rets = [s for s in regspecs if s == 'O'] rets = ['ret_val%d' % (i + 1) for (i, s) in enumerate(rets)] l_fun = mk_fun(l_fname, inps, [ident_v], rets, [], bin_globs) r_fun = mk_fun(r_fname, inps, [ident_v], rets, [], bin_globs) inp_eqs = [((mk_var(nm, typ), 'ASM_IN'), (mk_var(nm, typ), 'C_IN')) for (nm, typ) in l_fun.inputs] inp_eqs += [((logic.mk_rodata(mk_var(nm, typ)), 'ASM_IN'), (syntax.true_term, 'C_IN')) for (nm, typ) in bin_globs] out_eqs = [((mk_var(nm, typ), 'ASM_OUT'), (mk_var(nm, typ), 'C_OUT')) for (nm, typ) in l_fun.outputs] out_eqs += [((logic.mk_rodata(mk_var(nm, typ)), 'ASM_OUT'), (syntax.true_term, 'C_OUT')) for (nm, typ) in bin_globs] pair = logic.Pairing(['ASM', 'C'], { 'ASM': l_fname, 'C': r_fname }, (inp_eqs, out_eqs)) assert l_fname not in pairings assert r_fname not in pairings functions[l_fname] = l_fun functions[r_fname] = r_fun pairings[l_fname] = [pair] pairings[r_fname] = [pair]
def mk_seq_eqs (p, split, step, with_rodata): # eqs take the form of a number of constant expressions eqs = [] # the variable 'loop' will be converted to the point in # the sequence - note this should be multiplied by the step size loop = mk_var ('%i', word32T) if step == 1: minus_loop_step = mk_uminus (loop) else: minus_loop_step = mk_times (loop, mk_word32 (- step)) for (var, data) in get_loop_var_analysis_at (p, split): if data == 'LoopVariable': if with_rodata and var.typ == builtinTs['Mem']: eqs.append (logic.mk_rodata (var)) elif data == 'LoopConst': if var.typ not in syntax.phantom_types: eqs.append (var) elif data == 'LoopLeaf': continue elif data[0] == 'LoopLinearSeries': (_, form, _) = data eqs.append (form (var, minus_loop_step)) else: assert not 'var_deps type understood' return eqs
def add_impl_fun (impl_fname, regspecs): if impl_fname in functions: return ident_v = ("inst_ident", syntax.builtinTs['Token']) inps = [s for s in regspecs if s == 'I'] inps = ['reg_val%d' % (i + 1) for (i, s) in enumerate (inps)] rets = [s for s in regspecs if s == 'O'] rets = ['ret_val%d' % (i + 1) for (i, s) in enumerate (rets)] fun = mk_fun (impl_fname, inps, [ident_v], rets, [], bin_globs) inp_eqs = [((mk_var (nm, typ), 'ASM_IN'), (mk_var (nm, typ), 'C_IN')) for (nm, typ) in fun.inputs] inp_eqs += [((logic.mk_rodata (mk_var (nm, typ)), 'ASM_IN'), (syntax.true_term, 'C_IN')) for (nm, typ) in bin_globs] out_eqs = [((mk_var (nm, typ), 'ASM_OUT'), (mk_var (nm, typ), 'C_OUT')) for (nm, typ) in fun.outputs] out_eqs += [((logic.mk_rodata (mk_var (nm, typ)), 'ASM_OUT'), (syntax.true_term, 'C_OUT')) for (nm, typ) in bin_globs] pair = logic.Pairing (['ASM', 'C'], {'C': impl_fname, 'ASM': impl_fname}, (inp_eqs, out_eqs)) assert impl_fname not in pairings functions[impl_fname] = fun pairings[impl_fname] = [pair]