diff options
Diffstat (limited to 'configs/common')
-rw-r--r-- | configs/common/CpuConfig.py | 79 | ||||
-rw-r--r-- | configs/common/ObjectList.py | 45 | ||||
-rw-r--r-- | configs/common/Options.py | 9 | ||||
-rw-r--r-- | configs/common/Simulation.py | 5 |
4 files changed, 53 insertions, 85 deletions
diff --git a/configs/common/CpuConfig.py b/configs/common/CpuConfig.py index 0228148d5..9a0fcd9d6 100644 --- a/configs/common/CpuConfig.py +++ b/configs/common/CpuConfig.py @@ -40,66 +40,6 @@ from __future__ import absolute_import from m5 import fatal import m5.objects -import inspect -import sys -from textwrap import TextWrapper - -# Dictionary of mapping names of real CPU models to classes. -_cpu_classes = {} - - -def is_cpu_class(cls): - """Determine if a class is a CPU that can be instantiated""" - - # We can't use the normal inspect.isclass because the ParamFactory - # and ProxyFactory classes have a tendency to confuse it. - try: - return issubclass(cls, m5.objects.BaseCPU) and \ - not cls.abstract and \ - not issubclass(cls, m5.objects.CheckerCPU) - except (TypeError, AttributeError): - return False - -def _cpu_subclass_tester(name): - cpu_class = getattr(m5.objects, name, None) - - def tester(cls): - return cpu_class is not None and cls is not None and \ - issubclass(cls, cpu_class) - - return tester - -is_kvm_cpu = _cpu_subclass_tester("BaseKvmCPU") -is_noncaching_cpu = _cpu_subclass_tester("NonCachingSimpleCPU") - -def get(name): - """Get a CPU class from a user provided class name or alias.""" - - try: - cpu_class = _cpu_classes[name] - return cpu_class - except KeyError: - print("%s is not a valid CPU model." % (name,)) - sys.exit(1) - -def print_cpu_list(): - """Print a list of available CPU classes including their aliases.""" - - print("Available CPU classes:") - doc_wrapper = TextWrapper(initial_indent="\t\t", subsequent_indent="\t\t") - for name, cls in _cpu_classes.items(): - print("\t%s" % name) - - # Try to extract the class documentation from the class help - # string. - doc = inspect.getdoc(cls) - if doc: - for line in doc_wrapper.wrap(doc): - print(line) - -def cpu_names(): - """Return a list of valid CPU names.""" - return list(_cpu_classes.keys()) def config_etrace(cpu_cls, cpu_list, options): if issubclass(cpu_cls, m5.objects.DerivO3CPU): @@ -124,22 +64,3 @@ def config_etrace(cpu_cls, cpu_list, options): else: fatal("%s does not support data dependency tracing. Use a CPU model of" " type or inherited from DerivO3CPU.", cpu_cls) - -# Add all CPUs in the object hierarchy. -for name, cls in inspect.getmembers(m5.objects, is_cpu_class): - _cpu_classes[name] = cls - - -from m5.defines import buildEnv -from importlib import import_module -for package in [ "generic", buildEnv['TARGET_ISA']]: - try: - package = import_module(".cores." + package, - package=__name__.rpartition('.')[0]) - except ImportError: - # No timing models for this ISA - continue - - for mod_name, module in inspect.getmembers(package, inspect.ismodule): - for name, cls in inspect.getmembers(module, is_cpu_class): - _cpu_classes[name] = cls diff --git a/configs/common/ObjectList.py b/configs/common/ObjectList.py index fec78dca7..31f8c4194 100644 --- a/configs/common/ObjectList.py +++ b/configs/common/ObjectList.py @@ -103,3 +103,48 @@ class ObjectList(object): # Dictionary that maps names of real models to classes self._sub_classes = {} self._add_objects() + +class CPUList(ObjectList): + def _is_obj_class(self, cls): + """Determine if a class is a CPU that can be instantiated""" + + # We can't use the normal inspect.isclass because the ParamFactory + # and ProxyFactory classes have a tendency to confuse it. + try: + return super(CPUList, self)._is_obj_class(cls) and \ + not issubclass(cls, m5.objects.CheckerCPU) + except (TypeError, AttributeError): + return False + + def _add_objects(self): + super(CPUList, self)._add_objects() + + from m5.defines import buildEnv + from importlib import import_module + for package in [ "generic", buildEnv['TARGET_ISA']]: + try: + package = import_module(".cores." + package, + package=__name__.rpartition('.')[0]) + except ImportError: + # No timing models for this ISA + continue + + for mod_name, module in \ + inspect.getmembers(package, inspect.ismodule): + for name, cls in inspect.getmembers(module, + self._is_obj_class): + self._sub_classes[name] = cls + +cpu_list = CPUList(m5.objects.BaseCPU) + +def _subclass_tester(name): + sub_class = getattr(m5.objects, name, None) + + def tester(cls): + return sub_class is not None and cls is not None and \ + issubclass(cls, sub_class) + + return tester + +is_kvm_cpu = _subclass_tester("BaseKvmCPU") +is_noncaching_cpu = _subclass_tester("NonCachingSimpleCPU") diff --git a/configs/common/Options.py b/configs/common/Options.py index f6fa0d031..57ee562cc 100644 --- a/configs/common/Options.py +++ b/configs/common/Options.py @@ -46,14 +46,14 @@ from m5.defines import buildEnv from m5.objects import * from .Benchmarks import * -from . import CpuConfig +from . import ObjectList from . import BPConfig from . import HWPConfig from . import MemConfig from . import PlatformConfig def _listCpuTypes(option, opt, value, parser): - CpuConfig.print_cpu_list() + ObjectList.cpu_list.print() sys.exit(0) def _listBPTypes(option, opt, value, parser): @@ -163,7 +163,7 @@ def addCommonOptions(parser): action="callback", callback=_listCpuTypes, help="List available CPU types") parser.add_option("--cpu-type", type="choice", default="AtomicSimpleCPU", - choices=CpuConfig.cpu_names(), + choices=ObjectList.cpu_list.get_names(), help = "type of cpu to run with") parser.add_option("--list-bp-types", action="callback", callback=_listBPTypes, @@ -317,7 +317,8 @@ def addCommonOptions(parser): parser.add_option("--work-cpus-checkpoint-count", action="store", type="int", help="checkpoint and exit when active cpu count is reached") parser.add_option("--restore-with-cpu", action="store", type="choice", - default="AtomicSimpleCPU", choices=CpuConfig.cpu_names(), + default="AtomicSimpleCPU", + choices=ObjectList.cpu_list.get_names(), help = "cpu type for restoring from a checkpoint") diff --git a/configs/common/Simulation.py b/configs/common/Simulation.py index 56107c1e6..457caf9aa 100644 --- a/configs/common/Simulation.py +++ b/configs/common/Simulation.py @@ -46,7 +46,8 @@ import sys from os import getcwd from os.path import join as joinpath -from . import CpuConfig +from common import CpuConfig +from . import ObjectList from . import BPConfig from . import MemConfig @@ -59,7 +60,7 @@ addToPath('../common') def getCPUClass(cpu_type): """Returns the required cpu class and the mode of operation.""" - cls = CpuConfig.get(cpu_type) + cls = ObjectList.cpu_list.get(cpu_type) return cls, cls.memory_mode() def setCPUClass(options): |