Add AstInitialAutomatic as prep for static class members

This commit is contained in:
Wilson Snyder 2022-01-02 12:35:44 -05:00
parent 84ee833ea7
commit e334740dd6
8 changed files with 27 additions and 5 deletions

View File

@ -3401,6 +3401,15 @@ public:
ASTNODE_NODE_FUNCS(Initial)
};
class AstInitialAutomatic final : public AstNodeProcedure {
// initial for automatic variables
// That is, it runs every function start, or class construction
public:
AstInitialAutomatic(FileLine* fl, AstNode* bodysp)
: ASTGEN_SUPER_InitialAutomatic(fl, bodysp) {}
ASTNODE_NODE_FUNCS(InitialAutomatic)
};
class AstAlways final : public AstNodeProcedure {
const VAlwaysKwd m_keyword;

View File

@ -715,6 +715,7 @@ private:
// Ignores
virtual void visit(AstInitial*) override {}
virtual void visit(AstInitialAutomatic*) override {}
virtual void visit(AstTraceDecl*) override {}
virtual void visit(AstCoverToggle*) override {}
virtual void visit(AstNodeDType*) override {}

View File

@ -99,6 +99,9 @@ class EmitVBaseVisitor VL_NOT_FINAL : public EmitCBaseVisitor {
iterateChildren(nodep);
putqs(nodep, "end\n");
}
virtual void visit(AstInitialAutomatic* nodep) override {
iterateChildren(nodep);
}
virtual void visit(AstAlways* nodep) override {
putfs(nodep, "always ");
if (m_sensesp) {

View File

@ -272,7 +272,11 @@ private:
auto* const assp
= new AstAssign(newfl, new AstVarRef(newfl, nodep->name(), VAccess::WRITE),
nodep->valuep()->unlinkFrBack());
nodep->addNextHere(new AstInitial(newfl, assp));
if (nodep->lifetime().isAutomatic()) {
nodep->addNextHere(new AstInitialAutomatic{newfl, assp});
} else {
nodep->addNextHere(new AstInitial{newfl, assp});
}
} // 4. Under blocks, it's an initial value to be under an assign
else {
nodep->addNextHere(new AstAssign(fl,

View File

@ -80,7 +80,7 @@ private:
iterateChildren(nodep);
}
}
virtual void visit(AstInitial* nodep) override {
virtual void visit(AstInitialAutomatic* nodep) override {
iterateChildren(nodep);
// Initial assignments under function/tasks can just be simple
// assignments without the initial

View File

@ -644,6 +644,9 @@ class OrderBuildVisitor final : public AstNVisitor {
virtual void visit(AstInitial* nodep) override { //
iterateLogic(nodep);
}
virtual void visit(AstInitialAutomatic* nodep) override { //
iterateLogic(nodep);
}
virtual void visit(AstAlways* nodep) override { //
iterateLogic(nodep);
}

View File

@ -217,6 +217,8 @@ struct SplitVarImpl {
insertBeginCore(ap, stmtp, modp);
} else if (AstInitial* const ap = VN_CAST(backp, Initial)) {
insertBeginCore(ap, stmtp, modp);
} else if (auto* const ap = VN_CAST(backp, Initial)) {
insertBeginCore(ap, stmtp, modp);
}
}

View File

@ -112,7 +112,7 @@ private:
AstClass* m_classp = nullptr; // Current class
V3Graph m_callGraph; // Task call graph
TaskBaseVertex* m_curVxp; // Current vertex we're adding to
std::vector<AstInitial*> m_initialps; // Initial blocks to move
std::vector<AstInitialAutomatic*> m_initialps; // Initial blocks to move
public:
// METHODS
@ -246,7 +246,7 @@ private:
iterateChildren(nodep);
}
UASSERT_OBJ(m_ctorp, nodep, "class constructor missing"); // LinkDot always makes it
for (AstInitial* initialp : m_initialps) {
for (AstInitialAutomatic* initialp : m_initialps) {
if (AstNode* const newp = initialp->bodysp()) {
newp->unlinkFrBackWithNext();
if (!m_ctorp->stmtsp()) {
@ -261,7 +261,7 @@ private:
m_ctorp = nullptr;
m_classp = nullptr;
}
virtual void visit(AstInitial* nodep) override {
virtual void visit(AstInitialAutomatic* nodep) override {
m_initialps.push_back(nodep);
iterateChildren(nodep);
}