Record numCycles properly.

src/cpu/simple/timing.cc:
    Record numCycles stat properly.
src/cpu/simple/timing.hh:
    Extra variable to help record numCycles stat.

--HG--
extra : convert_revision : 343311902831820264878aad41dc619999726b6b
This commit is contained in:
Kevin Lim 2006-10-08 00:55:05 -04:00
parent d48ea81ba2
commit b17421da20
2 changed files with 31 additions and 0 deletions

View file

@ -100,6 +100,7 @@ TimingSimpleCPU::TimingSimpleCPU(Params *p)
ifetch_pkt = dcache_pkt = NULL; ifetch_pkt = dcache_pkt = NULL;
drainEvent = NULL; drainEvent = NULL;
fetchEvent = NULL; fetchEvent = NULL;
previousTick = 0;
changeState(SimObject::Running); changeState(SimObject::Running);
} }
@ -158,6 +159,7 @@ TimingSimpleCPU::resume()
assert(system->getMemoryMode() == System::Timing); assert(system->getMemoryMode() == System::Timing);
changeState(SimObject::Running); changeState(SimObject::Running);
previousTick = curTick;
} }
void void
@ -165,6 +167,7 @@ TimingSimpleCPU::switchOut()
{ {
assert(status() == Running || status() == Idle); assert(status() == Running || status() == Idle);
_status = SwitchedOut; _status = SwitchedOut;
numCycles += curTick - previousTick;
// If we've been scheduled to resume but are then told to switch out, // If we've been scheduled to resume but are then told to switch out,
// we'll need to cancel it. // we'll need to cancel it.
@ -187,6 +190,23 @@ TimingSimpleCPU::takeOverFrom(BaseCPU *oldCPU)
break; break;
} }
} }
Port *peer;
if (icachePort.getPeer() == NULL) {
peer = oldCPU->getPort("icachePort")->getPeer();
icachePort.setPeer(peer);
} else {
peer = icachePort.getPeer();
}
peer->setPeer(&icachePort);
if (dcachePort.getPeer() == NULL) {
peer = oldCPU->getPort("dcachePort")->getPeer();
dcachePort.setPeer(peer);
} else {
peer = dcachePort.getPeer();
}
peer->setPeer(&dcachePort);
} }
@ -414,6 +434,9 @@ TimingSimpleCPU::fetch()
// fetch fault: advance directly to next instruction (fault handler) // fetch fault: advance directly to next instruction (fault handler)
advanceInst(fault); advanceInst(fault);
} }
numCycles += curTick - previousTick;
previousTick = curTick;
} }
@ -444,6 +467,9 @@ TimingSimpleCPU::completeIfetch(Packet *pkt)
delete pkt->req; delete pkt->req;
delete pkt; delete pkt;
numCycles += curTick - previousTick;
previousTick = curTick;
if (getState() == SimObject::Draining) { if (getState() == SimObject::Draining) {
completeDrain(); completeDrain();
return; return;
@ -516,6 +542,9 @@ TimingSimpleCPU::completeDataAccess(Packet *pkt)
assert(_status == DcacheWaitResponse); assert(_status == DcacheWaitResponse);
_status = Running; _status = Running;
numCycles += curTick - previousTick;
previousTick = curTick;
if (getState() == SimObject::Draining) { if (getState() == SimObject::Draining) {
completeDrain(); completeDrain();

View file

@ -166,6 +166,8 @@ class TimingSimpleCPU : public BaseSimpleCPU
Packet *ifetch_pkt; Packet *ifetch_pkt;
Packet *dcache_pkt; Packet *dcache_pkt;
Tick previousTick;
public: public:
virtual Port *getPort(const std::string &if_name, int idx = -1); virtual Port *getPort(const std::string &if_name, int idx = -1);