Script Examples

Drawing a Timing Diagram

The script draw_diagram.py is shown below

 1from ta_py_lib.ta.app import *
 2from ta_py_lib.td.logic import *
 3from ta_py_lib.td.commands import *
 4
 5td = new_timing_diagram(taApp)
 6start_script(td)
 7
 8dclock  = add_digital_clock(td, "test-clk", "H", 20.0e6)
 9dsignal = add_digital_signal(td, "mem_read", "L")
10dbus    = add_digital_bus(td, "mem_add[15:0]", "CC00", "Hex")
11
12add_pulse(dsignal, 50.0, 100.0, "H")
13add_pulse(dbus, 30.0, 120.0, "CC05")
14
15add_edge(dsignal, 200.0, "H")
16add_edge(dsignal, 250.0, "L")
17
18add_edge(dbus, 180.0, "CCCC")
19add_edge(dbus, 270.0, "CD00")
20
21stop_script(td)
_images/draw_diagram.png

Creating a D Flip Flop

The script dff.py is shown below

 1from ta_py_lib.ta.app import *
 2from ta_py_lib.td.logic import *
 3from ta_py_lib.td.commands import *
 4
 5td = new_timing_diagram(taApp)
 6start_script(td)
 7
 8clk  = add_digital_clock(td, "CLK","H",20.0e6)
 9sigD = add_digital_signal(td, "D","L")
10sigQ = add_digital_signal(td, "Q","L")
11
12add_pulse(sigD, 75.0, 125.0, "H")
13add_edge(sigD, 175.0, "H")
14add_edge(sigD, 225.0, "L")
15
16dly_min       = 2
17dly_typ       = 4
18dly_max       = 6
19clk2q_dly     = add_part_delay(td, "CLK2Q", dly_min, dly_typ, dly_max, "DFF Clock to Q Output Delay")
20clk_edge_list = get_edge_list(clk)
21
22ls = "L"
23for clk_edge in clk_edge_list:
24    if get_next_state(clk_edge) == "H":
25        et = get_pt2_min(clk_edge)
26        ns = get_state_at_time(sigD, et)
27        #print "edge time %d next state %s" % (et,ns)
28        if ((ns != ls) and (et + dly_min > get_last_edge_pt2(sigQ))):
29            sigQ_edge = add_edge(sigQ, et, ns)
30            add_delay(td, clk2q_dly,clk_edge,sigQ_edge)
31        ls = ns
32
33stop_script(td)
_images/dff.png

Dumping Signal Values

The script dump_edges.py is shown below

 1from org.dmad.ta import DigitalClock
 2from ta_py_lib.ta.app import *
 3from ta_py_lib.td.logic import *
 4from ta_py_lib.td.commands import *
 5from ta_py_lib.td.utils import *
 6
 7td = get_timing_diagram(taApp)
 8start_script(td)
 9
10out_file = set_output_file("dump_edges.txt")
11
12signal_list = get_signal_list(td)
13
14clock_signal = None
15for signal in signal_list:
16    if isinstance(signal, DigitalClock):
17        clock_signal = signal
18    else:
19        out_file.write("%s " % (get_name(signal)))
20
21out_file.write("\n")
22
23for clock_edge in get_edge_list(clock_signal):
24    if get_next_state(clock_edge) == "H":
25        edge_time = get_pt2_min(clock_edge)
26        for sig in signal_list:
27            if sig != clock_signal:
28                out_file.write("%s " % (get_state_at_time(sig, edge_time)))
29        out_file.write("\n")
30
31out_file.close()
32
33stop_script(td)

An example output from dump_edges.py

1D Q D_diff mem_read mem_add[15:0]
2H L L H L CC00
3H L L H H CC05
4H H L L L CC05
5H L H H L CC00
6H H L L H CCCC
7H L H H L CCCC
8H L L H L CD00

Generating VHDL Test Vectors

The script vhdl_test_vectors.py is shown below

 1from org.dmad.ta import DigitalSignal
 2from org.dmad.ta import DigitalBus
 3from org.dmad.ta import DigitalClock
 4
 5from ta_py_lib.ta.app import *
 6from ta_py_lib.td.logic import *
 7from ta_py_lib.td.commands import *
 8from ta_py_lib.td.utils import *
 9
10out_file = set_output_file("vhdl_test_vectors.txt")
11td       = get_timing_diagram(taApp)
12
13start_script(td)
14
15ts       = get_time_scale(td)
16ts_text  = get_time_scale_text(ts)
17signals  = get_signal_list(td)
18
19for sig in signals:
20    i = 0
21
22    out_file.write("%s <= " % (get_name(sig)))
23
24    for edge in get_edge_list(sig):
25        if isinstance(sig, DigitalSignal) or isinstance(sig, DigitalClock):
26            line = "'%s'"  % (get_next_state(edge))
27            if i != 0:
28                line = "    %s after %s %s" % (line, edge.getPt2Min() / 1000, ts_text)
29        elif isinstance(sig, DigitalBus):
30            state_format = {
31                "Hex":  "X\"",
32                "Bin":  "\""
33            }
34
35            sStart = state_format[get_state_format(sig)]
36
37            line = "%s%s\"" % (sStart, get_next_state(edge))
38            if i != 0:
39                line = "    %s after %s %s" % (line, edge.getPt2Min() / 1000, ts_text)
40
41        if ( i == len(get_edge_list(sig))-1):
42            out_file.write("%s;\n\n" % (line))
43        else:
44            out_file.write("%s,\n" % (line))
45
46        i += 1
47out_file.close()
48stop_script(td)

An example output from vhdl_test_vectors.py

 1ADD[15:0] <= X"Z",
 2    X"FFC0" after 27.0 ns,
 3    X"Z" after 82.0 ns,
 4    X"DC00" after 1027.0 ns,
 5    X"Z" after 1082.0 ns;
 6
 7CS <= 'H',
 8    'L' after 34.0 ns,
 9    'H' after 82.0 ns,
10    'L' after 1034.0 ns,
11    'H' after 1082.0 ns;
12
13DATA[7:0] <= X"Z",
14    X"55" after 49.0 ns,
15    X"Z" after 82.0 ns,
16    X"AA" after 1041.0 ns,
17    X"Z" after 1082.0 ns;

Generating SPICE PWL Test Vectors

The script spice_pwl_test_vectors.py is shown below

 1from org.dmad.ta import DigitalBus
 2from ta_py_lib.ta.app import *
 3from ta_py_lib.td.logic import *
 4from ta_py_lib.td.commands import *
 5from ta_py_lib.td.utils import *
 6
 7td = get_timing_diagram(taApp)
 8start_script(td)
 9
10ts       = get_time_scale(td)
11out_file = set_output_file('spice_pwl_test_vectors_py.txt')
12
13sig_list = get_signal_list(td)
14for sig in sig_list:
15    if not isinstance(sig, DigitalBus):
16        out_file.write("%s N1 N2 PWL (\n" % (get_name(sig)))
17        out_file.write("    0.0 %s\n"  % (get_voltage(get_start_state(sig))))
18
19        ed_list = get_edge_list(sig)
20        i = 0
21        for ed in ed_list:
22            if i > 0:
23                ls_voltage = get_voltage(get_last_state(ed))
24                ns_voltage = get_voltage(get_next_state(ed))
25                out_file.write("    %f%s %s\n" % (get_pt1_min(ed) / 1000.0, get_ts_text(ts), ls_voltage))
26                out_file.write("    %f%s %s\n" % (get_pt3_min(ed) / 1000.0, get_ts_text(ts), ns_voltage))
27            i += 1
28        out_file.write("    %f%s %s\n" % (get_end_time(td), get_ts_text(ts), ns_voltage))
29        out_file.write("    )\n")
30    else:
31        num_bits     = get_num_bits(sig)
32        state_format = get_state_format(sig)
33
34        ls_bit = get_ls_bit(get_name(sig))
35        ms_bit = get_ms_bit(get_name(sig))
36
37        for i in range(ls_bit,ms_bit+1):
38            start_state = get_start_state(sig);
39            if (state_format != "Bin"):
40                start_state = convert_format(start_state,state_format,"Bin",num_bits)
41
42            bus_name = get_name(sig)
43            bus_name = bus_name[0:bus_name.find("[")]
44            out_file.write("%s[%d] N1 N2 PWL (\n" % (bus_name,i))
45
46            if (start_state == "Z"):
47                ss_voltage = get_voltage("Z")
48            else:
49                ss_voltage = get_voltage(start_state[i])
50
51            out_file.write("    0.0 %s\n" % (ss_voltage))
52
53            ed_list = get_edge_list(sig)
54            j = 0
55            for ed in ed_list:
56                if (j > 0):
57                    last_state = get_last_state(ed)
58                    if (state_format != "Bin"):
59                        last_state = convert_format(last_state,state_format,"Bin",num_bits)
60                    if (last_state == "Z"):
61                        ls_voltage = get_voltage("Z")
62                    else:
63                        ls_voltage = get_voltage(last_state[ms_bit-i])
64
65                    next_state = get_next_state(ed)
66                    if (state_format != "Bin"):
67                        next_state = convert_format(next_state,state_format,"Bin",num_bits)
68                    if (next_state == "Z"):
69                        ns_voltage = get_voltage("Z")
70                    else:
71                        ns_voltage = get_voltage(next_state[ms_bit-i])
72
73                    out_file.write("    %f%s %s\n" % (get_pt1_min(ed) / 1000, get_ts_text(ts), ls_voltage))
74                    out_file.write("    %f%s %s\n" % (get_pt3_min(ed) / 1000, get_ts_text(ts), ns_voltage))
75                j += 1
76            end_voltage = ns_voltage
77            out_file.write("    %f%s %s\n" % (get_end_time(td), get_ts_text(ts), end_voltage))
78            out_file.write("    )\n")
79
80out_file.close()
81stop_script(td)

An example output from spice_pwl_test_vectors.py

 1ADD[1] N1 N2 PWL (
 2    0.0 2.5
 3    26.500000e-9 2.5
 4    27.500000e-9 0.0
 5    81.500000e-9 0.0
 6    82.500000e-9 2.5
 7    1026.500000e-9 2.5
 8    1027.500000e-9 0.0
 9    1081.500000e-9 0.0
10    1082.500000e-9 2.5
11    1120.000000e-9 2.5
12    )
13ADD[2] N1 N2 PWL (
14    0.0 2.5
15    26.500000e-9 2.5
16    27.500000e-9 0.0
17    81.500000e-9 0.0
18    82.500000e-9 2.5
19    1026.500000e-9 2.5
20    1027.500000e-9 0.0
21    1081.500000e-9 0.0
22    1082.500000e-9 2.5
23    1120.000000e-9 2.5
24    )
25ADD[3] N1 N2 PWL (
26    0.0 2.5
27    26.500000e-9 2.5
28    27.500000e-9 0.0
29    81.500000e-9 0.0
30    82.500000e-9 2.5
31    1026.500000e-9 2.5
32    1027.500000e-9 0.0
33    1081.500000e-9 0.0
34    1082.500000e-9 2.5
35    1120.000000e-9 2.5
36    )