gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
generators.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2013, 2016 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  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  * Authors: Thomas Grass
38  * Andreas Hansson
39  * Sascha Bischoff
40  * Neha Agarwal
41  */
42 
43 #include <algorithm>
44 
45 #include "base/random.hh"
46 #include "base/trace.hh"
48 #include "debug/TrafficGen.hh"
49 #include "proto/packet.pb.h"
50 
51 BaseGen::BaseGen(const std::string& _name, MasterID master_id, Tick _duration)
52  : _name(_name), masterID(master_id), duration(_duration)
53 {
54 }
55 
57 BaseGen::getPacket(Addr addr, unsigned size, const MemCmd& cmd,
58  Request::FlagsType flags)
59 {
60  // Create new request
61  Request *req = new Request(addr, size, flags, masterID);
62  // Dummy PC to have PC-based prefetchers latch on; get entropy into higher
63  // bits
64  req->setPC(((Addr)masterID) << 2);
65 
66  // Embed it in a packet
67  PacketPtr pkt = new Packet(req, cmd);
68 
69  uint8_t* pkt_data = new uint8_t[req->getSize()];
70  pkt->dataDynamic(pkt_data);
71 
72  if (cmd.isWrite()) {
73  std::fill_n(pkt_data, req->getSize(), (uint8_t)masterID);
74  }
75 
76  return pkt;
77 }
78 
79 void
81 {
82  // reset the address and the data counter
84  dataManipulated = 0;
85 }
86 
89 {
90  // choose if we generate a read or a write here
91  bool isRead = readPercent != 0 &&
92  (readPercent == 100 || random_mt.random(0, 100) < readPercent);
93 
94  assert((readPercent == 0 && !isRead) || (readPercent == 100 && isRead) ||
95  readPercent != 100);
96 
97  DPRINTF(TrafficGen, "LinearGen::getNextPacket: %c to addr %x, size %d\n",
98  isRead ? 'r' : 'w', nextAddr, blocksize);
99 
100  // Add the amount of data manipulated to the total
102 
104  isRead ? MemCmd::ReadReq : MemCmd::WriteReq);
105 
106  // increment the address
107  nextAddr += blocksize;
108 
109  // If we have reached the end of the address space, reset the
110  // address to the start of the range
111  if (nextAddr > endAddr) {
112  DPRINTF(TrafficGen, "Wrapping address to the start of "
113  "the range\n");
115  }
116 
117  return pkt;
118 }
119 
120 Tick
121 LinearGen::nextPacketTick(bool elastic, Tick delay) const
122 {
123  // Check to see if we have reached the data limit. If dataLimit is
124  // zero we do not have a data limit and therefore we will keep
125  // generating requests for the entire residency in this state.
126  if (dataLimit && dataManipulated >= dataLimit) {
127  DPRINTF(TrafficGen, "Data limit for LinearGen reached.\n");
128  // there are no more requests, therefore return MaxTick
129  return MaxTick;
130  } else {
131  // return the time when the next request should take place
133 
134  // compensate for the delay experienced to not be elastic, by
135  // default the value we generate is from the time we are
136  // asked, so the elasticity happens automatically
137  if (!elastic) {
138  if (wait < delay)
139  wait = 0;
140  else
141  wait -= delay;
142  }
143 
144  return curTick() + wait;
145  }
146 }
147 
148 void
150 {
151  // reset the counter to zero
152  dataManipulated = 0;
153 }
154 
155 PacketPtr
157 {
158  // choose if we generate a read or a write here
159  bool isRead = readPercent != 0 &&
160  (readPercent == 100 || random_mt.random(0, 100) < readPercent);
161 
162  assert((readPercent == 0 && !isRead) || (readPercent == 100 && isRead) ||
163  readPercent != 100);
164 
165  // address of the request
167 
168  // round down to start address of block
169  addr -= addr % blocksize;
170 
171  DPRINTF(TrafficGen, "RandomGen::getNextPacket: %c to addr %x, size %d\n",
172  isRead ? 'r' : 'w', addr, blocksize);
173 
174  // add the amount of data manipulated to the total
176 
177  // create a new request packet
178  return getPacket(addr, blocksize,
179  isRead ? MemCmd::ReadReq : MemCmd::WriteReq);
180 }
181 
182 PacketPtr
184 {
185  // if this is the first of the packets in series to be generated,
186  // start counting again
187  if (countNumSeqPkts == 0) {
189 
190  // choose if we generate a read or a write here
191  isRead = readPercent != 0 &&
192  (readPercent == 100 || random_mt.random(0, 100) < readPercent);
193 
194  assert((readPercent == 0 && !isRead) ||
195  (readPercent == 100 && isRead) ||
196  readPercent != 100);
197 
198  // pick a random bank
199  unsigned int new_bank =
200  random_mt.random<unsigned int>(0, nbrOfBanksUtil - 1);
201 
202  // pick a random rank
203  unsigned int new_rank =
204  random_mt.random<unsigned int>(0, nbrOfRanks - 1);
205 
206  // Generate the start address of the command series
207  // routine will update addr variable with bank, rank, and col
208  // bits updated for random traffic mode
209  genStartAddr(new_bank, new_rank);
210 
211  } else {
212  // increment the column by one
213  if (addrMapping == 1)
214  // addrMapping=1: RoRaBaCoCh/RoRaBaChCo
215  // Simply increment addr by blocksize to increment the column by one
216  addr += blocksize;
217 
218  else if (addrMapping == 0) {
219  // addrMapping=0: RoCoRaBaCh
220  // Explicity increment the column bits
221  unsigned int new_col = ((addr / blocksize / nbrOfBanksDRAM / nbrOfRanks) %
222  (pageSize / blocksize)) + 1;
224  blockBits + bankBits + rankBits, new_col);
225  }
226  }
227 
228  DPRINTF(TrafficGen, "DramGen::getNextPacket: %c to addr %x, "
229  "size %d, countNumSeqPkts: %d, numSeqPkts: %d\n",
231 
232  // create a new request packet
235 
236  // add the amount of data manipulated to the total
238 
239  // subtract the number of packets remained to be generated
240  --countNumSeqPkts;
241 
242  // return the generated packet
243  return pkt;
244 }
245 
246 PacketPtr
248 {
249  // if this is the first of the packets in series to be generated,
250  // start counting again
251  if (countNumSeqPkts == 0) {
253 
254  // choose if we generate a read or a write here
255  if (readPercent == 50) {
256  if ((nextSeqCount % nbrOfBanksUtil) == 0) {
257  // Change type after all banks have been rotated
258  // Otherwise, keep current value
259  isRead = !isRead;
260  }
261  } else {
262  // Set randomly based on percentage
263  isRead = readPercent != 0;
264  }
265 
266  assert((readPercent == 0 && !isRead) ||
267  (readPercent == 100 && isRead) ||
268  readPercent != 100);
269 
270  // Overwrite random bank value
271  // Rotate across banks
272  unsigned int new_bank = nextSeqCount % nbrOfBanksUtil;
273 
274  // Overwrite random rank value
275  // Will rotate to the next rank after rotating through all banks,
276  // for each specified command type.
277 
278  // Use modular function to ensure that calculated rank is within
279  // system limits after state transition
280  unsigned int new_rank = (nextSeqCount / maxSeqCountPerRank) %
281  nbrOfRanks;
282 
283  // Increment nextSeqCount
284  // Roll back to 0 after completing a full rotation across
285  // banks, command type, and ranks
286  nextSeqCount = (nextSeqCount + 1) %
288 
289  DPRINTF(TrafficGen, "DramRotGen::getNextPacket nextSeqCount: %d "
290  "new_rank: %d new_bank: %d\n",
291  nextSeqCount, new_rank, new_bank);
292 
293  // Generate the start address of the command series
294  // routine will update addr variable with bank, rank, and col
295  // bits updated for rotation scheme
296  genStartAddr(new_bank, new_rank);
297 
298  } else {
299  // increment the column by one
300  if (addrMapping == 1)
301  // addrMapping=1: RoRaBaCoCh/RoRaBaChCo
302  // Simply increment addr by blocksize to increment the column by one
303  addr += blocksize;
304 
305  else if (addrMapping == 0) {
306  // addrMapping=0: RoCoRaBaCh
307  // Explicity increment the column bits
308  unsigned int new_col = ((addr / blocksize / nbrOfBanksDRAM / nbrOfRanks) %
309  (pageSize / blocksize)) + 1;
311  blockBits + bankBits + rankBits, new_col);
312  }
313  }
314 
315  DPRINTF(TrafficGen, "DramRotGen::getNextPacket: %c to addr %x, "
316  "size %d, countNumSeqPkts: %d, numSeqPkts: %d\n",
318 
319  // create a new request packet
322 
323  // add the amount of data manipulated to the total
325 
326  // subtract the number of packets remained to be generated
327  --countNumSeqPkts;
328 
329  // return the generated packet
330  return pkt;
331 }
332 
333 void
334 DramGen::genStartAddr(unsigned int new_bank, unsigned int new_rank)
335 {
336  // start by picking a random address in the range
338 
339  // round down to start address of a block, i.e. a DRAM burst
340  addr -= addr % blocksize;
341 
342  // insert the bank bits at the right spot, and align the
343  // address to achieve the required hit length, this involves
344  // finding the appropriate start address such that all
345  // sequential packets target successive columns in the same
346  // page
347 
348  // for example, if we have a stride size of 192B, which means
349  // for LPDDR3 where burstsize = 32B we have numSeqPkts = 6,
350  // the address generated previously can be such that these
351  // 192B cross the page boundary, hence it needs to be aligned
352  // so that they all belong to the same page for page hit
353  unsigned int columns_per_page = pageSize / blocksize;
354 
355  // pick a random column, but ensure that there is room for
356  // numSeqPkts sequential columns in the same page
357  unsigned int new_col =
358  random_mt.random<unsigned int>(0, columns_per_page - numSeqPkts);
359 
360  if (addrMapping == 1) {
361  // addrMapping=1: RoRaBaCoCh/RoRaBaChCo
362  // Block bits, then page bits, then bank bits, then rank bits
363  replaceBits(addr, blockBits + pageBits + bankBits - 1,
364  blockBits + pageBits, new_bank);
365  replaceBits(addr, blockBits + pageBits - 1, blockBits, new_col);
366  if (rankBits != 0) {
368  blockBits + pageBits + bankBits, new_rank);
369  }
370  } else if (addrMapping == 0) {
371  // addrMapping=0: RoCoRaBaCh
372  // Block bits, then bank bits, then rank bits, then page bits
373  replaceBits(addr, blockBits + bankBits - 1, blockBits, new_bank);
375  blockBits + bankBits + rankBits, new_col);
376  if (rankBits != 0) {
377  replaceBits(addr, blockBits + bankBits + rankBits - 1,
378  blockBits + bankBits, new_rank);
379  }
380  }
381 }
382 
383 Tick
384 RandomGen::nextPacketTick(bool elastic, Tick delay) const
385 {
386  // Check to see if we have reached the data limit. If dataLimit is
387  // zero we do not have a data limit and therefore we will keep
388  // generating requests for the entire residency in this state.
390  {
391  DPRINTF(TrafficGen, "Data limit for RandomGen reached.\n");
392  // No more requests. Return MaxTick.
393  return MaxTick;
394  } else {
395  // return the time when the next request should take place
397 
398  // compensate for the delay experienced to not be elastic, by
399  // default the value we generate is from the time we are
400  // asked, so the elasticity happens automatically
401  if (!elastic) {
402  if (wait < delay)
403  wait = 0;
404  else
405  wait -= delay;
406  }
407 
408  return curTick() + wait;
409  }
410 }
411 
412 TraceGen::InputStream::InputStream(const std::string& filename)
413  : trace(filename)
414 {
415  init();
416 }
417 
418 void
420 {
421  // Create a protobuf message for the header and read it from the stream
422  ProtoMessage::PacketHeader header_msg;
423  if (!trace.read(header_msg)) {
424  panic("Failed to read packet header from trace\n");
425  } else if (header_msg.tick_freq() != SimClock::Frequency) {
426  panic("Trace was recorded with a different tick frequency %d\n",
427  header_msg.tick_freq());
428  }
429 }
430 
431 void
433 {
434  trace.reset();
435  init();
436 }
437 
438 bool
440 {
441  ProtoMessage::Packet pkt_msg;
442  if (trace.read(pkt_msg)) {
443  element.cmd = pkt_msg.cmd();
444  element.addr = pkt_msg.addr();
445  element.blocksize = pkt_msg.size();
446  element.tick = pkt_msg.tick();
447  element.flags = pkt_msg.has_flags() ? pkt_msg.flags() : 0;
448  return true;
449  }
450 
451  // We have reached the end of the file
452  return false;
453 }
454 
455 Tick
456 TraceGen::nextPacketTick(bool elastic, Tick delay) const
457 {
458  if (traceComplete) {
459  DPRINTF(TrafficGen, "No next tick as trace is finished\n");
460  // We are at the end of the file, thus we have no more data in
461  // the trace Return MaxTick to signal that there will be no
462  // more transactions in this active period for the state.
463  return MaxTick;
464  }
465 
466  assert(nextElement.isValid());
467 
468  DPRINTF(TrafficGen, "Next packet tick is %d\n", tickOffset +
469  nextElement.tick);
470 
471  // if the playback is supposed to be elastic, add the delay
472  if (elastic)
473  tickOffset += delay;
474 
475  return std::max(tickOffset + nextElement.tick, curTick());
476 }
477 
478 void
480 {
481  // update the trace offset to the time where the state was entered.
482  tickOffset = curTick();
483 
484  // clear everything
485  currElement.clear();
486 
487  // read the first element in the file and set the complete flag
489 }
490 
491 PacketPtr
493 {
494  // shift things one step forward
496  nextElement.clear();
497 
498  // read the next element and set the complete flag
500 
501  // it is the responsibility of the traceComplete flag to ensure we
502  // always have a valid element here
503  assert(currElement.isValid());
504 
505  DPRINTF(TrafficGen, "TraceGen::getNextPacket: %c %d %d %d 0x%x\n",
506  currElement.cmd.isRead() ? 'r' : 'w',
511 
515 
516  if (!traceComplete)
517  DPRINTF(TrafficGen, "nextElement: %c addr %d size %d tick %d (%d)\n",
518  nextElement.cmd.isRead() ? 'r' : 'w',
522  nextElement.tick);
523 
524  return pkt;
525 }
526 
527 void
529 {
530  // Check if we reached the end of the trace file. If we did not
531  // then we want to generate a warning stating that not the entire
532  // trace was played.
533  if (!traceComplete) {
534  warn("Trace player %s was unable to replay the entire trace!\n",
535  name());
536  }
537 
538  // Clear any flags and start over again from the beginning of the
539  // file
540  trace.reset();
541 }
const Tick maxPeriod
Definition: generators.hh:215
const Addr blocksize
Block size.
Definition: generators.hh:288
#define DPRINTF(x,...)
Definition: trace.hh:212
const Tick maxPeriod
Definition: generators.hh:292
bool traceComplete
Set to true when the trace replay for one instance of state is complete.
Definition: generators.hh:644
void setPC(Addr pc)
Definition: request.hh:701
const unsigned int numSeqPkts
Number of sequential DRAM packets to be generated per cpu request.
Definition: generators.hh:381
void init()
Check the trace header to make sure that it is of the right format.
Definition: generators.cc:419
std::string name() const
Get the name, useful for DPRINTFs.
Definition: generators.hh:106
bool read(TraceElement &element)
Attempt to read a trace element from the stream, and also notify the caller if the end of the file wa...
Definition: generators.cc:439
Declaration of a set of generator behaviours that are used by the stand-alone traffic generator...
Definition: packet.hh:73
BaseGen(const std::string &_name, MasterID master_id, Tick _duration)
Create a base generator.
Definition: generators.cc:51
const Tick minPeriod
Request generation period.
Definition: generators.hh:214
const Tick minPeriod
Request generation period.
Definition: generators.hh:291
#define panic(...)
Definition: misc.hh:153
uint32_t FlagsType
Definition: request.hh:90
void enter()
Enter this generator state.
Definition: generators.cc:149
void genStartAddr(unsigned int new_bank, unsigned int new_rank)
Insert bank, rank, and column bits into packed address to create address for 1st command in a series...
Definition: generators.cc:334
PacketPtr getPacket(Addr addr, unsigned size, const MemCmd &cmd, Request::FlagsType flags=0)
Generate a new request and associated packet.
Definition: generators.cc:57
PacketPtr getNextPacket()
Get the next generated packet.
Definition: generators.cc:492
unsigned int countNumSeqPkts
Track number of sequential packets generated for a request.
Definition: generators.hh:384
ip6_addr_t addr
Definition: inet.hh:335
const unsigned int nbrOfBanksDRAM
Number of banks in DRAM.
Definition: generators.hh:405
void clear()
Make this element invalid.
Definition: generators.hh:534
Tick tick
The time at which the request should be sent.
Definition: generators.hh:517
bool isRead
Remember type of requests to be generated in series.
Definition: generators.hh:390
const Addr endAddr
End of address range.
Definition: generators.hh:208
InputStream(const std::string &filename)
Create a trace input stream for a given file name.
Definition: generators.cc:412
PacketPtr getNextPacket()
Get the next generated packet.
Definition: generators.cc:156
const unsigned int bankBits
Number of bank bits in DRAM address.
Definition: generators.hh:399
const Addr startAddr
Start of address range.
Definition: generators.hh:205
unsigned int addrMapping
Address mapping to be used.
Definition: generators.hh:411
Tick Frequency
The simulated frequency of curTick(). (In ticks per second)
Definition: core.cc:47
const uint8_t readPercent
Percent of generated transactions that should be reads.
Definition: generators.hh:297
Tick nextPacketTick(bool elastic, Tick delay) const
Determine the tick when the next packet is available.
Definition: generators.cc:121
const Addr dataLimit
Maximum amount of data to manipulate.
Definition: generators.hh:223
unsigned int nextSeqCount
Next packet series count used to set rank and bank, and update isRead Incremented at the start of a n...
Definition: generators.hh:489
TraceElement currElement
Store the current and next element in the trace.
Definition: generators.hh:624
bool isWrite() const
Definition: packet.hh:189
MemCmd cmd
Specifies if the request is to be a read or a write.
Definition: generators.hh:508
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:83
PacketPtr getNextPacket()
Get the next generated packet.
Definition: generators.cc:247
#define warn(...)
Definition: misc.hh:219
void enter()
Enter this generator state.
Definition: generators.cc:479
const MasterID masterID
The MasterID used for generating requests.
Definition: generators.hh:72
const Addr dataLimit
Maximum amount of data to manipulate.
Definition: generators.hh:300
const Tick MaxTick
Definition: types.hh:65
Tick curTick()
The current simulated tick.
Definition: core.hh:47
Addr nextAddr
Address of next request.
Definition: generators.hh:226
const Addr blocksize
Blocksize and address increment.
Definition: generators.hh:211
void exit()
Exit this generator state.
Definition: generators.cc:528
const unsigned int blockBits
Number of block bits in DRAM address.
Definition: generators.hh:402
The traffic generator is a master module that generates stimuli for the memory system, based on a collection of simple generator behaviours that are either probabilistic or based on traces.
Definition: traffic_gen.hh:61
This struct stores a line in the trace file.
Definition: generators.hh:505
uint64_t Tick
Tick count type.
Definition: types.hh:63
Request::FlagsType flags
Potential request flags to use.
Definition: generators.hh:520
void replaceBits(T &val, int first, int last, B bit_val)
A convenience function to replace bits first to last of val with bit_val in place.
Definition: bitfield.hh:145
const unsigned int nbrOfBanksUtil
Number of banks to be utilized for a given configuration.
Definition: generators.hh:408
Tick nextPacketTick(bool elastic, Tick delay) const
Returns the tick when the next request should be generated.
Definition: generators.cc:456
void enter()
Enter this generator state.
Definition: generators.cc:80
const unsigned int pageBits
Number of page bits in DRAM address.
Definition: generators.hh:396
Addr blocksize
The size of the access for the request.
Definition: generators.hh:514
Tick nextPacketTick(bool elastic, Tick delay) const
Determine the tick when the next packet is available.
Definition: generators.cc:384
const unsigned int rankBits
Number of rank bits in DRAM address.
Definition: generators.hh:414
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
uint16_t MasterID
Definition: request.hh:85
const unsigned int nbrOfRanks
Number of ranks to be utilized for a given configuration.
Definition: generators.hh:417
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:245
InputStream trace
Input stream used for reading the input trace file.
Definition: generators.hh:621
Addr addrOffset
Offset for memory requests.
Definition: generators.hh:638
const Addr endAddr
End of address range.
Definition: generators.hh:285
Addr addr
The address for the request.
Definition: generators.hh:511
bool isValid() const
Check validity of this element.
Definition: generators.hh:527
PacketPtr getNextPacket()
Get the next generated packet.
Definition: generators.cc:183
Addr dataManipulated
Counter to determine the amount of data manipulated.
Definition: generators.hh:233
TraceElement nextElement
Definition: generators.hh:625
int size()
Definition: pagetable.hh:146
const uint8_t readPercent
Percent of generated transactions that should be reads.
Definition: generators.hh:220
Addr addr
Address of request.
Definition: generators.hh:387
Tick tickOffset
Stores the time when the state was entered.
Definition: generators.hh:632
Random random_mt
Definition: random.cc:100
PacketPtr getNextPacket()
Get the next generated packet.
Definition: generators.cc:88
void dataDynamic(T *p)
Set the data pointer to a value that should have delete [] called on it.
Definition: packet.hh:947
const unsigned int pageSize
Page size of DRAM.
Definition: generators.hh:393
const Addr startAddr
Start of address range.
Definition: generators.hh:282
const unsigned int maxSeqCountPerRank
Number of command series issued before the rank is changed.
Definition: generators.hh:484
unsigned getSize() const
Definition: request.hh:552
bool isRead() const
Definition: packet.hh:188
void reset()
Reset the stream such that it can be played once again.
Definition: generators.cc:432
Command cmd
Definition: packet.hh:178
const FlagsType init
This Stat is Initialized.
Definition: info.hh:45
Addr dataManipulated
Counter to determine the amount of data manipulated.
Definition: generators.hh:307
ProbePointArg< PacketInfo > Packet
Packet probe point.
Definition: mem.hh:102

Generated on Fri Jun 9 2017 13:03:44 for gem5 by doxygen 1.8.6