source: branches/reconfiguration/platforms/tsar_generic_iob/scripts/onerun.py @ 965

Last change on this file since 965 was 957, checked in by cfuguet, 10 years ago

Introduce a SocLib? platform implementing the FPGA mono cluster platform

  • This mono cluster platform is the one used for NetBSD and Linux on TSAR demonstrators.
  • It is based on the LETI platform but it contains an internal ROM and all the DSPIN routers have been removed.
  • Property svn:executable set to *
File size: 7.2 KB
Line 
1#!/usr/bin/env python2
2# @date   22 September, 2014
3# @author cfuguet <cesar.fuguet-tortolero@lip6.fr>
4
5import os
6import subprocess
7import arch
8import faultyprocs
9import argparse
10import multiprocessing
11
12def run(args):
13    """ Execute the distributed bootloader providing permanent fault-recovery on
14    the TSAR platform.
15
16    Keyword arguments:
17    path         -- platform's base directory path
18    outpath      -- output's base directory path
19    x            -- number of clusters on the X coordinate
20    y            -- number of clusters on the Y coordinate
21    nprocs       -- number of processors per cluster
22    compileonly  -- stops after platform's compilation
23    batchmode    -- TTY and FB are only redirected to FILES
24    faultyrouter -- a list containing faulty routers' coordinates (t, x, y)
25    faultymask   -- a mask of disabled routers' interfaces
26    faultycore   -- a list containing faulty cores' coordinates (x, y, l)
27    debug        -- a list with debug's start cycle, stop cycle, PID and MID
28    threads      -- number of OpenMP threads
29    firmdebug    -- activate the DEBUG compilation mode on software
30    diskimage    -- relative or absolute path to the disk image
31    """
32
33    # translate the relative path (if needed) into an absolute path
34    basedir = os.path.abspath(args.path)
35    outdir = os.path.abspath(args.outpath)
36    print "[ run.py ] platform base directory: {0}".format(basedir)
37    print "[ run.py ] output directory: {0}".format(outdir)
38
39    # 1. generate configuration and ouput directories
40    try:
41        os.makedirs(os.path.join(outdir, "config"), 0755)
42    except OSError:
43        pass # directory already exists => do nothing
44
45    # 2. generate hard_config.h and fault_config.h files
46    faultpath = os.path.join(outdir, "config/fault_config.h")
47    hardpath = os.path.join(outdir, "config/hard_config.h")
48    xmlpath = os.path.join(outdir, "config/giet.map.xml")
49    dtspath = os.path.join(outdir, "config/linux.dts")
50    arch.main(args.x, args.y, args.nprocs, hardpath, xmlpath, dtspath)
51    faultyprocs.generate(args.faultycore, faultpath)
52
53    # create a log file
54    logfile = open(os.path.join(outdir, "log"), "w")
55
56    # 3. compile simulator executable
57    dst = os.path.join(basedir, "hard_config.h")
58    if os.path.lexists(dst):
59        os.unlink(dst)
60
61    os.symlink(hardpath, dst)
62
63    print "[ run.py ] compiling simulator"
64    command = []
65    command.extend(['make'])
66    command.extend(['-C', basedir])
67    subprocess.call(command, stdout=logfile, stderr=logfile)
68
69    # 4. compile distributed boot executable
70    dst = os.path.join(outdir, "config/boot_config.h")
71    if os.path.lexists(dst):
72        os.unlink(dst)
73
74    os.symlink(os.path.join(basedir, "soft/test/config/boot_config.h"), dst)
75
76    print "[ run.py ] compiling distributed boot procedure"
77    command = []
78    command.extend(['make'])
79    command.extend(['-C', os.path.join(basedir, "soft")])
80    command.extend(["CONFIG=" + outdir])
81    command.extend(["DEBUG=" + str(args.firmdebug)])
82    subprocess.call(command, stdout=logfile, stderr=logfile)
83
84    # stop after compiling when the compile-only option is activated
85    if args.compileonly == True:
86        exit(0)
87
88    # 5. execute simulator
89    os.environ["DISTRIBUTED_BOOT"] = "1"
90    os.environ["SOCLIB_FB"] = "HEADLESS"
91    if args.batchmode:
92        os.environ["SOCLIB_TTY"] = "FILES"
93
94    print "[ run.py ] starting simulation"
95    command = []
96    command.extend([os.path.join(basedir, "simul.x")])
97    command.extend(["-DSOFT", "soft/build/boot.elf"])
98    command.extend(["-SOFT", "soft/build/loader.elf"])
99    command.extend(["-DISK", args.diskimage])
100
101    if args.faultyrouter != None:
102        command.extend(["-FAULTY_MASK", str(args.faultymask)])
103        for f in args.faultyrouter:
104            command.extend(["-FAULTY_ROUTER", str(f[0]), str(f[1]), str(f[2])])
105
106    if args.debug != None:
107        command.extend(["-DEBUG", str(args.debug[0])]);
108        command.extend(["-NCYCLES", str(args.debug[1])]);
109        command.extend(["-PROCID", str(args.debug[2])]);
110        command.extend(["-MEMCID", str(args.debug[3])]);
111
112    elif os.environ.get('SOCLIB_GDB') == None:
113        # the procedure grows linearly with the diameter of the mesh.
114        maxcycles = 1500000 + (args.x + args.y) * 20000
115        command.extend(["-NCYCLES", str(maxcycles)])
116
117    # OpenMP number of threads definition
118    ompthreads = args.threads
119    if ompthreads < 0:
120        if os.environ.get('SOCLIB_GDB') != None:
121            ompthreads = 1
122
123        elif args.debug != None:
124            ompthreads = 1
125
126        else:
127            ompthreads = (args.x * args.y) / 4
128            cpucount = multiprocessing.cpu_count()
129            if ompthreads > cpucount: ompthreads = cpucount
130
131    command.extend(["-THREADS", str(ompthreads)])
132
133
134    logfile.write("Execute: {0}\n".format(" ".join(command)))
135    logfile.flush()
136
137    subprocess.call(command, stdout=logfile, stderr=logfile)
138
139    logfile.close()
140
141    # 6. move simulation terminal output into the target config dir
142    os.rename("term0", os.path.join(outdir, "term"))
143
144# get command-line arguments
145if __name__ == "__main__":
146    parser = argparse.ArgumentParser(description='Run simulation')
147
148    parser.add_argument(
149        '--path', '-p', type=str, dest='path', default=os.getcwd(),
150        help='relative or absolute path to the platform')
151
152    parser.add_argument(
153        '--output', '-o', type=str, dest='outpath', default='./output',
154        help='relative or absolute path to the output directory')
155
156    parser.add_argument(
157        '--xsize', '-x', type=int, dest='x', default=2,
158        help='# of clusters in a row')
159
160    parser.add_argument(
161        '--ysize', '-y', type=int, dest='y', default=2,
162        help='# of clusters in a column')
163
164    parser.add_argument(
165        '--nprocs', '-n', type=int, dest='nprocs', default=4,
166        help='# of processors per cluster')
167
168    parser.add_argument(
169        '--compile-only', '-c', dest='compileonly', action='store_true',
170        help='generate config files and compile the platform. Do not simulate')
171
172    parser.add_argument(
173        '--batch-mode', '-b', dest='batchmode', action='store_true',
174        help='run simulation in batch mode: no interactive TTY or FrameBuffer')
175
176    parser.add_argument(
177        '--faulty-router', '-fr', dest='faultyrouter', action='append', nargs=3,
178        help='ID (T,X,Y) of faulty router. The T is 0:CMD, 1:RSP')
179
180    parser.add_argument(
181        '--faulty-mask', '-m', dest='faultymask', default=0x1F,
182        help='Disable mask for faulty router interfaces')
183
184    parser.add_argument(
185        '--faulty-core', '-fc', dest='faultycore', action='append', nargs=3,
186        help='ID (X,Y,L) of faulty processor')
187
188    parser.add_argument(
189        '--debug', '-g', dest='debug', nargs=4,
190        help='needs four arguments: from, to, procid, memcid')
191
192    parser.add_argument(
193        '--threads', '-t', dest='threads', default=-1,
194        help='number of OpenMP threads')
195
196    parser.add_argument(
197        '--firmware-debug', '-fg', dest='firmdebug', default=0,
198        help='activate the DEBUG compilation mode on software')
199
200    parser.add_argument(
201        '--disk-image', '-di', dest='diskimage', default="/dev/null",
202        help='relative or absolute path to the external firmware')
203
204    run(parser.parse_args())
205
206# vim: tabstop=4 : softtabstop=4 : shiftwidth=4 : expandtab
Note: See TracBrowser for help on using the repository browser.