Support parameterized virtual interaces (#4047) (#4743)

This commit is contained in:
Ryszard Rozak
2023-12-06 08:02:04 -05:00
committed by GitHub
parent ca5a7d7656
commit eb2cfe1d19
5 changed files with 195 additions and 0 deletions
+5
View File
@@ -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
}
+14
View File
@@ -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 {
+12
View File
@@ -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); }