[FSM]New builders for StateOp and TransitionOp. (#6991)

* [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.
This commit is contained in:
Jiahong Bi 2024-07-08 09:29:16 +02:00 committed by GitHub
parent 792f1fe54c
commit 499d1e9fb0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 10 deletions

View File

@ -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;
@ -301,8 +302,11 @@ def TransitionOp : FSMOp<"transition", [HasParent<"StateOp">, NoTerminator]> {
}];
let builders = [
OpBuilder<(ins "StringRef":$nextState)>,
OpBuilder<(ins "fsm::StateOp":$nextState)>
// OpBuilder<(ins "StringRef":$nextState)>,
OpBuilder<(ins "fsm::StateOp":$nextState)>,
OpBuilder<(ins "StringRef":$nextState,
CArg<"llvm::function_ref<void()>", "{}">:$guardCtor,
CArg<"llvm::function_ref<void()>", "{}">:$actionCtor)>
];
let skipDefaultBuilders = 1;

View File

@ -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<fsm::OutputOp>(state.location, outputs);
Region *transitions = state.addRegion();
transitions->push_back(new Block());
state.addAttribute("sym_name", builder.getStringAttr(stateName));
}
SetVector<StateOp> StateOp::getNextStates() {
SmallVector<StateOp> nextStates;
llvm::transform(
@ -402,16 +414,29 @@ LogicalResult OutputOp::verify() {
//===----------------------------------------------------------------------===//
void TransitionOp::build(OpBuilder &builder, OperationState &state,
StringRef nextState) {
state.addRegion(); // guard
state.addRegion(); // action
state.addAttribute("nextState",
FlatSymbolRefAttr::get(builder.getStringAttr(nextState)));
StateOp nextState) {
build(builder, state, nextState.getName());
}
void TransitionOp::build(OpBuilder &builder, OperationState &state,
StateOp nextState) {
build(builder, state, nextState.getName());
StringRef nextState,
llvm::function_ref<void()> guardCtor,
llvm::function_ref<void()> actionCtor) {
state.addAttribute("nextState",
FlatSymbolRefAttr::get(builder.getStringAttr(nextState)));
OpBuilder::InsertionGuard guard(builder);
Region *guardRegion = state.addRegion(); // guard
if (guardCtor) {
builder.createBlock(guardRegion);
guardCtor();
}
Region *actionRegion = state.addRegion(); // action
if (actionCtor) {
builder.createBlock(actionRegion);
actionCtor();
}
}
Block *TransitionOp::ensureGuard(OpBuilder &builder) {