From 69726a56b04aa2a42b5e0f91a73f53c00dd8d866 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Fri, 28 Nov 2008 11:24:42 -0800 Subject: [PATCH] More self-determined expressions need width probed. Find and fix some more expressions that are self-determined, that nevertheless need their widths probled. --- elab_scope.cc | 9 +++++++++ elaborate.cc | 2 ++ 2 files changed, 11 insertions(+) diff --git a/elab_scope.cc b/elab_scope.cc index 7b118aca7..267246e8b 100644 --- a/elab_scope.cc +++ b/elab_scope.cc @@ -495,6 +495,7 @@ bool PGenerate::generate_scope_loop_(Design*des, NetScope*container) // The initial value for the genvar does not need (nor can it // use) the genvar itself, so we can evaluate this expression // the same way any other parameter value is evaluated. + probe_expr_width(des, container, loop_init); NetExpr*init_ex = elab_and_eval(des, container, loop_init, -1); NetEConst*init = dynamic_cast (init_ex); if (init == 0) { @@ -524,6 +525,7 @@ bool PGenerate::generate_scope_loop_(Design*des, NetScope*container) cerr << get_fileline() << ": debug: genvar init = " << genvar << endl; container->genvar_tmp = loop_index; container->genvar_tmp_val = genvar; + probe_expr_width(des, container, loop_test); NetExpr*test_ex = elab_and_eval(des, container, loop_test, -1); NetEConst*test = dynamic_cast(test_ex); if (test == 0) { @@ -576,6 +578,7 @@ bool PGenerate::generate_scope_loop_(Design*des, NetScope*container) elaborate_subscope_(des, scope); // Calculate the step for the loop variable. + probe_expr_width(des, container, loop_step); NetExpr*step_ex = elab_and_eval(des, container, loop_step, -1); NetEConst*step = dynamic_cast(step_ex); if (step == 0) { @@ -592,6 +595,7 @@ bool PGenerate::generate_scope_loop_(Design*des, NetScope*container) container->genvar_tmp_val = genvar; delete step; delete test_ex; + probe_expr_width(des, container, loop_test); test_ex = elab_and_eval(des, container, loop_test, -1); test = dynamic_cast(test_ex); assert(test); @@ -606,6 +610,7 @@ bool PGenerate::generate_scope_loop_(Design*des, NetScope*container) bool PGenerate::generate_scope_condit_(Design*des, NetScope*container, bool else_flag) { + probe_expr_width(des, container, loop_test); NetExpr*test_ex = elab_and_eval(des, container, loop_test, -1); NetEConst*test = dynamic_cast (test_ex); if (test == 0) { @@ -665,6 +670,7 @@ bool PGenerate::generate_scope_condit_(Design*des, NetScope*container, bool else bool PGenerate::generate_scope_case_(Design*des, NetScope*container) { + probe_expr_width(des, container, loop_test); NetExpr*case_value_ex = elab_and_eval(des, container, loop_test, -1); NetEConst*case_value_co = dynamic_cast(case_value_ex); if (case_value_co == 0) { @@ -695,6 +701,7 @@ bool PGenerate::generate_scope_case_(Design*des, NetScope*container) bool match_flag = false; for (unsigned idx = 0 ; idx < item->item_test.size() && !match_flag ; idx +=1 ) { + probe_expr_width(des, container, item->item_test[idx]); NetExpr*item_value_ex = elab_and_eval(des, container, item->item_test[idx], -1); NetEConst*item_value_co = dynamic_cast(item_value_ex); assert(item_value_co); @@ -943,6 +950,8 @@ void PGModule::elaborate_scope_mod_(Design*des, Module*mod, NetScope*sc) const */ void PGModule::elaborate_scope_mod_instances_(Design*des, Module*mod, NetScope*sc) const { + if (msb_) probe_expr_width(des, sc, msb_); + if (lsb_) probe_expr_width(des, sc, lsb_); NetExpr*mse = msb_ ? elab_and_eval(des, sc, msb_, -1) : 0; NetExpr*lse = lsb_ ? elab_and_eval(des, sc, lsb_, -1) : 0; NetEConst*msb = dynamic_cast (mse); diff --git a/elaborate.cc b/elaborate.cc index 5a604ca7c..010a43e05 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -2958,6 +2958,7 @@ NetProc* PEventStatement::elaborate_st(Design*des, NetScope*scope, bool save_flag = error_implicit; error_implicit = true; + probe_expr_width(des, scope, expr_[idx]->expr()); NetExpr*tmp = elab_and_eval(des, scope, expr_[idx]->expr(), 0); if (tmp == 0) { expr_[idx]->dump(cerr); @@ -3386,6 +3387,7 @@ NetProc* PForStatement::elaborate(Design*des, NetScope*scope) const /* Elaborate the condition expression. Try to evaluate it too, in case it is a constant. This is an interesting case worthy of a warning. */ + probe_expr_width(des, scope, cond_); NetExpr*ce = elab_and_eval(des, scope, cond_, -1); if (ce == 0) { delete top;