From 91a9eef3d2a655d11d0ac314f54c29dfd1d590ea Mon Sep 17 00:00:00 2001 From: Ryszard Rozak Date: Thu, 15 Jan 2026 15:06:57 +0100 Subject: [PATCH] TMP: Restore previous way Signed-off-by: Ryszard Rozak --- src/V3Force.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/V3Force.cpp b/src/V3Force.cpp index 6602794af..abd197aa2 100644 --- a/src/V3Force.cpp +++ b/src/V3Force.cpp @@ -187,6 +187,36 @@ public: vscp->scopep()->addBlocksp(activep); } } + static AstNodeExpr* applySelects(AstNodeExpr* exprp, + const std::vector& selectExprs) { + for (AstNodeExpr* const sp : selectExprs) { + exprp = new AstArraySel{exprp->fileline(), exprp, sp->cloneTreePure(false)}; + } + return exprp; + } + AstNodeExpr* forcedUpdate(AstVarScope* const vscp, + const std::vector& selectExprs) const { + FileLine* const flp = vscp->fileline(); + AstVarRef* origRefp = new AstVarRef{flp, vscp, VAccess::READ}; + ForceState::markNonReplaceable(origRefp); + AstNodeExpr* const origp = applySelects(origRefp, selectExprs); + if (ForceState::isRangedDType(vscp)) { + return new AstOr{ + flp, + new AstAnd{ + flp, + applySelects(new AstVarRef{flp, m_enVscp, VAccess::READ}, selectExprs), + applySelects(new AstVarRef{flp, m_valVscp, VAccess::READ}, selectExprs)}, + new AstAnd{ + flp, + new AstNot{flp, applySelects(new AstVarRef{flp, m_enVscp, VAccess::READ}, + selectExprs)}, + origp}}; + } + return new AstCond{ + flp, applySelects(new AstVarRef{flp, m_enVscp, VAccess::READ}, selectExprs), + applySelects(new AstVarRef{flp, m_valVscp, VAccess::READ}, selectExprs), origp}; + } static AstNodeExpr* wrapIntoExprp(AstVarRef* const refp, AstNodeExpr* const exprp, AstVarRef* const varRefToReplacep) { if (exprp == varRefToReplacep) {