From e46f8220f3775c119b61d71154694bebfc71147d Mon Sep 17 00:00:00 2001 From: Cary R Date: Mon, 14 Jan 2008 15:57:01 -0800 Subject: [PATCH] Evaluate non-immediate signal selection. This patch adds code to treat non-immediate signal selection the same as the default logic evaluation --- tgt-vvp/eval_expr.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tgt-vvp/eval_expr.c b/tgt-vvp/eval_expr.c index 1de168fc2..7d9c73ff5 100644 --- a/tgt-vvp/eval_expr.c +++ b/tgt-vvp/eval_expr.c @@ -128,12 +128,12 @@ static void eval_logic_into_integer(ivl_expr_t expr, unsigned ix) assert(0); } - fprintf(vvp_out, " %%ix/load %u, %u;\n", ix, value); + fprintf(vvp_out, " %%ix/load %u, %u;\n", ix, value); break; } case IVL_EX_ULONG: - fprintf(vvp_out, " %%ix/load %u, %lu;\n", ix, ivl_expr_uvalue(expr)); + fprintf(vvp_out, " %%ix/load %u, %lu;\n", ix, ivl_expr_uvalue(expr)); break; case IVL_EX_SIGNAL: { @@ -141,17 +141,25 @@ static void eval_logic_into_integer(ivl_expr_t expr, unsigned ix) unsigned word = 0; if (ivl_signal_array_count(sig) > 1) { ivl_expr_t ixe = ivl_expr_oper1(expr); - assert(number_is_immediate(ixe, 8*sizeof(unsigned long))); - word = get_number_immediate(ixe); + if (number_is_immediate(ixe, 8*sizeof(unsigned long))) + word = get_number_immediate(ixe); + else { + struct vector_info rv; + rv = draw_eval_expr(expr, 0); + fprintf(vvp_out, " %%ix/get %u, %u, %u;\n", + ix, rv.base, rv.wid); + clr_vector(rv); + break; + } } - fprintf(vvp_out, " %%ix/getv %u, v%p_%u;\n", ix, sig, word); + fprintf(vvp_out, " %%ix/getv %u, v%p_%u;\n", ix, sig, word); break; } default: { struct vector_info rv; rv = draw_eval_expr(expr, 0); - fprintf(vvp_out, " %%ix/get %u, %u, %u;\n", + fprintf(vvp_out, " %%ix/get %u, %u, %u;\n", ix, rv.base, rv.wid); clr_vector(rv); break;