bool
DefaultIEW<Impl>::isDrained() const
{
- bool drained(ldstQueue.isDrained());
+ bool drained = ldstQueue.isDrained() && instQueue.isDrained();
for (ThreadID tid = 0; tid < numThreads; tid++) {
if (!insts[tid].empty()) {
/** Sets the global time buffer. */
void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr);
+ /** Determine if we are drained. */
+ bool isDrained() const;
+
/** Perform sanity checks after a drain. */
void drainSanityCheck() const;
fromCommit = timeBuffer->getWire(-commitToIEWDelay);
}
+template <class Impl>
+bool
+InstructionQueue<Impl>::isDrained() const
+{
+ bool drained = dependGraph.empty() && instsToExecute.empty();
+ for (ThreadID tid = 0; tid < numThreads; ++tid)
+ drained = drained && memDepUnit[tid].isDrained();
+
+ return drained;
+}
+
template <class Impl>
void
InstructionQueue<Impl>::drainSanityCheck() const
/** Registers statistics. */
void regStats();
+ /** Determine if we are drained. */
+ bool isDrained() const;
+
/** Perform sanity checks after a drain. */
void drainSanityCheck() const;
.desc("Number of conflicting stores.");
}
+template <class MemDepPred, class Impl>
+bool
+MemDepUnit<MemDepPred, Impl>::isDrained() const
+{
+ bool drained = instsToReplay.empty()
+ && memDepHash.empty()
+ && instsToReplay.empty();
+ for (int i = 0; i < Impl::MaxThreads; ++i)
+ drained = drained && instList[i].empty();
+
+ return drained;
+}
+
template <class MemDepPred, class Impl>
void
MemDepUnit<MemDepPred, Impl>::drainSanityCheck() const