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

Generated on Tue Jun 22 2021 15:28:30 for gem5 by doxygen 1.8.17