Fixes for draining.
src/cpu/simple/timing.cc: Update for changed return values. src/python/m5/__init__.py: Loop in order to make sure all objects are really drained. Objects may become undrained as other objects become drained (e.g. a bus-bridge has a packet, while a bus is empty, and the first drain() will cause the bus-bridge to give the packet to the bus). The only case we know every object is actually drained is if they all return immediately that they are drained. --HG-- extra : convert_revision : 80057a1d6d30381bd0b67b23549bd202f447c5cb
This commit is contained in:
parent
c8a37ce715
commit
8ae4f45bc4
|
@ -118,11 +118,11 @@ TimingSimpleCPU::drain(Event *drain_event)
|
||||||
// an access to complete.
|
// an access to complete.
|
||||||
if (status() == Idle || status() == Running || status() == SwitchedOut) {
|
if (status() == Idle || status() == Running || status() == SwitchedOut) {
|
||||||
changeState(SimObject::DrainedTiming);
|
changeState(SimObject::DrainedTiming);
|
||||||
return false;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
changeState(SimObject::Draining);
|
changeState(SimObject::Draining);
|
||||||
drainEvent = drain_event;
|
drainEvent = drain_event;
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -213,14 +213,28 @@ atexit.register(cc_main.doExitCleanup)
|
||||||
# matter since most scripts will probably 'from m5.objects import *'.
|
# matter since most scripts will probably 'from m5.objects import *'.
|
||||||
import objects
|
import objects
|
||||||
|
|
||||||
|
# This loops until all objects have been fully drained.
|
||||||
def doDrain(root):
|
def doDrain(root):
|
||||||
|
all_drained = drain(root)
|
||||||
|
while (not all_drained):
|
||||||
|
all_drained = drain(root)
|
||||||
|
|
||||||
|
# Tries to drain all objects. Draining might not be completed unless
|
||||||
|
# all objects return that they are drained on the first call. This is
|
||||||
|
# because as objects drain they may cause other objects to no longer
|
||||||
|
# be drained.
|
||||||
|
def drain(root):
|
||||||
|
all_drained = False
|
||||||
drain_event = cc_main.createCountedDrain()
|
drain_event = cc_main.createCountedDrain()
|
||||||
unready_objects = root.startDrain(drain_event, True)
|
unready_objects = root.startDrain(drain_event, True)
|
||||||
# If we've got some objects that can't drain immediately, then simulate
|
# If we've got some objects that can't drain immediately, then simulate
|
||||||
if unready_objects > 0:
|
if unready_objects > 0:
|
||||||
drain_event.setCount(unready_objects)
|
drain_event.setCount(unready_objects)
|
||||||
simulate()
|
simulate()
|
||||||
|
else:
|
||||||
|
all_drained = True
|
||||||
cc_main.cleanupCountedDrain(drain_event)
|
cc_main.cleanupCountedDrain(drain_event)
|
||||||
|
return all_drained
|
||||||
|
|
||||||
def resume(root):
|
def resume(root):
|
||||||
root.resume()
|
root.resume()
|
||||||
|
|
Loading…
Reference in a new issue