diff --git a/elab_expr.cc b/elab_expr.cc index 25dcd78e5..9e2bf21fb 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -1790,7 +1790,9 @@ bool PEIdent::calculate_parts_(Design*des, NetScope*scope, two bit select expressions, and both must be constant. Evaluate them and pass the results back to the caller. */ + need_constant_expr = true; NetExpr*lsb_ex = elab_and_eval(des, scope, index_tail.lsb, lsb_wid); + need_constant_expr = false; NetEConst*lsb_c = dynamic_cast(lsb_ex); if (lsb_c == 0) { cerr << index_tail.lsb->get_fileline() << ": error: " @@ -1808,7 +1810,9 @@ bool PEIdent::calculate_parts_(Design*des, NetScope*scope, lsb = lsb_c->value().as_long(); } + need_constant_expr = true; NetExpr*msb_ex = elab_and_eval(des, scope, index_tail.msb, msb_wid); + need_constant_expr = false; NetEConst*msb_c = dynamic_cast(msb_ex); if (msb_c == 0) { cerr << index_tail.msb->get_fileline() << ": error: " @@ -1845,7 +1849,9 @@ bool PEIdent::calculate_up_do_width_(Design*des, NetScope*scope, /* Calculate the width expression (in the lsb_ position) first. If the expression is not constant, error but guess 1 so we can keep going and find more errors. */ + need_constant_expr = true; NetExpr*wid_ex = elab_and_eval(des, scope, index_tail.lsb, -1); + need_constant_expr = false; NetEConst*wid_c = dynamic_cast(wid_ex); if (wid_c == 0) { @@ -2394,7 +2400,9 @@ NetExpr* PEIdent::elaborate_expr_param_(Design*des, /* Get and evaluate the width of the index select. This must be constant. */ + need_constant_expr = true; NetExpr*wid_ex = elab_and_eval(des, scope, index_tail.lsb, -1); + need_constant_expr = false; NetEConst*wid_ec = dynamic_cast (wid_ex); if (wid_ec == 0) { cerr << index_tail.lsb->get_fileline() << ": error: " diff --git a/elab_net.cc b/elab_net.cc index 99f5673ff..1f4ea2c29 100644 --- a/elab_net.cc +++ b/elab_net.cc @@ -220,7 +220,9 @@ bool PEIdent::eval_part_select_(Design*des, NetScope*scope, NetNet*sig, case index_component_t::SEL_IDX_DO: case index_component_t::SEL_IDX_UP: { + need_constant_expr = true; NetExpr*tmp_ex = elab_and_eval(des, scope, index_tail.msb, -1); + need_constant_expr = false; NetEConst*tmp = dynamic_cast(tmp_ex); if (!tmp) { cerr << get_fileline() << ": error: indexed part select of " @@ -437,7 +439,9 @@ NetNet* PEIdent::elaborate_lnet_common_(Design*des, NetScope*scope, } ivl_assert(*this, index_head.sel == index_component_t::SEL_BIT); + need_constant_expr = true; NetExpr*tmp_ex = elab_and_eval(des, scope, index_head.msb, -1); + need_constant_expr = false; NetEConst*tmp = dynamic_cast(tmp_ex); if (!tmp) { cerr << get_fileline() << ": error: array " << sig->name() diff --git a/elab_scope.cc b/elab_scope.cc index 267246e8b..5ee6861de 100644 --- a/elab_scope.cc +++ b/elab_scope.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2008 Stephen Williams (steve@icarus.com) + * Copyright (c) 2000-2009 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -496,7 +496,9 @@ bool PGenerate::generate_scope_loop_(Design*des, NetScope*container) // 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); + need_constant_expr = true; NetExpr*init_ex = elab_and_eval(des, container, loop_init, -1); + need_constant_expr = false; NetEConst*init = dynamic_cast (init_ex); if (init == 0) { cerr << get_fileline() << ": error: Cannot evaluate genvar" @@ -526,7 +528,9 @@ bool PGenerate::generate_scope_loop_(Design*des, NetScope*container) container->genvar_tmp = loop_index; container->genvar_tmp_val = genvar; probe_expr_width(des, container, loop_test); + need_constant_expr = true; NetExpr*test_ex = elab_and_eval(des, container, loop_test, -1); + need_constant_expr = false; NetEConst*test = dynamic_cast(test_ex); if (test == 0) { cerr << get_fileline() << ": error: Cannot evaluate genvar" @@ -579,7 +583,9 @@ bool PGenerate::generate_scope_loop_(Design*des, NetScope*container) // Calculate the step for the loop variable. probe_expr_width(des, container, loop_step); + need_constant_expr = true; NetExpr*step_ex = elab_and_eval(des, container, loop_step, -1); + need_constant_expr = false; NetEConst*step = dynamic_cast(step_ex); if (step == 0) { cerr << get_fileline() << ": error: Cannot evaluate genvar" @@ -611,7 +617,9 @@ 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); + need_constant_expr = true; NetExpr*test_ex = elab_and_eval(des, container, loop_test, -1); + need_constant_expr = false; NetEConst*test = dynamic_cast (test_ex); if (test == 0) { cerr << get_fileline() << ": error: Cannot evaluate genvar" @@ -671,7 +679,9 @@ 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); + need_constant_expr = true; NetExpr*case_value_ex = elab_and_eval(des, container, loop_test, -1); + need_constant_expr = false; NetEConst*case_value_co = dynamic_cast(case_value_ex); if (case_value_co == 0) { cerr << get_fileline() << ": error: Cannot evaluate genvar case" @@ -702,9 +712,17 @@ 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]); + need_constant_expr = true; NetExpr*item_value_ex = elab_and_eval(des, container, item->item_test[idx], -1); + need_constant_expr = false; NetEConst*item_value_co = dynamic_cast(item_value_ex); - assert(item_value_co); + if (item_value_co == 0) { + cerr << get_fileline() << ": error: Cannot evaluate " + << " genvar case item expression: " + << *item->item_test[idx] << endl; + des->errors += 1; + return false; + } if (debug_scopes) cerr << get_fileline() << ": debug: Generate case " @@ -952,8 +970,10 @@ void PGModule::elaborate_scope_mod_instances_(Design*des, Module*mod, NetScope*s { if (msb_) probe_expr_width(des, sc, msb_); if (lsb_) probe_expr_width(des, sc, lsb_); + need_constant_expr = true; NetExpr*mse = msb_ ? elab_and_eval(des, sc, msb_, -1) : 0; NetExpr*lse = lsb_ ? elab_and_eval(des, sc, lsb_, -1) : 0; + need_constant_expr = false; NetEConst*msb = dynamic_cast (mse); NetEConst*lsb = dynamic_cast (lse); diff --git a/elaborate.cc b/elaborate.cc index 7375d4fd3..8eec12756 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -234,8 +234,10 @@ unsigned PGBuiltin::calculate_array_count_(Design*des, NetScope*scope, gates, then I am expected to make more than one gate. Figure out how many are desired. */ if (msb_) { + need_constant_expr = true; NetExpr*msb_exp = elab_and_eval(des, scope, msb_, -1); NetExpr*lsb_exp = elab_and_eval(des, scope, lsb_, -1); + need_constant_expr = false; NetEConst*msb_con = dynamic_cast(msb_exp); NetEConst*lsb_con = dynamic_cast(lsb_exp);