From a365061a8ca456058d1aa4fb51892e15d136f167 Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Fri, 3 May 2024 17:45:26 +0200 Subject: [PATCH 01/10] [FSM]New Builders for StateOp and TransitionOp 1. Create an OutputOp inside a StateOp with the output values instead of an empty OutputOp, which needs to be erased after all. 2. Accept two functions as arguments to create the TransitionOp, which is similar to the creation of sv::IfOp. This would be helpful because one doesn't have to create the blocks and set the insertion point manually, which may cause errors sometime. --- include/circt/Dialect/FSM/FSMOps.td | 8 +++++-- lib/Dialect/FSM/FSMOps.cpp | 33 ++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/include/circt/Dialect/FSM/FSMOps.td b/include/circt/Dialect/FSM/FSMOps.td index d1dd516cd618..9992a8a326f1 100644 --- a/include/circt/Dialect/FSM/FSMOps.td +++ b/include/circt/Dialect/FSM/FSMOps.td @@ -222,7 +222,8 @@ def StateOp : FSMOp<"state", [HasParent<"MachineOp">, Symbol, NoTerminator]> { }]; let builders = [ - OpBuilder<(ins "StringRef":$stateName)> + OpBuilder<(ins "StringRef":$stateName)>, + OpBuilder<(ins "StringRef":$stateName, "ValueRange":$outputs)> ]; let skipDefaultBuilders = 1; @@ -302,7 +303,10 @@ def TransitionOp : FSMOp<"transition", [HasParent<"StateOp">, NoTerminator]> { let builders = [ OpBuilder<(ins "StringRef":$nextState)>, - OpBuilder<(ins "fsm::StateOp":$nextState)> + // OpBuilder<(ins "fsm::StateOp":$nextState)>, + OpBuilder<(ins "fsm::StateOp":$nextState, + CArg<"std::function", "{}">:$guardCtor, + CArg<"std::function", "{}">:$actionCtor)> ]; let skipDefaultBuilders = 1; diff --git a/lib/Dialect/FSM/FSMOps.cpp b/lib/Dialect/FSM/FSMOps.cpp index 0cb42ce4aec6..c51498b4c972 100644 --- a/lib/Dialect/FSM/FSMOps.cpp +++ b/lib/Dialect/FSM/FSMOps.cpp @@ -321,6 +321,18 @@ void StateOp::build(OpBuilder &builder, OperationState &state, state.addAttribute("sym_name", builder.getStringAttr(stateName)); } +void StateOp::build(OpBuilder &builder, OperationState &state, + StringRef stateName, ValueRange outputs) { + OpBuilder::InsertionGuard guard(builder); + Region *output = state.addRegion(); + output->push_back(new Block()); + builder.setInsertionPointToEnd(&output->back()); + builder.create(state.location, outputs); + Region *transitions = state.addRegion(); + transitions->push_back(new Block()); + state.addAttribute("sym_name", builder.getStringAttr(stateName)); +} + SetVector StateOp::getNextStates() { SmallVector nextStates; llvm::transform( @@ -409,9 +421,28 @@ void TransitionOp::build(OpBuilder &builder, OperationState &state, FlatSymbolRefAttr::get(builder.getStringAttr(nextState))); } +// void TransitionOp::build(OpBuilder &builder, OperationState &state, +// StateOp nextState) { +// build(builder, state, nextState.getName()); +// } + void TransitionOp::build(OpBuilder &builder, OperationState &state, - StateOp nextState) { + StateOp nextState, std::function guardCtor, + std::function actionCtor) { build(builder, state, nextState.getName()); + OpBuilder::InsertionGuard guard(builder); + + Region *guardRegion = state.addRegion(); // guard + if (guardCtor) { + builder.createBlock(guardRegion); + guardCtor(); + } + + Region *actionRegion = state.addRegion(); // guard + if (actionCtor) { + builder.createBlock(actionRegion); + actionCtor(); + } } Block *TransitionOp::ensureGuard(OpBuilder &builder) { From 0f0915540bdb869c617776e92a612f429944062e Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Mon, 6 May 2024 13:50:39 +0200 Subject: [PATCH 02/10] [SV]Print empty block for CaseOp. --- lib/Dialect/SV/SVOps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Dialect/SV/SVOps.cpp b/lib/Dialect/SV/SVOps.cpp index d0b2393a4e6e..10f09a4880a6 100644 --- a/lib/Dialect/SV/SVOps.cpp +++ b/lib/Dialect/SV/SVOps.cpp @@ -979,7 +979,7 @@ void CaseOp::print(OpAsmPrinter &p) { p << ": "; p.printRegion(*caseInfo.block->getParent(), /*printEntryBlockArgs=*/false, - /*printBlockTerminators=*/true); + /*printBlockTerminators=*/true, /*printEmptyBlock*/true); } } From 5ff5843ffa9616e19f8637965d66ac1e619a0401 Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Mon, 6 May 2024 14:10:59 +0200 Subject: [PATCH 03/10] [FSM]Change the builders of TransitionOp. --- include/circt/Dialect/FSM/FSMOps.td | 6 +++--- lib/Dialect/FSM/FSMOps.cpp | 25 +++++++++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/include/circt/Dialect/FSM/FSMOps.td b/include/circt/Dialect/FSM/FSMOps.td index 9992a8a326f1..5afc9d31a95c 100644 --- a/include/circt/Dialect/FSM/FSMOps.td +++ b/include/circt/Dialect/FSM/FSMOps.td @@ -302,9 +302,9 @@ def TransitionOp : FSMOp<"transition", [HasParent<"StateOp">, NoTerminator]> { }]; let builders = [ - OpBuilder<(ins "StringRef":$nextState)>, - // OpBuilder<(ins "fsm::StateOp":$nextState)>, - OpBuilder<(ins "fsm::StateOp":$nextState, + // OpBuilder<(ins "StringRef":$nextState)>, + OpBuilder<(ins "fsm::StateOp":$nextState)>, + OpBuilder<(ins "StringRef":$nextState, CArg<"std::function", "{}">:$guardCtor, CArg<"std::function", "{}">:$actionCtor)> ]; diff --git a/lib/Dialect/FSM/FSMOps.cpp b/lib/Dialect/FSM/FSMOps.cpp index c51498b4c972..8880810e5c60 100644 --- a/lib/Dialect/FSM/FSMOps.cpp +++ b/lib/Dialect/FSM/FSMOps.cpp @@ -413,23 +413,24 @@ LogicalResult OutputOp::verify() { // TransitionOp //===----------------------------------------------------------------------===// -void TransitionOp::build(OpBuilder &builder, OperationState &state, - StringRef nextState) { - state.addRegion(); // guard - state.addRegion(); // action - state.addAttribute("nextState", - FlatSymbolRefAttr::get(builder.getStringAttr(nextState))); -} - // void TransitionOp::build(OpBuilder &builder, OperationState &state, -// StateOp nextState) { -// build(builder, state, nextState.getName()); +// StringRef nextState) { +// state.addRegion(); // guard +// state.addRegion(); // action +// state.addAttribute("nextState", +// FlatSymbolRefAttr::get(builder.getStringAttr(nextState))); // } void TransitionOp::build(OpBuilder &builder, OperationState &state, - StateOp nextState, std::function guardCtor, - std::function actionCtor) { + StateOp nextState) { build(builder, state, nextState.getName()); +} + +void TransitionOp::build(OpBuilder &builder, OperationState &state, + StringRef nextState, std::function guardCtor, + std::function actionCtor) { + state.addAttribute("nextState", + FlatSymbolRefAttr::get(builder.getStringAttr(nextState))); OpBuilder::InsertionGuard guard(builder); Region *guardRegion = state.addRegion(); // guard From 484259d268849c99123d5e4783387e65a94678bf Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Mon, 6 May 2024 16:42:29 +0200 Subject: [PATCH 04/10] Fix sanity check. --- lib/Dialect/SV/SVOps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Dialect/SV/SVOps.cpp b/lib/Dialect/SV/SVOps.cpp index 10f09a4880a6..5d8fea342066 100644 --- a/lib/Dialect/SV/SVOps.cpp +++ b/lib/Dialect/SV/SVOps.cpp @@ -979,7 +979,7 @@ void CaseOp::print(OpAsmPrinter &p) { p << ": "; p.printRegion(*caseInfo.block->getParent(), /*printEntryBlockArgs=*/false, - /*printBlockTerminators=*/true, /*printEmptyBlock*/true); + /*printBlockTerminators=*/true, /*printEmptyBlock=*/true); } } From a2fdf1cda6c9832e8f16856498ebcef31028f0d0 Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Mon, 6 May 2024 17:09:06 +0200 Subject: [PATCH 05/10] [SV]Undo the previous commit. --- lib/Dialect/SV/SVOps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Dialect/SV/SVOps.cpp b/lib/Dialect/SV/SVOps.cpp index 5d8fea342066..d0b2393a4e6e 100644 --- a/lib/Dialect/SV/SVOps.cpp +++ b/lib/Dialect/SV/SVOps.cpp @@ -979,7 +979,7 @@ void CaseOp::print(OpAsmPrinter &p) { p << ": "; p.printRegion(*caseInfo.block->getParent(), /*printEntryBlockArgs=*/false, - /*printBlockTerminators=*/true, /*printEmptyBlock=*/true); + /*printBlockTerminators=*/true); } } From 55d92b5ed30566cc0c27781b9c0e43d6b08cdc09 Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Mon, 6 May 2024 17:34:21 +0200 Subject: [PATCH 06/10] Fix clang-tidy problems. --- include/circt/Dialect/FSM/FSMOps.td | 4 ++-- lib/Dialect/FSM/FSMOps.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/circt/Dialect/FSM/FSMOps.td b/include/circt/Dialect/FSM/FSMOps.td index 5afc9d31a95c..3a75c398e966 100644 --- a/include/circt/Dialect/FSM/FSMOps.td +++ b/include/circt/Dialect/FSM/FSMOps.td @@ -305,8 +305,8 @@ def TransitionOp : FSMOp<"transition", [HasParent<"StateOp">, NoTerminator]> { // OpBuilder<(ins "StringRef":$nextState)>, OpBuilder<(ins "fsm::StateOp":$nextState)>, OpBuilder<(ins "StringRef":$nextState, - CArg<"std::function", "{}">:$guardCtor, - CArg<"std::function", "{}">:$actionCtor)> + CArg<"const std::function&", "{}">:$guardCtor, + CArg<"const std::function&", "{}">:$actionCtor)> ]; let skipDefaultBuilders = 1; diff --git a/lib/Dialect/FSM/FSMOps.cpp b/lib/Dialect/FSM/FSMOps.cpp index 8880810e5c60..034f52fb6306 100644 --- a/lib/Dialect/FSM/FSMOps.cpp +++ b/lib/Dialect/FSM/FSMOps.cpp @@ -427,8 +427,8 @@ void TransitionOp::build(OpBuilder &builder, OperationState &state, } void TransitionOp::build(OpBuilder &builder, OperationState &state, - StringRef nextState, std::function guardCtor, - std::function actionCtor) { + StringRef nextState, const std::function& guardCtor, + const std::function& actionCtor) { state.addAttribute("nextState", FlatSymbolRefAttr::get(builder.getStringAttr(nextState))); OpBuilder::InsertionGuard guard(builder); From e4b0f936966642e138bd591d31baa601d3c11a31 Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Mon, 6 May 2024 17:39:32 +0200 Subject: [PATCH 07/10] Fix clang-format. --- lib/Dialect/FSM/FSMOps.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Dialect/FSM/FSMOps.cpp b/lib/Dialect/FSM/FSMOps.cpp index 034f52fb6306..556087a40ae6 100644 --- a/lib/Dialect/FSM/FSMOps.cpp +++ b/lib/Dialect/FSM/FSMOps.cpp @@ -427,8 +427,9 @@ void TransitionOp::build(OpBuilder &builder, OperationState &state, } void TransitionOp::build(OpBuilder &builder, OperationState &state, - StringRef nextState, const std::function& guardCtor, - const std::function& actionCtor) { + StringRef nextState, + const std::function &guardCtor, + const std::function &actionCtor) { state.addAttribute("nextState", FlatSymbolRefAttr::get(builder.getStringAttr(nextState))); OpBuilder::InsertionGuard guard(builder); From edbc914fbd0e86b24915e416a6f7d354dfab1f83 Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Fri, 24 May 2024 12:46:39 +0200 Subject: [PATCH 08/10] stupid commit --- llvm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm b/llvm index 7c5c8b2f479f..b52160dbae26 160000 --- a/llvm +++ b/llvm @@ -1 +1 @@ -Subproject commit 7c5c8b2f479fbed6afcd4072bdef76ea867577de +Subproject commit b52160dbae268cc87cb8f6cdf75553ca095e26a9 From 41d2858977f2e8d4f67b0689ebb63496b2c9626f Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Fri, 24 May 2024 12:59:46 +0200 Subject: [PATCH 09/10] stupid commit --- llvm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm b/llvm index b52160dbae26..7c5c8b2f479f 160000 --- a/llvm +++ b/llvm @@ -1 +1 @@ -Subproject commit b52160dbae268cc87cb8f6cdf75553ca095e26a9 +Subproject commit 7c5c8b2f479fbed6afcd4072bdef76ea867577de From 886a0045bcab64d3850c498ad133b0966d72b84d Mon Sep 17 00:00:00 2001 From: HahaLan97 Date: Mon, 3 Jun 2024 11:48:13 +0200 Subject: [PATCH 10/10] Clean up and update. --- include/circt/Dialect/FSM/FSMOps.td | 4 ++-- lib/Dialect/FSM/FSMOps.cpp | 14 +++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/include/circt/Dialect/FSM/FSMOps.td b/include/circt/Dialect/FSM/FSMOps.td index 3a75c398e966..6d52ac4c2c51 100644 --- a/include/circt/Dialect/FSM/FSMOps.td +++ b/include/circt/Dialect/FSM/FSMOps.td @@ -305,8 +305,8 @@ def TransitionOp : FSMOp<"transition", [HasParent<"StateOp">, NoTerminator]> { // OpBuilder<(ins "StringRef":$nextState)>, OpBuilder<(ins "fsm::StateOp":$nextState)>, OpBuilder<(ins "StringRef":$nextState, - CArg<"const std::function&", "{}">:$guardCtor, - CArg<"const std::function&", "{}">:$actionCtor)> + CArg<"llvm::function_ref", "{}">:$guardCtor, + CArg<"llvm::function_ref", "{}">:$actionCtor)> ]; let skipDefaultBuilders = 1; diff --git a/lib/Dialect/FSM/FSMOps.cpp b/lib/Dialect/FSM/FSMOps.cpp index 556087a40ae6..0045d48953e2 100644 --- a/lib/Dialect/FSM/FSMOps.cpp +++ b/lib/Dialect/FSM/FSMOps.cpp @@ -413,14 +413,6 @@ LogicalResult OutputOp::verify() { // TransitionOp //===----------------------------------------------------------------------===// -// void TransitionOp::build(OpBuilder &builder, OperationState &state, -// StringRef nextState) { -// state.addRegion(); // guard -// state.addRegion(); // action -// state.addAttribute("nextState", -// FlatSymbolRefAttr::get(builder.getStringAttr(nextState))); -// } - void TransitionOp::build(OpBuilder &builder, OperationState &state, StateOp nextState) { build(builder, state, nextState.getName()); @@ -428,8 +420,8 @@ void TransitionOp::build(OpBuilder &builder, OperationState &state, void TransitionOp::build(OpBuilder &builder, OperationState &state, StringRef nextState, - const std::function &guardCtor, - const std::function &actionCtor) { + llvm::function_ref guardCtor, + llvm::function_ref actionCtor) { state.addAttribute("nextState", FlatSymbolRefAttr::get(builder.getStringAttr(nextState))); OpBuilder::InsertionGuard guard(builder); @@ -440,7 +432,7 @@ void TransitionOp::build(OpBuilder &builder, OperationState &state, guardCtor(); } - Region *actionRegion = state.addRegion(); // guard + Region *actionRegion = state.addRegion(); // action if (actionCtor) { builder.createBlock(actionRegion); actionCtor();