From 756c9ceccfff70e5a2c5066c18f8d222dd25252f Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Wed, 21 Jan 2015 16:31:14 +0100 Subject: [PATCH] ivl: Functions returning a dynamic array may be casted to vector. --- tgt-vvp/stmt_assign.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tgt-vvp/stmt_assign.c b/tgt-vvp/stmt_assign.c index 9e59481a4..e2456ae25 100644 --- a/tgt-vvp/stmt_assign.c +++ b/tgt-vvp/stmt_assign.c @@ -455,9 +455,22 @@ static int show_stmt_assign_vector(ivl_statement_t net) } else if (ivl_expr_value(rval) == IVL_VT_DARRAY) { /* Special case: dynamic array to vector casting */ ivl_lval_t lval = ivl_stmt_lval(net, 0); + void*rval_addr = NULL; + + /* Even more special case: function call returning dynamic array */ + if(ivl_expr_type(rval) == IVL_EX_UFUNC) { + rval_addr = ivl_scope_port(ivl_expr_def(rval), 0); + draw_ufunc_object(rval); + /* We do not need to store the result, it is going to be + converted to vector quite soon. */ + fprintf(vvp_out, " %%pop/obj 1, 0; drop the result\n"); + } else { + rval_addr = ivl_expr_signal(rval); + } + fprintf(vvp_out, " %%vpi_call %u %u \"$ivl_darray_method$to_vec\", v%p_0, v%p_0 {0 0 0};\n", ivl_file_table_index(ivl_stmt_file(net)), ivl_stmt_lineno(net), - ivl_expr_signal(rval), ivl_lval_sig(lval)); + rval_addr, ivl_lval_sig(lval)); if (slices) free(slices); return 0;