ff5107740a1364f0395a2e97654ec56e9aba2bbf
1 from functools
import singledispatch
4 from cocotb
.binary
import BinaryValue
6 from .c4m_jtag_svfgrammar
import *
8 def decodescanspec(node
):
9 length
= int(str(node
[2]))
10 fstr
= "{:0"+str(node
[2])+"b}"
20 tdi
= BinaryValue(fstr
.format(int(str(g_tdi
[2]),16)), length
)
25 tdo
= BinaryValue(fstr
.format(int(str(g_tdo
[3]),16)), length
)
30 mask
= BinaryValue(fstr
.format(int(str(g_mask
[3]),16)), length
)
35 smask
= BinaryValue(fstr
.format(int(str(g_smask
[3]),16)), length
)
37 return (length
, tdi
, tdo
, mask
, smask
)
40 class SVF_Executor(object):
42 def execute(self
, node
):
43 """This is the generic method"""
45 if False: # Make coroutine work
49 def _execute_NOP(self
, node
):
50 if False: # Make coroutine work
54 def _execute_EndDR(self
, node
):
55 self
._p
("EndDR ignored")
56 if False: # Make coroutine work
60 def _execute_EndIR(self
, node
):
61 self
._p
("EndIR ignored")
62 if False: # Make coroutine work
66 def _execute_Frequency(self
, node
):
67 self
._p
("Frequency ignored")
68 if False: # Make coroutine work
72 def _execute_HDR(self
, node
):
73 self
._p
("HDR ignored")
74 if False: # Make coroutine work
78 def _execute_HIR(self
, node
):
79 self
._p
("HIR ignored")
80 if False: # Make coroutine work
84 def _execute_SDR(self
, node
):
85 self
._p
("Executing SDR")
86 (length
, tdi
, tdo
, mask
, smask
) = decodescanspec(node
)
88 samelength
= length
== self
._d
_length
89 self
._d
_length
= length
93 raise(JTAGException("TDI needs to be specified when length of data changes"))
102 if smask
is not None:
103 self
._d
_smask
= smask
107 yield self
.master
.shift_data(self
._d
_tdi
)
109 if self
._d
_mask
is not None:
110 raise(JTAGException("MASK not supported for SDR"))
111 assert(self
.master
.result
== tdo
)
114 def _execute_SIR(self
, node
):
115 (length
, tdi
, tdo
, mask
, smask
) = decodescanspec(node
)
117 samelength
= length
== self
._i
_length
118 self
._i
_length
= length
122 raise(JTAGException("TDI needs to be specified when length of data changes"))
131 if smask
is not None:
132 self
._i
_smask
= smask
136 self
._p
("Executing SIR ({})".format(self
._i
_tdi
.integer
))
138 yield self
.master
.load_ir(self
._i
_tdi
)
140 if self
._i
_mask
is not None:
141 raise(JTAGException("MASK not supported for SIR"))
142 assert(self
.master
.result
== tdo
)
146 def _execute_State(self
, node
):
148 if False: # Make coroutine work
149 yield PythonTrigger()
152 def _execute_TDR(self
, node
):
154 if False: # Make coroutine work
155 yield PythonTrigger()
158 def _execute_TIR(self
, node
):
160 if False: # Make coroutine work
161 yield PythonTrigger()
164 def _execute_Trst(self
, node
):
165 self
._p
("TRST ignored")
166 if False: # Make coroutine work
167 yield PythonTrigger()
170 def _execute_Runtest(self
, node
):
171 if node
[1] is not None:
172 raise(JTAGException("State specification for RUNTEST not supported"))
173 # TODO: cycle the right number of clocks or wait the right time
174 yield(self
.master
.change_state([0]))
177 def _execute_SVFFile(self
, node
):
178 self
._p
("Executing SVFFile")
179 for statement
in node
.elements
[0]:
180 yield self
.execute(statement
)
182 def __init__(self
, master
):
183 # master is assumed to be a JTAG_Master class
184 # it needs to support methods load_ir() and shift_data()
187 # Due to bug in Grammar definition all possible classes have to have
188 # a dispatch entry otherwise an error will be raised.
189 self
.execute
= singledispatch(self
.execute
)
190 self
.execute
.register(EmptyLine
, self
._execute
_NOP
)
191 self
.execute
.register(Comment
, self
._execute
_NOP
)
192 self
.execute
.register(EndDR
, self
._execute
_EndDR
)
193 self
.execute
.register(EndIR
, self
._execute
_EndIR
)
194 self
.execute
.register(Frequency
, self
._execute
_Frequency
)
195 self
.execute
.register(HDR
, self
._execute
_HDR
)
196 self
.execute
.register(HIR
, self
._execute
_HIR
)
197 self
.execute
.register(Runtest
, self
._execute
_Runtest
)
198 self
.execute
.register(SDR
, self
._execute
_SDR
)
199 self
.execute
.register(SIR
, self
._execute
_SIR
)
200 self
.execute
.register(State
, self
._execute
_State
)
201 self
.execute
.register(TDR
, self
._execute
_TDR
)
202 self
.execute
.register(TIR
, self
._execute
_TIR
)
203 self
.execute
.register(Trst
, self
._execute
_Trst
)
204 self
.execute
.register(SVFFile
, self
._execute
_SVFFile
)
206 # Store the head and tail for the scan
207 self
._d
_tdi
= self
._d
_tdi
_h
= self
._d
_tdi
_t
= None
208 self
._d
_tdo
_h
= self
._d
_tdo
_t
= None
209 self
._i
_tdi
= self
._i
_tdi
_h
= self
._i
_tdi
_t
= None
210 self
._i
_tdo
_h
= self
._i
_tdo
_t
= None
212 # Remember the masks; smasks are ignored and bits always considered as care, e.g right
214 self
._d
_length
= self
._d
_length
_h
= self
._d
_length
_t
= None
215 self
._d
_mask
= self
._d
_mask
_h
= self
._d
_mask
_t
= None
216 self
._d
_smask
= self
._d
_smask
_h
= self
._d
_smask
_t
= None
217 self
._i
_length
= self
._i
_length
_h
= self
._i
_length
_t
= None
218 self
._i
_mask
= self
._i
_mask
_h
= self
._i
_mask
_t
= None
219 self
._i
_smask
= self
._i
_smask
_h
= self
._i
_smask
_t
= None
222 def run(self
, cmds
, p
=print):
224 if isinstance(cmds
, SVFFile
):
225 yield self
.execute(cmds
)
228 yield self
.execute(p
.parse_string(cmds
))