df5db165bcec84b5d962338138e17716fa1fd39a
[fw/openocd] / tools / xsvf_tools / xsvfdump.py
1 #!/usr/bin/python3.0\r
2 \r
3 # Copyright 2008, SoftPLC Corporation  http://softplc.com\r
4 # Dick Hollenbeck dick@softplc.com\r
5 \r
6 # This program is free software; you can redistribute it and/or\r
7 # modify it under the terms of the GNU General Public License\r
8 # as published by the Free Software Foundation; either version 2\r
9 # of the License, or (at your option) any later version.\r
10 #\r
11 # This program is distributed in the hope that it will be useful,\r
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14 # GNU General Public License for more details.\r
15 #\r
16 # You should have received a copy of the GNU General Public License\r
17 # along with this program; if not, you may find one here:\r
18 # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\r
19 # or you may search the http://www.gnu.org website for the version 2 license,\r
20 # or you may write to the Free Software Foundation, Inc.,\r
21 # 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
22 \r
23 # Dump an Xilinx XSVF file to stdout\r
24 \r
25 # This program is written for python 3.0, and it is not easy to change this\r
26 # back to 2.x.  You may find it easier to use python 3.x even if that means\r
27 # building it.\r
28 \r
29 \r
30 import sys\r
31 import struct\r
32 \r
33 \r
34 LABEL = "A script to dump an XSVF file to stdout"\r
35 \r
36 \r
37 Xsdrsize = 0\r
38 \r
39 \r
40 (XCOMPLETE,XTDOMASK,XSIR,XSDR,XRUNTEST,hole0,hole1,XREPEAT,XSDRSIZE,XSDRTDO,\r
41     XSETSDRMASKS,XSDRINC,XSDRB,XSDRC,XSDRE,XSDRTDOB,XSDRTDOC,\r
42     XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE,LCOUNT,LDELAY,LSDR) = range(28)\r
43 \r
44 \r
45 (RESET,IDLE,\r
46     DRSELECT,DRCAPTURE,DRSHIFT,DREXIT1,DRPAUSE,DREXIT2,DRUPDATE,\r
47     IRSELECT,IRCAPTURE,IRSHIFT,IREXIT1,IRPAUSE,IREXIT2,IRUPDATE) = range(16)\r
48 \r
49 \r
50 State = ("RESET","IDLE",\r
51     "DRSELECT","DRCAPTURE","DRSHIFT","DREXIT1","DRPAUSE","DREXIT2","DRUPDATE",\r
52     "IRSELECT","IRCAPTURE","IRSHIFT","IREXIT1","IRPAUSE","IREXIT2","IRUPDATE")\r
53 \r
54 Setsdrmasks = 0\r
55 SetsdrmasksOnesCount = 0\r
56 \r
57 def ReadSDRMASKS( f, len ):\r
58     global Setsdrmasks, SetsdrmasksOnesCount\r
59     byteCount = (len+7)//8\r
60     Setsdrmasks = f.read( byteCount )\r
61     ls = []\r
62     SetsdrmasksOnesCount = 0\r
63     for b in Setsdrmasks:\r
64         ls.append( "%x" % ((b & 0xf0) >> 4) )\r
65         ls.append( "%x" % ( b & 0x0f ) )\r
66         for i in range(8):\r
67             if b & (1<<i):\r
68                 SetsdrmasksOnesCount = SetsdrmasksOnesCount +1\r
69     return ''.join(ls)\r
70 \r
71 \r
72 def bytes2hexString( f, len ):\r
73     byteCount = (len+7)//8\r
74     bytebuf = f.read( byteCount )\r
75     ls = []\r
76     for b in bytebuf:\r
77         ls.append( "%x" % ((b & 0xf0) >> 4) )\r
78         ls.append( "%x" % ( b & 0x0f ) )\r
79     return ''.join(ls)\r
80 \r
81 \r
82 def ReadByte( f ):\r
83     """Read a byte from a file and return it as an int in least significant 8 bits"""\r
84     b = f.read(1)\r
85     if b:\r
86         return 0xff & b[0];\r
87     else:\r
88         return -1\r
89 \r
90 \r
91 def ShowState( state ):\r
92     """return the given state int as a state string"""\r
93     #return "0x%02x" % state # comment this out to get textual state form\r
94     global State\r
95     if 0 <= state <= IRUPDATE:\r
96         return State[state]\r
97     else:\r
98         return "Unknown state 0x%02x" % state\r
99 \r
100 \r
101 def ShowOpcode( op, f ):\r
102     """return the given byte as an opcode string"""\r
103     global Xsdrsize\r
104     if op == XCOMPLETE:\r
105         print("XCOMPLETE")\r
106 \r
107     elif op == XTDOMASK:\r
108         buf = bytes2hexString( f, Xsdrsize )\r
109         print("XTDOMASK 0x%s" % buf)\r
110 \r
111     elif op == XSIR:\r
112         len = ReadByte( f )\r
113         buf = bytes2hexString( f, len )\r
114         print("XSIR 0x%02X 0x%s" % (len, buf))\r
115 \r
116     elif op == XSDR:\r
117         tdi = bytes2hexString( f, Xsdrsize )\r
118         print("XSDR 0x%s" % tdi)\r
119 \r
120     elif op == XRUNTEST:\r
121         len = struct.unpack( '>i', f.read(4) )[0]\r
122         print("XRUNTEST 0x%08X" % len)\r
123 \r
124     elif op == XREPEAT:\r
125         len = ReadByte( f )\r
126         print("XREPEAT 0x%02X" % len)\r
127 \r
128     elif op == XSDRSIZE:\r
129         Xsdrsize = struct.unpack( '>i', f.read(4) )[0]\r
130         #print("XSDRSIZE 0x%08X" % Xsdrsize, file=sys.stderr )\r
131         print("XSDRSIZE 0x%08X %d" % (Xsdrsize, Xsdrsize) )\r
132 \r
133     elif op == XSDRTDO:\r
134         tdi = bytes2hexString( f, Xsdrsize )\r
135         tdo = bytes2hexString( f, Xsdrsize )\r
136         print("XSDRTDO 0x%s 0x%s" % (tdi, tdo) )\r
137 \r
138     elif op == XSETSDRMASKS:\r
139         addrmask = bytes2hexString( f, Xsdrsize )\r
140         datamask = ReadSDRMASKS( f, Xsdrsize )\r
141         print("XSETSDRMASKS 0x%s 0x%s" % (addrmask, datamask) )\r
142 \r
143     elif op == XSDRINC:\r
144         startaddr = bytes2hexString( f, Xsdrsize )\r
145         len = ReadByte(f)\r
146         print("XSDRINC 0x%s 0x%02X" % (startaddr, len), end='' )\r
147         for numTimes in range(len):\r
148             data = bytes2hexString( f, SetsdrmasksOnesCount)\r
149             print(" 0x%s" % data )\r
150         print() # newline\r
151 \r
152     elif op == XSDRB:\r
153         tdi = bytes2hexString( f, Xsdrsize )\r
154         print("XSDRB 0x%s" % tdi )\r
155 \r
156     elif op == XSDRC:\r
157         tdi = bytes2hexString( f, Xsdrsize )\r
158         print("XSDRC 0x%s" % tdi )\r
159 \r
160     elif op == XSDRE:\r
161         tdi = bytes2hexString( f, Xsdrsize )\r
162         print("XSDRE 0x%s" % tdi )\r
163 \r
164     elif op == XSDRTDOB:\r
165         tdo = bytes2hexString( f, Xsdrsize )\r
166         print("XSDRTDOB 0x%s" % tdo )\r
167 \r
168     elif op == XSDRTDOC:\r
169         tdi = bytes2hexString( f, Xsdrsize )\r
170         tdo = bytes2hexString( f, Xsdrsize )\r
171         print("XSDRTDOC 0x%s 0x%s" % (tdi, tdo) )\r
172 \r
173     elif op == XSDRTDOE:\r
174         tdi = bytes2hexString( f, Xsdrsize )\r
175         tdo = bytes2hexString( f, Xsdrsize )\r
176         print("XSDRTDOE 0x%s 0x%s" % (tdi, tdo) )\r
177 \r
178     elif op == XSTATE:\r
179         b = ReadByte(f)\r
180         print("XSTATE %s" % ShowState(b))\r
181 \r
182     elif op == XENDIR:\r
183         b = ReadByte( f )\r
184         print("XENDIR %s" % ShowState(b))\r
185 \r
186     elif op == XENDDR:\r
187         b = ReadByte( f )\r
188         print("XENDDR %s" % ShowState(b))\r
189 \r
190     elif op == XSIR2:\r
191         len = struct.unpack( '>H', f.read(2) )[0]\r
192         buf = bytes2hexString( f, len )\r
193         print("XSIR2 0x%04X 0x%s" % (len, buf))\r
194 \r
195     elif op == XCOMMENT:\r
196         cmt = []\r
197         while 1:\r
198             b = ReadByte(f)\r
199             if b == 0:          # terminating nul\r
200                 break;\r
201             cmt.append( chr(b) )\r
202         print("XCOMMENT \"%s\"" % ''.join(cmt)  )\r
203 \r
204     elif op == XWAIT:\r
205         run_state = ReadByte(f)\r
206         end_state = ReadByte(f)\r
207         useconds  = struct.unpack( '>i', f.read(4) )[0]\r
208         print("XWAIT %s %s" % (ShowState(run_state), ShowState(end_state)), useconds)\r
209 \r
210     elif op == XWAITSTATE:\r
211         run_state = ReadByte(f)\r
212         end_state = ReadByte(f)\r
213         clocks    = struct.unpack( '>i', f.read(4) )[0]\r
214         useconds  = struct.unpack( '>i', f.read(4) )[0]\r
215         print("XWAITSTATE %s %s CLOCKS=%d USECS=%d" % (ShowState(run_state), ShowState(end_state), clocks, useconds) )\r
216 \r
217     elif op == LCOUNT:\r
218         loop_count = struct.unpack( '>i', f.read(4) )[0]\r
219         print("LCOUNT", loop_count )\r
220 \r
221     elif op == LDELAY:\r
222         run_state = ReadByte(f)\r
223         clocks    = struct.unpack( '>i', f.read(4) )[0]\r
224         useconds  = struct.unpack( '>i', f.read(4) )[0]\r
225         print("LDELAY %s CLOCKS=%d USECS=%d" % (ShowState(run_state), clocks, useconds) )\r
226 \r
227     elif op == LSDR:\r
228         tdi = bytes2hexString( f, Xsdrsize )\r
229         tdo = bytes2hexString( f, Xsdrsize )\r
230         print("LSDR 0x%s 0x%s" % (tdi, tdo) )\r
231 \r
232     else:\r
233         print("UNKNOWN op 0x%02X %d" % (op, op))\r
234         exit(1)\r
235 \r
236 \r
237 def main():\r
238 \r
239     if len( sys.argv ) < 2:\r
240         print("usage %s <xsvf_filename>" % sys.argv[0])\r
241         exit(1)\r
242 \r
243     f = open( sys.argv[1], 'rb' )\r
244 \r
245     opcode = ReadByte( f )\r
246     while opcode != -1:\r
247         # print the position within the file, then the command\r
248         print( "%d: " % f.tell(), end='' )\r
249         ShowOpcode( opcode, f )\r
250         opcode = ReadByte(f)\r
251 \r
252 \r
253 if __name__ == "__main__":\r
254     main()\r
255 \r