summaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
Diffstat (limited to 'sim')
-rw-r--r--sim/builder.cc3
-rw-r--r--sim/main.cc5
-rw-r--r--sim/param.cc6
-rw-r--r--sim/process.cc5
-rw-r--r--sim/process.hh2
-rw-r--r--sim/sim_events.cc2
-rw-r--r--sim/sim_object.cc25
-rw-r--r--sim/sim_object.hh7
-rw-r--r--sim/stat_control.cc207
-rw-r--r--sim/stat_control.hh52
-rw-r--r--sim/stats.hh41
-rw-r--r--sim/system.hh2
12 files changed, 315 insertions, 42 deletions
diff --git a/sim/builder.cc b/sim/builder.cc
index e2345556e..110c42f25 100644
--- a/sim/builder.cc
+++ b/sim/builder.cc
@@ -32,6 +32,7 @@
#include "base/misc.hh"
#include "sim/builder.hh"
#include "sim/configfile.hh"
+#include "sim/config_node.hh"
#include "sim/host.hh"
#include "sim/sim_object.hh"
#include "sim/universe.hh"
@@ -153,7 +154,7 @@ SimObjectClass::createObject(IniFile &configDB,
// (specified by 'type=' parameter)
string simObjClassName;
- if (!configDB.findDefault(configClassName, "type", simObjClassName)) {
+ if (!configNode->find("type", simObjClassName)) {
cerr << "Configuration class '" << configClassName << "' not found."
<< endl;
abort();
diff --git a/sim/main.cc b/sim/main.cc
index 48d64d4cd..8861f3ef0 100644
--- a/sim/main.cc
+++ b/sim/main.cc
@@ -53,7 +53,8 @@
#include "sim/sim_exit.hh"
#include "sim/sim_init.hh"
#include "sim/sim_object.hh"
-#include "sim/sim_stats.hh"
+#include "sim/stat_control.hh"
+#include "sim/stats.hh"
#include "sim/universe.hh"
using namespace std;
@@ -235,7 +236,7 @@ main(int argc, char **argv)
sayHello(cerr);
// Initialize statistics database
- initBaseStats();
+ Statistics::InitSimStats();
vector<char *> cppArgs;
diff --git a/sim/param.cc b/sim/param.cc
index 7affe4786..bb372f631 100644
--- a/sim/param.cc
+++ b/sim/param.cc
@@ -147,14 +147,14 @@ template <>
bool
parseParam(const string &s, bool &value)
{
- const string &lower = to_lower(s);
+ const string &ls = to_lower(s);
- if (lower == "true" || lower == "t" || lower == "yes" || lower == "y") {
+ if (ls == "true" || ls == "t" || ls == "yes" || ls == "y" || ls == "1") {
value = true;
return true;
}
- if (lower == "false" || lower == "f" || lower == "no" || lower == "n") {
+ if (ls == "false" || ls == "f" || ls == "no" || ls == "n" || ls == "0") {
value = false;
return true;
}
diff --git a/sim/process.cc b/sim/process.cc
index c5eee4527..c6b497343 100644
--- a/sim/process.cc
+++ b/sim/process.cc
@@ -43,7 +43,7 @@
#include "sim/builder.hh"
#include "sim/fake_syscall.hh"
#include "sim/process.hh"
-#include "sim/sim_stats.hh"
+#include "sim/stats.hh"
#ifdef TARGET_ALPHA
#include "arch/alpha/alpha_tru64_process.hh"
@@ -75,6 +75,7 @@ Process::Process(const string &name,
// allocate initial register file
init_regs = new RegFile;
+ memset(init_regs, 0, sizeof(RegFile));
// initialize first 3 fds (stdin, stdout, stderr)
fd_map[STDIN_FILENO] = stdin_fd;
@@ -220,7 +221,7 @@ Process::sim_fd(int tgt_fd)
// that can be constructed (i.e., no REGISTER_SIM_OBJECT() macro call,
// which is where these get declared for concrete types).
//
-DEFINE_SIM_OBJECT_CLASS_NAME("Process object", Process)
+DEFINE_SIM_OBJECT_CLASS_NAME("Process", Process)
////////////////////////////////////////////////////////////////////////
diff --git a/sim/process.hh b/sim/process.hh
index 5df5736ff..b23302b8f 100644
--- a/sim/process.hh
+++ b/sim/process.hh
@@ -40,7 +40,7 @@
#include "targetarch/isa_traits.hh"
#include "sim/sim_object.hh"
-#include "sim/sim_stats.hh"
+#include "sim/stats.hh"
#include "base/statistics.hh"
class ExecContext;
diff --git a/sim/sim_events.cc b/sim/sim_events.cc
index f7b07359c..3530adedc 100644
--- a/sim/sim_events.cc
+++ b/sim/sim_events.cc
@@ -35,7 +35,7 @@
#include "sim/sim_events.hh"
#include "sim/sim_exit.hh"
#include "sim/sim_init.hh"
-#include "sim/sim_stats.hh"
+#include "sim/stats.hh"
using namespace std;
diff --git a/sim/sim_object.cc b/sim/sim_object.cc
index 2ec588afa..5602a89a2 100644
--- a/sim/sim_object.cc
+++ b/sim/sim_object.cc
@@ -35,7 +35,7 @@
#include "sim/configfile.hh"
#include "sim/host.hh"
#include "sim/sim_object.hh"
-#include "sim/sim_stats.hh"
+#include "sim/stats.hh"
#include "sim/param.hh"
using namespace std;
@@ -85,14 +85,6 @@ SimObject::resetStats()
}
//
-// no default extra output
-//
-void
-SimObject::printExtraOutput(ostream &os)
-{
-}
-
-//
// static function:
// call regStats() on all SimObjects and then regFormulas() on all
// SimObjects.
@@ -163,21 +155,6 @@ SimObject::resetAllStats()
}
//
-// static function: call printExtraOutput() on all SimObjects.
-//
-void
-SimObject::printAllExtraOutput(ostream &os)
-{
- SimObjectList::iterator i = simObjectList.begin();
- SimObjectList::iterator end = simObjectList.end();
-
- for (; i != end; ++i) {
- SimObject *obj = *i;
- obj->printExtraOutput(os);
- }
-}
-
-//
// static function: serialize all SimObjects.
//
void
diff --git a/sim/sim_object.hh b/sim/sim_object.hh
index aaaafc04b..b1dd19475 100644
--- a/sim/sim_object.hh
+++ b/sim/sim_object.hh
@@ -74,19 +74,12 @@ class SimObject : public Serializable
virtual void regFormulas();
virtual void resetStats();
- // print extra results for this object not covered by registered
- // statistics (called at end of simulation)
- virtual void printExtraOutput(std::ostream&);
-
// static: call reg_stats on all SimObjects
static void regAllStats();
// static: call resetStats on all SimObjects
static void resetAllStats();
- // static: call printExtraOutput on all SimObjects
- static void printAllExtraOutput(std::ostream&);
-
// static: call nameOut() & serialize() on all SimObjects
static void serializeAll(std::ostream &);
};
diff --git a/sim/stat_control.cc b/sim/stat_control.cc
new file mode 100644
index 000000000..d6d7e2c91
--- /dev/null
+++ b/sim/stat_control.cc
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This file will contain default statistics for the simulator that
+// don't really belong to a specific simulator object
+
+#include <fstream>
+#include <iostream>
+#include <list>
+
+#include "base/callback.hh"
+#include "base/hostinfo.hh"
+#include "base/statistics.hh"
+#include "base/str.hh"
+#include "base/time.hh"
+#include "base/stats/output.hh"
+#include "sim/eventq.hh"
+#include "sim/sim_object.hh"
+#include "sim/stat_control.hh"
+#include "sim/universe.hh"
+
+using namespace std;
+
+Statistics::Formula hostInstRate;
+Statistics::Formula hostMemory;
+Statistics::Formula hostSeconds;
+Statistics::Formula hostTickRate;
+
+Statistics::Formula simInsts;
+Statistics::Formula simSeconds;
+Statistics::Formula simTicks;
+
+namespace Statistics {
+
+Time statTime(true);
+Tick startTick;
+
+class SimTicksReset : public Callback
+{
+ public:
+ void process()
+ {
+ statTime.set();
+ startTick = curTick;
+ }
+};
+
+double
+statElapsedTime()
+{
+ Time now(true);
+ Time elapsed = now - statTime;
+ return elapsed();
+}
+
+SimTicksReset simTicksReset;
+
+void
+InitSimStats()
+{
+ simInsts
+ .name("sim_insts")
+ .desc("Number of instructions simulated")
+ .precision(0)
+ .prereq(simInsts)
+ ;
+
+ simSeconds
+ .name("sim_seconds")
+ .desc("Number of seconds simulated")
+ ;
+
+ simTicks
+ .name("sim_ticks")
+ .desc("Number of ticks simulated")
+ ;
+
+ hostInstRate
+ .name("host_inst_rate")
+ .desc("Simulator instruction rate (inst/s)")
+ .precision(0)
+ .prereq(simInsts)
+ ;
+
+ hostMemory
+ .name("host_mem_usage")
+ .desc("Number of bytes of host memory used")
+ .prereq(hostMemory)
+ ;
+
+ hostSeconds
+ .name("host_seconds")
+ .desc("Real time elapsed on the host")
+ .precision(2)
+ ;
+
+ hostTickRate
+ .name("host_tick_rate")
+ .desc("Simulator tick rate (ticks/s)")
+ .precision(0)
+ ;
+
+ simInsts = constant(0);
+ simTicks = scalar(curTick) - scalar(startTick);
+ simSeconds = simTicks / scalar(ticksPerSecond);
+ hostMemory = functor(memUsage);
+ hostSeconds = functor(statElapsedTime);
+ hostInstRate = simInsts / hostSeconds;
+ hostTickRate = simTicks / hostSeconds;
+
+ registerResetCallback(&simTicksReset);
+}
+
+class StatEvent : public Event
+{
+ protected:
+ int flags;
+ Tick repeat;
+
+ public:
+ StatEvent(int _flags, Tick _when, Tick _repeat);
+ virtual void process();
+ virtual const char *description();
+};
+
+StatEvent::StatEvent(int _flags, Tick _when, Tick _repeat)
+ : Event(&mainEventQueue, Stat_Event_Pri),
+ flags(_flags), repeat(_repeat)
+{
+ setFlags(AutoDelete);
+ schedule(_when);
+}
+
+const char *
+StatEvent::description()
+{
+ return "Statistics dump and/or reset";
+}
+
+void
+StatEvent::process()
+{
+ if (flags & Statistics::Dump)
+ DumpNow();
+
+ if (flags & Statistics::Reset)
+ reset();
+
+ if (repeat)
+ schedule(curTick + repeat);
+}
+
+list<Output *> OutputList;
+
+void
+DumpNow()
+{
+ list<Output *>::iterator i = OutputList.begin();
+ list<Output *>::iterator end = OutputList.end();
+ for (; i != end; ++i) {
+ Output *output = *i;
+ if (!output->valid())
+ continue;
+
+ output->output();
+ }
+}
+
+void
+SetupEvent(int flags, Tick when, Tick repeat)
+{
+ new StatEvent(flags, when, repeat);
+}
+
+/* namespace Statistics */ }
+
+extern "C" void
+debugDumpStats()
+{
+ Statistics::DumpNow();
+}
+
diff --git a/sim/stat_control.hh b/sim/stat_control.hh
new file mode 100644
index 000000000..9a5e269e1
--- /dev/null
+++ b/sim/stat_control.hh
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SIM_STAT_CONTROL_HH__
+#define __SIM_STAT_CONTROL_HH__
+
+#include <fstream>
+#include <list>
+
+namespace Statistics {
+
+enum {
+ Reset = 0x1,
+ Dump = 0x2
+};
+
+class Output;
+extern std::list<Output *> OutputList;
+
+void DumpNow();
+void SetupEvent(int flags, Tick when, Tick repeat = 0);
+
+void InitSimStats();
+
+/* namespace Statistics */ }
+
+#endif // __SIM_STAT_CONTROL_HH__
diff --git a/sim/stats.hh b/sim/stats.hh
new file mode 100644
index 000000000..b736850e7
--- /dev/null
+++ b/sim/stats.hh
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SIM_STATS_HH__
+#define __SIM_STATS_HH__
+
+#include "base/statistics.hh"
+
+extern Statistics::Formula simTicks;
+extern Statistics::Formula simSeconds;
+extern Statistics::Formula simInsts;
+extern Statistics::Formula hostSeconds;
+extern Statistics::Formula hostTickRate;
+extern Statistics::Formula hostInstRate;
+
+#endif // __SIM_SIM_STATS_HH__
diff --git a/sim/system.hh b/sim/system.hh
index 7b011aa8f..0fcdd77cc 100644
--- a/sim/system.hh
+++ b/sim/system.hh
@@ -54,7 +54,7 @@ class System : public SimObject
std::map<const Addr, SWContext *> swCtxMap;
public:
- Statistics::Scalar<Counter> fnCalls;
+ Statistics::Scalar<> fnCalls;
Statistics::MainBin *Kernel;
Statistics::MainBin *User;