@@ -1838,6 +1838,10 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
18381838 // Nets pass
18391839 const DataType* dtype = sig->getDataType ();
18401840 VObjectType subnettype = sig->getType ();
1841+ // For typed net declarations (e.g. "wand integer"), the original net keyword
1842+ // (paNetType_Wand/Wor/Wire) is preserved in getSubNetType(). The m_type
1843+ // (subnettype) holds the data type which may have overridden the net keyword.
1844+ VObjectType netKeyword = sig->getSubNetType ();
18411845 UHDM::typespec* tps = nullptr ;
18421846 // Determine if the "signal" is a net or a var
18431847 bool isNet = true ;
@@ -1868,6 +1872,11 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
18681872 isNet = true ;
18691873 }
18701874 }
1875+ // Typed net declarations like "wand integer" or "wand typename" store the
1876+ // original net keyword in getSubNetType(). Override isNet for these cases.
1877+ if (netKeyword != VObjectType::slNoType) {
1878+ isNet = true ;
1879+ }
18711880
18721881 NodeId typeSpecId = sig->getTypeSpecId ();
18731882 if (typeSpecId) {
@@ -1990,7 +1999,7 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
19901999 for (auto a : *sig->attributes ()) a->VpiParent (logicn);
19912000 }
19922001 logicn->VpiSigned (sig->isSigned ());
1993- logicn->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2002+ logicn->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
19942003 // Move range to typespec for simple types
19952004 // logicn->Ranges(packedDimensions);
19962005 ref_typespec* rt = s.MakeRef_typespec ();
@@ -2106,9 +2115,9 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
21062115 stv->VpiParent (pnets);
21072116 for (auto r : *packedDimensions) r->VpiParent (pnets);
21082117 obj = pnets;
2109- pnets->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2118+ pnets->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
21102119 } else {
2111- stv->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2120+ stv->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
21122121 }
21132122 } else if (const Struct* st = datatype_cast<const Struct*>(dtype)) {
21142123 struct_net* stv = s.MakeStruct_net ();
@@ -2130,9 +2139,9 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
21302139 stv->VpiParent (pnets);
21312140 for (auto r : *packedDimensions) r->VpiParent (pnets);
21322141 obj = pnets;
2133- pnets->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2142+ pnets->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
21342143 } else {
2135- stv->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2144+ stv->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
21362145 }
21372146 } else if (dtype->getCategory () == DataType::Category::PARAMETER ||
21382147 dtype->getCategory () == DataType::Category::SIMPLE_TYPEDEF) {
@@ -2154,7 +2163,7 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
21542163 for (auto a : *sig->attributes ()) a->VpiParent (logicn);
21552164 }
21562165 logicn->VpiSigned (sig->isSigned ());
2157- logicn->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2166+ logicn->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
21582167 // Move range to typespec for simple types
21592168 // logicn->Ranges(packedDimensions);
21602169 ref_typespec* rt = s.MakeRef_typespec ();
@@ -2185,9 +2194,9 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
21852194 stv->VpiParent (pnets);
21862195 for (auto r : *packedDimensions) r->VpiParent (pnets);
21872196 obj = pnets;
2188- pnets->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2197+ pnets->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
21892198 } else {
2190- stv->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2199+ stv->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
21912200 }
21922201 } else if (spec->UhdmType () == uhdmenum_typespec) {
21932202 enum_net* stv = s.MakeEnum_net ();
@@ -2210,9 +2219,9 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
22102219 stv->VpiParent (pnets);
22112220 for (auto r : *packedDimensions) r->VpiParent (pnets);
22122221 obj = pnets;
2213- pnets->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2222+ pnets->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
22142223 } else {
2215- stv->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2224+ stv->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
22162225 }
22172226 } else if (spec->UhdmType () == uhdmbit_typespec) {
22182227 bit_var* logicn = s.MakeBit_var ();
@@ -2265,7 +2274,7 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
22652274 for (auto a : *sig->attributes ()) a->VpiParent (logicn);
22662275 }
22672276 logicn->VpiSigned (sig->isSigned ());
2268- logicn->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2277+ logicn->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
22692278 ref_typespec* rt = s.MakeRef_typespec ();
22702279 rt->VpiParent (logicn);
22712280 rt->Actual_typespec (tps);
@@ -2370,7 +2379,7 @@ bool NetlistElaboration::elabSignal(Signal* sig, ModuleInstance* instance,
23702379 } else {
23712380 logic_net* logicn = s.MakeLogic_net ();
23722381 logicn->VpiSigned (sig->isSigned ());
2373- logicn->VpiNetType (UhdmWriter::getVpiNetType (sig->getType ()));
2382+ logicn->VpiNetType (UhdmWriter::getVpiNetType (netKeyword != VObjectType::slNoType ? netKeyword : sig->getType ()));
23742383 if (sig->attributes ()) {
23752384 logicn->Attributes (sig->attributes ());
23762385 for (auto a : *sig->attributes ()) a->VpiParent (logicn);
0 commit comments