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.
This commit is contained in:
Cary R 2008-04-07 11:16:15 -07:00 committed by Stephen Williams
parent 7035ded57a
commit f5418fe337
1 changed files with 18 additions and 2 deletions

View File

@ -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;