sc_event.hh revision 13303
16019Shines@cs.fsu.edu/*
213882Sgiacomo.travaglini@arm.com * Copyright 2018 Google, Inc.
37093Sgblack@eecs.umich.edu *
47093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
57093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
67093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
77093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
87093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
97093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
107093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
117093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
127093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
137093Sgblack@eecs.umich.edu * this software without specific prior written permission.
146019Shines@cs.fsu.edu *
156019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
166019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
176019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
186019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
196019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
206019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
216019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
226019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
236019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
246019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
256019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
266019Shines@cs.fsu.edu *
276019Shines@cs.fsu.edu * Authors: Gabe Black
286019Shines@cs.fsu.edu */
296019Shines@cs.fsu.edu
306019Shines@cs.fsu.edu#ifndef __SYSTEMC_EXT_CORE_SC_EVENT_HH__
316019Shines@cs.fsu.edu#define __SYSTEMC_EXT_CORE_SC_EVENT_HH__
326019Shines@cs.fsu.edu
336019Shines@cs.fsu.edu#include <cassert>
346019Shines@cs.fsu.edu#include <set>
356019Shines@cs.fsu.edu#include <sstream>
366019Shines@cs.fsu.edu#include <vector>
376019Shines@cs.fsu.edu
386019Shines@cs.fsu.edu#include "../utils/sc_report_handler.hh"
396019Shines@cs.fsu.edu#include "sc_port.hh"
407399SAli.Saidi@ARM.com#include "sc_time.hh"
417399SAli.Saidi@ARM.com
426019Shines@cs.fsu.edunamespace sc_gem5
436019Shines@cs.fsu.edu{
446019Shines@cs.fsu.edu
4510873Sandreas.sandberg@arm.comclass Event;
4610873Sandreas.sandberg@arm.comclass DynamicSensitivityEventAndList;
4710474Sandreas.hansson@arm.comclass DynamicSensitivityEventOrList;
486019Shines@cs.fsu.educlass InternalScEvent;
496019Shines@cs.fsu.edu
506019Shines@cs.fsu.edu}
516116Snate@binkert.org
526019Shines@cs.fsu.edunamespace sc_core
5311793Sbrandon.potter@amd.com{
5411793Sbrandon.potter@amd.com
558782Sgblack@eecs.umich.educlass sc_event;
568756Sgblack@eecs.umich.educlass sc_event_and_expr;
576019Shines@cs.fsu.educlass sc_event_or_expr;
5812005Sandreas.sandberg@arm.comclass sc_interface;
596019Shines@cs.fsu.educlass sc_object;
606019Shines@cs.fsu.educlass sc_port_base;
616019Shines@cs.fsu.edu
6210024Sdam.sunwoo@arm.comclass sc_event_and_list
636019Shines@cs.fsu.edu{
648232Snate@binkert.org  public:
658232Snate@binkert.org    sc_event_and_list();
668232Snate@binkert.org    sc_event_and_list(const sc_event_and_list &);
676116Snate@binkert.org    sc_event_and_list(const sc_event &);
6811608Snikos.nikoleris@arm.com    sc_event_and_list &operator = (const sc_event_and_list &);
696116Snate@binkert.org    ~sc_event_and_list();
708756Sgblack@eecs.umich.edu
716019Shines@cs.fsu.edu    int size() const;
726019Shines@cs.fsu.edu    void swap(sc_event_and_list &);
736019Shines@cs.fsu.edu
746019Shines@cs.fsu.edu    sc_event_and_list &operator &= (const sc_event &);
756019Shines@cs.fsu.edu    sc_event_and_list &operator &= (const sc_event_and_list &);
7610037SARM gem5 Developers
7710037SARM gem5 Developers    sc_event_and_expr operator & (const sc_event &) const;
7813374Sanouk.vanlaer@arm.com    sc_event_and_expr operator & (const sc_event_and_list &);
7910418Sandreas.hansson@arm.com
8011395Sandreas.sandberg@arm.com  private:
8110537Sandreas.hansson@arm.com    friend class sc_event_and_expr;
8213453Srekai.gonzalezalberquilla@arm.com    friend class sc_gem5::DynamicSensitivityEventAndList;
8311152Smitch.hayenga@arm.com
846019Shines@cs.fsu.edu    explicit sc_event_and_list(bool auto_delete);
8512005Sandreas.sandberg@arm.com
8612005Sandreas.sandberg@arm.com    void insert(sc_event const &e);
8710037SARM gem5 Developers    void insert(sc_event_and_list const &eal);
887399SAli.Saidi@ARM.com
8910037SARM gem5 Developers    std::set<const sc_event *> events;
9010037SARM gem5 Developers    bool autoDelete;
9110037SARM gem5 Developers    mutable unsigned busy;
9210037SARM gem5 Developers};
9312005Sandreas.sandberg@arm.com
9412005Sandreas.sandberg@arm.comclass sc_event_or_list
9512005Sandreas.sandberg@arm.com{
966019Shines@cs.fsu.edu  public:
976019Shines@cs.fsu.edu    sc_event_or_list();
986019Shines@cs.fsu.edu    sc_event_or_list(const sc_event_or_list &);
996019Shines@cs.fsu.edu    sc_event_or_list(const sc_event &);
10010037SARM gem5 Developers    sc_event_or_list& operator = (const sc_event_or_list &);
10110037SARM gem5 Developers    ~sc_event_or_list();
10210037SARM gem5 Developers
10310037SARM gem5 Developers    int size() const;
10410037SARM gem5 Developers    void swap(sc_event_or_list &);
10510037SARM gem5 Developers
10610037SARM gem5 Developers    sc_event_or_list &operator |= (const sc_event &);
10710037SARM gem5 Developers    sc_event_or_list &operator |= (const sc_event_or_list &);
10810037SARM gem5 Developers
10910037SARM gem5 Developers    sc_event_or_expr operator | (const sc_event &) const;
11010037SARM gem5 Developers    sc_event_or_expr operator | (const sc_event_or_list &) const;
11110717Sandreas.hansson@arm.com
11210037SARM gem5 Developers  private:
11310037SARM gem5 Developers    friend class sc_event_or_expr;
11410717Sandreas.hansson@arm.com    friend class sc_gem5::DynamicSensitivityEventOrList;
1156019Shines@cs.fsu.edu
1166019Shines@cs.fsu.edu    explicit sc_event_or_list(bool auto_delete);
1177694SAli.Saidi@ARM.com
1187694SAli.Saidi@ARM.com    void insert(sc_event const &e);
1197694SAli.Saidi@ARM.com    void insert(sc_event_or_list const &eol);
12010037SARM gem5 Developers
12110037SARM gem5 Developers    std::set<const sc_event *> events;
12210037SARM gem5 Developers    bool autoDelete;
12310037SARM gem5 Developers    mutable unsigned busy;
12410037SARM gem5 Developers};
12510037SARM gem5 Developers
12610037SARM gem5 Developersclass sc_event_and_expr
12710037SARM gem5 Developers{
12810037SARM gem5 Developers  public:
1297694SAli.Saidi@ARM.com    sc_event_and_expr(sc_event_and_expr const &e);
1307694SAli.Saidi@ARM.com    operator const sc_event_and_list &() const;
1317694SAli.Saidi@ARM.com
1327694SAli.Saidi@ARM.com    void insert(sc_event const &e) const;
1337694SAli.Saidi@ARM.com    void insert(sc_event_and_list const &eal) const;
1347694SAli.Saidi@ARM.com
1359738Sandreas@sandberg.pp.se    ~sc_event_and_expr();
13612749Sgiacomo.travaglini@arm.com
13712749Sgiacomo.travaglini@arm.com  private:
1389738Sandreas@sandberg.pp.se    friend class sc_event_and_list;
13912005Sandreas.sandberg@arm.com    friend class sc_event;
14012005Sandreas.sandberg@arm.com
14112005Sandreas.sandberg@arm.com    sc_event_and_expr();
14212005Sandreas.sandberg@arm.com    mutable sc_event_and_list *list;
14312005Sandreas.sandberg@arm.com};
14412005Sandreas.sandberg@arm.com
14512005Sandreas.sandberg@arm.comsc_event_and_expr operator & (sc_event_and_expr, sc_event const &);
14612005Sandreas.sandberg@arm.comsc_event_and_expr operator & (sc_event_and_expr, sc_event_and_list const &);
14712005Sandreas.sandberg@arm.com
1489738Sandreas@sandberg.pp.seclass sc_event_or_expr
1499738Sandreas@sandberg.pp.se{
1509738Sandreas@sandberg.pp.se  public:
1517404SAli.Saidi@ARM.com    sc_event_or_expr(sc_event_or_expr const &e);
15210037SARM gem5 Developers    operator const sc_event_or_list &() const;
15310037SARM gem5 Developers
1546019Shines@cs.fsu.edu    void insert(sc_event const &e) const;
1557404SAli.Saidi@ARM.com    void insert(sc_event_or_list const &eol) const;
1567404SAli.Saidi@ARM.com
1577404SAli.Saidi@ARM.com    ~sc_event_or_expr();
15810037SARM gem5 Developers
1597404SAli.Saidi@ARM.com  private:
1607404SAli.Saidi@ARM.com    friend class sc_event_or_list;
16110037SARM gem5 Developers    friend class sc_event;
16210037SARM gem5 Developers
16310037SARM gem5 Developers    sc_event_or_expr();
16410037SARM gem5 Developers    mutable sc_event_or_list *list;
16510037SARM gem5 Developers};
1669535Smrinmoy.ghosh@arm.com
1677697SAli.Saidi@ARM.comsc_event_or_expr operator | (sc_event_or_expr, sc_event const &);
16811321Ssteve.reinhardt@amd.comsc_event_or_expr operator | (sc_event_or_expr, sc_event_or_list const &);
16910037SARM gem5 Developers
1707697SAli.Saidi@ARM.comclass sc_event
1717697SAli.Saidi@ARM.com{
1727697SAli.Saidi@ARM.com  public:
1737697SAli.Saidi@ARM.com    sc_event();
1747697SAli.Saidi@ARM.com    explicit sc_event(const char *);
1757404SAli.Saidi@ARM.com    ~sc_event();
1767404SAli.Saidi@ARM.com
17710037SARM gem5 Developers    const char *name() const;
1787404SAli.Saidi@ARM.com    const char *basename() const;
1797404SAli.Saidi@ARM.com    bool in_hierarchy() const;
18010037SARM gem5 Developers    sc_object *get_parent_object() const;
18110037SARM gem5 Developers
18210037SARM gem5 Developers    void notify();
18310037SARM gem5 Developers    void notify(const sc_time &);
18410037SARM gem5 Developers    void notify(double, sc_time_unit);
18510037SARM gem5 Developers    void cancel();
18610037SARM gem5 Developers
18710037SARM gem5 Developers    // Nonstandard
18810367SAndrew.Bardsley@arm.com    // Returns whether this event is currently triggered.
18910037SARM gem5 Developers    bool triggered() const;
1907404SAli.Saidi@ARM.com
1916019Shines@cs.fsu.edu    // Deprecated
1926019Shines@cs.fsu.edu    void notify_delayed();
1936019Shines@cs.fsu.edu    void notify_delayed(const sc_time &);
1946019Shines@cs.fsu.edu
1957404SAli.Saidi@ARM.com    sc_event_and_expr operator & (const sc_event &) const;
1966019Shines@cs.fsu.edu    sc_event_and_expr operator & (const sc_event_and_list &) const;
1977404SAli.Saidi@ARM.com    sc_event_or_expr operator | (const sc_event &) const;
19810037SARM gem5 Developers    sc_event_or_expr operator | (const sc_event_or_list &) const;
19910037SARM gem5 Developers
20010037SARM gem5 Developers  protected:
20110037SARM gem5 Developers    explicit sc_event(bool);
20210037SARM gem5 Developers    explicit sc_event(bool, const char *);
20310037SARM gem5 Developers
2047404SAli.Saidi@ARM.com  private:
20510037SARM gem5 Developers    // Disabled
20610037SARM gem5 Developers    sc_event(const sc_event &) {}
20710037SARM gem5 Developers    sc_event &operator = (const sc_event &) { return *this; }
2087697SAli.Saidi@ARM.com
20910037SARM gem5 Developers    friend class ::sc_gem5::Event;
21010037SARM gem5 Developers    ::sc_gem5::Event *_gem5_event;
21110037SARM gem5 Developers};
21210037SARM gem5 Developers
2137404SAli.Saidi@ARM.comclass sc_event_finder
2147697SAli.Saidi@ARM.com{
2157404SAli.Saidi@ARM.com  protected:
21610037SARM gem5 Developers    virtual ~sc_event_finder() {}
21710037SARM gem5 Developers
2187697SAli.Saidi@ARM.com  public:
2197734SAli.Saidi@ARM.com    // Should be "implementation defined" but used in the tests.
2207734SAli.Saidi@ARM.com    virtual const sc_event &find_event(sc_interface *if_p=NULL) const = 0;
22110463SAndreas.Sandberg@ARM.com    virtual const sc_port_base *port() const = 0;
2226019Shines@cs.fsu.edu};
2236019Shines@cs.fsu.edu
2246019Shines@cs.fsu.edutemplate <class IF>
22510037SARM gem5 Developersclass sc_event_finder_t : public sc_event_finder
2267404SAli.Saidi@ARM.com{
2277404SAli.Saidi@ARM.com  public:
2287404SAli.Saidi@ARM.com    sc_event_finder_t(const sc_port_base &p,
2297404SAli.Saidi@ARM.com                      const sc_event & (IF::*_method)() const) :
2307404SAli.Saidi@ARM.com        _method(_method)
23110037SARM gem5 Developers    {
23210037SARM gem5 Developers        _port = dynamic_cast<const sc_port_b<IF> *>(&p);
23310037SARM gem5 Developers        assert(_port);
23410037SARM gem5 Developers    }
2357404SAli.Saidi@ARM.com
2367404SAli.Saidi@ARM.com    virtual ~sc_event_finder_t() {}
2377404SAli.Saidi@ARM.com
2387404SAli.Saidi@ARM.com    const sc_port_base *port() const { return _port; }
23910037SARM gem5 Developers
2406019Shines@cs.fsu.edu    const sc_event &
24110037SARM gem5 Developers    find_event(sc_interface *if_p=NULL) const override
24210037SARM gem5 Developers    {
2437404SAli.Saidi@ARM.com        static const sc_gem5::InternalScEvent none;
2447404SAli.Saidi@ARM.com        const IF *iface = if_p ? dynamic_cast<const IF *>(if_p) :
2457404SAli.Saidi@ARM.com            dynamic_cast<const IF *>(_port->get_interface());
24610037SARM gem5 Developers        if (!iface) {
24710037SARM gem5 Developers            std::ostringstream ss;
24810037SARM gem5 Developers            ss << "port is not bound: port '" << _port->name() << "' (" <<
24910037SARM gem5 Developers                _port->kind() << ")";
25010037SARM gem5 Developers            SC_REPORT_ERROR("(E118) find event failed", ss.str().c_str());
25110037SARM gem5 Developers            return none;
25210037SARM gem5 Developers        }
25310037SARM gem5 Developers        return (const_cast<IF *>(iface)->*_method)();
25410037SARM gem5 Developers    }
25510037SARM gem5 Developers
2567404SAli.Saidi@ARM.com  private:
2577404SAli.Saidi@ARM.com    const sc_port_b<IF> *_port;
25810037SARM gem5 Developers    const sc_event &(IF::*_method)() const;
25910037SARM gem5 Developers};
26010037SARM gem5 Developers
26110037SARM gem5 Developersconst std::vector<sc_event *> &sc_get_top_level_events();
26210037SARM gem5 Developerssc_event *sc_find_event(const char *);
26310037SARM gem5 Developers
26410037SARM gem5 Developers} // namespace sc_core
26510037SARM gem5 Developers
26610037SARM gem5 Developersnamespace sc_gem5
26710037SARM gem5 Developers{
26813882Sgiacomo.travaglini@arm.com
26910037SARM gem5 Developersclass InternalScEvent : public ::sc_core::sc_event
27013882Sgiacomo.travaglini@arm.com{
27113882Sgiacomo.travaglini@arm.com  public:
27210037SARM gem5 Developers    InternalScEvent();
27310037SARM gem5 Developers    InternalScEvent(const char *);
27410037SARM gem5 Developers};
27510037SARM gem5 Developers
27610037SARM gem5 Developers} // namespace sc_gem5
27710037SARM gem5 Developers
27810037SARM gem5 Developers#endif  //__SYSTEMC_EXT_CORE_SC_INTERFACE_HH__
27910037SARM gem5 Developers