gem5  v20.1.0.0
MessageBuffer.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019 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) 1999-2008 Mark D. Hill and David A. Wood
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 
42 
43 #include <cassert>
44 
45 #include "base/cprintf.hh"
46 #include "base/logging.hh"
47 #include "base/random.hh"
48 #include "base/stl_helpers.hh"
49 #include "debug/RubyQueue.hh"
51 
52 using namespace std;
53 using m5::stl_helpers::operator<<;
54 
56  : SimObject(p), m_stall_map_size(0),
57  m_max_size(p->buffer_size), m_time_last_time_size_checked(0),
58  m_time_last_time_enqueue(0), m_time_last_time_pop(0),
59  m_last_arrival_time(0), m_strict_fifo(p->ordered),
60  m_randomization(p->randomization)
61 {
62  m_msg_counter = 0;
63  m_consumer = NULL;
68  m_priority_rank = 0;
69 
70  m_stall_msg_map.clear();
71  m_input_link_id = 0;
72  m_vnet_id = 0;
73 
74  m_buf_msgs = 0;
75  m_stall_time = 0;
76 
77  m_dequeue_callback = nullptr;
78 }
79 
80 unsigned int
82 {
83  if (m_time_last_time_size_checked != curTime) {
86  }
87 
89 }
90 
91 bool
92 MessageBuffer::areNSlotsAvailable(unsigned int n, Tick current_time)
93 {
94 
95  // fast path when message buffers have infinite size
96  if (m_max_size == 0) {
97  return true;
98  }
99 
100  // determine the correct size for the current cycle
101  // pop operations shouldn't effect the network's visible size
102  // until schd cycle, but enqueue operations effect the visible
103  // size immediately
104  unsigned int current_size = 0;
105  unsigned int current_stall_size = 0;
106 
107  if (m_time_last_time_pop < current_time) {
108  // no pops this cycle - heap and stall queue size is correct
109  current_size = m_prio_heap.size();
110  current_stall_size = m_stall_map_size;
111  } else {
112  if (m_time_last_time_enqueue < current_time) {
113  // no enqueues this cycle - m_size_at_cycle_start is correct
114  current_size = m_size_at_cycle_start;
115  } else {
116  // both pops and enqueues occured this cycle - add new
117  // enqueued msgs to m_size_at_cycle_start
118  current_size = m_size_at_cycle_start + m_msgs_this_cycle;
119  }
120 
121  // Stall queue size at start is considered
122  current_stall_size = m_stalled_at_cycle_start;
123  }
124 
125  // now compare the new size with our max size
126  if (current_size + current_stall_size + n <= m_max_size) {
127  return true;
128  } else {
129  DPRINTF(RubyQueue, "n: %d, current_size: %d, heap size: %d, "
130  "m_max_size: %d\n",
131  n, current_size + current_stall_size,
132  m_prio_heap.size(), m_max_size);
134  return false;
135  }
136 }
137 
138 const Message*
140 {
141  DPRINTF(RubyQueue, "Peeking at head of queue.\n");
142  const Message* msg_ptr = m_prio_heap.front().get();
143  assert(msg_ptr);
144 
145  DPRINTF(RubyQueue, "Message: %s\n", (*msg_ptr));
146  return msg_ptr;
147 }
148 
149 // FIXME - move me somewhere else
150 Tick
152 {
153  Tick time = 1;
154  time += random_mt.random(0, 3); // [0...3]
155  if (random_mt.random(0, 7) == 0) { // 1 in 8 chance
156  time += 100 + random_mt.random(1, 15); // 100 + [1...15]
157  }
158  return time;
159 }
160 
161 void
162 MessageBuffer::enqueue(MsgPtr message, Tick current_time, Tick delta)
163 {
164  // record current time incase we have a pop that also adjusts my size
165  if (m_time_last_time_enqueue < current_time) {
166  m_msgs_this_cycle = 0; // first msg this cycle
167  m_time_last_time_enqueue = current_time;
168  }
169 
170  m_msg_counter++;
172 
173  // Calculate the arrival time of the message, that is, the first
174  // cycle the message can be dequeued.
175  assert(delta > 0);
176  Tick arrival_time = 0;
177 
178  // random delays are inserted if either RubySystem level randomization flag
179  // is turned on, or the buffer level randomization is set
181  // No randomization
182  arrival_time = current_time + delta;
183  } else {
184  // Randomization - ignore delta
185  if (m_strict_fifo) {
186  if (m_last_arrival_time < current_time) {
187  m_last_arrival_time = current_time;
188  }
189  arrival_time = m_last_arrival_time + random_time();
190  } else {
191  arrival_time = current_time + random_time();
192  }
193  }
194 
195  // Check the arrival time
196  assert(arrival_time > current_time);
197  if (m_strict_fifo) {
198  if (arrival_time < m_last_arrival_time) {
199  panic("FIFO ordering violated: %s name: %s current time: %d "
200  "delta: %d arrival_time: %d last arrival_time: %d\n",
201  *this, name(), current_time, delta, arrival_time,
203  }
204  }
205 
206  // If running a cache trace, don't worry about the last arrival checks
208  m_last_arrival_time = arrival_time;
209  }
210 
211  // compute the delay cycles and set enqueue time
212  Message* msg_ptr = message.get();
213  assert(msg_ptr != NULL);
214 
215  assert(current_time >= msg_ptr->getLastEnqueueTime() &&
216  "ensure we aren't dequeued early");
217 
218  msg_ptr->updateDelayedTicks(current_time);
219  msg_ptr->setLastEnqueueTime(arrival_time);
220  msg_ptr->setMsgCounter(m_msg_counter);
221 
222  // Insert the message into the priority heap
223  m_prio_heap.push_back(message);
224  push_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MsgPtr>());
225  // Increment the number of messages statistic
226  m_buf_msgs++;
227 
228  DPRINTF(RubyQueue, "Enqueue arrival_time: %lld, Message: %s\n",
229  arrival_time, *(message.get()));
230 
231  // Schedule the wakeup
232  assert(m_consumer != NULL);
233  m_consumer->scheduleEventAbsolute(arrival_time);
235 }
236 
237 Tick
238 MessageBuffer::dequeue(Tick current_time, bool decrement_messages)
239 {
240  DPRINTF(RubyQueue, "Popping\n");
241  assert(isReady(current_time));
242 
243  // get MsgPtr of the message about to be dequeued
244  MsgPtr message = m_prio_heap.front();
245 
246  // get the delay cycles
247  message->updateDelayedTicks(current_time);
248  Tick delay = message->getDelayedTicks();
249 
250  m_stall_time = curTick() - message->getTime();
251 
252  // record previous size and time so the current buffer size isn't
253  // adjusted until schd cycle
254  if (m_time_last_time_pop < current_time) {
257  m_time_last_time_pop = current_time;
258  }
259 
260  pop_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MsgPtr>());
261  m_prio_heap.pop_back();
262  if (decrement_messages) {
263  // If the message will be removed from the queue, decrement the
264  // number of message in the queue.
265  m_buf_msgs--;
266  }
267 
268  // if a dequeue callback was requested, call it now
269  if (m_dequeue_callback) {
271  }
272 
273  return delay;
274 }
275 
276 void
277 MessageBuffer::registerDequeueCallback(std::function<void()> callback)
278 {
279  m_dequeue_callback = callback;
280 }
281 
282 void
284 {
285  m_dequeue_callback = nullptr;
286 }
287 
288 void
290 {
291  m_prio_heap.clear();
292 
293  m_msg_counter = 0;
298  m_msgs_this_cycle = 0;
299 }
300 
301 void
302 MessageBuffer::recycle(Tick current_time, Tick recycle_latency)
303 {
304  DPRINTF(RubyQueue, "Recycling.\n");
305  assert(isReady(current_time));
306  MsgPtr node = m_prio_heap.front();
307  pop_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MsgPtr>());
308 
309  Tick future_time = current_time + recycle_latency;
310  node->setLastEnqueueTime(future_time);
311 
312  m_prio_heap.back() = node;
313  push_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MsgPtr>());
314  m_consumer->scheduleEventAbsolute(future_time);
315 }
316 
317 void
319 {
320  while (!lt.empty()) {
321  MsgPtr m = lt.front();
322  assert(m->getLastEnqueueTime() <= schdTick);
323 
324  m_prio_heap.push_back(m);
325  push_heap(m_prio_heap.begin(), m_prio_heap.end(),
326  greater<MsgPtr>());
327 
329 
330  DPRINTF(RubyQueue, "Requeue arrival_time: %lld, Message: %s\n",
331  schdTick, *(m.get()));
332 
333  lt.pop_front();
334  }
335 }
336 
337 void
339 {
340  DPRINTF(RubyQueue, "ReanalyzeMessages %#x\n", addr);
341  assert(m_stall_msg_map.count(addr) > 0);
342 
343  //
344  // Put all stalled messages associated with this address back on the
345  // prio heap. The reanalyzeList call will make sure the consumer is
346  // scheduled for the current cycle so that the previously stalled messages
347  // will be observed before any younger messages that may arrive this cycle
348  //
350  assert(m_stall_map_size >= 0);
351  reanalyzeList(m_stall_msg_map[addr], current_time);
352  m_stall_msg_map.erase(addr);
353 }
354 
355 void
357 {
358  DPRINTF(RubyQueue, "ReanalyzeAllMessages\n");
359 
360  //
361  // Put all stalled messages associated with this address back on the
362  // prio heap. The reanalyzeList call will make sure the consumer is
363  // scheduled for the current cycle so that the previously stalled messages
364  // will be observed before any younger messages that may arrive this cycle.
365  //
366  for (StallMsgMapType::iterator map_iter = m_stall_msg_map.begin();
367  map_iter != m_stall_msg_map.end(); ++map_iter) {
368  m_stall_map_size -= map_iter->second.size();
369  assert(m_stall_map_size >= 0);
370  reanalyzeList(map_iter->second, current_time);
371  }
372  m_stall_msg_map.clear();
373 }
374 
375 void
377 {
378  DPRINTF(RubyQueue, "Stalling due to %#x\n", addr);
379  assert(isReady(current_time));
380  assert(getOffset(addr) == 0);
381  MsgPtr message = m_prio_heap.front();
382 
383  // Since the message will just be moved to stall map, indicate that the
384  // buffer should not decrement the m_buf_msgs statistic
385  dequeue(current_time, false);
386 
387  //
388  // Note: no event is scheduled to analyze the map at a later time.
389  // Instead the controller is responsible to call reanalyzeMessages when
390  // these addresses change state.
391  //
392  (m_stall_msg_map[addr]).push_back(message);
394  m_stall_count++;
395 }
396 
397 bool
399 {
400  return (m_stall_msg_map.count(addr) != 0);
401 }
402 
403 void
405 {
406  DPRINTF(RubyQueue, "Deferring enqueueing message: %s, Address %#x\n",
407  *(message.get()), addr);
408  (m_deferred_msg_map[addr]).push_back(message);
409 }
410 
411 void
413 {
414  assert(!isDeferredMsgMapEmpty(addr));
416  assert(msg_vec.size() > 0);
417 
418  // enqueue all deferred messages associated with this address
419  for (MsgPtr m : msg_vec) {
420  enqueue(m, curTime, delay);
421  }
422 
423  msg_vec.clear();
424  m_deferred_msg_map.erase(addr);
425 }
426 
427 bool
429 {
430  return m_deferred_msg_map.count(addr) == 0;
431 }
432 
433 void
434 MessageBuffer::print(ostream& out) const
435 {
436  ccprintf(out, "[MessageBuffer: ");
437  if (m_consumer != NULL) {
438  ccprintf(out, " consumer-yes ");
439  }
440 
442  sort_heap(copy.begin(), copy.end(), greater<MsgPtr>());
443  ccprintf(out, "%s] %s", copy, name());
444 }
445 
446 bool
447 MessageBuffer::isReady(Tick current_time) const
448 {
449  return ((m_prio_heap.size() > 0) &&
450  (m_prio_heap.front()->getLastEnqueueTime() <= current_time));
451 }
452 
453 void
455 {
457  .name(name() + ".not_avail_count")
458  .desc("Number of times this buffer did not have N slots available")
460 
461  m_buf_msgs
462  .name(name() + ".avg_buf_msgs")
463  .desc("Average number of messages in buffer")
465 
467  .name(name() + ".num_msg_stalls")
468  .desc("Number of times messages were stalled")
470 
472  .name(name() + ".avg_buf_occ")
473  .desc("Average occupancy of buffer capacity")
475 
477  .name(name() + ".avg_stall_time")
478  .desc("Average number of cycles messages are stalled in this MB")
480 
481  if (m_max_size > 0) {
483  } else {
484  m_occupancy = 0;
485  }
486 }
487 
488 uint32_t
490 {
491  DPRINTF(RubyQueue, "functional %s for %#x\n",
492  is_read ? "read" : "write", pkt->getAddr());
493 
494  uint32_t num_functional_accesses = 0;
495 
496  // Check the priority heap and write any messages that may
497  // correspond to the address in the packet.
498  for (unsigned int i = 0; i < m_prio_heap.size(); ++i) {
499  Message *msg = m_prio_heap[i].get();
500  if (is_read && msg->functionalRead(pkt))
501  return 1;
502  else if (!is_read && msg->functionalWrite(pkt))
503  num_functional_accesses++;
504  }
505 
506  // Check the stall queue and write any messages that may
507  // correspond to the address in the packet.
508  for (StallMsgMapType::iterator map_iter = m_stall_msg_map.begin();
509  map_iter != m_stall_msg_map.end();
510  ++map_iter) {
511 
512  for (std::list<MsgPtr>::iterator it = (map_iter->second).begin();
513  it != (map_iter->second).end(); ++it) {
514 
515  Message *msg = (*it).get();
516  if (is_read && msg->functionalRead(pkt))
517  return 1;
518  else if (!is_read && msg->functionalWrite(pkt))
519  num_functional_accesses++;
520  }
521  }
522 
523  return num_functional_accesses;
524 }
525 
527 MessageBufferParams::create()
528 {
529  return new MessageBuffer(this);
530 }
MessageBuffer::m_msgs_this_cycle
unsigned int m_msgs_this_cycle
Definition: MessageBuffer.hh:244
MessageBuffer::dequeue
Tick dequeue(Tick current_time, bool decrement_messages=true)
Updates the delay cycles of the message at the head of the queue, removes it from the queue and retur...
Definition: MessageBuffer.cc:238
Message::getLastEnqueueTime
Tick getLastEnqueueTime() const
Definition: Message.hh:89
MessageBuffer::m_stall_time
Stats::Average m_stall_time
Definition: MessageBuffer.hh:257
Packet::getAddr
Addr getAddr() const
Definition: packet.hh:754
MessageBuffer::functionalAccess
uint32_t functionalAccess(Packet *pkt, bool is_read)
Definition: MessageBuffer.cc:489
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
MessageBuffer::peek
const Message * peek() const
Function for extracting the message at the head of the message queue.
Definition: MessageBuffer.cc:139
MessageBuffer::m_priority_rank
int m_priority_rank
Definition: MessageBuffer.hh:249
MessageBuffer::m_size_at_cycle_start
unsigned int m_size_at_cycle_start
Definition: MessageBuffer.hh:242
MessageBuffer::m_dequeue_callback
std::function< void()> m_dequeue_callback
Definition: MessageBuffer.hh:188
random.hh
MessageBuffer::m_deferred_msg_map
DeferredMsgMapType m_deferred_msg_map
Definition: MessageBuffer.hh:215
Tick
uint64_t Tick
Tick count type.
Definition: types.hh:63
MessageBuffer::getSize
unsigned int getSize(Tick curTime)
Definition: MessageBuffer.cc:81
std::vector< MsgPtr >
MessageBuffer::reanalyzeMessages
void reanalyzeMessages(Addr addr, Tick current_time)
Definition: MessageBuffer.cc:338
MessageBuffer::m_time_last_time_pop
Tick m_time_last_time_pop
Definition: MessageBuffer.hh:239
MessageBuffer::stallMessage
void stallMessage(Addr addr, Tick current_time)
Definition: MessageBuffer.cc:376
MessageBuffer::enqueue
void enqueue(MsgPtr message, Tick curTime, Tick delta)
Definition: MessageBuffer.cc:162
MessageBuffer::m_last_arrival_time
Tick m_last_arrival_time
Definition: MessageBuffer.hh:240
MessageBuffer::regStats
void regStats() override
Callback to set stat parameters.
Definition: MessageBuffer.cc:454
Stats::DataWrap::flags
Derived & flags(Flags _flags)
Set the flags and marks this stat to print at the end of simulation.
Definition: statistics.hh:331
Message::updateDelayedTicks
void updateDelayedTicks(Tick curTime)
Update the delay this message has experienced so far.
Definition: Message.hh:80
MessageBuffer::m_prio_heap
std::vector< MsgPtr > m_prio_heap
Definition: MessageBuffer.hh:186
random_time
Tick random_time()
Definition: MessageBuffer.cc:151
ArmISA::n
Bitfield< 31 > n
Definition: miscregs_types.hh:450
random_mt
Random random_mt
Definition: random.cc:96
MessageBuffer::m_max_size
const unsigned int m_max_size
The maximum capacity.
Definition: MessageBuffer.hh:231
MessageBuffer::deferEnqueueingMessage
void deferEnqueueingMessage(Addr addr, MsgPtr message)
Definition: MessageBuffer.cc:404
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:234
MessageBuffer::m_time_last_time_enqueue
Tick m_time_last_time_enqueue
Definition: MessageBuffer.hh:238
MessageBuffer::m_stalled_at_cycle_start
unsigned int m_stalled_at_cycle_start
Definition: MessageBuffer.hh:243
MessageBuffer::isReady
bool isReady(Tick current_time) const
Definition: MessageBuffer.cc:447
MessageBuffer::isDeferredMsgMapEmpty
bool isDeferredMsgMapEmpty(Addr addr) const
Definition: MessageBuffer.cc:428
MessageBuffer::reanalyzeAllMessages
void reanalyzeAllMessages(Tick current_time)
Definition: MessageBuffer.cc:356
MessageBuffer::hasStalledMsg
bool hasStalledMsg(Addr addr) const
Definition: MessageBuffer.cc:398
cprintf.hh
MessageBuffer::m_not_avail_count
Stats::Scalar m_not_avail_count
Definition: MessageBuffer.hh:246
MessageBuffer::m_size_last_time_size_checked
unsigned int m_size_last_time_size_checked
Definition: MessageBuffer.hh:234
RubySystem.hh
MessageBuffer::m_consumer
Consumer * m_consumer
Consumer to signal a wakeup(), can be NULL.
Definition: MessageBuffer.hh:185
MessageBuffer::unregisterDequeueCallback
void unregisterDequeueCallback()
Definition: MessageBuffer.cc:283
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
Stats::DataWrap::name
Derived & name(const std::string &name)
Set the name and marks this stat to print at the end of simulation.
Definition: statistics.hh:274
MessageBuffer::MessageBuffer
MessageBuffer(const Params *p)
Definition: MessageBuffer.cc:55
MessageBuffer::m_stall_map_size
int m_stall_map_size
Current size of the stall map.
Definition: MessageBuffer.hh:223
MessageBuffer::Params
MessageBufferParams Params
Definition: MessageBuffer.hh:71
MsgPtr
std::shared_ptr< Message > MsgPtr
Definition: Message.hh:40
MessageBuffer::areNSlotsAvailable
bool areNSlotsAvailable(unsigned int n, Tick curTime)
Definition: MessageBuffer.cc:92
Stats::nozero
const FlagsType nozero
Don't print if this is zero.
Definition: info.hh:57
MessageBuffer::recycle
void recycle(Tick current_time, Tick recycle_latency)
Definition: MessageBuffer.cc:302
MessageBuffer::registerDequeueCallback
void registerDequeueCallback(std::function< void()> callback)
Definition: MessageBuffer.cc:277
SimObject::name
virtual const std::string name() const
Definition: sim_object.hh:133
MessageBuffer.hh
MessageBuffer::m_input_link_id
int m_input_link_id
Definition: MessageBuffer.hh:253
MessageBuffer::print
void print(std::ostream &out) const
Definition: MessageBuffer.cc:434
Message::setLastEnqueueTime
void setLastEnqueueTime(const Tick &time)
Definition: Message.hh:88
Consumer::scheduleEventAbsolute
void scheduleEventAbsolute(Tick timeAbs)
Definition: Consumer.cc:40
std
Overload hash function for BasicBlockRange type.
Definition: vec_reg.hh:587
RubySystem::getWarmupEnabled
static bool getWarmupEnabled()
Definition: RubySystem.hh:65
Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:257
getOffset
Addr getOffset(Addr addr)
Definition: Address.cc:48
MessageBuffer::reanalyzeList
void reanalyzeList(std::list< MsgPtr > &, Tick)
Definition: MessageBuffer.cc:318
addr
ip6_addr_t addr
Definition: inet.hh:423
MessageBuffer::m_vnet_id
int m_vnet_id
Definition: MessageBuffer.hh:254
ccprintf
void ccprintf(cp::Print &print)
Definition: cprintf.hh:127
logging.hh
MessageBuffer::m_occupancy
Stats::Formula m_occupancy
Definition: MessageBuffer.hh:259
Random::random
std::enable_if< std::is_integral< T >::value, T >::type random()
Use the SFINAE idiom to choose an implementation based on whether the type is integral or floating po...
Definition: random.hh:86
MessageBuffer::enqueueDeferredMessages
void enqueueDeferredMessages(Addr addr, Tick curTime, Tick delay)
Definition: MessageBuffer.cc:412
MessageBuffer::m_randomization
const bool m_randomization
Definition: MessageBuffer.hh:251
Message
Definition: Message.hh:43
RubySystem::getRandomization
static int getRandomization()
Definition: RubySystem.hh:61
Message::functionalRead
virtual bool functionalRead(Packet *pkt)=0
The two functions below are used for reading / writing the message functionally.
PowerISA::lt
Bitfield< 31 > lt
Definition: miscregs.hh:45
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
MessageBuffer::m_buf_msgs
Stats::Average m_buf_msgs
Definition: MessageBuffer.hh:256
std::list
STL list class.
Definition: stl.hh:51
MessageBuffer
Definition: MessageBuffer.hh:68
MessageBuffer::m_time_last_time_size_checked
Tick m_time_last_time_size_checked
Definition: MessageBuffer.hh:233
Consumer::storeEventInfo
virtual void storeEventInfo(int info)
Definition: Consumer.hh:57
Stats::DataWrap::desc
Derived & desc(const std::string &_desc)
Set the description and marks this stat to print at the end of simulation.
Definition: statistics.hh:307
MessageBuffer::m_stall_count
Stats::Scalar m_stall_count
Definition: MessageBuffer.hh:258
stl_helpers.hh
MessageBuffer::m_msg_counter
uint64_t m_msg_counter
Definition: MessageBuffer.hh:248
MessageBuffer::m_strict_fifo
const bool m_strict_fifo
Definition: MessageBuffer.hh:250
MessageBuffer::m_stall_msg_map
StallMsgMapType m_stall_msg_map
A map from line addresses to lists of stalled messages for that line.
Definition: MessageBuffer.hh:207
Message::setMsgCounter
void setMsgCounter(uint64_t c)
Definition: Message.hh:92
ArmISA::m
Bitfield< 0 > m
Definition: miscregs_types.hh:389
Message::functionalWrite
virtual bool functionalWrite(Packet *pkt)=0
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:171
curTick
Tick curTick()
The current simulated tick.
Definition: core.hh:45
SimObject
Abstract superclass for simulation objects.
Definition: sim_object.hh:92
MessageBuffer::clear
void clear()
Definition: MessageBuffer.cc:289

Generated on Wed Sep 30 2020 14:02:13 for gem5 by doxygen 1.8.17