target_socket.hh revision 13521
12689Sktlim@umich.edu/***************************************************************************** 28703Sandreas.hansson@arm.com 38666SPrakash.Ramrakhyani@arm.com Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 48666SPrakash.Ramrakhyani@arm.com more contributor license agreements. See the NOTICE file distributed 58666SPrakash.Ramrakhyani@arm.com with this work for additional information regarding copyright ownership. 68666SPrakash.Ramrakhyani@arm.com Accellera licenses this file to you under the Apache License, Version 2.0 78666SPrakash.Ramrakhyani@arm.com (the "License"); you may not use this file except in compliance with the 88666SPrakash.Ramrakhyani@arm.com License. You may obtain a copy of the License at 98666SPrakash.Ramrakhyani@arm.com 108666SPrakash.Ramrakhyani@arm.com http://www.apache.org/licenses/LICENSE-2.0 118666SPrakash.Ramrakhyani@arm.com 128666SPrakash.Ramrakhyani@arm.com Unless required by applicable law or agreed to in writing, software 138666SPrakash.Ramrakhyani@arm.com distributed under the License is distributed on an "AS IS" BASIS, 142689Sktlim@umich.edu WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 157897Shestness@cs.utexas.edu implied. See the License for the specific language governing 162689Sktlim@umich.edu permissions and limitations under the License. 172689Sktlim@umich.edu 182689Sktlim@umich.edu *****************************************************************************/ 192689Sktlim@umich.edu 202689Sktlim@umich.edu#ifndef __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__ 212689Sktlim@umich.edu#define __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__ 222689Sktlim@umich.edu 232689Sktlim@umich.edu#include "tlm_core/2/interfaces/fw_bw_ifs.hh" 242689Sktlim@umich.edu#include "tlm_core/2/sockets/base_socket_if.hh" 252689Sktlim@umich.edu 262689Sktlim@umich.edunamespace tlm 272689Sktlim@umich.edu{ 282689Sktlim@umich.edu 292689Sktlim@umich.edutemplate <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>, 302689Sktlim@umich.edu typename BW_IF=tlm_bw_transport_if<>> 312689Sktlim@umich.educlass tlm_base_target_socket_b 322689Sktlim@umich.edu{ 332689Sktlim@umich.edu public: 342689Sktlim@umich.edu virtual ~tlm_base_target_socket_b() {} 352689Sktlim@umich.edu 362689Sktlim@umich.edu virtual sc_core::sc_port_b<BW_IF> &get_base_port() = 0; 372689Sktlim@umich.edu virtual sc_core::sc_export<FW_IF> &get_base_export() = 0; 382689Sktlim@umich.edu virtual FW_IF &get_base_interface() = 0; 392689Sktlim@umich.edu}; 402689Sktlim@umich.edu 412689Sktlim@umich.edutemplate <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF> 422689Sktlim@umich.educlass tlm_base_initiator_socket_b; 432689Sktlim@umich.edu 442689Sktlim@umich.edutemplate <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N, 457897Shestness@cs.utexas.edu sc_core::sc_port_policy POL> 462689Sktlim@umich.educlass tlm_base_initiator_socket; 472689Sktlim@umich.edu 482521SN/Atemplate <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>, 493960Sgblack@eecs.umich.edu typename BW_IF=tlm_bw_transport_if<>, int N=1, 504194Ssaidi@eecs.umich.edu sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> 518769Sgblack@eecs.umich.educlass tlm_base_target_socket : 521070SN/A public tlm_base_socket_if, 531070SN/A public tlm_base_target_socket_b<BUSWIDTH, FW_IF, BW_IF>, 542521SN/A public sc_core::sc_export<FW_IF> 556658Snate@binkert.org{ 568229Snate@binkert.org public: 578232Snate@binkert.org typedef FW_IF fw_interface_type; 588666SPrakash.Ramrakhyani@arm.com typedef BW_IF bw_interface_type; 598769Sgblack@eecs.umich.edu typedef sc_core::sc_port<bw_interface_type, N, POL> port_type; 602522SN/A 618769Sgblack@eecs.umich.edu typedef sc_core::sc_export<fw_interface_type> export_type; 622037SN/A typedef tlm_base_initiator_socket_b< 638229Snate@binkert.org BUSWIDTH, fw_interface_type, bw_interface_type> 648769Sgblack@eecs.umich.edu base_initiator_socket_type; 6556SN/A 666658Snate@binkert.org typedef tlm_base_target_socket_b< 672SN/A BUSWIDTH, fw_interface_type, bw_interface_type> base_type; 682107SN/A 692SN/A template <unsigned int, typename, typename, int, sc_core::sc_port_policy> 702SN/A friend class tlm_base_initiator_socket; 712SN/A 722SN/A public: 732SN/A tlm_base_target_socket() : 741070SN/A export_type(sc_core::sc_gen_unique_name("tlm_base_target_socket")), 758703Sandreas.hansson@arm.com m_port(sc_core::sc_gen_unique_name("tlm_base_target_socket_port")) 768703Sandreas.hansson@arm.com {} 778826Snilay@cs.wisc.edu 782521SN/A explicit tlm_base_target_socket(const char *name) : 798852Sandreas.hansson@arm.com export_type(name), m_port(sc_core::sc_gen_unique_name( 808852Sandreas.hansson@arm.com (std::string(name) + "_port").c_str())) 817580SAli.Saidi@arm.com {} 827770SAli.Saidi@ARM.com 838931Sandreas.hansson@arm.com virtual const char *kind() const { return "tlm_base_target_socket"; } 847914SBrad.Beckmann@amd.com 857914SBrad.Beckmann@amd.com // 867914SBrad.Beckmann@amd.com // Bind target socket to initiator socket 878666SPrakash.Ramrakhyani@arm.com // - Binds the port of the initiator socket to the export of the target 887914SBrad.Beckmann@amd.com // socket 898666SPrakash.Ramrakhyani@arm.com // - Binds the port of the target socket to the export of the initiator 907897Shestness@cs.utexas.edu // socket 912SN/A // 921070SN/A virtual void 931070SN/A bind(base_initiator_socket_type &s) 941070SN/A { 958769Sgblack@eecs.umich.edu // initiator.port -> target.export 968769Sgblack@eecs.umich.edu (s.get_base_port())(get_base_interface()); 978769Sgblack@eecs.umich.edu // target.port -> initiator.export 988769Sgblack@eecs.umich.edu get_base_port()(s.get_base_interface()); 998666SPrakash.Ramrakhyani@arm.com } 1008832SAli.Saidi@ARM.com 1018832SAli.Saidi@ARM.com void operator () (base_initiator_socket_type &s) { bind(s); } 1028832SAli.Saidi@ARM.com 1038832SAli.Saidi@ARM.com // 1048832SAli.Saidi@ARM.com // Bind target socket to target socket (hierarchical bind) 1058832SAli.Saidi@ARM.com // - Binds both the export and the port 1068832SAli.Saidi@ARM.com // 1078832SAli.Saidi@ARM.com virtual void 1088832SAli.Saidi@ARM.com bind(base_type &s) 1098832SAli.Saidi@ARM.com { 1108885SAli.Saidi@ARM.com // export 1118885SAli.Saidi@ARM.com (get_base_export())(s.get_base_export()); 1128885SAli.Saidi@ARM.com // port 1138885SAli.Saidi@ARM.com (s.get_base_port())(get_base_port()); 1148885SAli.Saidi@ARM.com } 1158885SAli.Saidi@ARM.com 1168885SAli.Saidi@ARM.com void operator () (base_type &s) { bind(s); } 1178885SAli.Saidi@ARM.com 1188885SAli.Saidi@ARM.com // 1198885SAli.Saidi@ARM.com // Bind interface to socket 1208885SAli.Saidi@ARM.com // - Binds the interface to the export 1218885SAli.Saidi@ARM.com // 1228885SAli.Saidi@ARM.com virtual void 1238885SAli.Saidi@ARM.com bind(fw_interface_type &ifs) 1248885SAli.Saidi@ARM.com { 1258885SAli.Saidi@ARM.com export_type *exp = &get_base_export(); 1268885SAli.Saidi@ARM.com if (this == exp) { 1278885SAli.Saidi@ARM.com export_type::bind(ifs); 1288885SAli.Saidi@ARM.com } else { 1298885SAli.Saidi@ARM.com exp->bind( ifs ); 1308885SAli.Saidi@ARM.com } 1318885SAli.Saidi@ARM.com } 1328885SAli.Saidi@ARM.com 1338885SAli.Saidi@ARM.com void operator () (fw_interface_type &s) { bind(s); } 1348885SAli.Saidi@ARM.com 1358885SAli.Saidi@ARM.com // 1368885SAli.Saidi@ARM.com // Forward to 'size()' of port class. 1378885SAli.Saidi@ARM.com // 1388885SAli.Saidi@ARM.com int size() const { return m_port.size(); } 1398885SAli.Saidi@ARM.com 1408885SAli.Saidi@ARM.com // 1418885SAli.Saidi@ARM.com // Forward to 'operator->()' of port class. 1428885SAli.Saidi@ARM.com // 1438885SAli.Saidi@ARM.com bw_interface_type *operator->() { return m_port.operator->(); } 1448885SAli.Saidi@ARM.com 1458885SAli.Saidi@ARM.com // 1468885SAli.Saidi@ARM.com // Forward to 'operator[]()' of port class. 1478885SAli.Saidi@ARM.com // 1482SN/A bw_interface_type *operator[](int i) { return m_port.operator[](i); } 1492SN/A 1502SN/A // Implementation of tlm_base_socket_if functions. 1512SN/A virtual sc_core::sc_port_base &get_port_base() { return m_port; } 1521070SN/A virtual sc_core::sc_port_base const & 1531070SN/A get_port_base() const 1548666SPrakash.Ramrakhyani@arm.com { 1558666SPrakash.Ramrakhyani@arm.com return m_port; 1568666SPrakash.Ramrakhyani@arm.com } 1572SN/A virtual sc_core::sc_export_base &get_export_base() { return *this; } 1582SN/A virtual sc_core::sc_export_base const & 1598706Sandreas.hansson@arm.com get_export_base() const 1608706Sandreas.hansson@arm.com { 1618706Sandreas.hansson@arm.com return *this; 1628706Sandreas.hansson@arm.com } 1638706Sandreas.hansson@arm.com virtual unsigned int get_bus_width() const { return BUSWIDTH; } 1648706Sandreas.hansson@arm.com virtual tlm_socket_category 1658706Sandreas.hansson@arm.com get_socket_category() const 1668706Sandreas.hansson@arm.com { 1678922Swilliam.wang@arm.com return TLM_TARGET_SOCKET; 1688922Swilliam.wang@arm.com } 1698703Sandreas.hansson@arm.com 1708703Sandreas.hansson@arm.com // Implementation of tlm_base_target_socket_b functions 1718922Swilliam.wang@arm.com virtual sc_core::sc_port_b<BW_IF> &get_base_port() { return m_port; } 1728703Sandreas.hansson@arm.com virtual sc_core::sc_port_b<BW_IF> const & 1738703Sandreas.hansson@arm.com get_base_port() const 1742901Ssaidi@eecs.umich.edu { 1754762Snate@binkert.org return m_port; 1762901Ssaidi@eecs.umich.edu } 1772901Ssaidi@eecs.umich.edu 1782901Ssaidi@eecs.umich.edu virtual FW_IF &get_base_interface() { return *this; } 1792901Ssaidi@eecs.umich.edu virtual FW_IF const &get_base_interface() const { return *this; } 1802901Ssaidi@eecs.umich.edu 1813960Sgblack@eecs.umich.edu virtual sc_core::sc_export<FW_IF> &get_base_export() { return *this; } 1823960Sgblack@eecs.umich.edu virtual sc_core::sc_export<FW_IF> const & 1834095Sbinkertn@umich.edu get_base_export() const 1844095Sbinkertn@umich.edu { 1854095Sbinkertn@umich.edu return *this; 1863960Sgblack@eecs.umich.edu } 1873960Sgblack@eecs.umich.edu 1887445Ssteve.reinhardt@amd.com protected: 1897445Ssteve.reinhardt@amd.com port_type m_port; 1907445Ssteve.reinhardt@amd.com}; 1917445Ssteve.reinhardt@amd.com 1927445Ssteve.reinhardt@amd.comtemplate <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types, 1937445Ssteve.reinhardt@amd.com int N=1, sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> 1947445Ssteve.reinhardt@amd.comclass tlm_target_socket : 195180SN/A public tlm_base_target_socket< 1965718Shsul@eecs.umich.edu BUSWIDTH, tlm_fw_transport_if<TYPES>, 1972SN/A tlm_bw_transport_if<TYPES>, N, POL> 1985712Shsul@eecs.umich.edu{ 1995718Shsul@eecs.umich.edu public: 2005718Shsul@eecs.umich.edu tlm_target_socket() : 2015718Shsul@eecs.umich.edu tlm_base_target_socket< 2025718Shsul@eecs.umich.edu BUSWIDTH, tlm_fw_transport_if<TYPES>, 2035718Shsul@eecs.umich.edu tlm_bw_transport_if<TYPES>, N, POL>() 2045718Shsul@eecs.umich.edu {} 2055718Shsul@eecs.umich.edu 2065718Shsul@eecs.umich.edu explicit tlm_target_socket(const char *name) : 2075718Shsul@eecs.umich.edu tlm_base_target_socket< 2085718Shsul@eecs.umich.edu BUSWIDTH, tlm_fw_transport_if<TYPES>, 2095718Shsul@eecs.umich.edu tlm_bw_transport_if<TYPES>, N, POL>(name) 2105718Shsul@eecs.umich.edu {} 2111806SN/A 2121806SN/A virtual const char* kind() const { return "tlm_target_socket"; } 2132680Sktlim@umich.edu 2145823Ssaidi@eecs.umich.edu virtual sc_core::sc_type_index 2151806SN/A get_protocol_types() const 2162680Sktlim@umich.edu { 2175714Shsul@eecs.umich.edu return typeid(TYPES); 2181070SN/A } 2195512SMichael.Adler@intel.com}; 2207445Ssteve.reinhardt@amd.com 2214095Sbinkertn@umich.edu} // namespace tlm 2225512SMichael.Adler@intel.com 2234095Sbinkertn@umich.edu#endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__ */ 2247445Ssteve.reinhardt@amd.com