mirror of
https://github.com/verilator/verilator.git
synced 2026-10-06 01:54:01 +02:00
@@ -239,6 +239,11 @@ class LinkCellsVisitor final : public VNVisitor {
|
||||
nodep->v3error("Non-interface used as an interface: " << nodep->prettyNameQ());
|
||||
}
|
||||
}
|
||||
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()));
|
||||
}
|
||||
// Note cannot do modport resolution here; modports are allowed underneath generates
|
||||
}
|
||||
|
||||
|
||||
@@ -3754,6 +3754,20 @@ class LinkDotResolveVisitor final : public VNVisitor {
|
||||
iterateChildren(nodep);
|
||||
}
|
||||
|
||||
void visit(AstIfaceRefDType* nodep) override {
|
||||
if (nodep->paramsp()) {
|
||||
// If there is no parameters, there is no need to visit this node.
|
||||
AstIface* const ifacep = nodep->ifacep();
|
||||
UASSERT_OBJ(ifacep, nodep, "Port parameters of AstIfaceRefDType without ifacep()");
|
||||
if (ifacep->dead()) return;
|
||||
checkNoDot(nodep);
|
||||
m_usedPins.clear();
|
||||
VL_RESTORER(m_pinSymp);
|
||||
m_pinSymp = m_statep->getNodeSym(ifacep);
|
||||
iterate(nodep->paramsp());
|
||||
}
|
||||
}
|
||||
|
||||
void visit(AstAttrOf* nodep) override { iterateChildren(nodep); }
|
||||
|
||||
void visit(AstNode* nodep) override {
|
||||
|
||||
@@ -919,6 +919,11 @@ class ParamProcessor final {
|
||||
nodep->recursive(false);
|
||||
}
|
||||
|
||||
void ifaceRefDeparam(AstIfaceRefDType* const nodep, AstNodeModule*& srcModpr) {
|
||||
nodeDeparamCommon(nodep, srcModpr, nodep->paramsp(), nullptr, false);
|
||||
nodep->ifacep(VN_AS(srcModpr, Iface));
|
||||
}
|
||||
|
||||
void classRefDeparam(AstClassOrPackageRef* nodep, AstNodeModule*& srcModpr) {
|
||||
if (nodeDeparamCommon(nodep, srcModpr, nodep->paramsp(), nullptr, false))
|
||||
nodep->classOrPackagep(srcModpr);
|
||||
@@ -948,6 +953,8 @@ public:
|
||||
|
||||
if (auto* cellp = VN_CAST(nodep, Cell)) {
|
||||
cellDeparam(cellp, srcModpr);
|
||||
} else if (auto* ifaceRefDTypep = VN_CAST(nodep, IfaceRefDType)) {
|
||||
ifaceRefDeparam(ifaceRefDTypep, srcModpr);
|
||||
} else if (auto* classRefp = VN_CAST(nodep, ClassRefDType)) {
|
||||
classRefDeparam(classRefp, srcModpr);
|
||||
} else if (auto* classRefp = VN_CAST(nodep, ClassOrPackageRef)) {
|
||||
@@ -1042,6 +1049,8 @@ class ParamVisitor final : public VNVisitor {
|
||||
if (VN_IS(classRefp->classOrPackageNodep(), ParamTypeDType)) continue;
|
||||
} else if (const auto* classRefp = VN_CAST(cellp, ClassRefDType)) {
|
||||
srcModp = classRefp->classp();
|
||||
} else if (const auto* ifaceRefp = VN_CAST(cellp, IfaceRefDType)) {
|
||||
srcModp = ifaceRefp->ifacep();
|
||||
} else {
|
||||
cellp->v3fatalSrc("Expected module parameterization");
|
||||
}
|
||||
@@ -1137,6 +1146,9 @@ class ParamVisitor final : public VNVisitor {
|
||||
void visit(AstCell* nodep) override {
|
||||
visitCellOrClassRef(nodep, VN_IS(nodep->modp(), Iface));
|
||||
}
|
||||
void visit(AstIfaceRefDType* nodep) override {
|
||||
if (nodep->ifacep()) visitCellOrClassRef(nodep, true);
|
||||
}
|
||||
void visit(AstClassRefDType* nodep) override { visitCellOrClassRef(nodep, false); }
|
||||
void visit(AstClassOrPackageRef* nodep) override { visitCellOrClassRef(nodep, false); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user