summaryrefslogtreecommitdiff
path: root/src/cpu/testers
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2013-01-07 13:05:37 -0500
committerAndreas Hansson <andreas.hansson@arm.com>2013-01-07 13:05:37 -0500
commitccb6c640471ba2843199508bd8cd95a2f09438f5 (patch)
treeb041b63a9d5b26e32f8a3b59e5817138bbdc5b13 /src/cpu/testers
parent1da209140cd7bf267315b10698bf14c21a76b1b8 (diff)
downloadgem5-ccb6c640471ba2843199508bd8cd95a2f09438f5.tar.xz
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.
Diffstat (limited to 'src/cpu/testers')
-rw-r--r--src/cpu/testers/traffic_gen/traffic_gen.cc70
-rw-r--r--src/cpu/testers/traffic_gen/traffic_gen.hh10
2 files changed, 36 insertions, 44 deletions
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
@@ -353,6 +353,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()
{
// reset the address and the data counter
@@ -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 */