ruby: moved topology to the top network directory
[gem5.git] / src / mem / ruby / network / garnet / flexible-pipeline / GarnetNetwork.cc
index 631c5ab21d54115dd1a541de2be6fb2c16af430f..b3cb8737dedde55892bfd84cd6098d6d01dfbad3 100644 (file)
  * Authors: Niket Agarwal
  */
 
+#include <cassert>
+
 #include "base/stl_helpers.hh"
-#include "mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh"
 #include "mem/protocol/MachineType.hh"
-#include "mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh"
 #include "mem/ruby/buffers/MessageBuffer.hh"
-#include "mem/ruby/network/garnet/flexible-pipeline/Router.hh"
-#include "mem/ruby/network/simple/Topology.hh"
-#include "mem/ruby/network/simple/SimpleNetwork.hh"
+#include "mem/ruby/common/NetDest.hh"
 #include "mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh"
+#include "mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh"
+#include "mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.hh"
 #include "mem/ruby/network/garnet/flexible-pipeline/NetworkLink.hh"
-#include "mem/ruby/common/NetDest.hh"
+#include "mem/ruby/network/garnet/flexible-pipeline/Router.hh"
+#include "mem/ruby/network/simple/SimpleNetwork.hh"
+#include "mem/ruby/network/Topology.hh"
 
 using namespace std;
 using m5::stl_helpers::deletePointers;
@@ -47,6 +49,10 @@ GarnetNetwork::GarnetNetwork(const Params *p)
     : BaseGarnetNetwork(p)
 {
     m_ruby_start = 0;
+    m_flits_received = 0;
+    m_flits_injected = 0;
+    m_network_latency = 0.0;
+    m_queueing_latency = 0.0;
 
     // Allocate to and from queues
 
@@ -188,9 +194,8 @@ void
 GarnetNetwork::checkNetworkAllocation(NodeID id, bool ordered,
     int network_num)
 {
-    printf ("id = %i, m_nodes = %i \n", id, m_nodes);
-    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;
@@ -255,12 +260,27 @@ GarnetNetwork::printStats(ostream& out) const
     out << "-------------" << endl;
 
     for (int i = 0; i < m_vcs_per_class*m_virtual_networks; i++) {
+        if (!m_in_use[i/m_vcs_per_class])
+            continue;
+
         average_vc_load[i] = (double(average_vc_load[i]) /
             (double(g_eventQueue_ptr->getTime()) - m_ruby_start));
         out << "Average VC Load [" << i << "] = " << average_vc_load[i] <<
                " flits/cycle" << endl;
     }
     out << "-------------" << endl;
+
+    out << "Total flits injected = " << m_flits_injected << endl;
+    out << "Total flits received = " << m_flits_received << endl;
+    out << "Average network latency = "
+        << ((double) m_network_latency/ (double) m_flits_received)<< endl;
+    out << "Average queueing (at source NI) latency = "
+        << ((double) m_queueing_latency/ (double) m_flits_received)<< endl;
+    out << "Average latency = "
+        << ((double)  (m_queueing_latency + m_network_latency) /
+            (double) m_flits_received)<< endl;
+    out << "-------------" << endl;
+
     m_topology_ptr->printStats(out);
 }