Fix gathering senaitivities from virtual interface members (#6325)
This commit is contained in:
parent
34315a4f70
commit
353a2e3d20
|
|
@ -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");
|
if (result.empty()) vscp->v3fatalSrc("Did not find virtual interface trigger");
|
||||||
return nullptr; // unreachable, appease MSVC
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
@ -974,20 +977,20 @@ 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()) {
|
||||||
out.push_back(inputChanged);
|
out.push_back(inputChanged);
|
||||||
}
|
}
|
||||||
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);
|
||||||
|
|
||||||
// Create the eval loop
|
// Create the eval loop
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue