Evaluate non-immediate signal selection.

This patch adds code to treat non-immediate signal selection the
same as the default logic evaluation
This commit is contained in:
Cary R 2008-01-14 15:57:01 -08:00 committed by Stephen Williams
parent 7ff342f4da
commit e46f8220f3
1 changed files with 14 additions and 6 deletions

View File

@ -128,12 +128,12 @@ static void eval_logic_into_integer(ivl_expr_t expr, unsigned ix)
assert(0); assert(0);
} }
fprintf(vvp_out, " %%ix/load %u, %u;\n", ix, value); fprintf(vvp_out, " %%ix/load %u, %u;\n", ix, value);
break; break;
} }
case IVL_EX_ULONG: 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; break;
case IVL_EX_SIGNAL: { case IVL_EX_SIGNAL: {
@ -141,17 +141,25 @@ static void eval_logic_into_integer(ivl_expr_t expr, unsigned ix)
unsigned word = 0; unsigned word = 0;
if (ivl_signal_array_count(sig) > 1) { if (ivl_signal_array_count(sig) > 1) {
ivl_expr_t ixe = ivl_expr_oper1(expr); ivl_expr_t ixe = ivl_expr_oper1(expr);
assert(number_is_immediate(ixe, 8*sizeof(unsigned long))); if (number_is_immediate(ixe, 8*sizeof(unsigned long)))
word = get_number_immediate(ixe); 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; break;
} }
default: { default: {
struct vector_info rv; struct vector_info rv;
rv = draw_eval_expr(expr, 0); 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); ix, rv.base, rv.wid);
clr_vector(rv); clr_vector(rv);
break; break;