1/* 2 * Copyright (c) 2006 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 44 unchanged lines hidden (view full) --- 53 * be scheduled separately via a later call to sendTiming(). This 54 * feature is handled by scheduling an internal event that calls 55 * sendTiming() after a delay, and optionally rescheduling the 56 * response if it is nacked. 57 */ 58class SimpleTimingPort : public Port 59{ 60 protected: |
61 /** A deferred packet, buffered to transmit later. */ 62 class DeferredPacket { 63 public: 64 Tick tick; ///< The tick when the packet is ready to transmit 65 PacketPtr pkt; ///< Pointer to the packet to transmit 66 DeferredPacket(Tick t, PacketPtr p) 67 : tick(t), pkt(p) 68 {} 69 }; 70 71 typedef std::list<DeferredPacket> DeferredPacketList; 72 typedef std::list<DeferredPacket>::iterator DeferredPacketIterator; 73 |
74 /** A list of outgoing timing response packets that haven't been 75 * serviced yet. */ |
76 DeferredPacketList transmitList; |
77 |
78 /** This function attempts to send deferred packets. Scheduled to 79 * be called in the future via SendEvent. */ 80 void processSendEvent(); 81 |
82 /** 83 * This class is used to implemented sendTiming() with a delay. When 84 * a delay is requested a the event is scheduled if it isn't already. 85 * When the event time expires it attempts to send the packet. 86 * If it cannot, the packet sent when recvRetry() is called. 87 **/ |
88 typedef EventWrapper<SimpleTimingPort, &SimpleTimingPort::processSendEvent> 89 SendEvent; |
90 |
91 Event *sendEvent; |
92 |
93 /** If we need to drain, keep the drain event around until we're done 94 * here.*/ 95 Event *drainEvent; 96 |
97 /** Check the list of buffered packets against the supplied 98 * functional request. */ 99 void checkFunctional(PacketPtr funcPkt); 100 |
101 /** Schedule a sendTiming() event to be called in the future. 102 * @param pkt packet to send 103 * @param time increment from now (in ticks) to send packet 104 */ 105 void sendTiming(PacketPtr pkt, Tick time); 106 107 /** This function is notification that the device should attempt to send a 108 * packet again. */ --- 10 unchanged lines hidden (view full) --- 119 * changes... can always override this in cases where that's not 120 * true. */ 121 virtual void recvStatusChange(Status status) { } 122 123 124 public: 125 126 SimpleTimingPort(std::string pname, MemObject *_owner = NULL) |
127 : Port(pname, _owner), 128 sendEvent(new SendEvent(this)), 129 drainEvent(NULL) |
130 {} 131 |
132 ~SimpleTimingPort() { delete sendEvent; } 133 |
134 /** Hook for draining timing accesses from the system. The 135 * associated SimObject's drain() functions should be implemented 136 * something like this when this class is used: 137 \code 138 PioDevice::drain(Event *de) 139 { 140 unsigned int count; 141 count = SimpleTimingPort->drain(de); --- 12 unchanged lines hidden --- |