From 48333e7e3f5282bd2b5505b400ad5b06d6785371 Mon Sep 17 00:00:00 2001
From: Radhika Jagtap <radhika.jagtap@arm.com>
Date: Tue, 16 Aug 2016 14:14:58 +0100
Subject: [PATCH] cpu: Print progress messages in Trace CPU

This change adds the ability to print a message at intervals
of committed instruction count to indicate progress in the
trace replay.

Change-Id: I8363502354c42bfc52936d2627986598b63a5797
Reviewed-by: Rekai Gonzalez Alberquilla <rekai.gonzalezalberquilla@arm.com>
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/2321
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
---
 src/cpu/trace/TraceCPU.py  |  7 +++++++
 src/cpu/trace/trace_cpu.cc | 18 +++++++++++++++---
 src/cpu/trace/trace_cpu.hh | 15 ++++++++++++++-
 3 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/src/cpu/trace/TraceCPU.py b/src/cpu/trace/TraceCPU.py
index 3ec5795e3..e108b1a50 100644
--- a/src/cpu/trace/TraceCPU.py
+++ b/src/cpu/trace/TraceCPU.py
@@ -80,3 +80,10 @@ class TraceCPU(BaseCPU):
     # false by default
     enableEarlyExit = Param.Bool(False, "Exit when any one Trace CPU "\
                                  "completes execution")
+
+    # If progress msg interval is set to a non-zero value, it is treated as
+    # the interval of committed instructions at which an info message is
+    # printed.
+    progressMsgInterval = Param.Unsigned(0, "Interval of committed "\
+                                         "instructions at which to print a"\
+                                         " progress msg")
diff --git a/src/cpu/trace/trace_cpu.cc b/src/cpu/trace/trace_cpu.cc
index 44da7df1e..7b59b49e0 100644
--- a/src/cpu/trace/trace_cpu.cc
+++ b/src/cpu/trace/trace_cpu.cc
@@ -62,13 +62,15 @@ TraceCPU::TraceCPU(TraceCPUParams *params)
         oneTraceComplete(false),
         traceOffset(0),
         execCompleteEvent(nullptr),
-        enableEarlyExit(params->enableEarlyExit)
+        enableEarlyExit(params->enableEarlyExit),
+        progressMsgInterval(params->progressMsgInterval),
+        progressMsgThreshold(params->progressMsgInterval)
 {
     // Increment static counter for number of Trace CPUs.
     ++TraceCPU::numTraceCPUs;
 
-    // Check that the python parameters for sizes of ROB, store buffer and load
-    // buffer do not overflow the corresponding C++ variables.
+    // Check that the python parameters for sizes of ROB, store buffer and
+    // load buffer do not overflow the corresponding C++ variables.
     fatal_if(params->sizeROB > UINT16_MAX, "ROB size set to %d exceeds the "
                 "max. value of %d.\n", params->sizeROB, UINT16_MAX);
     fatal_if(params->sizeStoreBuffer > UINT16_MAX, "ROB size set to %d "
@@ -90,6 +92,16 @@ TraceCPUParams::create()
     return new TraceCPU(this);
 }
 
+void
+TraceCPU::updateNumOps(uint64_t rob_num)
+{
+    numOps = rob_num;
+    if (progressMsgInterval != 0 && numOps.value() >= progressMsgThreshold) {
+        inform("%s: %i insts committed\n", name(), progressMsgThreshold);
+        progressMsgThreshold += progressMsgInterval;
+    }
+}
+
 void
 TraceCPU::takeOverFrom(BaseCPU *oldCPU)
 {
diff --git a/src/cpu/trace/trace_cpu.hh b/src/cpu/trace/trace_cpu.hh
index 846a3e7c5..07c739c57 100644
--- a/src/cpu/trace/trace_cpu.hh
+++ b/src/cpu/trace/trace_cpu.hh
@@ -177,7 +177,7 @@ class TraceCPU : public BaseCPU
      * Set the no. of ops when elastic data generator completes executing a
      * node.
      */
-    void updateNumOps(uint64_t rob_num) { numOps = rob_num; }
+    void updateNumOps(uint64_t rob_num);
 
     /* Pure virtual function in BaseCPU. Do nothing. */
     void wakeup(ThreadID tid = 0)
@@ -1122,6 +1122,19 @@ class TraceCPU : public BaseCPU
      */
     const bool enableEarlyExit;
 
+    /**
+      * Interval of committed instructions specified by the user at which a
+      * progress info message is printed
+      */
+    const uint64_t progressMsgInterval;
+
+    /*
+     * The progress msg threshold is kept updated to the next multiple of the
+     * progress msg interval. As soon as the threshold is reached, an info
+     * message is printed.
+     */
+    uint64_t progressMsgThreshold;
+
     Stats::Scalar numSchedDcacheEvent;
     Stats::Scalar numSchedIcacheEvent;
 
-- 
2.30.2