112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de#ifndef __TLM_INITIATOR_SOCKET_H__
2112027Sjungma@eit.uni-kl.de#define __TLM_INITIATOR_SOCKET_H__
2212027Sjungma@eit.uni-kl.de
2312027Sjungma@eit.uni-kl.de//#include <systemc>
2412027Sjungma@eit.uni-kl.de#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_fw_bw_ifs.h"
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.denamespace tlm {
2712027Sjungma@eit.uni-kl.de
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH = 32,
3012027Sjungma@eit.uni-kl.de          typename FW_IF = tlm_fw_transport_if<>,
3112027Sjungma@eit.uni-kl.de          typename BW_IF = tlm_bw_transport_if<> >
3212027Sjungma@eit.uni-kl.declass tlm_base_initiator_socket_b
3312027Sjungma@eit.uni-kl.de{
3412027Sjungma@eit.uni-kl.depublic:
3512027Sjungma@eit.uni-kl.de  virtual ~tlm_base_initiator_socket_b() {}
3612027Sjungma@eit.uni-kl.de
3712027Sjungma@eit.uni-kl.de  virtual sc_core::sc_port_b<FW_IF> &       get_base_port() = 0;
3812027Sjungma@eit.uni-kl.de  virtual sc_core::sc_port_b<FW_IF> const & get_base_port() const = 0;
3912027Sjungma@eit.uni-kl.de  virtual                    BW_IF  &       get_base_interface() = 0;
4012027Sjungma@eit.uni-kl.de  virtual                    BW_IF  const & get_base_interface() const = 0;
4112027Sjungma@eit.uni-kl.de  virtual sc_core::sc_export<BW_IF> &       get_base_export() = 0;
4212027Sjungma@eit.uni-kl.de  virtual sc_core::sc_export<BW_IF> const & get_base_export() const = 0;
4312027Sjungma@eit.uni-kl.de};
4412027Sjungma@eit.uni-kl.de
4512027Sjungma@eit.uni-kl.de
4612027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH,
4712027Sjungma@eit.uni-kl.de          typename FW_IF,
4812027Sjungma@eit.uni-kl.de          typename BW_IF> class tlm_base_target_socket_b;
4912027Sjungma@eit.uni-kl.de
5012027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH,
5112027Sjungma@eit.uni-kl.de          typename FW_IF,
5212027Sjungma@eit.uni-kl.de          typename BW_IF,
5312027Sjungma@eit.uni-kl.de          int N
5412027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
5512027Sjungma@eit.uni-kl.de          ,sc_core::sc_port_policy POL
5612027Sjungma@eit.uni-kl.de#endif
5712027Sjungma@eit.uni-kl.de          > class tlm_base_target_socket;
5812027Sjungma@eit.uni-kl.de
5912027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH = 32,
6012027Sjungma@eit.uni-kl.de          typename FW_IF = tlm_fw_transport_if<>,
6112027Sjungma@eit.uni-kl.de          typename BW_IF = tlm_bw_transport_if<>,
6212027Sjungma@eit.uni-kl.de          int N = 1
6312027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
6412027Sjungma@eit.uni-kl.de          ,sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND
6512027Sjungma@eit.uni-kl.de#endif
6612027Sjungma@eit.uni-kl.de          >
6712027Sjungma@eit.uni-kl.declass tlm_base_initiator_socket : public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>,
6812027Sjungma@eit.uni-kl.de                                  public sc_core::sc_port<FW_IF, N
6912027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
7012027Sjungma@eit.uni-kl.de                                                        , POL
7112027Sjungma@eit.uni-kl.de#endif
7212027Sjungma@eit.uni-kl.de                                                    >
7312027Sjungma@eit.uni-kl.de
7412027Sjungma@eit.uni-kl.de{
7512027Sjungma@eit.uni-kl.depublic:
7612027Sjungma@eit.uni-kl.de  typedef FW_IF                                 fw_interface_type;
7712027Sjungma@eit.uni-kl.de  typedef BW_IF                                 bw_interface_type;
7812027Sjungma@eit.uni-kl.de  typedef sc_core::sc_port<fw_interface_type, N
7912027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
8012027Sjungma@eit.uni-kl.de                                            , POL
8112027Sjungma@eit.uni-kl.de#endif
8212027Sjungma@eit.uni-kl.de                                            >   port_type;
8312027Sjungma@eit.uni-kl.de
8412027Sjungma@eit.uni-kl.de  typedef sc_core::sc_export<bw_interface_type> export_type;
8512027Sjungma@eit.uni-kl.de
8612027Sjungma@eit.uni-kl.de  typedef tlm_base_target_socket_b<BUSWIDTH,
8712027Sjungma@eit.uni-kl.de                                   fw_interface_type,
8812027Sjungma@eit.uni-kl.de                                   bw_interface_type> base_target_socket_type;
8912027Sjungma@eit.uni-kl.de  typedef tlm_base_initiator_socket_b<BUSWIDTH,
9012027Sjungma@eit.uni-kl.de                                      fw_interface_type,
9112027Sjungma@eit.uni-kl.de                                      bw_interface_type> base_type;
9212027Sjungma@eit.uni-kl.de
9312027Sjungma@eit.uni-kl.de  template <unsigned int, typename, typename, int
9412027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
9512027Sjungma@eit.uni-kl.de           ,sc_core::sc_port_policy
9612027Sjungma@eit.uni-kl.de#endif
9712027Sjungma@eit.uni-kl.de           >
9812027Sjungma@eit.uni-kl.de  friend class tlm_base_target_socket;
9912027Sjungma@eit.uni-kl.de
10012027Sjungma@eit.uni-kl.depublic:
10112027Sjungma@eit.uni-kl.de  tlm_base_initiator_socket()
10212027Sjungma@eit.uni-kl.de  : port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket"))
10312027Sjungma@eit.uni-kl.de  , m_export(sc_core::sc_gen_unique_name("tlm_base_initiator_socket_export"))
10412027Sjungma@eit.uni-kl.de  {
10512027Sjungma@eit.uni-kl.de  }
10612027Sjungma@eit.uni-kl.de
10712027Sjungma@eit.uni-kl.de  explicit tlm_base_initiator_socket(const char* name)
10812027Sjungma@eit.uni-kl.de  : port_type(name)
10912027Sjungma@eit.uni-kl.de  , m_export(sc_core::sc_gen_unique_name((std::string(name) + "_export").c_str()))
11012027Sjungma@eit.uni-kl.de  {
11112027Sjungma@eit.uni-kl.de  }
11212027Sjungma@eit.uni-kl.de
11312027Sjungma@eit.uni-kl.de  virtual const char* kind() const
11412027Sjungma@eit.uni-kl.de  {
11512027Sjungma@eit.uni-kl.de    return "tlm_base_initiator_socket";
11612027Sjungma@eit.uni-kl.de  }
11712027Sjungma@eit.uni-kl.de
11812027Sjungma@eit.uni-kl.de  unsigned int get_bus_width() const
11912027Sjungma@eit.uni-kl.de  {
12012027Sjungma@eit.uni-kl.de    return BUSWIDTH;
12112027Sjungma@eit.uni-kl.de  }
12212027Sjungma@eit.uni-kl.de
12312027Sjungma@eit.uni-kl.de  //
12412027Sjungma@eit.uni-kl.de  // Bind initiator socket to target socket
12512027Sjungma@eit.uni-kl.de  // - Binds the port of the initiator socket to the export of the target
12612027Sjungma@eit.uni-kl.de  //   socket
12712027Sjungma@eit.uni-kl.de  // - Binds the port of the target socket to the export of the initiator
12812027Sjungma@eit.uni-kl.de  //   socket
12912027Sjungma@eit.uni-kl.de  //
13012027Sjungma@eit.uni-kl.de  virtual void bind(base_target_socket_type& s)
13112027Sjungma@eit.uni-kl.de  {
13212027Sjungma@eit.uni-kl.de    // initiator.port -> target.export
13312027Sjungma@eit.uni-kl.de    (get_base_port())(s.get_base_interface());
13412027Sjungma@eit.uni-kl.de    // target.port -> initiator.export
13512027Sjungma@eit.uni-kl.de    (s.get_base_port())(get_base_interface());
13612027Sjungma@eit.uni-kl.de  }
13712027Sjungma@eit.uni-kl.de
13812027Sjungma@eit.uni-kl.de  void operator() (base_target_socket_type& s)
13912027Sjungma@eit.uni-kl.de  {
14012027Sjungma@eit.uni-kl.de    bind(s);
14112027Sjungma@eit.uni-kl.de  }
14212027Sjungma@eit.uni-kl.de
14312027Sjungma@eit.uni-kl.de  //
14412027Sjungma@eit.uni-kl.de  // Bind initiator socket to initiator socket (hierarchical bind)
14512027Sjungma@eit.uni-kl.de  // - Binds both the export and the port
14612027Sjungma@eit.uni-kl.de  //
14712027Sjungma@eit.uni-kl.de  virtual void bind(base_type& s)
14812027Sjungma@eit.uni-kl.de  {
14912027Sjungma@eit.uni-kl.de    // port
15012027Sjungma@eit.uni-kl.de    (get_base_port())(s.get_base_port());
15112027Sjungma@eit.uni-kl.de    // export
15212027Sjungma@eit.uni-kl.de    (s.get_base_export())(get_base_export());
15312027Sjungma@eit.uni-kl.de  }
15412027Sjungma@eit.uni-kl.de
15512027Sjungma@eit.uni-kl.de  void operator() (base_type& s)
15612027Sjungma@eit.uni-kl.de  {
15712027Sjungma@eit.uni-kl.de    bind(s);
15812027Sjungma@eit.uni-kl.de  }
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.de  //
16112027Sjungma@eit.uni-kl.de  // Bind interface to socket
16212027Sjungma@eit.uni-kl.de  // - Binds the interface to the export of this socket
16312027Sjungma@eit.uni-kl.de  //
16412027Sjungma@eit.uni-kl.de  virtual void bind(bw_interface_type& ifs)
16512027Sjungma@eit.uni-kl.de  {
16612027Sjungma@eit.uni-kl.de    (get_base_export())(ifs);
16712027Sjungma@eit.uni-kl.de  }
16812027Sjungma@eit.uni-kl.de
16912027Sjungma@eit.uni-kl.de  void operator() (bw_interface_type& s)
17012027Sjungma@eit.uni-kl.de  {
17112027Sjungma@eit.uni-kl.de    bind(s);
17212027Sjungma@eit.uni-kl.de  }
17312027Sjungma@eit.uni-kl.de
17412027Sjungma@eit.uni-kl.de  // Implementation of pure virtual functions of base class
17512027Sjungma@eit.uni-kl.de  virtual sc_core::sc_port_b<FW_IF> &       get_base_port()
17612027Sjungma@eit.uni-kl.de    { return *this; }
17712027Sjungma@eit.uni-kl.de  virtual sc_core::sc_port_b<FW_IF> const & get_base_port() const
17812027Sjungma@eit.uni-kl.de    { return *this; }
17912027Sjungma@eit.uni-kl.de
18012027Sjungma@eit.uni-kl.de  virtual                    BW_IF  &       get_base_interface()
18112027Sjungma@eit.uni-kl.de    { return m_export; }
18212027Sjungma@eit.uni-kl.de  virtual                    BW_IF  const & get_base_interface() const
18312027Sjungma@eit.uni-kl.de#if !( defined(IEEE_1666_SYSTEMC) && IEEE_1666_SYSTEMC >= 201101L )
18412027Sjungma@eit.uni-kl.de    { return const_cast<export_type &>(m_export); }
18512027Sjungma@eit.uni-kl.de#else
18612027Sjungma@eit.uni-kl.de    { return m_export; }
18712027Sjungma@eit.uni-kl.de#endif
18812027Sjungma@eit.uni-kl.de
18912027Sjungma@eit.uni-kl.de  virtual sc_core::sc_export<BW_IF> &       get_base_export()
19012027Sjungma@eit.uni-kl.de    { return m_export; }
19112027Sjungma@eit.uni-kl.de  virtual sc_core::sc_export<BW_IF> const & get_base_export() const
19212027Sjungma@eit.uni-kl.de    { return m_export; }
19312027Sjungma@eit.uni-kl.de
19412027Sjungma@eit.uni-kl.deprotected:
19512027Sjungma@eit.uni-kl.de  export_type m_export;
19612027Sjungma@eit.uni-kl.de};
19712027Sjungma@eit.uni-kl.de
19812027Sjungma@eit.uni-kl.de//
19912027Sjungma@eit.uni-kl.de// Convenience socket classes
20012027Sjungma@eit.uni-kl.de//
20112027Sjungma@eit.uni-kl.de
20212027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH = 32,
20312027Sjungma@eit.uni-kl.de          typename TYPES = tlm_base_protocol_types,
20412027Sjungma@eit.uni-kl.de          int N = 1
20512027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
20612027Sjungma@eit.uni-kl.de          ,sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND
20712027Sjungma@eit.uni-kl.de#endif
20812027Sjungma@eit.uni-kl.de          >
20912027Sjungma@eit.uni-kl.declass tlm_initiator_socket :
21012027Sjungma@eit.uni-kl.de  public tlm_base_initiator_socket <BUSWIDTH,
21112027Sjungma@eit.uni-kl.de                               tlm_fw_transport_if<TYPES>,
21212027Sjungma@eit.uni-kl.de                               tlm_bw_transport_if<TYPES>,
21312027Sjungma@eit.uni-kl.de                               N
21412027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
21512027Sjungma@eit.uni-kl.de                               ,POL
21612027Sjungma@eit.uni-kl.de#endif
21712027Sjungma@eit.uni-kl.de                              >
21812027Sjungma@eit.uni-kl.de{
21912027Sjungma@eit.uni-kl.depublic:
22012027Sjungma@eit.uni-kl.de  tlm_initiator_socket() :
22112027Sjungma@eit.uni-kl.de    tlm_base_initiator_socket<BUSWIDTH,
22212027Sjungma@eit.uni-kl.de                         tlm_fw_transport_if<TYPES>,
22312027Sjungma@eit.uni-kl.de                         tlm_bw_transport_if<TYPES>,
22412027Sjungma@eit.uni-kl.de                         N
22512027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
22612027Sjungma@eit.uni-kl.de                         ,POL
22712027Sjungma@eit.uni-kl.de#endif
22812027Sjungma@eit.uni-kl.de                         >()
22912027Sjungma@eit.uni-kl.de  {
23012027Sjungma@eit.uni-kl.de  }
23112027Sjungma@eit.uni-kl.de
23212027Sjungma@eit.uni-kl.de  explicit tlm_initiator_socket(const char* name) :
23312027Sjungma@eit.uni-kl.de    tlm_base_initiator_socket<BUSWIDTH,
23412027Sjungma@eit.uni-kl.de                         tlm_fw_transport_if<TYPES>,
23512027Sjungma@eit.uni-kl.de                         tlm_bw_transport_if<TYPES>,
23612027Sjungma@eit.uni-kl.de                         N
23712027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
23812027Sjungma@eit.uni-kl.de                         ,POL
23912027Sjungma@eit.uni-kl.de#endif
24012027Sjungma@eit.uni-kl.de                         >(name)
24112027Sjungma@eit.uni-kl.de  {
24212027Sjungma@eit.uni-kl.de  }
24312027Sjungma@eit.uni-kl.de
24412027Sjungma@eit.uni-kl.de  virtual const char* kind() const
24512027Sjungma@eit.uni-kl.de  {
24612027Sjungma@eit.uni-kl.de    return "tlm_initiator_socket";
24712027Sjungma@eit.uni-kl.de  }
24812027Sjungma@eit.uni-kl.de};
24912027Sjungma@eit.uni-kl.de
25012027Sjungma@eit.uni-kl.de} // namespace tlm
25112027Sjungma@eit.uni-kl.de
25212027Sjungma@eit.uni-kl.de#endif
253