tgt-vlog95: Consider scopes with only localparams as unique

For modules with parameters the vlog95 backend generates one module
declaration for each module instance. This is done so that different values
for the module parameters can be supported.

Local parameters are guaranteed to have the same value for all module
instances though. Add support for detecting the case that all module
parameters are local parameters and in that case only create one shared
module declaration. This is similar to what the vhdl backend does.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
Lars-Peter Clausen 2022-04-12 13:35:38 +02:00
parent a2aa659717
commit 6ea7763c31
1 changed files with 19 additions and 5 deletions

View File

@ -253,13 +253,27 @@ static void emit_net_def(ivl_scope_t scope, ivl_signal_t sig)
}
}
static bool scope_is_unique(ivl_scope_t scope)
{
unsigned int count = ivl_scope_params(scope);
for (unsigned int idx = 0; idx < count; idx++) {
ivl_parameter_t par = ivl_scope_param(scope, idx);
if (!ivl_parameter_local(par)) {
return false;
}
}
return true;
}
static void emit_mangled_name(ivl_scope_t scope, unsigned root)
{
/* If the module has parameters and it's not a root module then it
* may not be unique so we create a mangled name version instead.
* The mangled name is of the form:
/* If the module has non-local parameters and it's not a root module then it
* may not be unique so we create a mangled name version instead. The
* mangled name is of the form:
* <module_name>[<full_instance_scope>]. */
if (ivl_scope_params(scope) && ! root) {
if (!root && !scope_is_unique(scope)) {
char *name;
size_t len = strlen(ivl_scope_name(scope)) +
strlen(ivl_scope_tname(scope)) + 3;
@ -1244,7 +1258,7 @@ int emit_scope(ivl_scope_t scope, ivl_scope_t parent)
(void) emit_scope(scope_to_emit, 0);
/* If we used a mangled name then the instance is
* unique so don't add it to the list. */
if (ivl_scope_params(scope_to_emit)) continue;
if (!scope_is_unique(scope_to_emit)) continue;
add_scope_to_list(scope_to_emit);
}
free(scopes_to_emit);