/*****************************************************************************

  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_TARGET_SOCKET_HH__
#define __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__

#include "tlm_core/2/interfaces/fw_bw_ifs.hh"
#include "tlm_core/2/sockets/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_target_socket_b
{
  public:
    virtual ~tlm_base_target_socket_b() {}

    virtual sc_core::sc_port_b<BW_IF> &get_base_port() = 0;
    virtual sc_core::sc_export<FW_IF> &get_base_export() = 0;
    virtual FW_IF &get_base_interface() = 0;
};

template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF>
class tlm_base_initiator_socket_b;

template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N,
          sc_core::sc_port_policy POL>
class tlm_base_initiator_socket;

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_target_socket :
    public tlm_base_socket_if,
    public tlm_base_target_socket_b<BUSWIDTH, FW_IF, BW_IF>,
    public sc_core::sc_export<FW_IF>
{
  public:
    typedef FW_IF fw_interface_type;
    typedef BW_IF bw_interface_type;
    typedef sc_core::sc_port<bw_interface_type, N, POL> port_type;

    typedef sc_core::sc_export<fw_interface_type> export_type;
    typedef tlm_base_initiator_socket_b<
        BUSWIDTH, fw_interface_type, bw_interface_type>
        base_initiator_socket_type;

    typedef tlm_base_target_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_initiator_socket;

  public:
    tlm_base_target_socket() :
        export_type(sc_core::sc_gen_unique_name("tlm_base_target_socket")),
        m_port(sc_core::sc_gen_unique_name("tlm_base_target_socket_port"))
    {}

    explicit tlm_base_target_socket(const char *name) :
        export_type(name), m_port(sc_core::sc_gen_unique_name(
                    (std::string(name) + "_port").c_str()))
    {}

    virtual const char *kind() const { return "tlm_base_target_socket"; }

    //
    // Bind target socket to initiator 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_initiator_socket_type &s)
    {
        // initiator.port -> target.export
        (s.get_base_port())(get_base_interface());
        // target.port -> initiator.export
        get_base_port()(s.get_base_interface());
    }

    void operator () (base_initiator_socket_type &s) { bind(s); }

    //
    // Bind target socket to target socket (hierarchical bind)
    // - Binds both the export and the port
    //
    virtual void
    bind(base_type &s)
    {
        // export
        (get_base_export())(s.get_base_export());
        // port
        (s.get_base_port())(get_base_port());
    }

    void operator () (base_type &s) { bind(s); }

    //
    // Bind interface to socket
    // - Binds the interface to the export
    //
    virtual void
    bind(fw_interface_type &ifs)
    {
        export_type *exp = &get_base_export();
        if (this == exp) {
            export_type::bind(ifs);
        } else {
            exp->bind( ifs );
        }
    }

    void operator () (fw_interface_type &s) { bind(s); }

    //
    // Forward to 'size()' of port class.
    //
    int size() const { return m_port.size(); }

    //
    // Forward to 'operator->()' of port class.
    //
    bw_interface_type *operator->() { return m_port.operator->(); }

    //
    // Forward to 'operator[]()' of port class.
    //
    bw_interface_type *operator[](int i) { return m_port.operator[](i); }

    // Implementation of tlm_base_socket_if functions.
    virtual sc_core::sc_port_base &get_port_base() { return m_port; }
    virtual sc_core::sc_port_base const &
    get_port_base() const
    {
        return m_port;
    }
    virtual sc_core::sc_export_base &get_export_base() { return *this; }
    virtual sc_core::sc_export_base const &
    get_export_base() const
    {
        return *this;
    }
    virtual unsigned int get_bus_width() const { return BUSWIDTH; }
    virtual tlm_socket_category
    get_socket_category() const
    {
        return TLM_TARGET_SOCKET;
    }

    // Implementation of tlm_base_target_socket_b functions
    virtual sc_core::sc_port_b<BW_IF> &get_base_port() { return m_port; }
    virtual sc_core::sc_port_b<BW_IF> const &
    get_base_port() const
    {
        return m_port;
    }

    virtual FW_IF &get_base_interface() { return *this; }
    virtual FW_IF const &get_base_interface() const { return *this; }

    virtual sc_core::sc_export<FW_IF> &get_base_export() { return *this; }
    virtual sc_core::sc_export<FW_IF> const &
    get_base_export() const
    {
        return *this;
    }

  protected:
    port_type m_port;
};

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_target_socket :
    public tlm_base_target_socket<
        BUSWIDTH, tlm_fw_transport_if<TYPES>,
        tlm_bw_transport_if<TYPES>, N, POL>
{
  public:
    tlm_target_socket() :
        tlm_base_target_socket<
            BUSWIDTH, tlm_fw_transport_if<TYPES>,
            tlm_bw_transport_if<TYPES>, N, POL>()
    {}

    explicit tlm_target_socket(const char *name) :
        tlm_base_target_socket<
            BUSWIDTH, tlm_fw_transport_if<TYPES>,
            tlm_bw_transport_if<TYPES>, N, POL>(name)
    {}

    virtual const char* kind() const { return "tlm_target_socket"; }

    virtual sc_core::sc_type_index
    get_protocol_types() const
    {
        return typeid(TYPES);
    }
};

} // namespace tlm

#endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__ */
