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