run-tests.py revision 12771
18981Sandreas.hansson@arm.com#!/usr/bin/env python
210902Sandreas.sandberg@arm.com
38981Sandreas.hansson@arm.com# Copyright (c) 2018, Cornell University
48981Sandreas.hansson@arm.com# All rights reserved.
58981Sandreas.hansson@arm.com#
68981Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or
78981Sandreas.hansson@arm.com# without modification, are permitted provided that the following
88981Sandreas.hansson@arm.com# conditions are met:
98981Sandreas.hansson@arm.com#
108981Sandreas.hansson@arm.com# Redistributions of source code must retain the above copyright
118981Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer.
128981Sandreas.hansson@arm.com#
138981Sandreas.hansson@arm.com# Redistributions in binary form must reproduce the above
148981Sandreas.hansson@arm.com# copyright notice, this list of conditions and the following
158981Sandreas.hansson@arm.com# disclaimer in the documentation and/or other materials provided
168981Sandreas.hansson@arm.com# with the distribution.
178981Sandreas.hansson@arm.com#
188981Sandreas.hansson@arm.com# Neither the name of Cornell University nor the names of its
198981Sandreas.hansson@arm.com# contributors may be used to endorse or promote products derived
208981Sandreas.hansson@arm.com# from this software without specific prior written permission.
218981Sandreas.hansson@arm.com#
228981Sandreas.hansson@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
238981Sandreas.hansson@arm.com# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
248981Sandreas.hansson@arm.com# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
258981Sandreas.hansson@arm.com# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
268981Sandreas.hansson@arm.com# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
278981Sandreas.hansson@arm.com# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
288981Sandreas.hansson@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
298981Sandreas.hansson@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
308981Sandreas.hansson@arm.com# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
318981Sandreas.hansson@arm.com# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
328981Sandreas.hansson@arm.com# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
338981Sandreas.hansson@arm.com# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
348981Sandreas.hansson@arm.com# POSSIBILITY OF SUCH DAMAGE.
358981Sandreas.hansson@arm.com#
368981Sandreas.hansson@arm.com# Authors: Tuan Ta
378981Sandreas.hansson@arm.com
388981Sandreas.hansson@arm.comimport os
398981Sandreas.hansson@arm.comimport sys
408981Sandreas.hansson@arm.comimport argparse
418981Sandreas.hansson@arm.comimport subprocess
428981Sandreas.hansson@arm.com
438981Sandreas.hansson@arm.comfrom multiprocessing import Pool
448981Sandreas.hansson@arm.com
458981Sandreas.hansson@arm.comimport clusterjob
468981Sandreas.hansson@arm.comfrom clusterjob import *
4710994Sandreas.sandberg@arm.com
488981Sandreas.hansson@arm.com#-------------------------------------------------------------------------
498981Sandreas.hansson@arm.com# utility function to run a process
508981Sandreas.hansson@arm.com#-------------------------------------------------------------------------
518981Sandreas.hansson@arm.comdef execute(cmd):
528981Sandreas.hansson@arm.com  try:
538981Sandreas.hansson@arm.com    return subprocess.check_output(cmd, shell=True)
548981Sandreas.hansson@arm.com  except subprocess.CalledProcessError, err:
558981Sandreas.hansson@arm.com    print "ERROR: " + err.output
568981Sandreas.hansson@arm.com
578981Sandreas.hansson@arm.com#-------------------------------------------------------------------------
588981Sandreas.hansson@arm.com# Input options
598981Sandreas.hansson@arm.com#-------------------------------------------------------------------------
608981Sandreas.hansson@arm.com
618981Sandreas.hansson@arm.com# general options
628981Sandreas.hansson@arm.comparser = argparse.ArgumentParser(description='run RISC-V assembly tests')
6310902Sandreas.sandberg@arm.comparser.add_argument('--max-tick',
648981Sandreas.hansson@arm.com                    help = 'maximum simulated tick',
658981Sandreas.hansson@arm.com                    type = int,
668981Sandreas.hansson@arm.com                    default = 10000000000)
678981Sandreas.hansson@arm.comparser.add_argument('--num-cpus',
688981Sandreas.hansson@arm.com                    help = 'number of CPUs\
698981Sandreas.hansson@arm.com                            (some tests require at least 4 CPUs)',
708981Sandreas.hansson@arm.com                    type = int,
718981Sandreas.hansson@arm.com                    default = 4)
728981Sandreas.hansson@arm.comparser.add_argument('--ruby',
738981Sandreas.hansson@arm.com                    help = 'Use Ruby memory?',
748981Sandreas.hansson@arm.com                    action = 'store_true')
758981Sandreas.hansson@arm.com
768981Sandreas.hansson@arm.comargs = parser.parse_args()
7711168Sandreas.hansson@arm.com
7811168Sandreas.hansson@arm.com# convert all paths to absolute paths
7911168Sandreas.hansson@arm.comtest_dir = os.path.abspath('../../bin/riscv/')
8011168Sandreas.hansson@arm.comtest_summary_out = './test-summary.out'
818981Sandreas.hansson@arm.com
8210902Sandreas.sandberg@arm.com#-------------------------------------------------------------------------
8310902Sandreas.sandberg@arm.com# gem5 variables
8411168Sandreas.hansson@arm.com#-------------------------------------------------------------------------
858981Sandreas.hansson@arm.comgem5_dir = os.path.abspath('../../../../../')
8610902Sandreas.sandberg@arm.comgem5_bin = os.path.join(gem5_dir, 'build', 'RISCV', 'gem5.opt')
8711168Sandreas.hansson@arm.comconfig = os.path.join(gem5_dir, 'configs', 'example', 'se.py')
888981Sandreas.hansson@arm.com
898981Sandreas.hansson@arm.com# list of CPU models to be tested
908981Sandreas.hansson@arm.comcpu_models = ['AtomicSimpleCPU',
918981Sandreas.hansson@arm.com              'TimingSimpleCPU',
928981Sandreas.hansson@arm.com              'MinorCPU',
938981Sandreas.hansson@arm.com              'DerivO3CPU']
948981Sandreas.hansson@arm.com
958981Sandreas.hansson@arm.com# get a list of test binaries in the given directory
968981Sandreas.hansson@arm.comtests = []
978981Sandreas.hansson@arm.comfor line in execute("ls %s/*" % (test_dir)).splitlines():
988981Sandreas.hansson@arm.com  if line:
998981Sandreas.hansson@arm.com    tests.append(line.split('/')[-1])
1008981Sandreas.hansson@arm.com
1019542Sandreas.hansson@arm.com# total number of tests to run
1029542Sandreas.hansson@arm.comn_tests = len(tests) * len(cpu_models)
1038981Sandreas.hansson@arm.com
1048981Sandreas.hansson@arm.com# make a list of jobs
1058981Sandreas.hansson@arm.comjob_cmds = []
1069542Sandreas.hansson@arm.comjob_names = []
1079542Sandreas.hansson@arm.comfor test in tests:
1088981Sandreas.hansson@arm.com  for model in cpu_models:
1098981Sandreas.hansson@arm.com    test_name = test + '-' + model
1108981Sandreas.hansson@arm.com    job_names.append(test_name)
1118981Sandreas.hansson@arm.com    job_cmds.append([gem5_bin,
1128981Sandreas.hansson@arm.com                     config,
1138981Sandreas.hansson@arm.com                     '-m', str(args.max_tick),
1148981Sandreas.hansson@arm.com                     '--cpu-type', model,
1158981Sandreas.hansson@arm.com                     '-n', str(args.num_cpus),
1168981Sandreas.hansson@arm.com                     '-c', test_dir + '/' + test,
1178981Sandreas.hansson@arm.com                     '--ruby' if args.ruby else '--caches',
1188981Sandreas.hansson@arm.com                    ])
1198981Sandreas.hansson@arm.com
1208981Sandreas.hansson@arm.com# execute all jobs
1218981Sandreas.hansson@arm.comjob_pool = Pool(processes = n_tests)
1228981Sandreas.hansson@arm.comjob_outputs = job_pool.map(subprocess.call, job_cmds)
1238981Sandreas.hansson@arm.comjob_pool.close()
1248981Sandreas.hansson@arm.com
1258981Sandreas.hansson@arm.com# process job outputs
1268981Sandreas.hansson@arm.comfile = open(test_summary_out, "w")
1278981Sandreas.hansson@arm.com
1288981Sandreas.hansson@arm.comjob_outputs = zip(job_names, job_outputs)
1298981Sandreas.hansson@arm.comfor entry in job_outputs:
1308981Sandreas.hansson@arm.com  # a negative return value indicates that the job was terminated
1318981Sandreas.hansson@arm.com  # by a signal
1328981Sandreas.hansson@arm.com  # a positive return value indicates that the job exited with a return
1338981Sandreas.hansson@arm.com  # value
1348981Sandreas.hansson@arm.com  if entry[1] < 0:
1358981Sandreas.hansson@arm.com    file.write("%-50s failed - signal = %d\n" % (entry[0], -1 * entry[1]))
1368981Sandreas.hansson@arm.com  elif entry[1] > 0:
1378981Sandreas.hansson@arm.com    file.write("%-50s failed - status = %d\n" % (entry[0], entry[1]))
1388981Sandreas.hansson@arm.com  else:
1398981Sandreas.hansson@arm.com    file.write("%-50s passed\n" % (entry[0]))
1408981Sandreas.hansson@arm.com
1418981Sandreas.hansson@arm.comfile.close()
1428981Sandreas.hansson@arm.com