build.run: implement SSH remote builds using Paramiko.
[nmigen.git] / nmigen / test / compat / test_fsm.py
1 import unittest
2 from itertools import count
3
4 from ...compat import *
5 from ...compat.genlib.fsm import FSM
6
7 from .support import SimCase
8
9
10 class FSMCase(SimCase, unittest.TestCase):
11 class TestBench(Module):
12 def __init__(self):
13 self.ctrl = Signal()
14 self.data = Signal()
15 self.status = Signal(8)
16
17 self.submodules.dut = FSM()
18 self.dut.act("IDLE",
19 If(self.ctrl,
20 NextState("START")
21 )
22 )
23 self.dut.act("START",
24 If(self.data,
25 NextState("SET-STATUS-LOW")
26 ).Else(
27 NextState("SET-STATUS")
28 )
29 )
30 self.dut.act("SET-STATUS",
31 NextValue(self.status, 0xaa),
32 NextState("IDLE")
33 )
34 self.dut.act("SET-STATUS-LOW",
35 NextValue(self.status[:4], 0xb),
36 NextState("IDLE")
37 )
38
39 def assertState(self, fsm, state):
40 self.assertEqual(fsm.decoding[(yield fsm.state)], state)
41
42 def test_next_state(self):
43 def gen():
44 yield from self.assertState(self.tb.dut, "IDLE")
45 yield
46 yield from self.assertState(self.tb.dut, "IDLE")
47 yield self.tb.ctrl.eq(1)
48 yield
49 yield from self.assertState(self.tb.dut, "IDLE")
50 yield self.tb.ctrl.eq(0)
51 yield
52 yield from self.assertState(self.tb.dut, "START")
53 yield
54 yield from self.assertState(self.tb.dut, "SET-STATUS")
55 yield self.tb.ctrl.eq(1)
56 yield
57 yield from self.assertState(self.tb.dut, "IDLE")
58 yield self.tb.ctrl.eq(0)
59 yield self.tb.data.eq(1)
60 yield
61 yield from self.assertState(self.tb.dut, "START")
62 yield self.tb.data.eq(0)
63 yield
64 yield from self.assertState(self.tb.dut, "SET-STATUS-LOW")
65 self.run_with(gen())
66
67 def test_next_value(self):
68 def gen():
69 self.assertEqual((yield self.tb.status), 0x00)
70 yield self.tb.ctrl.eq(1)
71 yield
72 yield self.tb.ctrl.eq(0)
73 yield
74 yield
75 yield from self.assertState(self.tb.dut, "SET-STATUS")
76 yield self.tb.ctrl.eq(1)
77 yield
78 self.assertEqual((yield self.tb.status), 0xaa)
79 yield self.tb.ctrl.eq(0)
80 yield self.tb.data.eq(1)
81 yield
82 yield self.tb.data.eq(0)
83 yield
84 yield from self.assertState(self.tb.dut, "SET-STATUS-LOW")
85 yield
86 self.assertEqual((yield self.tb.status), 0xab)
87 self.run_with(gen())