diff --git a/ivl.def b/ivl.def index f45d6f846..c3771a2ab 100644 --- a/ivl.def +++ b/ivl.def @@ -174,6 +174,7 @@ ivl_parameter_lsb ivl_parameter_msb ivl_parameter_scope ivl_parameter_signed +ivl_parameter_width ivl_path_condit ivl_path_delay diff --git a/ivl_target.h b/ivl_target.h index c46721697..ba9ad1e63 100644 --- a/ivl_target.h +++ b/ivl_target.h @@ -1612,6 +1612,9 @@ extern ivl_signal_t ivl_nexus_ptr_sig(ivl_nexus_ptr_t net); * a range the value is zero based and the width of the expression is * used to determine the MSB. * + * ivl_parameter_width + * return |MSB - LSB| + 1 + * * ivl_parameter_signed * Returns if the parameter was declared to be signed. * @@ -1628,6 +1631,7 @@ extern ivl_scope_t ivl_parameter_scope(ivl_parameter_t net); extern ivl_expr_t ivl_parameter_expr(ivl_parameter_t net); extern int ivl_parameter_msb(ivl_parameter_t net); extern int ivl_parameter_lsb(ivl_parameter_t net); +extern unsigned ivl_parameter_width(ivl_parameter_t net); extern int ivl_parameter_signed(ivl_parameter_t net); extern int ivl_parameter_local(ivl_parameter_t net); extern const char* ivl_parameter_file(ivl_parameter_t net); diff --git a/t-dll-api.cc b/t-dll-api.cc index 15fc0c247..de411b481 100644 --- a/t-dll-api.cc +++ b/t-dll-api.cc @@ -1764,6 +1764,19 @@ extern "C" int ivl_parameter_lsb(ivl_parameter_t net) return net->lsb; } +/* + * No need to waste space with storing the width of the parameter since + * it can easily be computed when needed. + */ +extern "C" unsigned ivl_parameter_width(ivl_parameter_t net) +{ + unsigned result = 1; + assert(net); + if (net->msb >= net->lsb) result += net->msb - net->lsb; + else result += net->lsb - net->msb; + return result; +} + extern "C" ivl_expr_t ivl_parameter_expr(ivl_parameter_t net) { assert(net); diff --git a/tgt-vlog95/scope.c b/tgt-vlog95/scope.c index dd85a47eb..4a73c4151 100644 --- a/tgt-vlog95/scope.c +++ b/tgt-vlog95/scope.c @@ -314,7 +314,7 @@ void emit_scope_variables(ivl_scope_t scope) fprintf(vlog_out, " = "); /* Need to emit the parameters value not its name. */ emitting_param = par; - emit_expr(scope, pex, ivl_expr_width(pex), 1, 0, 0); + emit_expr(scope, pex, ivl_parameter_width(par), 1, 0, 0); emitting_param = 0; fprintf(vlog_out, ";"); if (emit_file_line) {