ruby: network: correct naming of routers
authorNilay Vaish <nilay@cs.wisc.edu>
Fri, 6 Sep 2013 21:21:33 +0000 (16:21 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Fri, 6 Sep 2013 21:21:33 +0000 (16:21 -0500)
The routers are created before the network class. This results in the routers
becoming children of the first link they are connected to and they get generic
names like int_node and node_b. This patch creates the network object first
and passes it to the topology creation function. Now the routers are children
of the network object and names are much more sensible.

configs/ruby/Ruby.py
configs/topologies/BaseTopology.py
configs/topologies/Cluster.py
configs/topologies/Crossbar.py
configs/topologies/Mesh.py
configs/topologies/MeshDirCorners.py
configs/topologies/Pt2Pt.py
configs/topologies/Torus.py

index e9a8a3c3f67e84a9bbe76797d0143a121f88e1d4..0cd63b4f98cda35e11bbcbf890757b008d55d797 100644 (file)
@@ -145,17 +145,12 @@ def create_system(options, system, piobus = None, dma_ports = []):
         class ExtLinkClass(SimpleExtLink): pass
         class RouterClass(Switch): pass
 
-    #
-    # Important: the topology must be instantiated before the network and after
-    # the controllers. Hence the separation between topology definition and
-    # instantiation.
-    #
 
-    routers, int_links, ext_links = topology.makeTopology(options,
-                                    IntLinkClass, ExtLinkClass, RouterClass)
-    network = NetworkClass(ruby_system = ruby, routers = routers,
-                           int_links = int_links, ext_links = ext_links,
-                           topology = topology.description)
+    # Create the network topology
+    network = NetworkClass(ruby_system = ruby, topology = topology.description,
+                           routers = [], ext_links = [], int_links = [])
+    topology.makeTopology(options, network, IntLinkClass, ExtLinkClass,
+                          RouterClass)
 
     if options.network_fault_model:
         assert(options.garnet_network == "fixed")
index 2390bb5beb7f779726122999aa65328f051e2904..bd8ae255ed125f5c2fcd4826951c06e0a0060db0 100644 (file)
@@ -38,7 +38,7 @@ class BaseTopology(object):
             all of the controllers created in the above file.
         """
 
-    def makeTopology(self, options, IntLink, ExtLink, Router):
+    def makeTopology(self, options, network, IntLink, ExtLink, Router):
         """ Called from configs/ruby/Ruby.py
             The return value is ( list(Router), list(IntLink), list(ExtLink))
             The API of this function cannot change when subclassing!!
index 93bd0d946b279ad71733b9b7fd8b04a0bec64c1b..5f41edd0a022deed7daa5c1706c3954c1ad03533 100644 (file)
@@ -73,22 +73,17 @@ class Cluster(BaseTopology):
     def add(self, node):
         self.nodes.append(node)
 
-    def makeTopology(self, options, IntLink, ExtLink, Router):
+    def makeTopology(self, options, network, IntLink, ExtLink, Router):
         """ Recursively make all of the links and routers
         """
-        routers = []
-        int_links = []
-        ext_links = []
 
         # make a router to connect all of the nodes
         self.router = Router(router_id=self.num_routers())
-        routers.append(self.router)
+        network.routers.append(self.router)
+
         for node in self.nodes:
             if type(node) == Cluster:
-                subRouters, subIntLinks, subExtLinks = node.makeTopology(options, IntLink, ExtLink, Router)
-                routers += subRouters
-                int_links += subIntLinks
-                ext_links += subExtLinks
+                node.makeTopology(options, network, IntLink, ExtLink, Router)
 
                 # connect this cluster to the router
                 link = IntLink(link_id=self.num_int_links(), node_a=self.router, node_b=node.router)
@@ -102,7 +97,7 @@ class Cluster(BaseTopology):
                 elif self.intLatency:
                     link.latency = self.intLatency
 
-                int_links.append(link)
+                network.int_links.append(link)
             else:
                 # node is just a controller connect it to the router via a ext_link
                 link = ExtLink(link_id=self.num_ext_links(), ext_node=node, int_node=self.router)
@@ -111,9 +106,7 @@ class Cluster(BaseTopology):
                 if self.intLatency:
                     link.latency = self.intLatency
 
-                ext_links.append(link)
-
-        return routers, int_links, ext_links
+                network.ext_links.append(link)
 
     def __len__(self):
         return len([i for i in self.nodes if type(i) != Cluster]) + \
index c85b8e8eb637c6853d5d119eb70a4ebd7f17107b..e3dd431e743bb3adab91518eaf4b4bb6c19d7af5 100644 (file)
@@ -34,19 +34,22 @@ from BaseTopology import SimpleTopology
 class Crossbar(SimpleTopology):
     description='Crossbar'
 
-    def makeTopology(self, options, IntLink, ExtLink, Router):
-        # Create an individual router for each controller plus one more for the
-        # centralized crossbar.  The large numbers of routers are needed because
-        # external links do not model outgoing bandwidth in the simple network, but
-        # internal links do.
+    def makeTopology(self, options, network, IntLink, ExtLink, Router):
+        # Create an individual router for each controller plus one more for
+        # the centralized crossbar.  The large numbers of routers are needed
+        # because external links do not model outgoing bandwidth in the
+        # simple network, but internal links do.
 
         routers = [Router(router_id=i) for i in range(len(self.nodes)+1)]
+        xbar = routers[len(self.nodes)] # the crossbar router is the last router created
+        network.routers = routers
+
         ext_links = [ExtLink(link_id=i, ext_node=n, int_node=routers[i])
                         for (i, n) in enumerate(self.nodes)]
+        network.ext_links = ext_links
+
         link_count = len(self.nodes)
-        xbar = routers[len(self.nodes)] # the crossbar router is the last router created
         int_links = [IntLink(link_id=(link_count+i),
                              node_a=routers[i], node_b=xbar)
                         for i in range(len(self.nodes))]
-
-        return routers, int_links, ext_links
+        network.int_links = int_links
index 81d87f5e5749f693eecd81ffa3dd629edd4bd504..446fc4a187d9c5775c451cbfe1b3f013afb4e3ec 100644 (file)
@@ -39,7 +39,7 @@ class Mesh(SimpleTopology):
 
     # Makes a generic mesh assuming an equal number of cache and directory cntrls
 
-    def makeTopology(self, options, IntLink, ExtLink, Router):
+    def makeTopology(self, options, network, IntLink, ExtLink, Router):
         nodes = self.nodes
 
         num_routers = options.num_cpus
@@ -54,6 +54,7 @@ class Mesh(SimpleTopology):
 
         # Create the routers in the mesh
         routers = [Router(router_id=i) for i in range(num_routers)]
+        network.routers = routers
 
         # link counter to set unique link ids
         link_count = 0
@@ -86,6 +87,8 @@ class Mesh(SimpleTopology):
                                     int_node=routers[0]))
             link_count += 1
 
+        network.ext_links = ext_links
+
         # Create the mesh links.  First row (east-west) links then column
         # (north-south) links
         int_links = []
@@ -111,4 +114,4 @@ class Mesh(SimpleTopology):
                                             weight=2))
                     link_count += 1
 
-        return routers, int_links, ext_links
+        network.int_links = int_links
index 13b4acc19c384dadbbb5e5118aa1ed6b72a01d23..40720004e49c14c3685a607e0902f7a42fbae679 100644 (file)
@@ -42,7 +42,7 @@ class MeshDirCorners(SimpleTopology):
     # configurations.  The network specified is similar to GEMS old file
     # specified network.
 
-    def makeTopology(self, options, IntLink, ExtLink, Router):
+    def makeTopology(self, options, network, IntLink, ExtLink, Router):
         nodes = self.nodes
 
         num_routers = options.num_cpus
@@ -74,6 +74,7 @@ class MeshDirCorners(SimpleTopology):
 
         # Create the routers in the mesh
         routers = [Router(router_id=i) for i in range(num_routers)]
+        network.routers = routers
 
         # link counter to set unique link ids
         link_count = 0
@@ -104,7 +105,10 @@ class MeshDirCorners(SimpleTopology):
         # Connect the dma nodes to router 0.  These should only be DMA nodes.
         for (i, node) in enumerate(dma_nodes):
             assert(node.type == 'DMA_Controller')
-            ext_links.append(ExtLink(link_id=link_count, ext_node=node, int_node=routers[0]))
+            ext_links.append(ExtLink(link_id=link_count, ext_node=node,
+                                     int_node=routers[0]))
+
+        network.ext_links = ext_links
 
         # Create the mesh links.  First row (east-west) links then column
         # (north-south) links
@@ -131,4 +135,4 @@ class MeshDirCorners(SimpleTopology):
                                             weight=2))
                     link_count += 1
 
-        return routers, int_links, ext_links
+        network.int_links = int_links
index 74ff116ffbfc5db43d14961317d6ee6229a6013c..8fada26bf57744a469c460523ba8d59722091ed7 100644 (file)
@@ -39,15 +39,18 @@ class Pt2Pt(SimpleTopology):
     def __init__(self, controllers):
         self.nodes = controllers
 
-    def makeTopology(self, options, IntLink, ExtLink, Router):
+    def makeTopology(self, options, network, IntLink, ExtLink, Router):
         nodes = self.nodes
-        # Create an individual router for each controller, and connect all to all.
 
+        # Create an individual router for each controller, and connect all to all.
         routers = [Router(router_id=i) for i in range(len(nodes))]
+        network.routers = routers
+
         ext_links = [ExtLink(link_id=i, ext_node=n, int_node=routers[i])
                     for (i, n) in enumerate(nodes)]
-        link_count = len(nodes)
+        network.ext_links = ext_links
 
+        link_count = len(nodes)
         int_links = []
         for i in xrange(len(nodes)):
             for j in xrange(len(nodes)):
@@ -57,4 +60,4 @@ class Pt2Pt(SimpleTopology):
                                             node_a=routers[i],
                                             node_b=routers[j]))
 
-        return routers, int_links, ext_links
+        network.int_links = int_links
index 9869465ae819bfd84611d3aaa7b555b78b7d7e33..db67d3eded808ab4cd30de2e318fc3bc88603aed 100644 (file)
@@ -44,7 +44,7 @@ class Torus(SimpleTopology):
     # All links (including the wrap-around ones) are of equal length, double that
     # of a mesh. Thus, each link is assigned a latency of 2 cycles.
 
-    def makeTopology(self, options, IntLink, ExtLink, Router):
+    def makeTopology(self, options, network, IntLink, ExtLink, Router):
         nodes = self.nodes
 
         num_routers = options.num_cpus
@@ -59,6 +59,7 @@ class Torus(SimpleTopology):
 
         # Create the routers in the torus
         routers = [Router(router_id=i) for i in range(num_routers)]
+        network.routers = routers
 
         # link counter to set unique link ids
         link_count = 0
@@ -91,6 +92,8 @@ class Torus(SimpleTopology):
                                     int_node=routers[0]))
             link_count += 1
 
+        network.ext_links = ext_links
+
         # Create the torus links.  First row (east-west) links then column
         # (north-south) links
         # column links are given higher weights to implement XY routing
@@ -123,4 +126,4 @@ class Torus(SimpleTopology):
                                         weight=2))
                 link_count += 1
 
-        return routers, int_links, ext_links
+        network.int_links = int_links