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