sc_port.hh revision 13053
12SN/A/*
210298Salexandru.dutu@amd.com * Copyright 2018 Google, Inc.
31762SN/A *
42SN/A * Redistribution and use in source and binary forms, with or without
52SN/A * modification, are permitted provided that the following conditions are
62SN/A * met: redistributions of source code must retain the above copyright
72SN/A * notice, this list of conditions and the following disclaimer;
82SN/A * redistributions in binary form must reproduce the above copyright
92SN/A * notice, this list of conditions and the following disclaimer in the
102SN/A * documentation and/or other materials provided with the distribution;
112SN/A * neither the name of the copyright holders nor the names of its
122SN/A * contributors may be used to endorse or promote products derived from
132SN/A * this software without specific prior written permission.
142SN/A *
152SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
162SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
172SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
182SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
192SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
202SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
212SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
222SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
232SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
242SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
252SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
262SN/A *
272SN/A * Authors: Gabe Black
282665Ssaidi@eecs.umich.edu */
292665Ssaidi@eecs.umich.edu
302665Ssaidi@eecs.umich.edu#ifndef __SYSTEMC_EXT_CORE_SC_PORT_HH__
312SN/A#define __SYSTEMC_EXT_CORE_SC_PORT_HH__
322SN/A
33360SN/A#include <vector>
34360SN/A
352SN/A#include "../utils/sc_report_handler.hh"
3610930Sbrandon.potter@amd.com#include "sc_module.hh" // for sc_gen_unique_name
374117Sgblack@eecs.umich.edu#include "sc_object.hh"
38180SN/A
392SN/Anamespace sc_gem5
406329Sgblack@eecs.umich.edu{
412378SN/A
426214Snate@binkert.orgclass BindInfo;
436658Snate@binkert.orgclass PendingSensitivityPort;
448852Sandreas.hansson@arm.com
4510930Sbrandon.potter@amd.com};
4656SN/A
475958Sgblack@eecs.umich.edunamespace sc_core
482SN/A{
495154Sgblack@eecs.umich.edu
508737Skoansin.tan@gmail.comclass sc_interface;
518737Skoansin.tan@gmail.com
525154Sgblack@eecs.umich.eduenum sc_port_policy
535154Sgblack@eecs.umich.edu{
542680Sktlim@umich.edu    SC_ONE_OR_MORE_BOUND, // Default
5510496Ssteve.reinhardt@amd.com    SC_ZERO_OR_MORE_BOUND,
562378SN/A    SC_ALL_BOUND
575758Shsul@eecs.umich.edu};
585771Shsul@eecs.umich.edu
595758Shsul@eecs.umich.educlass sc_port_base : public sc_object
605758Shsul@eecs.umich.edu{
615771Shsul@eecs.umich.edu  public:
625758Shsul@eecs.umich.edu    sc_port_base(const char *name, int n, sc_port_policy p);
635771Shsul@eecs.umich.edu
645758Shsul@eecs.umich.edu    void warn_unimpl(const char *func) const;
655758Shsul@eecs.umich.edu
665771Shsul@eecs.umich.edu    int maxSize() const;
675758Shsul@eecs.umich.edu    int size() const;
685758Shsul@eecs.umich.edu
692SN/A  protected:
702SN/A    // Implementation defined, but depended on by the tests.
712SN/A    void bind(sc_interface &);
722SN/A    void bind(sc_port_base &);
732378SN/A
742378SN/A    // Implementation defined, but depended on by the tests.
752378SN/A    virtual int vbind(sc_interface &) = 0;
762378SN/A    virtual int vbind(sc_port_base &) = 0;
772680Sktlim@umich.edu
785713Shsul@eecs.umich.edu  private:
79180SN/A    friend class ::sc_gem5::PendingSensitivityPort;
80180SN/A    friend class ::sc_gem5::Kernel;
815713Shsul@eecs.umich.edu
822SN/A    void _gem5Finalize();
832SN/A
842SN/A    virtual sc_interface *_gem5Interface(int n) const = 0;
852SN/A    virtual void _gem5AddInterface(sc_interface *i) = 0;
862SN/A
872680Sktlim@umich.edu    std::vector<::sc_gem5::BindInfo *> _gem5BindInfo;
882SN/A    int _maxSize;
892680Sktlim@umich.edu    int _size;
902SN/A    bool finalized;
915543Ssaidi@eecs.umich.edu};
922SN/A
932SN/Atemplate <class IF>
942SN/Aclass sc_port_b : public sc_port_base
952SN/A{
962SN/A  public:
975543Ssaidi@eecs.umich.edu    void operator () (IF &i) { bind(i); }
982SN/A    void operator () (sc_port_b<IF> &p) { bind(p); }
995543Ssaidi@eecs.umich.edu
1005543Ssaidi@eecs.umich.edu    virtual void bind(IF &i) { sc_port_base::bind(i); }
1015543Ssaidi@eecs.umich.edu    virtual void bind(sc_port_b<IF> &p) { sc_port_base::bind(p); }
1022SN/A
1035154Sgblack@eecs.umich.edu    IF *operator -> () { return _interfaces.at(0); }
1045154Sgblack@eecs.umich.edu    const IF *operator -> () const { return _interfaces.at(0); }
1055154Sgblack@eecs.umich.edu
1062SN/A    IF *operator [] (int n) { return _interfaces.at(n); }
1072SN/A    const IF *operator [] (int n) const { return _interfaces.at(n); }
1082SN/A
109360SN/A    sc_interface *get_interface() { return _interfaces.at(0); }
1101408SN/A    const sc_interface *get_interface() const { return _interfaces.at(0); }
1111408SN/A
112360SN/A  protected:
1131514SN/A    virtual void before_end_of_elaboration() {}
1141514SN/A    virtual void end_of_elaboration() {}
1151514SN/A    virtual void start_of_elaboration() {}
1161514SN/A    virtual void end_of_simulation() {}
1175999Snate@binkert.org
1182SN/A    explicit sc_port_b(int n, sc_port_policy p) :
1192SN/A            sc_port_base(sc_gen_unique_name("port"), n, p)
1202SN/A    {}
1218325Ssteve.reinhardt@amd.com    sc_port_b(const char *name, int n, sc_port_policy p) :
1222SN/A            sc_port_base(name, n, p)
1237532Ssteve.reinhardt@amd.com    {}
1242SN/A    virtual ~sc_port_b() {}
12510913Sandreas.sandberg@arm.com
12610905Sandreas.sandberg@arm.com    // Implementation defined, but depended on by the tests.
1272378SN/A    int
1282SN/A    vbind(sc_interface &i)
1294997Sgblack@eecs.umich.edu    {
1304997Sgblack@eecs.umich.edu        IF *interface = dynamic_cast<IF *>(&i);
1314997Sgblack@eecs.umich.edu        if (!interface)
1324997Sgblack@eecs.umich.edu            return 2;
13310299Salexandru.dutu@amd.com        sc_port_base::bind(*interface);
13410299Salexandru.dutu@amd.com        return 0;
13510554Salexandru.dutu@amd.com    }
13610554Salexandru.dutu@amd.com    int
13710554Salexandru.dutu@amd.com    vbind(sc_port_base &pb)
13810298Salexandru.dutu@amd.com    {
1398852Sandreas.hansson@arm.com        sc_port_b<IF> *p = dynamic_cast<sc_port_b<IF> *>(&pb);
1408852Sandreas.hansson@arm.com        if (!p)
1418852Sandreas.hansson@arm.com            return 2;
1428852Sandreas.hansson@arm.com        sc_port_base::bind(*p);
1438852Sandreas.hansson@arm.com        return 0;
1442SN/A    }
14510929Sbrandon.potter@amd.com
1465282Srstrong@cs.ucsd.edu  private:
14710929Sbrandon.potter@amd.com    std::vector<IF *> _interfaces;
14810930Sbrandon.potter@amd.com
14910930Sbrandon.potter@amd.com    sc_interface *_gem5Interface(int n) const { return _interfaces.at(n); }
15010930Sbrandon.potter@amd.com    void
15110930Sbrandon.potter@amd.com    _gem5AddInterface(sc_interface *i)
15210930Sbrandon.potter@amd.com    {
1532SN/A        IF *interface = dynamic_cast<IF *>(i);
1542SN/A        sc_assert(interface);
15510930Sbrandon.potter@amd.com        _interfaces.push_back(interface);
15610930Sbrandon.potter@amd.com    }
1572SN/A
1582SN/A    // Disabled
1592SN/A    sc_port_b() {}
1602SN/A    sc_port_b(const sc_port_b<IF> &) {}
1615713Shsul@eecs.umich.edu    sc_port_b<IF> &operator = (const sc_port_b<IF> &) { return *this; }
1625713Shsul@eecs.umich.edu};
1635713Shsul@eecs.umich.edu
1645713Shsul@eecs.umich.edutemplate <class IF, int N=1, sc_port_policy P=SC_ONE_OR_MORE_BOUND>
1655713Shsul@eecs.umich.educlass sc_port : public sc_port_b<IF>
1665713Shsul@eecs.umich.edu{
167180SN/A  public:
1685713Shsul@eecs.umich.edu    sc_port() : sc_port_b<IF>(N, P) {}
1698325Ssteve.reinhardt@amd.com    explicit sc_port(const char *name) : sc_port_b<IF>(name, N, P) {}
1702SN/A    virtual ~sc_port() {}
1719144Ssteve.reinhardt@amd.com
1729144Ssteve.reinhardt@amd.com    // Deprecated binding constructors.
1739144Ssteve.reinhardt@amd.com    explicit sc_port(const IF &interface) : sc_port_b<IF>(N, P)
1742SN/A    {
17510782Snilay@cs.wisc.edu        this->warn_unimpl(__PRETTY_FUNCTION__);
1768325Ssteve.reinhardt@amd.com        // Should warn that these are deprecated. See Accellera sc_port.h.
1771970SN/A        sc_port_b<IF>::bind(const_cast<IF &>(interface));
17810929Sbrandon.potter@amd.com    }
17910930Sbrandon.potter@amd.com    sc_port(const char *name, const IF &interface) : sc_port_b<IF>(name, N, P)
1802SN/A    {
1812SN/A        this->warn_unimpl(__PRETTY_FUNCTION__);
1822SN/A        // Should warn that these are deprecated. See Accellera sc_port.h.
1832SN/A        sc_port_b<IF>::bind(const_cast<IF &>(interface));
18410930Sbrandon.potter@amd.com    }
18510930Sbrandon.potter@amd.com    explicit sc_port(sc_port_b<IF> &parent) : sc_port_b<IF>(N, P)
1865282Srstrong@cs.ucsd.edu    {
18710929Sbrandon.potter@amd.com        this->warn_unimpl(__PRETTY_FUNCTION__);
18810929Sbrandon.potter@amd.com        // Should warn that these are deprecated. See Accellera sc_port.h.
18910929Sbrandon.potter@amd.com        sc_port_b<IF>::bind(parent);
19010929Sbrandon.potter@amd.com    }
19110929Sbrandon.potter@amd.com    sc_port(const char *name, sc_port_b<IF> &parent) :
19210929Sbrandon.potter@amd.com        sc_port_b<IF>(name, N, P)
19310929Sbrandon.potter@amd.com    {
1945282Srstrong@cs.ucsd.edu        this->warn_unimpl(__PRETTY_FUNCTION__);
1955282Srstrong@cs.ucsd.edu        // Should warn that these are deprecated. See Accellera sc_port.h.
1965282Srstrong@cs.ucsd.edu        sc_port_b<IF>::bind(parent);
1975282Srstrong@cs.ucsd.edu    }
1985282Srstrong@cs.ucsd.edu    explicit sc_port(sc_port<IF, N, P> &parent) : sc_port_b<IF>(N, P)
1995282Srstrong@cs.ucsd.edu    {
2005282Srstrong@cs.ucsd.edu        this->warn_unimpl(__PRETTY_FUNCTION__);
2015282Srstrong@cs.ucsd.edu        // Should warn that these are deprecated. See Accellera sc_port.h.
2025282Srstrong@cs.ucsd.edu        sc_port_b<IF>::bind(parent);
2032680Sktlim@umich.edu    }
2043311Ssaidi@eecs.umich.edu    sc_port(const char *name, sc_port<IF, N, P> &parent) :
2058601Ssteve.reinhardt@amd.com        sc_port_b<IF>(name, N, P)
2068601Ssteve.reinhardt@amd.com    {
2078539Sgblack@eecs.umich.edu        this->warn_unimpl(__PRETTY_FUNCTION__);
2088539Sgblack@eecs.umich.edu        // Should warn that these are deprecated. See Accellera sc_port.h.
2098539Sgblack@eecs.umich.edu        sc_port_b<IF>::bind(parent);
2104434Ssaidi@eecs.umich.edu    }
2119110Ssteve.reinhardt@amd.com
21210558Salexandru.dutu@amd.com    virtual const char *kind() const { return "sc_port"; }
2139110Ssteve.reinhardt@amd.com
21410558Salexandru.dutu@amd.com  private:
21510558Salexandru.dutu@amd.com    // Disabled
2169110Ssteve.reinhardt@amd.com    sc_port(const sc_port<IF, N, P> &) {}
2179110Ssteve.reinhardt@amd.com    sc_port<IF, N, P> &operator = (const sc_port<IF, N, P> &) { return *this; }
2189110Ssteve.reinhardt@amd.com};
2199110Ssteve.reinhardt@amd.com
22010558Salexandru.dutu@amd.com} // namespace sc_core
2219110Ssteve.reinhardt@amd.com
2229110Ssteve.reinhardt@amd.com#endif  //__SYSTEMC_EXT_CORE_SC_PORT_HH__
2239110Ssteve.reinhardt@amd.com