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 __PASSTHROUGH_TARGET_SOCKET_H__
2112027Sjungma@eit.uni-kl.de#define __PASSTHROUGH_TARGET_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 passthrough_target_socket :
3212027Sjungma@eit.uni-kl.de  public tlm::tlm_target_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_target_socket<BUSWIDTH, TYPES>       base_type;
4112027Sjungma@eit.uni-kl.de
4212027Sjungma@eit.uni-kl.depublic:
4312027Sjungma@eit.uni-kl.de  passthrough_target_socket() :
4412027Sjungma@eit.uni-kl.de    base_type(sc_core::sc_gen_unique_name("passthrough_target_socket")),
4512027Sjungma@eit.uni-kl.de    m_process(this->name())
4612027Sjungma@eit.uni-kl.de  {
4712027Sjungma@eit.uni-kl.de    bind(m_process);
4812027Sjungma@eit.uni-kl.de  }
4912027Sjungma@eit.uni-kl.de
5012027Sjungma@eit.uni-kl.de  explicit passthrough_target_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    bind(m_process);
5512027Sjungma@eit.uni-kl.de  }
5612027Sjungma@eit.uni-kl.de
5712027Sjungma@eit.uni-kl.de  using tlm::tlm_target_socket<BUSWIDTH, TYPES>::bind;
5812027Sjungma@eit.uni-kl.de
5912027Sjungma@eit.uni-kl.de  // REGISTER_XXX
6012027Sjungma@eit.uni-kl.de  void register_nb_transport_fw(MODULE* mod,
6112027Sjungma@eit.uni-kl.de                                sync_enum_type (MODULE::*cb)(transaction_type&,
6212027Sjungma@eit.uni-kl.de                                                             phase_type&,
6312027Sjungma@eit.uni-kl.de                                                             sc_core::sc_time&))
6412027Sjungma@eit.uni-kl.de  {
6512027Sjungma@eit.uni-kl.de    m_process.set_nb_transport_ptr(mod, cb);
6612027Sjungma@eit.uni-kl.de  }
6712027Sjungma@eit.uni-kl.de
6812027Sjungma@eit.uni-kl.de  void register_b_transport(MODULE* mod,
6912027Sjungma@eit.uni-kl.de                            void (MODULE::*cb)(transaction_type&,
7012027Sjungma@eit.uni-kl.de                                               sc_core::sc_time&))
7112027Sjungma@eit.uni-kl.de  {
7212027Sjungma@eit.uni-kl.de    m_process.set_b_transport_ptr(mod, cb);
7312027Sjungma@eit.uni-kl.de  }
7412027Sjungma@eit.uni-kl.de
7512027Sjungma@eit.uni-kl.de  void register_transport_dbg(MODULE* mod,
7612027Sjungma@eit.uni-kl.de                              unsigned int (MODULE::*cb)(transaction_type&))
7712027Sjungma@eit.uni-kl.de  {
7812027Sjungma@eit.uni-kl.de    m_process.set_transport_dbg_ptr(mod, cb);
7912027Sjungma@eit.uni-kl.de  }
8012027Sjungma@eit.uni-kl.de
8112027Sjungma@eit.uni-kl.de  void register_get_direct_mem_ptr(MODULE* mod,
8212027Sjungma@eit.uni-kl.de                                   bool (MODULE::*cb)(transaction_type&,
8312027Sjungma@eit.uni-kl.de                                                      tlm::tlm_dmi&))
8412027Sjungma@eit.uni-kl.de  {
8512027Sjungma@eit.uni-kl.de    m_process.set_get_direct_mem_ptr(mod, cb);
8612027Sjungma@eit.uni-kl.de  }
8712027Sjungma@eit.uni-kl.de
8812027Sjungma@eit.uni-kl.deprivate:
8912027Sjungma@eit.uni-kl.de  class process : public tlm::tlm_fw_transport_if<TYPES>
9012027Sjungma@eit.uni-kl.de  {
9112027Sjungma@eit.uni-kl.de  public:
9212027Sjungma@eit.uni-kl.de    typedef sync_enum_type (MODULE::*NBTransportPtr)(transaction_type&,
9312027Sjungma@eit.uni-kl.de                                                     phase_type&,
9412027Sjungma@eit.uni-kl.de                                                     sc_core::sc_time&);
9512027Sjungma@eit.uni-kl.de    typedef void (MODULE::*BTransportPtr)(transaction_type&,
9612027Sjungma@eit.uni-kl.de                                            sc_core::sc_time&);
9712027Sjungma@eit.uni-kl.de    typedef unsigned int (MODULE::*TransportDbgPtr)(transaction_type&);
9812027Sjungma@eit.uni-kl.de    typedef bool (MODULE::*GetDirectMem_ptr)(transaction_type&,
9912027Sjungma@eit.uni-kl.de                                               tlm::tlm_dmi&);
10012027Sjungma@eit.uni-kl.de
10112027Sjungma@eit.uni-kl.de    process(const std::string& name) :
10212027Sjungma@eit.uni-kl.de      m_name(name),
10312027Sjungma@eit.uni-kl.de      m_mod(0),
10412027Sjungma@eit.uni-kl.de      m_nb_transport_ptr(0),
10512027Sjungma@eit.uni-kl.de      m_b_transport_ptr(0),
10612027Sjungma@eit.uni-kl.de      m_transport_dbg_ptr(0),
10712027Sjungma@eit.uni-kl.de      m_get_direct_mem_ptr(0)
10812027Sjungma@eit.uni-kl.de    {
10912027Sjungma@eit.uni-kl.de    }
11012027Sjungma@eit.uni-kl.de
11112027Sjungma@eit.uni-kl.de    void set_nb_transport_ptr(MODULE* mod, NBTransportPtr p)
11212027Sjungma@eit.uni-kl.de    {
11312027Sjungma@eit.uni-kl.de      if (m_nb_transport_ptr) {
11412027Sjungma@eit.uni-kl.de        std::stringstream s;
11512027Sjungma@eit.uni-kl.de        s << m_name << ": non-blocking callback allready registered";
11612027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
11712027Sjungma@eit.uni-kl.de
11812027Sjungma@eit.uni-kl.de      } else {
11912027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
12012027Sjungma@eit.uni-kl.de        m_mod = mod;
12112027Sjungma@eit.uni-kl.de        m_nb_transport_ptr = p;
12212027Sjungma@eit.uni-kl.de      }
12312027Sjungma@eit.uni-kl.de    }
12412027Sjungma@eit.uni-kl.de
12512027Sjungma@eit.uni-kl.de    void set_b_transport_ptr(MODULE* mod, BTransportPtr p)
12612027Sjungma@eit.uni-kl.de    {
12712027Sjungma@eit.uni-kl.de      if (m_b_transport_ptr) {
12812027Sjungma@eit.uni-kl.de        std::stringstream s;
12912027Sjungma@eit.uni-kl.de        s << m_name << ": blocking callback allready registered";
13012027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
13112027Sjungma@eit.uni-kl.de      } else {
13212027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
13312027Sjungma@eit.uni-kl.de        m_mod = mod;
13412027Sjungma@eit.uni-kl.de        m_b_transport_ptr = p;
13512027Sjungma@eit.uni-kl.de      }
13612027Sjungma@eit.uni-kl.de    }
13712027Sjungma@eit.uni-kl.de
13812027Sjungma@eit.uni-kl.de    void set_transport_dbg_ptr(MODULE* mod, TransportDbgPtr p)
13912027Sjungma@eit.uni-kl.de    {
14012027Sjungma@eit.uni-kl.de      if (m_transport_dbg_ptr) {
14112027Sjungma@eit.uni-kl.de        std::stringstream s;
14212027Sjungma@eit.uni-kl.de        s << m_name << ": debug callback allready registered";
14312027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
14412027Sjungma@eit.uni-kl.de      } else {
14512027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
14612027Sjungma@eit.uni-kl.de        m_mod = mod;
14712027Sjungma@eit.uni-kl.de        m_transport_dbg_ptr = p;
14812027Sjungma@eit.uni-kl.de      }
14912027Sjungma@eit.uni-kl.de    }
15012027Sjungma@eit.uni-kl.de
15112027Sjungma@eit.uni-kl.de    void set_get_direct_mem_ptr(MODULE* mod, GetDirectMem_ptr p)
15212027Sjungma@eit.uni-kl.de    {
15312027Sjungma@eit.uni-kl.de      if (m_get_direct_mem_ptr) {
15412027Sjungma@eit.uni-kl.de        std::stringstream s;
15512027Sjungma@eit.uni-kl.de        s << m_name << ": get DMI pointer callback allready registered";
15612027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
15712027Sjungma@eit.uni-kl.de      } else {
15812027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
15912027Sjungma@eit.uni-kl.de        m_mod = mod;
16012027Sjungma@eit.uni-kl.de        m_get_direct_mem_ptr = p;
16112027Sjungma@eit.uni-kl.de      }
16212027Sjungma@eit.uni-kl.de    }
16312027Sjungma@eit.uni-kl.de
16412027Sjungma@eit.uni-kl.de    sync_enum_type nb_transport_fw(transaction_type& trans,
16512027Sjungma@eit.uni-kl.de                                   phase_type& phase,
16612027Sjungma@eit.uni-kl.de                                   sc_core::sc_time& t)
16712027Sjungma@eit.uni-kl.de    {
16812027Sjungma@eit.uni-kl.de      if (m_nb_transport_ptr) {
16912027Sjungma@eit.uni-kl.de        // forward call
17012027Sjungma@eit.uni-kl.de        assert(m_mod);
17112027Sjungma@eit.uni-kl.de        return (m_mod->*m_nb_transport_ptr)(trans, phase, t);
17212027Sjungma@eit.uni-kl.de
17312027Sjungma@eit.uni-kl.de      } else {
17412027Sjungma@eit.uni-kl.de        std::stringstream s;
17512027Sjungma@eit.uni-kl.de        s << m_name << ": no non-blocking callback registered";
17612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
17712027Sjungma@eit.uni-kl.de      }
17812027Sjungma@eit.uni-kl.de      return tlm::TLM_ACCEPTED;   ///< unreachable code
17912027Sjungma@eit.uni-kl.de    }
18012027Sjungma@eit.uni-kl.de
18112027Sjungma@eit.uni-kl.de    void b_transport(transaction_type& trans, sc_core::sc_time& t)
18212027Sjungma@eit.uni-kl.de    {
18312027Sjungma@eit.uni-kl.de      if (m_b_transport_ptr) {
18412027Sjungma@eit.uni-kl.de        // forward call
18512027Sjungma@eit.uni-kl.de        assert(m_mod);
18612027Sjungma@eit.uni-kl.de        return (m_mod->*m_b_transport_ptr)(trans, t);
18712027Sjungma@eit.uni-kl.de
18812027Sjungma@eit.uni-kl.de      } else {
18912027Sjungma@eit.uni-kl.de        std::stringstream s;
19012027Sjungma@eit.uni-kl.de        s << m_name << ": no blocking callback registered";
19112027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
19212027Sjungma@eit.uni-kl.de      }
19312027Sjungma@eit.uni-kl.de    }
19412027Sjungma@eit.uni-kl.de
19512027Sjungma@eit.uni-kl.de    unsigned int transport_dbg(transaction_type& trans)
19612027Sjungma@eit.uni-kl.de    {
19712027Sjungma@eit.uni-kl.de      if (m_transport_dbg_ptr) {
19812027Sjungma@eit.uni-kl.de        // forward call
19912027Sjungma@eit.uni-kl.de        assert(m_mod);
20012027Sjungma@eit.uni-kl.de        return (m_mod->*m_transport_dbg_ptr)(trans);
20112027Sjungma@eit.uni-kl.de
20212027Sjungma@eit.uni-kl.de      } else {
20312027Sjungma@eit.uni-kl.de        // No debug support
20412027Sjungma@eit.uni-kl.de        return 0;
20512027Sjungma@eit.uni-kl.de      }
20612027Sjungma@eit.uni-kl.de    }
20712027Sjungma@eit.uni-kl.de
20812027Sjungma@eit.uni-kl.de    bool get_direct_mem_ptr(transaction_type& trans,
20912027Sjungma@eit.uni-kl.de                            tlm::tlm_dmi&  dmi_data)
21012027Sjungma@eit.uni-kl.de    {
21112027Sjungma@eit.uni-kl.de      if (m_get_direct_mem_ptr) {
21212027Sjungma@eit.uni-kl.de        // forward call
21312027Sjungma@eit.uni-kl.de        assert(m_mod);
21412027Sjungma@eit.uni-kl.de        return (m_mod->*m_get_direct_mem_ptr)(trans, dmi_data);
21512027Sjungma@eit.uni-kl.de
21612027Sjungma@eit.uni-kl.de      } else {
21712027Sjungma@eit.uni-kl.de        // No DMI support
21812027Sjungma@eit.uni-kl.de        dmi_data.allow_read_write();
21912027Sjungma@eit.uni-kl.de        dmi_data.set_start_address(0x0);
22012027Sjungma@eit.uni-kl.de        dmi_data.set_end_address((sc_dt::uint64)-1);
22112027Sjungma@eit.uni-kl.de        return false;
22212027Sjungma@eit.uni-kl.de      }
22312027Sjungma@eit.uni-kl.de    }
22412027Sjungma@eit.uni-kl.de
22512027Sjungma@eit.uni-kl.de  private:
22612027Sjungma@eit.uni-kl.de    const std::string m_name;
22712027Sjungma@eit.uni-kl.de    MODULE* m_mod;
22812027Sjungma@eit.uni-kl.de    NBTransportPtr m_nb_transport_ptr;
22912027Sjungma@eit.uni-kl.de    BTransportPtr m_b_transport_ptr;
23012027Sjungma@eit.uni-kl.de    TransportDbgPtr m_transport_dbg_ptr;
23112027Sjungma@eit.uni-kl.de    GetDirectMem_ptr m_get_direct_mem_ptr;
23212027Sjungma@eit.uni-kl.de  };
23312027Sjungma@eit.uni-kl.de
23412027Sjungma@eit.uni-kl.deprivate:
23512027Sjungma@eit.uni-kl.de  process m_process;
23612027Sjungma@eit.uni-kl.de};
23712027Sjungma@eit.uni-kl.de
23812027Sjungma@eit.uni-kl.de//ID Tagged version
23912027Sjungma@eit.uni-kl.detemplate <typename MODULE,
24012027Sjungma@eit.uni-kl.de          unsigned int BUSWIDTH = 32,
24112027Sjungma@eit.uni-kl.de          typename TYPES = tlm::tlm_base_protocol_types>
24212027Sjungma@eit.uni-kl.declass passthrough_target_socket_tagged :
24312027Sjungma@eit.uni-kl.de  public tlm::tlm_target_socket<BUSWIDTH, TYPES>
24412027Sjungma@eit.uni-kl.de{
24512027Sjungma@eit.uni-kl.depublic:
24612027Sjungma@eit.uni-kl.de  typedef typename TYPES::tlm_payload_type              transaction_type;
24712027Sjungma@eit.uni-kl.de  typedef typename TYPES::tlm_phase_type                phase_type;
24812027Sjungma@eit.uni-kl.de  typedef tlm::tlm_sync_enum                            sync_enum_type;
24912027Sjungma@eit.uni-kl.de  typedef tlm::tlm_fw_transport_if<TYPES>               fw_interface_type;
25012027Sjungma@eit.uni-kl.de  typedef tlm::tlm_bw_transport_if<TYPES>               bw_interface_type;
25112027Sjungma@eit.uni-kl.de  typedef tlm::tlm_target_socket<BUSWIDTH, TYPES>       base_type;
25212027Sjungma@eit.uni-kl.de
25312027Sjungma@eit.uni-kl.depublic:
25412027Sjungma@eit.uni-kl.de  passthrough_target_socket_tagged() :
25512027Sjungma@eit.uni-kl.de    base_type(sc_core::sc_gen_unique_name("passthrough_target_socket_tagged")),
25612027Sjungma@eit.uni-kl.de    m_process(this->name())
25712027Sjungma@eit.uni-kl.de  {
25812027Sjungma@eit.uni-kl.de    bind(m_process);
25912027Sjungma@eit.uni-kl.de  }
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.de  explicit passthrough_target_socket_tagged(const char* n) :
26212027Sjungma@eit.uni-kl.de    base_type(n),
26312027Sjungma@eit.uni-kl.de    m_process(this->name())
26412027Sjungma@eit.uni-kl.de  {
26512027Sjungma@eit.uni-kl.de    bind(m_process);
26612027Sjungma@eit.uni-kl.de  }
26712027Sjungma@eit.uni-kl.de
26812027Sjungma@eit.uni-kl.de  using tlm::tlm_target_socket<BUSWIDTH, TYPES>::bind;
26912027Sjungma@eit.uni-kl.de
27012027Sjungma@eit.uni-kl.de  // REGISTER_XXX
27112027Sjungma@eit.uni-kl.de  void register_nb_transport_fw(MODULE* mod,
27212027Sjungma@eit.uni-kl.de                                sync_enum_type (MODULE::*cb)(int id,
27312027Sjungma@eit.uni-kl.de                                                             transaction_type&,
27412027Sjungma@eit.uni-kl.de                                                             phase_type&,
27512027Sjungma@eit.uni-kl.de                                                             sc_core::sc_time&),
27612027Sjungma@eit.uni-kl.de                                int id)
27712027Sjungma@eit.uni-kl.de  {
27812027Sjungma@eit.uni-kl.de    m_process.set_nb_transport_ptr(mod, cb);
27912027Sjungma@eit.uni-kl.de    m_process.set_nb_transport_user_id(id);
28012027Sjungma@eit.uni-kl.de  }
28112027Sjungma@eit.uni-kl.de
28212027Sjungma@eit.uni-kl.de  void register_b_transport(MODULE* mod,
28312027Sjungma@eit.uni-kl.de                            void (MODULE::*cb)(int id,
28412027Sjungma@eit.uni-kl.de                                               transaction_type&,
28512027Sjungma@eit.uni-kl.de                                               sc_core::sc_time&),
28612027Sjungma@eit.uni-kl.de                            int id)
28712027Sjungma@eit.uni-kl.de  {
28812027Sjungma@eit.uni-kl.de    m_process.set_b_transport_ptr(mod, cb);
28912027Sjungma@eit.uni-kl.de    m_process.set_b_transport_user_id(id);
29012027Sjungma@eit.uni-kl.de  }
29112027Sjungma@eit.uni-kl.de
29212027Sjungma@eit.uni-kl.de  void register_transport_dbg(MODULE* mod,
29312027Sjungma@eit.uni-kl.de                              unsigned int (MODULE::*cb)(int id,
29412027Sjungma@eit.uni-kl.de                                                         transaction_type&),
29512027Sjungma@eit.uni-kl.de                              int id)
29612027Sjungma@eit.uni-kl.de  {
29712027Sjungma@eit.uni-kl.de    m_process.set_transport_dbg_ptr(mod, cb);
29812027Sjungma@eit.uni-kl.de    m_process.set_transport_dbg_user_id(id);
29912027Sjungma@eit.uni-kl.de  }
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.de  void register_get_direct_mem_ptr(MODULE* mod,
30212027Sjungma@eit.uni-kl.de                                   bool (MODULE::*cb)(int id,
30312027Sjungma@eit.uni-kl.de                                                      transaction_type&,
30412027Sjungma@eit.uni-kl.de                                                      tlm::tlm_dmi&),
30512027Sjungma@eit.uni-kl.de                                   int id)
30612027Sjungma@eit.uni-kl.de  {
30712027Sjungma@eit.uni-kl.de    m_process.set_get_direct_mem_ptr(mod, cb);
30812027Sjungma@eit.uni-kl.de    m_process.set_get_dmi_user_id(id);
30912027Sjungma@eit.uni-kl.de  }
31012027Sjungma@eit.uni-kl.de
31112027Sjungma@eit.uni-kl.deprivate:
31212027Sjungma@eit.uni-kl.de  class process : public tlm::tlm_fw_transport_if<TYPES>
31312027Sjungma@eit.uni-kl.de  {
31412027Sjungma@eit.uni-kl.de  public:
31512027Sjungma@eit.uni-kl.de    typedef sync_enum_type (MODULE::*NBTransportPtr)(int id,
31612027Sjungma@eit.uni-kl.de                                                     transaction_type&,
31712027Sjungma@eit.uni-kl.de                                                     phase_type&,
31812027Sjungma@eit.uni-kl.de                                                     sc_core::sc_time&);
31912027Sjungma@eit.uni-kl.de    typedef void (MODULE::*BTransportPtr)(int id,
32012027Sjungma@eit.uni-kl.de                                          transaction_type&,
32112027Sjungma@eit.uni-kl.de                                          sc_core::sc_time&);
32212027Sjungma@eit.uni-kl.de    typedef unsigned int (MODULE::*TransportDbgPtr)(int id,
32312027Sjungma@eit.uni-kl.de                                                    transaction_type&);
32412027Sjungma@eit.uni-kl.de    typedef bool (MODULE::*GetDirectMem_ptr)(int id,
32512027Sjungma@eit.uni-kl.de                                             transaction_type&,
32612027Sjungma@eit.uni-kl.de                                             tlm::tlm_dmi&);
32712027Sjungma@eit.uni-kl.de
32812027Sjungma@eit.uni-kl.de    process(const std::string& name) :
32912027Sjungma@eit.uni-kl.de      m_name(name),
33012027Sjungma@eit.uni-kl.de      m_mod(0),
33112027Sjungma@eit.uni-kl.de      m_nb_transport_ptr(0),
33212027Sjungma@eit.uni-kl.de      m_b_transport_ptr(0),
33312027Sjungma@eit.uni-kl.de      m_transport_dbg_ptr(0),
33412027Sjungma@eit.uni-kl.de      m_get_direct_mem_ptr(0),
33512027Sjungma@eit.uni-kl.de      m_nb_transport_user_id(0),
33612027Sjungma@eit.uni-kl.de      m_b_transport_user_id(0),
33712027Sjungma@eit.uni-kl.de      m_transport_dbg_user_id(0),
33812027Sjungma@eit.uni-kl.de      m_get_dmi_user_id(0)
33912027Sjungma@eit.uni-kl.de    {
34012027Sjungma@eit.uni-kl.de    }
34112027Sjungma@eit.uni-kl.de
34212027Sjungma@eit.uni-kl.de    void set_nb_transport_user_id(int id) { m_nb_transport_user_id = id; }
34312027Sjungma@eit.uni-kl.de    void set_b_transport_user_id(int id) { m_b_transport_user_id = id; }
34412027Sjungma@eit.uni-kl.de    void set_transport_dbg_user_id(int id) { m_transport_dbg_user_id = id; }
34512027Sjungma@eit.uni-kl.de    void set_get_dmi_user_id(int id) { m_get_dmi_user_id = id; }
34612027Sjungma@eit.uni-kl.de
34712027Sjungma@eit.uni-kl.de    void set_nb_transport_ptr(MODULE* mod, NBTransportPtr p)
34812027Sjungma@eit.uni-kl.de    {
34912027Sjungma@eit.uni-kl.de      if (m_nb_transport_ptr) {
35012027Sjungma@eit.uni-kl.de        std::stringstream s;
35112027Sjungma@eit.uni-kl.de        s << m_name << ": non-blocking callback allready registered";
35212027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
35312027Sjungma@eit.uni-kl.de      } else {
35412027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
35512027Sjungma@eit.uni-kl.de        m_mod = mod;
35612027Sjungma@eit.uni-kl.de        m_nb_transport_ptr = p;
35712027Sjungma@eit.uni-kl.de      }
35812027Sjungma@eit.uni-kl.de    }
35912027Sjungma@eit.uni-kl.de
36012027Sjungma@eit.uni-kl.de    void set_b_transport_ptr(MODULE* mod, BTransportPtr p)
36112027Sjungma@eit.uni-kl.de    {
36212027Sjungma@eit.uni-kl.de      if (m_b_transport_ptr) {
36312027Sjungma@eit.uni-kl.de        std::stringstream s;
36412027Sjungma@eit.uni-kl.de        s << m_name << ": blocking callback allready registered";
36512027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
36612027Sjungma@eit.uni-kl.de      } else {
36712027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
36812027Sjungma@eit.uni-kl.de        m_mod = mod;
36912027Sjungma@eit.uni-kl.de        m_b_transport_ptr = p;
37012027Sjungma@eit.uni-kl.de      }
37112027Sjungma@eit.uni-kl.de    }
37212027Sjungma@eit.uni-kl.de
37312027Sjungma@eit.uni-kl.de    void set_transport_dbg_ptr(MODULE* mod, TransportDbgPtr p)
37412027Sjungma@eit.uni-kl.de    {
37512027Sjungma@eit.uni-kl.de      if (m_transport_dbg_ptr) {
37612027Sjungma@eit.uni-kl.de        std::stringstream s;
37712027Sjungma@eit.uni-kl.de        s << m_name << ": debug callback allready registered";
37812027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
37912027Sjungma@eit.uni-kl.de      } else {
38012027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
38112027Sjungma@eit.uni-kl.de        m_mod = mod;
38212027Sjungma@eit.uni-kl.de        m_transport_dbg_ptr = p;
38312027Sjungma@eit.uni-kl.de      }
38412027Sjungma@eit.uni-kl.de    }
38512027Sjungma@eit.uni-kl.de
38612027Sjungma@eit.uni-kl.de    void set_get_direct_mem_ptr(MODULE* mod, GetDirectMem_ptr p)
38712027Sjungma@eit.uni-kl.de    {
38812027Sjungma@eit.uni-kl.de      if (m_get_direct_mem_ptr) {
38912027Sjungma@eit.uni-kl.de        std::stringstream s;
39012027Sjungma@eit.uni-kl.de        s << m_name << ": get DMI pointer callback allready registered";
39112027Sjungma@eit.uni-kl.de        SC_REPORT_WARNING("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
39212027Sjungma@eit.uni-kl.de      } else {
39312027Sjungma@eit.uni-kl.de        assert(!m_mod || m_mod == mod);
39412027Sjungma@eit.uni-kl.de        m_mod = mod;
39512027Sjungma@eit.uni-kl.de        m_get_direct_mem_ptr = p;
39612027Sjungma@eit.uni-kl.de      }
39712027Sjungma@eit.uni-kl.de    }
39812027Sjungma@eit.uni-kl.de
39912027Sjungma@eit.uni-kl.de    sync_enum_type nb_transport_fw(transaction_type& trans,
40012027Sjungma@eit.uni-kl.de                                   phase_type& phase,
40112027Sjungma@eit.uni-kl.de                                   sc_core::sc_time& t)
40212027Sjungma@eit.uni-kl.de    {
40312027Sjungma@eit.uni-kl.de      if (m_nb_transport_ptr) {
40412027Sjungma@eit.uni-kl.de        // forward call
40512027Sjungma@eit.uni-kl.de        assert(m_mod);
40612027Sjungma@eit.uni-kl.de        return (m_mod->*m_nb_transport_ptr)(m_nb_transport_user_id, trans, phase, t);
40712027Sjungma@eit.uni-kl.de
40812027Sjungma@eit.uni-kl.de      } else {
40912027Sjungma@eit.uni-kl.de        std::stringstream s;
41012027Sjungma@eit.uni-kl.de        s << m_name << ": no non-blocking callback registered";
41112027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
41212027Sjungma@eit.uni-kl.de      }
41312027Sjungma@eit.uni-kl.de      return tlm::TLM_ACCEPTED;   ///< unreachable code
41412027Sjungma@eit.uni-kl.de    }
41512027Sjungma@eit.uni-kl.de
41612027Sjungma@eit.uni-kl.de    void b_transport(transaction_type& trans, sc_core::sc_time& t)
41712027Sjungma@eit.uni-kl.de    {
41812027Sjungma@eit.uni-kl.de      if (m_b_transport_ptr) {
41912027Sjungma@eit.uni-kl.de        // forward call
42012027Sjungma@eit.uni-kl.de        assert(m_mod);
42112027Sjungma@eit.uni-kl.de        return (m_mod->*m_b_transport_ptr)(m_b_transport_user_id, trans, t);
42212027Sjungma@eit.uni-kl.de
42312027Sjungma@eit.uni-kl.de      } else {
42412027Sjungma@eit.uni-kl.de        std::stringstream s;
42512027Sjungma@eit.uni-kl.de        s << m_name << ": no blocking callback registered";
42612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR("/OSCI_TLM-2/passthrough_socket",s.str().c_str());
42712027Sjungma@eit.uni-kl.de      }
42812027Sjungma@eit.uni-kl.de    }
42912027Sjungma@eit.uni-kl.de
43012027Sjungma@eit.uni-kl.de    unsigned int transport_dbg(transaction_type& trans)
43112027Sjungma@eit.uni-kl.de    {
43212027Sjungma@eit.uni-kl.de      if (m_transport_dbg_ptr) {
43312027Sjungma@eit.uni-kl.de        // forward call
43412027Sjungma@eit.uni-kl.de        assert(m_mod);
43512027Sjungma@eit.uni-kl.de        return (m_mod->*m_transport_dbg_ptr)(m_transport_dbg_user_id, trans);
43612027Sjungma@eit.uni-kl.de
43712027Sjungma@eit.uni-kl.de      } else {
43812027Sjungma@eit.uni-kl.de        // No debug support
43912027Sjungma@eit.uni-kl.de        return 0;
44012027Sjungma@eit.uni-kl.de      }
44112027Sjungma@eit.uni-kl.de    }
44212027Sjungma@eit.uni-kl.de
44312027Sjungma@eit.uni-kl.de    bool get_direct_mem_ptr(transaction_type& trans,
44412027Sjungma@eit.uni-kl.de                            tlm::tlm_dmi&  dmi_data)
44512027Sjungma@eit.uni-kl.de    {
44612027Sjungma@eit.uni-kl.de      if (m_get_direct_mem_ptr) {
44712027Sjungma@eit.uni-kl.de        // forward call
44812027Sjungma@eit.uni-kl.de        assert(m_mod);
44912027Sjungma@eit.uni-kl.de        return (m_mod->*m_get_direct_mem_ptr)(m_get_dmi_user_id, trans, dmi_data);
45012027Sjungma@eit.uni-kl.de
45112027Sjungma@eit.uni-kl.de      } else {
45212027Sjungma@eit.uni-kl.de        // No DMI support
45312027Sjungma@eit.uni-kl.de        dmi_data.allow_read_write();
45412027Sjungma@eit.uni-kl.de        dmi_data.set_start_address(0x0);
45512027Sjungma@eit.uni-kl.de        dmi_data.set_end_address((sc_dt::uint64)-1);
45612027Sjungma@eit.uni-kl.de        return false;
45712027Sjungma@eit.uni-kl.de      }
45812027Sjungma@eit.uni-kl.de    }
45912027Sjungma@eit.uni-kl.de
46012027Sjungma@eit.uni-kl.de  private:
46112027Sjungma@eit.uni-kl.de    const std::string m_name;
46212027Sjungma@eit.uni-kl.de    MODULE* m_mod;
46312027Sjungma@eit.uni-kl.de    NBTransportPtr m_nb_transport_ptr;
46412027Sjungma@eit.uni-kl.de    BTransportPtr m_b_transport_ptr;
46512027Sjungma@eit.uni-kl.de    TransportDbgPtr m_transport_dbg_ptr;
46612027Sjungma@eit.uni-kl.de    GetDirectMem_ptr m_get_direct_mem_ptr;
46712027Sjungma@eit.uni-kl.de    int m_nb_transport_user_id;
46812027Sjungma@eit.uni-kl.de    int m_b_transport_user_id;
46912027Sjungma@eit.uni-kl.de    int m_transport_dbg_user_id;
47012027Sjungma@eit.uni-kl.de    int m_get_dmi_user_id;
47112027Sjungma@eit.uni-kl.de  };
47212027Sjungma@eit.uni-kl.de
47312027Sjungma@eit.uni-kl.deprivate:
47412027Sjungma@eit.uni-kl.de  process m_process;
47512027Sjungma@eit.uni-kl.de};
47612027Sjungma@eit.uni-kl.de
47712027Sjungma@eit.uni-kl.de}
47812027Sjungma@eit.uni-kl.de
47912027Sjungma@eit.uni-kl.de#endif
480