sc_main.cc revision 12860
111185Serfan.azarkhish@unibo.it/* 211185Serfan.azarkhish@unibo.it * Copyright 2018 Google, Inc. 311185Serfan.azarkhish@unibo.it * 411185Serfan.azarkhish@unibo.it * Redistribution and use in source and binary forms, with or without 511185Serfan.azarkhish@unibo.it * modification, are permitted provided that the following conditions are 611185Serfan.azarkhish@unibo.it * met: redistributions of source code must retain the above copyright 711185Serfan.azarkhish@unibo.it * notice, this list of conditions and the following disclaimer; 811185Serfan.azarkhish@unibo.it * redistributions in binary form must reproduce the above copyright 911185Serfan.azarkhish@unibo.it * notice, this list of conditions and the following disclaimer in the 1011185Serfan.azarkhish@unibo.it * documentation and/or other materials provided with the distribution; 1111185Serfan.azarkhish@unibo.it * neither the name of the copyright holders nor the names of its 1211185Serfan.azarkhish@unibo.it * contributors may be used to endorse or promote products derived from 1311185Serfan.azarkhish@unibo.it * this software without specific prior written permission. 1411185Serfan.azarkhish@unibo.it * 1511185Serfan.azarkhish@unibo.it * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1611185Serfan.azarkhish@unibo.it * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1711185Serfan.azarkhish@unibo.it * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1811185Serfan.azarkhish@unibo.it * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1911185Serfan.azarkhish@unibo.it * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2011185Serfan.azarkhish@unibo.it * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2111185Serfan.azarkhish@unibo.it * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2211185Serfan.azarkhish@unibo.it * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2311185Serfan.azarkhish@unibo.it * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2411185Serfan.azarkhish@unibo.it * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2511185Serfan.azarkhish@unibo.it * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2611185Serfan.azarkhish@unibo.it * 2711185Serfan.azarkhish@unibo.it * Authors: Gabe Black 2811185Serfan.azarkhish@unibo.it */ 2911185Serfan.azarkhish@unibo.it 3011185Serfan.azarkhish@unibo.it#include <cstring> 3111185Serfan.azarkhish@unibo.it 3211185Serfan.azarkhish@unibo.it#include "base/logging.hh" 3311185Serfan.azarkhish@unibo.it#include "python/pybind11/pybind.hh" 3411185Serfan.azarkhish@unibo.it#include "sim/init.hh" 3511185Serfan.azarkhish@unibo.it#include "systemc/ext/core/sc_main.hh" 3611185Serfan.azarkhish@unibo.it 3711185Serfan.azarkhish@unibo.it// A default version of this function in case one isn't otherwise defined. 3811185Serfan.azarkhish@unibo.it// This ensures everything will link properly whether or not the user defined 3911185Serfan.azarkhish@unibo.it// a custom sc_main function. If they didn't but still try to call it, throw 4011185Serfan.azarkhish@unibo.it// an error and die. 4111185Serfan.azarkhish@unibo.it[[gnu::weak]] int 4211185Serfan.azarkhish@unibo.itsc_main(int argc, char *argv[]) 4311185Serfan.azarkhish@unibo.it{ 4411185Serfan.azarkhish@unibo.it // If python attempts to call sc_main but no sc_main was defined... 4511185Serfan.azarkhish@unibo.it fatal("sc_main called but not defined.\n"); 4611185Serfan.azarkhish@unibo.it} 4711185Serfan.azarkhish@unibo.it 4811185Serfan.azarkhish@unibo.itnamespace sc_core 4911185Serfan.azarkhish@unibo.it{ 5011185Serfan.azarkhish@unibo.it 5111185Serfan.azarkhish@unibo.itnamespace 5211185Serfan.azarkhish@unibo.it{ 5311185Serfan.azarkhish@unibo.it 5411185Serfan.azarkhish@unibo.itbool scMainCalled = false; 5511185Serfan.azarkhish@unibo.it 5611185Serfan.azarkhish@unibo.itint _argc = 0; 5711185Serfan.azarkhish@unibo.itchar **_argv = NULL; 5811185Serfan.azarkhish@unibo.it 5911185Serfan.azarkhish@unibo.it// This wrapper adapts the python version of sc_main to the c++ version. 6011185Serfan.azarkhish@unibo.itvoid 6111185Serfan.azarkhish@unibo.itsc_main(pybind11::args args) 6211185Serfan.azarkhish@unibo.it{ 6311185Serfan.azarkhish@unibo.it panic_if(scMainCalled, "sc_main called more than once."); 6411185Serfan.azarkhish@unibo.it 6511185Serfan.azarkhish@unibo.it _argc = args.size(); 6611185Serfan.azarkhish@unibo.it _argv = new char *[_argc]; 6711185Serfan.azarkhish@unibo.it 6811185Serfan.azarkhish@unibo.it // Initialize all the _argvs to NULL so we can delete [] them 6911185Serfan.azarkhish@unibo.it // unconditionally. 7011185Serfan.azarkhish@unibo.it for (int idx = 0; idx < _argc; idx++) 7111185Serfan.azarkhish@unibo.it _argv[idx] = NULL; 7211185Serfan.azarkhish@unibo.it 7311185Serfan.azarkhish@unibo.it // Attempt to convert all the arguments to strings. If that fails, clean 7411185Serfan.azarkhish@unibo.it // up after ourselves. Also don't count this as a call to sc_main since 7511185Serfan.azarkhish@unibo.it // we never got to the c++ version of that function. 7611185Serfan.azarkhish@unibo.it try { 7711185Serfan.azarkhish@unibo.it for (int idx = 0; idx < _argc; idx++) { 7811185Serfan.azarkhish@unibo.it std::string arg = args[idx].cast<std::string>(); 7911185Serfan.azarkhish@unibo.it _argv[idx] = new char[arg.length() + 1]; 8011185Serfan.azarkhish@unibo.it strcpy(_argv[idx], arg.c_str()); 8111185Serfan.azarkhish@unibo.it } 8211185Serfan.azarkhish@unibo.it } catch (...) { 8311185Serfan.azarkhish@unibo.it // If that didn't work for some reason (probably a conversion error) 8411185Serfan.azarkhish@unibo.it // blow away _argv and _argc and pass on the exception. 8511185Serfan.azarkhish@unibo.it for (int idx = 0; idx < _argc; idx++) 8611185Serfan.azarkhish@unibo.it delete [] _argv[idx]; 8711185Serfan.azarkhish@unibo.it delete [] _argv; 8811185Serfan.azarkhish@unibo.it _argc = 0; 8911185Serfan.azarkhish@unibo.it throw; 9011185Serfan.azarkhish@unibo.it } 9111185Serfan.azarkhish@unibo.it 9211185Serfan.azarkhish@unibo.it // At this point we're going to call the c++ sc_main, so we can't try 9311185Serfan.azarkhish@unibo.it // again later. 9411185Serfan.azarkhish@unibo.it scMainCalled = true; 9511185Serfan.azarkhish@unibo.it 9611185Serfan.azarkhish@unibo.it //TODO Start a new fiber to call sc_main from. 9711185Serfan.azarkhish@unibo.it ::sc_main(_argc, _argv); 9811185Serfan.azarkhish@unibo.it} 9911185Serfan.azarkhish@unibo.it 10011185Serfan.azarkhish@unibo.it// Make our sc_main wrapper available in the internal _m5 python module under 10111185Serfan.azarkhish@unibo.it// the systemc submodule. 10211185Serfan.azarkhish@unibo.itvoid 10311185Serfan.azarkhish@unibo.itsystemc_pybind(pybind11::module &m_internal) 10411185Serfan.azarkhish@unibo.it{ 10511185Serfan.azarkhish@unibo.it pybind11::module m = m_internal.def_submodule("systemc"); 10611185Serfan.azarkhish@unibo.it m.def("sc_main", &sc_main); 10711185Serfan.azarkhish@unibo.it} 10811185Serfan.azarkhish@unibo.itEmbeddedPyBind embed_("systemc", &systemc_pybind); 10911185Serfan.azarkhish@unibo.it 11011185Serfan.azarkhish@unibo.it} // anonymous namespace 11111185Serfan.azarkhish@unibo.it 11211185Serfan.azarkhish@unibo.itint 11311185Serfan.azarkhish@unibo.itsc_argc() 11411185Serfan.azarkhish@unibo.it{ 11511185Serfan.azarkhish@unibo.it return _argc; 11611185Serfan.azarkhish@unibo.it} 11711185Serfan.azarkhish@unibo.it 11811185Serfan.azarkhish@unibo.itconst char *const * 11911185Serfan.azarkhish@unibo.itsc_argv() 12011185Serfan.azarkhish@unibo.it{ 12111185Serfan.azarkhish@unibo.it return _argv; 12211185Serfan.azarkhish@unibo.it} 12311185Serfan.azarkhish@unibo.it 12411185Serfan.azarkhish@unibo.itvoid 12511185Serfan.azarkhish@unibo.itsc_start() 12611185Serfan.azarkhish@unibo.it{ 12711185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 12811185Serfan.azarkhish@unibo.it} 12911185Serfan.azarkhish@unibo.it 13011185Serfan.azarkhish@unibo.itvoid 13111185Serfan.azarkhish@unibo.itsc_pause() 13211185Serfan.azarkhish@unibo.it{ 13311185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 13411185Serfan.azarkhish@unibo.it} 13511185Serfan.azarkhish@unibo.it 13611185Serfan.azarkhish@unibo.itvoid 13711185Serfan.azarkhish@unibo.itsc_start(const sc_time &time, sc_starvation_policy p) 13811185Serfan.azarkhish@unibo.it{ 13911185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 14011185Serfan.azarkhish@unibo.it} 14111185Serfan.azarkhish@unibo.it 14211185Serfan.azarkhish@unibo.itvoid 14311185Serfan.azarkhish@unibo.itsc_set_stop_mode(sc_stop_mode mode) 14411185Serfan.azarkhish@unibo.it{ 14511185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 14611185Serfan.azarkhish@unibo.it} 14711185Serfan.azarkhish@unibo.it 14811185Serfan.azarkhish@unibo.itsc_stop_mode 14911185Serfan.azarkhish@unibo.itsc_get_stop_mode() 15011185Serfan.azarkhish@unibo.it{ 15111185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 15211185Serfan.azarkhish@unibo.it return SC_STOP_FINISH_DELTA; 15311185Serfan.azarkhish@unibo.it} 15411185Serfan.azarkhish@unibo.it 15511185Serfan.azarkhish@unibo.itvoid 15611185Serfan.azarkhish@unibo.itsc_stop() 15711185Serfan.azarkhish@unibo.it{ 15811185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 15911185Serfan.azarkhish@unibo.it} 16011185Serfan.azarkhish@unibo.it 16111185Serfan.azarkhish@unibo.itconst sc_time & 16211185Serfan.azarkhish@unibo.itsc_time_stamp() 16311185Serfan.azarkhish@unibo.it{ 16411185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 16511185Serfan.azarkhish@unibo.it return *(sc_time *)nullptr; 16611185Serfan.azarkhish@unibo.it} 16711185Serfan.azarkhish@unibo.it 16811185Serfan.azarkhish@unibo.itsc_dt::uint64 16911185Serfan.azarkhish@unibo.itsc_delta_count() 17011185Serfan.azarkhish@unibo.it{ 17111185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 17211185Serfan.azarkhish@unibo.it return 0; 17311185Serfan.azarkhish@unibo.it} 17411185Serfan.azarkhish@unibo.it 17511185Serfan.azarkhish@unibo.itbool 17611185Serfan.azarkhish@unibo.itsc_is_running() 17711185Serfan.azarkhish@unibo.it{ 17811185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 17911185Serfan.azarkhish@unibo.it return false; 18011185Serfan.azarkhish@unibo.it} 18111185Serfan.azarkhish@unibo.it 18211185Serfan.azarkhish@unibo.itbool 18311185Serfan.azarkhish@unibo.itsc_pending_activity_at_current_time() 18411185Serfan.azarkhish@unibo.it{ 18511185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 18611185Serfan.azarkhish@unibo.it return false; 18711185Serfan.azarkhish@unibo.it} 18811284Sandreas.hansson@arm.com 18911185Serfan.azarkhish@unibo.itbool 19011185Serfan.azarkhish@unibo.itsc_pending_activity_at_future_time() 19111185Serfan.azarkhish@unibo.it{ 19211185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 19311185Serfan.azarkhish@unibo.it return false; 19411185Serfan.azarkhish@unibo.it} 19511185Serfan.azarkhish@unibo.it 19611185Serfan.azarkhish@unibo.itbool 19711185Serfan.azarkhish@unibo.itsc_pending_activity() 19811185Serfan.azarkhish@unibo.it{ 19911185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 20011185Serfan.azarkhish@unibo.it return false; 20111185Serfan.azarkhish@unibo.it} 20211185Serfan.azarkhish@unibo.it 20311185Serfan.azarkhish@unibo.itsc_time 20411185Serfan.azarkhish@unibo.itsc_time_to_pending_activity() 20511185Serfan.azarkhish@unibo.it{ 20611185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 20711185Serfan.azarkhish@unibo.it return sc_time(); 20811185Serfan.azarkhish@unibo.it} 20911185Serfan.azarkhish@unibo.it 21011185Serfan.azarkhish@unibo.itsc_status 21111185Serfan.azarkhish@unibo.itsc_get_status() 21211185Serfan.azarkhish@unibo.it{ 21311185Serfan.azarkhish@unibo.it warn("%s not implemented.\n", __PRETTY_FUNCTION__); 21411185Serfan.azarkhish@unibo.it return SC_ELABORATION; 21511185Serfan.azarkhish@unibo.it} 21611185Serfan.azarkhish@unibo.it 21711185Serfan.azarkhish@unibo.it} // namespace sc_core 21811185Serfan.azarkhish@unibo.it