/* * Copyright (c) 2007, XenSource Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of XenSource Inc. nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define DEFAULT_LEASE_TIME_SECS 30 int lock(char *fn_to_lock, char *uuid, int force, int readonly, int *lease_time, int *retstat); int unlock(char *fn_to_unlock, char *uuid, int readonly, int *retstat); int lock_delta(char *fn_to_check, int *cur_lease_time, int *max_lease_time); typedef enum { LOCK_OK = 0, LOCK_EBADPARM = -1, LOCK_ENOMEM = -2, LOCK_ESTAT = -3, LOCK_EHELD_WR = -4, LOCK_EHELD_RD = -5, LOCK_EOPEN = -6, LOCK_EXLOCK_OPEN = -7, LOCK_EXLOCK_WRITE= -8, LOCK_EINODE = -9, LOCK_EUPDATE = -10, LOCK_EREAD = -11, LOCK_EREMOVE = -12, LOCK_ENOLOCK = -13, LOCK_EUSAGE = -14, } lock_error; ption>
path: root/tests/tools/txt2tikztiming.py
blob: 9c6cd3a19e54acf9c65a48f0b6f477d9ff3505fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/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('')