mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-20 14:20:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| import argparse
 | |
| import fileinput
 | |
| import sys
 | |
| 
 | |
| parser = argparse.ArgumentParser(description='Convert vcd2txt output to tikz-timing line.')
 | |
| parser.add_argument('filename', metavar='FILE', help='input txt file')
 | |
| parser.add_argument('signame', metavar='SIG', help='Signal name')
 | |
| parser.add_argument('-s', metavar='scale', default=1.0, type=float, help='Scale all time spans with this factor')
 | |
| parser.add_argument('-l', action='store_true', help='Logic signal (high/low)')
 | |
| parser.add_argument('-b', action='store_true', help='Display binary value')
 | |
| parser.add_argument('-x', action='store_true', help='Display hex value')
 | |
| parser.add_argument('-d', action='store_true', help='Display decimal value')
 | |
| args = parser.parse_args()
 | |
| 
 | |
| start_time = None
 | |
| stop_time = None
 | |
| time_val = { }
 | |
| 
 | |
| def value_to_logic(value):
 | |
|     found_x = False
 | |
|     for char in value:
 | |
|         if char == '1':
 | |
|             return "H"
 | |
|         if char == 'x':
 | |
|             found_x = True
 | |
|     return "U" if found_x else "L"
 | |
| 
 | |
| def value_to_binary(value):
 | |
|     return "D{%s}" % value
 | |
| 
 | |
| def value_to_hex(value):
 | |
|     hex_string = ""
 | |
|     found_def = False
 | |
|     while len(value) % 4 != 0:
 | |
|         value = "0" + value
 | |
|     while len(value) != 0:
 | |
|         bin_digits = value[0:4]
 | |
|         hex_digit = 0
 | |
|         value = value[4:]
 | |
|         for b in bin_digits:
 | |
|             if b == '0':
 | |
|                 hex_digit = hex_digit * 2
 | |
|             elif b == '1':
 | |
|                 hex_digit = hex_digit * 2 + 1
 | |
|             else:
 | |
|                 hex_digit += 100
 | |
|         if hex_digit > 15:
 | |
|             hex_string += "x"
 | |
|         else:
 | |
|             found_def = True
 | |
|             hex_string += "0123456789abcdef"[hex_digit]
 | |
|     if not found_def:
 | |
|         return "U";
 | |
|     return "D{%s}" % hex_string
 | |
| 
 | |
| def value_to_decimal(value):
 | |
|     val = 0
 | |
|     found_def = False
 | |
|     found_undef = False
 | |
|     for digit in value:
 | |
|         if digit == 'x':
 | |
|             found_undef = True
 | |
|         else:
 | |
|             val = val*2 + int(digit)
 | |
|             found_def = True
 | |
|     if found_def:
 | |
|         if found_undef:
 | |
|             return "D{X}"
 | |
|         else:
 | |
|             return "D{%d}" % val
 | |
|     return "U"
 | |
| 
 | |
| for line in fileinput.input(args.filename):
 | |
|     (node, time, name, value) = line.strip().split('\t')
 | |
|     time = int(time)
 | |
|     if start_time is None or start_time > time:
 | |
|         start_time = time
 | |
|     if stop_time is None or stop_time < time:
 | |
|         stop_time = time
 | |
|     if name == args.signame:
 | |
|         if args.l:
 | |
|             time_val[+time] = value_to_logic(value)
 | |
|         elif args.b:
 | |
|             time_val[+time] = value_to_binary(value)
 | |
|         elif args.x:
 | |
|             time_val[+time] = value_to_hex(value)
 | |
|         elif args.d:
 | |
|             time_val[+time] = value_to_decimal(value)
 | |
|         else:
 | |
|             time_val[+time] = value
 | |
| 
 | |
| if start_time not in time_val:
 | |
|     time_val[start_time] = "S"
 | |
| 
 | |
| last_time = None
 | |
| last_value = None
 | |
| for t in sorted(time_val.keys()):
 | |
|     if last_time is not None:
 | |
|         print("%f%s" % ((t - last_time)*args.s, last_value), end='')
 | |
|     (last_time, last_value) = (t, time_val[t])
 | |
| if last_time < stop_time:
 | |
|     print("%f%s" % ((stop_time - last_time)*args.s, last_value), end='')
 | |
| print('')
 | |
| 
 |