diff --git a/src/V3AstNodeOther.h b/src/V3AstNodeOther.h index 5c6611056..a99bf7e0f 100644 --- a/src/V3AstNodeOther.h +++ b/src/V3AstNodeOther.h @@ -3341,13 +3341,13 @@ public: }; class AstSetuphold final : public AstNodeStmt { // Verilog $setuphold - // @astgen op1 := refevp : AstSenItem - // @astgen op2 := dataevp : AstSenItem - // @astgen op3 := delrefp : Optional[AstSenItem] - // @astgen op4 := deldatap : Optional[AstSenItem] + // @astgen op1 := refevp : AstNodeExpr + // @astgen op2 := dataevp : AstNodeExpr + // @astgen op3 := delrefp : Optional[AstNodeExpr] + // @astgen op4 := deldatap : Optional[AstNodeExpr] public: - AstSetuphold(FileLine* fl, AstSenItem* refevp, AstSenItem* dataevp, - AstSenItem* delrefp = nullptr, AstSenItem* deldatap = nullptr) + AstSetuphold(FileLine* fl, AstNodeExpr* refevp, AstNodeExpr* dataevp, + AstNodeExpr* delrefp = nullptr, AstNodeExpr* deldatap = nullptr) : ASTGEN_SUPER_Setuphold(fl) { this->refevp(refevp); this->dataevp(dataevp); diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 786eb321b..b9238c629 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -1383,16 +1383,16 @@ class WidthVisitor final : public VNVisitor { AstAssignW* newp = nullptr; if (nodep->delrefp() != nullptr) { - AstNodeVarRef* lhsp = nodep->delrefp()->varrefp()->cloneTreePure(false); + AstNodeVarRef* lhsp = VN_AS(nodep->delrefp()->cloneTreePure(false), VarRef); lhsp->access(VAccess::WRITE); - AstNodeVarRef* rhsp = nodep->refevp()->varrefp()->cloneTreePure(false); + AstNodeVarRef* rhsp = VN_AS(nodep->refevp()->cloneTreePure(false), VarRef); newp = new AstAssignW{flp, lhsp, rhsp}; } if (nodep->deldatap() != nullptr) { - AstNodeVarRef* lhsp = nodep->deldatap()->varrefp()->cloneTreePure(false); + AstNodeVarRef* lhsp = VN_AS(nodep->deldatap()->cloneTreePure(false), VarRef); lhsp->access(VAccess::WRITE); - AstNodeVarRef* rhsp = nodep->dataevp()->varrefp()->cloneTreePure(false); + AstNodeVarRef* rhsp = VN_AS(nodep->dataevp()->cloneTreePure(false), VarRef); if (newp == nullptr) { newp = new AstAssignW{flp, lhsp, rhsp}; diff --git a/src/verilog.y b/src/verilog.y index 38ccfa538..b5c85e234 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -5789,12 +5789,32 @@ system_timing_check: // ==IEEE: system_timing_check ; setuphold_timing_check: // ==IEEE: $setuphold_timing_check - yD_SETUPHOLD '(' senitem ',' senitem ',' expr ',' expr ')' ';' { $$ = nullptr; } - | yD_SETUPHOLD '(' senitem ',' senitem ',' expr ',' expr ',' idAnyE ')' ';' { $$ = nullptr; } - | yD_SETUPHOLD '(' senitem ',' senitem ',' expr ',' expr ',' idAnyE ',' minTypMaxE ')' ';' { $$ = nullptr; } - | yD_SETUPHOLD '(' senitem ',' senitem ',' expr ',' expr ',' idAnyE ',' minTypMaxE ',' minTypMaxE ')' ';' { $$ = nullptr; } - | yD_SETUPHOLD '(' senitem ',' senitem ',' expr ',' expr ',' idAnyE ',' minTypMaxE ',' minTypMaxE ',' senitemE ')' ';' { $$ = new AstSetuphold{$1, $3, $5, $17}; } - | yD_SETUPHOLD '(' senitem ',' senitem ',' expr ',' expr ',' idAnyE ',' minTypMaxE ',' minTypMaxE ',' senitemE ',' senitemE ')' ';' { $$ = new AstSetuphold{$1, $3, $5, $17, $19}; } + yD_SETUPHOLD '(' timing_check_event ',' timing_check_event ',' expr ',' expr ')' ';' { $$ = nullptr; } + | yD_SETUPHOLD '(' timing_check_event ',' timing_check_event ',' expr ',' expr ',' idAnyE ')' ';' { $$ = nullptr; } + | yD_SETUPHOLD '(' timing_check_event ',' timing_check_event ',' expr ',' expr ',' idAnyE ',' minTypMaxE ')' ';' { $$ = nullptr; } + | yD_SETUPHOLD '(' timing_check_event ',' timing_check_event ',' expr ',' expr ',' idAnyE ',' minTypMaxE ',' minTypMaxE ')' ';' { $$ = nullptr; } + | yD_SETUPHOLD '(' timing_check_event ',' timing_check_event ',' expr ',' expr ',' idAnyE ',' minTypMaxE ',' minTypMaxE ',' terminal_identifierE ')' ';' { $$ = new AstSetuphold{$1, $3, $5, $17}; } + | yD_SETUPHOLD '(' timing_check_event ',' timing_check_event ',' expr ',' expr ',' idAnyE ',' minTypMaxE ',' minTypMaxE ',' terminal_identifierE ',' terminal_identifierE ')' ';' { $$ = new AstSetuphold{$1, $3, $5, $17, $19}; } + ; + +timing_check_event: // ==IEEE: $timing_check_event + terminal_identifier { $$ = $1; } + | yPOSEDGE terminal_identifier { $$ = $2; } + | yNEGEDGE terminal_identifier { $$ = $2; } + | yEDGE terminal_identifier { $$ = $2; } + | terminal_identifier yP_ANDANDAND expr { $$ = $1; } + | yPOSEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } + | yNEGEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } + | yEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } + ; + +terminal_identifier: + id { $$ = new AstParseRef{$1, VParseRefExp::PX_TEXT, *$1, nullptr, nullptr}; } + ; + +terminal_identifierE: + /*empty*/ { $$ = nullptr; } + | terminal_identifier { $$ = $1; } ; idAnyE: @@ -5802,12 +5822,6 @@ idAnyE: | idAny { $$ = $1; } ; -senitemE: - /*empty*/ { $$ = nullptr; } - | senitem { $$ = $1; } - ; - - junkToSemiList: junkToSemi { } /* ignored */ | junkToSemiList junkToSemi { } /* ignored */