Esempio n. 1
0
def convert(e, definitions=[], func_name='func', extra_args=[], index_trans={}, **kw):
    free_vars = extract_free_variables(e)
    for d in definitions:
        def_free_vars = extract_free_variables(d.rhs)
        free_vars.update(def_free_vars)
        free_vars.remove(d.lhs)
    #func_args = [c_var(str(a)) for a in sorted(free_vars,key=lambda x:str(x))]
    func_args = []
    for a in sorted(free_vars,key=lambda x:str(x)):
        if a.is_Integer:
            func_args.append(c_int(str(a)))
        elif str(a) == 'f':
            func_args.append(c_var(str(a),c_type(kw['func_type_name'])))
        else:
            func_args.append(c_double(str(a)))

    func_args.extend([c_double(a) for a in extra_args])

    func_type = c_func_type(c_double(func_name), *func_args)
    func_decl = c_func_decl(func_type)

    e_args = [c_double() for a in extra_args]
    inner_func_type = c_func_type(c_double(), c_double(), *e_args)
    func_typedef = c_typedef(kw['func_type_name'], inner_func_type)

    ft = kw.get('func_trans',{})

    # break expression into the sum (and children) and everything else (above the sum)
    (sum, other) = extract_sum(e)
    ep = expr_to_c(index_trans=index_trans, extra_args=extra_args, func_trans=ft)(other)

    init = c_assign(c_double('total'), c_num(0))
    sum = sum_to_c(sum, extra_args=extra_args, index_trans=index_trans)
    body = c_block()
    fd = c_function_def(func_type, body)
    for d in definitions:
        define = c_assign(c_double(str(d.lhs)), expr_to_c()(d.rhs))
        body.add_statement(define)

    body.add_statement(init, sum)
    if other:
        final = c_assign(c_double('final'), ep)
    body.add_statement(final)
    body.add_statement(c_return(c_var('final')))

    return fd, c_block(func_typedef, func_decl)
def convert(e,definitions=[], func_name='func', extra_args=[], index_trans={}):

    # function arguments = free variables + extra args

    free_vars = extract_free_variables(e)
    for d in definitions:
        def_free_vars = extract_free_variables(d.rhs)
        free_vars.update(def_free_vars)
        free_vars.remove(d.lhs)
    func_args = [py_var(str(a)) for a in sorted(free_vars,key=lambda x:str(x))]
    func_args.extend([py_var(a) for a in extra_args])

    epy = expr_to_py(extra_args=extra_args, index_trans=index_trans)
    ep = epy(e)

    fd = py_function_def(func_name,py_arg_list(*func_args))
    for d in definitions:
        define = py_assign_stmt(py_var(str(d.lhs)), expr_to_py()(d.rhs), py_assign_stmt.PY_ASSIGN_EQUAL)
        fd.add_statement(define)
    fd.add_statement(*epy._pre_statements)
    fd.add_statement(py_return_stmt(ep))

    return fd
def convert_simple_func(e, func_name='func', extra_args=[]):
    free_vars = extract_free_variables(e)
    func_args = []
    for a in sorted(free_vars, key=lambda x:str(x)):
        func_args.append(py_var(str(a)))

    func_args.extend([py_var(a) for a in extra_args])

    ep = expr_to_py(extra_args=extra_args)(e)

    fd = py_function_def(func_name, py_arg_list(*func_args))
    fd.add_statement(py_return_stmt(ep))

    return fd
Esempio n. 4
0
def convert_simple_func(e, func_name='func', extra_args=[]):
    free_vars = extract_free_variables(e)
    func_args = []
    for a in sorted(free_vars,key=lambda x:str(x)):
        if a.is_Integer:
            func_args.append(c_int(str(a)))
        else:
            func_args.append(c_double(str(a)))

    func_args.extend([c_double(a) for a in extra_args])

    func_type = c_func_type(c_double(func_name), *func_args)
    func_decl = c_func_decl(func_type)

    e_args = [c_double() for a in extra_args]

    ep = expr_to_c(extra_args=extra_args)(e)

    body = c_block()
    fd = c_function_def(func_type, body)

    body.add_statement(c_return(ep))

    return fd