diff options
-rw-r--r-- | tools/xsvf_tools/svf2xsvf.py | 32 | ||||
-rw-r--r-- | tools/xsvf_tools/xsvfdump.py | 15 |
2 files changed, 44 insertions, 3 deletions
diff --git a/tools/xsvf_tools/svf2xsvf.py b/tools/xsvf_tools/svf2xsvf.py index 20080db3..bf2a1209 100644 --- a/tools/xsvf_tools/svf2xsvf.py +++ b/tools/xsvf_tools/svf2xsvf.py @@ -57,6 +57,11 @@ outputFilename = sys.argv[2] doCOMMENTs = True # Save XCOMMENTs in the output xsvf file #doCOMMENTs = False # Save XCOMMENTs in the output xsvf file +# pick your file encoding +file_encoding = 'ISO-8859-1' +#file_encoding = 'utf-8' + + xrepeat = 0 # argument to XREPEAT, gives retry count for masked compares @@ -74,7 +79,8 @@ StateTxt = ("RESET","IDLE", (XCOMPLETE,XTDOMASK,XSIR,XSDR,XRUNTEST,hole0,hole1,XREPEAT,XSDRSIZE,XSDRTDO, XSETSDRMASKS,XSDRINC,XSDRB,XSDRC,XSDRE,XSDRTDOB,XSDRTDOC, - XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE,LCOUNT,LDELAY,LSDR) = range(28) + XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE, + LCOUNT,LDELAY,LSDR,XTRST) = range(29) #Note: LCOUNT, LDELAY, and LSDR are Lattice extensions to SVF and provide a way to loop back # and check a completion status, essentially waiting on a part until it signals that it is done. @@ -90,6 +96,8 @@ LSDR 1 TDI (0) TDO (1); """ +#XTRST is an opcode Xilinx seemed to have missed and it comes from the SVF TRST statement. + LineNumber = 1 def s_ident(scanner, token): return ("ident", token.upper(), LineNumber) @@ -127,8 +135,13 @@ scanner = re.Scanner([ re.MULTILINE ) +# open the file using the given encoding +file = open( sys.argv[1], encoding=file_encoding ) + # read all svf file input into string "input" -input = open( sys.argv[1] ).read() +input = file.read() + +file.close() # Lexer: # create a list of tuples containing (tokenType, tokenValue, LineNumber) @@ -368,6 +381,8 @@ run_state_allowed = ('IRPAUSE', 'DRPAUSE', 'RESET', 'IDLE') enddr_state_allowed = ('DRPAUSE', 'IDLE') endir_state_allowed = ('IRPAUSE', 'IDLE') +trst_mode_allowed = ('ON', 'OFF', 'Z', 'ABSENT') + enddr_state = IDLE endir_state = IDLE @@ -681,6 +696,19 @@ try: if tokVal != ';': raise ParseError( tokLn, tokVal, "Expecting ';' after FREQUENCY cycles HZ") + elif tokVal == 'TRST': + nextTok() + if tokVal not in trst_mode_allowed: + raise ParseError( tokLn, tokVal, "Expecting 'ON|OFF|Z|ABSENT' after TRST") + trst_mode = tokVal + nextTok() + if tokVal != ';': + raise ParseError( tokLn, tokVal, "Expecting ';' after TRST trst_mode") + obuf = bytearray( 2 ) + obuf[0] = XTRST + obuf[1] = trst_mode_allowed.index( trst_mode ) # use the index as the binary argument to XTRST opcode + output.write( obuf ) + else: raise ParseError( tokLn, tokVal, "Unknown token '%s'" % tokVal) diff --git a/tools/xsvf_tools/xsvfdump.py b/tools/xsvf_tools/xsvfdump.py index b2e3c7d7..e65f8d5b 100644 --- a/tools/xsvf_tools/xsvfdump.py +++ b/tools/xsvf_tools/xsvfdump.py @@ -39,7 +39,8 @@ Xsdrsize = 0 (XCOMPLETE,XTDOMASK,XSIR,XSDR,XRUNTEST,hole0,hole1,XREPEAT,XSDRSIZE,XSDRTDO, XSETSDRMASKS,XSDRINC,XSDRB,XSDRC,XSDRE,XSDRTDOB,XSDRTDOC, - XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE,LCOUNT,LDELAY,LSDR) = range(28) + XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE, + LCOUNT,LDELAY,LSDR,XTRST) = range(29) (RESET,IDLE, @@ -51,6 +52,10 @@ State = ("RESET","IDLE", "DRSELECT","DRCAPTURE","DRSHIFT","DREXIT1","DRPAUSE","DREXIT2","DRUPDATE", "IRSELECT","IRCAPTURE","IRSHIFT","IREXIT1","IRPAUSE","IREXIT2","IRUPDATE") + +trst_mode_allowed = ('ON', 'OFF', 'Z', 'ABSENT') + + Setsdrmasks = 0 SetsdrmasksOnesCount = 0 @@ -229,6 +234,14 @@ def ShowOpcode( op, f ): tdo = bytes2hexString( f, Xsdrsize ) print("LSDR 0x%s 0x%s" % (tdi, tdo) ) + elif op == XTRST: + # the argument is a single byte and it is the index into "trst_mode_allowed" + trst_mode = ReadByte(f) + if trst_mode <= 3: + print("TRST %s" % trst_mode_allowed[trst_mode] ) + else: + print("TRST 0x%02X" % trst_mode ); + else: print("UNKNOWN op 0x%02X %d" % (op, op)) exit(1) |