core.cc revision 11988
113540Sandrea.mondelli@ucf.edu/* 21376Sbinkertn@umich.edu * Copyright (c) 2017 ARM Limited 31376Sbinkertn@umich.edu * All rights reserved 41376Sbinkertn@umich.edu * 51376Sbinkertn@umich.edu * The license below extends only to copyright in the software and shall 61376Sbinkertn@umich.edu * not be construed as granting a license to any other intellectual 71376Sbinkertn@umich.edu * property including but not limited to intellectual property relating 81376Sbinkertn@umich.edu * to a hardware implementation of the functionality of the software 91376Sbinkertn@umich.edu * licensed hereunder. You may use the software subject to the license 101376Sbinkertn@umich.edu * terms below provided that you ensure that this notice is replicated 111376Sbinkertn@umich.edu * unmodified and in its entirety in all distributions of the software, 121376Sbinkertn@umich.edu * modified or unmodified, in source code or in binary form. 131376Sbinkertn@umich.edu * 141376Sbinkertn@umich.edu * Copyright (c) 2010 Advanced Micro Devices, Inc. 151376Sbinkertn@umich.edu * Copyright (c) 2006 The Regents of The University of Michigan 161376Sbinkertn@umich.edu * All rights reserved. 171376Sbinkertn@umich.edu * 181376Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 191376Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are 201376Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright 211376Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer; 221376Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright 231376Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 241376Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution; 251376Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its 261376Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from 271376Sbinkertn@umich.edu * this software without specific prior written permission. 281376Sbinkertn@umich.edu * 291376Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 301376Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 311385Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 321376Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 331816Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 341376Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 351816Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 361376Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 371385Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 381385Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 391385Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 401385Sbinkertn@umich.edu * 411385Sbinkertn@umich.edu * Authors: Nathan Binkert 421385Sbinkertn@umich.edu * Steve Reinhardt 431385Sbinkertn@umich.edu * Gabe Black 441816Sbinkertn@umich.edu * Andreas Sandberg 451816Sbinkertn@umich.edu */ 461816Sbinkertn@umich.edu 471816Sbinkertn@umich.edu#include "pybind11/pybind11.h" 481816Sbinkertn@umich.edu 491816Sbinkertn@umich.edu#include <ctime> 501816Sbinkertn@umich.edu 511816Sbinkertn@umich.edu#include "base/addr_range.hh" 521816Sbinkertn@umich.edu#include "base/inet.hh" 531816Sbinkertn@umich.edu#include "base/misc.hh" 541816Sbinkertn@umich.edu#include "base/random.hh" 551816Sbinkertn@umich.edu#include "base/socket.hh" 561816Sbinkertn@umich.edu#include "base/types.hh" 571816Sbinkertn@umich.edu#include "sim/core.hh" 581816Sbinkertn@umich.edu#include "sim/drain.hh" 591816Sbinkertn@umich.edu#include "sim/serialize.hh" 601816Sbinkertn@umich.edu#include "sim/sim_object.hh" 611816Sbinkertn@umich.edu 621816Sbinkertn@umich.edunamespace py = pybind11; 631816Sbinkertn@umich.edu 641816Sbinkertn@umich.edu/** Resolve a SimObject name using the Pybind configuration */ 651816Sbinkertn@umich.educlass PybindSimObjectResolver : public SimObjectResolver 661816Sbinkertn@umich.edu{ 671816Sbinkertn@umich.edu SimObject *resolveSimObject(const std::string &name); 681816Sbinkertn@umich.edu}; 691816Sbinkertn@umich.edu 701816Sbinkertn@umich.eduPybindSimObjectResolver pybindSimObjectResolver; 711816Sbinkertn@umich.edu 721816Sbinkertn@umich.eduSimObject * 731816Sbinkertn@umich.eduPybindSimObjectResolver::resolveSimObject(const std::string &name) 741816Sbinkertn@umich.edu{ 751816Sbinkertn@umich.edu // TODO 761385Sbinkertn@umich.edu py::module m = py::module::import("m5.SimObject"); 771376Sbinkertn@umich.edu auto f = m.attr("resolveSimObject"); 781376Sbinkertn@umich.edu 791376Sbinkertn@umich.edu return f(name).cast<SimObject *>(); 801602Sbinkertn@umich.edu} 811376Sbinkertn@umich.edu 821956Ssaidi@eecs.umich.eduextern const char *compileDate; 831956Ssaidi@eecs.umich.edu 841376Sbinkertn@umich.edu#ifdef DEBUG 851376Sbinkertn@umich.educonst bool flag_DEBUG = true; 861376Sbinkertn@umich.edu#else 871916Sbinkertn@umich.educonst bool flag_DEBUG = false; 881376Sbinkertn@umich.edu#endif 891376Sbinkertn@umich.edu#ifdef NDEBUG 901602Sbinkertn@umich.educonst bool flag_NDEBUG = true; 911916Sbinkertn@umich.edu#else 921376Sbinkertn@umich.educonst bool flag_NDEBUG = false; 931376Sbinkertn@umich.edu#endif 941376Sbinkertn@umich.educonst bool flag_TRACING_ON = TRACING_ON; 951376Sbinkertn@umich.edu 961376Sbinkertn@umich.edustatic void 971376Sbinkertn@umich.eduinit_drain(py::module &m_native) 981376Sbinkertn@umich.edu{ 991376Sbinkertn@umich.edu py::module m = m_native.def_submodule("drain"); 1001376Sbinkertn@umich.edu 1011948Sbinkertn@umich.edu py::enum_<DrainState>(m, "DrainState") 1021376Sbinkertn@umich.edu .value("Running", DrainState::Running) 1031376Sbinkertn@umich.edu .value("Draining", DrainState::Draining) 1041376Sbinkertn@umich.edu .value("Drained", DrainState::Drained) 1051916Sbinkertn@umich.edu ; 1061376Sbinkertn@umich.edu 1071376Sbinkertn@umich.edu py::class_<Drainable, std::unique_ptr<Drainable, py::nodelete>>( 1081376Sbinkertn@umich.edu m, "Drainable") 1091376Sbinkertn@umich.edu .def("drainState", &Drainable::drainState) 1101376Sbinkertn@umich.edu .def("notifyFork", &Drainable::notifyFork) 1111376Sbinkertn@umich.edu ; 1121376Sbinkertn@umich.edu 1131916Sbinkertn@umich.edu // The drain manager is a singleton with a private 1141881Sbinkertn@umich.edu // destructor. Disable deallocation from the Python binding. 1151881Sbinkertn@umich.edu py::class_<DrainManager, std::unique_ptr<DrainManager, py::nodelete>>( 1161881Sbinkertn@umich.edu m, "DrainManager") 1171916Sbinkertn@umich.edu .def("tryDrain", &DrainManager::tryDrain) 1181948Sbinkertn@umich.edu .def("resume", &DrainManager::resume) 1191881Sbinkertn@umich.edu .def("preCheckpointRestore", &DrainManager::preCheckpointRestore) 1201381Sbinkertn@umich.edu .def("isDrained", &DrainManager::isDrained) 1211881Sbinkertn@umich.edu .def("state", &DrainManager::state) 1221881Sbinkertn@umich.edu .def("signalDrainDone", &DrainManager::signalDrainDone) 1231381Sbinkertn@umich.edu .def_static("instance", &DrainManager::instance, 1241376Sbinkertn@umich.edu py::return_value_policy::reference) 1251916Sbinkertn@umich.edu ; 1261916Sbinkertn@umich.edu} 1271381Sbinkertn@umich.edu 1281376Sbinkertn@umich.edustatic void 1291381Sbinkertn@umich.eduinit_serialize(py::module &m_native) 1301376Sbinkertn@umich.edu{ 1311381Sbinkertn@umich.edu py::module m = m_native.def_submodule("serialize"); 1321376Sbinkertn@umich.edu 1331376Sbinkertn@umich.edu py::class_<Serializable>(m, "Serializable") 1341602Sbinkertn@umich.edu ; 1351602Sbinkertn@umich.edu 1361381Sbinkertn@umich.edu py::class_<CheckpointIn>(m, "CheckpointIn") 1371376Sbinkertn@umich.edu ; 1381948Sbinkertn@umich.edu} 1391948Sbinkertn@umich.edu 1401381Sbinkertn@umich.edustatic void 1411381Sbinkertn@umich.eduinit_range(py::module &m_native) 1421916Sbinkertn@umich.edu{ 1431916Sbinkertn@umich.edu py::module m = m_native.def_submodule("range"); 1441916Sbinkertn@umich.edu 1451916Sbinkertn@umich.edu py::class_<AddrRange>(m, "AddrRange") 1461381Sbinkertn@umich.edu .def(py::init<>()) 1471376Sbinkertn@umich.edu .def(py::init<Addr &, Addr &>()) 1481376Sbinkertn@umich.edu .def(py::init<const std::vector<AddrRange> &>()) 1491881Sbinkertn@umich.edu .def(py::init<Addr, Addr, uint8_t, uint8_t, uint8_t, uint8_t>()) 1501881Sbinkertn@umich.edu 1511381Sbinkertn@umich.edu .def("__str__", &AddrRange::to_string) 1521376Sbinkertn@umich.edu 1531376Sbinkertn@umich.edu .def("interleaved", &AddrRange::interleaved) 1541376Sbinkertn@umich.edu .def("hashed", &AddrRange::hashed) 1551881Sbinkertn@umich.edu .def("granularity", &AddrRange::granularity) 1561881Sbinkertn@umich.edu .def("stripes", &AddrRange::stripes) 1571881Sbinkertn@umich.edu .def("size", &AddrRange::size) 1581881Sbinkertn@umich.edu .def("valid", &AddrRange::valid) 1591881Sbinkertn@umich.edu .def("start", &AddrRange::start) 1601948Sbinkertn@umich.edu .def("end", &AddrRange::end) 1611385Sbinkertn@umich.edu .def("mergesWith", &AddrRange::mergesWith) 1621385Sbinkertn@umich.edu .def("intersects", &AddrRange::intersects) 1631916Sbinkertn@umich.edu .def("isSubset", &AddrRange::isSubset) 1641916Sbinkertn@umich.edu ; 1651881Sbinkertn@umich.edu 1661376Sbinkertn@umich.edu m.def("RangeEx", &RangeEx); 1671881Sbinkertn@umich.edu m.def("RangeIn", &RangeIn); 1681881Sbinkertn@umich.edu m.def("RangeSize", &RangeSize); 1691376Sbinkertn@umich.edu} 1701881Sbinkertn@umich.edu 1711881Sbinkertn@umich.edustatic void 1721881Sbinkertn@umich.eduinit_net(py::module &m_native) 1731881Sbinkertn@umich.edu{ 1741881Sbinkertn@umich.edu py::module m = m_native.def_submodule("net"); 1751881Sbinkertn@umich.edu 1761376Sbinkertn@umich.edu py::class_<Net::EthAddr>(m, "EthAddr") 1771881Sbinkertn@umich.edu .def(py::init<>()) 1781881Sbinkertn@umich.edu .def(py::init<const std::string &>()) 1791376Sbinkertn@umich.edu ; 1801376Sbinkertn@umich.edu 1811881Sbinkertn@umich.edu py::class_<Net::IpAddress>(m, "IpAddress") 1821881Sbinkertn@umich.edu .def(py::init<>()) 1831881Sbinkertn@umich.edu .def(py::init<uint32_t>()) 1841881Sbinkertn@umich.edu ; 1851881Sbinkertn@umich.edu 1861881Sbinkertn@umich.edu py::class_<Net::IpNetmask, Net::IpAddress>(m, "IpNetmask") 1871881Sbinkertn@umich.edu .def(py::init<>()) 1881376Sbinkertn@umich.edu .def(py::init<uint32_t, uint8_t>()) 1891376Sbinkertn@umich.edu ; 1901376Sbinkertn@umich.edu 1911881Sbinkertn@umich.edu py::class_<Net::IpWithPort, Net::IpAddress>(m, "IpWithPort") 1921881Sbinkertn@umich.edu .def(py::init<>()) 1931376Sbinkertn@umich.edu .def(py::init<uint32_t, uint16_t>()) 1941881Sbinkertn@umich.edu ; 1951881Sbinkertn@umich.edu} 1961376Sbinkertn@umich.edu 1971376Sbinkertn@umich.eduvoid 1981376Sbinkertn@umich.edupybind_init_core(py::module &m_native) 1991881Sbinkertn@umich.edu{ 2001881Sbinkertn@umich.edu py::module m_core = m_native.def_submodule("core"); 2011881Sbinkertn@umich.edu 2021881Sbinkertn@umich.edu py::class_<Cycles>(m_core, "Cycles") 2031376Sbinkertn@umich.edu .def(py::init<>()) 2041881Sbinkertn@umich.edu .def(py::init<uint64_t>()) 2051881Sbinkertn@umich.edu .def("__int__", &Cycles::operator uint64_t) 2061376Sbinkertn@umich.edu .def("__add__", &Cycles::operator+) 2071376Sbinkertn@umich.edu .def("__sub__", &Cycles::operator-) 2081881Sbinkertn@umich.edu ; 2091881Sbinkertn@umich.edu 2101881Sbinkertn@umich.edu py::class_<tm>(m_core, "tm") 2111881Sbinkertn@umich.edu .def_static("gmtime", [](std::time_t t) { return *std::gmtime(&t); }) 2121376Sbinkertn@umich.edu .def_readwrite("tm_sec", &tm::tm_sec) 2131376Sbinkertn@umich.edu .def_readwrite("tm_min", &tm::tm_min) 2141376Sbinkertn@umich.edu .def_readwrite("tm_hour", &tm::tm_hour) 2151881Sbinkertn@umich.edu .def_readwrite("tm_mday", &tm::tm_mday) 2161376Sbinkertn@umich.edu .def_readwrite("tm_mon", &tm::tm_mon) 2171881Sbinkertn@umich.edu .def_readwrite("tm_wday", &tm::tm_wday) 2181881Sbinkertn@umich.edu .def_readwrite("tm_yday", &tm::tm_yday) 2191881Sbinkertn@umich.edu .def_readwrite("tm_isdst", &tm::tm_isdst) 2201376Sbinkertn@umich.edu ; 2211881Sbinkertn@umich.edu 2221881Sbinkertn@umich.edu py::enum_<Logger::LogLevel>(m_core, "LogLevel") 2231881Sbinkertn@umich.edu .value("PANIC", Logger::PANIC) 2241881Sbinkertn@umich.edu .value("FATAL", Logger::FATAL) 2251881Sbinkertn@umich.edu .value("WARN", Logger::WARN) 2261816Sbinkertn@umich.edu .value("INFO", Logger::INFO) 2271881Sbinkertn@umich.edu .value("HACK", Logger::HACK) 2281881Sbinkertn@umich.edu ; 2291881Sbinkertn@umich.edu 2301881Sbinkertn@umich.edu m_core 2311881Sbinkertn@umich.edu .def("setLogLevel", &Logger::setLevel) 2321816Sbinkertn@umich.edu .def("setOutputDir", &setOutputDir) 2331881Sbinkertn@umich.edu .def("doExitCleanup", &doExitCleanup) 2341881Sbinkertn@umich.edu 2351881Sbinkertn@umich.edu .def("disableAllListeners", &ListenSocket::disableAll) 2361881Sbinkertn@umich.edu .def("listenersDisabled", &ListenSocket::allDisabled) 2371881Sbinkertn@umich.edu .def("seedRandom", [](uint64_t seed) { random_mt.init(seed); }) 2381376Sbinkertn@umich.edu 2391881Sbinkertn@umich.edu 2401881Sbinkertn@umich.edu .def("setClockFrequency", &setClockFrequency) 2411881Sbinkertn@umich.edu .def("curTick", curTick) 2421881Sbinkertn@umich.edu ; 2431881Sbinkertn@umich.edu 2441881Sbinkertn@umich.edu /* TODO: These should be read-only */ 2451881Sbinkertn@umich.edu m_core.attr("compileDate") = py::cast(compileDate); 2461376Sbinkertn@umich.edu 2471881Sbinkertn@umich.edu m_core.attr("flag_DEBUG") = py::cast(flag_DEBUG); 2481881Sbinkertn@umich.edu m_core.attr("flag_DEBUG") = py::cast(flag_DEBUG); 2491881Sbinkertn@umich.edu m_core.attr("flag_NDEBUG") = py::cast(flag_NDEBUG); 2501881Sbinkertn@umich.edu m_core.attr("flag_TRACING_ON") = py::cast(flag_TRACING_ON); 2511881Sbinkertn@umich.edu 2521881Sbinkertn@umich.edu m_core.attr("MaxTick") = py::cast(MaxTick); 2531916Sbinkertn@umich.edu 2541916Sbinkertn@umich.edu /* 2551916Sbinkertn@umich.edu * Serialization helpers 2561881Sbinkertn@umich.edu */ 2571881Sbinkertn@umich.edu m_core 2581881Sbinkertn@umich.edu .def("serializeAll", &Serializable::serializeAll) 2591881Sbinkertn@umich.edu .def("unserializeGlobals", &Serializable::unserializeGlobals) 2601881Sbinkertn@umich.edu .def("getCheckpoint", [](const std::string &cpt_dir) { 2611385Sbinkertn@umich.edu return new CheckpointIn(cpt_dir, pybindSimObjectResolver); 2621376Sbinkertn@umich.edu }) 2631376Sbinkertn@umich.edu 2641376Sbinkertn@umich.edu ; 2651881Sbinkertn@umich.edu 2661881Sbinkertn@umich.edu 2671376Sbinkertn@umich.edu init_drain(m_native); 2681916Sbinkertn@umich.edu init_serialize(m_native); 2691881Sbinkertn@umich.edu init_range(m_native); 2701881Sbinkertn@umich.edu init_net(m_native); 2711916Sbinkertn@umich.edu} 2721916Sbinkertn@umich.edu 2731916Sbinkertn@umich.edu