-
Notifications
You must be signed in to change notification settings - Fork 2
/
jtag_fsm_compute.py
89 lines (75 loc) · 2.8 KB
/
jtag_fsm_compute.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from enum import Enum, auto
class JTAGState(Enum):
TestLogicReset = auto()
RunTestIdle = auto()
SelectDR = auto()
CaptureDR = auto()
ShiftDR = auto()
Exit1DR = auto()
PauseDR = auto()
Exit2DR = auto()
UpdateDR = auto()
SelectIR = auto()
CaptureIR = auto()
ShiftIR = auto()
Exit1IR = auto()
PauseIR = auto()
Exit2IR = auto()
UpdateIR = auto()
STATE_TRANSITIONS = {
# TMS = 0 TMS = 1
JTAGState.TestLogicReset: (JTAGState.RunTestIdle, JTAGState.TestLogicReset),
JTAGState.RunTestIdle: (JTAGState.RunTestIdle, JTAGState.SelectDR),
JTAGState.SelectDR: (JTAGState.CaptureDR, JTAGState.SelectIR),
JTAGState.CaptureDR: (JTAGState.ShiftDR, JTAGState.Exit1DR),
JTAGState.ShiftDR: (JTAGState.ShiftDR, JTAGState.Exit1DR),
JTAGState.Exit1DR: (JTAGState.PauseDR, JTAGState.UpdateDR),
JTAGState.PauseDR: (JTAGState.PauseDR, JTAGState.Exit2DR),
JTAGState.Exit2DR: (JTAGState.ShiftDR, JTAGState.UpdateDR),
JTAGState.UpdateDR: (JTAGState.RunTestIdle, JTAGState.SelectDR),
JTAGState.SelectIR: (JTAGState.CaptureIR, JTAGState.TestLogicReset),
JTAGState.CaptureIR: (JTAGState.ShiftIR, JTAGState.Exit1IR),
JTAGState.ShiftIR: (JTAGState.ShiftIR, JTAGState.Exit1IR),
JTAGState.Exit1IR: (JTAGState.PauseIR, JTAGState.UpdateIR),
JTAGState.PauseIR: (JTAGState.PauseIR, JTAGState.Exit2IR),
JTAGState.Exit2IR: (JTAGState.ShiftIR, JTAGState.UpdateIR),
JTAGState.UpdateIR: (JTAGState.RunTestIdle, JTAGState.SelectDR),
}
def search(start, end):
if start == end:
return []
q = [(start, [])]
# print(q)
while q:
(state, path) = q.pop(0)
c0 = STATE_TRANSITIONS[state][0]
c1 = STATE_TRANSITIONS[state][1]
# print(state, c0, c1)
if c0 == end:
return path + [False]
if c1 == end:
return path + [True]
q.append((c0, path + [False]))
q.append((c1, path + [True]))
# print(q)
print("pub fn path_to(self: &JTAGState, end: JTAGState) -> &'static BitSlice {")
print("match self {")
for start in JTAGState:
print(f"JTAGState::{start._name_} => {{")
print("match end {")
for end in JTAGState:
print(f"JTAGState::{end._name_} => {{")
path = search(start, end)
# print(start, end, path)
print("bits![static ")
for pathelem in path:
if pathelem:
print("1,")
else:
print("0,")
print("]")
print("}")
print("}")
print("}")
print("}")
print("}")