sc_spawn.cc revision 13129
112027Sjungma@eit.uni-kl.de/* 212027Sjungma@eit.uni-kl.de * Copyright 2018 Google, Inc. 312027Sjungma@eit.uni-kl.de * 412027Sjungma@eit.uni-kl.de * Redistribution and use in source and binary forms, with or without 512027Sjungma@eit.uni-kl.de * modification, are permitted provided that the following conditions are 612027Sjungma@eit.uni-kl.de * met: redistributions of source code must retain the above copyright 712027Sjungma@eit.uni-kl.de * notice, this list of conditions and the following disclaimer; 812027Sjungma@eit.uni-kl.de * redistributions in binary form must reproduce the above copyright 912027Sjungma@eit.uni-kl.de * notice, this list of conditions and the following disclaimer in the 1012027Sjungma@eit.uni-kl.de * documentation and/or other materials provided with the distribution; 1112027Sjungma@eit.uni-kl.de * neither the name of the copyright holders nor the names of its 1212027Sjungma@eit.uni-kl.de * contributors may be used to endorse or promote products derived from 1312027Sjungma@eit.uni-kl.de * this software without specific prior written permission. 1412027Sjungma@eit.uni-kl.de * 1512027Sjungma@eit.uni-kl.de * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1612027Sjungma@eit.uni-kl.de * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1712027Sjungma@eit.uni-kl.de * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1812027Sjungma@eit.uni-kl.de * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1912027Sjungma@eit.uni-kl.de * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2012027Sjungma@eit.uni-kl.de * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2112027Sjungma@eit.uni-kl.de * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2212027Sjungma@eit.uni-kl.de * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2312027Sjungma@eit.uni-kl.de * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2412027Sjungma@eit.uni-kl.de * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2512027Sjungma@eit.uni-kl.de * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2612027Sjungma@eit.uni-kl.de * 2712027Sjungma@eit.uni-kl.de * Authors: Gabe Black 2812027Sjungma@eit.uni-kl.de */ 2912027Sjungma@eit.uni-kl.de 3012027Sjungma@eit.uni-kl.de#include "base/logging.hh" 3112027Sjungma@eit.uni-kl.de#include "systemc/core/process.hh" 3212027Sjungma@eit.uni-kl.de#include "systemc/core/process_types.hh" 3312027Sjungma@eit.uni-kl.de#include "systemc/core/scheduler.hh" 3412027Sjungma@eit.uni-kl.de#include "systemc/ext/core/sc_main.hh" 3512027Sjungma@eit.uni-kl.de#include "systemc/ext/core/sc_module.hh" 3612027Sjungma@eit.uni-kl.de#include "systemc/ext/core/sc_spawn.hh" 3712027Sjungma@eit.uni-kl.de 3812027Sjungma@eit.uni-kl.denamespace sc_gem5 3912027Sjungma@eit.uni-kl.de{ 4012027Sjungma@eit.uni-kl.de 4112027Sjungma@eit.uni-kl.deProcess * 4212027Sjungma@eit.uni-kl.despawnWork(ProcessFuncWrapper *func, const char *name, 4312027Sjungma@eit.uni-kl.de const ::sc_core::sc_spawn_options *opts) 4412027Sjungma@eit.uni-kl.de{ 4512027Sjungma@eit.uni-kl.de bool method = false; 4612027Sjungma@eit.uni-kl.de bool dontInitialize = false; 4712027Sjungma@eit.uni-kl.de if (opts) { 4812027Sjungma@eit.uni-kl.de if (opts->_spawnMethod) 4912027Sjungma@eit.uni-kl.de method = true; 5012027Sjungma@eit.uni-kl.de if (opts->_dontInitialize) 5112027Sjungma@eit.uni-kl.de dontInitialize = true; 5212027Sjungma@eit.uni-kl.de if (opts->_stackSize != -1) 5312027Sjungma@eit.uni-kl.de warn("Ignoring request to set stack size.\n"); 5412027Sjungma@eit.uni-kl.de } 5512027Sjungma@eit.uni-kl.de 5612027Sjungma@eit.uni-kl.de if (!name || name[0] == '\0') { 5712027Sjungma@eit.uni-kl.de if (method) 5812027Sjungma@eit.uni-kl.de name = ::sc_core::sc_gen_unique_name("method_p"); 5912027Sjungma@eit.uni-kl.de else 6012027Sjungma@eit.uni-kl.de name = ::sc_core::sc_gen_unique_name("thread_p"); 6112027Sjungma@eit.uni-kl.de } 6212027Sjungma@eit.uni-kl.de 6312027Sjungma@eit.uni-kl.de bool dynamic = 6412027Sjungma@eit.uni-kl.de (::sc_core::sc_get_status() > 6512027Sjungma@eit.uni-kl.de ::sc_core::SC_BEFORE_END_OF_ELABORATION); 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.de Process *proc; 6812027Sjungma@eit.uni-kl.de if (method) 6912027Sjungma@eit.uni-kl.de proc = new Method(name, func, dynamic); 7012027Sjungma@eit.uni-kl.de else 7112027Sjungma@eit.uni-kl.de proc = new Thread(name, func, dynamic); 7212027Sjungma@eit.uni-kl.de 7312027Sjungma@eit.uni-kl.de if (opts) { 7412027Sjungma@eit.uni-kl.de for (auto e: opts->_events) 7512027Sjungma@eit.uni-kl.de proc->addStatic(new PendingSensitivityEvent(proc, e)); 7612027Sjungma@eit.uni-kl.de 7712027Sjungma@eit.uni-kl.de for (auto p: opts->_ports) 7812027Sjungma@eit.uni-kl.de proc->addStatic(new PendingSensitivityPort(proc, p)); 7912027Sjungma@eit.uni-kl.de 8012027Sjungma@eit.uni-kl.de for (auto e: opts->_exports) 8112027Sjungma@eit.uni-kl.de proc->addStatic(new PendingSensitivityExport(proc, e)); 8212027Sjungma@eit.uni-kl.de 8312027Sjungma@eit.uni-kl.de for (auto i: opts->_interfaces) 8412027Sjungma@eit.uni-kl.de proc->addStatic(new PendingSensitivityInterface(proc, i)); 8512027Sjungma@eit.uni-kl.de 8612027Sjungma@eit.uni-kl.de for (auto f: opts->_finders) 8712027Sjungma@eit.uni-kl.de proc->addStatic(new PendingSensitivityFinder(proc, f)); 8812027Sjungma@eit.uni-kl.de } 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.de scheduler.reg(proc); 9112027Sjungma@eit.uni-kl.de 9212027Sjungma@eit.uni-kl.de if (dontInitialize) 9312027Sjungma@eit.uni-kl.de scheduler.dontInitialize(proc); 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.de return proc; 9612027Sjungma@eit.uni-kl.de} 9712027Sjungma@eit.uni-kl.de 9812027Sjungma@eit.uni-kl.de} // namespace sc_gem5 9912027Sjungma@eit.uni-kl.de 10012027Sjungma@eit.uni-kl.denamespace sc_core 10112027Sjungma@eit.uni-kl.de{ 10212027Sjungma@eit.uni-kl.de 10312027Sjungma@eit.uni-kl.desc_spawn_options::sc_spawn_options() : 10412027Sjungma@eit.uni-kl.de _spawnMethod(false), _dontInitialize(false), _stackSize(-1) 10512027Sjungma@eit.uni-kl.de{} 10612027Sjungma@eit.uni-kl.de 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.devoid 10912027Sjungma@eit.uni-kl.desc_spawn_options::spawn_method() 11012027Sjungma@eit.uni-kl.de{ 11112027Sjungma@eit.uni-kl.de _spawnMethod = true; 11212027Sjungma@eit.uni-kl.de} 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.devoid 11512027Sjungma@eit.uni-kl.desc_spawn_options::dont_initialize() 11612027Sjungma@eit.uni-kl.de{ 11712027Sjungma@eit.uni-kl.de _dontInitialize = true; 11812027Sjungma@eit.uni-kl.de} 11912027Sjungma@eit.uni-kl.de 12012027Sjungma@eit.uni-kl.devoid 12112027Sjungma@eit.uni-kl.desc_spawn_options::set_stack_size(int ss) 12212027Sjungma@eit.uni-kl.de{ 12312027Sjungma@eit.uni-kl.de _stackSize = ss; 12412027Sjungma@eit.uni-kl.de} 12512027Sjungma@eit.uni-kl.de 12612027Sjungma@eit.uni-kl.de 12712027Sjungma@eit.uni-kl.devoid 12812027Sjungma@eit.uni-kl.desc_spawn_options::set_sensitivity(const sc_event *e) 12912027Sjungma@eit.uni-kl.de{ 13012027Sjungma@eit.uni-kl.de _events.push_back(e); 13112027Sjungma@eit.uni-kl.de} 13212027Sjungma@eit.uni-kl.de 13312027Sjungma@eit.uni-kl.devoid 13412027Sjungma@eit.uni-kl.desc_spawn_options::set_sensitivity(sc_port_base *p) 13512027Sjungma@eit.uni-kl.de{ 13612027Sjungma@eit.uni-kl.de _ports.push_back(p); 13712027Sjungma@eit.uni-kl.de} 13812027Sjungma@eit.uni-kl.de 13912027Sjungma@eit.uni-kl.devoid 14012027Sjungma@eit.uni-kl.desc_spawn_options::set_sensitivity(sc_export_base *e) 14112027Sjungma@eit.uni-kl.de{ 14212027Sjungma@eit.uni-kl.de _exports.push_back(e); 14312027Sjungma@eit.uni-kl.de} 14412027Sjungma@eit.uni-kl.de 14512027Sjungma@eit.uni-kl.devoid 14612027Sjungma@eit.uni-kl.desc_spawn_options::set_sensitivity(sc_interface *i) 14712027Sjungma@eit.uni-kl.de{ 14812027Sjungma@eit.uni-kl.de _interfaces.push_back(i); 14912027Sjungma@eit.uni-kl.de} 15012027Sjungma@eit.uni-kl.de 15112027Sjungma@eit.uni-kl.devoid 15212027Sjungma@eit.uni-kl.desc_spawn_options::set_sensitivity(sc_event_finder *f) 15312027Sjungma@eit.uni-kl.de{ 15412027Sjungma@eit.uni-kl.de _finders.push_back(f); 15512027Sjungma@eit.uni-kl.de} 15612027Sjungma@eit.uni-kl.de 15712027Sjungma@eit.uni-kl.de 15812027Sjungma@eit.uni-kl.devoid 15912027Sjungma@eit.uni-kl.desc_spawn_options::reset_signal_is(const sc_in<bool> &, bool) 16012027Sjungma@eit.uni-kl.de{ 16112027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", __PRETTY_FUNCTION__); 16212027Sjungma@eit.uni-kl.de} 16312027Sjungma@eit.uni-kl.de 16412027Sjungma@eit.uni-kl.devoid 16512027Sjungma@eit.uni-kl.desc_spawn_options::reset_signal_is(const sc_inout<bool> &, bool) 16612027Sjungma@eit.uni-kl.de{ 16712027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", __PRETTY_FUNCTION__); 16812027Sjungma@eit.uni-kl.de} 16912027Sjungma@eit.uni-kl.de 17012027Sjungma@eit.uni-kl.devoid 17112027Sjungma@eit.uni-kl.desc_spawn_options::reset_signal_is(const sc_out<bool> &, bool) 17212027Sjungma@eit.uni-kl.de{ 17312027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", __PRETTY_FUNCTION__); 17412027Sjungma@eit.uni-kl.de} 17512027Sjungma@eit.uni-kl.de 17612027Sjungma@eit.uni-kl.devoid 17712027Sjungma@eit.uni-kl.desc_spawn_options::reset_signal_is(const sc_signal_in_if<bool> &, bool) 17812027Sjungma@eit.uni-kl.de{ 17912027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", __PRETTY_FUNCTION__); 18012027Sjungma@eit.uni-kl.de} 18112027Sjungma@eit.uni-kl.de 18212027Sjungma@eit.uni-kl.de 18312027Sjungma@eit.uni-kl.devoid 18412027Sjungma@eit.uni-kl.desc_spawn_options::async_reset_signal_is(const sc_in<bool> &, bool) 18512027Sjungma@eit.uni-kl.de{ 18612027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", __PRETTY_FUNCTION__); 18712027Sjungma@eit.uni-kl.de} 18812027Sjungma@eit.uni-kl.de 18912027Sjungma@eit.uni-kl.devoid 19012027Sjungma@eit.uni-kl.desc_spawn_options::async_reset_signal_is(const sc_inout<bool> &, bool) 19112027Sjungma@eit.uni-kl.de{ 19212027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", __PRETTY_FUNCTION__); 19312027Sjungma@eit.uni-kl.de} 19412027Sjungma@eit.uni-kl.de 19512027Sjungma@eit.uni-kl.devoid 19612027Sjungma@eit.uni-kl.desc_spawn_options::async_reset_signal_is(const sc_out<bool> &, bool) 19712027Sjungma@eit.uni-kl.de{ 19812027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", __PRETTY_FUNCTION__); 19912027Sjungma@eit.uni-kl.de} 20012027Sjungma@eit.uni-kl.de 20112027Sjungma@eit.uni-kl.devoid 20212027Sjungma@eit.uni-kl.desc_spawn_options::async_reset_signal_is(const sc_signal_in_if<bool> &, bool) 20312027Sjungma@eit.uni-kl.de{ 20412027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", __PRETTY_FUNCTION__); 20512027Sjungma@eit.uni-kl.de} 20612027Sjungma@eit.uni-kl.de 20712027Sjungma@eit.uni-kl.de 20812027Sjungma@eit.uni-kl.devoid 20912027Sjungma@eit.uni-kl.desc_spawn_warn_unimpl(const char *func) 21012027Sjungma@eit.uni-kl.de{ 21112027Sjungma@eit.uni-kl.de warn("%s not implemented.\n", func); 21212027Sjungma@eit.uni-kl.de} 21312027Sjungma@eit.uni-kl.de 21412027Sjungma@eit.uni-kl.de} // namespace sc_core 21512027Sjungma@eit.uni-kl.de 21612027Sjungma@eit.uni-kl.denamespace sc_unnamed 21712027Sjungma@eit.uni-kl.de{ 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.deImplementationDefined _1; 22012027Sjungma@eit.uni-kl.deImplementationDefined _2; 22112027Sjungma@eit.uni-kl.deImplementationDefined _3; 22212027Sjungma@eit.uni-kl.deImplementationDefined _4; 22312027Sjungma@eit.uni-kl.deImplementationDefined _5; 22412027Sjungma@eit.uni-kl.deImplementationDefined _6; 22512027Sjungma@eit.uni-kl.deImplementationDefined _7; 22612027Sjungma@eit.uni-kl.deImplementationDefined _8; 22712027Sjungma@eit.uni-kl.deImplementationDefined _9; 22812027Sjungma@eit.uni-kl.de 22912027Sjungma@eit.uni-kl.de} // namespace sc_unnamed 23012027Sjungma@eit.uni-kl.de