52#include "enums/OpClass.hh"
53#include "params/BaseO3CPU.hh"
84 return "Functional unit completion";
88 const BaseO3CPUParams ¶ms)
102 const auto ®_classes = params.isa[0]->regClasses();
105 numPhysRegs = params.numPhysIntRegs + params.numPhysFloatRegs +
106 params.numPhysVecRegs +
107 params.numPhysVecRegs * (
110 params.numPhysVecPredRegs +
111 params.numPhysMatRegs +
112 params.numPhysCCRegs;
130 if (
iqPolicy == SMTQueuePolicy::Dynamic) {
136 }
else if (
iqPolicy == SMTQueuePolicy::Partitioned) {
145 DPRINTF(IQ,
"IQ sharing policy set to Partitioned:"
146 "%i entries per thread.\n",part_amt);
147 }
else if (
iqPolicy == SMTQueuePolicy::Threshold) {
148 double threshold = (double)params.smtIQThreshold / 100;
150 int thresholdIQ = (int)((
double)threshold *
numEntries);
157 DPRINTF(IQ,
"IQ sharing policy set to Threshold:"
158 "%i entries per thread.\n",thresholdIQ);
169 cprintf(
"Nodes traversed: %i, removed: %i\n",
177 return cpu->name() +
".iq";
183 "Number of instructions added to the IQ (excludes non-spec)"),
185 "Number of non-speculative instructions added to the IQ"),
187 "Number of instructions issued"),
189 "Number of integer instructions issued"),
191 "Number of float instructions issued"),
193 "Number of branch instructions issued"),
195 "Number of memory instructions issued"),
197 "Number of miscellaneous instructions issued"),
199 "Number of squashed instructions issued"),
201 "Number of squashed instructions iterated over during squash; "
202 "mainly for profiling"),
204 "Number of squashed operands that are examined and possibly "
205 "removed from graph"),
207 "Number of squashed non-spec instructions that were removed"),
209 "Number of insts issued each cycle"),
211 "attempts to use FU when none available"),
213 "Number of instructions issued per FU type, per thread"),
220 "FU busy rate (busy events/executed inst)")
269 .init(0,total_width,1)
284 .init(
cpu->numThreads,enums::Num_OpClass)
318 .init(
cpu->numThreads)
331 "Number of integer instruction queue reads"),
333 "Number of integer instruction queue writes"),
335 "Number of integer instruction queue wakeup accesses"),
337 "Number of floating instruction queue reads"),
339 "Number of floating instruction queue writes"),
341 "Number of floating instruction queue wakeup accesses"),
343 "Number of vector instruction queue reads"),
345 "Number of vector instruction queue writes"),
347 "Number of vector instruction queue wakeup accesses"),
349 "Number of integer alu accesses"),
351 "Number of floating point alu accesses"),
353 "Number of vector alu accesses")
482 if (
iqPolicy == SMTQueuePolicy::Partitioned) {
497 if (
iqPolicy == SMTQueuePolicy::Partitioned) {
499 }
else if (
iqPolicy == SMTQueuePolicy::Threshold &&
500 active_threads == 1) {
560 if (new_inst->isFloating()) {
562 }
else if (new_inst->isVector()) {
570 DPRINTF(IQ,
"Adding instruction [sn:%llu] PC %s to the IQ.\n",
571 new_inst->seqNum, new_inst->pcState());
575 instList[new_inst->threadNumber].push_back(new_inst);
589 if (new_inst->isMemRef()) {
590 memDepUnit[new_inst->threadNumber].insert(new_inst);
597 count[new_inst->threadNumber]++;
607 if (new_inst->isFloating()) {
609 }
else if (new_inst->isVector()) {
619 DPRINTF(IQ,
"Adding non-speculative instruction [sn:%llu] PC %s "
621 new_inst->seqNum, new_inst->pcState());
625 instList[new_inst->threadNumber].push_back(new_inst);
637 if (new_inst->isMemRef()) {
638 memDepUnit[new_inst->threadNumber].insertNonSpec(new_inst);
643 count[new_inst->threadNumber]++;
651 memDepUnit[barr_inst->threadNumber].insertBarrier(barr_inst);
662 if (inst->isFloating()) {
664 }
else if (inst->isVector()) {
686 while (list_it != list_end_it) {
687 if ((*list_it).oldestInst > queue_entry.
oldestInst) {
707 OpClass op_class = (*list_order_it).
queueType;
716 (*next_it).oldestInst < queue_entry.
oldestInst) {
726 DPRINTF(IQ,
"Processing FU completion [sn:%llu]\n", inst->seqNum);
727 assert(!
cpu->switchedOut());
734 fuPool->freeUnitNextCycle(fu_idx);
749 DPRINTF(IQ,
"Attempting to schedule ready instructions from "
772 int total_issued = 0;
776 while (total_issued <
totalWidth && order_it != order_end_it) {
777 OpClass op_class = (*order_it).queueType;
783 if (issuing_inst->isFloating()) {
785 }
else if (issuing_inst->isVector()) {
791 assert(issuing_inst->seqNum == (*order_it).oldestInst);
793 if (issuing_inst->isSquashed()) {
812 ThreadID tid = issuing_inst->threadNumber;
814 if (op_class != No_OpClass) {
815 idx =
fuPool->getUnit(op_class);
816 if (issuing_inst->isFloating()) {
818 }
else if (issuing_inst->isVector()) {
824 op_latency =
fuPool->getOpLatency(op_class);
832 if (op_latency ==
Cycles(1)) {
839 fuPool->freeUnitNextCycle(idx);
848 issuing_inst->setNoCapableFU();
851 bool pipelined =
fuPool->isPipelined(op_class);
857 cpu->schedule(execution,
866 fuPool->freeUnitNextCycle(idx);
870 DPRINTF(IQ,
"Thread %i: Issuing instruction PC %s "
872 tid, issuing_inst->pcState(),
873 issuing_inst->seqNum);
884 issuing_inst->setIssued();
888 issuing_inst->issueTick =
curTick() - issuing_inst->fetchTick;
891 if (issuing_inst->firstIssue == -1)
892 issuing_inst->firstIssue =
curTick();
894 if (!issuing_inst->isMemRef()) {
899 issuing_inst->clearInIQ();
905 iqStats.statIssuedInstType[tid][op_class]++;
908 iqStats.statFuBusy[op_class]++;
914 iqStats.numIssuedDist.sample(total_issued);
915 iqStats.instsIssued+= total_issued;
922 cpu->activityThisCycle();
924 DPRINTF(IQ,
"Not able to schedule any instructions.\n");
931 DPRINTF(IQ,
"Marking nonspeculative instruction [sn:%llu] as ready "
932 "to execute.\n", inst);
938 ThreadID tid = (*inst_it).second->threadNumber;
940 (*inst_it).second->setAtCommit();
942 (*inst_it).second->setCanIssue();
944 if (!(*inst_it).second->isMemRef()) {
947 memDepUnit[tid].nonSpecInstReady((*inst_it).second);
950 (*inst_it).second = NULL;
958 DPRINTF(IQ,
"[tid:%i] Committing instructions older than [sn:%llu]\n",
963 while (iq_it !=
instList[tid].end() &&
964 (*iq_it)->seqNum <= inst) {
978 if (completed_inst->isFloating()) {
980 }
else if (completed_inst->isVector()) {
986 completed_inst->lastWakeDependents =
curTick();
988 DPRINTF(IQ,
"Waking dependents of completed instruction.\n");
990 assert(!completed_inst->isSquashed());
995 ThreadID tid = completed_inst->threadNumber;
996 if (completed_inst->isMemRef()) {
999 DPRINTF(IQ,
"Completing mem instruction PC: %s [sn:%llu]\n",
1000 completed_inst->pcState(), completed_inst->seqNum);
1003 completed_inst->memOpDone(
true);
1005 }
else if (completed_inst->isReadBarrier() ||
1006 completed_inst->isWriteBarrier()) {
1008 memDepUnit[tid].completeInst(completed_inst);
1011 for (
int dest_reg_idx = 0;
1012 dest_reg_idx < completed_inst->numDestRegs();
1016 completed_inst->renamedDestIdx(dest_reg_idx);
1021 DPRINTF(IQ,
"Reg %d [%s] is part of a fix mapping, skipping\n",
1029 completed_inst->setPinnedRegsWritten();
1032 DPRINTF(IQ,
"Reg %d [%s] is pinned, skipping\n",
1037 DPRINTF(IQ,
"Waking any dependents on register %i (%s).\n",
1046 DPRINTF(IQ,
"Waking up a dependent instruction, [sn:%llu] "
1047 "PC %s.\n", dep_inst->seqNum, dep_inst->pcState());
1053 dep_inst->markSrcRegReady();
1076 OpClass op_class = ready_inst->opClass();
1085 (*
readyIt[op_class]).oldestInst) {
1090 DPRINTF(IQ,
"Instruction is ready to issue, putting it onto "
1091 "the ready list, PC %s opclass:%i [sn:%llu].\n",
1092 ready_inst->pcState(), op_class, ready_inst->seqNum);
1098 DPRINTF(IQ,
"Rescheduling mem inst [sn:%llu]\n", resched_inst->seqNum);
1101 resched_inst->translationStarted(
false);
1102 resched_inst->translationCompleted(
false);
1104 resched_inst->clearCanIssue();
1105 memDepUnit[resched_inst->threadNumber].reschedule(resched_inst);
1111 memDepUnit[replay_inst->threadNumber].replay();
1123 blocked_inst->clearIssued();
1124 blocked_inst->clearCanIssue();
1126 DPRINTF(IQ,
"Memory inst [sn:%llu] PC %s is blocked, will be "
1127 "reissued later\n", blocked_inst->seqNum,
1128 blocked_inst->pcState());
1140 DPRINTF(IQ,
"Cache is unblocked, rescheduling blocked memory "
1152 if ((*it)->translationCompleted() || (*it)->isSquashed()) {
1178 memDepUnit[store->threadNumber].violation(store, faulting_load);
1184 DPRINTF(IQ,
"[tid:%i] Starting to squash instructions in "
1204 DPRINTF(IQ,
"[tid:%i] Squashing until sequence number %i!\n",
1209 while (squash_it !=
instList[tid].end() &&
1213 if (squashed_inst->isFloating()) {
1215 }
else if (squashed_inst->isVector()) {
1223 if (squashed_inst->threadNumber != tid ||
1224 squashed_inst->isSquashedInIQ()) {
1229 if (!squashed_inst->isIssued() ||
1230 (squashed_inst->isMemRef() &&
1231 !squashed_inst->memOpDone())) {
1233 DPRINTF(IQ,
"[tid:%i] Instruction [sn:%llu] PC %s squashed.\n",
1234 tid, squashed_inst->seqNum, squashed_inst->pcState());
1236 bool is_acq_rel = squashed_inst->isFullMemBarrier() &&
1237 (squashed_inst->isLoad() ||
1238 (squashed_inst->isStore() &&
1239 !squashed_inst->isStoreConditional()));
1243 (!squashed_inst->isNonSpeculative() &&
1244 !squashed_inst->isStoreConditional() &&
1245 !squashed_inst->isAtomic() &&
1246 !squashed_inst->isReadBarrier() &&
1247 !squashed_inst->isWriteBarrier())) {
1249 for (
int src_reg_idx = 0;
1250 src_reg_idx < squashed_inst->numSrcRegs();
1254 squashed_inst->renamedSrcIdx(src_reg_idx);
1265 if (!squashed_inst->readySrcIdx(src_reg_idx) &&
1271 ++
iqStats.squashedOperandsExamined;
1274 }
else if (!squashed_inst->isStoreConditional() ||
1275 !squashed_inst->isCompleted()) {
1286 assert(squashed_inst->getFault() !=
NoFault ||
1287 squashed_inst->isMemRef());
1290 (*ns_inst_it).second = NULL;
1294 ++
iqStats.squashedNonSpecRemoved;
1301 squashed_inst->setSquashedInIQ();
1305 squashed_inst->setIssued();
1306 squashed_inst->setCanCommit();
1307 squashed_inst->clearInIQ();
1310 count[squashed_inst->threadNumber]--;
1322 for (
int dest_reg_idx = 0;
1323 dest_reg_idx < squashed_inst->numDestRegs();
1327 squashed_inst->renamedDestIdx(dest_reg_idx);
1335 ++
iqStats.squashedInstsExamined;
1343 return lhs->seqNum > rhs->seqNum;
1351 int8_t total_src_regs = new_inst->numSrcRegs();
1352 bool return_val =
false;
1354 for (
int src_reg_idx = 0;
1355 src_reg_idx < total_src_regs;
1359 if (!new_inst->readySrcIdx(src_reg_idx)) {
1360 PhysRegIdPtr src_reg = new_inst->renamedSrcIdx(src_reg_idx);
1369 DPRINTF(IQ,
"Instruction PC %s has src reg %i (%s) that "
1370 "is being added to the dependency chain.\n",
1371 new_inst->pcState(), src_reg->
index(),
1380 DPRINTF(IQ,
"Instruction PC %s has src reg %i (%s) that "
1381 "became ready before it reached the IQ.\n",
1382 new_inst->pcState(), src_reg->
index(),
1385 new_inst->markSrcRegReady(src_reg_idx);
1400 int8_t total_dest_regs = new_inst->numDestRegs();
1402 for (
int dest_reg_idx = 0;
1403 dest_reg_idx < total_dest_regs;
1406 PhysRegIdPtr dest_reg = new_inst->renamedDestIdx(dest_reg_idx);
1416 panic(
"Dependency graph %i (%s) (flat: %i) not empty!",
1433 if (inst->readyToIssue()) {
1436 if (inst->isMemRef()) {
1438 DPRINTF(IQ,
"Checking if memory instruction can issue.\n");
1442 memDepUnit[inst->threadNumber].regsReady(inst);
1447 OpClass op_class = inst->opClass();
1449 DPRINTF(IQ,
"Instruction is ready to issue, putting it onto "
1450 "the ready list, PC %s opclass:%i [sn:%llu].\n",
1451 inst->pcState(), op_class, inst->seqNum);
1460 (*
readyIt[op_class]).oldestInst) {
1487 cprintf(
"Non speculative list: ");
1489 while (non_spec_it != non_spec_end_it) {
1490 cprintf(
"%s [sn:%llu]", (*non_spec_it).second->pcState(),
1491 (*non_spec_it).second->seqNum);
1503 while (list_order_it != list_order_end_it) {
1504 cprintf(
"%i OpClass:%i [sn:%llu] ",
i, (*list_order_it).queueType,
1505 (*list_order_it).oldestInst);
1523 while (inst_list_it !=
instList[tid].end()) {
1524 cprintf(
"Instruction:%i\n", num);
1525 if (!(*inst_list_it)->isSquashed()) {
1526 if (!(*inst_list_it)->isIssued()) {
1528 cprintf(
"Count:%i\n", valid_num);
1529 }
else if ((*inst_list_it)->isMemRef() &&
1530 !(*inst_list_it)->memOpDone()) {
1534 cprintf(
"Count:%i\n", valid_num);
1538 cprintf(
"PC: %s\n[sn:%llu]\n[tid:%i]\n"
1539 "Issued:%i\nSquashed:%i\n",
1540 (*inst_list_it)->pcState(),
1541 (*inst_list_it)->seqNum,
1542 (*inst_list_it)->threadNumber,
1543 (*inst_list_it)->isIssued(),
1544 (*inst_list_it)->isSquashed());
1546 if ((*inst_list_it)->isMemRef()) {
1547 cprintf(
"MemOpDone:%i\n", (*inst_list_it)->memOpDone());
1557 cprintf(
"Insts to Execute list:\n");
1567 if (!(*inst_list_it)->isSquashed()) {
1568 if (!(*inst_list_it)->isIssued()) {
1570 cprintf(
"Count:%i\n", valid_num);
1571 }
else if ((*inst_list_it)->isMemRef() &&
1572 !(*inst_list_it)->memOpDone()) {
1576 cprintf(
"Count:%i\n", valid_num);
1580 cprintf(
"PC: %s\n[sn:%llu]\n[tid:%i]\n"
1581 "Issued:%i\nSquashed:%i\n",
1582 (*inst_list_it)->pcState(),
1583 (*inst_list_it)->seqNum,
1584 (*inst_list_it)->threadNumber,
1585 (*inst_list_it)->isIssued(),
1586 (*inst_list_it)->isSquashed());
1588 if ((*inst_list_it)->isMemRef()) {
1589 cprintf(
"MemOpDone:%i\n", (*inst_list_it)->memOpDone());
Cycles is a wrapper class for representing cycle counts, i.e.
static const FlagsType AutoDelete
Event(Priority p=Default_Pri, Flags f=0)
const RegIndex & flatIndex() const
Flat index accessor.
constexpr RegIndex index() const
Visible RegId methods.
int getNumPinnedWritesToComplete() const
void decrNumPinnedWritesToComplete()
constexpr const char * className() const
Return a const char* with the register class name.
bool isFixedMapping() const
Returns true if this register is always associated to the same architectural register.
O3CPU class, has each of the stages (fetch through commit) within it, as well as all of the time buff...
static constexpr auto NoCapableFU
Instruction asked for a FU but this FUPool does not have a FU for this instruction op type.
static constexpr auto NoFreeFU
Instruction asked for a FU but all FU for this op type have already been allocated to other instructi...
static constexpr auto NoNeedFU
Named constants to differentiate cases where an instruction asked the FUPool for a free FU but did no...
IEW handles both single threaded and SMT IEW (issue/execute/writeback).
FU completion event class.
bool freeFU
Should the FU be added to the list to be freed upon completing this event.
FUCompletion(const DynInstPtr &_inst, int fu_idx, InstructionQueue *iq_ptr)
Construct a FU completion event.
DynInstPtr inst
Executing instruction.
int fuIdx
Index of the FU used for executing.
InstructionQueue * iqPtr
Pointer back to the instruction queue.
virtual const char * description() const
Return a C string describing the event.
std::string name() const
Returns the name of the IQ.
void commit(const InstSeqNum &inst, ThreadID tid=0)
Commits all instructions up to and including the given sequence number, for a specific thread.
gem5::o3::InstructionQueue::IQStats iqStats
void processFUCompletion(const DynInstPtr &inst, int fu_idx)
Process FU completion event.
DynInstPtr getBlockedMemInstToExecute()
Gets a memory instruction that was blocked on the cache.
std::list< DynInstPtr > instList[MaxThreads]
List of all the instructions in the IQ (some of which may be issued).
void retryMemInst(const DynInstPtr &retry_inst)
Retries a memory instruction in the next cycle.
std::list< DynInstPtr > retryMemInsts
List of instructions that were cache blocked, but a retry has been seen since, so they can now be ret...
void deferMemInst(const DynInstPtr &deferred_inst)
Defers a memory instruction when its DTB translation incurs a hw page table walk.
ReadyInstQueue readyInsts[Num_OpClasses]
List of ready instructions, per op class.
unsigned totalWidth
The total number of instructions that can be issued in one cycle.
void addIfReady(const DynInstPtr &inst)
Moves an instruction to the ready queue if it is ready.
unsigned numEntries
The number of entries in the instruction queue.
void insertBarrier(const DynInstPtr &barr_inst)
Inserts a memory or write barrier into the IQ to make sure loads and stores are ordered properly.
bool queueOnList[Num_OpClasses]
Tracks if each ready queue is on the age order list.
FUPool * fuPool
Function unit pool.
int wakeDependents(const DynInstPtr &completed_inst)
Wakes all dependents of a completed instruction.
std::list< DynInstPtr > deferredMemInsts
List of instructions waiting for their DTB translation to complete (hw page table walk in progress).
TimeBuffer< IssueStruct > * issueToExecuteQueue
The queue to the execute stage.
std::list< DynInstPtr > instsToExecute
List of instructions that are ready to be executed.
void setTimeBuffer(TimeBuffer< TimeStruct > *tb_ptr)
Sets the global time buffer.
unsigned numFreeEntries()
Returns total number of free entries.
std::list< DynInstPtr > blockedMemInsts
List of instructions that have been cache blocked.
void rescheduleMemInst(const DynInstPtr &resched_inst)
Reschedules a memory instruction.
TimeBuffer< TimeStruct >::wire fromCommit
Wire to read information from timebuffer.
void insertNonSpec(const DynInstPtr &new_inst)
Inserts a new, non-speculative instruction into the IQ.
void addReadyMemInst(const DynInstPtr &ready_inst)
Adds a ready memory instruction to the ready list.
void replayMemInst(const DynInstPtr &replay_inst)
Replays a memory instruction.
void resetState()
Resets all instruction queue state.
bool isDrained() const
Determine if we are drained.
unsigned count[MaxThreads]
Per Thread IQ count.
void cacheUnblocked()
Notify instruction queue that a previous blockage has resolved.
std::map< InstSeqNum, DynInstPtr > nonSpecInsts
List of non-speculative instructions that will be scheduled once the IQ gets a signal from commit.
unsigned freeEntries
Number of free IQ entries left.
MemDepUnit memDepUnit[MaxThreads]
The memory dependence unit, which tracks/predicts memory dependences between instructions.
void dumpLists()
Debugging function to dump all the list sizes, as well as print out the list of nonspeculative instru...
void blockMemInst(const DynInstPtr &blocked_inst)
Defers a memory instruction when it is cache blocked.
void drainSanityCheck() const
Perform sanity checks after a drain.
unsigned numPhysRegs
The number of physical registers in the CPU.
DynInstPtr getDeferredMemInstToExecute()
Gets a memory instruction that was referred due to a delayed DTB translation if it is now ready to ex...
void dumpInsts()
Debugging function to dump out all instructions that are in the IQ.
void takeOverFrom()
Takes over execution from another CPU's thread.
SMTQueuePolicy iqPolicy
IQ sharing policy for SMT.
gem5::o3::InstructionQueue::IQIOStats iqIOStats
void moveToYoungerInst(ListOrderIt age_order_it)
Called when the oldest instruction has been removed from a ready queue; this places that ready queue ...
InstructionQueue(CPU *cpu_ptr, IEW *iew_ptr, const BaseO3CPUParams ¶ms)
Constructs an IQ.
InstSeqNum squashedSeqNum[MaxThreads]
The sequence number of the squashed instruction.
void violation(const DynInstPtr &store, const DynInstPtr &faulting_load)
Indicates an ordering violation between a store and a load.
std::list< DynInstPtr >::iterator ListIt
bool hasReadyInsts()
Returns if there are any ready instructions in the IQ.
Cycles commitToIEWDelay
Delay between commit stage and the IQ.
void resetEntries()
Resets max entries for all threads.
int countInsts()
Debugging function to count how many entries are in the IQ.
std::list< ThreadID > * activeThreads
Pointer to list of active threads.
std::list< ListOrderEntry >::iterator ListOrderIt
void setActiveThreads(std::list< ThreadID > *at_ptr)
Sets active threads list.
void addToOrderList(OpClass op_class)
Add an op class to the age order list.
ThreadID numThreads
Number of Total Threads.
TimeBuffer< TimeStruct > * timeBuffer
The backwards time buffer.
void scheduleNonSpec(const InstSeqNum &inst)
Schedules a single specific non-speculative instruction.
std::vector< bool > regScoreboard
A cache of the recently woken registers.
void scheduleReadyInsts()
Schedules ready instructions, adding the ready ones (oldest first) to the queue to execute.
bool isFull()
Returns whether or not the IQ is full.
void squash(ThreadID tid)
Squashes instructions for a thread.
IEW * iewStage
Pointer to IEW stage.
std::list< ListOrderEntry > listOrder
List that contains the age order of the oldest instruction of each ready queue.
~InstructionQueue()
Destructs the IQ.
void doSquash(ThreadID tid)
Does the actual squashing.
void setIssueToExecuteQueue(TimeBuffer< IssueStruct > *i2eQueue)
Sets the timer buffer between issue and execute.
int wbOutstanding
Number of instructions currently in flight to FUs.
void insert(const DynInstPtr &new_inst)
Inserts a new instruction into the IQ.
unsigned maxEntries[MaxThreads]
Max IQ Entries Per Thread.
CPU * cpu
Pointer to the CPU.
bool addToDependents(const DynInstPtr &new_inst)
Adds an instruction to the dependency graph, as a consumer.
int entryAmount(ThreadID num_threads)
Number of entries needed for given amount of threads.
DynInstPtr getInstToExecute()
Returns the oldest scheduled instruction, and removes it from the list of instructions waiting to exe...
DependencyGraph< DynInstPtr > dependGraph
ListOrderIt readyIt[Num_OpClasses]
Iterators of each ready queue.
void addToProducers(const DynInstPtr &new_inst)
Adds an instruction to the dependency graph, as a producer.
std::map< InstSeqNum, DynInstPtr >::iterator NonSpecMapIt
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
static const Priority Stat_Event_Pri
Statistics events (dump, reset, etc.) come after everything else, but before exit.
#define panic(...)
This implements a cprintf based panic() function.
static constexpr int MaxThreads
RefCountingPtr< DynInst > DynInstPtr
const FlagsType pdf
Print the percent of the total that this entry represents.
const FlagsType total
Print the total.
const FlagsType dist
Print the distribution.
Copyright (c) 2024 Arm Limited All rights reserved.
int16_t ThreadID
Thread index/ID type.
static const OpClass Num_OpClasses
void cprintf(const char *format, const Args &...args)
Tick curTick()
The universal simulation clock.
constexpr decltype(nullptr) NoFault
@ VecRegClass
Vector Register.
@ VecElemClass
Vector Register Native Elem lane.
statistics::Scalar intInstQueueReads
statistics::Scalar vecInstQueueWrites
statistics::Scalar fpInstQueueWrites
statistics::Scalar fpInstQueueReads
statistics::Scalar vecInstQueueReads
statistics::Scalar vecAluAccesses
statistics::Scalar intAluAccesses
statistics::Scalar vecInstQueueWakeupAccesses
statistics::Scalar intInstQueueWakeupAccesses
statistics::Scalar intInstQueueWrites
IQIOStats(statistics::Group *parent)
statistics::Scalar fpAluAccesses
statistics::Scalar fpInstQueueWakeupAccesses
statistics::Vector2d statIssuedInstType
Stat for total number issued for each instruction type.
statistics::Scalar floatInstsIssued
Stat for number of floating point instructions issued.
statistics::Vector fuBusy
Number of times the FU was busy.
statistics::Scalar instsAdded
Stat for number of instructions added.
statistics::Distribution numIssuedDist
Distribution of number of instructions in the queue.
statistics::Scalar nonSpecInstsAdded
Stat for number of non-speculative instructions added.
statistics::Scalar squashedInstsExamined
Stat for number of squashed instructions examined when squashing.
statistics::Scalar miscInstsIssued
Stat for number of miscellaneous instructions issued.
statistics::Scalar branchInstsIssued
Stat for number of branch instructions issued.
statistics::Formula fuBusyRate
Number of times the FU was busy per instruction issued.
statistics::Scalar memInstsIssued
Stat for number of memory instructions issued.
statistics::Scalar intInstsIssued
Stat for number of integer instructions issued.
statistics::Scalar instsIssued
statistics::Formula issueRate
Number of instructions issued per cycle.
IQStats(CPU *cpu, const unsigned &total_width)
statistics::Scalar squashedOperandsExamined
Stat for number of squashed instruction operands examined when squashing.
statistics::Scalar squashedInstsIssued
Stat for number of squashed instructions that were ready to issue.
statistics::Vector statFuBusy
Distribution of the cycles it takes to issue an instruction.
statistics::Scalar squashedNonSpecRemoved
Stat for number of non-speculative instructions removed due to a squash.
Entry for the list age ordering by op class.
bool operator()(const DynInstPtr &lhs, const DynInstPtr &rhs) const