diff --git a/elab_scope.cc b/elab_scope.cc index fd1228d44..b77292dea 100644 --- a/elab_scope.cc +++ b/elab_scope.cc @@ -53,7 +53,7 @@ void Module::elaborate_parm_item_(perm_string name, const param_expr_t&cur, assert(ex); NetExpr*val = ex->elaborate_pexpr(des, scope); - if (val == 0) return; + NetExpr*msb = 0; NetExpr*lsb = 0; bool signed_flag = cur.signed_flag; @@ -71,19 +71,6 @@ void Module::elaborate_parm_item_(perm_string name, const param_expr_t&cur, assert(lsb); } - if (signed_flag) { - /* If explicitly signed, then say so. */ - val->cast_signed(true); - } else if (cur.msb) { - /* If there is a range, then the signedness comes - from the type and not the expression. */ - val->cast_signed(signed_flag); - } else { - /* otherwise, let the expression describe - itself. */ - signed_flag = val->has_sign(); - } - NetScope::range_t*range_list = 0; for (Module::range_t*range = cur.range ; range ; range = range->next) { NetScope::range_t*tmp = new NetScope::range_t; @@ -118,8 +105,29 @@ void Module::elaborate_parm_item_(perm_string name, const param_expr_t&cur, range_list = tmp; } - val = scope->set_parameter(name, val, cur.type, msb, lsb, signed_flag, range_list, cur); - assert(val); + /* Set the parameter expression to 0 if the evaluation failed. */ + if (val == 0) { + val = scope->set_parameter(name, val, cur.type, msb, lsb, + signed_flag, range_list, cur); + delete val; + return; + } + + if (signed_flag) { + /* If explicitly signed, then say so. */ + val->cast_signed(true); + } else if (cur.msb) { + /* If there is a range, then the signedness comes + from the type and not the expression. */ + val->cast_signed(signed_flag); + } else { + /* otherwise, let the expression describe + itself. */ + signed_flag = val->has_sign(); + } + + val = scope->set_parameter(name, val, cur.type, msb, lsb, signed_flag, + range_list, cur); delete val; } diff --git a/net_design.cc b/net_design.cc index 595c1a44a..9a290cb8e 100644 --- a/net_design.cc +++ b/net_design.cc @@ -357,11 +357,11 @@ void NetScope::evaluate_parameter_logic_(Design*des, param_ref_t cur) /* Evaluate the parameter expression, if necessary. */ NetExpr*expr = (*cur).second.expr; - assert(expr); + if (expr == NULL) return; // This is an invalid parameter so return. eval_expr(expr); - /* The eval_expr may delete any replace the expr pointer, so the + /* The eval_expr may delete and replace the expr pointer, so the second.expr value cannot be relied on. Might as well replace it now with the expression that we evaluated. */ (*cur).second.expr = expr;