From f5418fe33734bfc35c53ba0b1f882a494c2a4f92 Mon Sep 17 00:00:00 2001 From: Cary R Date: Mon, 7 Apr 2008 11:16:15 -0700 Subject: [PATCH] Catch unsupported bit/part select lvalue for assign/deassign. This patch adds code to print a message when an assign/deassign is used to drive/release a bit/part select. --- tgt-vvp/vvp_process.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tgt-vvp/vvp_process.c b/tgt-vvp/vvp_process.c index 1ec7785a0..fd1c9829c 100644 --- a/tgt-vvp/vvp_process.c +++ b/tgt-vvp/vvp_process.c @@ -819,6 +819,12 @@ static void force_vector_to_lval(ivl_statement_t net, struct vector_info rvec) if (part_off != 0 || use_wid != ivl_signal_width(lsig)) { + if (ivl_statement_type(net) == IVL_ST_CASSIGN) { + fprintf(stderr, "%s:%u: vvp-tgt sorry: cannot assign " + "signal to a bit/part select.\n", + ivl_stmt_file(net), ivl_stmt_lineno(net)); + exit(1); + } command_name = command_name_x0; fprintf(vvp_out, " %%ix/load 0, %u;\n", part_off); @@ -937,7 +943,17 @@ static int show_stmt_deassign(ivl_statement_t net) assert(lsig != 0); assert(ivl_lval_mux(lval) == 0); - assert(ivl_lval_part_off(lval) == 0); + + /* We do not currently support deassigning a bit or + * part select. */ + ivl_expr_t part_off_ex = ivl_lval_part_off(lval); + if (ivl_signal_width(lsig) > ivl_lval_width(lval) || + (part_off_ex && get_number_immediate(part_off_ex) != 0)) { + fprintf(stderr, "%s:%u: vvp-tgt sorry: cannot deassign " + "a bit/part select.\n", ivl_stmt_file(net), + ivl_stmt_lineno(net)); + exit(1); + } if (word_idx != 0) { assert(number_is_immediate(word_idx, 8*sizeof(use_word))); @@ -945,7 +961,7 @@ static int show_stmt_deassign(ivl_statement_t net) } - fprintf(vvp_out, " %%deassign v%p_%lu;\n", lsig, use_word); + fprintf(vvp_out, " %%deassign v%p_%lu;\n", lsig, use_word); } return 0;