mirror of
https://github.com/verilator/verilator.git
synced 2026-08-29 01:13:53 +02:00
Internals: Duplicate code cleanup. No functional change intended.
This commit is contained in:
+10
-30
@@ -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 std::string, ScopeVarData>::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 std::string, ScopeVarData>::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 += "}";
|
||||
|
||||
+11
-16
@@ -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 {
|
||||
|
||||
+4
-13
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user