Skip to content

Commit 49a8641

Browse files
committed
jtag: Refactor state change logic into a dict
1 parent 71f4514 commit 49a8641

1 file changed

Lines changed: 26 additions & 42 deletions

File tree

decoders/jtag/pd.py

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,30 @@
5050

5151
jtag_states = [s.value for s in St]
5252

53+
# jump table for JTAG state machine, 0 = TMS=0, 1 = TMS=1
54+
jtag_state_jumps = {
55+
# Intro "tree"
56+
St.TEST_LOGIC_RESET: [St.RUN_TEST_IDLE, St.TEST_LOGIC_RESET],
57+
St.RUN_TEST_IDLE: [St.RUN_TEST_IDLE, St.SELECT_DR_SCAN],
58+
# DR "tree"
59+
St.SELECT_DR_SCAN: [St.CAPTURE_DR, St.SELECT_IR_SCAN],
60+
St.CAPTURE_DR: [St.SHIFT_DR, St.EXIT1_DR],
61+
St.SHIFT_DR: [St.SHIFT_DR, St.EXIT1_DR],
62+
St.EXIT1_DR: [St.PAUSE_DR, St.UPDATE_DR],
63+
St.PAUSE_DR: [St.PAUSE_DR, St.EXIT2_DR],
64+
St.EXIT2_DR: [St.SHIFT_DR, St.UPDATE_DR],
65+
St.UPDATE_DR: [St.RUN_TEST_IDLE, St.SELECT_DR_SCAN],
66+
# IR "tree"
67+
St.SELECT_IR_SCAN: [St.CAPTURE_IR, St.TEST_LOGIC_RESET],
68+
St.CAPTURE_IR: [St.SHIFT_IR, St.EXIT1_IR],
69+
St.SHIFT_IR: [St.SHIFT_IR, St.EXIT1_IR],
70+
St.EXIT1_IR: [St.PAUSE_IR, St.UPDATE_IR],
71+
St.PAUSE_IR: [St.PAUSE_IR, St.EXIT2_IR],
72+
St.EXIT2_IR: [St.SHIFT_IR, St.UPDATE_IR],
73+
St.UPDATE_IR: [St.RUN_TEST_IDLE, St.SELECT_DR_SCAN],
74+
}
75+
76+
5377
class Decoder(srd.Decoder):
5478
api_version = 3
5579
id = 'jtag'
@@ -118,52 +142,12 @@ def putx_bs(self, data):
118142
def putp_bs(self, data):
119143
self.put(self.ss_bitstring, self.es_bitstring, self.out_python, data)
120144

121-
def advance_state_machine(self, tms):
122-
self.oldstate = self.state
123-
124-
# Intro "tree"
125-
if self.state == St.TEST_LOGIC_RESET:
126-
self.state = St.TEST_LOGIC_RESET if (tms) else St.RUN_TEST_IDLE
127-
elif self.state == St.RUN_TEST_IDLE:
128-
self.state = St.SELECT_DR_SCAN if (tms) else St.RUN_TEST_IDLE
129-
130-
# DR "tree"
131-
elif self.state == St.SELECT_DR_SCAN:
132-
self.state = St.SELECT_IR_SCAN if (tms) else St.CAPTURE_DR
133-
elif self.state == St.CAPTURE_DR:
134-
self.state = St.EXIT1_DR if (tms) else St.SHIFT_DR
135-
elif self.state == St.SHIFT_DR:
136-
self.state = St.EXIT1_DR if (tms) else St.SHIFT_DR
137-
elif self.state == St.EXIT1_DR:
138-
self.state = St.UPDATE_DR if (tms) else St.PAUSE_DR
139-
elif self.state == St.PAUSE_DR:
140-
self.state = St.EXIT2_DR if (tms) else St.PAUSE_DR
141-
elif self.state == St.EXIT2_DR:
142-
self.state = St.UPDATE_DR if (tms) else St.SHIFT_DR
143-
elif self.state == St.UPDATE_DR:
144-
self.state = St.SELECT_DR_SCAN if (tms) else St.RUN_TEST_IDLE
145-
146-
# IR "tree"
147-
elif self.state == St.SELECT_IR_SCAN:
148-
self.state = St.TEST_LOGIC_RESET if (tms) else St.CAPTURE_IR
149-
elif self.state == St.CAPTURE_IR:
150-
self.state = St.EXIT1_IR if (tms) else St.SHIFT_IR
151-
elif self.state == St.SHIFT_IR:
152-
self.state = St.EXIT1_IR if (tms) else St.SHIFT_IR
153-
elif self.state == St.EXIT1_IR:
154-
self.state = St.UPDATE_IR if (tms) else St.PAUSE_IR
155-
elif self.state == St.PAUSE_IR:
156-
self.state = St.EXIT2_IR if (tms) else St.PAUSE_IR
157-
elif self.state == St.EXIT2_IR:
158-
self.state = St.UPDATE_IR if (tms) else St.SHIFT_IR
159-
elif self.state == St.UPDATE_IR:
160-
self.state = St.SELECT_DR_SCAN if (tms) else St.RUN_TEST_IDLE
161-
162145
def handle_rising_tck_edge(self, pins):
163146
(tdi, tdo, tck, tms, trst, srst, rtck) = pins
164147

165148
# Rising TCK edges always advance the state machine.
166-
self.advance_state_machine(tms)
149+
self.oldstate = self.state
150+
self.state = jtag_state_jumps[self.state][tms]
167151

168152
if self.first:
169153
# Save the start sample and item for later (no output yet).

0 commit comments

Comments
 (0)