simple_initiator_socket.h revision 12027
110515SN/A/*****************************************************************************
210515SN/A
311680SCurtis.Dunham@arm.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
411680SCurtis.Dunham@arm.com  more contributor license agreements.  See the NOTICE file distributed
511680SCurtis.Dunham@arm.com  with this work for additional information regarding copyright ownership.
610515SN/A  Accellera licenses this file to you under the Apache License, Version 2.0
711680SCurtis.Dunham@arm.com  (the "License"); you may not use this file except in compliance with the
811680SCurtis.Dunham@arm.com  License.  You may obtain a copy of the License at
911680SCurtis.Dunham@arm.com
1011680SCurtis.Dunham@arm.com    http://www.apache.org/licenses/LICENSE-2.0
1111680SCurtis.Dunham@arm.com
1211680SCurtis.Dunham@arm.com  Unless required by applicable law or agreed to in writing, software
1311680SCurtis.Dunham@arm.com  distributed under the License is distributed on an "AS IS" BASIS,
1410515SN/A  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1510515SN/A  implied.  See the License for the specific language governing
1611680SCurtis.Dunham@arm.com  permissions and limitations under the License.
1711680SCurtis.Dunham@arm.com
1811680SCurtis.Dunham@arm.com *****************************************************************************/
1911680SCurtis.Dunham@arm.com
2011680SCurtis.Dunham@arm.com#ifndef __SIMPLE_INITIATOR_SOCKET_H__
2111680SCurtis.Dunham@arm.com#define __SIMPLE_INITIATOR_SOCKET_H__
2211680SCurtis.Dunham@arm.com
2311680SCurtis.Dunham@arm.com#include <tlm>
2411680SCurtis.Dunham@arm.com#include <sstream>
2511680SCurtis.Dunham@arm.com
2610585SN/Anamespace tlm_utils {
2711680SCurtis.Dunham@arm.com
2811680SCurtis.Dunham@arm.comtemplate <typename MODULE,
2911680SCurtis.Dunham@arm.com          unsigned int BUSWIDTH = 32,
3011680SCurtis.Dunham@arm.com          typename TYPES = tlm::tlm_base_protocol_types>
3111680SCurtis.Dunham@arm.comclass simple_initiator_socket :
3211680SCurtis.Dunham@arm.com  public tlm::tlm_initiator_socket<BUSWIDTH, TYPES>
3311680SCurtis.Dunham@arm.com{
3411680SCurtis.Dunham@arm.compublic:
3510585SN/A  typedef typename TYPES::tlm_payload_type              transaction_type;
3611680SCurtis.Dunham@arm.com  typedef typename TYPES::tlm_phase_type                phase_type;
3711680SCurtis.Dunham@arm.com  typedef tlm::tlm_sync_enum                            sync_enum_type;
3811680SCurtis.Dunham@arm.com  typedef tlm::tlm_fw_transport_if<TYPES>               fw_interface_type;
3911680SCurtis.Dunham@arm.com  typedef tlm::tlm_bw_transport_if<TYPES>               bw_interface_type;
4011680SCurtis.Dunham@arm.com  typedef tlm::tlm_initiator_socket<BUSWIDTH, TYPES>    base_type;
4111680SCurtis.Dunham@arm.com
4211680SCurtis.Dunham@arm.compublic:
4311680SCurtis.Dunham@arm.com  simple_initiator_socket() :
4411680SCurtis.Dunham@arm.com    base_type(sc_core::sc_gen_unique_name("simple_initiator_socket")),
4511680SCurtis.Dunham@arm.com    m_process(this->name())
4611606Sandreas.sandberg@arm.com  {
4711680SCurtis.Dunham@arm.com    this->m_export.bind(m_process);
4811680SCurtis.Dunham@arm.com  }
4911680SCurtis.Dunham@arm.com
5011680SCurtis.Dunham@arm.com  explicit simple_initiator_socket(const char* n) :
5111680SCurtis.Dunham@arm.com    base_type(n),
5211680SCurtis.Dunham@arm.com    m_process(this->name())
5311680SCurtis.Dunham@arm.com  {
5411680SCurtis.Dunham@arm.com    this->m_export.bind(m_process);
5511680SCurtis.Dunham@arm.com  }
5611680SCurtis.Dunham@arm.com
5711680SCurtis.Dunham@arm.com  void register_nb_transport_bw(MODULE* mod,
5811680SCurtis.Dunham@arm.com                                sync_enum_type (MODULE::*cb)(transaction_type&,
5911680SCurtis.Dunham@arm.com                                                             phase_type&,
6011680SCurtis.Dunham@arm.com                                                             sc_core::sc_time&))
6111680SCurtis.Dunham@arm.com  {
6211680SCurtis.Dunham@arm.com    m_process.set_transport_ptr(mod, cb);
6311680SCurtis.Dunham@arm.com  }
6411680SCurtis.Dunham@arm.com
6511680SCurtis.Dunham@arm.com  void register_invalidate_direct_mem_ptr(MODULE* mod,
6611336Sandreas.hansson@arm.com                                          void (MODULE::*cb)(sc_dt::uint64, sc_dt::uint64))
6711680SCurtis.Dunham@arm.com  {
6811680SCurtis.Dunham@arm.com    m_process.set_invalidate_direct_mem_ptr(mod, cb);
6911680SCurtis.Dunham@arm.com  }
7011680SCurtis.Dunham@arm.com
7111680SCurtis.Dunham@arm.comprivate:
7211680SCurtis.Dunham@arm.com  class process : public tlm::tlm_bw_transport_if<TYPES>
7311680SCurtis.Dunham@arm.com  {
7411680SCurtis.Dunham@arm.com  public:
7511680SCurtis.Dunham@arm.com    typedef sync_enum_type (MODULE::*TransportPtr)(transaction_type&,
7611680SCurtis.Dunham@arm.com                                                   phase_type&,
7711680SCurtis.Dunham@arm.com                                                   sc_core::sc_time&);
7811680SCurtis.Dunham@arm.com    typedef void (MODULE::*InvalidateDirectMemPtr)(sc_dt::uint64,
7911680SCurtis.Dunham@arm.com                                                   sc_dt::uint64);
8011680SCurtis.Dunham@arm.com
8111680SCurtis.Dunham@arm.com    process(const std::string& name) :
8211680SCurtis.Dunham@arm.com      m_name(name),
8311680SCurtis.Dunham@arm.com      m_mod(0),
8411680SCurtis.Dunham@arm.com      m_transport_ptr(0),
8511680SCurtis.Dunham@arm.com      m_invalidate_direct_mem_ptr(0)
8611680SCurtis.Dunham@arm.com    {
8711680SCurtis.Dunham@arm.com    }
8811680SCurtis.Dunham@arm.com
8911680SCurtis.Dunham@arm.com    void set_transport_ptr(MODULE* mod, TransportPtr p)
9011680SCurtis.Dunham@arm.com    {
9111680SCurtis.Dunham@arm.com      if (m_transport_ptr) {
9211680SCurtis.Dunham@arm.com        std::stringstream s;
9311680SCurtis.Dunham@arm.com        s << m_name << ": non-blocking callback allready registered";
9411680SCurtis.Dunham@arm.com        SC_REPORT_WARNING("/OSCI_TLM-2/simple_socket",s.str().c_str());
9511680SCurtis.Dunham@arm.com      } else {
9611680SCurtis.Dunham@arm.com        assert(!m_mod || m_mod == mod);
9711680SCurtis.Dunham@arm.com        m_mod = mod;
9811680SCurtis.Dunham@arm.com        m_transport_ptr = p;
9910515SN/A      }
10011680SCurtis.Dunham@arm.com    }
10111680SCurtis.Dunham@arm.com
10210515SN/A    void set_invalidate_direct_mem_ptr(MODULE* mod, InvalidateDirectMemPtr p)
10310515SN/A    {
10410515SN/A      if (m_invalidate_direct_mem_ptr) {
10510515SN/A        std::stringstream s;
10610515SN/A        s << m_name << ": invalidate DMI callback allready registered";
10710515SN/A        SC_REPORT_WARNING("/OSCI_TLM-2/simple_socket",s.str().c_str());
10811680SCurtis.Dunham@arm.com      } else {
10910515SN/A        assert(!m_mod || m_mod == mod);
11010515SN/A        m_mod = mod;
11110515SN/A        m_invalidate_direct_mem_ptr = p;
11210515SN/A      }
11310515SN/A    }
11410515SN/A
11511680SCurtis.Dunham@arm.com    sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
11611680SCurtis.Dunham@arm.com    {
11711680SCurtis.Dunham@arm.com      if (m_transport_ptr) {
11811680SCurtis.Dunham@arm.com        // forward call
11911680SCurtis.Dunham@arm.com        assert(m_mod);
12011680SCurtis.Dunham@arm.com        return (m_mod->*m_transport_ptr)(trans, phase, t);
12111680SCurtis.Dunham@arm.com
12211680SCurtis.Dunham@arm.com      } else {
12311680SCurtis.Dunham@arm.com        std::stringstream s;
12411680SCurtis.Dunham@arm.com        s << m_name << ": no transport callback registered";
12511680SCurtis.Dunham@arm.com        SC_REPORT_ERROR("/OSCI_TLM-2/simple_socket",s.str().c_str());
12611680SCurtis.Dunham@arm.com      }
12711680SCurtis.Dunham@arm.com      return tlm::TLM_ACCEPTED;   ///< unreachable code
12811680SCurtis.Dunham@arm.com    }
12911680SCurtis.Dunham@arm.com
13011680SCurtis.Dunham@arm.com    void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
13111680SCurtis.Dunham@arm.com                                   sc_dt::uint64 end_range)
13211680SCurtis.Dunham@arm.com    {
13311680SCurtis.Dunham@arm.com      if (m_invalidate_direct_mem_ptr) {
13411680SCurtis.Dunham@arm.com        // forward call
13511680SCurtis.Dunham@arm.com        assert(m_mod);
13611680SCurtis.Dunham@arm.com        (m_mod->*m_invalidate_direct_mem_ptr)(start_range, end_range);
13710515SN/A      }
13810515SN/A    }
13910515SN/A
14010515SN/A  private:
14110515SN/A    const std::string m_name;
14210515SN/A    MODULE* m_mod;
14310515SN/A    TransportPtr m_transport_ptr;
14410515SN/A    InvalidateDirectMemPtr m_invalidate_direct_mem_ptr;
14510515SN/A  };
14610515SN/A
14710515SN/Aprivate:
14810515SN/A  process m_process;
14910515SN/A};
15010515SN/A
15110515SN/A// Tagged version
15210515SN/A
15310515SN/Atemplate <typename MODULE,
15410515SN/A          unsigned int BUSWIDTH = 32,
15510515SN/A          typename TYPES = tlm::tlm_base_protocol_types>
15610515SN/Aclass simple_initiator_socket_tagged :
15710515SN/A  public tlm::tlm_initiator_socket<BUSWIDTH, TYPES>
15810515SN/A{
15910515SN/Apublic:
16010515SN/A  typedef typename TYPES::tlm_payload_type              transaction_type;
16110515SN/A  typedef typename TYPES::tlm_phase_type                phase_type;
16210515SN/A  typedef tlm::tlm_sync_enum                            sync_enum_type;
16311680SCurtis.Dunham@arm.com  typedef tlm::tlm_fw_transport_if<TYPES>               fw_interface_type;
16411680SCurtis.Dunham@arm.com  typedef tlm::tlm_bw_transport_if<TYPES>               bw_interface_type;
16511680SCurtis.Dunham@arm.com  typedef tlm::tlm_initiator_socket<BUSWIDTH, TYPES>    base_type;
16611680SCurtis.Dunham@arm.com
16711680SCurtis.Dunham@arm.compublic:
16811680SCurtis.Dunham@arm.com  simple_initiator_socket_tagged() :
16911680SCurtis.Dunham@arm.com    base_type(sc_core::sc_gen_unique_name("simple_initiator_socket_tagged")),
17011680SCurtis.Dunham@arm.com    m_process(this->name())
17111680SCurtis.Dunham@arm.com  {
17211680SCurtis.Dunham@arm.com    this->m_export.bind(m_process);
17311680SCurtis.Dunham@arm.com  }
17411680SCurtis.Dunham@arm.com
17511680SCurtis.Dunham@arm.com  explicit simple_initiator_socket_tagged(const char* n) :
17611680SCurtis.Dunham@arm.com    base_type(n),
17711680SCurtis.Dunham@arm.com    m_process(this->name())
17811680SCurtis.Dunham@arm.com  {
17911680SCurtis.Dunham@arm.com    this->m_export.bind(m_process);
18011680SCurtis.Dunham@arm.com  }
18111680SCurtis.Dunham@arm.com
18211680SCurtis.Dunham@arm.com  void register_nb_transport_bw(MODULE* mod,
18311680SCurtis.Dunham@arm.com                                sync_enum_type (MODULE::*cb)(int,
18411680SCurtis.Dunham@arm.com                                                             transaction_type&,
18511680SCurtis.Dunham@arm.com                                                             phase_type&,
18611680SCurtis.Dunham@arm.com                                                             sc_core::sc_time&),
18711680SCurtis.Dunham@arm.com                                int id)
18811680SCurtis.Dunham@arm.com  {
18911680SCurtis.Dunham@arm.com    m_process.set_transport_ptr(mod, cb);
19011680SCurtis.Dunham@arm.com    m_process.set_transport_user_id(id);
19111680SCurtis.Dunham@arm.com  }
19211680SCurtis.Dunham@arm.com
19311680SCurtis.Dunham@arm.com  void register_invalidate_direct_mem_ptr(MODULE* mod,
19411680SCurtis.Dunham@arm.com                                          void (MODULE::*cb)(int, sc_dt::uint64, sc_dt::uint64),
19511680SCurtis.Dunham@arm.com                                           int id)
19611680SCurtis.Dunham@arm.com  {
19711680SCurtis.Dunham@arm.com    m_process.set_invalidate_direct_mem_ptr(mod, cb);
19811680SCurtis.Dunham@arm.com    m_process.set_invalidate_dmi_user_id(id);
19911680SCurtis.Dunham@arm.com  }
20011680SCurtis.Dunham@arm.com
20111680SCurtis.Dunham@arm.comprivate:
20211680SCurtis.Dunham@arm.com  class process : public tlm::tlm_bw_transport_if<TYPES>
20311680SCurtis.Dunham@arm.com  {
20411680SCurtis.Dunham@arm.com  public:
20511680SCurtis.Dunham@arm.com    typedef sync_enum_type (MODULE::*TransportPtr)(int,
20611680SCurtis.Dunham@arm.com                                                   transaction_type&,
20711680SCurtis.Dunham@arm.com                                                   phase_type&,
20811680SCurtis.Dunham@arm.com                                                   sc_core::sc_time&);
20911680SCurtis.Dunham@arm.com    typedef void (MODULE::*InvalidateDirectMemPtr)(int,
21011680SCurtis.Dunham@arm.com                                                   sc_dt::uint64,
21111680SCurtis.Dunham@arm.com                                                   sc_dt::uint64);
21211680SCurtis.Dunham@arm.com
21311680SCurtis.Dunham@arm.com    process(const std::string& name) :
21411680SCurtis.Dunham@arm.com      m_name(name),
21511680SCurtis.Dunham@arm.com      m_mod(0),
21611680SCurtis.Dunham@arm.com      m_transport_ptr(0),
21711680SCurtis.Dunham@arm.com      m_invalidate_direct_mem_ptr(0),
21811680SCurtis.Dunham@arm.com      m_transport_user_id(0),
21911680SCurtis.Dunham@arm.com      m_invalidate_direct_mem_user_id(0)
22011680SCurtis.Dunham@arm.com    {
22111680SCurtis.Dunham@arm.com    }
22211680SCurtis.Dunham@arm.com
22311680SCurtis.Dunham@arm.com    void set_transport_user_id(int id) { m_transport_user_id = id; }
22411680SCurtis.Dunham@arm.com    void set_invalidate_dmi_user_id(int id) { m_invalidate_direct_mem_user_id = id; }
22511680SCurtis.Dunham@arm.com
22611680SCurtis.Dunham@arm.com    void set_transport_ptr(MODULE* mod, TransportPtr p)
22711680SCurtis.Dunham@arm.com    {
22811680SCurtis.Dunham@arm.com      if (m_transport_ptr) {
22911680SCurtis.Dunham@arm.com        std::stringstream s;
23011570SCurtis.Dunham@arm.com        s << m_name << ": non-blocking callback allready registered";
23111353Sandreas.hansson@arm.com        SC_REPORT_WARNING("/OSCI_TLM-2/simple_socket",s.str().c_str());
23211353Sandreas.hansson@arm.com      } else {
23311680SCurtis.Dunham@arm.com        assert(!m_mod || m_mod == mod);
23411680SCurtis.Dunham@arm.com        m_mod = mod;
23511680SCurtis.Dunham@arm.com        m_transport_ptr = p;
23611680SCurtis.Dunham@arm.com      }
23711680SCurtis.Dunham@arm.com    }
23811680SCurtis.Dunham@arm.com
23911680SCurtis.Dunham@arm.com    void set_invalidate_direct_mem_ptr(MODULE* mod, InvalidateDirectMemPtr p)
24011680SCurtis.Dunham@arm.com    {
24111680SCurtis.Dunham@arm.com      if (m_invalidate_direct_mem_ptr) {
24211680SCurtis.Dunham@arm.com        std::stringstream s;
24311680SCurtis.Dunham@arm.com        s << m_name << ": invalidate DMI callback allready registered";
24411680SCurtis.Dunham@arm.com        SC_REPORT_WARNING("/OSCI_TLM-2/simple_socket",s.str().c_str());
24511680SCurtis.Dunham@arm.com      } else {
24611680SCurtis.Dunham@arm.com        assert(!m_mod || m_mod == mod);
24711680SCurtis.Dunham@arm.com        m_mod = mod;
24811680SCurtis.Dunham@arm.com        m_invalidate_direct_mem_ptr = p;
24911680SCurtis.Dunham@arm.com      }
25011680SCurtis.Dunham@arm.com    }
25111680SCurtis.Dunham@arm.com
25211680SCurtis.Dunham@arm.com    sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
25311680SCurtis.Dunham@arm.com    {
25411680SCurtis.Dunham@arm.com      if (m_transport_ptr) {
25511680SCurtis.Dunham@arm.com        // forward call
25611680SCurtis.Dunham@arm.com        assert(m_mod);
25711680SCurtis.Dunham@arm.com        return (m_mod->*m_transport_ptr)(m_transport_user_id, trans, phase, t);
25811680SCurtis.Dunham@arm.com
25911680SCurtis.Dunham@arm.com      } else {
26011680SCurtis.Dunham@arm.com        std::stringstream s;
26111680SCurtis.Dunham@arm.com        s << m_name << ": no transport callback registered";
26211680SCurtis.Dunham@arm.com        SC_REPORT_ERROR("/OSCI_TLM-2/simple_socket",s.str().c_str());
26311680SCurtis.Dunham@arm.com      }
26411680SCurtis.Dunham@arm.com      return tlm::TLM_ACCEPTED;   ///< unreachable code
26511680SCurtis.Dunham@arm.com    }
26611680SCurtis.Dunham@arm.com
26711680SCurtis.Dunham@arm.com    void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
26811680SCurtis.Dunham@arm.com                                   sc_dt::uint64 end_range)
26911680SCurtis.Dunham@arm.com    {
27011680SCurtis.Dunham@arm.com      if (m_invalidate_direct_mem_ptr) {
27111680SCurtis.Dunham@arm.com        // forward call
27211680SCurtis.Dunham@arm.com        assert(m_mod);
27311680SCurtis.Dunham@arm.com        (m_mod->*m_invalidate_direct_mem_ptr)(m_invalidate_direct_mem_user_id, start_range, end_range);
27411680SCurtis.Dunham@arm.com      }
27511680SCurtis.Dunham@arm.com    }
27611680SCurtis.Dunham@arm.com
27711680SCurtis.Dunham@arm.com  private:
27811680SCurtis.Dunham@arm.com    const std::string m_name;
27911680SCurtis.Dunham@arm.com    MODULE* m_mod;
28011680SCurtis.Dunham@arm.com    TransportPtr m_transport_ptr;
28111680SCurtis.Dunham@arm.com    InvalidateDirectMemPtr m_invalidate_direct_mem_ptr;
28211680SCurtis.Dunham@arm.com    int m_transport_user_id;
28311680SCurtis.Dunham@arm.com    int m_invalidate_direct_mem_user_id;
28411680SCurtis.Dunham@arm.com  };
28510515SN/A
28611680SCurtis.Dunham@arm.comprivate:
28711680SCurtis.Dunham@arm.com  process m_process;
28811680SCurtis.Dunham@arm.com};
28911680SCurtis.Dunham@arm.com
29011680SCurtis.Dunham@arm.com}
29110515SN/A
29210892Sandreas.hansson@arm.com#endif
29310515SN/A