initiator_socket.hh revision 13523
12SN/A/*****************************************************************************
21762SN/A
32SN/A  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
42SN/A  more contributor license agreements.  See the NOTICE file distributed
52SN/A  with this work for additional information regarding copyright ownership.
62SN/A  Accellera licenses this file to you under the Apache License, Version 2.0
72SN/A  (the "License"); you may not use this file except in compliance with the
82SN/A  License.  You may obtain a copy of the License at
92SN/A
102SN/A    http://www.apache.org/licenses/LICENSE-2.0
112SN/A
122SN/A  Unless required by applicable law or agreed to in writing, software
132SN/A  distributed under the License is distributed on an "AS IS" BASIS,
142SN/A  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
152SN/A  implied.  See the License for the specific language governing
162SN/A  permissions and limitations under the License.
172SN/A
182SN/A *****************************************************************************/
192SN/A
202SN/A#ifndef __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__
212SN/A#define __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__
222SN/A
232SN/A#include <typeindex>
242SN/A
252SN/A#include "tlm_core/2/interfaces/fw_bw_ifs.hh"
262SN/A#include "tlm_core/2/sockets/base_socket_if.hh"
272665SN/A
282665SN/Anamespace tlm
292SN/A{
302SN/A
312SN/Atemplate <unsigned int BUSWIDTH=32,
322SN/A          typename FW_IF=tlm_fw_transport_if<>,
336214Snate@binkert.org          typename BW_IF=tlm_bw_transport_if<>>
342SN/Aclass tlm_base_initiator_socket_b
352SN/A{
362SN/A  public:
376214Snate@binkert.org    virtual ~tlm_base_initiator_socket_b() {}
386214Snate@binkert.org
392SN/A    virtual sc_core::sc_port_b<FW_IF> &get_base_port() = 0;
402SN/A    virtual sc_core::sc_port_b<FW_IF> const &get_base_port() const = 0;
412SN/A    virtual BW_IF &get_base_interface() = 0;
429180Sandreas.hansson@arm.com    virtual BW_IF const &get_base_interface() const = 0;
4310474Sandreas.hansson@arm.com    virtual sc_core::sc_export<BW_IF> &get_base_export() = 0;
449500Snilay@cs.wisc.edu    virtual sc_core::sc_export<BW_IF> const &get_base_export() const = 0;
4511004SAndreas.Sandberg@ARM.com};
469180Sandreas.hansson@arm.com
4710276SAndreas.Sandberg@ARM.comtemplate <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF>
4810276SAndreas.Sandberg@ARM.comclass tlm_base_target_socket_b;
492SN/A
505543SN/Atemplate <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N,
512SN/A          sc_core::sc_port_policy POL>
525543SN/Aclass tlm_base_target_socket;
532SN/A
542SN/Atemplate <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
552SN/A          typename BW_IF=tlm_bw_transport_if<>, int N=1,
562SN/A          sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
572SN/Aclass tlm_base_initiator_socket :
582SN/A    public tlm_base_socket_if,
592SN/A    public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>,
602SN/A    public sc_core::sc_port<FW_IF, N, POL>
619158Sandreas.hansson@arm.com{
622SN/A  public:
639158Sandreas.hansson@arm.com    typedef FW_IF fw_interface_type;
642SN/A    typedef BW_IF bw_interface_type;
659158Sandreas.hansson@arm.com    typedef sc_core::sc_port<fw_interface_type, N, POL> port_type;
662667SN/A
672130SN/A    typedef sc_core::sc_export<bw_interface_type> export_type;
689180Sandreas.hansson@arm.com
699180Sandreas.hansson@arm.com    typedef tlm_base_target_socket_b<
709180Sandreas.hansson@arm.com        BUSWIDTH, fw_interface_type, bw_interface_type>
719180Sandreas.hansson@arm.com        base_target_socket_type;
729180Sandreas.hansson@arm.com    typedef tlm_base_initiator_socket_b<
739180Sandreas.hansson@arm.com        BUSWIDTH, fw_interface_type, bw_interface_type> base_type;
749180Sandreas.hansson@arm.com
759180Sandreas.hansson@arm.com    template <unsigned int, typename, typename, int, sc_core::sc_port_policy>
769180Sandreas.hansson@arm.com    friend class tlm_base_target_socket;
779180Sandreas.hansson@arm.com
789180Sandreas.hansson@arm.com  public:
799180Sandreas.hansson@arm.com    tlm_base_initiator_socket() :
809180Sandreas.hansson@arm.com        port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket")),
819180Sandreas.hansson@arm.com        m_export(sc_core::sc_gen_unique_name(
829180Sandreas.hansson@arm.com                    "tlm_base_initiator_socket_export"))
839180Sandreas.hansson@arm.com    {}
849180Sandreas.hansson@arm.com
859180Sandreas.hansson@arm.com    explicit tlm_base_initiator_socket(const char *name) : port_type(name),
869180Sandreas.hansson@arm.com        m_export(sc_core::sc_gen_unique_name(
879180Sandreas.hansson@arm.com                    (std::string(name) + "_export").c_str()))
889180Sandreas.hansson@arm.com    {}
899180Sandreas.hansson@arm.com
909180Sandreas.hansson@arm.com    virtual const char* kind() const { return "tlm_base_initiator_socket"; }
919180Sandreas.hansson@arm.com
929180Sandreas.hansson@arm.com    //
939180Sandreas.hansson@arm.com    // Bind initiator socket to target socket
9411004SAndreas.Sandberg@ARM.com    // - Binds the port of the initiator socket to the export of the target
959180Sandreas.hansson@arm.com    //   socket
9611004SAndreas.Sandberg@ARM.com    // - Binds the port of the target socket to the export of the initiator
9711004SAndreas.Sandberg@ARM.com    //   socket
989180Sandreas.hansson@arm.com    //
9911004SAndreas.Sandberg@ARM.com    virtual void
1009180Sandreas.hansson@arm.com    bind(base_target_socket_type &s)
1019184Sandreas.hansson@arm.com    {
1029184Sandreas.hansson@arm.com        // initiator.port -> target.export
1039184Sandreas.hansson@arm.com        (get_base_port())(s.get_base_interface());
1049180Sandreas.hansson@arm.com        // target.port -> initiator.export
1059180Sandreas.hansson@arm.com        (s.get_base_port())(get_base_interface());
1069180Sandreas.hansson@arm.com    }
10711004SAndreas.Sandberg@ARM.com
1089180Sandreas.hansson@arm.com    void operator () (base_target_socket_type &s) { bind(s); }
1099180Sandreas.hansson@arm.com
1109180Sandreas.hansson@arm.com    //
1119180Sandreas.hansson@arm.com    // Bind initiator socket to initiator socket (hierarchical bind)
1129180Sandreas.hansson@arm.com    // - Binds both the export and the port
1139180Sandreas.hansson@arm.com    //
1149180Sandreas.hansson@arm.com    virtual void
1159180Sandreas.hansson@arm.com    bind(base_type &s)
1169180Sandreas.hansson@arm.com    {
1179180Sandreas.hansson@arm.com        // port
11811004SAndreas.Sandberg@ARM.com        (get_base_port())(s.get_base_port());
1199180Sandreas.hansson@arm.com        // export
1209180Sandreas.hansson@arm.com        (s.get_base_export())(get_base_export());
1219180Sandreas.hansson@arm.com    }
12211004SAndreas.Sandberg@ARM.com
1239180Sandreas.hansson@arm.com    void operator() (base_type &s) { bind(s); }
1249180Sandreas.hansson@arm.com
12511004SAndreas.Sandberg@ARM.com    //
1269498Snilay@cs.wisc.edu    // Bind interface to socket
1279498Snilay@cs.wisc.edu    // - Binds the interface to the export of this socket
12811004SAndreas.Sandberg@ARM.com    //
12911004SAndreas.Sandberg@ARM.com    virtual void bind(bw_interface_type &ifs) { (get_base_export())(ifs); }
13011004SAndreas.Sandberg@ARM.com    void operator() (bw_interface_type &s) { bind(s); }
13111004SAndreas.Sandberg@ARM.com
13211004SAndreas.Sandberg@ARM.com    // Implementation of tlm_base_socket_if functions
1339498Snilay@cs.wisc.edu    virtual sc_core::sc_port_base &get_port_base() { return *this; }
13411004SAndreas.Sandberg@ARM.com    virtual sc_core::sc_port_base const &
1359498Snilay@cs.wisc.edu    get_port_base() const
1369498Snilay@cs.wisc.edu    {
13711004SAndreas.Sandberg@ARM.com        return *this;
1389498Snilay@cs.wisc.edu    }
1399498Snilay@cs.wisc.edu    virtual sc_core::sc_export_base &get_export_base() { return m_export; }
1409500Snilay@cs.wisc.edu    virtual sc_core::sc_export_base const &
1419500Snilay@cs.wisc.edu    get_export_base() const
1429180Sandreas.hansson@arm.com    {
1439180Sandreas.hansson@arm.com        return m_export;
1449180Sandreas.hansson@arm.com    }
1459180Sandreas.hansson@arm.com    virtual unsigned int get_bus_width() const { return BUSWIDTH; }
1469180Sandreas.hansson@arm.com    virtual tlm_socket_category
1472130SN/A    get_socket_category() const
1482130SN/A    {
1492130SN/A        return TLM_INITIATOR_SOCKET;
1502130SN/A    }
1512130SN/A
1522130SN/A    // Implementation of tlm_base_target_socket_b functions
1532130SN/A    virtual sc_core::sc_port_b<FW_IF> &get_base_port() { return *this; }
1547720Sgblack@eecs.umich.edu    virtual sc_core::sc_port_b<FW_IF> const &
1557720Sgblack@eecs.umich.edu    get_base_port() const
1567720Sgblack@eecs.umich.edu    {
1577720Sgblack@eecs.umich.edu        return *this;
1587720Sgblack@eecs.umich.edu    }
1597720Sgblack@eecs.umich.edu
1607720Sgblack@eecs.umich.edu    virtual BW_IF &get_base_interface() { return m_export; }
1617720Sgblack@eecs.umich.edu    virtual BW_IF const &get_base_interface() const { return m_export; }
1627720Sgblack@eecs.umich.edu
1637720Sgblack@eecs.umich.edu    virtual sc_core::sc_export<BW_IF> &get_base_export() { return m_export; }
1647720Sgblack@eecs.umich.edu    virtual sc_core::sc_export<BW_IF> const &
1657720Sgblack@eecs.umich.edu    get_base_export() const
1667720Sgblack@eecs.umich.edu    {
1677720Sgblack@eecs.umich.edu        return m_export;
1687720Sgblack@eecs.umich.edu    }
1697720Sgblack@eecs.umich.edu
1707720Sgblack@eecs.umich.edu  protected:
1717720Sgblack@eecs.umich.edu    export_type m_export;
1727720Sgblack@eecs.umich.edu};
1737720Sgblack@eecs.umich.edu
1747720Sgblack@eecs.umich.edu//
1757720Sgblack@eecs.umich.edu// Convenience socket classes
1762438SN/A//
1772438SN/A
1786221Snate@binkert.orgtemplate <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types,
1796221Snate@binkert.org          int N=1, sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
1806221Snate@binkert.orgclass tlm_initiator_socket : public tlm_base_initiator_socket<
1816221Snate@binkert.org                             BUSWIDTH, tlm_fw_transport_if<TYPES>,
1826221Snate@binkert.org                             tlm_bw_transport_if<TYPES>, N, POL>
1836221Snate@binkert.org{
1849031Sandreas.hansson@arm.com  public:
1859031Sandreas.hansson@arm.com    tlm_initiator_socket() : tlm_base_initiator_socket<
1869031Sandreas.hansson@arm.com                             BUSWIDTH, tlm_fw_transport_if<TYPES>,
1879031Sandreas.hansson@arm.com                             tlm_bw_transport_if<TYPES>, N, POL>()
1889031Sandreas.hansson@arm.com    {}
1899031Sandreas.hansson@arm.com
1907678Sgblack@eecs.umich.edu    explicit tlm_initiator_socket(const char *name) :
19110474Sandreas.hansson@arm.com        tlm_base_initiator_socket<BUSWIDTH, tlm_fw_transport_if<TYPES>,
19210474Sandreas.hansson@arm.com                                  tlm_bw_transport_if<TYPES>, N, POL>(name)
19310474Sandreas.hansson@arm.com    {}
19410474Sandreas.hansson@arm.com
19510474Sandreas.hansson@arm.com    virtual const char *kind() const { return "tlm_initiator_socket"; }
19610474Sandreas.hansson@arm.com
19710474Sandreas.hansson@arm.com    virtual std::type_index
1987678Sgblack@eecs.umich.edu    get_protocol_types() const
19910839Sandreas.sandberg@arm.com    {
20010839Sandreas.sandberg@arm.com        return typeid(TYPES);
20110839Sandreas.sandberg@arm.com    }
20210839Sandreas.sandberg@arm.com};
20310839Sandreas.sandberg@arm.com
2046214Snate@binkert.org} // namespace tlm
205
206#endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ */
207