gem5  v19.0.0.0
packet_queue.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012,2015,2018 ARM Limited
3  * All rights reserved.
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 2006 The Regents of The University of Michigan
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  *
40  * Authors: Ali Saidi
41  * Andreas Hansson
42  */
43 
44 #ifndef __MEM_PACKET_QUEUE_HH__
45 #define __MEM_PACKET_QUEUE_HH__
46 
55 #include <list>
56 
57 #include "mem/port.hh"
58 #include "sim/drain.hh"
59 #include "sim/eventq_impl.hh"
60 
65 class PacketQueue : public Drainable
66 {
67  private:
70  public:
74  : tick(t), pkt(p)
75  {}
76  };
77 
79 
81  DeferredPacketList transmitList;
82 
85 
87  void processSendEvent();
88 
91 
92  /*
93  * Optionally disable the sanity check
94  * on the size of the transmitList. The
95  * sanity check will be enabled by default.
96  */
98 
105 
106  protected:
107 
109  const std::string label;
110 
113 
115  bool deferredPacketReady() const
116  { return !transmitList.empty() && transmitList.front().tick <= curTick(); }
117 
126  virtual void sendDeferredPacket();
127 
132  virtual bool sendTiming(PacketPtr pkt) = 0;
133 
144  PacketQueue(EventManager& _em, const std::string& _label,
145  const std::string& _sendEventName,
146  bool force_order = false,
147  bool disable_sanity_check = false);
148 
152  virtual ~PacketQueue();
153 
154  public:
155 
161  virtual const std::string name() const = 0;
162 
166  size_t size() const { return transmitList.size(); }
167 
172  { return transmitList.empty() ? MaxTick : transmitList.front().tick; }
173 
182  bool checkConflict(const PacketPtr pkt, const int blk_size) const;
183 
187 
197  void schedSendEvent(Tick when);
198 
205  void schedSendTiming(PacketPtr pkt, Tick when);
206 
212  void retry();
213 
220  void disableSanityCheck() { _disableSanityCheck = true; }
221 
222  DrainState drain() override;
223 };
224 
226 {
227 
228  protected:
229 
231 
232  // Static definition so it can be called when constructing the parent
233  // without us being completely initialized.
234  static const std::string name(const MasterPort& masterPort,
235  const std::string& label)
236  { return masterPort.name() + "-" + label; }
237 
238  public:
239 
249  ReqPacketQueue(EventManager& _em, MasterPort& _masterPort,
250  const std::string _label = "ReqPacketQueue");
251 
252  virtual ~ReqPacketQueue() { }
253 
254  const std::string name() const
255  { return name(masterPort, label); }
256 
257  bool sendTiming(PacketPtr pkt);
258 
259 };
260 
262 {
263 
264  protected:
265 
267 
268  // Static definition so it can be called when constructing the parent
269  // without us being completely initialized.
270  static const std::string name(const MasterPort& masterPort,
271  const std::string& label)
272  { return masterPort.name() + "-" + label; }
273 
274  public:
275 
286  SnoopRespPacketQueue(EventManager& _em, MasterPort& _masterPort,
287  bool force_order = false,
288  const std::string _label = "SnoopRespPacketQueue");
289 
290  virtual ~SnoopRespPacketQueue() { }
291 
292  const std::string name() const
293  { return name(masterPort, label); }
294 
295  bool sendTiming(PacketPtr pkt);
296 
297 };
298 
300 {
301 
302  protected:
303 
305 
306  // Static definition so it can be called when constructing the parent
307  // without us being completely initialized.
308  static const std::string name(const SlavePort& slavePort,
309  const std::string& label)
310  { return slavePort.name() + "-" + label; }
311 
312  public:
313 
324  RespPacketQueue(EventManager& _em, SlavePort& _slavePort,
325  bool force_order = false,
326  const std::string _label = "RespPacketQueue");
327 
328  virtual ~RespPacketQueue() { }
329 
330  const std::string name() const
331  { return name(slavePort, label); }
332 
333  bool sendTiming(PacketPtr pkt);
334 
335 };
336 
337 #endif // __MEM_PACKET_QUEUE_HH__
static const std::string name(const SlavePort &slavePort, const std::string &label)
A MasterPort is a specialisation of a BaseMasterPort, which implements the default protocol for the t...
Definition: port.hh:75
void disableSanityCheck()
This allows a user to explicitly disable the sanity check on the size of the transmitList, which is enabled by default.
DrainState drain() override
Notify an object that it needs to drain its state.
void retry()
Retry sending a packet from the queue.
Definition: packet_queue.cc:66
PacketPtr pkt
Pointer to the packet to transmit.
Definition: packet_queue.hh:72
bool forceOrder
if true, inserted packets have to be unconditionally scheduled after the last packet in the queue tha...
DrainState
Object drain/handover states.
Definition: drain.hh:71
bool _disableSanityCheck
Definition: packet_queue.hh:97
void schedSendTiming(PacketPtr pkt, Tick when)
Add a packet to the transmit list, and schedule a send event.
bool waitingOnRetry
Remember whether we&#39;re awaiting a retry.
static const std::string name(const MasterPort &masterPort, const std::string &label)
size_t size() const
Get the size of the queue.
A deferred packet, buffered to transmit later.
Definition: packet_queue.hh:69
A SlavePort is a specialisation of a port.
Definition: port.hh:258
EventFunctionWrapper sendEvent
Event used to call processSendEvent.
Definition: packet_queue.hh:90
void schedSendEvent(Tick when)
Schedule a send event if we are not already waiting for a retry.
Tick tick
The tick when the packet is ready to transmit.
Definition: packet_queue.hh:71
virtual ~RespPacketQueue()
MasterPort & masterPort
Interface for objects that might require draining before checkpointing.
Definition: drain.hh:223
const Tick MaxTick
Definition: types.hh:65
Tick curTick()
The current simulated tick.
Definition: core.hh:47
const std::string name() const
Provide a name to simplify debugging.
virtual ~ReqPacketQueue()
static const std::string name(const MasterPort &masterPort, const std::string &label)
SlavePort & slavePort
uint64_t Tick
Tick count type.
Definition: types.hh:63
virtual bool sendTiming(PacketPtr pkt)=0
Send a packet using the appropriate method for the specific subclass (reuest, response or snoop respo...
EventManager & em
The manager which is used for the event queue.
Definition: packet_queue.hh:84
Port Object Declaration.
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:255
A packet queue is a class that holds deferred packets and later sends them using the associated slave...
Definition: packet_queue.hh:65
MasterPort & masterPort
void processSendEvent()
Used to schedule sending of deferred packets.
PacketQueue(EventManager &_em, const std::string &_label, const std::string &_sendEventName, bool force_order=false, bool disable_sanity_check=false)
Create a packet queue, linked to an event manager, and a label that will be used for functional print...
Definition: packet_queue.cc:50
bool deferredPacketReady() const
Check whether we have a packet ready to go on the transmit list.
virtual ~PacketQueue()
Virtual desctructor since the class may be used as a base class.
Definition: packet_queue.cc:61
virtual const std::string name() const =0
Provide a name to simplify debugging.
const std::string name() const
Return port name (for DPRINTF).
Definition: port.hh:106
virtual ~SnoopRespPacketQueue()
Tick deferredPacketReadyTime() const
Get the next packet ready time.
bool checkConflict(const PacketPtr pkt, const int blk_size) const
Check if a packet corresponding to the same address exists in the queue.
Definition: packet_queue.cc:75
DeferredPacket(Tick t, PacketPtr p)
Definition: packet_queue.hh:73
DeferredPacketList transmitList
A list of outgoing packets.
Definition: packet_queue.hh:81
Bitfield< 5 > t
bool trySatisfyFunctional(PacketPtr pkt)
Check the list of buffered packets against the supplied functional request.
Definition: packet_queue.cc:87
Bitfield< 0 > p
std::list< DeferredPacket > DeferredPacketList
Definition: packet_queue.hh:78
virtual void sendDeferredPacket()
Attempt to send a packet.
const std::string label
Label to use for print request packets label stack.
const std::string name() const
Provide a name to simplify debugging.
const std::string name() const
Provide a name to simplify debugging.

Generated on Fri Feb 28 2020 16:27:02 for gem5 by doxygen 1.8.13