gem5  v20.0.0.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 
41 #ifndef __MEM_PACKET_QUEUE_HH__
42 #define __MEM_PACKET_QUEUE_HH__
43 
52 #include <list>
53 
54 #include "mem/port.hh"
55 #include "sim/drain.hh"
56 #include "sim/eventq.hh"
57 
62 class PacketQueue : public Drainable
63 {
64  private:
67  public:
71  : tick(t), pkt(p)
72  {}
73  };
74 
76 
78  DeferredPacketList transmitList;
79 
82 
84  void processSendEvent();
85 
88 
89  /*
90  * Optionally disable the sanity check
91  * on the size of the transmitList. The
92  * sanity check will be enabled by default.
93  */
95 
102 
103  protected:
104 
106  const std::string label;
107 
110 
112  bool deferredPacketReady() const
113  { return !transmitList.empty() && transmitList.front().tick <= curTick(); }
114 
123  virtual void sendDeferredPacket();
124 
129  virtual bool sendTiming(PacketPtr pkt) = 0;
130 
141  PacketQueue(EventManager& _em, const std::string& _label,
142  const std::string& _sendEventName,
143  bool force_order = false,
144  bool disable_sanity_check = false);
145 
149  virtual ~PacketQueue();
150 
151  public:
152 
158  virtual const std::string name() const = 0;
159 
163  size_t size() const { return transmitList.size(); }
164 
169  { return transmitList.empty() ? MaxTick : transmitList.front().tick; }
170 
179  bool checkConflict(const PacketPtr pkt, const int blk_size) const;
180 
184 
194  void schedSendEvent(Tick when);
195 
202  void schedSendTiming(PacketPtr pkt, Tick when);
203 
209  void retry();
210 
217  void disableSanityCheck() { _disableSanityCheck = true; }
218 
219  DrainState drain() override;
220 };
221 
223 {
224 
225  protected:
226 
228 
229  // Static definition so it can be called when constructing the parent
230  // without us being completely initialized.
231  static const std::string name(const MasterPort& masterPort,
232  const std::string& label)
233  { return masterPort.name() + "-" + label; }
234 
235  public:
236 
246  ReqPacketQueue(EventManager& _em, MasterPort& _masterPort,
247  const std::string _label = "ReqPacketQueue");
248 
249  virtual ~ReqPacketQueue() { }
250 
251  const std::string name() const
252  { return name(masterPort, label); }
253 
254  bool sendTiming(PacketPtr pkt);
255 
256 };
257 
259 {
260 
261  protected:
262 
264 
265  // Static definition so it can be called when constructing the parent
266  // without us being completely initialized.
267  static const std::string name(const MasterPort& masterPort,
268  const std::string& label)
269  { return masterPort.name() + "-" + label; }
270 
271  public:
272 
283  SnoopRespPacketQueue(EventManager& _em, MasterPort& _masterPort,
284  bool force_order = false,
285  const std::string _label = "SnoopRespPacketQueue");
286 
287  virtual ~SnoopRespPacketQueue() { }
288 
289  const std::string name() const
290  { return name(masterPort, label); }
291 
292  bool sendTiming(PacketPtr pkt);
293 
294 };
295 
297 {
298 
299  protected:
300 
302 
303  // Static definition so it can be called when constructing the parent
304  // without us being completely initialized.
305  static const std::string name(const SlavePort& slavePort,
306  const std::string& label)
307  { return slavePort.name() + "-" + label; }
308 
309  public:
310 
321  RespPacketQueue(EventManager& _em, SlavePort& _slavePort,
322  bool force_order = false,
323  const std::string _label = "RespPacketQueue");
324 
325  virtual ~RespPacketQueue() { }
326 
327  const std::string name() const
328  { return name(slavePort, label); }
329 
330  bool sendTiming(PacketPtr pkt);
331 
332 };
333 
334 #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:71
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:63
PacketPtr pkt
Pointer to the packet to transmit.
Definition: packet_queue.hh:69
bool forceOrder
if true, inserted packets have to be unconditionally scheduled after the last packet in the queue tha...
bool _disableSanityCheck
Definition: packet_queue.hh:94
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:66
A SlavePort is a specialisation of a port.
Definition: port.hh:254
EventFunctionWrapper sendEvent
Event used to call processSendEvent.
Definition: packet_queue.hh:87
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:68
DrainState
Object drain/handover states.
Definition: drain.hh:71
virtual ~RespPacketQueue()
MasterPort & masterPort
Interface for objects that might require draining before checkpointing.
Definition: drain.hh:239
const Tick MaxTick
Definition: types.hh:63
Tick curTick()
The current simulated tick.
Definition: core.hh:44
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:61
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:81
Port Object Declaration.
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:249
A packet queue is a class that holds deferred packets and later sends them using the associated slave...
Definition: packet_queue.hh:62
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:47
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:58
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:102
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:72
DeferredPacket(Tick t, PacketPtr p)
Definition: packet_queue.hh:70
DeferredPacketList transmitList
A list of outgoing packets.
Definition: packet_queue.hh:78
Bitfield< 5 > t
bool trySatisfyFunctional(PacketPtr pkt)
Check the list of buffered packets against the supplied functional request.
Definition: packet_queue.cc:84
Bitfield< 0 > p
std::list< DeferredPacket > DeferredPacketList
Definition: packet_queue.hh:75
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 Mon Jun 8 2020 15:45:12 for gem5 by doxygen 1.8.13