mirror of https://github.com/llvm/circt.git
[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:
parent
792f1fe54c
commit
499d1e9fb0
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue