#include <string>
#include <set>
#include <list>
-#include <inttypes.h>
-#include "base/range.hh"
#include "base/hashmap.hh"
+#include "base/range.hh"
#include "base/range_map.hh"
+#include "base/types.hh"
#include "mem/mem_object.hh"
#include "mem/packet.hh"
#include "mem/port.hh"
#include "mem/request.hh"
-#include "sim/eventq.hh"
#include "params/Bus.hh"
+#include "sim/eventq.hh"
class Bus : public MemObject
{
// Ask the bus to ask everyone on the bus what their block size is and
// take the max of it. This might need to be changed a bit if we ever
// support multiple block sizes.
- virtual int deviceBlockSize()
+ virtual unsigned deviceBlockSize() const
{ return bus->findBlockSize(id); }
};
int busId;
/** the clock speed for the bus */
int clock;
+ /** cycles of overhead per transaction */
+ int headerCycles;
/** the width of the bus in bytes */
int width;
/** the next tick at which the bus will be idle */
*/
void addressRanges(AddrRangeList &resp, bool &snoop, int id);
- /** Occupy the bus with transmitting the packet pkt */
- void occupyBus(PacketPtr pkt);
+ /** Calculate the timing parameters for the packet. Updates the
+ * firstWordTime and finishTime fields of the packet object.
+ * Returns the tick at which the packet header is completed (which
+ * will be all that is sent if the target rejects the packet).
+ */
+ Tick calcPacketTiming(PacketPtr pkt);
+
+ /** Occupy the bus until until */
+ void occupyBus(Tick until);
/** Ask everyone on the bus what their size is
* @param id id of the busport that made the request
* @return the max of all the sizes
*/
- int findBlockSize(int id);
+ unsigned findBlockSize(int id);
BusFreeEvent busIdle;
/** Has the user specified their own default responder? */
bool responderSet;
- int defaultBlockSize;
- int cachedBlockSize;
+ unsigned defaultBlockSize;
+ unsigned cachedBlockSize;
bool cachedBlockSizeValid;
// Cache for the peer port interfaces
unsigned int drain(Event *de);
Bus(const BusParams *p)
- : MemObject(p), busId(p->bus_id), clock(p->clock), width(p->width),
- tickNextIdle(0), drainEvent(NULL), busIdle(this), inRetry(false),
- maxId(0), defaultPort(NULL), funcPort(NULL), funcPortId(-4),
+ : MemObject(p), busId(p->bus_id), clock(p->clock),
+ headerCycles(p->header_cycles), width(p->width), tickNextIdle(0),
+ drainEvent(NULL), busIdle(this), inRetry(false), maxId(0),
+ defaultPort(NULL), funcPort(NULL), funcPortId(-4),
responderSet(p->responder_set), defaultBlockSize(p->block_size),
cachedBlockSize(0), cachedBlockSizeValid(false)
{
- //Both the width and clock period must be positive
+ //width, clock period, and header cycles must be positive
if (width <= 0)
fatal("Bus width must be positive\n");
if (clock <= 0)
fatal("Bus clock period must be positive\n");
+ if (headerCycles <= 0)
+ fatal("Number of header cycles must be positive\n");
clearBusCache();
clearPortCache();
}