changeset af9066bc088c in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=af9066bc088c
description:
        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:

 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(-)

diffs (121 lines):

diff -r f6e3c60f04e5 -r af9066bc088c src/cpu/testers/traffic_gen/traffic_gen.cc
--- a/src/cpu/testers/traffic_gen/traffic_gen.cc        Mon Jan 07 13:05:37 
2013 -0500
+++ b/src/cpu/testers/traffic_gen/traffic_gen.cc        Mon Jan 07 13:05:37 
2013 -0500
@@ -353,6 +353,27 @@
 }
 
 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 @@
     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 @@
     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 @@
             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 -r f6e3c60f04e5 -r af9066bc088c src/cpu/testers/traffic_gen/traffic_gen.hh
--- a/src/cpu/testers/traffic_gen/traffic_gen.hh        Mon Jan 07 13:05:37 
2013 -0500
+++ b/src/cpu/testers/traffic_gen/traffic_gen.hh        Mon Jan 07 13:05:37 
2013 -0500
@@ -171,6 +171,16 @@
             /** 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 */
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to