mirror of
https://github.com/verilator/verilator.git
synced 2026-09-02 18:58:51 +02:00
Fix direct NBA to dynamically-sized variable (#6310)
This commit is contained in:
+17
-1
@@ -43,6 +43,8 @@ class WidthCommitVisitor final : public VNVisitor {
|
||||
// STATE
|
||||
AstNodeModule* m_modp = nullptr;
|
||||
std::string m_contNba; // In continuous- or non-blocking assignment
|
||||
bool m_dynsizedelem
|
||||
= false; // Writing a dynamically-sized array element, not the array itself
|
||||
VMemberMap m_memberMap; // Member names cached for fast lookup
|
||||
bool m_underSel = false; // Whether is currently under AstMemberSel or AstSel
|
||||
|
||||
@@ -138,7 +140,7 @@ private:
|
||||
else if (varp->isClassMember() && !varp->lifetime().isStatic()
|
||||
&& !VN_IS(varDtp, IfaceRefDType))
|
||||
varType = "Class non-static";
|
||||
else if (varDtp->isDynamicallySized())
|
||||
else if (varDtp->isDynamicallySized() && m_dynsizedelem)
|
||||
varType = "Dynamically-sized";
|
||||
if (!varType.empty()) {
|
||||
UINFO(1, " Related var dtype: " << varDtp);
|
||||
@@ -395,6 +397,20 @@ private:
|
||||
// This check could go anywhere after V3Param
|
||||
nodep->v3fatalSrc("Presels should have been removed before this point");
|
||||
}
|
||||
void visit(AstCMethodHard* nodep) override {
|
||||
VL_RESTORER(m_dynsizedelem);
|
||||
if (nodep->name() == "atWrite" || nodep->name() == "atWriteAppend"
|
||||
|| nodep->name() == "at")
|
||||
m_dynsizedelem = true;
|
||||
iterateChildren(nodep);
|
||||
editDType(nodep);
|
||||
}
|
||||
void visit(AstAssocSel* nodep) override {
|
||||
VL_RESTORER(m_dynsizedelem);
|
||||
m_dynsizedelem = true;
|
||||
iterateChildren(nodep);
|
||||
editDType(nodep);
|
||||
}
|
||||
void visit(AstSel* nodep) override {
|
||||
{
|
||||
VL_RESTORER(m_underSel);
|
||||
|
||||
Reference in New Issue
Block a user