Several tweaks to make binning work in any simulation
authorNathan Binkert <binkertn@umich.edu>
Thu, 17 Feb 2005 07:48:56 +0000 (02:48 -0500)
committerNathan Binkert <binkertn@umich.edu>
Thu, 17 Feb 2005 07:48:56 +0000 (02:48 -0500)
configuration so that we can always have binning on.

base/statistics.cc:
    If we're binning, and there is no bin active at the time
    we check all stats stuff, create a bin.
base/statistics.hh:
    FS_MEASURE doesn't exist anymore
base/stats/text.cc:
    don't print out bin names if there is only one bin
sim/process.cc:
    don't zero stats.  It happens automatically.
    Don't activate the context at the time it is registered,
    instead activate the first context in a startup callback.
sim/process.hh:
    Add startup callback to initialize the first exec context

--HG--
extra : convert_revision : bcb23cdb184b0abf7cecd79902f8a59b50f71fe4

base/statistics.cc
base/statistics.hh
base/stats/text.cc
sim/process.cc
sim/process.hh

index 6e3dae1efe6d6ed3b41e56d55543bc9005fe8180..6f5caf1fe20b7507219db95408115120d56d8917 100644 (file)
@@ -286,6 +286,13 @@ check()
 
     Database::stats().sort(StatData::less);
 
+#if defined(STATS_BINNING)
+    if (MainBin::curBin() == NULL) {
+        static MainBin mainBin("main bin");
+        mainBin.activate();
+    }
+#endif
+
     if (i == end)
         return;
 
index 9ec26eb4d41eb5ed06f1d7e1eabb4c9cb6beb5c3..667a0ed486863b9626229d54d14d2298ff2513e0 100644 (file)
@@ -2184,7 +2184,7 @@ class SumNode : public Node
  * binned.  If the typedef is NoBin, nothing is binned.  If it is
  * MainBin, then all stats are binned under that Bin.
  */
-#if defined(FS_MEASURE) || defined(STATS_BINNING)
+#if defined(STATS_BINNING)
 typedef MainBin DefaultBin;
 #else
 typedef NoBin DefaultBin;
index f7e82a30fb5dd8cc5f59bf170216af548c292129..8cc5ff65e8bbe1dec302566e29466912496c3724 100644 (file)
@@ -126,7 +126,7 @@ Text::output()
     using namespace Database;
 
     ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
-    if (bins().empty()) {
+    if (bins().empty() || bins().size() == 1) {
         stat_list_t::const_iterator i, end = stats().end();
         for (i = stats().begin(); i != end; ++i)
             (*i)->visit(*this);
index c725d3b1c3cc0b44dd7c489001353fcce9912c08..4d860c51dd62bd6e9706fcec9ddebfaaa83829db 100644 (file)
@@ -88,8 +88,6 @@ Process::Process(const string &name,
         fd_map[i] = -1;
     }
 
-    num_syscalls = 0;
-
     // other parameters will be initialized when the program is loaded
 }
 
@@ -145,21 +143,28 @@ Process::registerExecContext(ExecContext *xc)
     execContexts.push_back(xc);
 
     if (myIndex == 0) {
-        // first exec context for this process... initialize & enable
-
         // copy process's initial regs struct
         xc->regs = *init_regs;
-
-        // mark this context as active.
-        // activate with zero delay so that we start ticking right
-        // away on cycle 0
-        xc->activate(0);
     }
 
     // return CPU number to caller and increment available CPU count
     return myIndex;
 }
 
+void
+Process::startup()
+{
+    if (execContexts.empty())
+        return;
+
+    // first exec context for this process... initialize & enable
+    ExecContext *xc = execContexts[0];
+
+    // mark this context as active.
+    // activate with zero delay so that we start ticking right
+    // away on cycle 0
+    xc->activate(0);
+}
 
 void
 Process::replaceExecContext(ExecContext *xc, int xcIndex)
index bb48298759a89bcf2342f6bc49fb3c91fb2dc583..817ab656cdf294393eb85fd281731d5eea5b1d2e 100644 (file)
@@ -108,6 +108,8 @@ class Process : public SimObject
             int stdout_fd,
             int stderr_fd);
 
+    // post initialization startup
+    virtual void startup();
 
   protected:
     FunctionalMemory *memory;