Add AstInitialAutomatic as prep for static class members
This commit is contained in:
parent
84ee833ea7
commit
e334740dd6
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue