cpu: Share the send functionality between traffic generators

This patch moves the packet creating and sending to a member function
in the shared base class to avoid code duplication.
This commit is contained in:
Andreas Hansson 2013-01-07 13:05:37 -05:00
parent 1da209140c
commit ccb6c64047
2 changed files with 36 additions and 44 deletions

View file

@ -352,6 +352,27 @@ TrafficGen::StateGraph::BaseGen::BaseGen(QueuedMasterPort& _port,
{
}
void
TrafficGen::StateGraph::BaseGen::send(Addr addr, unsigned size,
const MemCmd& cmd)
{
// Create new request
Request::Flags flags;
Request *req = new Request(addr, size, flags, masterID);
// Embed it in a packet
PacketPtr pkt = new Packet(req, cmd);
uint8_t* pkt_data = new uint8_t[req->getSize()];
pkt->dataDynamicArray(pkt_data);
if (cmd.isWrite()) {
memset(pkt_data, 0xA, req->getSize());
}
port.schedTimingReq(pkt, curTick());
}
void
TrafficGen::StateGraph::LinearGen::enter()
{
@ -380,21 +401,7 @@ TrafficGen::StateGraph::LinearGen::execute()
DPRINTF(TrafficGen, "LinearGen::execute: %c to addr %x, size %d\n",
isRead ? 'r' : 'w', nextAddr, blocksize);
// Create new request
Request::Flags flags;
Request *req = new Request(nextAddr, blocksize, flags, masterID);
PacketPtr pkt = new Packet(req, isRead ? MemCmd::ReadReq :
MemCmd::WriteReq);
uint8_t* pkt_data = new uint8_t[req->getSize()];
pkt->dataDynamicArray(pkt_data);
if (!isRead) {
memset(pkt_data, 0xA, req->getSize());
}
port.schedTimingReq(pkt, curTick());
send(nextAddr, blocksize, isRead ? MemCmd::ReadReq : MemCmd::WriteReq);
// increment the address
nextAddr += blocksize;
@ -459,21 +466,8 @@ TrafficGen::StateGraph::RandomGen::execute()
DPRINTF(TrafficGen, "RandomGen::execute: %c to addr %x, size %d\n",
isRead ? 'r' : 'w', addr, blocksize);
// create new request packet
Request::Flags flags;
Request *req = new Request(addr, blocksize, flags, masterID);
PacketPtr pkt = new Packet(req, isRead ? MemCmd::ReadReq :
MemCmd::WriteReq);
uint8_t* pkt_data = new uint8_t[req->getSize()];
pkt->dataDynamicArray(pkt_data);
if (!isRead) {
memset(pkt_data, 0xA, req->getSize());
}
port.schedTimingReq(pkt, curTick());
// send a new request packet
send(addr, blocksize, isRead ? MemCmd::ReadReq : MemCmd::WriteReq);
// Add the amount of data manipulated to the total
dataManipulated += blocksize;
@ -596,20 +590,8 @@ TrafficGen::StateGraph::TraceGen::execute() {
currElement.blocksize,
currElement.tick);
Request::Flags flags;
Request *req = new Request(currElement.addr + addrOffset,
currElement.blocksize, flags, masterID);
PacketPtr pkt = new Packet(req, currElement.cmd);
uint8_t* pkt_data = new uint8_t[req->getSize()];
pkt->dataDynamicArray(pkt_data);
if (currElement.cmd.isWrite()) {
memset(pkt_data, 0xA, req->getSize());
}
port.schedTimingReq(pkt, curTick());
send(currElement.addr + addrOffset, currElement.blocksize,
currElement.cmd);
}
void

View file

@ -171,6 +171,16 @@ class TrafficGen : public MemObject
/** The MasterID used for generating requests */
const MasterID masterID;
/**
* Create a new request and associated packet and schedule
* it to be sent in the current tick.
*
* @param addr Physical address to use
* @param size Size of the request
* @param cmd Memory command to send
*/
void send(Addr addr, unsigned size, const MemCmd& cmd);
public:
/** Time to spend in this state */