sc_process_handle.hh revision 13317:36c574a4036e
15625Sgblack@eecs.umich.edu/*
25625Sgblack@eecs.umich.edu * Copyright 2018 Google, Inc.
35625Sgblack@eecs.umich.edu *
47087Snate@binkert.org * Redistribution and use in source and binary forms, with or without
57087Snate@binkert.org * modification, are permitted provided that the following conditions are
67087Snate@binkert.org * met: redistributions of source code must retain the above copyright
77087Snate@binkert.org * notice, this list of conditions and the following disclaimer;
87087Snate@binkert.org * redistributions in binary form must reproduce the above copyright
97087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
107087Snate@binkert.org * documentation and/or other materials provided with the distribution;
117087Snate@binkert.org * neither the name of the copyright holders nor the names of its
125625Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
137087Snate@binkert.org * this software without specific prior written permission.
147087Snate@binkert.org *
157087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
167087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
177087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
187087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
197087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
207087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
215625Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
227087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
235625Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245625Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
255625Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265625Sgblack@eecs.umich.edu *
275625Sgblack@eecs.umich.edu * Authors: Gabe Black
285625Sgblack@eecs.umich.edu */
295625Sgblack@eecs.umich.edu
305625Sgblack@eecs.umich.edu#ifndef __SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__
315625Sgblack@eecs.umich.edu#define __SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__
325625Sgblack@eecs.umich.edu
335625Sgblack@eecs.umich.edu#include <exception>
345625Sgblack@eecs.umich.edu#include <vector>
355625Sgblack@eecs.umich.edu
365625Sgblack@eecs.umich.edu#include "../utils/sc_report_handler.hh"
375625Sgblack@eecs.umich.edu#include "messages.hh"
385625Sgblack@eecs.umich.edu#include "sc_object.hh"
395625Sgblack@eecs.umich.edu
405625Sgblack@eecs.umich.edunamespace sc_gem5
415625Sgblack@eecs.umich.edu{
425625Sgblack@eecs.umich.edu
435625Sgblack@eecs.umich.educlass Process;
445625Sgblack@eecs.umich.edu
455625Sgblack@eecs.umich.edustruct ProcessFuncWrapper
465625Sgblack@eecs.umich.edu{
475625Sgblack@eecs.umich.edu    virtual void call() = 0;
485625Sgblack@eecs.umich.edu    virtual ~ProcessFuncWrapper() {}
495625Sgblack@eecs.umich.edu};
505625Sgblack@eecs.umich.edu
515625Sgblack@eecs.umich.edutemplate <typename T>
525625Sgblack@eecs.umich.edustruct ProcessMemberFuncWrapper : public ProcessFuncWrapper
535625Sgblack@eecs.umich.edu{
545625Sgblack@eecs.umich.edu    typedef void (T::*TFunc)();
555625Sgblack@eecs.umich.edu    T *t;
565625Sgblack@eecs.umich.edu    TFunc func;
575625Sgblack@eecs.umich.edu
585625Sgblack@eecs.umich.edu    ProcessMemberFuncWrapper(T *t, TFunc func) : t(t), func(func) {}
595625Sgblack@eecs.umich.edu
605625Sgblack@eecs.umich.edu    void call() override { (t->*func)(); }
615625Sgblack@eecs.umich.edu};
625625Sgblack@eecs.umich.edu
635625Sgblack@eecs.umich.edustruct ExceptionWrapperBase
645625Sgblack@eecs.umich.edu{
655625Sgblack@eecs.umich.edu    virtual void throw_it() = 0;
665625Sgblack@eecs.umich.edu};
675625Sgblack@eecs.umich.edu
685625Sgblack@eecs.umich.edutemplate <typename T>
695625Sgblack@eecs.umich.edustruct ExceptionWrapper : public ExceptionWrapperBase
705625Sgblack@eecs.umich.edu{
715770Sgblack@eecs.umich.edu    const T &t;
725770Sgblack@eecs.umich.edu    ExceptionWrapper(const T &t) : t(t) {}
735770Sgblack@eecs.umich.edu
745770Sgblack@eecs.umich.edu    void throw_it() { throw t; }
755838Sgblack@eecs.umich.edu};
765770Sgblack@eecs.umich.edu
775770Sgblack@eecs.umich.eduvoid throw_it_wrapper(Process *p, ExceptionWrapperBase &exc, bool inc_kids);
785770Sgblack@eecs.umich.edu
795770Sgblack@eecs.umich.edu} // namespace sc_gem5
805625Sgblack@eecs.umich.edu
815625Sgblack@eecs.umich.edunamespace sc_core
825625Sgblack@eecs.umich.edu{
835625Sgblack@eecs.umich.edu
845625Sgblack@eecs.umich.educlass sc_event;
855625Sgblack@eecs.umich.edu
865625Sgblack@eecs.umich.eduenum sc_curr_proc_kind
875625Sgblack@eecs.umich.edu{
885625Sgblack@eecs.umich.edu    SC_NO_PROC_,
895625Sgblack@eecs.umich.edu    SC_METHOD_PROC_,
905625Sgblack@eecs.umich.edu    SC_THREAD_PROC_,
915625Sgblack@eecs.umich.edu    SC_CTHREAD_PROC_
925625Sgblack@eecs.umich.edu};
935625Sgblack@eecs.umich.edu
945625Sgblack@eecs.umich.eduenum sc_descendent_inclusion_info
955625Sgblack@eecs.umich.edu{
965625Sgblack@eecs.umich.edu    SC_NO_DESCENDANTS,
975625Sgblack@eecs.umich.edu    SC_INCLUDE_DESCENDANTS
985625Sgblack@eecs.umich.edu};
995625Sgblack@eecs.umich.edu
1005825Sgblack@eecs.umich.educlass sc_unwind_exception : public std::exception
1015825Sgblack@eecs.umich.edu{
1025825Sgblack@eecs.umich.edu  public:
1035625Sgblack@eecs.umich.edu    virtual const char *what() const throw();
1045625Sgblack@eecs.umich.edu    virtual bool is_reset() const;
1055625Sgblack@eecs.umich.edu
1065625Sgblack@eecs.umich.edu    // Nonstandard.
1075625Sgblack@eecs.umich.edu    // These should be protected, but I think this is to enable catch by
1085625Sgblack@eecs.umich.edu    // value.
1095625Sgblack@eecs.umich.edu  public:
1105625Sgblack@eecs.umich.edu    sc_unwind_exception(const sc_unwind_exception &);
1115625Sgblack@eecs.umich.edu    virtual ~sc_unwind_exception() throw();
1125625Sgblack@eecs.umich.edu
1135625Sgblack@eecs.umich.edu  protected:
1145625Sgblack@eecs.umich.edu    bool _isReset;
1155625Sgblack@eecs.umich.edu    sc_unwind_exception();
1165625Sgblack@eecs.umich.edu};
1175625Sgblack@eecs.umich.edu
1185625Sgblack@eecs.umich.edu// Deprecated
1195625Sgblack@eecs.umich.edu// An incomplete version of sc_process_b to satisfy the tests.
1205625Sgblack@eecs.umich.educlass sc_process_b : public sc_object
1215625Sgblack@eecs.umich.edu{
1225625Sgblack@eecs.umich.edu  public:
1235625Sgblack@eecs.umich.edu    sc_process_b(const char *name) : sc_object(name), file(nullptr), lineno(0)
1245625Sgblack@eecs.umich.edu    {}
1255625Sgblack@eecs.umich.edu    sc_process_b() : sc_object(), file(nullptr), lineno(0) {}
1265625Sgblack@eecs.umich.edu
1275625Sgblack@eecs.umich.edu    const char *file;
1285625Sgblack@eecs.umich.edu    int lineno;
1295625Sgblack@eecs.umich.edu};
1305625Sgblack@eecs.umich.edu
1315625Sgblack@eecs.umich.edu// Nonstandard
1325625Sgblack@eecs.umich.eduvoid sc_set_location(const char *file, int lineno);
1335625Sgblack@eecs.umich.edu
1345625Sgblack@eecs.umich.edu// Deprecated
1355625Sgblack@eecs.umich.edusc_process_b *sc_get_curr_process_handle();
1365625Sgblack@eecs.umich.edustatic inline sc_process_b *
1375625Sgblack@eecs.umich.edusc_get_current_process_b()
1385625Sgblack@eecs.umich.edu{
1395625Sgblack@eecs.umich.edu    return sc_get_curr_process_handle();
1405625Sgblack@eecs.umich.edu}
1415625Sgblack@eecs.umich.edu
1425625Sgblack@eecs.umich.edu// Deprecated/nonstandard
1435625Sgblack@eecs.umich.edustruct sc_curr_proc_info
1445625Sgblack@eecs.umich.edu{
1455625Sgblack@eecs.umich.edu    sc_process_b *process_handle;
1465625Sgblack@eecs.umich.edu    sc_curr_proc_kind kind;
1475625Sgblack@eecs.umich.edu    sc_curr_proc_info() : process_handle(NULL), kind(SC_NO_PROC_) {}
1485625Sgblack@eecs.umich.edu};
1495625Sgblack@eecs.umich.edutypedef const sc_curr_proc_info *sc_curr_proc_handle;
1505625Sgblack@eecs.umich.edu
1515625Sgblack@eecs.umich.educlass sc_process_handle
1525625Sgblack@eecs.umich.edu{
1535625Sgblack@eecs.umich.edu  private:
1545625Sgblack@eecs.umich.edu    ::sc_gem5::Process *_gem5_process;
1555625Sgblack@eecs.umich.edu
1565625Sgblack@eecs.umich.edu  public:
1575625Sgblack@eecs.umich.edu    sc_process_handle();
1585625Sgblack@eecs.umich.edu    sc_process_handle(const sc_process_handle &);
1595625Sgblack@eecs.umich.edu    explicit sc_process_handle(sc_object *);
1605625Sgblack@eecs.umich.edu    ~sc_process_handle();
1615625Sgblack@eecs.umich.edu
1625625Sgblack@eecs.umich.edu    // These non-standard operators provide access to the data structure which
1635625Sgblack@eecs.umich.edu    // actually tracks the process within gem5. By making them operators, we
1645625Sgblack@eecs.umich.edu    // can minimize the symbols added to the class namespace.
1655625Sgblack@eecs.umich.edu    operator ::sc_gem5::Process * () const { return _gem5_process; }
1665625Sgblack@eecs.umich.edu    sc_process_handle &
1675625Sgblack@eecs.umich.edu    operator = (::sc_gem5::Process *p)
1685625Sgblack@eecs.umich.edu    {
1695625Sgblack@eecs.umich.edu        _gem5_process = p;
1705625Sgblack@eecs.umich.edu        return *this;
1715625Sgblack@eecs.umich.edu    }
1725625Sgblack@eecs.umich.edu
1735625Sgblack@eecs.umich.edu    bool valid() const;
1745625Sgblack@eecs.umich.edu
1755625Sgblack@eecs.umich.edu    sc_process_handle &operator = (const sc_process_handle &);
1765625Sgblack@eecs.umich.edu    bool operator == (const sc_process_handle &) const;
1775625Sgblack@eecs.umich.edu    bool operator != (const sc_process_handle &) const;
1785625Sgblack@eecs.umich.edu    bool operator < (const sc_process_handle &) const;
1795625Sgblack@eecs.umich.edu    void swap(sc_process_handle &);
1805625Sgblack@eecs.umich.edu
1815625Sgblack@eecs.umich.edu    const char *name() const;
1825625Sgblack@eecs.umich.edu    sc_curr_proc_kind proc_kind() const;
1835625Sgblack@eecs.umich.edu    const std::vector<sc_object *> &get_child_objects() const;
1845625Sgblack@eecs.umich.edu    const std::vector<sc_event *> &get_child_events() const;
1855625Sgblack@eecs.umich.edu    sc_object *get_parent_object() const;
1865625Sgblack@eecs.umich.edu    sc_object *get_process_object() const;
1875625Sgblack@eecs.umich.edu    bool dynamic() const;
1885625Sgblack@eecs.umich.edu    bool terminated() const;
1895625Sgblack@eecs.umich.edu    const sc_event &terminated_event() const;
1905625Sgblack@eecs.umich.edu
1915625Sgblack@eecs.umich.edu    void suspend(sc_descendent_inclusion_info include_descendants=
1925625Sgblack@eecs.umich.edu                 SC_NO_DESCENDANTS);
1935625Sgblack@eecs.umich.edu    void resume(sc_descendent_inclusion_info include_descendants=
1945625Sgblack@eecs.umich.edu                SC_NO_DESCENDANTS);
1955625Sgblack@eecs.umich.edu    void disable(sc_descendent_inclusion_info include_descendants=
1965625Sgblack@eecs.umich.edu                 SC_NO_DESCENDANTS);
1975625Sgblack@eecs.umich.edu    void enable(sc_descendent_inclusion_info include_descendants=
1985625Sgblack@eecs.umich.edu                SC_NO_DESCENDANTS);
1995625Sgblack@eecs.umich.edu    void kill(sc_descendent_inclusion_info include_descendants=
2005625Sgblack@eecs.umich.edu              SC_NO_DESCENDANTS);
2015625Sgblack@eecs.umich.edu    void reset(sc_descendent_inclusion_info include_descendants=
2025625Sgblack@eecs.umich.edu               SC_NO_DESCENDANTS);
2035625Sgblack@eecs.umich.edu    bool is_unwinding();
2045625Sgblack@eecs.umich.edu    const sc_event &reset_event() const;
2055625Sgblack@eecs.umich.edu
2065625Sgblack@eecs.umich.edu    void sync_reset_on(sc_descendent_inclusion_info include_descendants=
2075625Sgblack@eecs.umich.edu                       SC_NO_DESCENDANTS);
2085625Sgblack@eecs.umich.edu    void sync_reset_off(sc_descendent_inclusion_info include_descendants=
2095625Sgblack@eecs.umich.edu                        SC_NO_DESCENDANTS);
2105625Sgblack@eecs.umich.edu
2115625Sgblack@eecs.umich.edu    template <typename T>
2125625Sgblack@eecs.umich.edu    void
2135625Sgblack@eecs.umich.edu    throw_it(const T &user_defined_exception,
2145625Sgblack@eecs.umich.edu             sc_descendent_inclusion_info include_descendants=
2155625Sgblack@eecs.umich.edu             SC_NO_DESCENDANTS)
2165625Sgblack@eecs.umich.edu    {
2175625Sgblack@eecs.umich.edu        if (!_gem5_process) {
2185625Sgblack@eecs.umich.edu            SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "throw_it()");
2195625Sgblack@eecs.umich.edu            return;
2205625Sgblack@eecs.umich.edu        }
2215625Sgblack@eecs.umich.edu        ::sc_gem5::ExceptionWrapper<T> exc(user_defined_exception);
2225625Sgblack@eecs.umich.edu        ::sc_gem5::throw_it_wrapper(_gem5_process, exc,
2235625Sgblack@eecs.umich.edu                include_descendants == SC_INCLUDE_DESCENDANTS);
2245625Sgblack@eecs.umich.edu    }
225};
226
227sc_process_handle sc_get_current_process_handle();
228bool sc_is_unwinding();
229
230// Nonstandard
231// See Accellera's kernel/sim_context.cpp for an explanation of what this is
232// supposed to do. It essentially selects what happens during certain
233// undefined situations.
234extern bool sc_allow_process_control_corners;
235
236} // namespace sc_core
237
238#endif  //__SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__
239