Use full function name when function is from another package.
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc index ae1de1b..0be44d7 100644 --- a/systemverilog-plugin/UhdmAst.cc +++ b/systemverilog-plugin/UhdmAst.cc
@@ -4431,6 +4431,25 @@ current_node->children.push_back(node); } }); + + // Calls to functions imported from packages do not contain package name in vpiName. A full function name, containing package name, + // is necessary e.g. when call to a function is used as a value assigned to a port of a module instantiated inside generate for loop. + // However, we can't use full function name when it refers to a module's local function. + // To make it work the called function name is used instead of vpiName from the call object only when it contains package name (detected here + // by presence of "::"). + // TODO(mglb): This can fail when "::" is just a part of an escaped identifier. Handle such cases properly here and in other places. + const uhdm_handle *const handle = (const uhdm_handle *)obj_h; + if (handle->type == UHDM::uhdmfunc_call) { + const auto *const base_object = (const UHDM::BaseClass *)handle->object; + const auto *const fcall = base_object->Cast<const UHDM::func_call *>(); + if (fcall->Function()) { + auto fname = fcall->Function()->VpiFullName(); + if (fname.find("::") != std::string_view::npos) { + current_node->str = fname; + sanitize_symbol_name(current_node->str); + } + } + } } void UhdmAst::process_immediate_assert()