Activate wildcard imports for implicit named port connections

The LRM section 23.3.2.4 says that an implicit `.name` port
connection is a reference that can make a name from a preceding wildcard
package import visible. Currently `.name` creates its `PEIdent` directly
and skips the package import reference bookkeeping, so the imported name
can not be resolved.

Allow `pform_new_ident()` to suppress implicit net creation and use it for
`.name`. This keeps import activation, `PEIdent` construction, and source
location handling in one place while preserving the existing behavior
that prevents `.name` from creating an implicit net.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
Lars-Peter Clausen 2026-08-02 12:29:58 -07:00
parent c5dbdddf7b
commit 19772cfe07
5 changed files with 15 additions and 9 deletions

View File

@ -406,8 +406,9 @@ const verireal& PEFNumber::value() const
return *value_;
}
PEIdent::PEIdent(const pform_name_t&that, unsigned lexical_pos)
: path_(that), no_implicit_sig_(false)
PEIdent::PEIdent(const pform_name_t&that, unsigned lexical_pos,
bool no_implicit_sig)
: path_(that), no_implicit_sig_(no_implicit_sig)
{
LineInfo::lexical_pos(lexical_pos);
}

View File

@ -346,7 +346,8 @@ class PEIdent : public PExpr {
public:
explicit PEIdent(perm_string, unsigned lexical_pos, bool no_implicit_sig=false);
explicit PEIdent(PPackage*pkg, const pform_name_t&name);
explicit PEIdent(const pform_name_t&, unsigned lexical_pos);
explicit PEIdent(const pform_name_t&, unsigned lexical_pos,
bool no_implicit_sig = false);
~PEIdent() override;
// Add another name to the string of hierarchy that is the

View File

@ -6460,9 +6460,10 @@ port_name
{ pform_requires_sv(@3, "Implicit named port connections");
named_pexpr_t*tmp = new named_pexpr_t;
FILE_NAME(tmp, @$);
tmp->name = lex_strings.make($3);
tmp->parm = new PEIdent(lex_strings.make($3), @3.lexical_pos, true);
FILE_NAME(tmp->parm, @3);
auto name = lex_strings.make($3);
pform_name_t path = { name_component_t(name) };
tmp->name = name;
tmp->parm = pform_new_ident(@3, path, true);
delete[]$3;
delete $1;
$$ = tmp;

View File

@ -737,12 +737,13 @@ PBlock* pform_push_block_scope(const struct vlltype&loc, const char*name,
/*
* Create a new identifier.
*/
PEIdent* pform_new_ident(const struct vlltype&loc, const pform_name_t&name)
PEIdent *pform_new_ident(const struct vlltype&loc, const pform_name_t&name,
bool no_implicit_sig)
{
if (gn_system_verilog())
check_potential_imports(loc, name.front().name, false);
auto tmp = new PEIdent(name, loc.lexical_pos);
auto tmp = new PEIdent(name, loc.lexical_pos, no_implicit_sig);
FILE_NAME(tmp, loc);
return tmp;
}

View File

@ -236,7 +236,9 @@ extern void pform_add_modport_port(const struct vlltype&loc,
* This creates an identifier aware of names that may have been
* imported from other packages.
*/
extern PEIdent* pform_new_ident(const struct vlltype&loc, const pform_name_t&name);
extern PEIdent *pform_new_ident(const struct vlltype&loc,
const pform_name_t&name,
bool no_implicit_sig = false);
extern PTrigger* pform_new_trigger(const struct vlltype&loc, PPackage*pkg,
const pform_name_t&name);