summaryrefslogtreecommitdiff
path: root/src/mem/ruby/network/simple/SimpleNetwork.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/ruby/network/simple/SimpleNetwork.cc')
-rw-r--r--src/mem/ruby/network/simple/SimpleNetwork.cc349
1 files changed, 181 insertions, 168 deletions
diff --git a/src/mem/ruby/network/simple/SimpleNetwork.cc b/src/mem/ruby/network/simple/SimpleNetwork.cc
index 2de8d07e5..26924c2e7 100644
--- a/src/mem/ruby/network/simple/SimpleNetwork.cc
+++ b/src/mem/ruby/network/simple/SimpleNetwork.cc
@@ -1,4 +1,3 @@
-
/*
* Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
* All rights reserved.
@@ -27,248 +26,262 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/*
- * SimpleNetwork.cc
- *
- * Description: See SimpleNetwork.hh
- *
- * $Id$
- *
- */
-
+#include "mem/gems_common/Map.hh"
+#include "mem/protocol/MachineType.hh"
+#include "mem/protocol/Protocol.hh"
+#include "mem/protocol/TopologyType.hh"
+#include "mem/ruby/buffers/MessageBuffer.hh"
+#include "mem/ruby/common/NetDest.hh"
#include "mem/ruby/network/simple/SimpleNetwork.hh"
-#include "mem/ruby/profiler/Profiler.hh"
-#include "mem/ruby/system/System.hh"
#include "mem/ruby/network/simple/Switch.hh"
-#include "mem/ruby/common/NetDest.hh"
#include "mem/ruby/network/simple/Topology.hh"
-#include "mem/protocol/TopologyType.hh"
-#include "mem/protocol/MachineType.hh"
-#include "mem/ruby/buffers/MessageBuffer.hh"
-#include "mem/protocol/Protocol.hh"
-#include "mem/gems_common/Map.hh"
+#include "mem/ruby/profiler/Profiler.hh"
+#include "mem/ruby/system/System.hh"
+#if 0
// ***BIG HACK*** - This is actually code that _should_ be in Network.cc
// Note: Moved to Princeton Network
// calls new to abstract away from the network
-/*
-Network* Network::createNetwork(int nodes)
+Network*
+Network::createNetwork(int nodes)
{
- return new SimpleNetwork(nodes);
+ return new SimpleNetwork(nodes);
}
-*/
+#endif
SimpleNetwork::SimpleNetwork(const Params *p)
: Network(p)
{
- //
- // Note: the parent Network Object constructor is called before the
- // SimpleNetwork child constructor. Therefore, the member variables
- // used below should already be initialized.
- //
-
- m_endpoint_switches.setSize(m_nodes);
-
- m_in_use.setSize(m_virtual_networks);
- m_ordered.setSize(m_virtual_networks);
- for (int i = 0; i < m_virtual_networks; i++) {
- m_in_use[i] = false;
- m_ordered[i] = false;
- }
-
- // Allocate to and from queues
- m_toNetQueues.setSize(m_nodes);
- m_fromNetQueues.setSize(m_nodes);
- for (int node = 0; node < m_nodes; node++) {
- m_toNetQueues[node].setSize(m_virtual_networks);
- m_fromNetQueues[node].setSize(m_virtual_networks);
- for (int j = 0; j < m_virtual_networks; j++) {
- m_toNetQueues[node][j] = new MessageBuffer(
- "toNet node "+int_to_string(node)+" j "+int_to_string(j));
- m_fromNetQueues[node][j] = new MessageBuffer(
- "fromNet node "+int_to_string(node)+" j "+int_to_string(j));
+ // Note: the parent Network Object constructor is called before the
+ // SimpleNetwork child constructor. Therefore, the member variables
+ // used below should already be initialized.
+
+ m_endpoint_switches.setSize(m_nodes);
+
+ m_in_use.setSize(m_virtual_networks);
+ m_ordered.setSize(m_virtual_networks);
+ for (int i = 0; i < m_virtual_networks; i++) {
+ m_in_use[i] = false;
+ m_ordered[i] = false;
+ }
+
+ // Allocate to and from queues
+ m_toNetQueues.setSize(m_nodes);
+ m_fromNetQueues.setSize(m_nodes);
+ for (int node = 0; node < m_nodes; node++) {
+ m_toNetQueues[node].setSize(m_virtual_networks);
+ m_fromNetQueues[node].setSize(m_virtual_networks);
+ for (int j = 0; j < m_virtual_networks; j++) {
+ m_toNetQueues[node][j] = new MessageBuffer(
+ "toNet node "+int_to_string(node)+" j "+int_to_string(j));
+ m_fromNetQueues[node][j] = new MessageBuffer(
+ "fromNet node "+int_to_string(node)+" j "+int_to_string(j));
+ }
}
- }
}
-void SimpleNetwork::init()
+void
+SimpleNetwork::init()
{
+ Network::init();
+
+ // The topology pointer should have already been initialized in
+ // the parent class network constructor.
+ assert(m_topology_ptr != NULL);
+ int number_of_switches = m_topology_ptr->numSwitches();
+ for (int i = 0; i < number_of_switches; i++) {
+ m_switch_ptr_vector.insertAtBottom(new Switch(i, this));
+ }
- Network::init();
-
- //
- // The topology pointer should have already been initialized in the parent
- // class network constructor.
- //
- assert(m_topology_ptr != NULL);
- int number_of_switches = m_topology_ptr->numSwitches();
- for (int i=0; i<number_of_switches; i++) {
- m_switch_ptr_vector.insertAtBottom(new Switch(i, this));
- }
- m_topology_ptr->createLinks(this, false); // false because this isn't a reconfiguration
+ // false because this isn't a reconfiguration
+ m_topology_ptr->createLinks(this, false);
}
-void SimpleNetwork::reset()
+void
+SimpleNetwork::reset()
{
- for (int node = 0; node < m_nodes; node++) {
- for (int j = 0; j < m_virtual_networks; j++) {
- m_toNetQueues[node][j]->clear();
- m_fromNetQueues[node][j]->clear();
+ for (int node = 0; node < m_nodes; node++) {
+ for (int j = 0; j < m_virtual_networks; j++) {
+ m_toNetQueues[node][j]->clear();
+ m_fromNetQueues[node][j]->clear();
+ }
}
- }
- for(int i=0; i<m_switch_ptr_vector.size(); i++){
- m_switch_ptr_vector[i]->clearBuffers();
- }
+ for(int i = 0; i < m_switch_ptr_vector.size(); i++){
+ m_switch_ptr_vector[i]->clearBuffers();
+ }
}
SimpleNetwork::~SimpleNetwork()
{
- for (int i = 0; i < m_nodes; i++) {
- m_toNetQueues[i].deletePointers();
- m_fromNetQueues[i].deletePointers();
- }
- m_switch_ptr_vector.deletePointers();
- m_buffers_to_free.deletePointers();
- // delete m_topology_ptr;
+ for (int i = 0; i < m_nodes; i++) {
+ m_toNetQueues[i].deletePointers();
+ m_fromNetQueues[i].deletePointers();
+ }
+ m_switch_ptr_vector.deletePointers();
+ m_buffers_to_free.deletePointers();
+ // delete m_topology_ptr;
}
// From a switch to an endpoint node
-void SimpleNetwork::makeOutLink(SwitchID src, NodeID dest, const NetDest& routing_table_entry, int link_latency, int link_weight, int bw_multiplier, bool isReconfiguration)
+void
+SimpleNetwork::makeOutLink(SwitchID src, NodeID dest,
+ const NetDest& routing_table_entry, int link_latency, int link_weight,
+ int bw_multiplier, bool isReconfiguration)
{
- assert(dest < m_nodes);
- assert(src < m_switch_ptr_vector.size());
- assert(m_switch_ptr_vector[src] != NULL);
- if(!isReconfiguration){
- m_switch_ptr_vector[src]->addOutPort(m_fromNetQueues[dest], routing_table_entry, link_latency, bw_multiplier);
+ assert(dest < m_nodes);
+ assert(src < m_switch_ptr_vector.size());
+ assert(m_switch_ptr_vector[src] != NULL);
+
+ if (isReconfiguration) {
+ m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry);
+ return;
+ }
+
+ m_switch_ptr_vector[src]->addOutPort(m_fromNetQueues[dest],
+ routing_table_entry, link_latency, bw_multiplier);
m_endpoint_switches[dest] = m_switch_ptr_vector[src];
- } else {
- m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry);
- }
}
// From an endpoint node to a switch
-void SimpleNetwork::makeInLink(NodeID src, SwitchID dest, const NetDest& routing_table_entry, int link_latency, int bw_multiplier, bool isReconfiguration)
+void
+SimpleNetwork::makeInLink(NodeID src, SwitchID dest,
+ const NetDest& routing_table_entry, int link_latency, int bw_multiplier,
+ bool isReconfiguration)
{
- assert(src < m_nodes);
- if(!isReconfiguration){
+ assert(src < m_nodes);
+ if (isReconfiguration) {
+ // do nothing
+ return;
+ }
+
m_switch_ptr_vector[dest]->addInPort(m_toNetQueues[src]);
- } else {
- // do nothing
- }
}
// From a switch to a switch
-void SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, const NetDest& routing_table_entry, int link_latency, int link_weight, int bw_multiplier, bool isReconfiguration)
+void
+SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest,
+ const NetDest& routing_table_entry, int link_latency, int link_weight,
+ int bw_multiplier, bool isReconfiguration)
{
- if(!isReconfiguration){
+ if (isReconfiguration) {
+ m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry);
+ return;
+ }
+
// Create a set of new MessageBuffers
Vector<MessageBuffer*> queues;
for (int i = 0; i < m_virtual_networks; i++) {
- // allocate a buffer
- MessageBuffer* buffer_ptr = new MessageBuffer;
- buffer_ptr->setOrdering(true);
- if (m_buffer_size > 0) {
- buffer_ptr->setSize(m_buffer_size);
- }
- queues.insertAtBottom(buffer_ptr);
- // remember to deallocate it
- m_buffers_to_free.insertAtBottom(buffer_ptr);
+ // allocate a buffer
+ MessageBuffer* buffer_ptr = new MessageBuffer;
+ buffer_ptr->setOrdering(true);
+ if (m_buffer_size > 0) {
+ buffer_ptr->setSize(m_buffer_size);
+ }
+ queues.insertAtBottom(buffer_ptr);
+ // remember to deallocate it
+ m_buffers_to_free.insertAtBottom(buffer_ptr);
}
-
// Connect it to the two switches
m_switch_ptr_vector[dest]->addInPort(queues);
- m_switch_ptr_vector[src]->addOutPort(queues, routing_table_entry, link_latency, bw_multiplier);
- } else {
- m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry);
- }
+ m_switch_ptr_vector[src]->addOutPort(queues, routing_table_entry,
+ link_latency, bw_multiplier);
}
-void SimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num)
+void
+SimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num)
{
- ASSERT(id < m_nodes);
- ASSERT(network_num < m_virtual_networks);
+ ASSERT(id < m_nodes);
+ ASSERT(network_num < m_virtual_networks);
- if (ordered) {
- m_ordered[network_num] = true;
- }
- m_in_use[network_num] = true;
+ if (ordered) {
+ m_ordered[network_num] = true;
+ }
+ m_in_use[network_num] = true;
}
-MessageBuffer* SimpleNetwork::getToNetQueue(NodeID id, bool ordered, int network_num)
+MessageBuffer*
+SimpleNetwork::getToNetQueue(NodeID id, bool ordered, int network_num)
{
- checkNetworkAllocation(id, ordered, network_num);
- return m_toNetQueues[id][network_num];
+ checkNetworkAllocation(id, ordered, network_num);
+ return m_toNetQueues[id][network_num];
}
-MessageBuffer* SimpleNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num)
+MessageBuffer*
+SimpleNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num)
{
- checkNetworkAllocation(id, ordered, network_num);
- return m_fromNetQueues[id][network_num];
+ checkNetworkAllocation(id, ordered, network_num);
+ return m_fromNetQueues[id][network_num];
}
-const Vector<Throttle*>* SimpleNetwork::getThrottles(NodeID id) const
+const Vector<Throttle*>*
+SimpleNetwork::getThrottles(NodeID id) const
{
- assert(id >= 0);
- assert(id < m_nodes);
- assert(m_endpoint_switches[id] != NULL);
- return m_endpoint_switches[id]->getThrottles();
+ assert(id >= 0);
+ assert(id < m_nodes);
+ assert(m_endpoint_switches[id] != NULL);
+ return m_endpoint_switches[id]->getThrottles();
}
-void SimpleNetwork::printStats(ostream& out) const
+void
+SimpleNetwork::printStats(ostream& out) const
{
- out << endl;
- out << "Network Stats" << endl;
- out << "-------------" << endl;
- out << endl;
- for(int i=0; i<m_switch_ptr_vector.size(); i++) {
- m_switch_ptr_vector[i]->printStats(out);
- }
- m_topology_ptr->printStats(out);
+ out << endl;
+ out << "Network Stats" << endl;
+ out << "-------------" << endl;
+ out << endl;
+ for (int i = 0; i < m_switch_ptr_vector.size(); i++) {
+ m_switch_ptr_vector[i]->printStats(out);
+ }
+ m_topology_ptr->printStats(out);
}
-void SimpleNetwork::clearStats()
+void
+SimpleNetwork::clearStats()
{
- for(int i=0; i<m_switch_ptr_vector.size(); i++) {
- m_switch_ptr_vector[i]->clearStats();
- }
- m_topology_ptr->clearStats();
+ for (int i = 0; i < m_switch_ptr_vector.size(); i++) {
+ m_switch_ptr_vector[i]->clearStats();
+ }
+ m_topology_ptr->clearStats();
}
-void SimpleNetwork::printConfig(ostream& out) const
+void
+SimpleNetwork::printConfig(ostream& out) const
{
- out << endl;
- out << "Network Configuration" << endl;
- out << "---------------------" << endl;
- out << "network: SIMPLE_NETWORK" << endl;
- out << "topology: " << m_topology_ptr->getName() << endl;
- out << endl;
-
- for (int i = 0; i < m_virtual_networks; i++) {
- out << "virtual_net_" << i << ": ";
- if (m_in_use[i]) {
- out << "active, ";
- if (m_ordered[i]) {
- out << "ordered" << endl;
- } else {
- out << "unordered" << endl;
- }
- } else {
- out << "inactive" << endl;
+ out << endl;
+ out << "Network Configuration" << endl;
+ out << "---------------------" << endl;
+ out << "network: SIMPLE_NETWORK" << endl;
+ out << "topology: " << m_topology_ptr->getName() << endl;
+ out << endl;
+
+ for (int i = 0; i < m_virtual_networks; i++) {
+ out << "virtual_net_" << i << ": ";
+ if (m_in_use[i]) {
+ out << "active, ";
+ if (m_ordered[i]) {
+ out << "ordered" << endl;
+ } else {
+ out << "unordered" << endl;
+ }
+ } else {
+ out << "inactive" << endl;
+ }
+ }
+ out << endl;
+
+ for(int i = 0; i < m_switch_ptr_vector.size(); i++) {
+ m_switch_ptr_vector[i]->printConfig(out);
}
- }
- out << endl;
- for(int i=0; i<m_switch_ptr_vector.size(); i++) {
- m_switch_ptr_vector[i]->printConfig(out);
- }
- m_topology_ptr->printConfig(out);
+ m_topology_ptr->printConfig(out);
}
-void SimpleNetwork::print(ostream& out) const
+void
+SimpleNetwork::print(ostream& out) const
{
- out << "[SimpleNetwork]";
+ out << "[SimpleNetwork]";
}