sc_spawn.hh revision 12993
19665Sandreas.hansson@arm.com/* 29665Sandreas.hansson@arm.com * Copyright 2018 Google, Inc. 39665Sandreas.hansson@arm.com * 49665Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 59665Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 69665Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 79665Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 89665Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 99665Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 109665Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 119665Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 129665Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 135353Svilas.sridharan@gmail.com * this software without specific prior written permission. 143395Shsul@eecs.umich.edu * 153395Shsul@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 163395Shsul@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 173395Shsul@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 183395Shsul@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 193395Shsul@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 203395Shsul@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 213395Shsul@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 223395Shsul@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 233395Shsul@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 243395Shsul@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 253395Shsul@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 263395Shsul@eecs.umich.edu * 273395Shsul@eecs.umich.edu * Authors: Gabe Black 283395Shsul@eecs.umich.edu */ 293395Shsul@eecs.umich.edu 303395Shsul@eecs.umich.edu#ifndef __SYSTEMC_EXT_CORE_SC_SPAWN_HH__ 313395Shsul@eecs.umich.edu#define __SYSTEMC_EXT_CORE_SC_SPAWN_HH__ 323395Shsul@eecs.umich.edu 333395Shsul@eecs.umich.edu#include <vector> 343395Shsul@eecs.umich.edu 353395Shsul@eecs.umich.edu#include "sc_process_handle.hh" 363395Shsul@eecs.umich.edu 373395Shsul@eecs.umich.edunamespace sc_core 383395Shsul@eecs.umich.edu{ 393395Shsul@eecs.umich.edu 403395Shsul@eecs.umich.educlass sc_spawn_options; 418920Snilay@cs.wisc.edu 428920Snilay@cs.wisc.edu} // namespace sc_core 438920Snilay@cs.wisc.edu 4411688Sandreas.hansson@arm.comnamespace sc_gem5 457025SBrad.Beckmann@amd.com{ 4611688Sandreas.hansson@arm.com 4711688Sandreas.hansson@arm.comclass Process; 4811688Sandreas.hansson@arm.com 4910747SChris.Emmons@arm.comtemplate <typename T> 509520SAndreas.Sandberg@ARM.comstruct ProcessObjFuncWrapper : public ProcessFuncWrapper 519520SAndreas.Sandberg@ARM.com{ 529520SAndreas.Sandberg@ARM.com T t; 539520SAndreas.Sandberg@ARM.com 549665Sandreas.hansson@arm.com ProcessObjFuncWrapper(T t) : t(t) {} 559665Sandreas.hansson@arm.com 569665Sandreas.hansson@arm.com void call() override { t(); } 579665Sandreas.hansson@arm.com}; 5811238Sandreas.sandberg@arm.com 5911238Sandreas.sandberg@arm.comtemplate <typename T, typename R> 6011238Sandreas.sandberg@arm.comstruct ProcessObjRetFuncWrapper : public ProcessFuncWrapper 6111238Sandreas.sandberg@arm.com{ 6211688Sandreas.hansson@arm.com T t; 6311688Sandreas.hansson@arm.com R *r; 6411688Sandreas.hansson@arm.com 6511688Sandreas.hansson@arm.com ProcessObjRetFuncWrapper(T t, R *r) : t(t), r(r) {} 668920Snilay@cs.wisc.edu 679827Sakash.bagdia@arm.com void call() override { *r = t(); } 689827Sakash.bagdia@arm.com}; 699827Sakash.bagdia@arm.com 709827Sakash.bagdia@arm.comProcess *spawnWork(ProcessFuncWrapper *func, const char *name, 719790Sakash.bagdia@arm.com const ::sc_core::sc_spawn_options *); 729790Sakash.bagdia@arm.com 739790Sakash.bagdia@arm.com} // namespace sc_gem5 749790Sakash.bagdia@arm.com 7511688Sandreas.hansson@arm.comnamespace sc_core 7611688Sandreas.hansson@arm.com{ 7711688Sandreas.hansson@arm.com 7811688Sandreas.hansson@arm.comtemplate <class T> 7911688Sandreas.hansson@arm.comclass sc_in; 8011837Swendy.elsasser@arm.comtemplate <class T> 8111688Sandreas.hansson@arm.comclass sc_inout; 8211688Sandreas.hansson@arm.comtemplate <class T> 8311688Sandreas.hansson@arm.comclass sc_out; 8411688Sandreas.hansson@arm.comtemplate <class T> 8511688Sandreas.hansson@arm.comclass sc_signal_in_if; 8611688Sandreas.hansson@arm.com 8711688Sandreas.hansson@arm.comclass sc_event; 8811688Sandreas.hansson@arm.comclass sc_event_finder; 8911688Sandreas.hansson@arm.comclass sc_export_base; 9011688Sandreas.hansson@arm.comclass sc_interface; 9111688Sandreas.hansson@arm.comclass sc_port_base; 9211688Sandreas.hansson@arm.com 9311688Sandreas.hansson@arm.comclass sc_spawn_options 9411688Sandreas.hansson@arm.com{ 9511688Sandreas.hansson@arm.com public: 9611688Sandreas.hansson@arm.com friend ::sc_gem5::Process *::sc_gem5::spawnWork( 9711688Sandreas.hansson@arm.com ::sc_gem5::ProcessFuncWrapper *, const char *, 9811688Sandreas.hansson@arm.com const sc_spawn_options *); 9911688Sandreas.hansson@arm.com 10011688Sandreas.hansson@arm.com sc_spawn_options(); 10111688Sandreas.hansson@arm.com 10211688Sandreas.hansson@arm.com void spawn_method(); 10311688Sandreas.hansson@arm.com void dont_initialize(); 10411688Sandreas.hansson@arm.com void set_stack_size(int); 10511688Sandreas.hansson@arm.com 10611688Sandreas.hansson@arm.com void set_sensitivity(const sc_event *); 10711688Sandreas.hansson@arm.com void set_sensitivity(sc_port_base *); 10811688Sandreas.hansson@arm.com void set_sensitivity(sc_export_base *); 10911688Sandreas.hansson@arm.com void set_sensitivity(sc_interface *); 11011688Sandreas.hansson@arm.com void set_sensitivity(sc_event_finder *); 11111688Sandreas.hansson@arm.com 11211688Sandreas.hansson@arm.com void reset_signal_is(const sc_in<bool> &, bool); 11311688Sandreas.hansson@arm.com void reset_signal_is(const sc_inout<bool> &, bool); 11411688Sandreas.hansson@arm.com void reset_signal_is(const sc_out<bool> &, bool); 11511688Sandreas.hansson@arm.com void reset_signal_is(const sc_signal_in_if<bool> &, bool); 11611688Sandreas.hansson@arm.com 11711688Sandreas.hansson@arm.com void async_reset_signal_is(const sc_in<bool> &, bool); 11811688Sandreas.hansson@arm.com void async_reset_signal_is(const sc_inout<bool> &, bool); 11911688Sandreas.hansson@arm.com void async_reset_signal_is(const sc_out<bool> &, bool); 12011688Sandreas.hansson@arm.com void async_reset_signal_is(const sc_signal_in_if<bool> &, bool); 12111688Sandreas.hansson@arm.com 12211688Sandreas.hansson@arm.com private: 12311688Sandreas.hansson@arm.com bool _spawnMethod; 12411688Sandreas.hansson@arm.com bool _dontInitialize; 12511688Sandreas.hansson@arm.com int _stackSize; 12611688Sandreas.hansson@arm.com std::vector<const sc_event *> _events; 12711688Sandreas.hansson@arm.com std::vector<sc_port_base *> _ports; 12813357Sciro.santilli@arm.com std::vector<sc_export_base *> _exports; 12913357Sciro.santilli@arm.com std::vector<sc_interface *> _interfaces; 13013357Sciro.santilli@arm.com std::vector<sc_event_finder *> _finders; 13113357Sciro.santilli@arm.com 13213357Sciro.santilli@arm.com // Disabled 13313357Sciro.santilli@arm.com sc_spawn_options(const sc_spawn_options &) {} 13413357Sciro.santilli@arm.com sc_spawn_options &operator = (const sc_spawn_options &) { return *this; } 13513357Sciro.santilli@arm.com}; 13611688Sandreas.hansson@arm.com 13711688Sandreas.hansson@arm.comvoid sc_spawn_warn_unimpl(const char *func); 13811688Sandreas.hansson@arm.com 13911688Sandreas.hansson@arm.comtemplate <typename T> 14011688Sandreas.hansson@arm.comsc_process_handle 14111688Sandreas.hansson@arm.comsc_spawn(T object, const char *name_p=nullptr, 14211688Sandreas.hansson@arm.com const sc_spawn_options *opt_p=nullptr) 14311688Sandreas.hansson@arm.com{ 14411688Sandreas.hansson@arm.com auto func = new ::sc_gem5::ProcessObjFuncWrapper<T>(object); 14511688Sandreas.hansson@arm.com ::sc_gem5::Process *p = spawnWork(func, name_p, opt_p); 14611995Sgabeblack@google.com return sc_process_handle() = p; 14711688Sandreas.hansson@arm.com} 14811688Sandreas.hansson@arm.com 14911688Sandreas.hansson@arm.comtemplate <typename T> 1509789Sakash.bagdia@arm.comsc_process_handle 1519789Sakash.bagdia@arm.comsc_spawn(typename T::result_type *r_p, T object, const char *name_p=nullptr, 1529789Sakash.bagdia@arm.com const sc_spawn_options *opt_p=nullptr) 1539800Snilay@cs.wisc.edu{ 1549800Snilay@cs.wisc.edu auto func = new ::sc_gem5::ProcessObjRetFuncWrapper< 1559800Snilay@cs.wisc.edu T, typename T::result_type>(object, r_p); 1569800Snilay@cs.wisc.edu ::sc_gem5::Process *p = spawnWork(func, name_p, opt_p); 1579800Snilay@cs.wisc.edu return sc_process_handle() = p; 15811251Sradhika.jagtap@ARM.com} 15911251Sradhika.jagtap@ARM.com 16011251Sradhika.jagtap@ARM.com#define sc_bind boost::bind 16111251Sradhika.jagtap@ARM.com#define sc_ref(r) boost::ref(r) 16211251Sradhika.jagtap@ARM.com#define sc_cref(r) boost::cref(r) 16311251Sradhika.jagtap@ARM.com 16411251Sradhika.jagtap@ARM.com#define SC_FORK \ 16511251Sradhika.jagtap@ARM.com{ \ 16611251Sradhika.jagtap@ARM.com ::sc_core::sc_process_handle forkees[] = { 16711251Sradhika.jagtap@ARM.com 16811251Sradhika.jagtap@ARM.com#define SC_JOIN \ 16911251Sradhika.jagtap@ARM.com }; /* TODO wait for the forkees. */ \ 17011251Sradhika.jagtap@ARM.com} 1719800Snilay@cs.wisc.edu 17210037SARM gem5 Developers// Non-standard 17310037SARM gem5 Developers#define SC_CJOIN SC_JOIN 17410037SARM gem5 Developers 17511626Smichael.lebeane@amd.com} // namespace sc_core 17611626Smichael.lebeane@amd.com 17711626Smichael.lebeane@amd.comnamespace sc_unnamed 17811703Smichael.lebeane@amd.com{ 17911703Smichael.lebeane@amd.com 18011626Smichael.lebeane@amd.comtypedef int ImplementationDefined; 18111626Smichael.lebeane@amd.comextern ImplementationDefined _1; 18211626Smichael.lebeane@amd.comextern ImplementationDefined _2; 18311626Smichael.lebeane@amd.comextern ImplementationDefined _3; 18411626Smichael.lebeane@amd.comextern ImplementationDefined _4; 18511626Smichael.lebeane@amd.comextern ImplementationDefined _5; 18611626Smichael.lebeane@amd.comextern ImplementationDefined _6; 18711626Smichael.lebeane@amd.comextern ImplementationDefined _7; 18811626Smichael.lebeane@amd.comextern ImplementationDefined _8; 18911626Smichael.lebeane@amd.comextern ImplementationDefined _9; 19011626Smichael.lebeane@amd.com 19111626Smichael.lebeane@amd.com} // namespace sc_unnamed 19211626Smichael.lebeane@amd.com 19311626Smichael.lebeane@amd.com#endif //__SYSTEMC_EXT_CORE_SC_SPAWN_HH__ 19411626Smichael.lebeane@amd.com