113432Spau.cabre@metempsy.com# Copyright (c) 2018 Metempsy Technology Consulting 213432Spau.cabre@metempsy.com# All rights reserved. 313432Spau.cabre@metempsy.com# 413432Spau.cabre@metempsy.com# Redistribution and use in source and binary forms, with or without 513432Spau.cabre@metempsy.com# modification, are permitted provided that the following conditions are 613432Spau.cabre@metempsy.com# met: redistributions of source code must retain the above copyright 713432Spau.cabre@metempsy.com# notice, this list of conditions and the following disclaimer; 813432Spau.cabre@metempsy.com# redistributions in binary form must reproduce the above copyright 913432Spau.cabre@metempsy.com# notice, this list of conditions and the following disclaimer in the 1013432Spau.cabre@metempsy.com# documentation and/or other materials provided with the distribution; 1113432Spau.cabre@metempsy.com# neither the name of the copyright holders nor the names of its 1213432Spau.cabre@metempsy.com# contributors may be used to endorse or promote products derived from 1313432Spau.cabre@metempsy.com# this software without specific prior written permission. 1413432Spau.cabre@metempsy.com# 1513432Spau.cabre@metempsy.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1613432Spau.cabre@metempsy.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1713432Spau.cabre@metempsy.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1813432Spau.cabre@metempsy.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1913432Spau.cabre@metempsy.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2013432Spau.cabre@metempsy.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2113432Spau.cabre@metempsy.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2213432Spau.cabre@metempsy.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2313432Spau.cabre@metempsy.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2413432Spau.cabre@metempsy.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2513432Spau.cabre@metempsy.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2613432Spau.cabre@metempsy.com# 2713432Spau.cabre@metempsy.com# Authors: Pau Cabre 2813432Spau.cabre@metempsy.com 2913432Spau.cabre@metempsy.com# This file is a copy of MemConfig.py / CpuConfig.py, but modified to 3013432Spau.cabre@metempsy.com# hanle branch predictors instead of memory controllers / CPUs 3113432Spau.cabre@metempsy.com 3213432Spau.cabre@metempsy.comfrom __future__ import print_function 3313774Sandreas.sandberg@arm.comfrom __future__ import absolute_import 3413432Spau.cabre@metempsy.com 3513432Spau.cabre@metempsy.comfrom m5 import fatal 3613432Spau.cabre@metempsy.comimport m5.objects 3713432Spau.cabre@metempsy.comimport inspect 3813432Spau.cabre@metempsy.comimport sys 3913432Spau.cabre@metempsy.comfrom textwrap import TextWrapper 4013432Spau.cabre@metempsy.com 4113432Spau.cabre@metempsy.com# Dictionary of mapping names of real branch predictor models to classes. 4213432Spau.cabre@metempsy.com_bp_classes = {} 4313432Spau.cabre@metempsy.com 4413432Spau.cabre@metempsy.com 4513432Spau.cabre@metempsy.comdef is_bp_class(cls): 4613432Spau.cabre@metempsy.com """Determine if a class is a branch predictor that can be instantiated""" 4713432Spau.cabre@metempsy.com 4813432Spau.cabre@metempsy.com # We can't use the normal inspect.isclass because the ParamFactory 4913432Spau.cabre@metempsy.com # and ProxyFactory classes have a tendency to confuse it. 5013432Spau.cabre@metempsy.com try: 5113432Spau.cabre@metempsy.com return issubclass(cls, m5.objects.BranchPredictor) and \ 5213432Spau.cabre@metempsy.com not cls.abstract 5313432Spau.cabre@metempsy.com except (TypeError, AttributeError): 5413432Spau.cabre@metempsy.com return False 5513432Spau.cabre@metempsy.com 5613432Spau.cabre@metempsy.comdef get(name): 5713432Spau.cabre@metempsy.com """Get a BP class from a user provided class name or alias.""" 5813432Spau.cabre@metempsy.com 5913432Spau.cabre@metempsy.com try: 6013432Spau.cabre@metempsy.com bp_class = _bp_classes[name] 6113432Spau.cabre@metempsy.com return bp_class 6213432Spau.cabre@metempsy.com except KeyError: 6313432Spau.cabre@metempsy.com print("%s is not a valid BP model." % (name,)) 6413432Spau.cabre@metempsy.com sys.exit(1) 6513432Spau.cabre@metempsy.com 6613432Spau.cabre@metempsy.comdef print_bp_list(): 6713432Spau.cabre@metempsy.com """Print a list of available BP classes.""" 6813432Spau.cabre@metempsy.com 6913432Spau.cabre@metempsy.com print("Available BranchPredictor classes:") 7013432Spau.cabre@metempsy.com doc_wrapper = TextWrapper(initial_indent="\t\t", subsequent_indent="\t\t") 7113432Spau.cabre@metempsy.com for name, cls in _bp_classes.items(): 7213432Spau.cabre@metempsy.com print("\t%s" % name) 7313432Spau.cabre@metempsy.com 7413432Spau.cabre@metempsy.com # Try to extract the class documentation from the class help 7513432Spau.cabre@metempsy.com # string. 7613432Spau.cabre@metempsy.com doc = inspect.getdoc(cls) 7713432Spau.cabre@metempsy.com if doc: 7813432Spau.cabre@metempsy.com for line in doc_wrapper.wrap(doc): 7913432Spau.cabre@metempsy.com print(line) 8013432Spau.cabre@metempsy.com 8113432Spau.cabre@metempsy.comdef bp_names(): 8213432Spau.cabre@metempsy.com """Return a list of valid Branch Predictor names.""" 8313731Sandreas.sandberg@arm.com return list(_bp_classes.keys()) 8413432Spau.cabre@metempsy.com 8513432Spau.cabre@metempsy.com# Add all BPs in the object hierarchy. 8613432Spau.cabre@metempsy.comfor name, cls in inspect.getmembers(m5.objects, is_bp_class): 8713432Spau.cabre@metempsy.com _bp_classes[name] = cls 8813432Spau.cabre@metempsy.com 8913958Sjairo.balart@metempsy.com 9013958Sjairo.balart@metempsy.com# The same for indirect branch predictors... 9113958Sjairo.balart@metempsy.com# Dictionary of mapping names of real branch predictor models to classes. 9213958Sjairo.balart@metempsy.com_indirect_bp_classes = {} 9313958Sjairo.balart@metempsy.com 9413958Sjairo.balart@metempsy.com 9513958Sjairo.balart@metempsy.comdef is_indirect_bp_class(cls): 9613958Sjairo.balart@metempsy.com """Determine if a class is an indirect branch predictor that can be 9713958Sjairo.balart@metempsy.com instantiated""" 9813958Sjairo.balart@metempsy.com 9913958Sjairo.balart@metempsy.com # We can't use the normal inspect.isclass because the ParamFactory 10013958Sjairo.balart@metempsy.com # and ProxyFactory classes have a tendency to confuse it. 10113958Sjairo.balart@metempsy.com try: 10213958Sjairo.balart@metempsy.com return issubclass(cls, m5.objects.IndirectPredictor) and \ 10313958Sjairo.balart@metempsy.com not cls.abstract 10413958Sjairo.balart@metempsy.com except (TypeError, AttributeError): 10513958Sjairo.balart@metempsy.com return False 10613958Sjairo.balart@metempsy.com 10713958Sjairo.balart@metempsy.comdef get_indirect(name): 10813958Sjairo.balart@metempsy.com """Get an Indirect BP class from a user provided class name or alias.""" 10913958Sjairo.balart@metempsy.com 11013958Sjairo.balart@metempsy.com try: 11113958Sjairo.balart@metempsy.com indirect_bp_class = _indirect_bp_classes[name] 11213958Sjairo.balart@metempsy.com return indirect_bp_class 11313958Sjairo.balart@metempsy.com except KeyError: 11413958Sjairo.balart@metempsy.com print("%s is not a valid indirect BP model." % (name,)) 11513958Sjairo.balart@metempsy.com sys.exit(1) 11613958Sjairo.balart@metempsy.com 11713958Sjairo.balart@metempsy.comdef print_indirect_bp_list(): 11813958Sjairo.balart@metempsy.com """Print a list of available indirect BP classes.""" 11913958Sjairo.balart@metempsy.com 12013958Sjairo.balart@metempsy.com print("Available Indirect BranchPredictor classes:") 12113958Sjairo.balart@metempsy.com doc_wrapper = TextWrapper(initial_indent="\t\t", subsequent_indent="\t\t") 12213958Sjairo.balart@metempsy.com for name, cls in _indirect_bp_classes.items(): 12313958Sjairo.balart@metempsy.com print("\t%s" % name) 12413958Sjairo.balart@metempsy.com 12513958Sjairo.balart@metempsy.com # Try to extract the class documentation from the class help 12613958Sjairo.balart@metempsy.com # string. 12713958Sjairo.balart@metempsy.com doc = inspect.getdoc(cls) 12813958Sjairo.balart@metempsy.com if doc: 12913958Sjairo.balart@metempsy.com for line in doc_wrapper.wrap(doc): 13013958Sjairo.balart@metempsy.com print(line) 13113958Sjairo.balart@metempsy.com 13213958Sjairo.balart@metempsy.comdef indirect_bp_names(): 13313958Sjairo.balart@metempsy.com """Return a list of valid Indirect Branch Predictor names.""" 13413958Sjairo.balart@metempsy.com return _indirect_bp_classes.keys() 13513958Sjairo.balart@metempsy.com 13613958Sjairo.balart@metempsy.com# Add all indirect BPs in the object hierarchy. 13713958Sjairo.balart@metempsy.comfor name, cls in inspect.getmembers(m5.objects, is_indirect_bp_class): 13813958Sjairo.balart@metempsy.com _indirect_bp_classes[name] = cls 13913958Sjairo.balart@metempsy.com 140