summaryrefslogtreecommitdiff
path: root/src/mem/bus.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/bus.hh')
-rw-r--r--src/mem/bus.hh53
1 files changed, 48 insertions, 5 deletions
diff --git a/src/mem/bus.hh b/src/mem/bus.hh
index 9dd666304..96f1152a6 100644
--- a/src/mem/bus.hh
+++ b/src/mem/bus.hh
@@ -46,6 +46,7 @@
#include "mem/packet.hh"
#include "mem/port.hh"
#include "mem/request.hh"
+#include "sim/eventq.hh"
class Bus : public MemObject
{
@@ -55,10 +56,8 @@ class Bus : public MemObject
int clock;
/** the width of the bus in bits */
int width;
- /** the last tick the address bus was used */
- Tick tickAddrLastUsed;
- /** the last tick the data bus was used */
- Tick tickDataLastUsed;
+ /** the next tick at which the bus will be idle */
+ Tick tickNextIdle;
static const int defaultId = -1;
@@ -101,6 +100,15 @@ class Bus : public MemObject
*/
Port *findPort(Addr addr, int id);
+ /** Finds the port a packet should be sent to. If the bus is blocked, no port
+ * is returned.
+ * @param pkt Packet to find a destination port for.
+ * @param id Id of the port this packet was received from
+ * (to prevent loops)
+ */
+
+ Port *findDestPort(PacketPtr pkt, int id);
+
/** Find all ports with a matching snoop range, except src port. Keep in mind
* that the ranges shouldn't overlap or you will get a double snoop to the same
* interface.and the cache will assert out.
@@ -189,6 +197,22 @@ class Bus : public MemObject
};
+ class BusFreeEvent : public Event
+ {
+ Bus * bus;
+
+ public:
+ BusFreeEvent(Bus * _bus);
+ void process();
+ const char *description();
+ };
+
+ BusFreeEvent busIdle;
+
+ void occupyBus(int numCycles);
+
+ Port * retryingPort;
+
/** An array of pointers to the peer port interfaces
connected to this bus.*/
std::vector<Port*> interfaces;
@@ -197,6 +221,23 @@ class Bus : public MemObject
* original send failed for whatever reason.*/
std::list<Port*> retryList;
+ void addToRetryList(Port * port)
+ {
+ if (!retryingPort) {
+ // The device wasn't retrying a packet, or wasn't at an appropriate
+ // time.
+ retryList.push_back(port);
+ } else {
+ // The device was retrying a packet. It didn't work, so we'll leave
+ // it at the head of the retry list.
+ retryingPort = 0;
+
+ // We shouldn't be receiving a packet from one port when a different
+ // one is retrying.
+ assert(port == retryingPort);
+ }
+ }
+
/** Port that handles requests that don't match any of the interfaces.*/
Port *defaultPort;
@@ -209,9 +250,11 @@ class Bus : public MemObject
Bus(const std::string &n, int bus_id, int _clock, int _width)
: MemObject(n), busId(bus_id), clock(_clock), width(_width),
- tickAddrLastUsed(0), tickDataLastUsed(0), defaultPort(NULL)
+ tickNextIdle(0), busIdle(this), retryingPort(0), defaultPort(NULL)
{
+ //Both the width and clock period must be positive
assert(width);
+ assert(clock);
}
};