sim: Use the canonical way of iterating over a dictionary
[gem5.git] / src / python / m5 / event.py
index 35095599d7f8b78f2f9768fbaa2310e018442ad7..74863a953c61bcfcdcdc521bfeaad92d3a950cb1 100644 (file)
@@ -1,4 +1,18 @@
+# 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) 2006 The Regents of The University of Michigan
+# Copyright (c) 2013 Advanced Micro Devices, Inc.
+# Copyright (c) 2013 Mark D. Hill and David A. Wood
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 #
 # Authors: Nathan Binkert
 
+from __future__ import print_function
+
 import m5
-import internal.event
+import _m5.event
+
+from _m5.event import GlobalSimLoopExitEvent as SimExit
+from _m5.event import PyEvent as Event
+from _m5.event import getEventQueue, setEventQueue
+
+mainq = None
 
-from internal.event import PythonEvent, SimLoopExitEvent as SimExit
+class EventWrapper(Event):
+    """Helper class to wrap callable objects in an Event base class"""
 
-mainq = internal.event.cvar.mainEventQueue
+    def __init__(self, func, **kwargs):
+        super(EventWrapper, self).__init__(**kwargs)
 
-def create(obj, priority=None):
-    if priority is None:
-        priority = Event.Default_Pri
-    return PythonEvent(obj, priority)
+        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), )
 
-# As a reminder, priorities found in sim/eventq.hh are stuck into the
-# Event class by swig
-class Event(PythonEvent):
-    def __init__(self, priority=None):
-        if priority is None:
-            priority = Event.Default_Pri
-        super(Event, self).__init__(self, priority)
 
 class ProgressEvent(Event):
     def __init__(self, eventq, period):
@@ -55,7 +78,14 @@ class ProgressEvent(Event):
         self.eventq.schedule(self, m5.curTick() + self.period)
 
     def __call__(self):
-        print "Progress! Time now %fs" % (m5.curTick()/1e12)
+        print("Progress! Time now %fs" % (m5.curTick()/1e12))
         self.eventq.schedule(self, m5.curTick() + self.period)
 
-__all__ = [ 'create', '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' ]