From 09fa57742a72f18fc11335fe292420f19a786c34 Mon Sep 17 00:00:00 2001 From: Cary R Date: Thu, 17 Sep 2009 19:06:40 -0700 Subject: [PATCH] Optimize a full L-value indexed part select, etc. This patch adds an optimization when a constant indexed part select covers the entire L-value. It also fixes a few issues in the code generator related to part selects. --- elab_lval.cc | 6 ++++-- tgt-vvp/vvp_process.c | 8 ++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/elab_lval.cc b/elab_lval.cc index 95808a208..f3ca7d083 100644 --- a/elab_lval.cc +++ b/elab_lval.cc @@ -491,9 +491,11 @@ bool PEIdent::elaborate_lval_net_idx_(Design*des, offset = -wid + 1; } delete base; - base = new NetEConst(verinum(reg->sb_to_idx(lsv) + offset)); + long rel_base = reg->sb_to_idx(lsv) + offset; + /* If we cover the entire lvalue just skip the select. */ + if (rel_base == 0 && wid == reg->vector_width()) return true; + base = new NetEConst(verinum(rel_base)); if (warn_ob_select) { - long rel_base = reg->sb_to_idx(lsv) + offset; if (rel_base < 0) { cerr << get_fileline() << ": warning: " << reg->name(); if (reg->array_dimensions() > 0) cerr << "[]"; diff --git a/tgt-vvp/vvp_process.c b/tgt-vvp/vvp_process.c index 37d87ec69..ed00cf696 100644 --- a/tgt-vvp/vvp_process.c +++ b/tgt-vvp/vvp_process.c @@ -1189,7 +1189,6 @@ static void force_vector_to_lval(ivl_statement_t net, struct vector_info rvec) } else { /* Do not support bit or part selects of l-values yet. */ assert(ivl_lval_mux(lval) == 0); - assert(ivl_lval_part_off(lval) == 0); assert(ivl_lval_width(lval) == ivl_signal_width(lsig)); assert((roff + use_wid) <= rvec.wid); @@ -1238,8 +1237,13 @@ static void force_link_rval(ivl_statement_t net, ivl_expr_t rval) /* We do not currently support driving a signal to a bit or * part select (this could give us multiple drivers). */ part_off_ex = ivl_lval_part_off(lval); + /* This should be verified in force_vector_to_lval() which is called + * before this procedure. */ + if (part_off_ex) { + assert(number_is_immediate(part_off_ex, IMM_WID, 0)); + assert(! number_is_unknown(part_off_ex)); + } if (ivl_signal_width(lsig) > ivl_signal_width(rsig) || - // Do we need checks for number_is{immediate,unknown} of part_of_ex? (part_off_ex && get_number_immediate(part_off_ex) != 0)) { fprintf(stderr, "%s:%u: vvp-tgt sorry: cannot %s signal to " "a bit/part select.\n", ivl_expr_file(rval),