diff --git a/design_dump.cc b/design_dump.cc index 67e4eeacb..0669991bc 100644 --- a/design_dump.cc +++ b/design_dump.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: design_dump.cc,v 1.158 2005/05/07 03:13:30 steve Exp $" +#ident "$Id: design_dump.cc,v 1.159 2005/05/17 20:56:55 steve Exp $" #endif # include "config.h" @@ -999,7 +999,7 @@ void NetEConstParam::dump(ostream&o) const { o << "<" << name_ << "="; NetEConst::dump(o); - o << ">"; + o << ", wid=" << expr_width() << ">"; } void NetECReal::dump(ostream&o) const @@ -1143,6 +1143,9 @@ void Design::dump(ostream&o) const /* * $Log: design_dump.cc,v $ + * Revision 1.159 2005/05/17 20:56:55 steve + * Parameters cannot have their width changed. + * * Revision 1.158 2005/05/07 03:13:30 steve * Include delay expressions for assignments in dump. * diff --git a/elaborate.cc b/elaborate.cc index 0d06291c6..bb9758687 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: elaborate.cc,v 1.322 2005/05/13 05:12:39 steve Exp $" +#ident "$Id: elaborate.cc,v 1.323 2005/05/17 20:56:55 steve Exp $" #endif # include "config.h" @@ -1861,9 +1861,10 @@ NetProc* PCallTask::elaborate_usr(Design*des, NetScope*scope) const continue; NetESignal*sig = new NetESignal(port); + NetExpr*rv = pad_to_width(sig, count_lval_width(lv)); /* Generate the assignment statement. */ - NetAssign*ass = new NetAssign(lv, sig); + NetAssign*ass = new NetAssign(lv, rv); block->append(ass); } @@ -2478,8 +2479,15 @@ NetProc* PForStatement::elaborate(Design*des, NetScope*scope) const /* Make the r-value of the initial assignment, and size it properly. Then use it to build the assignment statement. */ - etmp = expr1_->elaborate_expr(des, scope); + etmp = elab_and_eval(des, scope, expr1_); etmp->set_width(lv->lwidth()); + etmp = pad_to_width(etmp, lv->lwidth()); + + if (debug_elaborate) { + cerr << get_line() << ": debug: FOR initial assign: " + << sig->name() << " = " << *etmp << endl; + assert(etmp->expr_width() >= lv->lwidth()); + } NetAssign*init = new NetAssign(lv, etmp); init->set_line(*this); @@ -2957,6 +2965,9 @@ Design* elaborate(listroots) /* * $Log: elaborate.cc,v $ + * Revision 1.323 2005/05/17 20:56:55 steve + * Parameters cannot have their width changed. + * * Revision 1.322 2005/05/13 05:12:39 steve * Some debug messages. * diff --git a/netlist.h b/netlist.h index 5f346c3e1..c0a07ff10 100644 --- a/netlist.h +++ b/netlist.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: netlist.h,v 1.342 2005/05/08 23:44:08 steve Exp $" +#ident "$Id: netlist.h,v 1.343 2005/05/17 20:56:55 steve Exp $" #endif /* @@ -1123,6 +1123,7 @@ class NetEConstParam : public NetEConst { perm_string name() const; const NetScope*scope() const; + virtual bool set_width(unsigned w); virtual void expr_scan(struct expr_scan_t*) const; virtual void dump(ostream&) const; @@ -3443,6 +3444,9 @@ extern ostream& operator << (ostream&, NetNet::Type); /* * $Log: netlist.h,v $ + * Revision 1.343 2005/05/17 20:56:55 steve + * Parameters cannot have their width changed. + * * Revision 1.342 2005/05/08 23:44:08 steve * Add support for variable part select. * diff --git a/set_width.cc b/set_width.cc index 056877e94..db8915e96 100644 --- a/set_width.cc +++ b/set_width.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: set_width.cc,v 1.35 2005/01/24 05:28:31 steve Exp $" +#ident "$Id: set_width.cc,v 1.36 2005/05/17 20:56:55 steve Exp $" #endif # include "config.h" @@ -312,6 +312,15 @@ bool NetEConst::set_width(unsigned w) } } +/* + * Parameter vectors cannot be resized because they refer to a common + * value. + */ +bool NetEConstParam::set_width(unsigned w) +{ + return w == expr_width(); +} + /* * Real constants can have whatever width the environment wants, * because it isn't really a vector. The environment will convert this @@ -405,6 +414,9 @@ bool NetEUReduce::set_width(unsigned w) /* * $Log: set_width.cc,v $ + * Revision 1.36 2005/05/17 20:56:55 steve + * Parameters cannot have their width changed. + * * Revision 1.35 2005/01/24 05:28:31 steve * Remove the NetEBitSel and combine all bit/part select * behavior into the NetESelect node and IVL_EX_SELECT