diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/BasicRouter.py --- a/src/mem/ruby/network/BasicRouter.py Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/BasicRouter.py Wed Aug 24 11:22:48 2016 -0400 @@ -34,3 +34,4 @@ type = 'BasicRouter' cxx_header = "mem/ruby/network/BasicRouter.hh" router_id = Param.Int("ID in relation to other routers") + latency = Param.Cycles(1, "number of cycles inside router") diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/Network.hh --- a/src/mem/ruby/network/Network.hh Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/Network.hh Wed Aug 24 11:22:48 2016 -0400 @@ -85,7 +85,9 @@ virtual void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, const NetDest& routing_table_entry) = 0; virtual void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) = 0; + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport) = 0; virtual void collateStats() = 0; virtual void print(std::ostream& out) const = 0; diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/Topology.hh --- a/src/mem/ruby/network/Topology.hh Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/Topology.hh Wed Aug 24 11:22:48 2016 -0400 @@ -52,11 +52,14 @@ class Network; typedef std::vector > Matrix; +typedef std::string PortDirection; struct LinkEntry { BasicLink *link; LinkDirection direction; + PortDirection src_outport_dirn; + PortDirection dst_inport_dirn; }; typedef std::map, LinkEntry> LinkMap; @@ -72,7 +75,9 @@ void print(std::ostream& out) const { out << "[Topology]"; } private: - void addLink(SwitchID src, SwitchID dest, BasicLink* link); + void addLink(SwitchID src, SwitchID dest, BasicLink* link, + PortDirection src_outport_dirn = "", + PortDirection dest_inport_dirn = ""); void makeLink(Network *net, SwitchID src, SwitchID dest, const NetDest& routing_table_entry); diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/Topology.cc --- a/src/mem/ruby/network/Topology.cc Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/Topology.cc Wed Aug 24 11:22:48 2016 -0400 @@ -88,6 +88,9 @@ BasicRouter *router_src = int_link->params()->src_node; BasicRouter *router_dst = int_link->params()->dst_node; + PortDirection src_outport = int_link->params()->src_outport; + PortDirection dst_inport = int_link->params()->dst_inport; + // Store the IntLink pointers for later m_int_link_vector.push_back(int_link); @@ -95,7 +98,7 @@ int dst = router_dst->params()->router_id + 2*m_nodes; // create the internal uni-directional link from src to dst - addLink(src, dst, int_link); + addLink(src, dst, int_link, src_outport, dst_inport); } } @@ -153,7 +156,9 @@ } void -Topology::addLink(SwitchID src, SwitchID dest, BasicLink* link) +Topology::addLink(SwitchID src, SwitchID dest, BasicLink* link, + PortDirection src_outport_dirn, + PortDirection dst_inport_dirn) { assert(src <= m_number_of_switches+m_nodes+m_nodes); assert(dest <= m_number_of_switches+m_nodes+m_nodes); @@ -164,6 +169,8 @@ src_dest_pair.first = src; src_dest_pair.second = dest; link_entry.link = link; + link_entry.src_outport_dirn = src_outport_dirn; + link_entry.dst_inport_dirn = dst_inport_dirn; m_link_map[src_dest_pair] = link_entry; } @@ -199,7 +206,9 @@ link_entry = m_link_map[src_dest]; net->makeInternalLink(src - (2 * m_nodes), dest - (2 * m_nodes), link_entry.link, - routing_table_entry); + routing_table_entry, + link_entry.src_outport_dirn, + link_entry.dst_inport_dirn); } } diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh Wed Aug 24 11:22:48 2016 -0400 @@ -74,7 +74,9 @@ void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, const NetDest& routing_table_entry); void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry); + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport); //! Function for performing a functional write. The return value //! indicates the number of messages that were written. diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc Wed Aug 24 11:22:48 2016 -0400 @@ -175,7 +175,9 @@ void GarnetNetwork_d::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport) { GarnetIntLink_d* garnet_link = safe_cast(link); NetworkLink_d* net_link = garnet_link->m_network_links[0]; diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh Wed Aug 24 11:22:48 2016 -0400 @@ -65,7 +65,9 @@ void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, const NetDest& routing_table_entry); void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry); + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport); //! Function for performing a functional read. The return value //! indicates if a message was found that had the required address. diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc Wed Aug 24 11:22:48 2016 -0400 @@ -128,7 +128,9 @@ void GarnetNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport) { GarnetIntLink* garnet_link = safe_cast(link); NetworkLink *net_link = garnet_link->m_network_links[0]; diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/simple/SimpleNetwork.hh --- a/src/mem/ruby/network/simple/SimpleNetwork.hh Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/simple/SimpleNetwork.hh Wed Aug 24 11:22:48 2016 -0400 @@ -64,7 +64,9 @@ void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, const NetDest& routing_table_entry); void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry); + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport); void print(std::ostream& out) const; diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/simple/SimpleNetwork.cc --- a/src/mem/ruby/network/simple/SimpleNetwork.cc Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/simple/SimpleNetwork.cc Wed Aug 24 11:22:48 2016 -0400 @@ -104,7 +104,9 @@ // From a switch to a switch void SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport) { // Create a set of new MessageBuffers std::vector queues(m_virtual_networks); diff -r 31a963b3a048 -r c255d8f54fea configs/topologies/Mesh_XY.py --- a/configs/topologies/Mesh_XY.py Wed Aug 24 11:22:26 2016 -0400 +++ b/configs/topologies/Mesh_XY.py Wed Aug 24 11:22:48 2016 -0400 @@ -108,6 +108,8 @@ int_links.append(IntLink(link_id=link_count, src_node=routers[east_out], dst_node=routers[west_in], + src_outport="East", + dst_inport="West", weight=1)) link_count += 1 @@ -120,6 +122,8 @@ int_links.append(IntLink(link_id=link_count, src_node=routers[west_out], dst_node=routers[east_in], + src_outport="West", + dst_inport="East", weight=1)) link_count += 1 @@ -132,6 +136,8 @@ int_links.append(IntLink(link_id=link_count, src_node=routers[north_out], dst_node=routers[south_in], + src_outport="North", + dst_inport="South", weight=2)) link_count += 1 @@ -144,6 +150,8 @@ int_links.append(IntLink(link_id=link_count, src_node=routers[south_out], dst_node=routers[north_in], + src_outport="South", + dst_inport="North", weight=2)) link_count += 1 diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/BasicLink.py --- a/src/mem/ruby/network/BasicLink.py Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/BasicLink.py Wed Aug 24 11:22:48 2016 -0400 @@ -46,11 +46,17 @@ cxx_header = "mem/ruby/network/BasicLink.hh" ext_node = Param.RubyController("External node") int_node = Param.BasicRouter("ID of internal node") - bandwidth_factor = 16 + bandwidth_factor = 16 # only used by simple network class BasicIntLink(BasicLink): type = 'BasicIntLink' cxx_header = "mem/ruby/network/BasicLink.hh" src_node = Param.BasicRouter("Router on src end") dst_node = Param.BasicRouter("Router on dst end") + + # only used by Garnet. + src_outport = Param.String("", "Outport direction at src router") + dst_inport = Param.String("", "Inport direction at dst router") + + # only used by simple network bandwidth_factor = 16 diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/BasicRouter.hh --- a/src/mem/ruby/network/BasicRouter.hh Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/BasicRouter.hh Wed Aug 24 11:22:48 2016 -0400 @@ -51,6 +51,7 @@ // ID in relation to other routers in the system // uint32_t m_id; + uint32_t m_latency; }; inline std::ostream& diff -r 31a963b3a048 -r c255d8f54fea src/mem/ruby/network/BasicRouter.cc --- a/src/mem/ruby/network/BasicRouter.cc Wed Aug 24 11:22:26 2016 -0400 +++ b/src/mem/ruby/network/BasicRouter.cc Wed Aug 24 11:22:48 2016 -0400 @@ -32,6 +32,7 @@ : ClockedObject(p) { m_id = p->router_id; + m_latency = p->latency; } void