target_socket.hh revision 13521
12689Sktlim@umich.edu/*****************************************************************************
28703Sandreas.hansson@arm.com
38666SPrakash.Ramrakhyani@arm.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
48666SPrakash.Ramrakhyani@arm.com  more contributor license agreements.  See the NOTICE file distributed
58666SPrakash.Ramrakhyani@arm.com  with this work for additional information regarding copyright ownership.
68666SPrakash.Ramrakhyani@arm.com  Accellera licenses this file to you under the Apache License, Version 2.0
78666SPrakash.Ramrakhyani@arm.com  (the "License"); you may not use this file except in compliance with the
88666SPrakash.Ramrakhyani@arm.com  License.  You may obtain a copy of the License at
98666SPrakash.Ramrakhyani@arm.com
108666SPrakash.Ramrakhyani@arm.com    http://www.apache.org/licenses/LICENSE-2.0
118666SPrakash.Ramrakhyani@arm.com
128666SPrakash.Ramrakhyani@arm.com  Unless required by applicable law or agreed to in writing, software
138666SPrakash.Ramrakhyani@arm.com  distributed under the License is distributed on an "AS IS" BASIS,
142689Sktlim@umich.edu  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
157897Shestness@cs.utexas.edu  implied.  See the License for the specific language governing
162689Sktlim@umich.edu  permissions and limitations under the License.
172689Sktlim@umich.edu
182689Sktlim@umich.edu *****************************************************************************/
192689Sktlim@umich.edu
202689Sktlim@umich.edu#ifndef __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__
212689Sktlim@umich.edu#define __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__
222689Sktlim@umich.edu
232689Sktlim@umich.edu#include "tlm_core/2/interfaces/fw_bw_ifs.hh"
242689Sktlim@umich.edu#include "tlm_core/2/sockets/base_socket_if.hh"
252689Sktlim@umich.edu
262689Sktlim@umich.edunamespace tlm
272689Sktlim@umich.edu{
282689Sktlim@umich.edu
292689Sktlim@umich.edutemplate <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
302689Sktlim@umich.edu          typename BW_IF=tlm_bw_transport_if<>>
312689Sktlim@umich.educlass tlm_base_target_socket_b
322689Sktlim@umich.edu{
332689Sktlim@umich.edu  public:
342689Sktlim@umich.edu    virtual ~tlm_base_target_socket_b() {}
352689Sktlim@umich.edu
362689Sktlim@umich.edu    virtual sc_core::sc_port_b<BW_IF> &get_base_port() = 0;
372689Sktlim@umich.edu    virtual sc_core::sc_export<FW_IF> &get_base_export() = 0;
382689Sktlim@umich.edu    virtual FW_IF &get_base_interface() = 0;
392689Sktlim@umich.edu};
402689Sktlim@umich.edu
412689Sktlim@umich.edutemplate <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF>
422689Sktlim@umich.educlass tlm_base_initiator_socket_b;
432689Sktlim@umich.edu
442689Sktlim@umich.edutemplate <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N,
457897Shestness@cs.utexas.edu          sc_core::sc_port_policy POL>
462689Sktlim@umich.educlass tlm_base_initiator_socket;
472689Sktlim@umich.edu
482521SN/Atemplate <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
493960Sgblack@eecs.umich.edu          typename BW_IF=tlm_bw_transport_if<>, int N=1,
504194Ssaidi@eecs.umich.edu          sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
518769Sgblack@eecs.umich.educlass tlm_base_target_socket :
521070SN/A    public tlm_base_socket_if,
531070SN/A    public tlm_base_target_socket_b<BUSWIDTH, FW_IF, BW_IF>,
542521SN/A    public sc_core::sc_export<FW_IF>
556658Snate@binkert.org{
568229Snate@binkert.org  public:
578232Snate@binkert.org    typedef FW_IF fw_interface_type;
588666SPrakash.Ramrakhyani@arm.com    typedef BW_IF bw_interface_type;
598769Sgblack@eecs.umich.edu    typedef sc_core::sc_port<bw_interface_type, N, POL> port_type;
602522SN/A
618769Sgblack@eecs.umich.edu    typedef sc_core::sc_export<fw_interface_type> export_type;
622037SN/A    typedef tlm_base_initiator_socket_b<
638229Snate@binkert.org        BUSWIDTH, fw_interface_type, bw_interface_type>
648769Sgblack@eecs.umich.edu        base_initiator_socket_type;
6556SN/A
666658Snate@binkert.org    typedef tlm_base_target_socket_b<
672SN/A        BUSWIDTH, fw_interface_type, bw_interface_type> base_type;
682107SN/A
692SN/A    template <unsigned int, typename, typename, int, sc_core::sc_port_policy>
702SN/A    friend class tlm_base_initiator_socket;
712SN/A
722SN/A  public:
732SN/A    tlm_base_target_socket() :
741070SN/A        export_type(sc_core::sc_gen_unique_name("tlm_base_target_socket")),
758703Sandreas.hansson@arm.com        m_port(sc_core::sc_gen_unique_name("tlm_base_target_socket_port"))
768703Sandreas.hansson@arm.com    {}
778826Snilay@cs.wisc.edu
782521SN/A    explicit tlm_base_target_socket(const char *name) :
798852Sandreas.hansson@arm.com        export_type(name), m_port(sc_core::sc_gen_unique_name(
808852Sandreas.hansson@arm.com                    (std::string(name) + "_port").c_str()))
817580SAli.Saidi@arm.com    {}
827770SAli.Saidi@ARM.com
838931Sandreas.hansson@arm.com    virtual const char *kind() const { return "tlm_base_target_socket"; }
847914SBrad.Beckmann@amd.com
857914SBrad.Beckmann@amd.com    //
867914SBrad.Beckmann@amd.com    // Bind target socket to initiator socket
878666SPrakash.Ramrakhyani@arm.com    // - Binds the port of the initiator socket to the export of the target
887914SBrad.Beckmann@amd.com    //   socket
898666SPrakash.Ramrakhyani@arm.com    // - Binds the port of the target socket to the export of the initiator
907897Shestness@cs.utexas.edu    //   socket
912SN/A    //
921070SN/A    virtual void
931070SN/A    bind(base_initiator_socket_type &s)
941070SN/A    {
958769Sgblack@eecs.umich.edu        // initiator.port -> target.export
968769Sgblack@eecs.umich.edu        (s.get_base_port())(get_base_interface());
978769Sgblack@eecs.umich.edu        // target.port -> initiator.export
988769Sgblack@eecs.umich.edu        get_base_port()(s.get_base_interface());
998666SPrakash.Ramrakhyani@arm.com    }
1008832SAli.Saidi@ARM.com
1018832SAli.Saidi@ARM.com    void operator () (base_initiator_socket_type &s) { bind(s); }
1028832SAli.Saidi@ARM.com
1038832SAli.Saidi@ARM.com    //
1048832SAli.Saidi@ARM.com    // Bind target socket to target socket (hierarchical bind)
1058832SAli.Saidi@ARM.com    // - Binds both the export and the port
1068832SAli.Saidi@ARM.com    //
1078832SAli.Saidi@ARM.com    virtual void
1088832SAli.Saidi@ARM.com    bind(base_type &s)
1098832SAli.Saidi@ARM.com    {
1108885SAli.Saidi@ARM.com        // export
1118885SAli.Saidi@ARM.com        (get_base_export())(s.get_base_export());
1128885SAli.Saidi@ARM.com        // port
1138885SAli.Saidi@ARM.com        (s.get_base_port())(get_base_port());
1148885SAli.Saidi@ARM.com    }
1158885SAli.Saidi@ARM.com
1168885SAli.Saidi@ARM.com    void operator () (base_type &s) { bind(s); }
1178885SAli.Saidi@ARM.com
1188885SAli.Saidi@ARM.com    //
1198885SAli.Saidi@ARM.com    // Bind interface to socket
1208885SAli.Saidi@ARM.com    // - Binds the interface to the export
1218885SAli.Saidi@ARM.com    //
1228885SAli.Saidi@ARM.com    virtual void
1238885SAli.Saidi@ARM.com    bind(fw_interface_type &ifs)
1248885SAli.Saidi@ARM.com    {
1258885SAli.Saidi@ARM.com        export_type *exp = &get_base_export();
1268885SAli.Saidi@ARM.com        if (this == exp) {
1278885SAli.Saidi@ARM.com            export_type::bind(ifs);
1288885SAli.Saidi@ARM.com        } else {
1298885SAli.Saidi@ARM.com            exp->bind( ifs );
1308885SAli.Saidi@ARM.com        }
1318885SAli.Saidi@ARM.com    }
1328885SAli.Saidi@ARM.com
1338885SAli.Saidi@ARM.com    void operator () (fw_interface_type &s) { bind(s); }
1348885SAli.Saidi@ARM.com
1358885SAli.Saidi@ARM.com    //
1368885SAli.Saidi@ARM.com    // Forward to 'size()' of port class.
1378885SAli.Saidi@ARM.com    //
1388885SAli.Saidi@ARM.com    int size() const { return m_port.size(); }
1398885SAli.Saidi@ARM.com
1408885SAli.Saidi@ARM.com    //
1418885SAli.Saidi@ARM.com    // Forward to 'operator->()' of port class.
1428885SAli.Saidi@ARM.com    //
1438885SAli.Saidi@ARM.com    bw_interface_type *operator->() { return m_port.operator->(); }
1448885SAli.Saidi@ARM.com
1458885SAli.Saidi@ARM.com    //
1468885SAli.Saidi@ARM.com    // Forward to 'operator[]()' of port class.
1478885SAli.Saidi@ARM.com    //
1482SN/A    bw_interface_type *operator[](int i) { return m_port.operator[](i); }
1492SN/A
1502SN/A    // Implementation of tlm_base_socket_if functions.
1512SN/A    virtual sc_core::sc_port_base &get_port_base() { return m_port; }
1521070SN/A    virtual sc_core::sc_port_base const &
1531070SN/A    get_port_base() const
1548666SPrakash.Ramrakhyani@arm.com    {
1558666SPrakash.Ramrakhyani@arm.com        return m_port;
1568666SPrakash.Ramrakhyani@arm.com    }
1572SN/A    virtual sc_core::sc_export_base &get_export_base() { return *this; }
1582SN/A    virtual sc_core::sc_export_base const &
1598706Sandreas.hansson@arm.com    get_export_base() const
1608706Sandreas.hansson@arm.com    {
1618706Sandreas.hansson@arm.com        return *this;
1628706Sandreas.hansson@arm.com    }
1638706Sandreas.hansson@arm.com    virtual unsigned int get_bus_width() const { return BUSWIDTH; }
1648706Sandreas.hansson@arm.com    virtual tlm_socket_category
1658706Sandreas.hansson@arm.com    get_socket_category() const
1668706Sandreas.hansson@arm.com    {
1678922Swilliam.wang@arm.com        return TLM_TARGET_SOCKET;
1688922Swilliam.wang@arm.com    }
1698703Sandreas.hansson@arm.com
1708703Sandreas.hansson@arm.com    // Implementation of tlm_base_target_socket_b functions
1718922Swilliam.wang@arm.com    virtual sc_core::sc_port_b<BW_IF> &get_base_port() { return m_port; }
1728703Sandreas.hansson@arm.com    virtual sc_core::sc_port_b<BW_IF> const &
1738703Sandreas.hansson@arm.com    get_base_port() const
1742901Ssaidi@eecs.umich.edu    {
1754762Snate@binkert.org        return m_port;
1762901Ssaidi@eecs.umich.edu    }
1772901Ssaidi@eecs.umich.edu
1782901Ssaidi@eecs.umich.edu    virtual FW_IF &get_base_interface() { return *this; }
1792901Ssaidi@eecs.umich.edu    virtual FW_IF const &get_base_interface() const { return *this; }
1802901Ssaidi@eecs.umich.edu
1813960Sgblack@eecs.umich.edu    virtual sc_core::sc_export<FW_IF> &get_base_export() { return *this; }
1823960Sgblack@eecs.umich.edu    virtual sc_core::sc_export<FW_IF> const &
1834095Sbinkertn@umich.edu    get_base_export() const
1844095Sbinkertn@umich.edu    {
1854095Sbinkertn@umich.edu        return *this;
1863960Sgblack@eecs.umich.edu    }
1873960Sgblack@eecs.umich.edu
1887445Ssteve.reinhardt@amd.com  protected:
1897445Ssteve.reinhardt@amd.com    port_type m_port;
1907445Ssteve.reinhardt@amd.com};
1917445Ssteve.reinhardt@amd.com
1927445Ssteve.reinhardt@amd.comtemplate <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types,
1937445Ssteve.reinhardt@amd.com          int N=1, sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
1947445Ssteve.reinhardt@amd.comclass tlm_target_socket :
195180SN/A    public tlm_base_target_socket<
1965718Shsul@eecs.umich.edu        BUSWIDTH, tlm_fw_transport_if<TYPES>,
1972SN/A        tlm_bw_transport_if<TYPES>, N, POL>
1985712Shsul@eecs.umich.edu{
1995718Shsul@eecs.umich.edu  public:
2005718Shsul@eecs.umich.edu    tlm_target_socket() :
2015718Shsul@eecs.umich.edu        tlm_base_target_socket<
2025718Shsul@eecs.umich.edu            BUSWIDTH, tlm_fw_transport_if<TYPES>,
2035718Shsul@eecs.umich.edu            tlm_bw_transport_if<TYPES>, N, POL>()
2045718Shsul@eecs.umich.edu    {}
2055718Shsul@eecs.umich.edu
2065718Shsul@eecs.umich.edu    explicit tlm_target_socket(const char *name) :
2075718Shsul@eecs.umich.edu        tlm_base_target_socket<
2085718Shsul@eecs.umich.edu            BUSWIDTH, tlm_fw_transport_if<TYPES>,
2095718Shsul@eecs.umich.edu            tlm_bw_transport_if<TYPES>, N, POL>(name)
2105718Shsul@eecs.umich.edu    {}
2111806SN/A
2121806SN/A    virtual const char* kind() const { return "tlm_target_socket"; }
2132680Sktlim@umich.edu
2145823Ssaidi@eecs.umich.edu    virtual sc_core::sc_type_index
2151806SN/A    get_protocol_types() const
2162680Sktlim@umich.edu    {
2175714Shsul@eecs.umich.edu        return typeid(TYPES);
2181070SN/A    }
2195512SMichael.Adler@intel.com};
2207445Ssteve.reinhardt@amd.com
2214095Sbinkertn@umich.edu} // namespace tlm
2225512SMichael.Adler@intel.com
2234095Sbinkertn@umich.edu#endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__ */
2247445Ssteve.reinhardt@amd.com