diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2007-11-28 14:39:19 -0800 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2007-11-28 14:39:19 -0800 |
commit | 8a020d40d3e7c9ecd3a41cfa5ab720080f5a9bbf (patch) | |
tree | 729567b736b1bcb116d0dfb5ba7736dc4a26bcbd /src/mem | |
parent | ab598eadbfeefceb6501d4cca13147b660642d9e (diff) | |
download | gem5-8a020d40d3e7c9ecd3a41cfa5ab720080f5a9bbf.tar.xz |
Make ports that aren't connected to anything fail more gracefully.
--HG--
extra : convert_revision : 3803b28fb2fdfd729f01f1a44df2ae02ef83a2fc
Diffstat (limited to 'src/mem')
-rw-r--r-- | src/mem/bridge.cc | 5 | ||||
-rw-r--r-- | src/mem/port.cc | 58 | ||||
-rw-r--r-- | src/mem/port.hh | 9 |
3 files changed, 64 insertions, 8 deletions
diff --git a/src/mem/bridge.cc b/src/mem/bridge.cc index 3fa9e5bb9..aa059ad13 100644 --- a/src/mem/bridge.cc +++ b/src/mem/bridge.cc @@ -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; } diff --git a/src/mem/port.cc b/src/mem/port.cc index ba4f23668..2e56d2486 100644 --- a/src/mem/port.cc +++ b/src/mem/port.cc @@ -39,6 +39,64 @@ #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) { diff --git a/src/mem/port.hh b/src/mem/port.hh index b23de6050..cadf67260 100644 --- a/src/mem/port.hh +++ b/src/mem/port.hh @@ -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: |