summaryrefslogtreecommitdiff
path: root/src/sim
diff options
context:
space:
mode:
Diffstat (limited to 'src/sim')
-rw-r--r--src/sim/Process.py7
-rw-r--r--src/sim/System.py12
-rw-r--r--src/sim/init.cc81
-rw-r--r--src/sim/init.hh40
-rw-r--r--src/sim/power/PowerModel.py12
-rw-r--r--src/sim/power/PowerModelState.py13
-rw-r--r--src/sim/power/ThermalDomain.py10
-rw-r--r--src/sim/power/ThermalModel.py44
8 files changed, 163 insertions, 56 deletions
diff --git a/src/sim/Process.py b/src/sim/Process.py
index 743e5247c..2ffc51a33 100644
--- a/src/sim/Process.py
+++ b/src/sim/Process.py
@@ -26,13 +26,18 @@
#
# Authors: Nathan Binkert
-from m5.SimObject import SimObject
+from m5.SimObject import *
from m5.params import *
from m5.proxy import *
class Process(SimObject):
type = 'Process'
cxx_header = "sim/process.hh"
+
+ @cxxMethod
+ def map(self, vaddr, paddr, size, cacheable=False):
+ pass
+
input = Param.String('cin', "filename for stdin")
output = Param.String('cout', 'filename for stdout')
errout = Param.String('cerr', 'filename for stderr')
diff --git a/src/sim/System.py b/src/sim/System.py
index e3e42d862..53377989d 100644
--- a/src/sim/System.py
+++ b/src/sim/System.py
@@ -28,7 +28,7 @@
# Authors: Nathan Binkert
# Rick Strong
-from m5.SimObject import SimObject
+from m5.SimObject import *
from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
@@ -44,12 +44,10 @@ class System(MemObject):
cxx_header = "sim/system.hh"
system_port = MasterPort("System port")
- @classmethod
- def export_methods(cls, code):
- code('''
- Enums::MemoryMode getMemoryMode() const;
- void setMemoryMode(Enums::MemoryMode mode);
-''')
+ cxx_exports = [
+ PyBindMethod("getMemoryMode"),
+ PyBindMethod("setMemoryMode"),
+ ]
memories = VectorParam.AbstractMemory(Self.all,
"All memories in the system")
diff --git a/src/sim/init.cc b/src/sim/init.cc
index f2395eec4..33cd4040f 100644
--- a/src/sim/init.cc
+++ b/src/sim/init.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012 ARM Limited
+ * Copyright (c) 2012, 2017 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -56,6 +56,7 @@
#include "base/misc.hh"
#include "base/types.hh"
#include "config/have_protobuf.hh"
+#include "python/pybind11/pybind.hh"
#include "sim/async.hh"
#include "sim/core.hh"
@@ -65,6 +66,7 @@
#endif
using namespace std;
+namespace py = pybind11;
// The python library is totally messed up with respect to constness,
// so make a simple macro to make life a little easier
@@ -184,10 +186,87 @@ EmbeddedSwig::initAll()
_Py_PackageContext = old_context;
}
+EmbeddedPyBind::EmbeddedPyBind(const char *_name,
+ void (*init_func)(py::module &),
+ const char *_base)
+ : initFunc(init_func), registered(false), name(_name), base(_base)
+{
+ getMap()[_name] = this;
+}
+
+EmbeddedPyBind::EmbeddedPyBind(const char *_name,
+ void (*init_func)(py::module &))
+ : initFunc(init_func), registered(false), name(_name), base("")
+{
+ getMap()[_name] = this;
+}
+
+void
+EmbeddedPyBind::init(py::module &m)
+{
+ if (!registered) {
+ initFunc(m);
+ registered = true;
+ } else {
+ cprintf("Warning: %s already registered.\n", name);
+ }
+}
+
+bool
+EmbeddedPyBind::depsReady() const
+{
+ return base.empty() || getMap()[base]->registered;
+}
+
+std::map<std::string, EmbeddedPyBind *> &
+EmbeddedPyBind::getMap()
+{
+ static std::map<std::string, EmbeddedPyBind *> objs;
+ return objs;
+}
+
+void
+EmbeddedPyBind::initAll()
+{
+ std::list<EmbeddedPyBind *> pending;
+
+ py::module m_m5 = py::module("_m5");
+ m_m5.attr("__package__") = py::cast("_m5");
+
+ pybind_init_core(m_m5);
+ pybind_init_debug(m_m5);
+
+ pybind_init_event(m_m5);
+ pybind_init_pyobject(m_m5);
+ pybind_init_stats(m_m5);
+
+ for (auto &kv : getMap()) {
+ auto &obj = kv.second;
+ if (obj->base.empty()) {
+ obj->init(m_m5);
+ } else {
+ pending.push_back(obj);
+ }
+ }
+
+ while (!pending.empty()) {
+ for (auto it = pending.begin(); it != pending.end(); ) {
+ EmbeddedPyBind &obj = **it;
+ if (obj.depsReady()) {
+ obj.init(m_m5);
+ it = pending.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ }
+}
+
int
initM5Python()
{
EmbeddedSwig::initAll();
+ EmbeddedPyBind::initAll();
return EmbeddedPython::initAll();
}
diff --git a/src/sim/init.hh b/src/sim/init.hh
index 2bbcd23da..ecc4bc347 100644
--- a/src/sim/init.hh
+++ b/src/sim/init.hh
@@ -1,4 +1,16 @@
/*
+ * Copyright (c) 2017 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder. You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
* Copyright (c) 2008 The Hewlett-Packard Development Company
* All rights reserved.
*
@@ -31,9 +43,10 @@
#ifndef __SIM_INIT_HH__
#define __SIM_INIT_HH__
-#include <Python.h>
+#include "pybind11/pybind11.h"
#include <list>
+#include <map>
#include <string>
#include <inttypes.h>
@@ -79,6 +92,31 @@ struct EmbeddedSwig
static void initAll();
};
+class EmbeddedPyBind
+{
+ public:
+ EmbeddedPyBind(const char *_name,
+ void (*init_func)(pybind11::module &),
+ const char *_base);
+
+ EmbeddedPyBind(const char *_name,
+ void (*init_func)(pybind11::module &));
+
+ static void initAll();
+
+ private:
+ void (*initFunc)(pybind11::module &);
+
+ bool depsReady() const;
+ void init(pybind11::module &m);
+
+ bool registered;
+ const std::string name;
+ const std::string base;
+
+ static std::map<std::string, EmbeddedPyBind *> &getMap();
+};
+
int initM5Python();
int m5Main(int argc, char **argv);
PyMODINIT_FUNC initm5(void);
diff --git a/src/sim/power/PowerModel.py b/src/sim/power/PowerModel.py
index 9002743cd..ecb45b442 100644
--- a/src/sim/power/PowerModel.py
+++ b/src/sim/power/PowerModel.py
@@ -35,7 +35,7 @@
#
# Authors: David Guillen Fandos
-from m5.SimObject import SimObject
+from m5.SimObject import *
from m5.params import *
from m5.proxy import Parent
@@ -46,12 +46,10 @@ class PowerModel(SimObject):
type = 'PowerModel'
cxx_header = "sim/power/power_model.hh"
- @classmethod
- def export_methods(cls, code):
- code('''
- double getDynamicPower() const;
- double getStaticPower() const;
-''')
+ cxx_exports = [
+ PyBindMethod("getDynamicPower"),
+ PyBindMethod("getStaticPower"),
+ ]
# Keep a list of every model for every power state
pm = VectorParam.PowerModelState([], "List of per-state power models.")
diff --git a/src/sim/power/PowerModelState.py b/src/sim/power/PowerModelState.py
index 1c37ab078..3089497c1 100644
--- a/src/sim/power/PowerModelState.py
+++ b/src/sim/power/PowerModelState.py
@@ -35,7 +35,7 @@
#
# Authors: David Guillen Fandos
-from m5.SimObject import SimObject
+from m5.SimObject import *
from m5.params import *
# Represents a power model for a simobj
@@ -45,11 +45,10 @@ class PowerModelState(SimObject):
abstract = True
cxx_class = 'PowerModelState'
- @classmethod
- def export_methods(cls, code):
- code('''
- double getDynamicPower() const;
- double getStaticPower() const;
-''')
+ cxx_exports = [
+ PyBindMethod("getDynamicPower"),
+ PyBindMethod("getStaticPower"),
+ ]
+
diff --git a/src/sim/power/ThermalDomain.py b/src/sim/power/ThermalDomain.py
index 215d0863f..7d89d1a02 100644
--- a/src/sim/power/ThermalDomain.py
+++ b/src/sim/power/ThermalDomain.py
@@ -35,7 +35,7 @@
#
# Authors: David Guillen Fandos
-from m5.SimObject import SimObject
+from m5.SimObject import *
from m5.params import *
# Represents a group of simobj which produce heat
@@ -43,11 +43,9 @@ class ThermalDomain(SimObject):
type = 'ThermalDomain'
cxx_header = "sim/power/thermal_domain.hh"
- @classmethod
- def export_methods(cls, code):
- code('''
- void setNode(ThermalNode * node);
-''')
+ cxx_exports = [
+ PyBindMethod("setNode"),
+ ]
# Static temperature which may change over time
initial_temperature = Param.Float(25.0, "Initial temperature")
diff --git a/src/sim/power/ThermalModel.py b/src/sim/power/ThermalModel.py
index 4c397119d..e6a01b2be 100644
--- a/src/sim/power/ThermalModel.py
+++ b/src/sim/power/ThermalModel.py
@@ -35,7 +35,7 @@
#
# Authors: David Guillen Fandos
-from m5.SimObject import SimObject
+from m5.SimObject import *
from ClockedObject import ClockedObject
from m5.params import *
@@ -52,11 +52,9 @@ class ThermalResistor(SimObject):
type = 'ThermalResistor'
cxx_header = "sim/power/thermal_model.hh"
- @classmethod
- def export_methods(cls, code):
- code('''
- void setNodes(ThermalNode * node1, ThermalNode * node2);
-''')
+ cxx_exports = [
+ PyBindMethod("setNodes"),
+ ]
resistance = Param.Float(1.0, "Thermal resistance, expressed in Kelvin per Watt")
@@ -65,11 +63,9 @@ class ThermalCapacitor(SimObject):
type = 'ThermalCapacitor'
cxx_header = "sim/power/thermal_model.hh"
- @classmethod
- def export_methods(cls, code):
- code('''
- void setNodes(ThermalNode * node1, ThermalNode * node2);
-''')
+ cxx_exports = [
+ PyBindMethod("setNodes"),
+ ]
capacitance = Param.Float(1.0, "Thermal capacitance, expressed in Joules per Kelvin")
@@ -78,11 +74,9 @@ class ThermalReference(SimObject, object):
type = 'ThermalReference'
cxx_header = "sim/power/thermal_model.hh"
- @classmethod
- def export_methods(cls, code):
- code('''
- void setNode(ThermalNode * node);
-''')
+ cxx_exports = [
+ PyBindMethod("setNode"),
+ ]
# Static temperature which may change over time
temperature = Param.Float(25.0, "Operational temperature in Celsius")
@@ -93,16 +87,14 @@ class ThermalModel(ClockedObject):
type = 'ThermalModel'
cxx_header = "sim/power/thermal_model.hh"
- @classmethod
- def export_methods(cls, code):
- code('''
- void addCapacitor(ThermalCapacitor *obj);
- void addResistor(ThermalResistor *obj);
- void addReference(ThermalReference *obj);
- void addDomain(ThermalDomain *obj);
- void addNode(ThermalNode *obj);
- void doStep();
-''')
+ cxx_exports = [
+ PyBindMethod("addCapacitor"),
+ PyBindMethod("addResistor"),
+ PyBindMethod("addReference"),
+ PyBindMethod("addDomain"),
+ PyBindMethod("addNode"),
+ PyBindMethod("doStep"),
+ ]
step = Param.Float(0.01, "Simulation step (in seconds) for thermal simulation")