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