Fix gathering senaitivities from virtual interface members (#6325)

This commit is contained in:
Aleksander Kiryk 2025-08-23 16:45:13 +02:00 committed by GitHub
parent 34315a4f70
commit 353a2e3d20
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 28 additions and 25 deletions

View File

@ -104,17 +104,20 @@ void invertAndMergeSenTreeMap(
for (const auto& pair : senTreeMap) result.emplace(pair.second, pair.first); for (const auto& pair : senTreeMap) result.emplace(pair.second, pair.first);
} }
AstSenTree* findTriggeredIface(const AstVarScope* vscp, std::vector<AstSenTree*>
const VirtIfaceTriggers::IfaceSensMap& vifTrigged, findTriggeredIface(const AstVarScope* vscp, const VirtIfaceTriggers::IfaceSensMap& vifTrigged,
const VirtIfaceTriggers::IfaceMemberSensMap& vifMemberTriggered) { const VirtIfaceTriggers::IfaceMemberSensMap& vifMemberTriggered) {
UASSERT_OBJ(vscp->varp()->sensIfacep(), vscp, "Not an virtual interface trigger"); UASSERT_OBJ(vscp->varp()->sensIfacep(), vscp, "Not an virtual interface trigger");
std::vector<AstSenTree*> result;
const auto ifaceIt = vifTrigged.find(vscp->varp()->sensIfacep()); const auto ifaceIt = vifTrigged.find(vscp->varp()->sensIfacep());
if (ifaceIt != vifTrigged.end()) return ifaceIt->second; if (ifaceIt != vifTrigged.end()) result.push_back(ifaceIt->second);
for (const auto& memberIt : vifMemberTriggered) { for (const auto& memberIt : vifMemberTriggered) {
if (memberIt.first.m_ifacep == vscp->varp()->sensIfacep()) return memberIt.second; if (vscp->varp()->sensIfacep() == memberIt.first.m_ifacep) {
result.push_back(memberIt.second);
} }
vscp->v3fatalSrc("Did not find virtual interface trigger"); }
return nullptr; // unreachable, appease MSVC if (result.empty()) vscp->v3fatalSrc("Did not find virtual interface trigger");
return result;
} }
//============================================================================ //============================================================================
@ -974,8 +977,8 @@ AstNode* createInputCombLoop(AstNetlist* netlistp, AstCFunc* const initFuncp,
= virtIfaceTriggers.makeMemberToSensMap(netlistp, firstVifTriggerIndex, trig.m_vscp); = virtIfaceTriggers.makeMemberToSensMap(netlistp, firstVifTriggerIndex, trig.m_vscp);
// Create and Order the body function // Create and Order the body function
AstCFunc* const icoFuncp AstCFunc* const icoFuncp = V3Order::order(
= V3Order::order(netlistp, {&logic}, trigToSen, "ico", false, false, netlistp, {&logic}, trigToSen, "ico", false, false,
[=](const AstVarScope* vscp, std::vector<AstSenTree*>& out) { [=](const AstVarScope* vscp, std::vector<AstSenTree*>& out) {
AstVar* const varp = vscp->varp(); AstVar* const varp = vscp->varp();
if (varp->isPrimaryInish() || varp->isSigUserRWPublic()) { if (varp->isPrimaryInish() || varp->isSigUserRWPublic()) {
@ -983,9 +986,9 @@ AstNode* createInputCombLoop(AstNetlist* netlistp, AstCFunc* const initFuncp,
} }
if (varp->isWrittenByDpi()) out.push_back(dpiExportTriggered); if (varp->isWrittenByDpi()) out.push_back(dpiExportTriggered);
if (vscp->varp()->sensIfacep()) { if (vscp->varp()->sensIfacep()) {
AstSenTree* ifaceTriggered = findTriggeredIface( std::vector<AstSenTree*> ifaceTriggered
vscp, vifTriggeredIco, vifMemberTriggeredIco); = findTriggeredIface(vscp, vifTriggeredIco, vifMemberTriggeredIco);
out.push_back(ifaceTriggered); out.insert(out.end(), ifaceTriggered.begin(), ifaceTriggered.end());
} }
}); });
splitCheck(icoFuncp); splitCheck(icoFuncp);
@ -1397,9 +1400,9 @@ void schedule(AstNetlist* netlistp) {
if (it != actTimingDomains.end()) out = it->second; if (it != actTimingDomains.end()) out = it->second;
if (vscp->varp()->isWrittenByDpi()) out.push_back(dpiExportTriggeredAct); if (vscp->varp()->isWrittenByDpi()) out.push_back(dpiExportTriggeredAct);
if (vscp->varp()->sensIfacep()) { if (vscp->varp()->sensIfacep()) {
AstSenTree* ifaceTriggered std::vector<AstSenTree*> ifaceTriggered
= findTriggeredIface(vscp, vifTriggeredAct, vifMemberTriggeredAct); = findTriggeredIface(vscp, vifTriggeredAct, vifMemberTriggeredAct);
out.push_back(ifaceTriggered); out.insert(out.end(), ifaceTriggered.begin(), ifaceTriggered.end());
} }
}); });
splitCheck(actFuncp); splitCheck(actFuncp);
@ -1438,9 +1441,9 @@ void schedule(AstNetlist* netlistp) {
if (it != timingDomains.end()) out = it->second; if (it != timingDomains.end()) out = it->second;
if (vscp->varp()->isWrittenByDpi()) out.push_back(dpiExportTriggered); if (vscp->varp()->isWrittenByDpi()) out.push_back(dpiExportTriggered);
if (vscp->varp()->sensIfacep()) { if (vscp->varp()->sensIfacep()) {
AstSenTree* ifaceTriggered std::vector<AstSenTree*> ifaceTriggered
= findTriggeredIface(vscp, vifTriggered, vifMemberTriggered); = findTriggeredIface(vscp, vifTriggered, vifMemberTriggered);
out.push_back(ifaceTriggered); out.insert(out.end(), ifaceTriggered.begin(), ifaceTriggered.end());
} }
}); });