| #!/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('') | |