summaryrefslogtreecommitdiff
path: root/src/python/swig
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/swig')
-rw-r--r--src/python/swig/core.i26
-rw-r--r--src/python/swig/debug.i7
-rw-r--r--src/python/swig/event.i55
-rw-r--r--src/python/swig/init.hh36
-rw-r--r--src/python/swig/pyevent.cc33
-rw-r--r--src/python/swig/pyevent.hh31
-rw-r--r--src/python/swig/range.i2
-rw-r--r--src/python/swig/stats.i3
8 files changed, 105 insertions, 88 deletions
diff --git a/src/python/swig/core.i b/src/python/swig/core.i
index 770765ca4..c567bea4d 100644
--- a/src/python/swig/core.i
+++ b/src/python/swig/core.i
@@ -34,11 +34,27 @@
%{
#include "python/swig/pyobject.hh"
+#include "base/misc.hh"
+#include "base/socket.hh"
#include "sim/core.hh"
#include "sim/host.hh"
#include "sim/startup.hh"
extern const char *compileDate;
+
+#ifdef DEBUG
+const bool flag_DEBUG = true;
+#else
+const bool flag_DEBUG = false;
+#endif
+#ifdef NDEBUG
+const bool flag_NDEBUG = true;
+#else
+const bool flag_NDEBUG = false;
+#endif
+const bool flag_TRACING_ON = TRACING_ON;
+
+inline void disableAllListeners() { ListenSocket::disableAll(); }
%}
%include "stdint.i"
@@ -46,11 +62,15 @@ extern const char *compileDate;
%include "sim/host.hh"
void setOutputDir(const std::string &dir);
-void setOutputFile(const std::string &file);
void SimStartup();
void doExitCleanup();
+void disableAllListeners();
+%immutable compileDate;
char *compileDate;
+const bool flag_DEBUG;
+const bool flag_NDEBUG;
+const bool flag_TRACING_ON;
void setClockFrequency(Tick ticksPerSecond);
@@ -63,6 +83,10 @@ void unserializeAll(const std::string &cpt_dir);
void initAll();
void regAllStats();
+bool want_warn, warn_verbose;
+bool want_info, info_verbose;
+bool want_hack, hack_verbose;
+
%wrapper %{
// fix up module name to reflect the fact that it's inside the m5 package
#undef SWIG_name
diff --git a/src/python/swig/debug.i b/src/python/swig/debug.i
index b542e9f82..1084d6936 100644
--- a/src/python/swig/debug.i
+++ b/src/python/swig/debug.i
@@ -31,16 +31,13 @@
%module debug
%{
-// include these files when compiling debug_wrap.cc
#include "sim/host.hh"
+#include "sim/debug.hh"
%}
%include "stdint.i"
%include "sim/host.hh"
-
-%inline %{
-extern void schedBreakCycle(Tick when);
-%}
+%include "sim/debug.hh"
%wrapper %{
// fix up module name to reflect the fact that it's inside the m5 package
diff --git a/src/python/swig/event.i b/src/python/swig/event.i
index 9a2093c99..b40e59a4b 100644
--- a/src/python/swig/event.i
+++ b/src/python/swig/event.i
@@ -32,34 +32,65 @@
%{
#include "python/swig/pyevent.hh"
-
+#include "sim/host.hh"
+#include "sim/eventq.hh"
#include "sim/sim_events.hh"
#include "sim/sim_exit.hh"
#include "sim/simulate.hh"
%}
+#pragma SWIG nowarn=350,351
+
+%extend EventQueue {
+ void
+ schedule(Event *event, Tick when)
+ {
+ // Any python event that are scheduled must have their
+ // internal object's refcount incremented so that the object
+ // sticks around while it is in the event queue.
+ PythonEvent *pyevent = dynamic_cast<PythonEvent *>(event);
+ if (pyevent)
+ pyevent->incref();
+ $self->schedule(event, when);
+ }
+
+ void
+ deschedule(Event *event)
+ {
+ $self->deschedule(event);
+
+ // Now that we're removing the python object from the event
+ // queue, we need to decrement its reference count.
+ PythonEvent *pyevent = dynamic_cast<PythonEvent *>(event);
+ if (pyevent)
+ pyevent->decref();
+ }
+}
+
+%ignore EventQueue::schedule;
+%ignore EventQueue::deschedule;
+
+%import "base/fast_alloc.hh"
+%import "sim/serialize.hh"
+
%include "stdint.i"
%include "std_string.i"
%include "sim/host.hh"
+%include "sim/eventq.hh"
+%include "python/swig/pyevent.hh"
-void create(PyObject *object, Tick when);
-
-class Event;
-class CountedDrainEvent : public Event {
- public:
+struct CountedDrainEvent : public Event
+{
void setCount(int _count);
};
-CountedDrainEvent *createCountedDrain();
-void cleanupCountedDrain(Event *drain_event);
-
// minimal definition of SimExitEvent interface to wrap
-class SimLoopExitEvent {
+class SimLoopExitEvent : public Event
+{
public:
std::string getCause();
int getCode();
- SimLoopExitEvent(EventQueue *q, Tick _when, Tick _repeat,
- const std::string &_cause, int c = 0);
+ SimLoopExitEvent(const std::string &_cause, int c, Tick _repeat = 0);
};
%exception simulate {
diff --git a/src/python/swig/init.hh b/src/python/swig/init.hh
deleted file mode 100644
index 23d2c19a9..000000000
--- a/src/python/swig/init.hh
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2006 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.
- *
- * Authors: Nathan Binkert
- */
-
-#ifndef __PYTHON_SWIG_INIT_HH__
-#define __PYTHON_SWIG_INIT_HH__
-
-void init_swig();
-
-#endif // __PYTHON_SWIG_INIT_HH__
diff --git a/src/python/swig/pyevent.cc b/src/python/swig/pyevent.cc
index 7f23b8874..0695ed2d3 100644
--- a/src/python/swig/pyevent.cc
+++ b/src/python/swig/pyevent.cc
@@ -33,21 +33,15 @@
#include "python/swig/pyevent.hh"
#include "sim/async.hh"
-PythonEvent::PythonEvent(PyObject *obj, Tick when, Priority priority)
- : Event(&mainEventQueue, priority), object(obj)
+PythonEvent::PythonEvent(PyObject *obj, Priority priority)
+ : Event(priority), object(obj)
{
if (object == NULL)
panic("Passed in invalid object");
-
- Py_INCREF(object);
-
- setFlags(AutoDelete);
- schedule(when);
}
PythonEvent::~PythonEvent()
{
- Py_DECREF(object);
}
void
@@ -66,4 +60,27 @@ PythonEvent::process()
async_event = true;
async_exception = true;
}
+
+ // Since the object has been removed from the event queue, its
+ // reference count must be decremented.
+ Py_DECREF(object);
+}
+
+CountedDrainEvent *
+createCountedDrain()
+{
+ return new CountedDrainEvent();
+}
+
+void
+cleanupCountedDrain(Event *counted_drain)
+{
+ CountedDrainEvent *event =
+ dynamic_cast<CountedDrainEvent *>(counted_drain);
+ if (event == NULL) {
+ fatal("Called cleanupCountedDrain() on an event that was not "
+ "a CountedDrainEvent.");
+ }
+ assert(event->getCount() == 0);
+ delete event;
}
diff --git a/src/python/swig/pyevent.hh b/src/python/swig/pyevent.hh
index 65e80e9e4..9006a0404 100644
--- a/src/python/swig/pyevent.hh
+++ b/src/python/swig/pyevent.hh
@@ -40,35 +40,16 @@ class PythonEvent : public Event
PyObject *object;
public:
- PythonEvent(PyObject *obj, Tick when, Priority priority = Default_Pri);
+ PythonEvent(PyObject *obj, Event::Priority priority);
~PythonEvent();
+ void incref() { Py_INCREF(object); }
+ void decref() { Py_DECREF(object); }
+
virtual void process();
};
-inline void
-create(PyObject *object, Tick when)
-{
- new PythonEvent(object, when);
-}
-
-inline Event *
-createCountedDrain()
-{
- return new CountedDrainEvent();
-}
-
-inline void
-cleanupCountedDrain(Event *counted_drain)
-{
- CountedDrainEvent *event =
- dynamic_cast<CountedDrainEvent *>(counted_drain);
- if (event == NULL) {
- fatal("Called cleanupCountedDrain() on an event that was not "
- "a CountedDrainEvent.");
- }
- assert(event->getCount() == 0);
- delete event;
-}
+CountedDrainEvent *createCountedDrain();
+void cleanupCountedDrain(Event *counted_drain);
#endif // __PYTHON_SWIG_PYEVENT_HH__
diff --git a/src/python/swig/range.i b/src/python/swig/range.i
index 40809dae4..309e6a8ba 100644
--- a/src/python/swig/range.i
+++ b/src/python/swig/range.i
@@ -28,6 +28,8 @@
* Authors: Nathan Binkert
*/
+%rename(assign) *::operator=;
+
%include "base/range.hh"
%include "sim/host.hh"
diff --git a/src/python/swig/stats.i b/src/python/swig/stats.i
index d36f82dbc..284df8ff8 100644
--- a/src/python/swig/stats.i
+++ b/src/python/swig/stats.i
@@ -48,7 +48,8 @@ void initMySQL(std::string host, std::string database, std::string user,
void StatEvent(bool dump, bool reset, Tick when = curTick, Tick repeat = 0);
-void check();
+void enable();
+void prepare();
void dump();
void reset();