Make ports that aren't connected to anything fail more gracefully.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 28 Nov 2007 22:39:19 +0000 (14:39 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 28 Nov 2007 22:39:19 +0000 (14:39 -0800)
--HG--
extra : convert_revision : 3803b28fb2fdfd729f01f1a44df2ae02ef83a2fc

src/mem/bridge.cc
src/mem/port.cc
src/mem/port.hh

index 3fa9e5bb9682f3cac5d9550d6da33ed29fcfaa44..aa059ad13d0cd9ef592e4a19a0a7db37c202cc67 100644 (file)
@@ -78,8 +78,9 @@ Bridge::getPort(const std::string &if_name, int idx)
     else
         return NULL;
 
-    if (port->getPeer() != NULL)
-        panic("bridge side %s already connected to.", if_name);
+    if (port->getPeer() != NULL && !port->getPeer()->isDefaultPort())
+        panic("bridge side %s already connected to %s.",
+                if_name, port->getPeer()->name());
     return port;
 }
 
index ba4f2366816d1ea14adf358aa3309f022429c328..2e56d2486e66d9e698c0aa1de489dfaeeb84fe44 100644 (file)
 #include "mem/mem_object.hh"
 #include "mem/port.hh"
 
+class defaultPeerPortClass: public Port
+{
+  protected:
+    void blowUp()
+    {
+        fatal("Unconnected port!");
+    }
+
+  public:
+    defaultPeerPortClass() : Port("default_port")
+    {}
+
+    bool recvTiming(PacketPtr)
+    {
+        blowUp();
+        return false;
+    }
+
+    Tick recvAtomic(PacketPtr)
+    {
+        blowUp();
+        return 0;
+    }
+
+    void recvFunctional(PacketPtr)
+    {
+        blowUp();
+    }
+
+    void recvStatusChange(Status)
+    {
+        blowUp();
+    }
+
+    int deviceBlockSize()
+    {
+        blowUp();
+        return 0;
+    }
+
+    void getDeviceAddressRanges(AddrRangeList &, bool &)
+    {
+        blowUp();
+    }
+
+    bool isDefaultPort() { return true; }
+
+} defaultPeerPort;
+
+Port::Port() : peer(&defaultPeerPort), owner(NULL)
+{
+}
+
+Port::Port(const std::string &_name, MemObject *_owner) :
+    portName(_name), peer(&defaultPeerPort), owner(_owner)
+{
+}
+
 void
 Port::setPeer(Port *port)
 {
index b23de60509ddd6c268d39d72e74612a1e7d186cf..cadf67260cae4eb55b11206d94ea0e9f32a123a4 100644 (file)
@@ -88,9 +88,7 @@ class Port
 
   public:
 
-    Port()
-        : peer(NULL), owner(NULL)
-    { }
+    Port();
 
     /**
      * Constructor.
@@ -100,9 +98,7 @@ class Port
      * @param _owner Pointer to the MemObject that owns this port.
      * Will not necessarily be set.
      */
-    Port(const std::string &_name, MemObject *_owner = NULL)
-        : portName(_name), peer(NULL), owner(_owner)
-    { }
+    Port(const std::string &_name, MemObject *_owner = NULL);
 
     /** Return port name (for DPRINTF). */
     const std::string &name() const { return portName; }
@@ -135,6 +131,7 @@ class Port
      * demise. */
     void removeConn();
 
+    virtual bool isDefaultPort() { return false; }
 
   protected: