Type.py revision 9298
111308Santhony.gutierrez@amd.com# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 211308Santhony.gutierrez@amd.com# Copyright (c) 2009 The Hewlett-Packard Development Company 311308Santhony.gutierrez@amd.com# All rights reserved. 411308Santhony.gutierrez@amd.com# 511308Santhony.gutierrez@amd.com# Redistribution and use in source and binary forms, with or without 611308Santhony.gutierrez@amd.com# modification, are permitted provided that the following conditions are 711308Santhony.gutierrez@amd.com# met: redistributions of source code must retain the above copyright 811308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer; 911308Santhony.gutierrez@amd.com# redistributions in binary form must reproduce the above copyright 1011308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer in the 1111308Santhony.gutierrez@amd.com# documentation and/or other materials provided with the distribution; 1211308Santhony.gutierrez@amd.com# neither the name of the copyright holders nor the names of its 1311308Santhony.gutierrez@amd.com# contributors may be used to endorse or promote products derived from 1411308Santhony.gutierrez@amd.com# this software without specific prior written permission. 1511308Santhony.gutierrez@amd.com# 1611308Santhony.gutierrez@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711308Santhony.gutierrez@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811308Santhony.gutierrez@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911308Santhony.gutierrez@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011308Santhony.gutierrez@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111308Santhony.gutierrez@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211308Santhony.gutierrez@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311308Santhony.gutierrez@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411308Santhony.gutierrez@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511308Santhony.gutierrez@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611308Santhony.gutierrez@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711308Santhony.gutierrez@amd.com 2811308Santhony.gutierrez@amd.comfrom m5.util import orderdict 2911308Santhony.gutierrez@amd.com 3011308Santhony.gutierrez@amd.comfrom slicc.util import PairContainer 3111308Santhony.gutierrez@amd.comfrom slicc.symbols.Symbol import Symbol 3211308Santhony.gutierrez@amd.com 3311308Santhony.gutierrez@amd.comclass DataMember(PairContainer): 3411308Santhony.gutierrez@amd.com def __init__(self, ident, type, pairs, init_code): 3511308Santhony.gutierrez@amd.com super(DataMember, self).__init__(pairs) 3611308Santhony.gutierrez@amd.com self.ident = ident 3711308Santhony.gutierrez@amd.com self.type = type 3811308Santhony.gutierrez@amd.com self.init_code = init_code 3911308Santhony.gutierrez@amd.com 4011308Santhony.gutierrez@amd.comclass Enumeration(PairContainer): 4111308Santhony.gutierrez@amd.com def __init__(self, ident, pairs): 4211308Santhony.gutierrez@amd.com super(Enumeration, self).__init__(pairs) 4311308Santhony.gutierrez@amd.com self.ident = ident 4411308Santhony.gutierrez@amd.com 4511308Santhony.gutierrez@amd.comclass Method(object): 4611308Santhony.gutierrez@amd.com def __init__(self, return_type, param_types): 4711308Santhony.gutierrez@amd.com self.return_type = return_type 4811308Santhony.gutierrez@amd.com self.param_types = param_types 4911308Santhony.gutierrez@amd.com 5011308Santhony.gutierrez@amd.comclass Type(Symbol): 5111308Santhony.gutierrez@amd.com def __init__(self, table, ident, location, pairs, machine=None): 5211308Santhony.gutierrez@amd.com super(Type, self).__init__(table, ident, location, pairs) 5311308Santhony.gutierrez@amd.com self.c_ident = ident 5411308Santhony.gutierrez@amd.com self.abstract_ident = "" 5511308Santhony.gutierrez@amd.com if machine: 5611308Santhony.gutierrez@amd.com if self.isExternal or self.isPrimitive: 5711308Santhony.gutierrez@amd.com if "external_name" in self: 5811308Santhony.gutierrez@amd.com self.c_ident = self["external_name"] 5911308Santhony.gutierrez@amd.com else: 6011308Santhony.gutierrez@amd.com # Append with machine name 6111308Santhony.gutierrez@amd.com self.c_ident = "%s_%s" % (machine, ident) 6211308Santhony.gutierrez@amd.com 6311308Santhony.gutierrez@amd.com self.pairs.setdefault("desc", "No description avaliable") 6411308Santhony.gutierrez@amd.com 6511308Santhony.gutierrez@amd.com # check for interface that this Type implements 6611308Santhony.gutierrez@amd.com if "interface" in self: 6711308Santhony.gutierrez@amd.com interface = self["interface"] 6811308Santhony.gutierrez@amd.com if interface in ("Message", "NetworkMessage"): 6911308Santhony.gutierrez@amd.com self["message"] = "yes" 7011308Santhony.gutierrez@amd.com if interface == "NetworkMessage": 7111308Santhony.gutierrez@amd.com self["networkmessage"] = "yes" 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com # FIXME - all of the following id comparisons are fragile hacks 7411308Santhony.gutierrez@amd.com if self.ident in ("CacheMemory", "NewCacheMemory", 7511308Santhony.gutierrez@amd.com "TLCCacheMemory", "DNUCACacheMemory", 7611308Santhony.gutierrez@amd.com "DNUCABankCacheMemory", "L2BankCacheMemory", 7711308Santhony.gutierrez@amd.com "CompressedCacheMemory", "PrefetchCacheMemory"): 7811308Santhony.gutierrez@amd.com self["cache"] = "yes" 7911308Santhony.gutierrez@amd.com 8011308Santhony.gutierrez@amd.com if self.ident in ("TBETable", "DNUCATBETable", "DNUCAStopTable"): 8111308Santhony.gutierrez@amd.com self["tbe"] = "yes" 8211308Santhony.gutierrez@amd.com 8311308Santhony.gutierrez@amd.com if self.ident == "NewTBETable": 8411308Santhony.gutierrez@amd.com self["newtbe"] = "yes" 8511308Santhony.gutierrez@amd.com 8611308Santhony.gutierrez@amd.com if self.ident == "TimerTable": 8711308Santhony.gutierrez@amd.com self["timer"] = "yes" 8811308Santhony.gutierrez@amd.com 8911308Santhony.gutierrez@amd.com if self.ident == "DirectoryMemory": 9011308Santhony.gutierrez@amd.com self["dir"] = "yes" 9111308Santhony.gutierrez@amd.com 9211308Santhony.gutierrez@amd.com if self.ident == "PersistentTable": 9311308Santhony.gutierrez@amd.com self["persistent"] = "yes" 9411308Santhony.gutierrez@amd.com 9511308Santhony.gutierrez@amd.com if self.ident == "Prefetcher": 9611308Santhony.gutierrez@amd.com self["prefetcher"] = "yes" 9711308Santhony.gutierrez@amd.com 9811308Santhony.gutierrez@amd.com if self.ident == "DNUCA_Movement": 9911308Santhony.gutierrez@amd.com self["mover"] = "yes" 10011308Santhony.gutierrez@amd.com 10111308Santhony.gutierrez@amd.com self.isMachineType = (ident == "MachineType") 10211308Santhony.gutierrez@amd.com 10311308Santhony.gutierrez@amd.com self.isStateDecl = ("state_decl" in self) 10411308Santhony.gutierrez@amd.com self.statePermPairs = [] 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.com self.data_members = orderdict() 10711308Santhony.gutierrez@amd.com 10811308Santhony.gutierrez@amd.com # Methods 10911308Santhony.gutierrez@amd.com self.methods = {} 11011308Santhony.gutierrez@amd.com self.functions = {} 11111308Santhony.gutierrez@amd.com 11211308Santhony.gutierrez@amd.com # Enums 11311308Santhony.gutierrez@amd.com self.enums = orderdict() 11411308Santhony.gutierrez@amd.com 11511308Santhony.gutierrez@amd.com @property 11611308Santhony.gutierrez@amd.com def isPrimitive(self): 11711308Santhony.gutierrez@amd.com return "primitive" in self 11811308Santhony.gutierrez@amd.com @property 11911308Santhony.gutierrez@amd.com def isNetworkMessage(self): 12011308Santhony.gutierrez@amd.com return "networkmessage" in self 12111308Santhony.gutierrez@amd.com @property 12211308Santhony.gutierrez@amd.com def isMessage(self): 12311308Santhony.gutierrez@amd.com return "message" in self 12411308Santhony.gutierrez@amd.com @property 12511308Santhony.gutierrez@amd.com def isBuffer(self): 12611308Santhony.gutierrez@amd.com return "buffer" in self 12711308Santhony.gutierrez@amd.com @property 12811308Santhony.gutierrez@amd.com def isInPort(self): 12911308Santhony.gutierrez@amd.com return "inport" in self 13011308Santhony.gutierrez@amd.com @property 13111308Santhony.gutierrez@amd.com def isOutPort(self): 13211308Santhony.gutierrez@amd.com return "outport" in self 13311308Santhony.gutierrez@amd.com @property 13411308Santhony.gutierrez@amd.com def isEnumeration(self): 13511308Santhony.gutierrez@amd.com return "enumeration" in self 13611308Santhony.gutierrez@amd.com @property 13711308Santhony.gutierrez@amd.com def isExternal(self): 13811308Santhony.gutierrez@amd.com return "external" in self 13911308Santhony.gutierrez@amd.com @property 14011308Santhony.gutierrez@amd.com def isGlobal(self): 14111308Santhony.gutierrez@amd.com return "global" in self 14211308Santhony.gutierrez@amd.com @property 14311308Santhony.gutierrez@amd.com def isInterface(self): 14411308Santhony.gutierrez@amd.com return "interface" in self 14511308Santhony.gutierrez@amd.com 14611308Santhony.gutierrez@amd.com # Return false on error 14711308Santhony.gutierrez@amd.com def addDataMember(self, ident, type, pairs, init_code): 14811308Santhony.gutierrez@amd.com if ident in self.data_members: 14911308Santhony.gutierrez@amd.com return False 15011308Santhony.gutierrez@amd.com 15111308Santhony.gutierrez@amd.com member = DataMember(ident, type, pairs, init_code) 15211308Santhony.gutierrez@amd.com self.data_members[ident] = member 15311308Santhony.gutierrez@amd.com 15411308Santhony.gutierrez@amd.com return True 15511308Santhony.gutierrez@amd.com 15611308Santhony.gutierrez@amd.com def dataMemberType(self, ident): 15711308Santhony.gutierrez@amd.com return self.data_members[ident].type 15811308Santhony.gutierrez@amd.com 15911308Santhony.gutierrez@amd.com def methodId(self, name, param_type_vec): 16011308Santhony.gutierrez@amd.com return '_'.join([name] + [ pt.c_ident for pt in param_type_vec ]) 16111308Santhony.gutierrez@amd.com 16211308Santhony.gutierrez@amd.com def methodIdAbstract(self, name, param_type_vec): 16311308Santhony.gutierrez@amd.com return '_'.join([name] + [ pt.abstract_ident for pt in param_type_vec ]) 16411308Santhony.gutierrez@amd.com 16511308Santhony.gutierrez@amd.com def statePermPairAdd(self, state_name, perm_name): 16611308Santhony.gutierrez@amd.com self.statePermPairs.append([state_name, perm_name]) 16711308Santhony.gutierrez@amd.com 16811308Santhony.gutierrez@amd.com def addMethod(self, name, return_type, param_type_vec): 16911308Santhony.gutierrez@amd.com ident = self.methodId(name, param_type_vec) 17011308Santhony.gutierrez@amd.com if ident in self.methods: 17111308Santhony.gutierrez@amd.com return False 17211308Santhony.gutierrez@amd.com 17311308Santhony.gutierrez@amd.com self.methods[ident] = Method(return_type, param_type_vec) 17411308Santhony.gutierrez@amd.com return True 17511308Santhony.gutierrez@amd.com 17611308Santhony.gutierrez@amd.com # Ideally either this function or the one above should exist. But 17711308Santhony.gutierrez@amd.com # methods and functions have different structures right now. 17811308Santhony.gutierrez@amd.com # Hence, these are different, at least for the time being. 17911308Santhony.gutierrez@amd.com def addFunc(self, func): 18011308Santhony.gutierrez@amd.com ident = self.methodId(func.ident, func.param_types) 18111308Santhony.gutierrez@amd.com if ident in self.functions: 18211308Santhony.gutierrez@amd.com return False 18311308Santhony.gutierrez@amd.com 18411308Santhony.gutierrez@amd.com self.functions[ident] = func 18511308Santhony.gutierrez@amd.com return True 18611308Santhony.gutierrez@amd.com 18711308Santhony.gutierrez@amd.com def addEnum(self, ident, pairs): 18811308Santhony.gutierrez@amd.com if ident in self.enums: 18911308Santhony.gutierrez@amd.com return False 19011308Santhony.gutierrez@amd.com 19111308Santhony.gutierrez@amd.com self.enums[ident] = Enumeration(ident, pairs) 19211308Santhony.gutierrez@amd.com 19311308Santhony.gutierrez@amd.com # Add default 19411308Santhony.gutierrez@amd.com if "default" not in self: 19511308Santhony.gutierrez@amd.com self["default"] = "%s_NUM" % self.c_ident 19611308Santhony.gutierrez@amd.com 19711308Santhony.gutierrez@amd.com return True 19811308Santhony.gutierrez@amd.com 19911308Santhony.gutierrez@amd.com def writeCodeFiles(self, path, includes): 20011308Santhony.gutierrez@amd.com if self.isExternal: 20111308Santhony.gutierrez@amd.com # Do nothing 20211308Santhony.gutierrez@amd.com pass 20311308Santhony.gutierrez@amd.com elif self.isEnumeration: 20411308Santhony.gutierrez@amd.com self.printEnumHH(path) 20511308Santhony.gutierrez@amd.com self.printEnumCC(path) 20611308Santhony.gutierrez@amd.com else: 20711308Santhony.gutierrez@amd.com # User defined structs and messages 20811308Santhony.gutierrez@amd.com self.printTypeHH(path) 20911308Santhony.gutierrez@amd.com self.printTypeCC(path) 21011308Santhony.gutierrez@amd.com 21111308Santhony.gutierrez@amd.com def printTypeHH(self, path): 21211308Santhony.gutierrez@amd.com code = self.symtab.codeFormatter() 21311308Santhony.gutierrez@amd.com code(''' 21411308Santhony.gutierrez@amd.com/** \\file ${{self.c_ident}}.hh 21511308Santhony.gutierrez@amd.com * 21611308Santhony.gutierrez@amd.com * 21711308Santhony.gutierrez@amd.com * Auto generated C++ code started by $__file__:$__line__ 21811308Santhony.gutierrez@amd.com */ 21911308Santhony.gutierrez@amd.com 22011308Santhony.gutierrez@amd.com#ifndef __${{self.c_ident}}_HH__ 22111308Santhony.gutierrez@amd.com#define __${{self.c_ident}}_HH__ 22211308Santhony.gutierrez@amd.com 22311308Santhony.gutierrez@amd.com#include <iostream> 22411308Santhony.gutierrez@amd.com 22511308Santhony.gutierrez@amd.com#include "mem/ruby/common/Global.hh" 22611308Santhony.gutierrez@amd.com''') 22711308Santhony.gutierrez@amd.com 22811308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 22911308Santhony.gutierrez@amd.com if not dm.type.isPrimitive: 23011308Santhony.gutierrez@amd.com code('#include "mem/protocol/$0.hh"', dm.type.c_ident) 23111308Santhony.gutierrez@amd.com 23211308Santhony.gutierrez@amd.com parent = "" 23311308Santhony.gutierrez@amd.com if "interface" in self: 23411308Santhony.gutierrez@amd.com code('#include "mem/protocol/$0.hh"', self["interface"]) 23511308Santhony.gutierrez@amd.com parent = " : public %s" % self["interface"] 23611308Santhony.gutierrez@amd.com 23711308Santhony.gutierrez@amd.com code(''' 23811308Santhony.gutierrez@amd.com$klass ${{self.c_ident}}$parent 23911308Santhony.gutierrez@amd.com{ 24011308Santhony.gutierrez@amd.com public: 24111308Santhony.gutierrez@amd.com ${{self.c_ident}}() 24211308Santhony.gutierrez@amd.com { 24311308Santhony.gutierrez@amd.com''', klass="class") 24411308Santhony.gutierrez@amd.com 24511308Santhony.gutierrez@amd.com code.indent() 24611308Santhony.gutierrez@amd.com if not self.isGlobal: 24711308Santhony.gutierrez@amd.com code.indent() 24811308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 24911308Santhony.gutierrez@amd.com ident = dm.ident 25011308Santhony.gutierrez@amd.com if "default" in dm: 25111308Santhony.gutierrez@amd.com # look for default value 25211308Santhony.gutierrez@amd.com code('m_$ident = ${{dm["default"]}}; // default for this field') 25311308Santhony.gutierrez@amd.com elif "default" in dm.type: 25411308Santhony.gutierrez@amd.com # Look for the type default 25511308Santhony.gutierrez@amd.com tid = dm.type.c_ident 25611308Santhony.gutierrez@amd.com code('m_$ident = ${{dm.type["default"]}}; // default value of $tid') 25711308Santhony.gutierrez@amd.com else: 25811308Santhony.gutierrez@amd.com code('// m_$ident has no default') 25911308Santhony.gutierrez@amd.com code.dedent() 26011308Santhony.gutierrez@amd.com code('}') 26111308Santhony.gutierrez@amd.com 26211308Santhony.gutierrez@amd.com # ******** Copy constructor ******** 26311308Santhony.gutierrez@amd.com if not self.isGlobal: 26411308Santhony.gutierrez@amd.com code('${{self.c_ident}}(const ${{self.c_ident}}&other)') 26511308Santhony.gutierrez@amd.com 26611308Santhony.gutierrez@amd.com # Call superclass constructor 26711308Santhony.gutierrez@amd.com if "interface" in self: 26811308Santhony.gutierrez@amd.com code(' : ${{self["interface"]}}(other)') 26911308Santhony.gutierrez@amd.com 27011308Santhony.gutierrez@amd.com code('{') 27111308Santhony.gutierrez@amd.com code.indent() 27211308Santhony.gutierrez@amd.com 27311308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 27411308Santhony.gutierrez@amd.com code('m_${{dm.ident}} = other.m_${{dm.ident}};') 27511308Santhony.gutierrez@amd.com 27611308Santhony.gutierrez@amd.com code.dedent() 27711308Santhony.gutierrez@amd.com code('}') 27811308Santhony.gutierrez@amd.com 27911308Santhony.gutierrez@amd.com # ******** Full init constructor ******** 28011308Santhony.gutierrez@amd.com if not self.isGlobal: 28111308Santhony.gutierrez@amd.com params = [ 'const %s& local_%s' % (dm.type.c_ident, dm.ident) \ 28211308Santhony.gutierrez@amd.com for dm in self.data_members.itervalues() ] 28311308Santhony.gutierrez@amd.com 28411308Santhony.gutierrez@amd.com params = ', '.join(params) 28511308Santhony.gutierrez@amd.com code('${{self.c_ident}}($params)') 28611308Santhony.gutierrez@amd.com 28711308Santhony.gutierrez@amd.com # Call superclass constructor 28811308Santhony.gutierrez@amd.com if "interface" in self: 28911308Santhony.gutierrez@amd.com code(' : ${{self["interface"]}}()') 29011308Santhony.gutierrez@amd.com 29111308Santhony.gutierrez@amd.com code('{') 29211308Santhony.gutierrez@amd.com code.indent() 29311308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 29411308Santhony.gutierrez@amd.com code('m_${{dm.ident}} = local_${{dm.ident}};') 29511308Santhony.gutierrez@amd.com if "nextLineCallHack" in dm: 29611308Santhony.gutierrez@amd.com code('m_${{dm.ident}}${{dm["nextLineCallHack"]}};') 29711308Santhony.gutierrez@amd.com 29811308Santhony.gutierrez@amd.com code.dedent() 29911308Santhony.gutierrez@amd.com code('}') 30011308Santhony.gutierrez@amd.com 30111308Santhony.gutierrez@amd.com # create a static factory method and a clone member 30211308Santhony.gutierrez@amd.com code(''' 30311308Santhony.gutierrez@amd.comstatic ${{self.c_ident}}* 30411308Santhony.gutierrez@amd.comcreate() 30511308Santhony.gutierrez@amd.com{ 30611308Santhony.gutierrez@amd.com return new ${{self.c_ident}}(); 30711308Santhony.gutierrez@amd.com} 30811308Santhony.gutierrez@amd.com 30911308Santhony.gutierrez@amd.com${{self.c_ident}}* 31011308Santhony.gutierrez@amd.comclone() const 31111308Santhony.gutierrez@amd.com{ 31211308Santhony.gutierrez@amd.com return new ${{self.c_ident}}(*this); 31311308Santhony.gutierrez@amd.com} 31411308Santhony.gutierrez@amd.com''') 31511308Santhony.gutierrez@amd.com 31611308Santhony.gutierrez@amd.com if not self.isGlobal: 31711308Santhony.gutierrez@amd.com # const Get methods for each field 31811308Santhony.gutierrez@amd.com code('// Const accessors methods for each field') 31911308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 32011308Santhony.gutierrez@amd.com code(''' 32111308Santhony.gutierrez@amd.com/** \\brief Const accessor method for ${{dm.ident}} field. 32211308Santhony.gutierrez@amd.com * \\return ${{dm.ident}} field 32311308Santhony.gutierrez@amd.com */ 32411308Santhony.gutierrez@amd.comconst ${{dm.type.c_ident}}& 32511308Santhony.gutierrez@amd.comget${{dm.ident}}() const 32611308Santhony.gutierrez@amd.com{ 32711308Santhony.gutierrez@amd.com return m_${{dm.ident}}; 32811308Santhony.gutierrez@amd.com} 32911308Santhony.gutierrez@amd.com''') 33011308Santhony.gutierrez@amd.com 33111308Santhony.gutierrez@amd.com # Non-const Get methods for each field 33211308Santhony.gutierrez@amd.com code('// Non const Accessors methods for each field') 33311308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 33411308Santhony.gutierrez@amd.com code(''' 33511308Santhony.gutierrez@amd.com/** \\brief Non-const accessor method for ${{dm.ident}} field. 33611308Santhony.gutierrez@amd.com * \\return ${{dm.ident}} field 33711308Santhony.gutierrez@amd.com */ 33811308Santhony.gutierrez@amd.com${{dm.type.c_ident}}& 33911308Santhony.gutierrez@amd.comget${{dm.ident}}() 34011308Santhony.gutierrez@amd.com{ 34111308Santhony.gutierrez@amd.com return m_${{dm.ident}}; 34211308Santhony.gutierrez@amd.com} 34311308Santhony.gutierrez@amd.com''') 34411308Santhony.gutierrez@amd.com 34511308Santhony.gutierrez@amd.com #Set methods for each field 34611308Santhony.gutierrez@amd.com code('// Mutator methods for each field') 34711308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 34811308Santhony.gutierrez@amd.com code(''' 34911308Santhony.gutierrez@amd.com/** \\brief Mutator method for ${{dm.ident}} field */ 35011308Santhony.gutierrez@amd.comvoid 35111345Sjohn.kalamatianos@amd.comset${{dm.ident}}(const ${{dm.type.c_ident}}& local_${{dm.ident}}) 35211308Santhony.gutierrez@amd.com{ 35311308Santhony.gutierrez@amd.com m_${{dm.ident}} = local_${{dm.ident}}; 35411308Santhony.gutierrez@amd.com} 35511308Santhony.gutierrez@amd.com''') 35611308Santhony.gutierrez@amd.com 35711308Santhony.gutierrez@amd.com code('void print(std::ostream& out) const;') 35811308Santhony.gutierrez@amd.com code.dedent() 35911308Santhony.gutierrez@amd.com code(' //private:') 36011308Santhony.gutierrez@amd.com code.indent() 36111308Santhony.gutierrez@amd.com 36211308Santhony.gutierrez@amd.com # Data members for each field 36311308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 36411308Santhony.gutierrez@amd.com if "abstract" not in dm: 36511308Santhony.gutierrez@amd.com const = "" 36611308Santhony.gutierrez@amd.com init = "" 36711308Santhony.gutierrez@amd.com 36811308Santhony.gutierrez@amd.com # global structure 36911308Santhony.gutierrez@amd.com if self.isGlobal: 37011308Santhony.gutierrez@amd.com const = "static const " 37111308Santhony.gutierrez@amd.com 37211308Santhony.gutierrez@amd.com # init value 37311308Santhony.gutierrez@amd.com if dm.init_code: 37411308Santhony.gutierrez@amd.com # only global structure can have init value here 37511308Santhony.gutierrez@amd.com assert self.isGlobal 37611308Santhony.gutierrez@amd.com init = " = %s" % (dm.init_code) 37711308Santhony.gutierrez@amd.com 37811308Santhony.gutierrez@amd.com if "desc" in dm: 37911308Santhony.gutierrez@amd.com code('/** ${{dm["desc"]}} */') 38011308Santhony.gutierrez@amd.com 38111308Santhony.gutierrez@amd.com code('$const${{dm.type.c_ident}} m_${{dm.ident}}$init;') 38211308Santhony.gutierrez@amd.com 38311308Santhony.gutierrez@amd.com # Prototypes for functions defined for the Type 38411308Santhony.gutierrez@amd.com for item in self.functions: 38511308Santhony.gutierrez@amd.com proto = self.functions[item].prototype 38611308Santhony.gutierrez@amd.com if proto: 38711308Santhony.gutierrez@amd.com code('$proto') 38811308Santhony.gutierrez@amd.com 38911308Santhony.gutierrez@amd.com code.dedent() 39011308Santhony.gutierrez@amd.com code('};') 39111308Santhony.gutierrez@amd.com 39211308Santhony.gutierrez@amd.com code(''' 39311308Santhony.gutierrez@amd.cominline std::ostream& 39411308Santhony.gutierrez@amd.comoperator<<(std::ostream& out, const ${{self.c_ident}}& obj) 39511308Santhony.gutierrez@amd.com{ 39611308Santhony.gutierrez@amd.com obj.print(out); 39711308Santhony.gutierrez@amd.com out << std::flush; 39811308Santhony.gutierrez@amd.com return out; 39911308Santhony.gutierrez@amd.com} 40011308Santhony.gutierrez@amd.com 40111308Santhony.gutierrez@amd.com#endif // __${{self.c_ident}}_HH__ 40211308Santhony.gutierrez@amd.com''') 40311308Santhony.gutierrez@amd.com 40411308Santhony.gutierrez@amd.com code.write(path, "%s.hh" % self.c_ident) 40511308Santhony.gutierrez@amd.com 40611308Santhony.gutierrez@amd.com def printTypeCC(self, path): 40711308Santhony.gutierrez@amd.com code = self.symtab.codeFormatter() 40811308Santhony.gutierrez@amd.com 40911308Santhony.gutierrez@amd.com code(''' 41011308Santhony.gutierrez@amd.com/** \\file ${{self.c_ident}}.cc 41111308Santhony.gutierrez@amd.com * 41211308Santhony.gutierrez@amd.com * Auto generated C++ code started by $__file__:$__line__ 41311308Santhony.gutierrez@amd.com */ 41411308Santhony.gutierrez@amd.com 41511308Santhony.gutierrez@amd.com#include <iostream> 41611308Santhony.gutierrez@amd.com 41711308Santhony.gutierrez@amd.com#include "mem/protocol/${{self.c_ident}}.hh" 41811308Santhony.gutierrez@amd.com 41911308Santhony.gutierrez@amd.comusing namespace std; 42011308Santhony.gutierrez@amd.com''') 42111308Santhony.gutierrez@amd.com 42211308Santhony.gutierrez@amd.com code(''' 42311308Santhony.gutierrez@amd.com/** \\brief Print the state of this object */ 42411308Santhony.gutierrez@amd.comvoid 42511308Santhony.gutierrez@amd.com${{self.c_ident}}::print(ostream& out) const 42611308Santhony.gutierrez@amd.com{ 42711308Santhony.gutierrez@amd.com out << "[${{self.c_ident}}: "; 42811308Santhony.gutierrez@amd.com''') 42911308Santhony.gutierrez@amd.com 43011308Santhony.gutierrez@amd.com # For each field 43111308Santhony.gutierrez@amd.com code.indent() 43211308Santhony.gutierrez@amd.com for dm in self.data_members.values(): 43311308Santhony.gutierrez@amd.com code('out << "${{dm.ident}} = " << m_${{dm.ident}} << " ";''') 43411308Santhony.gutierrez@amd.com 43511308Santhony.gutierrez@amd.com if self.isMessage: 43611308Santhony.gutierrez@amd.com code('out << "Time = " << g_system_ptr->clockPeriod() * getTime() << " ";') 43711308Santhony.gutierrez@amd.com code.dedent() 43811308Santhony.gutierrez@amd.com 43911308Santhony.gutierrez@amd.com # Trailer 44011308Santhony.gutierrez@amd.com code(''' 44111308Santhony.gutierrez@amd.com out << "]"; 44211308Santhony.gutierrez@amd.com}''') 44311308Santhony.gutierrez@amd.com 44411308Santhony.gutierrez@amd.com # print the code for the functions in the type 44511308Santhony.gutierrez@amd.com for item in self.functions: 44611308Santhony.gutierrez@amd.com code(self.functions[item].generateCode()) 44711308Santhony.gutierrez@amd.com 44811308Santhony.gutierrez@amd.com code.write(path, "%s.cc" % self.c_ident) 44911308Santhony.gutierrez@amd.com 45011308Santhony.gutierrez@amd.com def printEnumHH(self, path): 45111308Santhony.gutierrez@amd.com code = self.symtab.codeFormatter() 45211308Santhony.gutierrez@amd.com code(''' 45311308Santhony.gutierrez@amd.com/** \\file ${{self.c_ident}}.hh 45411308Santhony.gutierrez@amd.com * 45511308Santhony.gutierrez@amd.com * Auto generated C++ code started by $__file__:$__line__ 45611308Santhony.gutierrez@amd.com */ 45711308Santhony.gutierrez@amd.com 45811308Santhony.gutierrez@amd.com#ifndef __${{self.c_ident}}_HH__ 45911308Santhony.gutierrez@amd.com#define __${{self.c_ident}}_HH__ 46011308Santhony.gutierrez@amd.com 46111308Santhony.gutierrez@amd.com#include <iostream> 46211308Santhony.gutierrez@amd.com#include <string> 46311308Santhony.gutierrez@amd.com 46411308Santhony.gutierrez@amd.com''') 46511308Santhony.gutierrez@amd.com if self.isStateDecl: 46611308Santhony.gutierrez@amd.com code('#include "mem/protocol/AccessPermission.hh"') 46711308Santhony.gutierrez@amd.com 46811308Santhony.gutierrez@amd.com if self.isMachineType: 46911308Santhony.gutierrez@amd.com code('#include "base/misc.hh"') 47011308Santhony.gutierrez@amd.com code('#include "mem/protocol/GenericMachineType.hh"') 47111308Santhony.gutierrez@amd.com code('#include "mem/ruby/common/Address.hh"') 47211308Santhony.gutierrez@amd.com code('struct MachineID;') 47311308Santhony.gutierrez@amd.com 47411308Santhony.gutierrez@amd.com code(''' 47511308Santhony.gutierrez@amd.com 47611308Santhony.gutierrez@amd.com// Class definition 47711308Santhony.gutierrez@amd.com/** \\enum ${{self.c_ident}} 47811308Santhony.gutierrez@amd.com * \\brief ${{self.desc}} 47911308Santhony.gutierrez@amd.com */ 48011308Santhony.gutierrez@amd.comenum ${{self.c_ident}} { 48111308Santhony.gutierrez@amd.com ${{self.c_ident}}_FIRST, 48211308Santhony.gutierrez@amd.com''') 48311308Santhony.gutierrez@amd.com 48411308Santhony.gutierrez@amd.com code.indent() 48511308Santhony.gutierrez@amd.com # For each field 48611308Santhony.gutierrez@amd.com for i,(ident,enum) in enumerate(self.enums.iteritems()): 48711308Santhony.gutierrez@amd.com desc = enum.get("desc", "No description avaliable") 48811308Santhony.gutierrez@amd.com if i == 0: 48911308Santhony.gutierrez@amd.com init = ' = %s_FIRST' % self.c_ident 49011308Santhony.gutierrez@amd.com else: 49111308Santhony.gutierrez@amd.com init = '' 49211308Santhony.gutierrez@amd.com code('${{self.c_ident}}_${{enum.ident}}$init, /**< $desc */') 49311308Santhony.gutierrez@amd.com code.dedent() 49411308Santhony.gutierrez@amd.com code(''' 49511308Santhony.gutierrez@amd.com ${{self.c_ident}}_NUM 49611308Santhony.gutierrez@amd.com}; 49711308Santhony.gutierrez@amd.com 49811308Santhony.gutierrez@amd.com// Code to convert from a string to the enumeration 49911308Santhony.gutierrez@amd.com${{self.c_ident}} string_to_${{self.c_ident}}(const std::string& str); 50011308Santhony.gutierrez@amd.com 50111308Santhony.gutierrez@amd.com// Code to convert state to a string 50211308Santhony.gutierrez@amd.comstd::string ${{self.c_ident}}_to_string(const ${{self.c_ident}}& obj); 50311308Santhony.gutierrez@amd.com 50411308Santhony.gutierrez@amd.com// Code to increment an enumeration type 50511308Santhony.gutierrez@amd.com${{self.c_ident}} &operator++(${{self.c_ident}} &e); 50611308Santhony.gutierrez@amd.com''') 50711308Santhony.gutierrez@amd.com 50811308Santhony.gutierrez@amd.com # MachineType hack used to set the base component id for each Machine 50911308Santhony.gutierrez@amd.com if self.isMachineType: 51011308Santhony.gutierrez@amd.com code(''' 51111308Santhony.gutierrez@amd.comint ${{self.c_ident}}_base_level(const ${{self.c_ident}}& obj); 51211308Santhony.gutierrez@amd.comMachineType ${{self.c_ident}}_from_base_level(int); 51311308Santhony.gutierrez@amd.comint ${{self.c_ident}}_base_number(const ${{self.c_ident}}& obj); 51411308Santhony.gutierrez@amd.comint ${{self.c_ident}}_base_count(const ${{self.c_ident}}& obj); 51511308Santhony.gutierrez@amd.com''') 51611308Santhony.gutierrez@amd.com 51711308Santhony.gutierrez@amd.com for enum in self.enums.itervalues(): 51811308Santhony.gutierrez@amd.com if enum.ident == "DMA": 51911308Santhony.gutierrez@amd.com code(''' 52011308Santhony.gutierrez@amd.comMachineID map_Address_to_DMA(const Address &addr); 52111308Santhony.gutierrez@amd.com''') 52211308Santhony.gutierrez@amd.com code(''' 52311308Santhony.gutierrez@amd.com 52411308Santhony.gutierrez@amd.comMachineID get${{enum.ident}}MachineID(NodeID RubyNode); 52511308Santhony.gutierrez@amd.com''') 52611308Santhony.gutierrez@amd.com 52711308Santhony.gutierrez@amd.com code(''' 52811308Santhony.gutierrez@amd.cominline GenericMachineType 52911308Santhony.gutierrez@amd.comConvertMachToGenericMach(MachineType machType) 53011308Santhony.gutierrez@amd.com{ 53111308Santhony.gutierrez@amd.com''') 53211308Santhony.gutierrez@amd.com for enum in self.enums.itervalues(): 53311308Santhony.gutierrez@amd.com code(''' 53411308Santhony.gutierrez@amd.com if (machType == MachineType_${{enum.ident}}) 53511308Santhony.gutierrez@amd.com return GenericMachineType_${{enum.ident}}; 53611308Santhony.gutierrez@amd.com''') 53711308Santhony.gutierrez@amd.com code(''' 53811308Santhony.gutierrez@amd.com panic("cannot convert to a GenericMachineType"); 53911308Santhony.gutierrez@amd.com} 54011308Santhony.gutierrez@amd.com''') 54111308Santhony.gutierrez@amd.com 54211308Santhony.gutierrez@amd.com if self.isStateDecl: 54311308Santhony.gutierrez@amd.com code(''' 54411308Santhony.gutierrez@amd.com 54511308Santhony.gutierrez@amd.com// Code to convert the current state to an access permission 54611308Santhony.gutierrez@amd.comAccessPermission ${{self.c_ident}}_to_permission(const ${{self.c_ident}}& obj); 54711308Santhony.gutierrez@amd.com 54811308Santhony.gutierrez@amd.com''') 54911308Santhony.gutierrez@amd.com 55011308Santhony.gutierrez@amd.com # Trailer 55111308Santhony.gutierrez@amd.com code(''' 55211308Santhony.gutierrez@amd.comstd::ostream& operator<<(std::ostream& out, const ${{self.c_ident}}& obj); 55311308Santhony.gutierrez@amd.com 55411308Santhony.gutierrez@amd.com#endif // __${{self.c_ident}}_HH__ 55511308Santhony.gutierrez@amd.com''') 55611308Santhony.gutierrez@amd.com 55711308Santhony.gutierrez@amd.com code.write(path, "%s.hh" % self.c_ident) 55811308Santhony.gutierrez@amd.com 55911308Santhony.gutierrez@amd.com def printEnumCC(self, path): 56011308Santhony.gutierrez@amd.com code = self.symtab.codeFormatter() 56111308Santhony.gutierrez@amd.com code(''' 56211308Santhony.gutierrez@amd.com/** \\file ${{self.c_ident}}.hh 56311308Santhony.gutierrez@amd.com * 56411308Santhony.gutierrez@amd.com * Auto generated C++ code started by $__file__:$__line__ 56511308Santhony.gutierrez@amd.com */ 56611308Santhony.gutierrez@amd.com 56711308Santhony.gutierrez@amd.com#include <cassert> 56811308Santhony.gutierrez@amd.com#include <iostream> 56911308Santhony.gutierrez@amd.com#include <string> 57011308Santhony.gutierrez@amd.com 57111308Santhony.gutierrez@amd.com#include "base/misc.hh" 57211308Santhony.gutierrez@amd.com#include "mem/protocol/${{self.c_ident}}.hh" 57311308Santhony.gutierrez@amd.com 57411308Santhony.gutierrez@amd.comusing namespace std; 57511308Santhony.gutierrez@amd.com 57611308Santhony.gutierrez@amd.com''') 57711308Santhony.gutierrez@amd.com 57811308Santhony.gutierrez@amd.com if self.isStateDecl: 57911308Santhony.gutierrez@amd.com code(''' 58011308Santhony.gutierrez@amd.com// Code to convert the current state to an access permission 58111308Santhony.gutierrez@amd.comAccessPermission ${{self.c_ident}}_to_permission(const ${{self.c_ident}}& obj) 58211308Santhony.gutierrez@amd.com{ 58311308Santhony.gutierrez@amd.com switch(obj) { 58411308Santhony.gutierrez@amd.com''') 58511308Santhony.gutierrez@amd.com # For each case 58611308Santhony.gutierrez@amd.com code.indent() 58711308Santhony.gutierrez@amd.com for statePerm in self.statePermPairs: 58811308Santhony.gutierrez@amd.com code(' case ${{self.c_ident}}_${{statePerm[0]}}:') 58911308Santhony.gutierrez@amd.com code(' return AccessPermission_${{statePerm[1]}};') 59011308Santhony.gutierrez@amd.com code.dedent() 59111308Santhony.gutierrez@amd.com code (''' 59211308Santhony.gutierrez@amd.com default: 59311308Santhony.gutierrez@amd.com panic("Unknown state access permission converstion for ${{self.c_ident}}"); 59411308Santhony.gutierrez@amd.com } 59511308Santhony.gutierrez@amd.com} 59611308Santhony.gutierrez@amd.com 59711308Santhony.gutierrez@amd.com''') 59811308Santhony.gutierrez@amd.com 59911308Santhony.gutierrez@amd.com if self.isMachineType: 60011308Santhony.gutierrez@amd.com for enum in self.enums.itervalues(): 60111308Santhony.gutierrez@amd.com code('#include "mem/protocol/${{enum.ident}}_Controller.hh"') 60211308Santhony.gutierrez@amd.com code('#include "mem/ruby/system/MachineID.hh"') 60311308Santhony.gutierrez@amd.com 60411308Santhony.gutierrez@amd.com code(''' 60511308Santhony.gutierrez@amd.com// Code for output operator 60611308Santhony.gutierrez@amd.comostream& 60711308Santhony.gutierrez@amd.comoperator<<(ostream& out, const ${{self.c_ident}}& obj) 60811308Santhony.gutierrez@amd.com{ 60911308Santhony.gutierrez@amd.com out << ${{self.c_ident}}_to_string(obj); 61011308Santhony.gutierrez@amd.com out << flush; 61111308Santhony.gutierrez@amd.com return out; 61211308Santhony.gutierrez@amd.com} 61311308Santhony.gutierrez@amd.com 61411308Santhony.gutierrez@amd.com// Code to convert state to a string 61511308Santhony.gutierrez@amd.comstring 61611308Santhony.gutierrez@amd.com${{self.c_ident}}_to_string(const ${{self.c_ident}}& obj) 61711308Santhony.gutierrez@amd.com{ 61811308Santhony.gutierrez@amd.com switch(obj) { 61911308Santhony.gutierrez@amd.com''') 62011308Santhony.gutierrez@amd.com 62111308Santhony.gutierrez@amd.com # For each field 62211308Santhony.gutierrez@amd.com code.indent() 62311308Santhony.gutierrez@amd.com for enum in self.enums.itervalues(): 62411308Santhony.gutierrez@amd.com code(' case ${{self.c_ident}}_${{enum.ident}}:') 62511308Santhony.gutierrez@amd.com code(' return "${{enum.ident}}";') 62611308Santhony.gutierrez@amd.com code.dedent() 62711308Santhony.gutierrez@amd.com 62811308Santhony.gutierrez@amd.com # Trailer 62911308Santhony.gutierrez@amd.com code(''' 63011308Santhony.gutierrez@amd.com default: 63111308Santhony.gutierrez@amd.com panic("Invalid range for type ${{self.c_ident}}"); 63211308Santhony.gutierrez@amd.com } 63311308Santhony.gutierrez@amd.com} 63411308Santhony.gutierrez@amd.com 63511308Santhony.gutierrez@amd.com// Code to convert from a string to the enumeration 63611308Santhony.gutierrez@amd.com${{self.c_ident}} 63711308Santhony.gutierrez@amd.comstring_to_${{self.c_ident}}(const string& str) 63811308Santhony.gutierrez@amd.com{ 63911308Santhony.gutierrez@amd.com''') 64011308Santhony.gutierrez@amd.com 64111308Santhony.gutierrez@amd.com # For each field 64211308Santhony.gutierrez@amd.com start = "" 64311308Santhony.gutierrez@amd.com code.indent() 64411308Santhony.gutierrez@amd.com for enum in self.enums.itervalues(): 64511308Santhony.gutierrez@amd.com code('${start}if (str == "${{enum.ident}}") {') 64611308Santhony.gutierrez@amd.com code(' return ${{self.c_ident}}_${{enum.ident}};') 64711308Santhony.gutierrez@amd.com start = "} else " 64811308Santhony.gutierrez@amd.com code.dedent() 64911308Santhony.gutierrez@amd.com 65011308Santhony.gutierrez@amd.com code(''' 65111308Santhony.gutierrez@amd.com } else { 65211308Santhony.gutierrez@amd.com panic("Invalid string conversion for %s, type ${{self.c_ident}}", str); 65311308Santhony.gutierrez@amd.com } 65411308Santhony.gutierrez@amd.com} 65511308Santhony.gutierrez@amd.com 65611308Santhony.gutierrez@amd.com// Code to increment an enumeration type 65711308Santhony.gutierrez@amd.com${{self.c_ident}}& 65811308Santhony.gutierrez@amd.comoperator++(${{self.c_ident}}& e) 65911308Santhony.gutierrez@amd.com{ 66011308Santhony.gutierrez@amd.com assert(e < ${{self.c_ident}}_NUM); 66111308Santhony.gutierrez@amd.com return e = ${{self.c_ident}}(e+1); 66211308Santhony.gutierrez@amd.com} 66311308Santhony.gutierrez@amd.com''') 66411308Santhony.gutierrez@amd.com 66511308Santhony.gutierrez@amd.com # MachineType hack used to set the base level and number of 66611308Santhony.gutierrez@amd.com # components for each Machine 66711308Santhony.gutierrez@amd.com if self.isMachineType: 66811308Santhony.gutierrez@amd.com code(''' 66911308Santhony.gutierrez@amd.com/** \\brief returns the base vector index for each machine type to be 67011308Santhony.gutierrez@amd.com * used by NetDest 67111308Santhony.gutierrez@amd.com * 67211308Santhony.gutierrez@amd.com * \\return the base vector index for each machine type to be used by NetDest 67311308Santhony.gutierrez@amd.com * \\see NetDest.hh 67411308Santhony.gutierrez@amd.com */ 67511308Santhony.gutierrez@amd.comint 67611308Santhony.gutierrez@amd.com${{self.c_ident}}_base_level(const ${{self.c_ident}}& obj) 67711308Santhony.gutierrez@amd.com{ 67811308Santhony.gutierrez@amd.com switch(obj) { 67911308Santhony.gutierrez@amd.com''') 68011308Santhony.gutierrez@amd.com 68111308Santhony.gutierrez@amd.com # For each field 68211308Santhony.gutierrez@amd.com code.indent() 68311308Santhony.gutierrez@amd.com for i,enum in enumerate(self.enums.itervalues()): 68411308Santhony.gutierrez@amd.com code(' case ${{self.c_ident}}_${{enum.ident}}:') 68511308Santhony.gutierrez@amd.com code(' return $i;') 68611308Santhony.gutierrez@amd.com code.dedent() 68711308Santhony.gutierrez@amd.com 68811308Santhony.gutierrez@amd.com # total num 68911308Santhony.gutierrez@amd.com code(''' 69011308Santhony.gutierrez@amd.com case ${{self.c_ident}}_NUM: 69111308Santhony.gutierrez@amd.com return ${{len(self.enums)}}; 69211308Santhony.gutierrez@amd.com 69311308Santhony.gutierrez@amd.com default: 69411308Santhony.gutierrez@amd.com panic("Invalid range for type ${{self.c_ident}}"); 69511308Santhony.gutierrez@amd.com } 69611308Santhony.gutierrez@amd.com} 69711308Santhony.gutierrez@amd.com 69811308Santhony.gutierrez@amd.com/** \\brief returns the machine type for each base vector index used by NetDest 69911308Santhony.gutierrez@amd.com * 70011308Santhony.gutierrez@amd.com * \\return the MachineType 70111308Santhony.gutierrez@amd.com */ 70211308Santhony.gutierrez@amd.comMachineType 70311308Santhony.gutierrez@amd.com${{self.c_ident}}_from_base_level(int type) 70411308Santhony.gutierrez@amd.com{ 70511308Santhony.gutierrez@amd.com switch(type) { 70611308Santhony.gutierrez@amd.com''') 70711308Santhony.gutierrez@amd.com 70811308Santhony.gutierrez@amd.com # For each field 70911308Santhony.gutierrez@amd.com code.indent() 71011308Santhony.gutierrez@amd.com for i,enum in enumerate(self.enums.itervalues()): 71111308Santhony.gutierrez@amd.com code(' case $i:') 71211308Santhony.gutierrez@amd.com code(' return ${{self.c_ident}}_${{enum.ident}};') 71311308Santhony.gutierrez@amd.com code.dedent() 71411308Santhony.gutierrez@amd.com 71511308Santhony.gutierrez@amd.com # Trailer 71611308Santhony.gutierrez@amd.com code(''' 71711308Santhony.gutierrez@amd.com default: 71811308Santhony.gutierrez@amd.com panic("Invalid range for type ${{self.c_ident}}"); 71911308Santhony.gutierrez@amd.com } 72011308Santhony.gutierrez@amd.com} 72111308Santhony.gutierrez@amd.com 72211308Santhony.gutierrez@amd.com/** \\brief The return value indicates the number of components created 72311308Santhony.gutierrez@amd.com * before a particular machine\'s components 72411308Santhony.gutierrez@amd.com * 72511308Santhony.gutierrez@amd.com * \\return the base number of components for each machine 72611308Santhony.gutierrez@amd.com */ 72711308Santhony.gutierrez@amd.comint 72811308Santhony.gutierrez@amd.com${{self.c_ident}}_base_number(const ${{self.c_ident}}& obj) 72911308Santhony.gutierrez@amd.com{ 73011308Santhony.gutierrez@amd.com int base = 0; 73111308Santhony.gutierrez@amd.com switch(obj) { 73211308Santhony.gutierrez@amd.com''') 73311308Santhony.gutierrez@amd.com 73411308Santhony.gutierrez@amd.com # For each field 73511308Santhony.gutierrez@amd.com code.indent() 73611308Santhony.gutierrez@amd.com code(' case ${{self.c_ident}}_NUM:') 73711308Santhony.gutierrez@amd.com for enum in reversed(self.enums.values()): 73811308Santhony.gutierrez@amd.com code(' base += ${{enum.ident}}_Controller::getNumControllers();') 73911308Santhony.gutierrez@amd.com code(' case ${{self.c_ident}}_${{enum.ident}}:') 74011308Santhony.gutierrez@amd.com code(' break;') 74111308Santhony.gutierrez@amd.com code.dedent() 74211308Santhony.gutierrez@amd.com 74311308Santhony.gutierrez@amd.com code(''' 74411308Santhony.gutierrez@amd.com default: 74511308Santhony.gutierrez@amd.com panic("Invalid range for type ${{self.c_ident}}"); 74611308Santhony.gutierrez@amd.com } 74711308Santhony.gutierrez@amd.com 74811308Santhony.gutierrez@amd.com return base; 74911308Santhony.gutierrez@amd.com} 75011308Santhony.gutierrez@amd.com 75111308Santhony.gutierrez@amd.com/** \\brief returns the total number of components for each machine 75211308Santhony.gutierrez@amd.com * \\return the total number of components for each machine 75311308Santhony.gutierrez@amd.com */ 75411308Santhony.gutierrez@amd.comint 75511308Santhony.gutierrez@amd.com${{self.c_ident}}_base_count(const ${{self.c_ident}}& obj) 75611308Santhony.gutierrez@amd.com{ 75711308Santhony.gutierrez@amd.com switch(obj) { 75811308Santhony.gutierrez@amd.com''') 75911308Santhony.gutierrez@amd.com 76011308Santhony.gutierrez@amd.com # For each field 76111308Santhony.gutierrez@amd.com for enum in self.enums.itervalues(): 76211308Santhony.gutierrez@amd.com code(''' 76311308Santhony.gutierrez@amd.com case ${{self.c_ident}}_${{enum.ident}}: 76411308Santhony.gutierrez@amd.com return ${{enum.ident}}_Controller::getNumControllers(); 76511308Santhony.gutierrez@amd.com''') 76611308Santhony.gutierrez@amd.com 76711308Santhony.gutierrez@amd.com # total num 76811308Santhony.gutierrez@amd.com code(''' 76911308Santhony.gutierrez@amd.com case ${{self.c_ident}}_NUM: 77011308Santhony.gutierrez@amd.com default: 77111308Santhony.gutierrez@amd.com panic("Invalid range for type ${{self.c_ident}}"); 77211308Santhony.gutierrez@amd.com } 77311308Santhony.gutierrez@amd.com} 77411308Santhony.gutierrez@amd.com''') 77511308Santhony.gutierrez@amd.com 77611308Santhony.gutierrez@amd.com for enum in self.enums.itervalues(): 77711308Santhony.gutierrez@amd.com if enum.ident == "DMA": 77811308Santhony.gutierrez@amd.com code(''' 77911308Santhony.gutierrez@amd.comMachineID 78011308Santhony.gutierrez@amd.commap_Address_to_DMA(const Address &addr) 78111308Santhony.gutierrez@amd.com{ 78211308Santhony.gutierrez@amd.com MachineID dma = {MachineType_DMA, 0}; 78311308Santhony.gutierrez@amd.com return dma; 78411308Santhony.gutierrez@amd.com} 78511308Santhony.gutierrez@amd.com''') 78611308Santhony.gutierrez@amd.com 78711308Santhony.gutierrez@amd.com code(''' 78811308Santhony.gutierrez@amd.com 78911308Santhony.gutierrez@amd.comMachineID 79011308Santhony.gutierrez@amd.comget${{enum.ident}}MachineID(NodeID RubyNode) 79111308Santhony.gutierrez@amd.com{ 79211308Santhony.gutierrez@amd.com MachineID mach = {MachineType_${{enum.ident}}, RubyNode}; 79311308Santhony.gutierrez@amd.com return mach; 79411308Santhony.gutierrez@amd.com} 79511308Santhony.gutierrez@amd.com''') 79611308Santhony.gutierrez@amd.com 79711308Santhony.gutierrez@amd.com # Write the file 79811308Santhony.gutierrez@amd.com code.write(path, "%s.cc" % self.c_ident) 79911308Santhony.gutierrez@amd.com 80011308Santhony.gutierrez@amd.com__all__ = [ "Type" ] 80111308Santhony.gutierrez@amd.com