initiator_socket.hh revision 13523
12SN/A/***************************************************************************** 21762SN/A 32SN/A Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 42SN/A more contributor license agreements. See the NOTICE file distributed 52SN/A with this work for additional information regarding copyright ownership. 62SN/A Accellera licenses this file to you under the Apache License, Version 2.0 72SN/A (the "License"); you may not use this file except in compliance with the 82SN/A License. You may obtain a copy of the License at 92SN/A 102SN/A http://www.apache.org/licenses/LICENSE-2.0 112SN/A 122SN/A Unless required by applicable law or agreed to in writing, software 132SN/A distributed under the License is distributed on an "AS IS" BASIS, 142SN/A WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 152SN/A implied. See the License for the specific language governing 162SN/A permissions and limitations under the License. 172SN/A 182SN/A *****************************************************************************/ 192SN/A 202SN/A#ifndef __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ 212SN/A#define __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ 222SN/A 232SN/A#include <typeindex> 242SN/A 252SN/A#include "tlm_core/2/interfaces/fw_bw_ifs.hh" 262SN/A#include "tlm_core/2/sockets/base_socket_if.hh" 272665SN/A 282665SN/Anamespace tlm 292SN/A{ 302SN/A 312SN/Atemplate <unsigned int BUSWIDTH=32, 322SN/A typename FW_IF=tlm_fw_transport_if<>, 336214Snate@binkert.org typename BW_IF=tlm_bw_transport_if<>> 342SN/Aclass tlm_base_initiator_socket_b 352SN/A{ 362SN/A public: 376214Snate@binkert.org virtual ~tlm_base_initiator_socket_b() {} 386214Snate@binkert.org 392SN/A virtual sc_core::sc_port_b<FW_IF> &get_base_port() = 0; 402SN/A virtual sc_core::sc_port_b<FW_IF> const &get_base_port() const = 0; 412SN/A virtual BW_IF &get_base_interface() = 0; 429180Sandreas.hansson@arm.com virtual BW_IF const &get_base_interface() const = 0; 4310474Sandreas.hansson@arm.com virtual sc_core::sc_export<BW_IF> &get_base_export() = 0; 449500Snilay@cs.wisc.edu virtual sc_core::sc_export<BW_IF> const &get_base_export() const = 0; 4511004SAndreas.Sandberg@ARM.com}; 469180Sandreas.hansson@arm.com 4710276SAndreas.Sandberg@ARM.comtemplate <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF> 4810276SAndreas.Sandberg@ARM.comclass tlm_base_target_socket_b; 492SN/A 505543SN/Atemplate <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N, 512SN/A sc_core::sc_port_policy POL> 525543SN/Aclass tlm_base_target_socket; 532SN/A 542SN/Atemplate <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>, 552SN/A typename BW_IF=tlm_bw_transport_if<>, int N=1, 562SN/A sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> 572SN/Aclass tlm_base_initiator_socket : 582SN/A public tlm_base_socket_if, 592SN/A public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>, 602SN/A public sc_core::sc_port<FW_IF, N, POL> 619158Sandreas.hansson@arm.com{ 622SN/A public: 639158Sandreas.hansson@arm.com typedef FW_IF fw_interface_type; 642SN/A typedef BW_IF bw_interface_type; 659158Sandreas.hansson@arm.com typedef sc_core::sc_port<fw_interface_type, N, POL> port_type; 662667SN/A 672130SN/A typedef sc_core::sc_export<bw_interface_type> export_type; 689180Sandreas.hansson@arm.com 699180Sandreas.hansson@arm.com typedef tlm_base_target_socket_b< 709180Sandreas.hansson@arm.com BUSWIDTH, fw_interface_type, bw_interface_type> 719180Sandreas.hansson@arm.com base_target_socket_type; 729180Sandreas.hansson@arm.com typedef tlm_base_initiator_socket_b< 739180Sandreas.hansson@arm.com BUSWIDTH, fw_interface_type, bw_interface_type> base_type; 749180Sandreas.hansson@arm.com 759180Sandreas.hansson@arm.com template <unsigned int, typename, typename, int, sc_core::sc_port_policy> 769180Sandreas.hansson@arm.com friend class tlm_base_target_socket; 779180Sandreas.hansson@arm.com 789180Sandreas.hansson@arm.com public: 799180Sandreas.hansson@arm.com tlm_base_initiator_socket() : 809180Sandreas.hansson@arm.com port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket")), 819180Sandreas.hansson@arm.com m_export(sc_core::sc_gen_unique_name( 829180Sandreas.hansson@arm.com "tlm_base_initiator_socket_export")) 839180Sandreas.hansson@arm.com {} 849180Sandreas.hansson@arm.com 859180Sandreas.hansson@arm.com explicit tlm_base_initiator_socket(const char *name) : port_type(name), 869180Sandreas.hansson@arm.com m_export(sc_core::sc_gen_unique_name( 879180Sandreas.hansson@arm.com (std::string(name) + "_export").c_str())) 889180Sandreas.hansson@arm.com {} 899180Sandreas.hansson@arm.com 909180Sandreas.hansson@arm.com virtual const char* kind() const { return "tlm_base_initiator_socket"; } 919180Sandreas.hansson@arm.com 929180Sandreas.hansson@arm.com // 939180Sandreas.hansson@arm.com // Bind initiator socket to target socket 9411004SAndreas.Sandberg@ARM.com // - Binds the port of the initiator socket to the export of the target 959180Sandreas.hansson@arm.com // socket 9611004SAndreas.Sandberg@ARM.com // - Binds the port of the target socket to the export of the initiator 9711004SAndreas.Sandberg@ARM.com // socket 989180Sandreas.hansson@arm.com // 9911004SAndreas.Sandberg@ARM.com virtual void 1009180Sandreas.hansson@arm.com bind(base_target_socket_type &s) 1019184Sandreas.hansson@arm.com { 1029184Sandreas.hansson@arm.com // initiator.port -> target.export 1039184Sandreas.hansson@arm.com (get_base_port())(s.get_base_interface()); 1049180Sandreas.hansson@arm.com // target.port -> initiator.export 1059180Sandreas.hansson@arm.com (s.get_base_port())(get_base_interface()); 1069180Sandreas.hansson@arm.com } 10711004SAndreas.Sandberg@ARM.com 1089180Sandreas.hansson@arm.com void operator () (base_target_socket_type &s) { bind(s); } 1099180Sandreas.hansson@arm.com 1109180Sandreas.hansson@arm.com // 1119180Sandreas.hansson@arm.com // Bind initiator socket to initiator socket (hierarchical bind) 1129180Sandreas.hansson@arm.com // - Binds both the export and the port 1139180Sandreas.hansson@arm.com // 1149180Sandreas.hansson@arm.com virtual void 1159180Sandreas.hansson@arm.com bind(base_type &s) 1169180Sandreas.hansson@arm.com { 1179180Sandreas.hansson@arm.com // port 11811004SAndreas.Sandberg@ARM.com (get_base_port())(s.get_base_port()); 1199180Sandreas.hansson@arm.com // export 1209180Sandreas.hansson@arm.com (s.get_base_export())(get_base_export()); 1219180Sandreas.hansson@arm.com } 12211004SAndreas.Sandberg@ARM.com 1239180Sandreas.hansson@arm.com void operator() (base_type &s) { bind(s); } 1249180Sandreas.hansson@arm.com 12511004SAndreas.Sandberg@ARM.com // 1269498Snilay@cs.wisc.edu // Bind interface to socket 1279498Snilay@cs.wisc.edu // - Binds the interface to the export of this socket 12811004SAndreas.Sandberg@ARM.com // 12911004SAndreas.Sandberg@ARM.com virtual void bind(bw_interface_type &ifs) { (get_base_export())(ifs); } 13011004SAndreas.Sandberg@ARM.com void operator() (bw_interface_type &s) { bind(s); } 13111004SAndreas.Sandberg@ARM.com 13211004SAndreas.Sandberg@ARM.com // Implementation of tlm_base_socket_if functions 1339498Snilay@cs.wisc.edu virtual sc_core::sc_port_base &get_port_base() { return *this; } 13411004SAndreas.Sandberg@ARM.com virtual sc_core::sc_port_base const & 1359498Snilay@cs.wisc.edu get_port_base() const 1369498Snilay@cs.wisc.edu { 13711004SAndreas.Sandberg@ARM.com return *this; 1389498Snilay@cs.wisc.edu } 1399498Snilay@cs.wisc.edu virtual sc_core::sc_export_base &get_export_base() { return m_export; } 1409500Snilay@cs.wisc.edu virtual sc_core::sc_export_base const & 1419500Snilay@cs.wisc.edu get_export_base() const 1429180Sandreas.hansson@arm.com { 1439180Sandreas.hansson@arm.com return m_export; 1449180Sandreas.hansson@arm.com } 1459180Sandreas.hansson@arm.com virtual unsigned int get_bus_width() const { return BUSWIDTH; } 1469180Sandreas.hansson@arm.com virtual tlm_socket_category 1472130SN/A get_socket_category() const 1482130SN/A { 1492130SN/A return TLM_INITIATOR_SOCKET; 1502130SN/A } 1512130SN/A 1522130SN/A // Implementation of tlm_base_target_socket_b functions 1532130SN/A virtual sc_core::sc_port_b<FW_IF> &get_base_port() { return *this; } 1547720Sgblack@eecs.umich.edu virtual sc_core::sc_port_b<FW_IF> const & 1557720Sgblack@eecs.umich.edu get_base_port() const 1567720Sgblack@eecs.umich.edu { 1577720Sgblack@eecs.umich.edu return *this; 1587720Sgblack@eecs.umich.edu } 1597720Sgblack@eecs.umich.edu 1607720Sgblack@eecs.umich.edu virtual BW_IF &get_base_interface() { return m_export; } 1617720Sgblack@eecs.umich.edu virtual BW_IF const &get_base_interface() const { return m_export; } 1627720Sgblack@eecs.umich.edu 1637720Sgblack@eecs.umich.edu virtual sc_core::sc_export<BW_IF> &get_base_export() { return m_export; } 1647720Sgblack@eecs.umich.edu virtual sc_core::sc_export<BW_IF> const & 1657720Sgblack@eecs.umich.edu get_base_export() const 1667720Sgblack@eecs.umich.edu { 1677720Sgblack@eecs.umich.edu return m_export; 1687720Sgblack@eecs.umich.edu } 1697720Sgblack@eecs.umich.edu 1707720Sgblack@eecs.umich.edu protected: 1717720Sgblack@eecs.umich.edu export_type m_export; 1727720Sgblack@eecs.umich.edu}; 1737720Sgblack@eecs.umich.edu 1747720Sgblack@eecs.umich.edu// 1757720Sgblack@eecs.umich.edu// Convenience socket classes 1762438SN/A// 1772438SN/A 1786221Snate@binkert.orgtemplate <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types, 1796221Snate@binkert.org int N=1, sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> 1806221Snate@binkert.orgclass tlm_initiator_socket : public tlm_base_initiator_socket< 1816221Snate@binkert.org BUSWIDTH, tlm_fw_transport_if<TYPES>, 1826221Snate@binkert.org tlm_bw_transport_if<TYPES>, N, POL> 1836221Snate@binkert.org{ 1849031Sandreas.hansson@arm.com public: 1859031Sandreas.hansson@arm.com tlm_initiator_socket() : tlm_base_initiator_socket< 1869031Sandreas.hansson@arm.com BUSWIDTH, tlm_fw_transport_if<TYPES>, 1879031Sandreas.hansson@arm.com tlm_bw_transport_if<TYPES>, N, POL>() 1889031Sandreas.hansson@arm.com {} 1899031Sandreas.hansson@arm.com 1907678Sgblack@eecs.umich.edu explicit tlm_initiator_socket(const char *name) : 19110474Sandreas.hansson@arm.com tlm_base_initiator_socket<BUSWIDTH, tlm_fw_transport_if<TYPES>, 19210474Sandreas.hansson@arm.com tlm_bw_transport_if<TYPES>, N, POL>(name) 19310474Sandreas.hansson@arm.com {} 19410474Sandreas.hansson@arm.com 19510474Sandreas.hansson@arm.com virtual const char *kind() const { return "tlm_initiator_socket"; } 19610474Sandreas.hansson@arm.com 19710474Sandreas.hansson@arm.com virtual std::type_index 1987678Sgblack@eecs.umich.edu get_protocol_types() const 19910839Sandreas.sandberg@arm.com { 20010839Sandreas.sandberg@arm.com return typeid(TYPES); 20110839Sandreas.sandberg@arm.com } 20210839Sandreas.sandberg@arm.com}; 20310839Sandreas.sandberg@arm.com 2046214Snate@binkert.org} // namespace tlm 205 206#endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ */ 207