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