Topologies and protocols are separate, but both involve slicc generated objects. Since they can be intermixed, I think it makes sense for them both to be at the same directory level from a configuration perspective.
Brad -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of nathan binkert Sent: Thursday, March 18, 2010 4:45 PM To: M5 Developer List Subject: Re: [m5-dev] [PATCH 29 of 31] ruby: Reorganized Ruby topology and protocol files Should the topologies really be in the protocols directory, or should they really be in the config directory? slicc operates on stuff in the protocols dir, but does it operate on the topology files? Nate On Thu, Mar 18, 2010 at 2:47 PM, Brad Beckmann <[email protected]> wrote: > # HG changeset patch > # User Brad Beckmann <[email protected]> > # Date 1268945240 25200 > # Node ID 574ee345e7d1d2f6e5ef17f42a7984d35cfdddb3 > # Parent fe49a7b4949abb68e8c0ca79a7c62674ea547337 > ruby: Reorganized Ruby topology and protocol files > > diff --git a/configs/common/Options.py b/configs/common/Options.py > --- a/configs/common/Options.py > +++ b/configs/common/Options.py > @@ -37,8 +37,8 @@ > parser.add_option("--clock", action="store", type="string", default='1GHz') > parser.add_option("--num-dirs", type="int", default=1) > parser.add_option("--num-l2caches", type="int", default=1) > -parser.add_option("--topology", type="string", default="crossbar", > - help="'crossbar'|'mesh'") > +parser.add_option("--topology", type="string", default="Crossbar", > + help="check configs/ruby/topologies for complete list") > parser.add_option("--mesh-rows", type="int", default=1, > help="the number of rows in the mesh topology") > parser.add_option("--garnet-network", type="string", default=none, > diff --git a/configs/ruby/Ruby.py b/configs/ruby/Ruby.py > --- a/configs/ruby/Ruby.py > +++ b/configs/ruby/Ruby.py > @@ -31,15 +31,13 @@ > from m5.objects import * > from m5.defines import buildEnv > from m5.util import addToPath > -addToPath('../ruby/networks') > -from MeshDirCorners import * > - > -protocol = buildEnv['PROTOCOL'] > - > -exec "import %s" % protocol > +addToPath('../ruby/topologies') > +addToPath('../ruby/protocols') > > def create_system(options, physmem, piobus = None, dma_devices = []): > > + protocol = buildEnv['PROTOCOL'] > + exec "import %s" % protocol > try: > (cpu_sequencers, dir_cntrls, all_cntrls) = \ > eval("%s.create_system(options, physmem, piobus, dma_devices)" \ > @@ -49,27 +47,17 @@ > sys.exit(1) > > # > - # Important: the topology constructor must be called before the network > - # constructor. > + # Important: the topology must be created before the network and after > the > + # controllers. > # > - if options.topology == "crossbar": > - net_topology = makeCrossbar(all_cntrls) > - elif options.topology == "mesh": > - # > - # The uniform mesh topology assumes one router per cpu > - # > - net_topology = makeMesh(all_cntrls, > - len(cpu_sequencers), > - options.mesh_rows) > + exec "import %s" % options.topology > + try: > + net_topology = eval("%s.makeTopology(all_cntrls, options)" \ > + % options.topology) > + except: > + print "Error: could not create topology %s" % options.topology > + sys.exit(1) > > - elif options.topology == "mesh_dir_corner": > - # > - # The uniform mesh topology assumes one router per cpu > - # > - net_topology = makeMeshDirCorners(all_cntrls, > - len(cpu_sequencers), > - options.mesh_rows) > - > if options.garnet_network == "fixed": > network = GarnetNetwork_d(topology = net_topology) > elif options.garnet_network == "flexible": > diff --git a/configs/ruby/MESI_CMP_directory.py > b/configs/ruby/protocols/MESI_CMP_directory.py > rename from configs/ruby/MESI_CMP_directory.py > rename to configs/ruby/protocols/MESI_CMP_directory.py > diff --git a/configs/ruby/MI_example.py b/configs/ruby/protocols/MI_example.py > rename from configs/ruby/MI_example.py > rename to configs/ruby/protocols/MI_example.py > diff --git a/configs/ruby/MOESI_CMP_directory.py > b/configs/ruby/protocols/MOESI_CMP_directory.py > rename from configs/ruby/MOESI_CMP_directory.py > rename to configs/ruby/protocols/MOESI_CMP_directory.py > diff --git a/configs/ruby/MOESI_CMP_token.py > b/configs/ruby/protocols/MOESI_CMP_token.py > rename from configs/ruby/MOESI_CMP_token.py > rename to configs/ruby/protocols/MOESI_CMP_token.py > diff --git a/configs/ruby/MOESI_hammer.py > b/configs/ruby/protocols/MOESI_hammer.py > rename from configs/ruby/MOESI_hammer.py > rename to configs/ruby/protocols/MOESI_hammer.py > diff --git a/configs/ruby/topologies/Crossbar.py > b/configs/ruby/topologies/Crossbar.py > new file mode 100644 > --- /dev/null > +++ b/configs/ruby/topologies/Crossbar.py > @@ -0,0 +1,40 @@ > +# Copyright (c) 2010 Advanced Micro Devices, Inc. > +# All rights reserved. > +# > +# Redistribution and use in source and binary forms, with or without > +# modification, are permitted provided that the following conditions are > +# met: redistributions of source code must retain the above copyright > +# notice, this list of conditions and the following disclaimer; > +# redistributions in binary form must reproduce the above copyright > +# notice, this list of conditions and the following disclaimer in the > +# documentation and/or other materials provided with the distribution; > +# neither the name of the copyright holders nor the names of its > +# contributors may be used to endorse or promote products derived from > +# this software without specific prior written permission. > +# > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR > +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT > +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > +# > +# Authors: Steve Reinhardt > + > +from m5.params import * > +from m5.objects import * > + > +def makeTopology(nodes, options): > + ext_links = [ExtLink(ext_node=n, int_node=i) > + for (i, n) in enumerate(nodes)] > + xbar = len(nodes) # node ID for crossbar switch > + int_links = [IntLink(node_a=i, node_b=xbar) for i in range(len(nodes))] > + return Topology(ext_links=ext_links, int_links=int_links, > + num_int_nodes=len(nodes)+1) > + > + > diff --git a/configs/ruby/topologies/Mesh.py b/configs/ruby/topologies/Mesh.py > new file mode 100644 > --- /dev/null > +++ b/configs/ruby/topologies/Mesh.py > @@ -0,0 +1,103 @@ > +# Copyright (c) 2010 Advanced Micro Devices, Inc. > +# All rights reserved. > +# > +# Redistribution and use in source and binary forms, with or without > +# modification, are permitted provided that the following conditions are > +# met: redistributions of source code must retain the above copyright > +# notice, this list of conditions and the following disclaimer; > +# redistributions in binary form must reproduce the above copyright > +# notice, this list of conditions and the following disclaimer in the > +# documentation and/or other materials provided with the distribution; > +# neither the name of the copyright holders nor the names of its > +# contributors may be used to endorse or promote products derived from > +# this software without specific prior written permission. > +# > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR > +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT > +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > +# > +# Authors: Brad Beckmann > + > +from m5.params import * > +from m5.objects import * > + > +# > +# Makes a generic mesh assuming an equal number of cache and directory cntrls > +# > + > +def makeTopology(nodes, options): > + > + num_routers = options.num_cpus > + num_rows = options.mesh_rows > + > + # > + # There must be an evenly divisible number of cntrls to routers > + # Also, obviously the number or rows must be <= the number of routers > + # > + cntrls_per_router, remainder = divmod(len(nodes), num_routers) > + assert(num_rows <= num_routers) > + num_columns = int(num_routers / num_rows) > + assert(num_columns * num_rows == num_routers) > + > + # > + # Add all but the remainder nodes to the list of nodes to be uniformly > + # distributed across the network. > + # > + network_nodes = [] > + remainder_nodes = [] > + for node_index in xrange(len(nodes)): > + if node_index < (len(nodes) - remainder): > + network_nodes.append(nodes[node_index]) > + else: > + remainder_nodes.append(nodes[node_index]) > + > + # > + # Connect each node to the appropriate router > + # > + ext_links = [] > + for (i, n) in enumerate(network_nodes): > + cntrl_level, router_id = divmod(i, num_routers) > + assert(cntrl_level < cntrls_per_router) > + ext_links.append(ExtLink(ext_node=n, int_node=router_id)) > + > + # > + # Connect the remainding nodes to router 0. These should only be DMA > nodes. > + # > + for (i, node) in enumerate(remainder_nodes): > + assert(node.type == 'DMA_Controller') > + assert(i < remainder) > + ext_links.append(ExtLink(ext_node=node, int_node=0)) > + > + # > + # Create the mesh links. First row (east-west) links then column > + # (north-south) links > + # > + int_links = [] > + for row in xrange(num_rows): > + for col in xrange(num_columns): > + if (col + 1 < num_columns): > + east_id = col + (row * num_columns) > + west_id = (col + 1) + (row * num_columns) > + int_links.append(IntLink(node_a=east_id, > + node_b=west_id, > + weight=1)) > + for col in xrange(num_columns): > + for row in xrange(num_rows): > + if (row + 1 < num_rows): > + north_id = col + (row * num_columns) > + south_id = col + ((row + 1) * num_columns) > + int_links.append(IntLink(node_a=north_id, > + node_b=south_id, > + weight=2)) > + > + return Topology(ext_links=ext_links, > + int_links=int_links, > + num_int_nodes=num_routers) > diff --git a/configs/ruby/networks/MeshDirCorners.py > b/configs/ruby/topologies/MeshDirCorners.py > rename from configs/ruby/networks/MeshDirCorners.py > rename to configs/ruby/topologies/MeshDirCorners.py > --- a/configs/ruby/networks/MeshDirCorners.py > +++ b/configs/ruby/topologies/MeshDirCorners.py > @@ -35,7 +35,11 @@ > # specified is similar to GEMS old file specified network. > # > > -def makeMeshDirCorners(nodes, num_routers, num_rows): > +def makeTopology(nodes, options): > + > + num_routers = options.num_cpus > + num_rows = options.mesh_rows > + > # > # First determine which nodes are cache cntrls vs. dirs vs. dma > # > diff --git a/src/mem/ruby/network/Network.py b/src/mem/ruby/network/Network.py > --- a/src/mem/ruby/network/Network.py > +++ b/src/mem/ruby/network/Network.py > @@ -56,79 +56,6 @@ > print_config = Param.Bool(False, > "display topology config in the stats file") > > -def makeCrossbar(nodes): > - ext_links = [ExtLink(ext_node=n, int_node=i) > - for (i, n) in enumerate(nodes)] > - xbar = len(nodes) # node ID for crossbar switch > - int_links = [IntLink(node_a=i, node_b=xbar) for i in range(len(nodes))] > - return Topology(ext_links=ext_links, int_links=int_links, > - num_int_nodes=len(nodes)+1) > - > -def makeMesh(nodes, num_routers, num_rows): > - # > - # There must be an evenly divisible number of cntrls to routers > - # Also, obviously the number or rows must be <= the number of routers > - # > - cntrls_per_router, remainder = divmod(len(nodes), num_routers) > - assert(num_rows <= num_routers) > - num_columns = int(num_routers / num_rows) > - assert(num_columns * num_rows == num_routers) > - > - # > - # Add all but the remainder nodes to the list of nodes to be uniformly > - # distributed across the network. > - # > - network_nodes = [] > - remainder_nodes = [] > - for node_index in xrange(len(nodes)): > - if node_index < (len(nodes) - remainder): > - network_nodes.append(nodes[node_index]) > - else: > - remainder_nodes.append(nodes[node_index]) > - > - # > - # Connect each node to the appropriate router > - # > - ext_links = [] > - for (i, n) in enumerate(network_nodes): > - cntrl_level, router_id = divmod(i, num_routers) > - assert(cntrl_level < cntrls_per_router) > - ext_links.append(ExtLink(ext_node=n, int_node=router_id)) > - > - # > - # Connect the remainding nodes to router 0. These should only be DMA > nodes. > - # > - for (i, node) in enumerate(remainder_nodes): > - assert(node.type == 'DMA_Controller') > - assert(i < remainder) > - ext_links.append(ExtLink(ext_node=node, int_node=0)) > - > - # > - # Create the mesh links. First row (east-west) links then column > - # (north-south) links > - # > - int_links = [] > - for row in xrange(num_rows): > - for col in xrange(num_columns): > - if (col + 1 < num_columns): > - east_id = col + (row * num_columns) > - west_id = (col + 1) + (row * num_columns) > - int_links.append(IntLink(node_a=east_id, > - node_b=west_id, > - weight=1)) > - for col in xrange(num_columns): > - for row in xrange(num_rows): > - if (row + 1 < num_rows): > - north_id = col + (row * num_columns) > - south_id = col + ((row + 1) * num_columns) > - int_links.append(IntLink(node_a=north_id, > - node_b=south_id, > - weight=2)) > - > - return Topology(ext_links=ext_links, > - int_links=int_links, > - num_int_nodes=num_routers) > - > class RubyNetwork(SimObject): > type = 'RubyNetwork' > cxx_class = 'Network' > > _______________________________________________ > m5-dev mailing list > [email protected] > http://m5sim.org/mailman/listinfo/m5-dev > > _______________________________________________ m5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/m5-dev _______________________________________________ m5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/m5-dev
