OpenFPGA/yosys/tests/tools/txt2tikztiming.py

107 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('')