hdl.dsl: make referencing undefined FSM states an error.

Before this commit, doing something like:

    with m.FSM():
        with m.State("FOO"):
            m.next = "bAR"
        with m.State("BAR"):
            m.next = "FOO"

would silently create an empty state `bAR` and get stuck in it until
the module is reset. This was done intentionally (in Migen, this code
would in fact miscompile), but in retrospect was clearly a bad idea;
it turns typos into bugs, while in the rare case that branching to
a completely empty state is desired, it is trivial to define one.

Fixes #315.
This commit is contained in:
whitequark 2020-02-06 17:47:46 +00:00
parent 97cc78a3db
commit a1c58633e6
2 changed files with 13 additions and 2 deletions

View file

@ -582,12 +582,19 @@ class DSLTestCase(FHDLTestCase):
with m.FSM(domain="comb"):
pass
def test_FSM_wrong_undefined(self):
m = Module()
with self.assertRaises(NameError,
msg="FSM state 'FOO' is referenced but not defined"):
with m.FSM() as fsm:
fsm.ongoing("FOO")
def test_FSM_wrong_redefined(self):
m = Module()
with m.FSM():
with m.State("FOO"):
pass
with self.assertRaises(SyntaxError,
with self.assertRaises(NameError,
msg="FSM state 'FOO' is already defined"):
with m.State("FOO"):
pass