python: Add a helper function to create Python events
authorAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 9 May 2017 18:06:39 +0000 (19:06 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 16 May 2017 08:59:04 +0000 (08:59 +0000)
Add a helper function, m5.event.create(), to create events from
Python. This function takes a callable Python object (e.g., a
function) as an argument and optionally a priority as a keyword
argument. This function was accidentally dropped from the public API
when switching to PyBind.

Change-Id: Icbd0e392d9506934ec2c9f541199aa35c1c2df8c
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Curtis Dunham <curtis.dunham@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/3220
Reviewed-by: Gabe Black <gabeblack@google.com>
src/python/m5/event.py

index d1aff9e5fdbc60023c6c7bebaf48c57da77a13a5..20f81b93b20db4acdf8f403ad1bc0e00a3f91182 100644 (file)
@@ -48,6 +48,25 @@ from _m5.event import Event, getEventQueue, setEventQueue
 
 mainq = None
 
+class EventWrapper(Event):
+    """Helper class to wrap callable objects in an Event base class"""
+
+    def __init__(self, func, **kwargs):
+        super(EventWrapper, self).__init__(**kwargs)
+
+        if not callable(func):
+            raise RuntimeError("Can't wrap '%s', object is not callable" % \
+                               str(func))
+
+        self._func = func
+
+    def __call__(self):
+        self._func()
+
+    def __str__(self):
+        return "EventWrapper(%s)" % (str(self._func), )
+
+
 class ProgressEvent(Event):
     def __init__(self, eventq, period):
         super(ProgressEvent, self).__init__()
@@ -59,4 +78,11 @@ class ProgressEvent(Event):
         print "Progress! Time now %fs" % (m5.curTick()/1e12)
         self.eventq.schedule(self, m5.curTick() + self.period)
 
-__all__ = [ 'Event', 'ProgressEvent', 'SimExit', 'mainq' ]
+
+def create(func, priority=Event.Default_Pri):
+    """Create an Event from a function"""
+
+    return EventWrapper(func, priority=priority)
+
+__all__ = [ 'Event', 'EventWrapper', 'ProgressEvent', 'SimExit',
+            'mainq', 'create' ]