From d8502ee46d356830698d7b96b29e4b27906a2d79 Mon Sep 17 00:00:00 2001 From: Andrew Bardsley Date: Thu, 16 Oct 2014 05:49:32 -0400 Subject: config: Add a --without-python option to build process Add the ability to build libgem5 without embedded Python or the ability to configure with Python. This is a prelude to a patch to allow config.ini files to be loaded into libgem5 using only C++ which would make embedding gem5 within other simulation systems easier. This adds a few registration interfaces to things which cross between Python and C++. Namely: stats dumping and SimObject resolving --- src/python/SConscript | 4 ++-- src/python/m5/stats/__init__.py | 1 + src/python/swig/pyobject.cc | 11 ++++++++++- src/python/swig/pyobject.hh | 14 ++++++++------ src/python/swig/stats.i | 21 +++++---------------- 5 files changed, 26 insertions(+), 25 deletions(-) (limited to 'src/python') diff --git a/src/python/SConscript b/src/python/SConscript index b2c95b88b..7e9380d85 100644 --- a/src/python/SConscript +++ b/src/python/SConscript @@ -31,8 +31,8 @@ Import('*') -Source('swig/pyevent.cc') -Source('swig/pyobject.cc') +Source('swig/pyevent.cc', skip_no_python=True) +Source('swig/pyobject.cc', skip_no_python=True) PySource('', 'importer.py') PySource('m5', 'm5/__init__.py') diff --git a/src/python/m5/stats/__init__.py b/src/python/m5/stats/__init__.py index 770749bf0..763d9b9e3 100644 --- a/src/python/m5/stats/__init__.py +++ b/src/python/m5/stats/__init__.py @@ -41,6 +41,7 @@ def initText(filename, desc=True): def initSimStats(): internal.stats.initSimStats() + internal.stats.registerPythonStatsHandlers() names = [] stats_dict = {} diff --git a/src/python/swig/pyobject.cc b/src/python/swig/pyobject.cc index 51bd1f62f..fed60ba46 100644 --- a/src/python/swig/pyobject.cc +++ b/src/python/swig/pyobject.cc @@ -157,9 +157,12 @@ extern "C" SimObject *convertSwigSimObjectPtr(PyObject *); // these in sim/main.cc as well that are handled without this define. #define PCC(s) const_cast(s) +/** Single instance of PythonSimObjectResolver as its action is effectively + * static but SimObjectResolver can use a non-persistent object */ +PythonSimObjectResolver pythonSimObjectResolver; SimObject * -resolveSimObject(const string &name) +PythonSimObjectResolver::resolveSimObject(const string &name) { PyObject *module = PyImport_ImportModule(PCC("m5.SimObject")); if (module == NULL) @@ -188,3 +191,9 @@ resolveSimObject(const string &name) return obj; } + +Checkpoint * +getCheckpoint(const std::string &cpt_dir) +{ + return new Checkpoint(cpt_dir, pythonSimObjectResolver); +} diff --git a/src/python/swig/pyobject.hh b/src/python/swig/pyobject.hh index 8debcc82c..a4f06555e 100644 --- a/src/python/swig/pyobject.hh +++ b/src/python/swig/pyobject.hh @@ -36,7 +36,12 @@ #include "sim/sim_object.hh" extern "C" SimObject *convertSwigSimObjectPtr(PyObject *); -SimObject *resolveSimObject(const std::string &name); + +/** Resolve a SimObject name using the Python configuration */ +class PythonSimObjectResolver : public SimObjectResolver +{ + SimObject *resolveSimObject(const std::string &name); +}; EtherInt * lookupEthPort(SimObject *so, const std::string &name, int i); @@ -53,11 +58,8 @@ serializeAll(const std::string &cpt_dir) Serializable::serializeAll(cpt_dir); } -inline Checkpoint * -getCheckpoint(const std::string &cpt_dir) -{ - return new Checkpoint(cpt_dir); -} +Checkpoint * +getCheckpoint(const std::string &cpt_dir); inline void unserializeGlobals(Checkpoint *cp) diff --git a/src/python/swig/stats.i b/src/python/swig/stats.i index 3bdd2c9aa..41115445c 100644 --- a/src/python/swig/stats.i +++ b/src/python/swig/stats.i @@ -43,6 +43,7 @@ #include "base/statistics.hh" #include "sim/core.hh" #include "sim/stat_control.hh" +#include "sim/stat_register.hh" namespace Stats { template @@ -64,20 +65,6 @@ Stats_Info_flags_set(Info *info, FlagsType flags) info->flags = flags; } -inline void -processResetQueue() -{ - extern CallbackQueue resetQueue; - resetQueue.process(); -} - -inline void -processDumpQueue() -{ - extern CallbackQueue dumpQueue; - dumpQueue.process(); -} - inline char * PCC(const char *string) { @@ -102,13 +89,13 @@ call_module_function(const char *module_name, const char *func_name) } void -dump() +pythonDump() { call_module_function("m5.stats", "dump"); } void -reset() +pythonReset() { call_module_function("m5.stats", "reset"); } @@ -150,6 +137,8 @@ template T cast_info(Info *info); void initSimStats(); Output *initText(const std::string &filename, bool desc); +void registerPythonStatsHandlers(); + void schedStatEvent(bool dump, bool reset, Tick when = curTick(), Tick repeat = 0); -- cgit v1.2.3