File: run_sim_multi.py

package info (click to toggle)
uhd 3.13.1.0-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 207,120 kB
  • sloc: cpp: 167,245; ansic: 86,841; vhdl: 53,420; python: 40,839; xml: 13,167; tcl: 5,688; makefile: 2,167; sh: 1,719; pascal: 230; csh: 94; asm: 20; perl: 11
file content (110 lines) | stat: -rwxr-xr-x 4,223 bytes parent folder | download | duplicates (2)
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
107
108
109
110
#!/usr/bin/python3
#
# Copyright 2018 Ettus Research, a National Instruments Company
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
# Description
#   Run the crossbar testbench (crossbar_tb) for varios parameter
#   configurations and generates load-latency graphs for each run.

import argparse
import math
import os, sys
import shutil
import glob
import subprocess

g_localparam_template = """  // Router parameters
  localparam ROUTER_IMPL        = "{rtr_impl}";
  localparam ROUTER_PORTS_SQRT  = {rtr_ports_sqrt};
  localparam ROUTER_PORTS       = {rtr_ports};
  localparam ROUTER_DWIDTH      = 64;
  localparam MTU_LOG2           = {rtr_mtu};
  localparam NUM_MASTERS        = {rtr_sources};
  // Test parameters
  localparam TEST_MAX_PACKETS   = {tst_maxpkts};
  localparam TEST_LPP           = {tst_lpp};
  localparam TEST_MIN_INJ_RATE  = {tst_injrate_min};
  localparam TEST_MAX_INJ_RATE  = {tst_injrate_max};
  localparam TEST_INJ_RATE_INCR = 10;
  localparam TEST_GEN_LL_FILES  = 1;
"""

g_test_params = {
    'data': {'rtr_mtu':7, 'tst_maxpkts':100, 'tst_lpp':100, 'tst_injrate_min':30, 'tst_injrate_max':100},
    'ctrl': {'rtr_mtu':5, 'tst_maxpkts':100, 'tst_lpp':10,  'tst_injrate_min':10, 'tst_injrate_max':50},
}

g_xb_types = {
    'chdr_crossbar_nxn':'data', 'axi_crossbar':'data',
    'axis_ctrl_2d_torus':'ctrl', 'axis_ctrl_2d_mesh':'ctrl'
}

def get_options():
    parser = argparse.ArgumentParser(description='Run correctness sim and generate load-latency plots')
    parser.add_argument('--impl', type=str, default='chdr_crossbar_nxn', help='Implementation (CSV) [%s]'%(','.join(g_xb_types.keys())))
    parser.add_argument('--ports', type=str, default='16', help='Number of ports (CSV)')
    parser.add_argument('--sources', type=str, default='16', help='Router datapath width (CSV)')
    return parser.parse_args()

def launch_run(impl, ports, sources):
    run_name = '%s_ports%d_srcs%d'%(impl, ports, sources)
    # Prepare a transform map to autogenerate a TB file
    transform = {'rtr_impl':impl, 'rtr_ports':ports, 'rtr_ports_sqrt':str(math.ceil(math.sqrt(ports))), 'rtr_sources':sources}
    for k,v in g_test_params[g_xb_types[impl]].items():
        transform[k] = v 
    # Read crossbar_tb.sv and create crossbar_tb_auto.sv with new parameters
    with open('crossbar_tb.sv', 'r') as in_file:
        in_lines = in_file.readlines()
    echo = 1
    with open('crossbar_tb_auto.sv', 'w') as out_file:
        for l in in_lines:
            if '</PARAMS_BLOCK_AUTOGEN>' in l:
                echo = 1
            if echo:
                out_file.write(l)
            if '<PARAMS_BLOCK_AUTOGEN>' in l:
                out_file.write(g_localparam_template.format(**transform))
                echo = 0
    # Create data directory for the simulation
    data_dir = os.path.join('data', impl)
    export_dir = os.path.join('data', run_name)
    try:
        os.makedirs('data')
    except FileExistsError:
        pass
    os.makedirs(data_dir)
    os.makedirs(export_dir)
    # Run "make xsim"
    exitcode = subprocess.Popen('make xsim TB_TOP_FILE=crossbar_tb_auto.sv', shell=True).wait()
    if exitcode != 0:
        raise RuntimeError('Error running "make xsim". Was setupenv.sh run?')
    # Generate load-latency graphs
    exitcode = subprocess.Popen('gen_load_latency_graph.py ' + data_dir, shell=True).wait()
    if exitcode != 0:
        raise RuntimeError('Error running "gen_load_latency_graph.py"')
    # Copy files
    os.rename('xsim.log', os.path.join(export_dir, 'xsim.log'))
    for file in glob.glob(os.path.join(data_dir, '*.png')):
        shutil.copy(file, export_dir)
    # Cleanup outputs
    subprocess.Popen('make cleanall', shell=True).wait()
    try:
        os.remove('crossbar_tb_auto.sv')
    except FileNotFoundError:
        pass
    try:
        shutil.rmtree(data_dir)
    except OSError:
        print('WARNING: Could not delete ' + data_dir)

def main():
    args = get_options();
    for impl in args.impl.strip().split(','):
        for ports in args.ports.strip().split(','):
            for sources in args.sources.strip().split(','):
                launch_run(impl, int(ports), min(int(ports), int(sources)))

if __name__ == '__main__':
    main()