Fix release of forced port nets (#7907) (#7901)

Fixes# 7901

Signed-off-by: Artur Bieniek <[email protected]>
This commit is contained in:
Artur Bieniek
2026-07-10 11:35:06 +01:00
committed by GitHub
parent b211af9d24
commit feb2fe0d94
5 changed files with 147 additions and 11 deletions
+9 -6
View File
@@ -679,8 +679,9 @@ void connectPort(AstNodeModule* modp, AstVar* nodep, AstNodeExpr* pinExprp) {
// the port variable. The constant can still be inlined, in which case
// this is needed for tracing the inlined port variable.
if (AstConst* const pinp = VN_CAST(pinExprp, Const)) {
AstAssignW* const ap
= new AstAssignW{flp, portRef(VAccess::WRITE), pinp->cloneTree(false)};
AstVarRef* const lhsp = portRef(VAccess::WRITE);
lhsp->varp()->isContinuously(true);
AstAssignW* const ap = new AstAssignW{flp, lhsp, pinp->cloneTree(false)};
modp->addStmtsp(new AstAlways{ap});
return;
}
@@ -732,12 +733,14 @@ void connectPort(AstNodeModule* modp, AstVar* nodep, AstNodeExpr* pinExprp) {
// Otherwise create the continuous assignment between the port var and the pin expression
UINFO(6, "Not inlining port variable: " << nodep);
if (nodep->direction() == VDirection::INPUT) {
AstAssignW* const ap
= new AstAssignW{flp, portRef(VAccess::WRITE), pinRefAsExpr(VAccess::READ)};
AstVarRef* const lhsp = portRef(VAccess::WRITE);
lhsp->varp()->isContinuously(true);
AstAssignW* const ap = new AstAssignW{flp, lhsp, pinRefAsExpr(VAccess::READ)};
modp->addStmtsp(new AstAlways{ap});
} else if (nodep->direction() == VDirection::OUTPUT) {
AstAssignW* const ap
= new AstAssignW{flp, pinRefAsExpr(VAccess::WRITE), portRef(VAccess::READ)};
AstNodeVarRef* const lhsp = VN_AS(pinRefAsExpr(VAccess::WRITE), NodeVarRef);
lhsp->varp()->isContinuously(true);
AstAssignW* const ap = new AstAssignW{flp, lhsp, portRef(VAccess::READ)};
modp->addStmtsp(new AstAlways{ap});
} else {
pinExprp->v3fatalSrc("V3Tristate left INOUT port");