generate.py

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· Python 代码 · 共 531 行 · 第 1/2 页

PY
531
字号
# Copyright (c) 2004, 2005, 2006# The Regents of The University of Michigan# All Rights Reserved## This code is part of the M5 simulator.## Permission is granted to use, copy, create derivative works and# redistribute this software and such derivative works for any# purpose, so long as the copyright notice above, this grant of# permission, and the disclaimer below appear in all copies made; and# so long as the name of The University of Michigan is not used in any# advertising or publicity pertaining to the use or distribution of# this software without specific, written prior authorization.## THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE# UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND# WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER# EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR# PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE# LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT,# INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM# ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN# IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH# DAMAGES.## Authors: Nathan L. Binkert#import impimport py_compileimport sysimport zipfilefrom os.path import basenamefrom os.path import existsclass DictImporter(object):    '''This importer takes a dictionary of arbitrary module names that    map to arbitrary filenames.'''    def __init__(self, modules, build_env):        self.modules = modules        self.installed = set()        self.build_env = build_env    def __del__(self):        self.unload()    def unload(self):        import sys        for module in self.installed:            del sys.modules[module]        self.installed = set()    def find_module(self, fullname, path):        if fullname == '__scons':            return self        if fullname == 'm5.objects':            return self        if fullname.startswith('m5.internal'):            return None        if fullname in self.modules and exists(self.modules[fullname]):            return self        return None    def load_module(self, fullname):        mod = imp.new_module(fullname)        sys.modules[fullname] = mod        self.installed.add(fullname)        mod.__loader__ = self        if fullname == 'm5.objects':            mod.__path__ = fullname.split('.')            return mod        if fullname == '__scons':            mod.__dict__['m5_build_env'] = self.build_env            return mod        srcfile = self.modules[fullname]        if basename(srcfile) == '__init__.py':            mod.__path__ = fullname.split('.')        mod.__file__ = srcfile        exec file(srcfile, 'r') in mod.__dict__        return modclass ordered_dict(dict):    def keys(self):        keys = super(ordered_dict, self).keys()        keys.sort()        return keys    def values(self):        return [ self[key] for key in self.keys() ]    def items(self):        return [ (key,self[key]) for key in self.keys() ]    def iterkeys(self):        for key in self.keys():            yield key    def itervalues(self):        for value in self.values():            yield value    def iteritems(self):        for key,value in self.items():            yield key, valueclass Generate(object):    def __init__(self, py_sources, sim_objects, build_env):        self.py_sources = py_sources        self.py_modules = {}        for source in py_sources:            self.py_modules[source.modpath]  = source.srcpath        importer = DictImporter(self.py_modules, build_env)        # install the python importer so we can grab stuff from the source        # tree itself.        sys.meta_path[0:0] = [ importer ]        import m5        self.m5 = m5        # import all sim objects so we can populate the all_objects list        # make sure that we're working with a list, then let's sort it        sim_objects = list(sim_objects)        sim_objects.sort()        for simobj in sim_objects:            exec('from m5.objects import %s' % simobj)        # we need to unload all of the currently imported modules so that they        # will be re-imported the next time the sconscript is run        importer.unload()        sys.meta_path.remove(importer)        self.sim_objects = m5.SimObject.allClasses        self.enums = m5.params.allEnums        self.params = {}        for name,obj in self.sim_objects.iteritems():            for param in obj._params.local.values():                if not hasattr(param, 'swig_decl'):                    continue                pname = param.ptype_str                if pname not in self.params:                    self.params[pname] = param    def createSimObjectParam(self, target, source, env):        assert len(target) == 1 and len(source) == 1        hh_file = file(target[0].abspath, 'w')        name = str(source[0].get_contents())        obj = self.sim_objects[name]        print >>hh_file, obj.cxx_decl()    # Generate Python file containing a dict specifying the current    # build_env flags.    def makeDefinesPyFile(self, target, source, env):        f = file(str(target[0]), 'w')        print >>f, "m5_build_env = ", source[0]        f.close()    # Generate python file containing info about the M5 source code    def makeInfoPyFile(self, target, source, env):        f = file(str(target[0]), 'w')        for src in source:            data = ''.join(file(src.srcnode().abspath, 'r').xreadlines())            print >>f, "%s = %s" % (src, repr(data))        f.close()    # Generate the __init__.py file for m5.objects    def makeObjectsInitFile(self, target, source, env):        f = file(str(target[0]), 'w')        print >>f, 'from params import *'        print >>f, 'from m5.SimObject import *'        for module in source:            print >>f, 'from %s import *' % module.get_contents()        f.close()    def createSwigParam(self, target, source, env):        assert len(target) == 1 and len(source) == 1        i_file = file(target[0].abspath, 'w')        name = str(source[0].get_contents())        param = self.params[name]        for line in param.swig_decl():            print >>i_file, line    def createEnumStrings(self, target, source, env):        assert len(target) == 1 and len(source) == 1        cc_file = file(target[0].abspath, 'w')        name = str(source[0].get_contents())        obj = self.enums[name]        print >>cc_file, obj.cxx_def()        cc_file.close()    def createEnumParam(self, target, source, env):        assert len(target) == 1 and len(source) == 1        hh_file = file(target[0].abspath, 'w')        name = str(source[0].get_contents())        obj = self.enums[name]        print >>hh_file, obj.cxx_decl()    def buildParams(self, target, source, env):        names = [ s.get_contents() for s in source ]        objs = [ self.sim_objects[name] for name in names ]        out = file(target[0].abspath, 'w')        ordered_objs = []        obj_seen = set()        def order_obj(obj):            name = str(obj)            if name in obj_seen:                return            obj_seen.add(name)            if str(obj) != 'SimObject':                order_obj(obj.__bases__[0])            ordered_objs.append(obj)        for obj in objs:            order_obj(obj)        enums = set()        predecls = []        pd_seen = set()        def add_pds(*pds):            for pd in pds:                if pd not in pd_seen:                    predecls.append(pd)                    pd_seen.add(pd)        for obj in ordered_objs:            params = obj._params.local.values()            for param in params:                ptype = param.ptype                if issubclass(ptype, self.m5.params.Enum):                    if ptype not in enums:                        enums.add(ptype)                pds = param.swig_predecls()                if isinstance(pds, (list, tuple)):                    add_pds(*pds)                else:                    add_pds(pds)        print >>out, '%module params'        print >>out, '%{'        for obj in ordered_objs:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?