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 __TLM_INITIATOR_SOCKET_H__ 2112027Sjungma@eit.uni-kl.de#define __TLM_INITIATOR_SOCKET_H__ 2212027Sjungma@eit.uni-kl.de 2312027Sjungma@eit.uni-kl.de//#include <systemc> 2412027Sjungma@eit.uni-kl.de#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_fw_bw_ifs.h" 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.denamespace tlm { 2712027Sjungma@eit.uni-kl.de 2812027Sjungma@eit.uni-kl.de 2912027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH = 32, 3012027Sjungma@eit.uni-kl.de typename FW_IF = tlm_fw_transport_if<>, 3112027Sjungma@eit.uni-kl.de typename BW_IF = tlm_bw_transport_if<> > 3212027Sjungma@eit.uni-kl.declass tlm_base_initiator_socket_b 3312027Sjungma@eit.uni-kl.de{ 3412027Sjungma@eit.uni-kl.depublic: 3512027Sjungma@eit.uni-kl.de virtual ~tlm_base_initiator_socket_b() {} 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de virtual sc_core::sc_port_b<FW_IF> & get_base_port() = 0; 3812027Sjungma@eit.uni-kl.de virtual sc_core::sc_port_b<FW_IF> const & get_base_port() const = 0; 3912027Sjungma@eit.uni-kl.de virtual BW_IF & get_base_interface() = 0; 4012027Sjungma@eit.uni-kl.de virtual BW_IF const & get_base_interface() const = 0; 4112027Sjungma@eit.uni-kl.de virtual sc_core::sc_export<BW_IF> & get_base_export() = 0; 4212027Sjungma@eit.uni-kl.de virtual sc_core::sc_export<BW_IF> const & get_base_export() const = 0; 4312027Sjungma@eit.uni-kl.de}; 4412027Sjungma@eit.uni-kl.de 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH, 4712027Sjungma@eit.uni-kl.de typename FW_IF, 4812027Sjungma@eit.uni-kl.de typename BW_IF> class tlm_base_target_socket_b; 4912027Sjungma@eit.uni-kl.de 5012027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH, 5112027Sjungma@eit.uni-kl.de typename FW_IF, 5212027Sjungma@eit.uni-kl.de typename BW_IF, 5312027Sjungma@eit.uni-kl.de int N 5412027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 5512027Sjungma@eit.uni-kl.de ,sc_core::sc_port_policy POL 5612027Sjungma@eit.uni-kl.de#endif 5712027Sjungma@eit.uni-kl.de > class tlm_base_target_socket; 5812027Sjungma@eit.uni-kl.de 5912027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH = 32, 6012027Sjungma@eit.uni-kl.de typename FW_IF = tlm_fw_transport_if<>, 6112027Sjungma@eit.uni-kl.de typename BW_IF = tlm_bw_transport_if<>, 6212027Sjungma@eit.uni-kl.de int N = 1 6312027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 6412027Sjungma@eit.uni-kl.de ,sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND 6512027Sjungma@eit.uni-kl.de#endif 6612027Sjungma@eit.uni-kl.de > 6712027Sjungma@eit.uni-kl.declass tlm_base_initiator_socket : public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>, 6812027Sjungma@eit.uni-kl.de public sc_core::sc_port<FW_IF, N 6912027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 7012027Sjungma@eit.uni-kl.de , POL 7112027Sjungma@eit.uni-kl.de#endif 7212027Sjungma@eit.uni-kl.de > 7312027Sjungma@eit.uni-kl.de 7412027Sjungma@eit.uni-kl.de{ 7512027Sjungma@eit.uni-kl.depublic: 7612027Sjungma@eit.uni-kl.de typedef FW_IF fw_interface_type; 7712027Sjungma@eit.uni-kl.de typedef BW_IF bw_interface_type; 7812027Sjungma@eit.uni-kl.de typedef sc_core::sc_port<fw_interface_type, N 7912027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 8012027Sjungma@eit.uni-kl.de , POL 8112027Sjungma@eit.uni-kl.de#endif 8212027Sjungma@eit.uni-kl.de > port_type; 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.de typedef sc_core::sc_export<bw_interface_type> export_type; 8512027Sjungma@eit.uni-kl.de 8612027Sjungma@eit.uni-kl.de typedef tlm_base_target_socket_b<BUSWIDTH, 8712027Sjungma@eit.uni-kl.de fw_interface_type, 8812027Sjungma@eit.uni-kl.de bw_interface_type> base_target_socket_type; 8912027Sjungma@eit.uni-kl.de typedef tlm_base_initiator_socket_b<BUSWIDTH, 9012027Sjungma@eit.uni-kl.de fw_interface_type, 9112027Sjungma@eit.uni-kl.de bw_interface_type> base_type; 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.de template <unsigned int, typename, typename, int 9412027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 9512027Sjungma@eit.uni-kl.de ,sc_core::sc_port_policy 9612027Sjungma@eit.uni-kl.de#endif 9712027Sjungma@eit.uni-kl.de > 9812027Sjungma@eit.uni-kl.de friend class tlm_base_target_socket; 9912027Sjungma@eit.uni-kl.de 10012027Sjungma@eit.uni-kl.depublic: 10112027Sjungma@eit.uni-kl.de tlm_base_initiator_socket() 10212027Sjungma@eit.uni-kl.de : port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket")) 10312027Sjungma@eit.uni-kl.de , m_export(sc_core::sc_gen_unique_name("tlm_base_initiator_socket_export")) 10412027Sjungma@eit.uni-kl.de { 10512027Sjungma@eit.uni-kl.de } 10612027Sjungma@eit.uni-kl.de 10712027Sjungma@eit.uni-kl.de explicit tlm_base_initiator_socket(const char* name) 10812027Sjungma@eit.uni-kl.de : port_type(name) 10912027Sjungma@eit.uni-kl.de , m_export(sc_core::sc_gen_unique_name((std::string(name) + "_export").c_str())) 11012027Sjungma@eit.uni-kl.de { 11112027Sjungma@eit.uni-kl.de } 11212027Sjungma@eit.uni-kl.de 11312027Sjungma@eit.uni-kl.de virtual const char* kind() const 11412027Sjungma@eit.uni-kl.de { 11512027Sjungma@eit.uni-kl.de return "tlm_base_initiator_socket"; 11612027Sjungma@eit.uni-kl.de } 11712027Sjungma@eit.uni-kl.de 11812027Sjungma@eit.uni-kl.de unsigned int get_bus_width() const 11912027Sjungma@eit.uni-kl.de { 12012027Sjungma@eit.uni-kl.de return BUSWIDTH; 12112027Sjungma@eit.uni-kl.de } 12212027Sjungma@eit.uni-kl.de 12312027Sjungma@eit.uni-kl.de // 12412027Sjungma@eit.uni-kl.de // Bind initiator socket to target socket 12512027Sjungma@eit.uni-kl.de // - Binds the port of the initiator socket to the export of the target 12612027Sjungma@eit.uni-kl.de // socket 12712027Sjungma@eit.uni-kl.de // - Binds the port of the target socket to the export of the initiator 12812027Sjungma@eit.uni-kl.de // socket 12912027Sjungma@eit.uni-kl.de // 13012027Sjungma@eit.uni-kl.de virtual void bind(base_target_socket_type& s) 13112027Sjungma@eit.uni-kl.de { 13212027Sjungma@eit.uni-kl.de // initiator.port -> target.export 13312027Sjungma@eit.uni-kl.de (get_base_port())(s.get_base_interface()); 13412027Sjungma@eit.uni-kl.de // target.port -> initiator.export 13512027Sjungma@eit.uni-kl.de (s.get_base_port())(get_base_interface()); 13612027Sjungma@eit.uni-kl.de } 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.de void operator() (base_target_socket_type& s) 13912027Sjungma@eit.uni-kl.de { 14012027Sjungma@eit.uni-kl.de bind(s); 14112027Sjungma@eit.uni-kl.de } 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.de // 14412027Sjungma@eit.uni-kl.de // Bind initiator socket to initiator socket (hierarchical bind) 14512027Sjungma@eit.uni-kl.de // - Binds both the export and the port 14612027Sjungma@eit.uni-kl.de // 14712027Sjungma@eit.uni-kl.de virtual void bind(base_type& s) 14812027Sjungma@eit.uni-kl.de { 14912027Sjungma@eit.uni-kl.de // port 15012027Sjungma@eit.uni-kl.de (get_base_port())(s.get_base_port()); 15112027Sjungma@eit.uni-kl.de // export 15212027Sjungma@eit.uni-kl.de (s.get_base_export())(get_base_export()); 15312027Sjungma@eit.uni-kl.de } 15412027Sjungma@eit.uni-kl.de 15512027Sjungma@eit.uni-kl.de void operator() (base_type& s) 15612027Sjungma@eit.uni-kl.de { 15712027Sjungma@eit.uni-kl.de bind(s); 15812027Sjungma@eit.uni-kl.de } 15912027Sjungma@eit.uni-kl.de 16012027Sjungma@eit.uni-kl.de // 16112027Sjungma@eit.uni-kl.de // Bind interface to socket 16212027Sjungma@eit.uni-kl.de // - Binds the interface to the export of this socket 16312027Sjungma@eit.uni-kl.de // 16412027Sjungma@eit.uni-kl.de virtual void bind(bw_interface_type& ifs) 16512027Sjungma@eit.uni-kl.de { 16612027Sjungma@eit.uni-kl.de (get_base_export())(ifs); 16712027Sjungma@eit.uni-kl.de } 16812027Sjungma@eit.uni-kl.de 16912027Sjungma@eit.uni-kl.de void operator() (bw_interface_type& s) 17012027Sjungma@eit.uni-kl.de { 17112027Sjungma@eit.uni-kl.de bind(s); 17212027Sjungma@eit.uni-kl.de } 17312027Sjungma@eit.uni-kl.de 17412027Sjungma@eit.uni-kl.de // Implementation of pure virtual functions of base class 17512027Sjungma@eit.uni-kl.de virtual sc_core::sc_port_b<FW_IF> & get_base_port() 17612027Sjungma@eit.uni-kl.de { return *this; } 17712027Sjungma@eit.uni-kl.de virtual sc_core::sc_port_b<FW_IF> const & get_base_port() const 17812027Sjungma@eit.uni-kl.de { return *this; } 17912027Sjungma@eit.uni-kl.de 18012027Sjungma@eit.uni-kl.de virtual BW_IF & get_base_interface() 18112027Sjungma@eit.uni-kl.de { return m_export; } 18212027Sjungma@eit.uni-kl.de virtual BW_IF const & get_base_interface() const 18312027Sjungma@eit.uni-kl.de#if !( defined(IEEE_1666_SYSTEMC) && IEEE_1666_SYSTEMC >= 201101L ) 18412027Sjungma@eit.uni-kl.de { return const_cast<export_type &>(m_export); } 18512027Sjungma@eit.uni-kl.de#else 18612027Sjungma@eit.uni-kl.de { return m_export; } 18712027Sjungma@eit.uni-kl.de#endif 18812027Sjungma@eit.uni-kl.de 18912027Sjungma@eit.uni-kl.de virtual sc_core::sc_export<BW_IF> & get_base_export() 19012027Sjungma@eit.uni-kl.de { return m_export; } 19112027Sjungma@eit.uni-kl.de virtual sc_core::sc_export<BW_IF> const & get_base_export() const 19212027Sjungma@eit.uni-kl.de { return m_export; } 19312027Sjungma@eit.uni-kl.de 19412027Sjungma@eit.uni-kl.deprotected: 19512027Sjungma@eit.uni-kl.de export_type m_export; 19612027Sjungma@eit.uni-kl.de}; 19712027Sjungma@eit.uni-kl.de 19812027Sjungma@eit.uni-kl.de// 19912027Sjungma@eit.uni-kl.de// Convenience socket classes 20012027Sjungma@eit.uni-kl.de// 20112027Sjungma@eit.uni-kl.de 20212027Sjungma@eit.uni-kl.detemplate <unsigned int BUSWIDTH = 32, 20312027Sjungma@eit.uni-kl.de typename TYPES = tlm_base_protocol_types, 20412027Sjungma@eit.uni-kl.de int N = 1 20512027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 20612027Sjungma@eit.uni-kl.de ,sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND 20712027Sjungma@eit.uni-kl.de#endif 20812027Sjungma@eit.uni-kl.de > 20912027Sjungma@eit.uni-kl.declass tlm_initiator_socket : 21012027Sjungma@eit.uni-kl.de public tlm_base_initiator_socket <BUSWIDTH, 21112027Sjungma@eit.uni-kl.de tlm_fw_transport_if<TYPES>, 21212027Sjungma@eit.uni-kl.de tlm_bw_transport_if<TYPES>, 21312027Sjungma@eit.uni-kl.de N 21412027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 21512027Sjungma@eit.uni-kl.de ,POL 21612027Sjungma@eit.uni-kl.de#endif 21712027Sjungma@eit.uni-kl.de > 21812027Sjungma@eit.uni-kl.de{ 21912027Sjungma@eit.uni-kl.depublic: 22012027Sjungma@eit.uni-kl.de tlm_initiator_socket() : 22112027Sjungma@eit.uni-kl.de tlm_base_initiator_socket<BUSWIDTH, 22212027Sjungma@eit.uni-kl.de tlm_fw_transport_if<TYPES>, 22312027Sjungma@eit.uni-kl.de tlm_bw_transport_if<TYPES>, 22412027Sjungma@eit.uni-kl.de N 22512027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 22612027Sjungma@eit.uni-kl.de ,POL 22712027Sjungma@eit.uni-kl.de#endif 22812027Sjungma@eit.uni-kl.de >() 22912027Sjungma@eit.uni-kl.de { 23012027Sjungma@eit.uni-kl.de } 23112027Sjungma@eit.uni-kl.de 23212027Sjungma@eit.uni-kl.de explicit tlm_initiator_socket(const char* name) : 23312027Sjungma@eit.uni-kl.de tlm_base_initiator_socket<BUSWIDTH, 23412027Sjungma@eit.uni-kl.de tlm_fw_transport_if<TYPES>, 23512027Sjungma@eit.uni-kl.de tlm_bw_transport_if<TYPES>, 23612027Sjungma@eit.uni-kl.de N 23712027Sjungma@eit.uni-kl.de#if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714) 23812027Sjungma@eit.uni-kl.de ,POL 23912027Sjungma@eit.uni-kl.de#endif 24012027Sjungma@eit.uni-kl.de >(name) 24112027Sjungma@eit.uni-kl.de { 24212027Sjungma@eit.uni-kl.de } 24312027Sjungma@eit.uni-kl.de 24412027Sjungma@eit.uni-kl.de virtual const char* kind() const 24512027Sjungma@eit.uni-kl.de { 24612027Sjungma@eit.uni-kl.de return "tlm_initiator_socket"; 24712027Sjungma@eit.uni-kl.de } 24812027Sjungma@eit.uni-kl.de}; 24912027Sjungma@eit.uni-kl.de 25012027Sjungma@eit.uni-kl.de} // namespace tlm 25112027Sjungma@eit.uni-kl.de 25212027Sjungma@eit.uni-kl.de#endif 253