diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2006-11-01 19:00:49 -0500 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2006-11-01 19:00:49 -0500 |
commit | 8dbab9f701150cf93d33f2a21d6b556507f3d617 (patch) | |
tree | aec7f6fc83fdac1a2de1cd034f7fb4c384a100ba /src | |
parent | 6f78d494101e0ebd542d8fe836df21d104374c33 (diff) | |
download | gem5-8dbab9f701150cf93d33f2a21d6b556507f3d617.tar.xz |
Added code to handle draining.
--HG--
extra : convert_revision : 3861f553bde5865cd21a8a58a4c410896726f0a3
Diffstat (limited to 'src')
-rw-r--r-- | src/mem/bus.cc | 17 | ||||
-rw-r--r-- | src/mem/bus.hh | 4 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/mem/bus.cc b/src/mem/bus.cc index 86a148f87..41dc9acbf 100644 --- a/src/mem/bus.cc +++ b/src/mem/bus.cc @@ -239,6 +239,9 @@ Bus::recvRetry(int id) busIdle.reschedule(tickNextIdle); } } + //If we weren't able to drain before, we might be able to now. + if (drainEvent && retryList.size() == 0 && curTick >= tickNextIdle) + drainEvent->process(); } } @@ -498,6 +501,20 @@ Bus::addressRanges(AddrRangeList &resp, AddrRangeList &snoop, int id) } } +unsigned int +Bus::drain(Event * de) +{ + //We should check that we're not "doing" anything, and that noone is + //waiting. We might be idle but have someone waiting if the device we + //contacted for a retry didn't actually retry. + if (curTick >= tickNextIdle && retryList.size() == 0) { + drainEvent = de; + return 1; + } else { + return 0; + } +} + BEGIN_DECLARE_SIM_OBJECT_PARAMS(Bus) Param<int> bus_id; diff --git a/src/mem/bus.hh b/src/mem/bus.hh index 9fb33b7c3..71067032d 100644 --- a/src/mem/bus.hh +++ b/src/mem/bus.hh @@ -59,6 +59,8 @@ class Bus : public MemObject /** the next tick at which the bus will be idle */ Tick tickNextIdle; + Event * drainEvent; + static const int defaultId = -3; //Make it unique from Broadcast struct DevMap { @@ -247,6 +249,8 @@ class Bus : public MemObject virtual void init(); + unsigned int drain(Event *de); + Bus(const std::string &n, int bus_id, int _clock, int _width) : MemObject(n), busId(bus_id), clock(_clock), width(_width), tickNextIdle(0), busIdle(this), inRetry(false), defaultPort(NULL) |