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 __SIMPLE_INITIATOR_SOCKET_H__
2112027Sjungma@eit.uni-kl.de#define __SIMPLE_INITIATOR_SOCKET_H__
2212027Sjungma@eit.uni-kl.de
2312027Sjungma@eit.uni-kl.de#include <tlm>
2412027Sjungma@eit.uni-kl.de#include <sstream>
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.denamespace tlm_utils {
2712027Sjungma@eit.uni-kl.de
2812027Sjungma@eit.uni-kl.detemplate <typename MODULE,
2912027Sjungma@eit.uni-kl.de          unsigned int BUSWIDTH = 32,
3012027Sjungma@eit.uni-kl.de          typename TYPES = tlm::tlm_base_protocol_types>
3112027Sjungma@eit.uni-kl.declass simple_initiator_socket :
3212027Sjungma@eit.uni-kl.de  public tlm::tlm_initiator_socket<BUSWIDTH, TYPES>
3312027Sjungma@eit.uni-kl.de{
3412027Sjungma@eit.uni-kl.depublic:
3512027Sjungma@eit.uni-kl.de  typedef typename TYPES::tlm_payload_type              transaction_type;
3612027Sjungma@eit.uni-kl.de  typedef typename TYPES::tlm_phase_type                phase_type;
3712027Sjungma@eit.uni-kl.de  typedef tlm::tlm_sync_enum                            sync_enum_type;
3812027Sjungma@eit.uni-kl.de  typedef tlm::tlm_fw_transport_if<TYPES>               fw_interface_type;
3912027Sjungma@eit.uni-kl.de  typedef tlm::tlm_bw_transport_if<TYPES>               bw_interface_type;
4012027Sjungma@eit.uni-kl.de  typedef tlm::tlm_initiator_socket<BUSWIDTH, TYPES>    base_type;
4112027Sjungma@eit.uni-kl.de
4212027Sjungma@eit.uni-kl.depublic:
4312027Sjungma@eit.uni-kl.de  simple_initiator_socket() :
4412027Sjungma@eit.uni-kl.de    base_type(sc_core::sc_gen_unique_name("simple_initiator_socket")),
4512027Sjungma@eit.uni-kl.de    m_process(this->name())
4612027Sjungma@eit.uni-kl.de  {
4712027Sjungma@eit.uni-kl.de    this->m_export.bind(m_process);
4812027Sjungma@eit.uni-kl.de  }
4912027Sjungma@eit.uni-kl.de
5012027Sjungma@eit.uni-kl.de  explicit simple_initiator_socket(const char* n) :
5112027Sjungma@eit.uni-kl.de    base_type(n),
5212027Sjungma@eit.uni-kl.de    m_process(this->name())
5312027Sjungma@eit.uni-kl.de  {
5412027Sjungma@eit.uni-kl.de    this->m_export.bind(m_process);
5512027Sjungma@eit.uni-kl.de  }
5612027Sjungma@eit.uni-kl.de
5712027Sjungma@eit.uni-kl.de  void register_nb_transport_bw(MODULE* mod,
5812027Sjungma@eit.uni-kl.de                                sync_enum_type (MODULE::*cb)(transaction_type&,
5912027Sjungma@eit.uni-kl.de                                                             phase_type&,
6012027Sjungma@eit.uni-kl.de                                                             sc_core::sc_time&))
6112027Sjungma@eit.uni-kl.de  {
6212027Sjungma@eit.uni-kl.de    m_process.set_transport_ptr(mod, cb);
6312027Sjungma@eit.uni-kl.de  }
6412027Sjungma@eit.uni-kl.de
6512027Sjungma@eit.uni-kl.de  void register_invalidate_direct_mem_ptr(MODULE* mod,
6612027Sjungma@eit.uni-kl.de                                          void (MODULE::*cb)(sc_dt::uint64, sc_dt::uint64))
6712027Sjungma@eit.uni-kl.de  {
6812027Sjungma@eit.uni-kl.de    m_process.set_invalidate_direct_mem_ptr(mod, cb);
6912027Sjungma@eit.uni-kl.de  }
7012027Sjungma@eit.uni-kl.de
7112027Sjungma@eit.uni-kl.deprivate:
7212027Sjungma@eit.uni-kl.de  class process : public tlm::tlm_bw_transport_if<TYPES>
7312027Sjungma@eit.uni-kl.de  {
7412027Sjungma@eit.uni-kl.de  public:
7512027Sjungma@eit.uni-kl.de    typedef sync_enum_type (MODULE::*TransportPtr)(transaction_type&,
7612027Sjungma@eit.uni-kl.de                                                   phase_type&,
7712027Sjungma@eit.uni-kl.de                                                   sc_core::sc_time&);
7812027Sjungma@eit.uni-kl.de    typedef void (MODULE::*InvalidateDirectMemPtr)(sc_dt::uint64,
7912027Sjungma@eit.uni-kl.de                                                   sc_dt::uint64);
8012027Sjungma@eit.uni-kl.de
8112027Sjungma@eit.uni-kl.de    process(const std::string& name) :
8212027Sjungma@eit.uni-kl.de      m_name(name),
8312027Sjungma@eit.uni-kl.de      m_mod(0),
8412027Sjungma@eit.uni-kl.de      m_transport_ptr(0),
8512027Sjungma@eit.uni-kl.de      m_invalidate_direct_mem_ptr(0)
8612027Sjungma@eit.uni-kl.de    {
8712027Sjungma@eit.uni-kl.de    }
8812027Sjungma@eit.uni-kl.de
8912027Sjungma@eit.uni-kl.de    void set_transport_ptr(MODULE* mod, TransportPtr p)
9012027Sjungma@eit.uni-kl.de    {
9112027Sjungma@eit.uni-kl.de      if (m_transport_ptr) {
9212027Sjungma@eit.uni-kl.de        std::stringstream s;
9312027Sjungma@eit.uni-kl.de        s << m_name << ": non-blocking callback allready registered";
9412027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/simple_socket",s.str().c_str());
9512027Sjungma@eit.uni-kl.de      } else {
9612027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
9712027Sjungma@eit.uni-kl.de        m_mod = mod;
9812027Sjungma@eit.uni-kl.de        m_transport_ptr = p;
9912027Sjungma@eit.uni-kl.de      }
10012027Sjungma@eit.uni-kl.de    }
10112027Sjungma@eit.uni-kl.de
10212027Sjungma@eit.uni-kl.de    void set_invalidate_direct_mem_ptr(MODULE* mod, InvalidateDirectMemPtr p)
10312027Sjungma@eit.uni-kl.de    {
10412027Sjungma@eit.uni-kl.de      if (m_invalidate_direct_mem_ptr) {
10512027Sjungma@eit.uni-kl.de        std::stringstream s;
10612027Sjungma@eit.uni-kl.de        s << m_name << ": invalidate DMI callback allready registered";
10712027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/simple_socket",s.str().c_str());
10812027Sjungma@eit.uni-kl.de      } else {
10912027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
11012027Sjungma@eit.uni-kl.de        m_mod = mod;
11112027Sjungma@eit.uni-kl.de        m_invalidate_direct_mem_ptr = p;
11212027Sjungma@eit.uni-kl.de      }
11312027Sjungma@eit.uni-kl.de    }
11412027Sjungma@eit.uni-kl.de
11512027Sjungma@eit.uni-kl.de    sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
11612027Sjungma@eit.uni-kl.de    {
11712027Sjungma@eit.uni-kl.de      if (m_transport_ptr) {
11812027Sjungma@eit.uni-kl.de        // forward call
11912027Sjungma@eit.uni-kl.de        assert(m_mod);
12012027Sjungma@eit.uni-kl.de        return (m_mod->*m_transport_ptr)(trans, phase, t);
12112027Sjungma@eit.uni-kl.de
12212027Sjungma@eit.uni-kl.de      } else {
12312027Sjungma@eit.uni-kl.de        std::stringstream s;
12412027Sjungma@eit.uni-kl.de        s << m_name << ": no transport callback registered";
12512027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR("/OSCI_TLM-2/simple_socket",s.str().c_str());
12612027Sjungma@eit.uni-kl.de      }
12712027Sjungma@eit.uni-kl.de      return tlm::TLM_ACCEPTED;   ///< unreachable code
12812027Sjungma@eit.uni-kl.de    }
12912027Sjungma@eit.uni-kl.de
13012027Sjungma@eit.uni-kl.de    void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
13112027Sjungma@eit.uni-kl.de                                   sc_dt::uint64 end_range)
13212027Sjungma@eit.uni-kl.de    {
13312027Sjungma@eit.uni-kl.de      if (m_invalidate_direct_mem_ptr) {
13412027Sjungma@eit.uni-kl.de        // forward call
13512027Sjungma@eit.uni-kl.de        assert(m_mod);
13612027Sjungma@eit.uni-kl.de        (m_mod->*m_invalidate_direct_mem_ptr)(start_range, end_range);
13712027Sjungma@eit.uni-kl.de      }
13812027Sjungma@eit.uni-kl.de    }
13912027Sjungma@eit.uni-kl.de
14012027Sjungma@eit.uni-kl.de  private:
14112027Sjungma@eit.uni-kl.de    const std::string m_name;
14212027Sjungma@eit.uni-kl.de    MODULE* m_mod;
14312027Sjungma@eit.uni-kl.de    TransportPtr m_transport_ptr;
14412027Sjungma@eit.uni-kl.de    InvalidateDirectMemPtr m_invalidate_direct_mem_ptr;
14512027Sjungma@eit.uni-kl.de  };
14612027Sjungma@eit.uni-kl.de
14712027Sjungma@eit.uni-kl.deprivate:
14812027Sjungma@eit.uni-kl.de  process m_process;
14912027Sjungma@eit.uni-kl.de};
15012027Sjungma@eit.uni-kl.de
15112027Sjungma@eit.uni-kl.de// Tagged version
15212027Sjungma@eit.uni-kl.de
15312027Sjungma@eit.uni-kl.detemplate <typename MODULE,
15412027Sjungma@eit.uni-kl.de          unsigned int BUSWIDTH = 32,
15512027Sjungma@eit.uni-kl.de          typename TYPES = tlm::tlm_base_protocol_types>
15612027Sjungma@eit.uni-kl.declass simple_initiator_socket_tagged :
15712027Sjungma@eit.uni-kl.de  public tlm::tlm_initiator_socket<BUSWIDTH, TYPES>
15812027Sjungma@eit.uni-kl.de{
15912027Sjungma@eit.uni-kl.depublic:
16012027Sjungma@eit.uni-kl.de  typedef typename TYPES::tlm_payload_type              transaction_type;
16112027Sjungma@eit.uni-kl.de  typedef typename TYPES::tlm_phase_type                phase_type;
16212027Sjungma@eit.uni-kl.de  typedef tlm::tlm_sync_enum                            sync_enum_type;
16312027Sjungma@eit.uni-kl.de  typedef tlm::tlm_fw_transport_if<TYPES>               fw_interface_type;
16412027Sjungma@eit.uni-kl.de  typedef tlm::tlm_bw_transport_if<TYPES>               bw_interface_type;
16512027Sjungma@eit.uni-kl.de  typedef tlm::tlm_initiator_socket<BUSWIDTH, TYPES>    base_type;
16612027Sjungma@eit.uni-kl.de
16712027Sjungma@eit.uni-kl.depublic:
16812027Sjungma@eit.uni-kl.de  simple_initiator_socket_tagged() :
16912027Sjungma@eit.uni-kl.de    base_type(sc_core::sc_gen_unique_name("simple_initiator_socket_tagged")),
17012027Sjungma@eit.uni-kl.de    m_process(this->name())
17112027Sjungma@eit.uni-kl.de  {
17212027Sjungma@eit.uni-kl.de    this->m_export.bind(m_process);
17312027Sjungma@eit.uni-kl.de  }
17412027Sjungma@eit.uni-kl.de
17512027Sjungma@eit.uni-kl.de  explicit simple_initiator_socket_tagged(const char* n) :
17612027Sjungma@eit.uni-kl.de    base_type(n),
17712027Sjungma@eit.uni-kl.de    m_process(this->name())
17812027Sjungma@eit.uni-kl.de  {
17912027Sjungma@eit.uni-kl.de    this->m_export.bind(m_process);
18012027Sjungma@eit.uni-kl.de  }
18112027Sjungma@eit.uni-kl.de
18212027Sjungma@eit.uni-kl.de  void register_nb_transport_bw(MODULE* mod,
18312027Sjungma@eit.uni-kl.de                                sync_enum_type (MODULE::*cb)(int,
18412027Sjungma@eit.uni-kl.de                                                             transaction_type&,
18512027Sjungma@eit.uni-kl.de                                                             phase_type&,
18612027Sjungma@eit.uni-kl.de                                                             sc_core::sc_time&),
18712027Sjungma@eit.uni-kl.de                                int id)
18812027Sjungma@eit.uni-kl.de  {
18912027Sjungma@eit.uni-kl.de    m_process.set_transport_ptr(mod, cb);
19012027Sjungma@eit.uni-kl.de    m_process.set_transport_user_id(id);
19112027Sjungma@eit.uni-kl.de  }
19212027Sjungma@eit.uni-kl.de
19312027Sjungma@eit.uni-kl.de  void register_invalidate_direct_mem_ptr(MODULE* mod,
19412027Sjungma@eit.uni-kl.de                                          void (MODULE::*cb)(int, sc_dt::uint64, sc_dt::uint64),
19512027Sjungma@eit.uni-kl.de                                           int id)
19612027Sjungma@eit.uni-kl.de  {
19712027Sjungma@eit.uni-kl.de    m_process.set_invalidate_direct_mem_ptr(mod, cb);
19812027Sjungma@eit.uni-kl.de    m_process.set_invalidate_dmi_user_id(id);
19912027Sjungma@eit.uni-kl.de  }
20012027Sjungma@eit.uni-kl.de
20112027Sjungma@eit.uni-kl.deprivate:
20212027Sjungma@eit.uni-kl.de  class process : public tlm::tlm_bw_transport_if<TYPES>
20312027Sjungma@eit.uni-kl.de  {
20412027Sjungma@eit.uni-kl.de  public:
20512027Sjungma@eit.uni-kl.de    typedef sync_enum_type (MODULE::*TransportPtr)(int,
20612027Sjungma@eit.uni-kl.de                                                   transaction_type&,
20712027Sjungma@eit.uni-kl.de                                                   phase_type&,
20812027Sjungma@eit.uni-kl.de                                                   sc_core::sc_time&);
20912027Sjungma@eit.uni-kl.de    typedef void (MODULE::*InvalidateDirectMemPtr)(int,
21012027Sjungma@eit.uni-kl.de                                                   sc_dt::uint64,
21112027Sjungma@eit.uni-kl.de                                                   sc_dt::uint64);
21212027Sjungma@eit.uni-kl.de
21312027Sjungma@eit.uni-kl.de    process(const std::string& name) :
21412027Sjungma@eit.uni-kl.de      m_name(name),
21512027Sjungma@eit.uni-kl.de      m_mod(0),
21612027Sjungma@eit.uni-kl.de      m_transport_ptr(0),
21712027Sjungma@eit.uni-kl.de      m_invalidate_direct_mem_ptr(0),
21812027Sjungma@eit.uni-kl.de      m_transport_user_id(0),
21912027Sjungma@eit.uni-kl.de      m_invalidate_direct_mem_user_id(0)
22012027Sjungma@eit.uni-kl.de    {
22112027Sjungma@eit.uni-kl.de    }
22212027Sjungma@eit.uni-kl.de
22312027Sjungma@eit.uni-kl.de    void set_transport_user_id(int id) { m_transport_user_id = id; }
22412027Sjungma@eit.uni-kl.de    void set_invalidate_dmi_user_id(int id) { m_invalidate_direct_mem_user_id = id; }
22512027Sjungma@eit.uni-kl.de
22612027Sjungma@eit.uni-kl.de    void set_transport_ptr(MODULE* mod, TransportPtr p)
22712027Sjungma@eit.uni-kl.de    {
22812027Sjungma@eit.uni-kl.de      if (m_transport_ptr) {
22912027Sjungma@eit.uni-kl.de        std::stringstream s;
23012027Sjungma@eit.uni-kl.de        s << m_name << ": non-blocking callback allready registered";
23112027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/simple_socket",s.str().c_str());
23212027Sjungma@eit.uni-kl.de      } else {
23312027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
23412027Sjungma@eit.uni-kl.de        m_mod = mod;
23512027Sjungma@eit.uni-kl.de        m_transport_ptr = p;
23612027Sjungma@eit.uni-kl.de      }
23712027Sjungma@eit.uni-kl.de    }
23812027Sjungma@eit.uni-kl.de
23912027Sjungma@eit.uni-kl.de    void set_invalidate_direct_mem_ptr(MODULE* mod, InvalidateDirectMemPtr p)
24012027Sjungma@eit.uni-kl.de    {
24112027Sjungma@eit.uni-kl.de      if (m_invalidate_direct_mem_ptr) {
24212027Sjungma@eit.uni-kl.de        std::stringstream s;
24312027Sjungma@eit.uni-kl.de        s << m_name << ": invalidate DMI callback allready registered";
24412027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/simple_socket",s.str().c_str());
24512027Sjungma@eit.uni-kl.de      } else {
24612027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
24712027Sjungma@eit.uni-kl.de        m_mod = mod;
24812027Sjungma@eit.uni-kl.de        m_invalidate_direct_mem_ptr = p;
24912027Sjungma@eit.uni-kl.de      }
25012027Sjungma@eit.uni-kl.de    }
25112027Sjungma@eit.uni-kl.de
25212027Sjungma@eit.uni-kl.de    sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
25312027Sjungma@eit.uni-kl.de    {
25412027Sjungma@eit.uni-kl.de      if (m_transport_ptr) {
25512027Sjungma@eit.uni-kl.de        // forward call
25612027Sjungma@eit.uni-kl.de        assert(m_mod);
25712027Sjungma@eit.uni-kl.de        return (m_mod->*m_transport_ptr)(m_transport_user_id, trans, phase, t);
25812027Sjungma@eit.uni-kl.de
25912027Sjungma@eit.uni-kl.de      } else {
26012027Sjungma@eit.uni-kl.de        std::stringstream s;
26112027Sjungma@eit.uni-kl.de        s << m_name << ": no transport callback registered";
26212027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR("/OSCI_TLM-2/simple_socket",s.str().c_str());
26312027Sjungma@eit.uni-kl.de      }
26412027Sjungma@eit.uni-kl.de      return tlm::TLM_ACCEPTED;   ///< unreachable code
26512027Sjungma@eit.uni-kl.de    }
26612027Sjungma@eit.uni-kl.de
26712027Sjungma@eit.uni-kl.de    void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
26812027Sjungma@eit.uni-kl.de                                   sc_dt::uint64 end_range)
26912027Sjungma@eit.uni-kl.de    {
27012027Sjungma@eit.uni-kl.de      if (m_invalidate_direct_mem_ptr) {
27112027Sjungma@eit.uni-kl.de        // forward call
27212027Sjungma@eit.uni-kl.de        assert(m_mod);
27312027Sjungma@eit.uni-kl.de        (m_mod->*m_invalidate_direct_mem_ptr)(m_invalidate_direct_mem_user_id, start_range, end_range);
27412027Sjungma@eit.uni-kl.de      }
27512027Sjungma@eit.uni-kl.de    }
27612027Sjungma@eit.uni-kl.de
27712027Sjungma@eit.uni-kl.de  private:
27812027Sjungma@eit.uni-kl.de    const std::string m_name;
27912027Sjungma@eit.uni-kl.de    MODULE* m_mod;
28012027Sjungma@eit.uni-kl.de    TransportPtr m_transport_ptr;
28112027Sjungma@eit.uni-kl.de    InvalidateDirectMemPtr m_invalidate_direct_mem_ptr;
28212027Sjungma@eit.uni-kl.de    int m_transport_user_id;
28312027Sjungma@eit.uni-kl.de    int m_invalidate_direct_mem_user_id;
28412027Sjungma@eit.uni-kl.de  };
28512027Sjungma@eit.uni-kl.de
28612027Sjungma@eit.uni-kl.deprivate:
28712027Sjungma@eit.uni-kl.de  process m_process;
28812027Sjungma@eit.uni-kl.de};
28912027Sjungma@eit.uni-kl.de
29012027Sjungma@eit.uni-kl.de}
29112027Sjungma@eit.uni-kl.de
29212027Sjungma@eit.uni-kl.de#endif
293