event.cc revision 12334
17404SAli.Saidi@ARM.com/* 27404SAli.Saidi@ARM.com * Copyright (c) 2017 ARM Limited 37404SAli.Saidi@ARM.com * All rights reserved 47404SAli.Saidi@ARM.com * 57404SAli.Saidi@ARM.com * The license below extends only to copyright in the software and shall 67404SAli.Saidi@ARM.com * not be construed as granting a license to any other intellectual 77404SAli.Saidi@ARM.com * property including but not limited to intellectual property relating 87404SAli.Saidi@ARM.com * to a hardware implementation of the functionality of the software 97404SAli.Saidi@ARM.com * licensed hereunder. You may use the software subject to the license 107404SAli.Saidi@ARM.com * terms below provided that you ensure that this notice is replicated 117404SAli.Saidi@ARM.com * unmodified and in its entirety in all distributions of the software, 127404SAli.Saidi@ARM.com * modified or unmodified, in source code or in binary form. 137404SAli.Saidi@ARM.com * 147404SAli.Saidi@ARM.com * Copyright (c) 2006 The Regents of The University of Michigan 157404SAli.Saidi@ARM.com * Copyright (c) 2013 Advanced Micro Devices, Inc. 167404SAli.Saidi@ARM.com * Copyright (c) 2013 Mark D. Hill and David A. Wood 177404SAli.Saidi@ARM.com * All rights reserved. 187404SAli.Saidi@ARM.com * 197404SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 207404SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 217404SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 227404SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 237404SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 247404SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 257404SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 267404SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 277404SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 287404SAli.Saidi@ARM.com * this software without specific prior written permission. 297404SAli.Saidi@ARM.com * 307404SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 317404SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 327404SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 337404SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 347404SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 357404SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 367404SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 377404SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 387404SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 397404SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 407404SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 417404SAli.Saidi@ARM.com * 427404SAli.Saidi@ARM.com * Authors: Nathan Binkert 437578Sdam.sunwoo@arm.com * Andreas Sandberg 447578Sdam.sunwoo@arm.com */ 457404SAli.Saidi@ARM.com 467404SAli.Saidi@ARM.com#include "pybind11/pybind11.h" 477404SAli.Saidi@ARM.com#include "pybind11/stl.h" 487404SAli.Saidi@ARM.com 497404SAli.Saidi@ARM.com#include "base/logging.hh" 507404SAli.Saidi@ARM.com#include "sim/eventq.hh" 517404SAli.Saidi@ARM.com#include "sim/sim_events.hh" 527404SAli.Saidi@ARM.com#include "sim/sim_exit.hh" 537404SAli.Saidi@ARM.com#include "sim/simulate.hh" 547404SAli.Saidi@ARM.com 557404SAli.Saidi@ARM.comnamespace py = pybind11; 567404SAli.Saidi@ARM.com 577404SAli.Saidi@ARM.com 587404SAli.Saidi@ARM.com/** 597404SAli.Saidi@ARM.com * PyBind wrapper for Events 607404SAli.Saidi@ARM.com * 617404SAli.Saidi@ARM.com * We need to wrap the Event class with some Python glue code to 627404SAli.Saidi@ARM.com * enable method overrides in Python and memory management. Unlike its 637404SAli.Saidi@ARM.com * C++ cousin, PyEvents need to override __call__ instead of 647404SAli.Saidi@ARM.com * Event::process(). 657404SAli.Saidi@ARM.com * 667404SAli.Saidi@ARM.com * Memory management is done using reference counting in Python. 677404SAli.Saidi@ARM.com */ 687404SAli.Saidi@ARM.comclass PyEvent : public Event 697404SAli.Saidi@ARM.com{ 707404SAli.Saidi@ARM.com public: 717404SAli.Saidi@ARM.com PyEvent(Event::Priority priority) 727404SAli.Saidi@ARM.com : Event(priority, Event::Managed) 737436Sdam.sunwoo@arm.com { 747404SAli.Saidi@ARM.com } 757404SAli.Saidi@ARM.com 767436Sdam.sunwoo@arm.com void process() override { 777436Sdam.sunwoo@arm.com // Call the Python implementation as __call__. This provides a 787436Sdam.sunwoo@arm.com // slightly more Python-friendly interface. 797436Sdam.sunwoo@arm.com PYBIND11_OVERLOAD_PURE_NAME(void, PyEvent, "__call__", process); 807404SAli.Saidi@ARM.com } 817404SAli.Saidi@ARM.com 827404SAli.Saidi@ARM.com protected: 837404SAli.Saidi@ARM.com void acquireImpl() override { 847404SAli.Saidi@ARM.com py::object obj = py::cast(this); 857404SAli.Saidi@ARM.com 867404SAli.Saidi@ARM.com if (obj) { 877404SAli.Saidi@ARM.com obj.inc_ref(); 887404SAli.Saidi@ARM.com } else { 897404SAli.Saidi@ARM.com panic("Failed to get PyBind object to increase ref count\n"); 907404SAli.Saidi@ARM.com } 917404SAli.Saidi@ARM.com } 927404SAli.Saidi@ARM.com 937404SAli.Saidi@ARM.com void releaseImpl() override { 947404SAli.Saidi@ARM.com py::object obj = py::cast(this); 957404SAli.Saidi@ARM.com 967404SAli.Saidi@ARM.com if (obj) { 977404SAli.Saidi@ARM.com obj.dec_ref(); 987404SAli.Saidi@ARM.com } else { 997404SAli.Saidi@ARM.com panic("Failed to get PyBind object to decrease ref count\n"); 1007404SAli.Saidi@ARM.com } 1017404SAli.Saidi@ARM.com } 1027404SAli.Saidi@ARM.com}; 1037404SAli.Saidi@ARM.com 1047404SAli.Saidi@ARM.comvoid 1057404SAli.Saidi@ARM.compybind_init_event(py::module &m_native) 1067404SAli.Saidi@ARM.com{ 1077404SAli.Saidi@ARM.com py::module m = m_native.def_submodule("event"); 1087404SAli.Saidi@ARM.com 1097404SAli.Saidi@ARM.com m.def("simulate", &simulate, 1107608SGene.Wu@arm.com py::arg("ticks") = MaxTick); 1117404SAli.Saidi@ARM.com m.def("exitSimLoop", &exitSimLoop); 1127404SAli.Saidi@ARM.com m.def("getEventQueue", []() { return curEventQueue(); }, 1137404SAli.Saidi@ARM.com py::return_value_policy::reference); 1147404SAli.Saidi@ARM.com m.def("setEventQueue", [](EventQueue *q) { return curEventQueue(q); }); 1157404SAli.Saidi@ARM.com m.def("getEventQueue", &getEventQueue, 1167608SGene.Wu@arm.com py::return_value_policy::reference); 1177404SAli.Saidi@ARM.com 1187404SAli.Saidi@ARM.com py::class_<EventQueue>(m, "EventQueue") 1197404SAli.Saidi@ARM.com .def("name", [](EventQueue *eq) { return eq->name(); }) 1207404SAli.Saidi@ARM.com .def("dump", &EventQueue::dump) 1217404SAli.Saidi@ARM.com .def("schedule", [](EventQueue *eq, PyEvent *e, Tick t) { 1227404SAli.Saidi@ARM.com eq->schedule(e, t); 1237404SAli.Saidi@ARM.com }, py::arg("event"), py::arg("when")) 1247404SAli.Saidi@ARM.com .def("deschedule", &EventQueue::deschedule, 1257404SAli.Saidi@ARM.com py::arg("event")) 1267404SAli.Saidi@ARM.com .def("reschedule", &EventQueue::reschedule, 1277404SAli.Saidi@ARM.com py::arg("event"), py::arg("tick"), py::arg("always") = false) 1287404SAli.Saidi@ARM.com ; 1297404SAli.Saidi@ARM.com 1307404SAli.Saidi@ARM.com // TODO: Ownership of global exit events has always been a bit 1317404SAli.Saidi@ARM.com // questionable. We currently assume they are owned by the C++ 1327404SAli.Saidi@ARM.com // world. This is what the old SWIG code did, but that will result 1337404SAli.Saidi@ARM.com // in memory leaks. 1347404SAli.Saidi@ARM.com py::class_<GlobalSimLoopExitEvent, 1357404SAli.Saidi@ARM.com std::unique_ptr<GlobalSimLoopExitEvent, py::nodelete>>( 1367404SAli.Saidi@ARM.com m, "GlobalSimLoopExitEvent") 1377436Sdam.sunwoo@arm.com .def("getCause", &GlobalSimLoopExitEvent::getCause) 1387436Sdam.sunwoo@arm.com .def("getCode", [](GlobalSimLoopExitEvent *e) { 1397436Sdam.sunwoo@arm.com return py::reinterpret_steal<py::object>( 1407436Sdam.sunwoo@arm.com PyInt_FromLong(e->getCode())); 1417436Sdam.sunwoo@arm.com }) 1427404SAli.Saidi@ARM.com ; 1437404SAli.Saidi@ARM.com 1447406SAli.Saidi@ARM.com // Event base class. These should never be returned directly to 1457404SAli.Saidi@ARM.com // Python since they don't have a well-defined life cycle. Python 1467404SAli.Saidi@ARM.com // events should be derived from PyEvent instead. 1477436Sdam.sunwoo@arm.com py::class_<Event> c_event( 1487436Sdam.sunwoo@arm.com m, "Event"); 1497436Sdam.sunwoo@arm.com c_event 1507436Sdam.sunwoo@arm.com .def("name", &Event::name) 1517436Sdam.sunwoo@arm.com .def("dump", &Event::dump) 1527436Sdam.sunwoo@arm.com .def("scheduled", &Event::scheduled) 1537436Sdam.sunwoo@arm.com .def("squash", &Event::squash) 1547436Sdam.sunwoo@arm.com .def("squashed", &Event::squashed) 1557436Sdam.sunwoo@arm.com .def("isExitEvent", &Event::isExitEvent) 1567436Sdam.sunwoo@arm.com .def("when", &Event::when) 1577436Sdam.sunwoo@arm.com .def("priority", &Event::priority) 1587436Sdam.sunwoo@arm.com ; 1597436Sdam.sunwoo@arm.com 1607436Sdam.sunwoo@arm.com py::class_<PyEvent, Event>(m, "PyEvent") 1617436Sdam.sunwoo@arm.com .def(py::init<Event::Priority>(), 1627436Sdam.sunwoo@arm.com py::arg("priority") = (int)Event::Default_Pri) 1637436Sdam.sunwoo@arm.com ; 1647436Sdam.sunwoo@arm.com 1657436Sdam.sunwoo@arm.com#define PRIO(n) c_event.attr(# n) = py::cast((int)Event::n) 1667436Sdam.sunwoo@arm.com PRIO(Minimum_Pri); 1677404SAli.Saidi@ARM.com PRIO(Minimum_Pri); 1687404SAli.Saidi@ARM.com PRIO(Debug_Enable_Pri); 1697404SAli.Saidi@ARM.com PRIO(Debug_Break_Pri); 1707404SAli.Saidi@ARM.com PRIO(CPU_Switch_Pri); 1717404SAli.Saidi@ARM.com PRIO(Delayed_Writeback_Pri); 1727436Sdam.sunwoo@arm.com PRIO(Default_Pri); 1737404SAli.Saidi@ARM.com PRIO(DVFS_Update_Pri); 1747404SAli.Saidi@ARM.com PRIO(Serialize_Pri); 1757436Sdam.sunwoo@arm.com PRIO(CPU_Tick_Pri); 1767436Sdam.sunwoo@arm.com PRIO(Stat_Event_Pri); 1777436Sdam.sunwoo@arm.com PRIO(Progress_Event_Pri); 1787436Sdam.sunwoo@arm.com PRIO(Sim_Exit_Pri); 1797404SAli.Saidi@ARM.com PRIO(Maximum_Pri); 1807404SAli.Saidi@ARM.com} 1817404SAli.Saidi@ARM.com