mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-08-22 05:47:31 +02:00
Pass a NULL expression when parameter expression elaboration fails
When elaborating a parameter expression fails we need to set the expression to 0 since it has already been partially allocated. Doing this allows us to not evaluate the dummy expression later.
This commit is contained in:
+24
-16
@@ -53,7 +53,7 @@ void Module::elaborate_parm_item_(perm_string name, const param_expr_t&cur,
|
|||||||
assert(ex);
|
assert(ex);
|
||||||
|
|
||||||
NetExpr*val = ex->elaborate_pexpr(des, scope);
|
NetExpr*val = ex->elaborate_pexpr(des, scope);
|
||||||
if (val == 0) return;
|
|
||||||
NetExpr*msb = 0;
|
NetExpr*msb = 0;
|
||||||
NetExpr*lsb = 0;
|
NetExpr*lsb = 0;
|
||||||
bool signed_flag = cur.signed_flag;
|
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);
|
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;
|
NetScope::range_t*range_list = 0;
|
||||||
for (Module::range_t*range = cur.range ; range ; range = range->next) {
|
for (Module::range_t*range = cur.range ; range ; range = range->next) {
|
||||||
NetScope::range_t*tmp = new NetScope::range_t;
|
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;
|
range_list = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = scope->set_parameter(name, val, cur.type, msb, lsb, signed_flag, range_list, cur);
|
/* Set the parameter expression to 0 if the evaluation failed. */
|
||||||
assert(val);
|
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;
|
delete val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -357,11 +357,11 @@ void NetScope::evaluate_parameter_logic_(Design*des, param_ref_t cur)
|
|||||||
|
|
||||||
/* Evaluate the parameter expression, if necessary. */
|
/* Evaluate the parameter expression, if necessary. */
|
||||||
NetExpr*expr = (*cur).second.expr;
|
NetExpr*expr = (*cur).second.expr;
|
||||||
assert(expr);
|
if (expr == NULL) return; // This is an invalid parameter so return.
|
||||||
|
|
||||||
eval_expr(expr);
|
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
|
second.expr value cannot be relied on. Might as well replace
|
||||||
it now with the expression that we evaluated. */
|
it now with the expression that we evaluated. */
|
||||||
(*cur).second.expr = expr;
|
(*cur).second.expr = expr;
|
||||||
|
|||||||
Reference in New Issue
Block a user