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