* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Ali Saidi
- * Andreas Hansson
*/
-#include "mem/mem_object.hh"
#include "mem/tport.hh"
+#include "sim/sim_object.hh"
SimpleTimingPort::SimpleTimingPort(const std::string& _name,
- MemObject* _owner) :
- QueuedPort(_name, _owner, queue), queue(*_owner, *this)
+ SimObject* _owner) :
+ QueuedResponsePort(_name, _owner, queueImpl), queueImpl(*_owner, *this)
{
}
void
SimpleTimingPort::recvFunctional(PacketPtr pkt)
{
- assert(pkt->isRequest());
- if (!queue.checkFunctional(pkt)) {
+ if (!respQueue.trySatisfyFunctional(pkt)) {
// do an atomic access and throw away the returned latency
recvAtomic(pkt);
}
}
bool
-SimpleTimingPort::recvTiming(PacketPtr pkt)
+SimpleTimingPort::recvTimingReq(PacketPtr pkt)
{
- if (pkt->memInhibitAsserted()) {
- // snooper will supply based on copy of packet
- // still target's responsibility to delete packet
- delete pkt;
- return true;
- }
+ // the SimpleTimingPort should not be used anywhere where there is
+ // a need to deal with snoop responses and their flow control
+ // requirements
+ if (pkt->cacheResponding())
+ panic("SimpleTimingPort should never see packets with the "
+ "cacheResponding flag set\n");
bool needsResponse = pkt->needsResponse();
Tick latency = recvAtomic(pkt);
- // turn packet around to go back to requester if response expected
+ // turn packet around to go back to requestor if response expected
if (needsResponse) {
// recvAtomic() should already have turned packet into
// atomic response
assert(pkt->isResponse());
- queue.schedSendTiming(pkt, curTick() + latency);
+ schedTimingResp(pkt, curTick() + latency);
} else {
- delete pkt;
+ // queue the packet for deletion
+ pendingDelete.reset(pkt);
}
return true;