Fix expansion of unbased unsized literal in port assignment (issue #756)

(cherry picked from commit 310e239637)
This commit is contained in:
Martin Whitaker 2022-08-27 16:16:49 +01:00
parent af2b952769
commit 689a1c27a8
1 changed files with 12 additions and 6 deletions

View File

@ -1472,17 +1472,23 @@ void PGModule::elaborate_mod_(Design*des, Module*rmod, NetScope*scope) const
continue; continue;
} }
/* Input to module. elaborate the expression to /* Input to module. Here we elaborate the source expression
the desired width. If this in an instance using its self-determined width. This allows us to check
array, then let the net determine its own for and warn about port width mismatches. But in the
width. We use that, then, to decide how to hook special case that the source expression is a SV unbased
it up. unsized literal, we need to force the expression width
to match the destination.
NOTE that this also handles the case that the NOTE that this also handles the case that the
port is actually empty on the inside. We assume port is actually empty on the inside. We assume
in that case that the port is input. */ in that case that the port is input. */
NetExpr*tmp_expr = elab_and_eval(des, scope, pins[idx], -1); int context_width = -1;
if (PENumber*literal = dynamic_cast<PENumber*>(pins[idx])) {
if (literal->value().is_single())
context_width = prts_vector_width;
}
NetExpr*tmp_expr = elab_and_eval(des, scope, pins[idx], context_width);
if (tmp_expr == 0) { if (tmp_expr == 0) {
cerr << pins[idx]->get_fileline() cerr << pins[idx]->get_fileline()
<< ": error: Failed to elaborate port expression." << ": error: Failed to elaborate port expression."