summaryrefslogtreecommitdiff
path: root/tests/tools/txt2tikztiming.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tools/txt2tikztiming.py')
-rwxr-xr-xtests/tools/txt2tikztiming.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/tests/tools/txt2tikztiming.py b/tests/tools/txt2tikztiming.py
new file mode 100755
index 00000000..cfefe339
--- /dev/null
+++ b/tests/tools/txt2tikztiming.py
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+
+from __future__ import division
+from __future__ import print_function
+
+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('')
+