From 92cb1d4e2d9d056158eb1365a5125a7a30c353e3 Mon Sep 17 00:00:00 2001 From: steve Date: Tue, 19 Sep 2006 23:00:15 +0000 Subject: [PATCH] Use elab_and_eval for bit select expressions. --- elab_expr.cc | 14 +++++++++----- eval_tree.cc | 12 +++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/elab_expr.cc b/elab_expr.cc index f9b95a4e2..6759f7a4e 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: elab_expr.cc,v 1.108 2006/08/09 05:19:08 steve Exp $" +#ident "$Id: elab_expr.cc,v 1.109 2006/09/19 23:00:15 steve Exp $" #endif # include "config.h" @@ -1105,11 +1105,13 @@ NetExpr* PEIdent::elaborate_expr_net_bit_(Design*des, NetScope*scope, assert(lsb_ == 0); assert(idx_.size() == 1); + NetExpr*ex = elab_and_eval(des, scope, idx_[0], -1); + // If the bit select is constant, then treat it similar // to the part select, so that I save the effort of // making a mux part in the netlist. - if (verinum*msn = idx_[0]->eval_const(des, scope)) { - long msv = msn->as_long(); + if (NetEConst*msc = dynamic_cast (ex)) { + long msv = msc->value().as_long(); unsigned idx = net->sb_to_idx(msv); if (idx >= net->vector_width()) { @@ -1126,7 +1128,7 @@ NetExpr* PEIdent::elaborate_expr_net_bit_(Design*des, NetScope*scope, << ":" << net->lsb() << "]." << endl; cerr << get_line() << ": : Replacing " << "expression with a constant 1'bx." << endl; - delete msn; + delete ex; return tmp; } @@ -1155,7 +1157,6 @@ NetExpr* PEIdent::elaborate_expr_net_bit_(Design*des, NetScope*scope, // complicated task because we need to generate // expressions to convert calculated bit select // values to canonical values that are used internally. - NetExpr*ex = idx_[0]->elaborate_expr(des, scope, -1, false); if (net->msb() < net->lsb()) { ex = make_sub_expr(net->lsb(), ex); @@ -1398,6 +1399,9 @@ NetExpr* PEUnary::elaborate_expr(Design*des, NetScope*scope, /* * $Log: elab_expr.cc,v $ + * Revision 1.109 2006/09/19 23:00:15 steve + * Use elab_and_eval for bit select expressions. + * * Revision 1.108 2006/08/09 05:19:08 steve * Add support for real valued modulus. * diff --git a/eval_tree.cc b/eval_tree.cc index 29298376a..6dc77d900 100644 --- a/eval_tree.cc +++ b/eval_tree.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: eval_tree.cc,v 1.69 2006/07/31 03:50:17 steve Exp $" +#ident "$Id: eval_tree.cc,v 1.70 2006/09/19 23:00:15 steve Exp $" #endif # include "config.h" @@ -1038,6 +1038,13 @@ NetEConst* NetEBShift::eval_tree() unsigned shift = rv.as_ulong(); + if (debug_eval_tree) { + cerr << get_line() << ": debug: " + << "Evaluate " << lv << "<<" << op() << ">> " + << rv << ", wid=" << wid << ", shift=" << shift + << ", lv.las_len()=" << lv.has_len() << endl; + } + if ((wid == 0) || ! lv.has_len()) { /* If the caller doesn't care what the width is, then calcuate a width from the trimmed left @@ -1663,6 +1670,9 @@ NetEConst* NetEUReduce::eval_tree() /* * $Log: eval_tree.cc,v $ + * Revision 1.70 2006/09/19 23:00:15 steve + * Use elab_and_eval for bit select expressions. + * * Revision 1.69 2006/07/31 03:50:17 steve * Add support for power in constant expressions. *