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