cpu: Share the send functionality between traffic generators
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 7 Jan 2013 18:05:37 +0000 (13:05 -0500)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 7 Jan 2013 18:05:37 +0000 (13:05 -0500)
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
src/cpu/testers/traffic_gen/traffic_gen.hh

index 05e5d0d3b3ed213559330562a4e0cda63fa806f4..34e3b2c1ea2d0d7440afeca038238413338481c3 100644 (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
index 4fca8a384c962c05fc8d930376e8130963b198e4..75db025e599026b3e720c3e62341ee44244c7544 100644 (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 */