Пример #1
0
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]
Пример #2
0
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
Пример #3
0
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]