CpuConfig.py revision 13684
110453SAndrew.Bardsley@arm.com# Copyright (c) 2012, 2017-2018 ARM Limited 211235Sandreas.sandberg@arm.com# All rights reserved. 310453SAndrew.Bardsley@arm.com# 410453SAndrew.Bardsley@arm.com# The license below extends only to copyright in the software and shall 510453SAndrew.Bardsley@arm.com# not be construed as granting a license to any other intellectual 610453SAndrew.Bardsley@arm.com# property including but not limited to intellectual property relating 710453SAndrew.Bardsley@arm.com# to a hardware implementation of the functionality of the software 810453SAndrew.Bardsley@arm.com# licensed hereunder. You may use the software subject to the license 910453SAndrew.Bardsley@arm.com# terms below provided that you ensure that this notice is replicated 1010453SAndrew.Bardsley@arm.com# unmodified and in its entirety in all distributions of the software, 1110453SAndrew.Bardsley@arm.com# modified or unmodified, in source code or in binary form. 1210453SAndrew.Bardsley@arm.com# 1310453SAndrew.Bardsley@arm.com# Redistribution and use in source and binary forms, with or without 1410453SAndrew.Bardsley@arm.com# modification, are permitted provided that the following conditions are 1510453SAndrew.Bardsley@arm.com# met: redistributions of source code must retain the above copyright 1610453SAndrew.Bardsley@arm.com# notice, this list of conditions and the following disclaimer; 1710453SAndrew.Bardsley@arm.com# redistributions in binary form must reproduce the above copyright 1810453SAndrew.Bardsley@arm.com# notice, this list of conditions and the following disclaimer in the 1910453SAndrew.Bardsley@arm.com# documentation and/or other materials provided with the distribution; 2010453SAndrew.Bardsley@arm.com# neither the name of the copyright holders nor the names of its 2110453SAndrew.Bardsley@arm.com# contributors may be used to endorse or promote products derived from 2210453SAndrew.Bardsley@arm.com# this software without specific prior written permission. 2310453SAndrew.Bardsley@arm.com# 2410453SAndrew.Bardsley@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2510453SAndrew.Bardsley@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2610453SAndrew.Bardsley@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2710453SAndrew.Bardsley@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2810453SAndrew.Bardsley@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2910453SAndrew.Bardsley@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3010453SAndrew.Bardsley@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3110453SAndrew.Bardsley@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3210453SAndrew.Bardsley@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3310453SAndrew.Bardsley@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3410453SAndrew.Bardsley@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3510453SAndrew.Bardsley@arm.com# 3610453SAndrew.Bardsley@arm.com# Authors: Andreas Sandberg 3710453SAndrew.Bardsley@arm.com 3810453SAndrew.Bardsley@arm.comfrom __future__ import print_function 3910453SAndrew.Bardsley@arm.com 4010453SAndrew.Bardsley@arm.comfrom m5 import fatal 4110453SAndrew.Bardsley@arm.comimport m5.objects 4210453SAndrew.Bardsley@arm.comimport inspect 4310453SAndrew.Bardsley@arm.comimport sys 4411235Sandreas.sandberg@arm.comfrom textwrap import TextWrapper 4511235Sandreas.sandberg@arm.com 4611235Sandreas.sandberg@arm.com# Dictionary of mapping names of real CPU models to classes. 4711235Sandreas.sandberg@arm.com_cpu_classes = {} 4811235Sandreas.sandberg@arm.com 4910453SAndrew.Bardsley@arm.com 5010453SAndrew.Bardsley@arm.comdef is_cpu_class(cls): 5110453SAndrew.Bardsley@arm.com """Determine if a class is a CPU that can be instantiated""" 5210453SAndrew.Bardsley@arm.com 5311235Sandreas.sandberg@arm.com # We can't use the normal inspect.isclass because the ParamFactory 5410453SAndrew.Bardsley@arm.com # and ProxyFactory classes have a tendency to confuse it. 5510453SAndrew.Bardsley@arm.com try: 5611235Sandreas.sandberg@arm.com return issubclass(cls, m5.objects.BaseCPU) and \ 5710453SAndrew.Bardsley@arm.com not cls.abstract and \ 5810476Sandreas.hansson@arm.com not issubclass(cls, m5.objects.CheckerCPU) 5910453SAndrew.Bardsley@arm.com except (TypeError, AttributeError): 6010453SAndrew.Bardsley@arm.com return False 6110453SAndrew.Bardsley@arm.com 6211235Sandreas.sandberg@arm.comdef _cpu_subclass_tester(name): 6311235Sandreas.sandberg@arm.com cpu_class = getattr(m5.objects, name, None) 6411235Sandreas.sandberg@arm.com 6511235Sandreas.sandberg@arm.com def tester(cls): 6611235Sandreas.sandberg@arm.com return cpu_class is not None and cls is not None and \ 6711235Sandreas.sandberg@arm.com issubclass(cls, cpu_class) 6811235Sandreas.sandberg@arm.com 6911235Sandreas.sandberg@arm.com return tester 7011235Sandreas.sandberg@arm.com 7111235Sandreas.sandberg@arm.comis_kvm_cpu = _cpu_subclass_tester("BaseKvmCPU") 7211235Sandreas.sandberg@arm.comis_atomic_cpu = _cpu_subclass_tester("AtomicSimpleCPU") 7311235Sandreas.sandberg@arm.comis_noncaching_cpu = _cpu_subclass_tester("NonCachingSimpleCPU") 7411235Sandreas.sandberg@arm.com 7511235Sandreas.sandberg@arm.comdef get(name): 7611235Sandreas.sandberg@arm.com """Get a CPU class from a user provided class name or alias.""" 7711235Sandreas.sandberg@arm.com 7811235Sandreas.sandberg@arm.com try: 7911235Sandreas.sandberg@arm.com cpu_class = _cpu_classes[name] 8011235Sandreas.sandberg@arm.com return cpu_class 8111235Sandreas.sandberg@arm.com except KeyError: 8211235Sandreas.sandberg@arm.com print("%s is not a valid CPU model." % (name,)) 8311235Sandreas.sandberg@arm.com sys.exit(1) 8411235Sandreas.sandberg@arm.com 8511235Sandreas.sandberg@arm.comdef print_cpu_list(): 8611235Sandreas.sandberg@arm.com """Print a list of available CPU classes including their aliases.""" 8711235Sandreas.sandberg@arm.com 8811235Sandreas.sandberg@arm.com print("Available CPU classes:") 8911235Sandreas.sandberg@arm.com doc_wrapper = TextWrapper(initial_indent="\t\t", subsequent_indent="\t\t") 9011235Sandreas.sandberg@arm.com for name, cls in _cpu_classes.items(): 9111235Sandreas.sandberg@arm.com print("\t%s" % name) 9211235Sandreas.sandberg@arm.com 9311235Sandreas.sandberg@arm.com # Try to extract the class documentation from the class help 9411235Sandreas.sandberg@arm.com # string. 9511235Sandreas.sandberg@arm.com doc = inspect.getdoc(cls) 9611235Sandreas.sandberg@arm.com if doc: 9711235Sandreas.sandberg@arm.com for line in doc_wrapper.wrap(doc): 9811235Sandreas.sandberg@arm.com print(line) 9911235Sandreas.sandberg@arm.com 10011235Sandreas.sandberg@arm.comdef cpu_names(): 10111235Sandreas.sandberg@arm.com """Return a list of valid CPU names.""" 10211235Sandreas.sandberg@arm.com return _cpu_classes.keys() 10311235Sandreas.sandberg@arm.com 10411235Sandreas.sandberg@arm.comdef config_etrace(cpu_cls, cpu_list, options): 10510453SAndrew.Bardsley@arm.com if issubclass(cpu_cls, m5.objects.DerivO3CPU): 10610453SAndrew.Bardsley@arm.com # Assign the same file name to all cpus for now. This must be 10710453SAndrew.Bardsley@arm.com # revisited when creating elastic traces for multi processor systems. 10810453SAndrew.Bardsley@arm.com for cpu in cpu_list: 10910453SAndrew.Bardsley@arm.com # Attach the elastic trace probe listener. Set the protobuf trace 11010453SAndrew.Bardsley@arm.com # file names. Set the dependency window size equal to the cpu it 11110476Sandreas.hansson@arm.com # is attached to. 11210476Sandreas.hansson@arm.com cpu.traceListener = m5.objects.ElasticTrace( 11310453SAndrew.Bardsley@arm.com instFetchTraceFile = options.inst_trace_file, 11410453SAndrew.Bardsley@arm.com dataDepTraceFile = options.data_trace_file, 11510453SAndrew.Bardsley@arm.com depWindowSize = 3 * cpu.numROBEntries) 11610453SAndrew.Bardsley@arm.com # Make the number of entries in the ROB, LQ and SQ very 11710453SAndrew.Bardsley@arm.com # large so that there are no stalls due to resource 11810453SAndrew.Bardsley@arm.com # limitation as such stalls will get captured in the trace 11910453SAndrew.Bardsley@arm.com # as compute delay. For replay, ROB, LQ and SQ sizes are 12010453SAndrew.Bardsley@arm.com # modelled in the Trace CPU. 12110476Sandreas.hansson@arm.com cpu.numROBEntries = 512; 12210476Sandreas.hansson@arm.com cpu.LQEntries = 128; 12310453SAndrew.Bardsley@arm.com cpu.SQEntries = 128; 12410453SAndrew.Bardsley@arm.com else: 12510453SAndrew.Bardsley@arm.com fatal("%s does not support data dependency tracing. Use a CPU model of" 12610453SAndrew.Bardsley@arm.com " type or inherited from DerivO3CPU.", cpu_cls) 12710453SAndrew.Bardsley@arm.com 12810453SAndrew.Bardsley@arm.com# Add all CPUs in the object hierarchy. 12910453SAndrew.Bardsley@arm.comfor name, cls in inspect.getmembers(m5.objects, is_cpu_class): 13010453SAndrew.Bardsley@arm.com _cpu_classes[name] = cls 13110476Sandreas.hansson@arm.com 13210476Sandreas.hansson@arm.com 13310453SAndrew.Bardsley@arm.comfrom m5.defines import buildEnv 13410453SAndrew.Bardsley@arm.comfrom importlib import import_module 13510453SAndrew.Bardsley@arm.comfor package in [ "generic", buildEnv['TARGET_ISA']]: 13610453SAndrew.Bardsley@arm.com try: 13710453SAndrew.Bardsley@arm.com package = import_module(".cores." + package, package=__package__) 13810453SAndrew.Bardsley@arm.com except ImportError: 13911235Sandreas.sandberg@arm.com # No timing models for this ISA 14011235Sandreas.sandberg@arm.com continue 14111235Sandreas.sandberg@arm.com 14211235Sandreas.sandberg@arm.com for mod_name, module in inspect.getmembers(package, inspect.ismodule): 14311235Sandreas.sandberg@arm.com for name, cls in inspect.getmembers(module, is_cpu_class): 14411235Sandreas.sandberg@arm.com _cpu_classes[name] = cls 14511235Sandreas.sandberg@arm.com