| /***************************************************************************** |
| |
| Licensed to Accellera Systems Initiative Inc. (Accellera) under one or |
| more contributor license agreements. See the NOTICE file distributed |
| with this work for additional information regarding copyright ownership. |
| Accellera licenses this file to you under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with the |
| License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| implied. See the License for the specific language governing |
| permissions and limitations under the License. |
| |
| *****************************************************************************/ |
| |
| #ifndef __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ |
| #define __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ |
| |
| #include <typeindex> |
| |
| #include "../interfaces/fw_bw_ifs.hh" |
| #include "base_socket_if.hh" |
| |
| namespace tlm |
| { |
| |
| template <unsigned int BUSWIDTH=32, |
| typename FW_IF=tlm_fw_transport_if<>, |
| typename BW_IF=tlm_bw_transport_if<>> |
| class tlm_base_initiator_socket_b |
| { |
| public: |
| virtual ~tlm_base_initiator_socket_b() {} |
| |
| virtual sc_core::sc_port_b<FW_IF> &get_base_port() = 0; |
| virtual sc_core::sc_port_b<FW_IF> const &get_base_port() const = 0; |
| virtual BW_IF &get_base_interface() = 0; |
| virtual BW_IF const &get_base_interface() const = 0; |
| virtual sc_core::sc_export<BW_IF> &get_base_export() = 0; |
| virtual sc_core::sc_export<BW_IF> const &get_base_export() const = 0; |
| }; |
| |
| template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF> |
| class tlm_base_target_socket_b; |
| |
| template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N, |
| sc_core::sc_port_policy POL> |
| class tlm_base_target_socket; |
| |
| // The overloaded virtual is intended in SystemC, so we'll disable the warning. |
| // Please check section 9.3 of SystemC 2.3.1 release note for more details. |
| #pragma GCC diagnostic push |
| #pragma GCC diagnostic ignored "-Woverloaded-virtual" |
| template <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>, |
| typename BW_IF=tlm_bw_transport_if<>, int N=1, |
| sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> |
| class tlm_base_initiator_socket : |
| public tlm_base_socket_if, |
| public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>, |
| public sc_core::sc_port<FW_IF, N, POL> |
| { |
| public: |
| typedef FW_IF fw_interface_type; |
| typedef BW_IF bw_interface_type; |
| typedef sc_core::sc_port<fw_interface_type, N, POL> port_type; |
| |
| typedef sc_core::sc_export<bw_interface_type> export_type; |
| |
| typedef tlm_base_target_socket_b< |
| BUSWIDTH, fw_interface_type, bw_interface_type> |
| base_target_socket_type; |
| typedef tlm_base_initiator_socket_b< |
| BUSWIDTH, fw_interface_type, bw_interface_type> base_type; |
| |
| template <unsigned int, typename, typename, int, sc_core::sc_port_policy> |
| friend class tlm_base_target_socket; |
| |
| public: |
| tlm_base_initiator_socket() : |
| port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket")), |
| m_export(sc_core::sc_gen_unique_name( |
| "tlm_base_initiator_socket_export")) |
| {} |
| |
| explicit tlm_base_initiator_socket(const char *name) : port_type(name), |
| m_export(sc_core::sc_gen_unique_name( |
| (std::string(name) + "_export").c_str())) |
| {} |
| |
| virtual const char* kind() const { return "tlm_base_initiator_socket"; } |
| |
| // |
| // Bind initiator socket to target socket |
| // - Binds the port of the initiator socket to the export of the target |
| // socket |
| // - Binds the port of the target socket to the export of the initiator |
| // socket |
| // |
| virtual void |
| bind(base_target_socket_type &s) |
| { |
| // initiator.port -> target.export |
| (get_base_port())(s.get_base_interface()); |
| // target.port -> initiator.export |
| (s.get_base_port())(get_base_interface()); |
| } |
| |
| void operator () (base_target_socket_type &s) { bind(s); } |
| |
| // |
| // Bind initiator socket to initiator socket (hierarchical bind) |
| // - Binds both the export and the port |
| // |
| virtual void |
| bind(base_type &s) |
| { |
| // port |
| (get_base_port())(s.get_base_port()); |
| // export |
| (s.get_base_export())(get_base_export()); |
| } |
| |
| void operator() (base_type &s) { bind(s); } |
| |
| // |
| // Bind interface to socket |
| // - Binds the interface to the export of this socket |
| // |
| virtual void bind(bw_interface_type &ifs) { (get_base_export())(ifs); } |
| void operator() (bw_interface_type &s) { bind(s); } |
| |
| // Implementation of tlm_base_socket_if functions |
| virtual sc_core::sc_port_base &get_port_base() { return *this; } |
| virtual sc_core::sc_port_base const & |
| get_port_base() const |
| { |
| return *this; |
| } |
| virtual sc_core::sc_export_base &get_export_base() { return m_export; } |
| virtual sc_core::sc_export_base const & |
| get_export_base() const |
| { |
| return m_export; |
| } |
| virtual unsigned int get_bus_width() const { return BUSWIDTH; } |
| virtual tlm_socket_category |
| get_socket_category() const |
| { |
| return TLM_INITIATOR_SOCKET; |
| } |
| |
| // Implementation of tlm_base_target_socket_b functions |
| virtual sc_core::sc_port_b<FW_IF> &get_base_port() { return *this; } |
| virtual sc_core::sc_port_b<FW_IF> const & |
| get_base_port() const |
| { |
| return *this; |
| } |
| |
| virtual BW_IF &get_base_interface() { return m_export; } |
| virtual BW_IF const &get_base_interface() const { return m_export; } |
| |
| virtual sc_core::sc_export<BW_IF> &get_base_export() { return m_export; } |
| virtual sc_core::sc_export<BW_IF> const & |
| get_base_export() const |
| { |
| return m_export; |
| } |
| |
| protected: |
| export_type m_export; |
| }; |
| #pragma GCC diagnostic pop |
| |
| // |
| // Convenience socket classes |
| // |
| |
| template <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types, |
| int N=1, sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> |
| class tlm_initiator_socket : public tlm_base_initiator_socket< |
| BUSWIDTH, tlm_fw_transport_if<TYPES>, |
| tlm_bw_transport_if<TYPES>, N, POL> |
| { |
| public: |
| tlm_initiator_socket() : tlm_base_initiator_socket< |
| BUSWIDTH, tlm_fw_transport_if<TYPES>, |
| tlm_bw_transport_if<TYPES>, N, POL>() |
| {} |
| |
| explicit tlm_initiator_socket(const char *name) : |
| tlm_base_initiator_socket<BUSWIDTH, tlm_fw_transport_if<TYPES>, |
| tlm_bw_transport_if<TYPES>, N, POL>(name) |
| {} |
| |
| virtual const char *kind() const { return "tlm_initiator_socket"; } |
| |
| virtual std::type_index |
| get_protocol_types() const |
| { |
| return typeid(TYPES); |
| } |
| }; |
| |
| } // namespace tlm |
| |
| #endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ */ |