diff options
Diffstat (limited to 'src/mem')
-rw-r--r-- | src/mem/port.cc | 50 | ||||
-rw-r--r-- | src/mem/port.hh | 18 |
2 files changed, 29 insertions, 39 deletions
diff --git a/src/mem/port.cc b/src/mem/port.cc index 6f72bbd38..001576fe3 100644 --- a/src/mem/port.cc +++ b/src/mem/port.cc @@ -70,12 +70,6 @@ BaseMasterPort::getSlavePort() const return *_baseSlavePort; } -bool -BaseMasterPort::isConnected() const -{ - return _baseSlavePort != NULL; -} - BaseSlavePort::BaseSlavePort(const std::string &name, PortID _id) : Port(name, _id), _baseMasterPort(NULL) { @@ -95,12 +89,6 @@ BaseSlavePort::getMasterPort() const return *_baseMasterPort; } -bool -BaseSlavePort::isConnected() const -{ - return _baseMasterPort != NULL; -} - /** * Master port */ @@ -114,24 +102,21 @@ MasterPort::~MasterPort() } void -MasterPort::bind(BaseSlavePort& slave_port) +MasterPort::bind(Port &peer) { - // bind on the level of the base ports - _baseSlavePort = &slave_port; - - // also attempt to base the slave to the appropriate type - SlavePort* cast_slave_port = dynamic_cast<SlavePort*>(&slave_port); - - // if this port is compatible, then proceed with the binding - if (cast_slave_port != NULL) { - // master port keeps track of the slave port - _slavePort = cast_slave_port; - // slave port also keeps track of master port - _slavePort->bind(*this); - } else { - fatal("Master port %s cannot bind to %s\n", name(), - slave_port.name()); + auto *slave_port = dynamic_cast<SlavePort *>(&peer); + if (!slave_port) { + fatal("Attempt to bind port %s to non-slave port %s.", + name(), peer.name()); } + // bind on the level of the base ports + _baseSlavePort = slave_port; + + // master port keeps track of the slave port + _slavePort = slave_port; + _connected = true; + // slave port also keeps track of master port + _slavePort->slaveBind(*this); } void @@ -140,8 +125,9 @@ MasterPort::unbind() if (_slavePort == NULL) panic("Attempting to unbind master port %s that is not connected\n", name()); - _slavePort->unbind(); + _slavePort->slaveUnbind(); _slavePort = NULL; + _connected = false; _baseSlavePort = NULL; } @@ -218,17 +204,19 @@ SlavePort::~SlavePort() } void -SlavePort::unbind() +SlavePort::slaveUnbind() { _baseMasterPort = NULL; _masterPort = NULL; + _connected = false; } void -SlavePort::bind(MasterPort& master_port) +SlavePort::slaveBind(MasterPort& master_port) { _baseMasterPort = &master_port; _masterPort = &master_port; + _connected = true; } Tick diff --git a/src/mem/port.hh b/src/mem/port.hh index 77081db4d..2154da007 100644 --- a/src/mem/port.hh +++ b/src/mem/port.hh @@ -77,10 +77,7 @@ class BaseMasterPort : public Port public: - virtual void bind(BaseSlavePort& slave_port) = 0; - virtual void unbind() = 0; BaseSlavePort& getSlavePort() const; - bool isConnected() const; }; @@ -101,7 +98,6 @@ class BaseSlavePort : public Port public: BaseMasterPort& getMasterPort() const; - bool isConnected() const; }; @@ -138,12 +134,12 @@ class MasterPort : public BaseMasterPort * Bind this master port to a slave port. This also does the * mirror action and binds the slave port to the master port. */ - void bind(BaseSlavePort& slave_port); + void bind(Port &peer) override; /** * Unbind this master port and the associated slave port. */ - void unbind(); + void unbind() override; /** * Send an atomic request packet, where the data is moved and the @@ -394,19 +390,25 @@ class SlavePort : public BaseSlavePort */ virtual AddrRangeList getAddrRanges() const = 0; + /** + * We let the master port do the work, so these don't do anything. + */ + void unbind() override {} + void bind(Port &peer) override {} + protected: /** * Called by the master port to unbind. Should never be called * directly. */ - void unbind(); + void slaveUnbind(); /** * Called by the master port to bind. Should never be called * directly. */ - void bind(MasterPort& master_port); + void slaveBind(MasterPort& master_port); /** * Receive an atomic request packet from the master port. |