mem-garnet: Integration of HeteroGarnet
[gem5.git] / src / mem / ruby / network / garnet2.0 / OutputUnit.cc
index 2270feaf345e9c9f95f6ccf8d50c593a0b4997ed..9a048c9784ae1a6f8452529f9b72cff9eb0f7032 100644 (file)
@@ -51,9 +51,11 @@ OutputUnit::OutputUnit(int id, PortDirection direction, Router *router)
 void
 OutputUnit::decrement_credit(int out_vc)
 {
-    DPRINTF(RubyNetwork, "Router %d OutputUnit %d decrementing credit for "
-            "outvc %d at time: %lld\n",
-            m_router->get_id(), m_id, out_vc, m_router->curCycle());
+    DPRINTF(RubyNetwork, "Router %d OutputUnit %s decrementing credit:%d for "
+            "outvc %d at time: %lld for %s\n", m_router->get_id(),
+            m_router->getPortDirectionName(get_direction()),
+            outVcState[out_vc].get_credit_count(),
+            out_vc, m_router->curCycle(), m_credit_link->name());
 
     outVcState[out_vc].decrement_credit();
 }
@@ -61,9 +63,11 @@ OutputUnit::decrement_credit(int out_vc)
 void
 OutputUnit::increment_credit(int out_vc)
 {
-    DPRINTF(RubyNetwork, "Router %d OutputUnit %d incrementing credit for "
-            "outvc %d at time: %lld\n",
-            m_router->get_id(), m_id, out_vc, m_router->curCycle());
+    DPRINTF(RubyNetwork, "Router %d OutputUnit %s incrementing credit:%d for "
+            "outvc %d at time: %lld from:%s\n", m_router->get_id(),
+            m_router->getPortDirectionName(get_direction()),
+            outVcState[out_vc].get_credit_count(),
+            out_vc, m_router->curCycle(), m_credit_link->name());
 
     outVcState[out_vc].increment_credit();
 }
@@ -74,7 +78,7 @@ OutputUnit::increment_credit(int out_vc)
 bool
 OutputUnit::has_credit(int out_vc)
 {
-    assert(outVcState[out_vc].isInState(ACTIVE_, m_router->curCycle()));
+    assert(outVcState[out_vc].isInState(ACTIVE_, curTick()));
     return outVcState[out_vc].has_credit();
 }
 
@@ -85,7 +89,7 @@ OutputUnit::has_free_vc(int vnet)
 {
     int vc_base = vnet*m_vc_per_vnet;
     for (int vc = vc_base; vc < vc_base + m_vc_per_vnet; vc++) {
-        if (is_vc_idle(vc, m_router->curCycle()))
+        if (is_vc_idle(vc, curTick()))
             return true;
     }
 
@@ -98,8 +102,8 @@ OutputUnit::select_free_vc(int vnet)
 {
     int vc_base = vnet*m_vc_per_vnet;
     for (int vc = vc_base; vc < vc_base + m_vc_per_vnet; vc++) {
-        if (is_vc_idle(vc, m_router->curCycle())) {
-            outVcState[vc].setState(ACTIVE_, m_router->curCycle());
+        if (is_vc_idle(vc, curTick())) {
+            outVcState[vc].setState(ACTIVE_, curTick());
             return vc;
         }
     }
@@ -118,14 +122,18 @@ OutputUnit::select_free_vc(int vnet)
 void
 OutputUnit::wakeup()
 {
-    if (m_credit_link->isReady(m_router->curCycle())) {
+    if (m_credit_link->isReady(curTick())) {
         Credit *t_credit = (Credit*) m_credit_link->consumeLink();
         increment_credit(t_credit->get_vc());
 
         if (t_credit->is_free_signal())
-            set_vc_state(IDLE_, t_credit->get_vc(), m_router->curCycle());
+            set_vc_state(IDLE_, t_credit->get_vc(), curTick());
 
         delete t_credit;
+
+        if (m_credit_link->isReady(curTick())) {
+            scheduleEvent(Cycles(1));
+        }
     }
 }