30a31,33
> #ifndef __MEM_TPORT_HH__
> #define __MEM_TPORT_HH__
>
33,36c36,37
< * Implement a port which adds simple support of a sendTiming() function that
< * takes a delay. In this way the * device can immediatly call
< * sendTiming(pkt, time) after processing a request and the request will be
< * handled by the port even if the port bus the device connects to is blocked.
---
> *
> * Declaration of SimpleTimingPort.
39,70d39
< /** recvTiming and drain should be implemented something like this when this
< * class is used.
<
< bool
< PioPort::recvTiming(Packet *pkt)
< {
< if (pkt->result == Packet::Nacked) {
< resendNacked(pkt);
< } else {
< Tick latency = device->recvAtomic(pkt);
< // turn packet around to go back to requester
< pkt->makeTimingResponse();
< sendTiming(pkt, latency);
< }
< return true;
< }
<
< PioDevice::drain(Event *de)
< {
< unsigned int count;
< count = SimpleTimingPort->drain(de);
< if (count)
< changeState(Draining);
< else
< changeState(Drained);
< return count;
< }
< */
<
< #ifndef __MEM_TPORT_HH__
< #define __MEM_TPORT_HH__
<
75a45,57
> /**
> * A simple port for interfacing objects that basically have only
> * functional memory behavior (e.g. I/O devices) to the memory system.
> * Both timing and functional accesses are implemented in terms of
> * atomic accesses. A derived port class thus only needs to provide
> * recvAtomic() to support all memory access modes.
> *
> * The tricky part is handling recvTiming(), where the response must
> * be scheduled separately via a later call to sendTiming(). This
> * feature is handled by scheduling an internal event that calls
> * sendTiming() after a delay, and optionally rescheduling the
> * response if it is nacked.
> */
81a64
>
115,116c98,99
< void sendTiming(Packet *pkt, Tick time)
< { outTiming++; new SimpleTimingPort::SendEvent(this, pkt, time); }
---
> void sendTimingLater(Packet *pkt, Tick time)
> { outTiming++; new SendEvent(this, pkt, time); }
122c105,117
< void resendNacked(Packet *pkt);
---
> /** Implemented using recvAtomic(). */
> void recvFunctional(Packet *pkt);
>
> /** Implemented using recvAtomic(). */
> bool recvTiming(Packet *pkt);
>
> /**
> * Simple ports generally don't care about any status
> * changes... can always override this in cases where that's not
> * true. */
> virtual void recvStatusChange(Status status) { }
>
>
128a124,139
> /** Hook for draining timing accesses from the system. The
> * associated SimObject's drain() functions should be implemented
> * something like this when this class is used:
> \code
> PioDevice::drain(Event *de)
> {
> unsigned int count;
> count = SimpleTimingPort->drain(de);
> if (count)
> changeState(Draining);
> else
> changeState(Drained);
> return count;
> }
> \endcode
> */