From ccb6c640471ba2843199508bd8cd95a2f09438f5 Mon Sep 17 00:00:00 2001 From: Andreas Hansson Date: Mon, 7 Jan 2013 13:05:37 -0500 Subject: 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. --- src/cpu/testers/traffic_gen/traffic_gen.cc | 70 +++++++++++------------------- src/cpu/testers/traffic_gen/traffic_gen.hh | 10 +++++ 2 files changed, 36 insertions(+), 44 deletions(-) (limited to 'src/cpu/testers') diff --git a/src/cpu/testers/traffic_gen/traffic_gen.cc b/src/cpu/testers/traffic_gen/traffic_gen.cc index 05e5d0d3b..34e3b2c1e 100644 --- a/src/cpu/testers/traffic_gen/traffic_gen.cc +++ b/src/cpu/testers/traffic_gen/traffic_gen.cc @@ -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 diff --git a/src/cpu/testers/traffic_gen/traffic_gen.hh b/src/cpu/testers/traffic_gen/traffic_gen.hh index 4fca8a384..75db025e5 100644 --- a/src/cpu/testers/traffic_gen/traffic_gen.hh +++ b/src/cpu/testers/traffic_gen/traffic_gen.hh @@ -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 */ -- cgit v1.2.3