mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 13:29:12 +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('')
 | 
						|
 |