Changed the bus to use a bool to keep track of retries rather than a pointer
authorGabe Black <gblack@eecs.umich.edu>
Tue, 10 Oct 2006 21:24:03 +0000 (17:24 -0400)
committerGabe Black <gblack@eecs.umich.edu>
Tue, 10 Oct 2006 21:24:03 +0000 (17:24 -0400)
src/mem/tport.cc:
    minor formatting tweak

--HG--
extra : convert_revision : 7391d142815c5876fcc0f991bd053e6a1781c101

src/mem/bus.cc
src/mem/bus.hh
src/mem/tport.cc

index 66cd581e7fbdf0f0ccefd48995eecc0b0725d5d8..3efaa93acf3205848e6cf5e2fc12d6c11d3475ad 100644 (file)
@@ -68,13 +68,11 @@ Bus::init()
 }
 
 Bus::BusFreeEvent::BusFreeEvent(Bus *_bus) : Event(&mainEventQueue), bus(_bus)
-{
-    assert(!scheduled());
-}
+{}
 
 void Bus::BusFreeEvent::process()
 {
-    bus->recvRetry(0);
+    bus->recvRetry(-1);
 }
 
 const char * Bus::BusFreeEvent::description()
@@ -96,7 +94,7 @@ Bus::recvTiming(Packet *pkt)
     // If the bus is busy, or other devices are in line ahead of the current
     // one, put this device on the retry list.
     if (tickNextIdle > curTick ||
-            (retryList.size() && pktPort != retryingPort)) {
+            (retryList.size() && (!inRetry || pktPort != retryList.front()))) {
         addToRetryList(pktPort);
         return false;
     }
@@ -109,9 +107,9 @@ Bus::recvTiming(Packet *pkt)
             assert(success);
             if (pkt->flags & SATISFIED) {
                 //Cache-Cache transfer occuring
-                if (retryingPort) {
+                if (inRetry) {
                     retryList.pop_front();
-                    retryingPort = NULL;
+                    inRetry = false;
                 }
                 return true;
             }
@@ -182,9 +180,9 @@ Bus::recvTiming(Packet *pkt)
     if (port->sendTiming(pkt))  {
         // Packet was successfully sent. Return true.
         // Also take care of retries
-        if (retryingPort) {
+        if (inRetry) {
             retryList.pop_front();
-            retryingPort = NULL;
+            inRetry = false;
         }
         return true;
     }
@@ -199,14 +197,14 @@ Bus::recvRetry(int id)
 {
     // If there's anything waiting...
     if (retryList.size()) {
-        retryingPort = retryList.front();
-        retryingPort->sendRetry();
-        // If the retryingPort pointer isn't null, sendTiming wasn't called
-        if (retryingPort) {
-            warn("sendRetry didn't call sendTiming\n");
-            retryList.pop_front();
-            retryingPort = NULL;
-        }
+        //retryingPort = retryList.front();
+        inRetry = true;
+        retryList.front()->sendRetry();
+        // If inRetry is still true, sendTiming wasn't called
+        if (inRetry)
+            panic("Port %s didn't call sendTiming in it's recvRetry\n",\
+                    retryList.front()->getPeer()->name());
+        //assert(!inRetry);
     }
 }
 
index ce3f4bed7f0fed34ed5e422189df48665b6f8918..4affcd6ae40712bc862322f17af8a296665f341d 100644 (file)
@@ -195,7 +195,7 @@ class Bus : public MemObject
 
     BusFreeEvent busIdle;
 
-    Port * retryingPort;
+    bool inRetry;
 
     /** An array of pointers to the peer port interfaces
         connected to this bus.*/
@@ -207,18 +207,18 @@ class Bus : public MemObject
 
     void addToRetryList(Port * port)
     {
-        if (!retryingPort) {
+        if (!inRetry) {
             // The device wasn't retrying a packet, or wasn't at an appropriate
             // time.
             retryList.push_back(port);
         } else {
             // The device was retrying a packet. It didn't work, so we'll leave
             // it at the head of the retry list.
-            retryingPort = NULL;
+            inRetry = false;
 
-            // We shouldn't be receiving a packet from one port when a different
+/*         // We shouldn't be receiving a packet from one port when a different
             // one is retrying.
-            assert(port == retryingPort);
+            assert(port == retryingPort);*/
         }
     }
 
@@ -234,11 +234,13 @@ class Bus : public MemObject
 
     Bus(const std::string &n, int bus_id, int _clock, int _width)
         : MemObject(n), busId(bus_id), clock(_clock), width(_width),
-        tickNextIdle(0), busIdle(this), retryingPort(NULL), defaultPort(NULL)
+        tickNextIdle(0), busIdle(this), inRetry(false), defaultPort(NULL)
     {
         //Both the width and clock period must be positive
-        assert(width);
-        assert(clock);
+        if (width <= 0)
+            fatal("Bus width must be positive\n");
+        if (clock <= 0)
+            fatal("Bus clock period must be positive\n");
     }
 
 };
index 66811b820fae84df0311fc3512b34ddc6cbd06df..528067170566c6c9bca20541fbbbd1aa464bacb9 100644 (file)
@@ -79,8 +79,7 @@ SimpleTimingPort::SendEvent::process()
     assert(port->outTiming >= 0);
     if (port->transmitList.size()) {
         port->transmitList.push_back(packet);
-    }
-    else if (port->sendTiming(packet)) {
+    } else if (port->sendTiming(packet)) {
         // send successful
         if (port->transmitList.size() == 0 && port->drainEvent) {
             port->drainEvent->process();