sc_spawn.cc revision 13260
112839Sgabeblack@google.com/*
212839Sgabeblack@google.com * Copyright 2018 Google, Inc.
312839Sgabeblack@google.com *
412839Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
512839Sgabeblack@google.com * modification, are permitted provided that the following conditions are
612839Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
712839Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
812839Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
912839Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1012839Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1112839Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1212839Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1312839Sgabeblack@google.com * this software without specific prior written permission.
1412839Sgabeblack@google.com *
1512839Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1612839Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1712839Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1812839Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1912839Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2012839Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2112839Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2212839Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2312839Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2412839Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2512839Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2612839Sgabeblack@google.com *
2712839Sgabeblack@google.com * Authors: Gabe Black
2812839Sgabeblack@google.com */
2912839Sgabeblack@google.com
3012839Sgabeblack@google.com#include "base/logging.hh"
3112993Sgabeblack@google.com#include "systemc/core/process.hh"
3212993Sgabeblack@google.com#include "systemc/core/process_types.hh"
3312993Sgabeblack@google.com#include "systemc/core/scheduler.hh"
3413129Sgabeblack@google.com#include "systemc/ext/core/sc_main.hh"
3512993Sgabeblack@google.com#include "systemc/ext/core/sc_module.hh"
3612839Sgabeblack@google.com#include "systemc/ext/core/sc_spawn.hh"
3712839Sgabeblack@google.com
3812993Sgabeblack@google.comnamespace sc_gem5
3912993Sgabeblack@google.com{
4012993Sgabeblack@google.com
4112993Sgabeblack@google.comProcess *
4212993Sgabeblack@google.comspawnWork(ProcessFuncWrapper *func, const char *name,
4312993Sgabeblack@google.com          const ::sc_core::sc_spawn_options *opts)
4412993Sgabeblack@google.com{
4512993Sgabeblack@google.com    bool method = false;
4612993Sgabeblack@google.com    bool dontInitialize = false;
4712993Sgabeblack@google.com    if (opts) {
4812993Sgabeblack@google.com        if (opts->_spawnMethod)
4912993Sgabeblack@google.com            method = true;
5012993Sgabeblack@google.com        if (opts->_dontInitialize)
5112993Sgabeblack@google.com            dontInitialize = true;
5212993Sgabeblack@google.com        if (opts->_stackSize != -1)
5312993Sgabeblack@google.com            warn("Ignoring request to set stack size.\n");
5412993Sgabeblack@google.com    }
5512993Sgabeblack@google.com
5612993Sgabeblack@google.com    if (!name || name[0] == '\0') {
5712993Sgabeblack@google.com        if (method)
5812993Sgabeblack@google.com            name = ::sc_core::sc_gen_unique_name("method_p");
5912993Sgabeblack@google.com        else
6012993Sgabeblack@google.com            name = ::sc_core::sc_gen_unique_name("thread_p");
6112993Sgabeblack@google.com    }
6212993Sgabeblack@google.com
6312993Sgabeblack@google.com    Process *proc;
6412993Sgabeblack@google.com    if (method)
6513131Sgabeblack@google.com        proc = new Method(name, func);
6612993Sgabeblack@google.com    else
6713131Sgabeblack@google.com        proc = new Thread(name, func);
6812993Sgabeblack@google.com
6913194Sgabeblack@google.com    proc->dontInitialize(dontInitialize);
7013194Sgabeblack@google.com
7112993Sgabeblack@google.com    if (opts) {
7212993Sgabeblack@google.com        for (auto e: opts->_events)
7313207Sgabeblack@google.com            newStaticSensitivityEvent(proc, e);
7412993Sgabeblack@google.com
7512993Sgabeblack@google.com        for (auto p: opts->_ports)
7613207Sgabeblack@google.com            newStaticSensitivityPort(proc, p);
7712993Sgabeblack@google.com
7812993Sgabeblack@google.com        for (auto e: opts->_exports)
7913207Sgabeblack@google.com            newStaticSensitivityExport(proc, e);
8012993Sgabeblack@google.com
8112993Sgabeblack@google.com        for (auto i: opts->_interfaces)
8213207Sgabeblack@google.com            newStaticSensitivityInterface(proc, i);
8312993Sgabeblack@google.com
8412993Sgabeblack@google.com        for (auto f: opts->_finders)
8513207Sgabeblack@google.com            newStaticSensitivityFinder(proc, f);
8613260Sgabeblack@google.com
8713260Sgabeblack@google.com        for (auto p: opts->_in_resets)
8813260Sgabeblack@google.com            newResetSensitivityPort(proc, p.target, p.value, p.sync);
8913260Sgabeblack@google.com
9013260Sgabeblack@google.com        for (auto p: opts->_inout_resets)
9113260Sgabeblack@google.com            newResetSensitivityPort(proc, p.target, p.value, p.sync);
9213260Sgabeblack@google.com
9313260Sgabeblack@google.com        for (auto p: opts->_out_resets)
9413260Sgabeblack@google.com            newResetSensitivityPort(proc, p.target, p.value, p.sync);
9513260Sgabeblack@google.com
9613260Sgabeblack@google.com        for (auto i: opts->_if_resets)
9713260Sgabeblack@google.com            newResetSensitivitySignal(proc, i.target, i.value, i.sync);
9812993Sgabeblack@google.com    }
9912993Sgabeblack@google.com
10013180Sgabeblack@google.com    if (opts && opts->_dontInitialize &&
10113180Sgabeblack@google.com            opts->_events.empty() && opts->_ports.empty() &&
10213180Sgabeblack@google.com            opts->_exports.empty() && opts->_interfaces.empty() &&
10313180Sgabeblack@google.com            opts->_finders.empty()) {
10413180Sgabeblack@google.com        SC_REPORT_WARNING(
10513180Sgabeblack@google.com                "(W558) disable() or dont_initialize() called on process "
10613180Sgabeblack@google.com                "with no static sensitivity, it will be orphaned",
10713180Sgabeblack@google.com                proc->name());
10813180Sgabeblack@google.com    }
10913180Sgabeblack@google.com
11012993Sgabeblack@google.com    scheduler.reg(proc);
11112993Sgabeblack@google.com
11212993Sgabeblack@google.com    return proc;
11312993Sgabeblack@google.com}
11412993Sgabeblack@google.com
11512993Sgabeblack@google.com} // namespace sc_gem5
11612993Sgabeblack@google.com
11712839Sgabeblack@google.comnamespace sc_core
11812839Sgabeblack@google.com{
11912839Sgabeblack@google.com
12012993Sgabeblack@google.comsc_spawn_options::sc_spawn_options() :
12112993Sgabeblack@google.com    _spawnMethod(false), _dontInitialize(false), _stackSize(-1)
12212993Sgabeblack@google.com{}
12312839Sgabeblack@google.com
12412839Sgabeblack@google.com
12512839Sgabeblack@google.comvoid
12612839Sgabeblack@google.comsc_spawn_options::spawn_method()
12712839Sgabeblack@google.com{
12812993Sgabeblack@google.com    _spawnMethod = true;
12912839Sgabeblack@google.com}
13012839Sgabeblack@google.com
13112839Sgabeblack@google.comvoid
13212839Sgabeblack@google.comsc_spawn_options::dont_initialize()
13312839Sgabeblack@google.com{
13412993Sgabeblack@google.com    _dontInitialize = true;
13512839Sgabeblack@google.com}
13612839Sgabeblack@google.com
13712839Sgabeblack@google.comvoid
13812993Sgabeblack@google.comsc_spawn_options::set_stack_size(int ss)
13912839Sgabeblack@google.com{
14012993Sgabeblack@google.com    _stackSize = ss;
14112839Sgabeblack@google.com}
14212839Sgabeblack@google.com
14312839Sgabeblack@google.com
14412839Sgabeblack@google.comvoid
14512993Sgabeblack@google.comsc_spawn_options::set_sensitivity(const sc_event *e)
14612839Sgabeblack@google.com{
14712993Sgabeblack@google.com    _events.push_back(e);
14812839Sgabeblack@google.com}
14912839Sgabeblack@google.com
15012839Sgabeblack@google.comvoid
15112993Sgabeblack@google.comsc_spawn_options::set_sensitivity(sc_port_base *p)
15212839Sgabeblack@google.com{
15312993Sgabeblack@google.com    _ports.push_back(p);
15412839Sgabeblack@google.com}
15512839Sgabeblack@google.com
15612839Sgabeblack@google.comvoid
15712993Sgabeblack@google.comsc_spawn_options::set_sensitivity(sc_export_base *e)
15812839Sgabeblack@google.com{
15912993Sgabeblack@google.com    _exports.push_back(e);
16012839Sgabeblack@google.com}
16112839Sgabeblack@google.com
16212839Sgabeblack@google.comvoid
16312993Sgabeblack@google.comsc_spawn_options::set_sensitivity(sc_interface *i)
16412839Sgabeblack@google.com{
16512993Sgabeblack@google.com    _interfaces.push_back(i);
16612839Sgabeblack@google.com}
16712839Sgabeblack@google.com
16812839Sgabeblack@google.comvoid
16912993Sgabeblack@google.comsc_spawn_options::set_sensitivity(sc_event_finder *f)
17012839Sgabeblack@google.com{
17112993Sgabeblack@google.com    _finders.push_back(f);
17212839Sgabeblack@google.com}
17312839Sgabeblack@google.com
17412839Sgabeblack@google.com
17512839Sgabeblack@google.comvoid
17613260Sgabeblack@google.comsc_spawn_options::reset_signal_is(const sc_in<bool> &port, bool value)
17712839Sgabeblack@google.com{
17813260Sgabeblack@google.com    _in_resets.emplace_back(&port, value, true);
17912839Sgabeblack@google.com}
18012839Sgabeblack@google.com
18112839Sgabeblack@google.comvoid
18213260Sgabeblack@google.comsc_spawn_options::reset_signal_is(const sc_inout<bool> &port, bool value)
18312839Sgabeblack@google.com{
18413260Sgabeblack@google.com    _inout_resets.emplace_back(&port, value, true);
18512839Sgabeblack@google.com}
18612839Sgabeblack@google.com
18712839Sgabeblack@google.comvoid
18813260Sgabeblack@google.comsc_spawn_options::reset_signal_is(const sc_out<bool> &port, bool value)
18912839Sgabeblack@google.com{
19013260Sgabeblack@google.com    _out_resets.emplace_back(&port, value, true);
19112839Sgabeblack@google.com}
19212839Sgabeblack@google.com
19312839Sgabeblack@google.comvoid
19413260Sgabeblack@google.comsc_spawn_options::reset_signal_is(
19513260Sgabeblack@google.com        const sc_signal_in_if<bool> &iface, bool value)
19612839Sgabeblack@google.com{
19713260Sgabeblack@google.com    _if_resets.emplace_back(&iface, value, true);
19812839Sgabeblack@google.com}
19912839Sgabeblack@google.com
20012839Sgabeblack@google.com
20112839Sgabeblack@google.comvoid
20213260Sgabeblack@google.comsc_spawn_options::async_reset_signal_is(const sc_in<bool> &port, bool value)
20312839Sgabeblack@google.com{
20413260Sgabeblack@google.com    _in_resets.emplace_back(&port, value, false);
20512839Sgabeblack@google.com}
20612839Sgabeblack@google.com
20712839Sgabeblack@google.comvoid
20813260Sgabeblack@google.comsc_spawn_options::async_reset_signal_is(const sc_inout<bool> &port, bool value)
20912839Sgabeblack@google.com{
21013260Sgabeblack@google.com    _inout_resets.emplace_back(&port, value, false);
21112839Sgabeblack@google.com}
21212839Sgabeblack@google.com
21312839Sgabeblack@google.comvoid
21413260Sgabeblack@google.comsc_spawn_options::async_reset_signal_is(const sc_out<bool> &port, bool value)
21512839Sgabeblack@google.com{
21613260Sgabeblack@google.com    _out_resets.emplace_back(&port, value, false);
21712839Sgabeblack@google.com}
21812839Sgabeblack@google.com
21912839Sgabeblack@google.comvoid
22013260Sgabeblack@google.comsc_spawn_options::async_reset_signal_is(
22113260Sgabeblack@google.com        const sc_signal_in_if<bool> &iface, bool value)
22212839Sgabeblack@google.com{
22313260Sgabeblack@google.com    _if_resets.emplace_back(&iface, value, false);
22412839Sgabeblack@google.com}
22512839Sgabeblack@google.com
22612839Sgabeblack@google.com} // namespace sc_core
22712839Sgabeblack@google.com
22812839Sgabeblack@google.comnamespace sc_unnamed
22912839Sgabeblack@google.com{
23012839Sgabeblack@google.com
23112839Sgabeblack@google.comImplementationDefined _1;
23212839Sgabeblack@google.comImplementationDefined _2;
23312839Sgabeblack@google.comImplementationDefined _3;
23412839Sgabeblack@google.comImplementationDefined _4;
23512839Sgabeblack@google.comImplementationDefined _5;
23612839Sgabeblack@google.comImplementationDefined _6;
23712839Sgabeblack@google.comImplementationDefined _7;
23812839Sgabeblack@google.comImplementationDefined _8;
23912839Sgabeblack@google.comImplementationDefined _9;
24012839Sgabeblack@google.com
24112839Sgabeblack@google.com} // namespace sc_unnamed
242