mirror of
https://github.com/verilator/verilator.git
synced 2026-10-06 01:54:01 +02:00
Fix $finish inside fork blocks (#6555)
Signed-off-by: Bartłomiej Chmiel <[email protected]>
This commit is contained in:
@@ -619,6 +619,20 @@ public:
|
||||
int instrCount() const override { return 0; } // Rarely executes
|
||||
bool sameNode(const AstNode* samep) const override { return fileline() == samep->fileline(); }
|
||||
};
|
||||
class AstFinishFork final : public AstNodeStmt {
|
||||
// $finish in fork
|
||||
public:
|
||||
explicit AstFinishFork(FileLine* fl)
|
||||
: ASTGEN_SUPER_FinishFork(fl) {}
|
||||
ASTGEN_MEMBERS_AstFinishFork;
|
||||
bool isGateOptimizable() const override { return false; }
|
||||
bool isPredictOptimizable() const override { return false; }
|
||||
bool isPure() override { return false; } // SPECIAL: $display has 'visual' ordering
|
||||
bool isOutputter() override { return true; } // SPECIAL: $display makes output
|
||||
bool isUnlikely() const override { return true; }
|
||||
int instrCount() const override { return 0; } // Rarely executes
|
||||
bool sameNode(const AstNode* samep) const override { return fileline() == samep->fileline(); }
|
||||
};
|
||||
class AstFireEvent final : public AstNodeStmt {
|
||||
// '-> _' and '->> _' event trigger statements
|
||||
// @astgen op1 := operandp : AstNodeExpr
|
||||
|
||||
@@ -90,6 +90,7 @@ class CfgBuilder final : public VNVisitorConst {
|
||||
void visit(AstComment*) override {} // ignore entirely
|
||||
void visit(AstDisplay* nodep) override { simpleStatement(nodep); }
|
||||
void visit(AstFinish* nodep) override { simpleStatement(nodep); }
|
||||
void visit(AstFinishFork* nodep) override { simpleStatement(nodep); }
|
||||
void visit(AstStmtExpr* nodep) override { simpleStatement(nodep); }
|
||||
void visit(AstStop* nodep) override { simpleStatement(nodep); }
|
||||
|
||||
|
||||
@@ -165,6 +165,7 @@ class CfgLiveVariables final : VNVisitorConst {
|
||||
void visit(AstAssignW* nodep) override { single(nodep); }
|
||||
void visit(AstDisplay* nodep) override { single(nodep); }
|
||||
void visit(AstFinish* nodep) override { single(nodep); }
|
||||
void visit(AstFinishFork* nodep) override { single(nodep); }
|
||||
void visit(AstStmtExpr* nodep) override { single(nodep); }
|
||||
void visit(AstStop* nodep) override { single(nodep); }
|
||||
|
||||
|
||||
@@ -1253,6 +1253,18 @@ public:
|
||||
puts(cvtToStr(nodep->fileline()->lineno()));
|
||||
puts(", \"\");\n");
|
||||
}
|
||||
void visit(AstFinishFork* nodep) override {
|
||||
putns(nodep, "VL_FINISH_MT(");
|
||||
putsQuoted(protect(nodep->fileline()->filename()));
|
||||
puts(", ");
|
||||
puts(cvtToStr(nodep->fileline()->lineno()));
|
||||
puts(", \"\");\n");
|
||||
if (m_cfuncp->isCoroutine()) {
|
||||
putns(nodep, "co_return;\n");
|
||||
} else {
|
||||
putns(nodep, "return;\n");
|
||||
}
|
||||
}
|
||||
void visit(AstPrintTimeScale* nodep) override {
|
||||
putns(nodep, "VL_PRINTTIMESCALE(");
|
||||
putsQuoted(protect(nodep->prettyName()));
|
||||
|
||||
@@ -556,6 +556,7 @@ class EmitVBaseVisitorConst VL_NOT_FINAL : public VNVisitorConst {
|
||||
puts(";\n");
|
||||
}
|
||||
void visit(AstFinish* nodep) override { putfs(nodep, "$finish;\n"); }
|
||||
void visit(AstFinishFork* nodep) override { putfs(nodep, "$finish;\n"); }
|
||||
void visit(AstStmtExpr* nodep) override {
|
||||
iterateConst(nodep->exprp());
|
||||
puts(";\n");
|
||||
|
||||
+4
-1
@@ -441,7 +441,10 @@ class LinkJumpVisitor final : public VNVisitor {
|
||||
void visit(AstFinish* nodep) override {
|
||||
if (nodep->user1SetOnce()) return; // Process once
|
||||
iterateChildren(nodep);
|
||||
if (m_loopp) {
|
||||
if (m_inFork) {
|
||||
nodep->replaceWith(new AstFinishFork{nodep->fileline()});
|
||||
VL_DO_DANGLING(nodep->deleteTree(), nodep);
|
||||
} else if (m_loopp) {
|
||||
// Jump to the end of the loop (post-finish)
|
||||
AstJumpBlock* const blockp = getJumpBlock(m_loopp, false);
|
||||
nodep->addNextHere(new AstJumpGo{nodep->fileline(), blockp});
|
||||
|
||||
Reference in New Issue
Block a user