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