From df0d80179060c06046261bc2d8b439cc8b7ccd2c Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sun, 23 Aug 2026 16:03:42 -0400 Subject: [PATCH] Internals: Duplicate code cleanup. No functional change intended. --- src/V3EmitCSyms.cpp | 40 ++++++++++------------------------------ src/V3LinkCells.cpp | 27 +++++++++++---------------- src/V3LinkDot.cpp | 17 ++++------------- 3 files changed, 25 insertions(+), 59 deletions(-) diff --git a/src/V3EmitCSyms.cpp b/src/V3EmitCSyms.cpp index 9d16574e7..90f190350 100644 --- a/src/V3EmitCSyms.cpp +++ b/src/V3EmitCSyms.cpp @@ -489,40 +489,19 @@ class EmitCSyms final : EmitCBaseVisitorConst { + "__VforceRd" + '"'; stmt += ", {"; - // Find __VforceEn - { - const std::string enableSignalKey = getKeyName(scopep, varp->name() + "__VforceEn"); + for (const std::string forceControlSuffix : {"__VforceEn", "__VforceVal"}) { + const std::string enableSignalKey + = getKeyName(scopep, varp->name() + forceControlSuffix); const std::map::const_iterator itpair = m_scopeVars.find(enableSignalKey); if (itpair == m_scopeVars.end()) { - varp->v3fatalSrc("Signal " << varp->prettyNameQ() - << " is marked forceable, but the force enable signal '" - << varp->name() << "__VforceEn" - << "' can not be found in m_scopeVars with key '" - << enableSignalKey << "'."); - } - - const ScopeVarData& svd = itpair->second; - const AstScope* const scopep = svd.m_scopep; - const AstVar* const varp = svd.m_varp; - const VarDims dims = dimsFor(svd); - stmt - += insertVarStatement(svd, scopep, varp, dims.udim, dims.pdim, boundsString(dims)); - } - stmt += ","; - // Find __VforceVal - { - const std::string valueSignalKey = getKeyName(scopep, varp->name() + "__VforceVal"); - const std::map::const_iterator itpair - = m_scopeVars.find(valueSignalKey); - - if (itpair == m_scopeVars.end()) { - varp->v3fatalSrc("Signal " << varp->prettyNameQ() - << " is marked forceable, but the force value signal '" - << varp->name() << "__VforceVal" - << "' can not be found in m_scopeVars with key '" - << valueSignalKey << "'."); + varp->v3fatalSrc("Signal " + << varp->prettyNameQ() + << " is marked forceable, but the force control signal '" + << varp->name() << forceControlSuffix + << "' can not be found in m_scopeVars with key '" + << enableSignalKey << "'."); } const ScopeVarData& svd = itpair->second; @@ -531,6 +510,7 @@ class EmitCSyms final : EmitCBaseVisitorConst { const VarDims dims = dimsFor(svd); stmt += insertVarStatement(svd, scopep, varp, dims.udim, dims.pdim, boundsString(dims)); + if (forceControlSuffix == "__VforceEn") stmt += ","; } stmt += "}"; diff --git a/src/V3LinkCells.cpp b/src/V3LinkCells.cpp index 6c4c637a0..df016a453 100644 --- a/src/V3LinkCells.cpp +++ b/src/V3LinkCells.cpp @@ -377,6 +377,13 @@ class LinkCellsVisitor final : public VNVisitor { return finalEdgep->cellp(); } + void assignParamNumbers(AstPin* const firstPinp) { + for (AstPin* pinp = firstPinp; pinp; pinp = VN_AS(pinp->nextp(), Pin)) { + pinp->param(true); + if (pinp->name() == "") pinp->name("__paramNumber" + cvtToStr(pinp->pinNum())); + } + } + // VISITORS void visit(AstNetlist* nodep) override { readModNames(); @@ -520,10 +527,7 @@ class LinkCellsVisitor final : public VNVisitor { } } iterateChildren(nodep); - for (AstPin* pinp = nodep->paramsp(); pinp; pinp = VN_AS(pinp->nextp(), Pin)) { - pinp->param(true); - if (pinp->name() == "") pinp->name("__paramNumber" + cvtToStr(pinp->pinNum())); - } + assignParamNumbers(nodep->paramsp()); // Parser didn't know what was interface, resolve now // For historical reasons virtual interface reference variables remain VARs if (m_varp && !nodep->isVirtual()) m_varp->setIfaceRef(); @@ -669,10 +673,7 @@ class LinkCellsVisitor final : public VNVisitor { for (AstPin* pinp = nodep->pinsp(); pinp; pinp = VN_AS(pinp->nextp(), Pin)) { if (pinp->name() == "") pinp->name("__pinNumber" + cvtToStr(pinp->pinNum())); } - for (AstPin* pinp = nodep->paramsp(); pinp; pinp = VN_AS(pinp->nextp(), Pin)) { - pinp->param(true); - if (pinp->name() == "") pinp->name("__paramNumber" + cvtToStr(pinp->pinNum())); - } + assignParamNumbers(nodep->paramsp()); if (nodep->modp()) { nodep->modName(nodep->modp()->name()); // Note what pins exist @@ -807,10 +808,7 @@ class LinkCellsVisitor final : public VNVisitor { void visit(AstRefDType* nodep) override { iterateChildren(nodep); - for (AstPin* pinp = nodep->paramsp(); pinp; pinp = VN_AS(pinp->nextp(), Pin)) { - pinp->param(true); - if (pinp->name() == "") pinp->name("__paramNumber" + cvtToStr(pinp->pinNum())); - } + assignParamNumbers(nodep->paramsp()); if (m_varp) { // Parser didn't know what was interface, resolve now AstNodeModule* const varModp = findModuleSym(nodep->name(), m_modp->libname()); if (AstIface* const ifacep = VN_CAST(varModp, Iface)) { @@ -824,14 +822,11 @@ class LinkCellsVisitor final : public VNVisitor { } void visit(AstClassOrPackageRef* nodep) override { iterateChildren(nodep); + assignParamNumbers(nodep->paramsp()); // Inside a class, an extends or reference to another class // Note we don't add a V3GraphEdge{vertex(m_modp), vertex(nodep->classOrPackagep()} // We could for an extends, but for another reference we cannot, as // it is legal to have classes both with parameters that link to each other - for (AstPin* pinp = nodep->paramsp(); pinp; pinp = VN_AS(pinp->nextp(), Pin)) { - pinp->param(true); - if (pinp->name() == "") pinp->name("__paramNumber" + cvtToStr(pinp->pinNum())); - } } void visit(AstVar* nodep) override { diff --git a/src/V3LinkDot.cpp b/src/V3LinkDot.cpp index 92f3aaf40..671ac14e2 100644 --- a/src/V3LinkDot.cpp +++ b/src/V3LinkDot.cpp @@ -6293,24 +6293,15 @@ class LinkDotResolveVisitor final : public VNVisitor { } } } - void visit(AstPackageImport* nodep) override { - // No longer needed - LINKDOT_VISIT_START(); - checkNoDot(nodep); - if (m_statep->forParamed()) VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); - } - void visit(AstPackageExport* nodep) override { - // No longer needed - LINKDOT_VISIT_START(); - checkNoDot(nodep); - if (m_statep->forParamed()) VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); - } - void visit(AstPackageExportStarStar* nodep) override { + void visitPackageImportOrExport(AstNode* nodep) { // No longer needed LINKDOT_VISIT_START(); checkNoDot(nodep); if (m_statep->forParamed()) VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); } + void visit(AstPackageImport* nodep) override { visitPackageImportOrExport(nodep); } + void visit(AstPackageExport* nodep) override { visitPackageImportOrExport(nodep); } + void visit(AstPackageExportStarStar* nodep) override { visitPackageImportOrExport(nodep); } void visit(AstCellRef* nodep) override { LINKDOT_VISIT_START(); UINFO(5, indent() << "visit " << nodep);