diff --git a/lib/rohd_hcl.dart b/lib/rohd_hcl.dart index f6f165353..d000d0b06 100644 --- a/lib/rohd_hcl.dart +++ b/lib/rohd_hcl.dart @@ -15,6 +15,7 @@ export 'src/extrema.dart'; export 'src/fifo.dart'; export 'src/find.dart'; export 'src/find_pattern.dart'; +export 'src/finite_state_machine_with_updates.dart'; export 'src/gaskets/spi/spi_gaskets.dart'; export 'src/interfaces/interfaces.dart'; export 'src/memory/memories.dart'; diff --git a/lib/src/finite_state_machine_with_updates.dart b/lib/src/finite_state_machine_with_updates.dart new file mode 100644 index 000000000..beff6574f --- /dev/null +++ b/lib/src/finite_state_machine_with_updates.dart @@ -0,0 +1,57 @@ +import 'package:rohd/rohd.dart'; + +class StateWithUpdates extends State { + List updates; + StateWithUpdates(super.identifier, + {required super.events, required super.actions, this.updates = const []}); +} + +class FiniteStateMachineWithUpdates + extends FiniteStateMachine { + final Map updateResetValues; + + FiniteStateMachineWithUpdates( + Logic clk, + Logic reset, + StateIdentifier resetState, + List> states, { + bool asyncReset = false, + List setupActions = const [], + Map updateResetValues = const {}, + }) : this.multi([clk], reset, resetState, states, + asyncReset: asyncReset, + setupActions: setupActions, + updateResetValues: updateResetValues); + + FiniteStateMachineWithUpdates.multi(List clks, Logic reset, + StateIdentifier resetState, List> states, + {super.asyncReset, super.setupActions, this.updateResetValues = const {}}) + : super.multi( + clks, + reset, + resetState, + states, + ) { + Sequential.multi( + clks, + reset: reset, + asyncReset: asyncReset, + resetValues: updateResetValues, + [ + Case( + currentState, + states + .whereType>() + .map( + (state) => CaseItem( + label: state.identifier.toString(), + Const(stateIndexLookup[state.identifier], width: stateWidth) + .named(state.identifier.toString()), + state.updates, + ), + ) + .toList(growable: false)) + ], + ); + } +} diff --git a/test/fsm_with_updates_test.dart b/test/fsm_with_updates_test.dart new file mode 100644 index 000000000..e692a6420 --- /dev/null +++ b/test/fsm_with_updates_test.dart @@ -0,0 +1,42 @@ +import 'package:rohd/rohd.dart'; +import 'package:rohd_hcl/src/finite_state_machine_with_updates.dart'; +import 'package:test/test.dart'; + +enum ExStates { + state1, + state2, +} + +class ExMod extends Module { + ExMod(Logic clk) { + clk = addInput('clk', clk); + + FiniteStateMachineWithUpdates( + clk, + Logic(), + ExStates.state1, + [ + StateWithUpdates( + ExStates.state1, + events: {}, + actions: [], + updates: [Logic() < 1], + ), + StateWithUpdates( + ExStates.state2, + events: {}, + actions: [], + ), + ], + ); + } +} + +void main() { + test('basic', () async { + final dut = ExMod(Logic()); + await dut.build(); + + print(dut.generateSynth()); + }); +}