113540Sandrea.mondelli@ucf.edu#!/usr/bin/env python2.7
211482Sandreas.sandberg@arm.com#
312068Snikos.nikoleris@arm.com# Copyright (c) 2016-2017 ARM Limited
411482Sandreas.sandberg@arm.com# All rights reserved
511482Sandreas.sandberg@arm.com#
611482Sandreas.sandberg@arm.com# The license below extends only to copyright in the software and shall
711482Sandreas.sandberg@arm.com# not be construed as granting a license to any other intellectual
811482Sandreas.sandberg@arm.com# property including but not limited to intellectual property relating
911482Sandreas.sandberg@arm.com# to a hardware implementation of the functionality of the software
1011482Sandreas.sandberg@arm.com# licensed hereunder.  You may use the software subject to the license
1111482Sandreas.sandberg@arm.com# terms below provided that you ensure that this notice is replicated
1211482Sandreas.sandberg@arm.com# unmodified and in its entirety in all distributions of the software,
1311482Sandreas.sandberg@arm.com# modified or unmodified, in source code or in binary form.
1411482Sandreas.sandberg@arm.com#
1511482Sandreas.sandberg@arm.com# Redistribution and use in source and binary forms, with or without
1611482Sandreas.sandberg@arm.com# modification, are permitted provided that the following conditions are
1711482Sandreas.sandberg@arm.com# met: redistributions of source code must retain the above copyright
1811482Sandreas.sandberg@arm.com# notice, this list of conditions and the following disclaimer;
1911482Sandreas.sandberg@arm.com# redistributions in binary form must reproduce the above copyright
2011482Sandreas.sandberg@arm.com# notice, this list of conditions and the following disclaimer in the
2111482Sandreas.sandberg@arm.com# documentation and/or other materials provided with the distribution;
2211482Sandreas.sandberg@arm.com# neither the name of the copyright holders nor the names of its
2311482Sandreas.sandberg@arm.com# contributors may be used to endorse or promote products derived from
2411482Sandreas.sandberg@arm.com# this software without specific prior written permission.
2511482Sandreas.sandberg@arm.com#
2611482Sandreas.sandberg@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2711482Sandreas.sandberg@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2811482Sandreas.sandberg@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2911482Sandreas.sandberg@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3011482Sandreas.sandberg@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3111482Sandreas.sandberg@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3211482Sandreas.sandberg@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3311482Sandreas.sandberg@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3411482Sandreas.sandberg@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3511482Sandreas.sandberg@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3611482Sandreas.sandberg@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3711482Sandreas.sandberg@arm.com#
3811482Sandreas.sandberg@arm.com# Authors: Andreas Sandberg
3911482Sandreas.sandberg@arm.com
4011482Sandreas.sandberg@arm.comfrom abc import ABCMeta, abstractmethod
4111482Sandreas.sandberg@arm.comimport os
4211482Sandreas.sandberg@arm.comfrom collections import namedtuple
4311482Sandreas.sandberg@arm.comfrom units import *
4411482Sandreas.sandberg@arm.comfrom results import TestResult
4511482Sandreas.sandberg@arm.comimport shutil
4611482Sandreas.sandberg@arm.com
4711482Sandreas.sandberg@arm.com_test_base = os.path.join(os.path.dirname(__file__), "..")
4811482Sandreas.sandberg@arm.com
4911482Sandreas.sandberg@arm.comClassicConfig = namedtuple("ClassicConfig", (
5011482Sandreas.sandberg@arm.com    "category",
5111482Sandreas.sandberg@arm.com    "mode",
5211482Sandreas.sandberg@arm.com    "workload",
5311482Sandreas.sandberg@arm.com    "isa",
5411482Sandreas.sandberg@arm.com    "os",
5511482Sandreas.sandberg@arm.com    "config",
5611482Sandreas.sandberg@arm.com))
5711482Sandreas.sandberg@arm.com
5811482Sandreas.sandberg@arm.com# There are currently two "classes" of test
5911482Sandreas.sandberg@arm.com# configurations. Architecture-specific ones and generic ones
6011482Sandreas.sandberg@arm.com# (typically SE mode tests). In both cases, the configuration name
6111482Sandreas.sandberg@arm.com# matches a file in tests/configs/ that will be picked up by the test
6211482Sandreas.sandberg@arm.com# runner (run.py).
6311482Sandreas.sandberg@arm.com#
6411482Sandreas.sandberg@arm.com# Architecture specific configurations are listed in the arch_configs
6511482Sandreas.sandberg@arm.com# dictionary. This is indexed by a (cpu architecture, gpu
6611482Sandreas.sandberg@arm.com# architecture) tuple. GPU architecture is optional and may be None.
6711482Sandreas.sandberg@arm.com#
6811482Sandreas.sandberg@arm.com# Generic configurations are listed in the generic_configs tuple.
6911482Sandreas.sandberg@arm.com#
7011482Sandreas.sandberg@arm.com# When discovering available test cases, this script look uses the
7111482Sandreas.sandberg@arm.com# test list as a list of /candidate/ configurations. A configuration
7211482Sandreas.sandberg@arm.com# is only used if a test has a reference output for that
7311482Sandreas.sandberg@arm.com# configuration. In addition to the base configurations from
7411482Sandreas.sandberg@arm.com# arch_configs and generic_configs, a Ruby configuration may be
7511482Sandreas.sandberg@arm.com# appended to the base name (this is probed /in addition/ to the
7611482Sandreas.sandberg@arm.com# original name. See get_tests() for details.
7711482Sandreas.sandberg@arm.com#
7811482Sandreas.sandberg@arm.comarch_configs = {
7911482Sandreas.sandberg@arm.com    ("alpha", None) : (
8011482Sandreas.sandberg@arm.com        'tsunami-simple-atomic',
8111482Sandreas.sandberg@arm.com        'tsunami-simple-timing',
8211482Sandreas.sandberg@arm.com        'tsunami-simple-atomic-dual',
8311482Sandreas.sandberg@arm.com        'tsunami-simple-timing-dual',
8411482Sandreas.sandberg@arm.com        'twosys-tsunami-simple-atomic',
8511482Sandreas.sandberg@arm.com        'tsunami-o3', 'tsunami-o3-dual',
8611482Sandreas.sandberg@arm.com        'tsunami-minor', 'tsunami-minor-dual',
8711482Sandreas.sandberg@arm.com        'tsunami-switcheroo-full',
8811482Sandreas.sandberg@arm.com    ),
8911482Sandreas.sandberg@arm.com
9011482Sandreas.sandberg@arm.com    ("arm", None) : (
9111482Sandreas.sandberg@arm.com        'simple-atomic-dummychecker',
9211482Sandreas.sandberg@arm.com        'o3-timing-checker',
9311482Sandreas.sandberg@arm.com        'realview-simple-atomic',
9411482Sandreas.sandberg@arm.com        'realview-simple-atomic-dual',
9511482Sandreas.sandberg@arm.com        'realview-simple-atomic-checkpoint',
9611482Sandreas.sandberg@arm.com        'realview-simple-timing',
9711482Sandreas.sandberg@arm.com        'realview-simple-timing-dual',
9811482Sandreas.sandberg@arm.com        'realview-o3',
9911482Sandreas.sandberg@arm.com        'realview-o3-checker',
10011482Sandreas.sandberg@arm.com        'realview-o3-dual',
10111482Sandreas.sandberg@arm.com        'realview-minor',
10211482Sandreas.sandberg@arm.com        'realview-minor-dual',
10311482Sandreas.sandberg@arm.com        'realview-switcheroo-atomic',
10411482Sandreas.sandberg@arm.com        'realview-switcheroo-timing',
10513012Sandreas.sandberg@arm.com        'realview-switcheroo-noncaching-timing',
10611482Sandreas.sandberg@arm.com        'realview-switcheroo-o3',
10711482Sandreas.sandberg@arm.com        'realview-switcheroo-full',
10811482Sandreas.sandberg@arm.com        'realview64-simple-atomic',
10911482Sandreas.sandberg@arm.com        'realview64-simple-atomic-checkpoint',
11011482Sandreas.sandberg@arm.com        'realview64-simple-atomic-dual',
11111482Sandreas.sandberg@arm.com        'realview64-simple-timing',
11211482Sandreas.sandberg@arm.com        'realview64-simple-timing-dual',
11311482Sandreas.sandberg@arm.com        'realview64-o3',
11411482Sandreas.sandberg@arm.com        'realview64-o3-checker',
11511482Sandreas.sandberg@arm.com        'realview64-o3-dual',
11611482Sandreas.sandberg@arm.com        'realview64-minor',
11711482Sandreas.sandberg@arm.com        'realview64-minor-dual',
11811482Sandreas.sandberg@arm.com        'realview64-switcheroo-atomic',
11911482Sandreas.sandberg@arm.com        'realview64-switcheroo-timing',
12011482Sandreas.sandberg@arm.com        'realview64-switcheroo-o3',
12111482Sandreas.sandberg@arm.com        'realview64-switcheroo-full',
12211482Sandreas.sandberg@arm.com    ),
12311482Sandreas.sandberg@arm.com
12411482Sandreas.sandberg@arm.com    ("sparc", None) : (
12511482Sandreas.sandberg@arm.com        't1000-simple-atomic',
12611482Sandreas.sandberg@arm.com        't1000-simple-x86',
12711482Sandreas.sandberg@arm.com    ),
12811482Sandreas.sandberg@arm.com
12913929Sgabeblack@google.com    ("x86", None) : (
13011482Sandreas.sandberg@arm.com        'pc-simple-atomic',
13111482Sandreas.sandberg@arm.com        'pc-simple-timing',
13211482Sandreas.sandberg@arm.com        'pc-o3-timing',
13311482Sandreas.sandberg@arm.com        'pc-switcheroo-full',
13411482Sandreas.sandberg@arm.com    ),
13511482Sandreas.sandberg@arm.com
13611482Sandreas.sandberg@arm.com    ("x86", "hsail") : (
13711482Sandreas.sandberg@arm.com        'gpu',
13811482Sandreas.sandberg@arm.com    ),
13911482Sandreas.sandberg@arm.com}
14011482Sandreas.sandberg@arm.com
14111482Sandreas.sandberg@arm.comgeneric_configs = (
14211482Sandreas.sandberg@arm.com    'simple-atomic',
14311482Sandreas.sandberg@arm.com    'simple-atomic-mp',
14411482Sandreas.sandberg@arm.com    'simple-timing',
14511482Sandreas.sandberg@arm.com    'simple-timing-mp',
14611482Sandreas.sandberg@arm.com
14711482Sandreas.sandberg@arm.com    'minor-timing',
14811482Sandreas.sandberg@arm.com    'minor-timing-mp',
14911482Sandreas.sandberg@arm.com
15011482Sandreas.sandberg@arm.com    'o3-timing',
15111482Sandreas.sandberg@arm.com    'o3-timing-mt',
15211482Sandreas.sandberg@arm.com    'o3-timing-mp',
15311482Sandreas.sandberg@arm.com
15411482Sandreas.sandberg@arm.com    'rubytest',
15511482Sandreas.sandberg@arm.com    'memcheck',
15611482Sandreas.sandberg@arm.com    'memtest',
15711482Sandreas.sandberg@arm.com    'memtest-filter',
15811482Sandreas.sandberg@arm.com    'tgen-simple-mem',
15911482Sandreas.sandberg@arm.com    'tgen-dram-ctrl',
16012268Sradhika.jagtap@arm.com    'dram-lowp',
16111482Sandreas.sandberg@arm.com
16211482Sandreas.sandberg@arm.com    'learning-gem5-p1-simple',
16311482Sandreas.sandberg@arm.com    'learning-gem5-p1-two-level',
16411482Sandreas.sandberg@arm.com)
16511482Sandreas.sandberg@arm.com
16612068Snikos.nikoleris@arm.comdefault_ruby_protocol = {
16712068Snikos.nikoleris@arm.com    "arm" : "MOESI_CMP_directory",
16812068Snikos.nikoleris@arm.com}
16912068Snikos.nikoleris@arm.com
17012068Snikos.nikoleris@arm.comdef get_default_protocol(arch):
17112075Sspwilson2@wisc.edu    return default_ruby_protocol.get(arch, 'MI_example')
17212068Snikos.nikoleris@arm.com
17311482Sandreas.sandberg@arm.comall_categories = ("quick", "long")
17411482Sandreas.sandberg@arm.comall_modes = ("fs", "se")
17511482Sandreas.sandberg@arm.com
17611482Sandreas.sandberg@arm.comclass Test(object):
17711482Sandreas.sandberg@arm.com    """Test case base class.
17811482Sandreas.sandberg@arm.com
17911482Sandreas.sandberg@arm.com    Test cases consists of one or more test units that are run in two
18011482Sandreas.sandberg@arm.com    phases. A run phase (units produced by run_units() and a verify
18111482Sandreas.sandberg@arm.com    phase (units from verify_units()). The verify phase is skipped if
18211482Sandreas.sandberg@arm.com    the run phase fails.
18311482Sandreas.sandberg@arm.com
18411482Sandreas.sandberg@arm.com    """
18511482Sandreas.sandberg@arm.com
18611482Sandreas.sandberg@arm.com    __metaclass__ = ABCMeta
18711482Sandreas.sandberg@arm.com
18811482Sandreas.sandberg@arm.com    def __init__(self, name):
18911482Sandreas.sandberg@arm.com        self.test_name = name
19011482Sandreas.sandberg@arm.com
19111482Sandreas.sandberg@arm.com    @abstractmethod
19211482Sandreas.sandberg@arm.com    def ref_files(self):
19311482Sandreas.sandberg@arm.com        """Get a list of reference files used by this test case"""
19411482Sandreas.sandberg@arm.com        pass
19511482Sandreas.sandberg@arm.com
19611482Sandreas.sandberg@arm.com    @abstractmethod
19711482Sandreas.sandberg@arm.com    def run_units(self):
19811482Sandreas.sandberg@arm.com        """Units (typically RunGem5 instances) that describe the run phase of
19911482Sandreas.sandberg@arm.com        this test.
20011482Sandreas.sandberg@arm.com
20111482Sandreas.sandberg@arm.com        """
20211482Sandreas.sandberg@arm.com        pass
20311482Sandreas.sandberg@arm.com
20411482Sandreas.sandberg@arm.com    @abstractmethod
20511482Sandreas.sandberg@arm.com    def verify_units(self):
20611482Sandreas.sandberg@arm.com        """Verify the output from the run phase (see run_units())."""
20711482Sandreas.sandberg@arm.com        pass
20811482Sandreas.sandberg@arm.com
20911482Sandreas.sandberg@arm.com    @abstractmethod
21011482Sandreas.sandberg@arm.com    def update_ref(self):
21111482Sandreas.sandberg@arm.com        """Update reference files with files from a test run"""
21211482Sandreas.sandberg@arm.com        pass
21311482Sandreas.sandberg@arm.com
21411482Sandreas.sandberg@arm.com    def run(self):
21511482Sandreas.sandberg@arm.com        """Run this test case and return a list of results"""
21611482Sandreas.sandberg@arm.com
21711482Sandreas.sandberg@arm.com        run_results = [ u.run() for u in self.run_units() ]
21811482Sandreas.sandberg@arm.com        run_ok = all([not r.skipped() and r for r in run_results ])
21911482Sandreas.sandberg@arm.com
22011482Sandreas.sandberg@arm.com        verify_results = [
22111482Sandreas.sandberg@arm.com            u.run() if run_ok else u.skip()
22211482Sandreas.sandberg@arm.com            for u in self.verify_units()
22311482Sandreas.sandberg@arm.com        ]
22411482Sandreas.sandberg@arm.com
22511542Sandreas.sandberg@arm.com        return TestResult(self.test_name,
22611542Sandreas.sandberg@arm.com                          run_results=run_results,
22711542Sandreas.sandberg@arm.com                          verify_results=verify_results)
22811482Sandreas.sandberg@arm.com
22911482Sandreas.sandberg@arm.com    def __str__(self):
23011482Sandreas.sandberg@arm.com        return self.test_name
23111482Sandreas.sandberg@arm.com
23211482Sandreas.sandberg@arm.comclass ClassicTest(Test):
23311503Sandreas.sandberg@arm.com    # The diff ignore list contains all files that shouldn't be diffed
23411503Sandreas.sandberg@arm.com    # using DiffOutFile. These files typically use special-purpose
23511503Sandreas.sandberg@arm.com    # diff tools (e.g., DiffStatFile).
23611571Sandreas.sandberg@arm.com    diff_ignore_files = FileIgnoreList(
23711571Sandreas.sandberg@arm.com        names=(
23811571Sandreas.sandberg@arm.com            # Stat files use a special stat differ
23911571Sandreas.sandberg@arm.com            "stats.txt",
24011571Sandreas.sandberg@arm.com        ), rex=(
24111571Sandreas.sandberg@arm.com        ))
24211503Sandreas.sandberg@arm.com
24311503Sandreas.sandberg@arm.com    # These files should never be included in the list of
24411503Sandreas.sandberg@arm.com    # reference files. This list should include temporary files
24511503Sandreas.sandberg@arm.com    # and other files that we don't care about.
24611571Sandreas.sandberg@arm.com    ref_ignore_files = FileIgnoreList(
24711571Sandreas.sandberg@arm.com        names=(
24811636Sandreas.sandberg@arm.com            "EMPTY",
24911571Sandreas.sandberg@arm.com        ), rex=(
25011571Sandreas.sandberg@arm.com            # Mercurial sometimes leaves backups when applying MQ patches
25111571Sandreas.sandberg@arm.com            r"\.orig$",
25211571Sandreas.sandberg@arm.com            r"\.rej$",
25311571Sandreas.sandberg@arm.com        ))
25411482Sandreas.sandberg@arm.com
25511482Sandreas.sandberg@arm.com    def __init__(self, gem5, output_dir, config_tuple,
25611482Sandreas.sandberg@arm.com                 timeout=None,
25711482Sandreas.sandberg@arm.com                 skip=False, skip_diff_out=False, skip_diff_stat=False):
25811482Sandreas.sandberg@arm.com
25911482Sandreas.sandberg@arm.com        super(ClassicTest, self).__init__("/".join(config_tuple))
26011482Sandreas.sandberg@arm.com
26111482Sandreas.sandberg@arm.com        ct = config_tuple
26211482Sandreas.sandberg@arm.com
26311482Sandreas.sandberg@arm.com        self.gem5 = os.path.abspath(gem5)
26411482Sandreas.sandberg@arm.com        self.script = os.path.join(_test_base, "run.py")
26511482Sandreas.sandberg@arm.com        self.config_tuple = ct
26611482Sandreas.sandberg@arm.com        self.timeout = timeout
26711482Sandreas.sandberg@arm.com
26811482Sandreas.sandberg@arm.com        self.output_dir = output_dir
26911482Sandreas.sandberg@arm.com        self.ref_dir = os.path.join(_test_base,
27011482Sandreas.sandberg@arm.com                                    ct.category, ct.mode, ct.workload,
27111482Sandreas.sandberg@arm.com                                    "ref", ct.isa, ct.os, ct.config)
27211482Sandreas.sandberg@arm.com        self.skip_run = skip
27311482Sandreas.sandberg@arm.com        self.skip_diff_out = skip or skip_diff_out
27411482Sandreas.sandberg@arm.com        self.skip_diff_stat = skip or skip_diff_stat
27511482Sandreas.sandberg@arm.com
27611482Sandreas.sandberg@arm.com    def ref_files(self):
27711482Sandreas.sandberg@arm.com        ref_dir = os.path.abspath(self.ref_dir)
27811482Sandreas.sandberg@arm.com        for root, dirs, files in os.walk(ref_dir, topdown=False):
27911482Sandreas.sandberg@arm.com            for f in files:
28011482Sandreas.sandberg@arm.com                fpath = os.path.join(root[len(ref_dir) + 1:], f)
28111503Sandreas.sandberg@arm.com                if fpath not in ClassicTest.ref_ignore_files:
28211482Sandreas.sandberg@arm.com                    yield fpath
28311482Sandreas.sandberg@arm.com
28411482Sandreas.sandberg@arm.com    def run_units(self):
28511482Sandreas.sandberg@arm.com        args = [
28611482Sandreas.sandberg@arm.com            self.script,
28711482Sandreas.sandberg@arm.com            "/".join(self.config_tuple),
28811482Sandreas.sandberg@arm.com        ]
28911482Sandreas.sandberg@arm.com
29011482Sandreas.sandberg@arm.com        return [
29111482Sandreas.sandberg@arm.com            RunGem5(self.gem5, args,
29211482Sandreas.sandberg@arm.com                    ref_dir=self.ref_dir, test_dir=self.output_dir,
29311482Sandreas.sandberg@arm.com                    skip=self.skip_run),
29411482Sandreas.sandberg@arm.com        ]
29511482Sandreas.sandberg@arm.com
29611482Sandreas.sandberg@arm.com    def verify_units(self):
29711636Sandreas.sandberg@arm.com        ref_files = set(self.ref_files())
29811636Sandreas.sandberg@arm.com        units = []
29911636Sandreas.sandberg@arm.com        if "stats.txt" in ref_files:
30011636Sandreas.sandberg@arm.com            units.append(
30111636Sandreas.sandberg@arm.com                DiffStatFile(ref_dir=self.ref_dir, test_dir=self.output_dir,
30211636Sandreas.sandberg@arm.com                             skip=self.skip_diff_stat))
30311636Sandreas.sandberg@arm.com        units += [
30411482Sandreas.sandberg@arm.com            DiffOutFile(f,
30511482Sandreas.sandberg@arm.com                        ref_dir=self.ref_dir, test_dir=self.output_dir,
30611482Sandreas.sandberg@arm.com                        skip=self.skip_diff_out)
30711636Sandreas.sandberg@arm.com            for f in ref_files if f not in ClassicTest.diff_ignore_files
30811482Sandreas.sandberg@arm.com        ]
30911482Sandreas.sandberg@arm.com
31011636Sandreas.sandberg@arm.com        return units
31111636Sandreas.sandberg@arm.com
31211482Sandreas.sandberg@arm.com    def update_ref(self):
31311482Sandreas.sandberg@arm.com        for fname in self.ref_files():
31411482Sandreas.sandberg@arm.com            shutil.copy(
31511482Sandreas.sandberg@arm.com                os.path.join(self.output_dir, fname),
31611482Sandreas.sandberg@arm.com                os.path.join(self.ref_dir, fname))
31711482Sandreas.sandberg@arm.com
31811482Sandreas.sandberg@arm.comdef parse_test_filter(test_filter):
31911482Sandreas.sandberg@arm.com    wildcards = ("", "*")
32011482Sandreas.sandberg@arm.com
32111482Sandreas.sandberg@arm.com    _filter = list(test_filter.split("/"))
32211482Sandreas.sandberg@arm.com    if len(_filter) > 3:
32311482Sandreas.sandberg@arm.com        raise RuntimeError("Illegal test filter string")
32411482Sandreas.sandberg@arm.com    _filter += [ "", ] * (3 - len(_filter))
32511482Sandreas.sandberg@arm.com
32611482Sandreas.sandberg@arm.com    isa, cat, mode = _filter
32711482Sandreas.sandberg@arm.com
32811482Sandreas.sandberg@arm.com    if isa in wildcards:
32911482Sandreas.sandberg@arm.com        raise RuntimeError("No ISA specified")
33011482Sandreas.sandberg@arm.com
33111482Sandreas.sandberg@arm.com    cat = all_categories if cat in wildcards else (cat, )
33211482Sandreas.sandberg@arm.com    mode = all_modes if mode in wildcards else (mode, )
33311482Sandreas.sandberg@arm.com
33411482Sandreas.sandberg@arm.com    return isa, cat, mode
33511482Sandreas.sandberg@arm.com
33611482Sandreas.sandberg@arm.comdef get_tests(isa,
33711482Sandreas.sandberg@arm.com              categories=all_categories, modes=all_modes,
33811482Sandreas.sandberg@arm.com              ruby_protocol=None, gpu_isa=None):
33911482Sandreas.sandberg@arm.com
34011482Sandreas.sandberg@arm.com    # Generate a list of candidate configs
34111482Sandreas.sandberg@arm.com    configs = list(arch_configs.get((isa, gpu_isa), []))
34211482Sandreas.sandberg@arm.com
34311482Sandreas.sandberg@arm.com    if (isa, gpu_isa) == ("x86", "hsail"):
34411482Sandreas.sandberg@arm.com        if ruby_protocol == "GPU_RfO":
34511482Sandreas.sandberg@arm.com            configs += ['gpu-randomtest']
34611482Sandreas.sandberg@arm.com    else:
34711482Sandreas.sandberg@arm.com        configs += generic_configs
34811482Sandreas.sandberg@arm.com
34912068Snikos.nikoleris@arm.com    if ruby_protocol == get_default_protocol(isa):
35012068Snikos.nikoleris@arm.com        if ruby_protocol == 'MI_example':
35112068Snikos.nikoleris@arm.com            configs += [ "%s-ruby" % (c, ) for c in configs ]
35212068Snikos.nikoleris@arm.com        else:
35312068Snikos.nikoleris@arm.com            configs += [ "%s-ruby-%s" % (c, ruby_protocol) for c in configs ]
35411482Sandreas.sandberg@arm.com    elif ruby_protocol is not None:
35511511Sandreas.sandberg@arm.com        # Override generic ISA configs when using Ruby (excluding
35611511Sandreas.sandberg@arm.com        # MI_example which is included in all ISAs by default). This
35711511Sandreas.sandberg@arm.com        # reduces the number of generic tests we re-run for when
35811511Sandreas.sandberg@arm.com        # compiling Ruby targets.
35911511Sandreas.sandberg@arm.com        configs = [ "%s-ruby-%s" % (c, ruby_protocol) for c in configs ]
36011482Sandreas.sandberg@arm.com
36111482Sandreas.sandberg@arm.com    # /(quick|long)/(fs|se)/workload/ref/arch/guest/config/
36211482Sandreas.sandberg@arm.com    for conf_script in configs:
36311482Sandreas.sandberg@arm.com        for cat in categories:
36411482Sandreas.sandberg@arm.com            for mode in modes:
36511482Sandreas.sandberg@arm.com                mode_dir = os.path.join(_test_base, cat, mode)
36611482Sandreas.sandberg@arm.com                if not os.path.exists(mode_dir):
36711482Sandreas.sandberg@arm.com                    continue
36811482Sandreas.sandberg@arm.com
36911482Sandreas.sandberg@arm.com                for workload in os.listdir(mode_dir):
37011482Sandreas.sandberg@arm.com                    isa_dir = os.path.join(mode_dir, workload, "ref", isa)
37111482Sandreas.sandberg@arm.com                    if not os.path.isdir(isa_dir):
37211482Sandreas.sandberg@arm.com                        continue
37311482Sandreas.sandberg@arm.com
37411482Sandreas.sandberg@arm.com                    for _os in os.listdir(isa_dir):
37511482Sandreas.sandberg@arm.com                        test_dir = os.path.join(isa_dir, _os, conf_script)
37611482Sandreas.sandberg@arm.com                        if not os.path.exists(test_dir) or \
37711482Sandreas.sandberg@arm.com                           os.path.exists(os.path.join(test_dir, "skip")):
37811482Sandreas.sandberg@arm.com                            continue
37911482Sandreas.sandberg@arm.com
38011482Sandreas.sandberg@arm.com                        yield ClassicConfig(cat, mode, workload, isa, _os,
38111482Sandreas.sandberg@arm.com                                            conf_script)
382