27 28namespace tlm 29{ 30 31template <unsigned int BUSWIDTH=32, 32 typename FW_IF=tlm_fw_transport_if<>, 33 typename BW_IF=tlm_bw_transport_if<>> 34class tlm_base_initiator_socket_b 35{ 36 public: 37 virtual ~tlm_base_initiator_socket_b() {} 38 39 virtual sc_core::sc_port_b<FW_IF> &get_base_port() = 0; 40 virtual sc_core::sc_port_b<FW_IF> const &get_base_port() const = 0; 41 virtual BW_IF &get_base_interface() = 0; 42 virtual BW_IF const &get_base_interface() const = 0; 43 virtual sc_core::sc_export<BW_IF> &get_base_export() = 0; 44 virtual sc_core::sc_export<BW_IF> const &get_base_export() const = 0; 45}; 46 47template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF> 48class tlm_base_target_socket_b; 49 50template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N, 51 sc_core::sc_port_policy POL> 52class tlm_base_target_socket; 53 54template <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>, 55 typename BW_IF=tlm_bw_transport_if<>, int N=1, 56 sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> 57class tlm_base_initiator_socket : 58 public tlm_base_socket_if, 59 public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>, 60 public sc_core::sc_port<FW_IF, N, POL> 61{ 62 public: 63 typedef FW_IF fw_interface_type; 64 typedef BW_IF bw_interface_type; 65 typedef sc_core::sc_port<fw_interface_type, N, POL> port_type; 66 67 typedef sc_core::sc_export<bw_interface_type> export_type; 68 69 typedef tlm_base_target_socket_b< 70 BUSWIDTH, fw_interface_type, bw_interface_type> 71 base_target_socket_type; 72 typedef tlm_base_initiator_socket_b< 73 BUSWIDTH, fw_interface_type, bw_interface_type> base_type; 74 75 template <unsigned int, typename, typename, int, sc_core::sc_port_policy> 76 friend class tlm_base_target_socket; 77 78 public: 79 tlm_base_initiator_socket() : 80 port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket")), 81 m_export(sc_core::sc_gen_unique_name( 82 "tlm_base_initiator_socket_export")) 83 {} 84 85 explicit tlm_base_initiator_socket(const char *name) : port_type(name), 86 m_export(sc_core::sc_gen_unique_name( 87 (std::string(name) + "_export").c_str())) 88 {} 89 90 virtual const char* kind() const { return "tlm_base_initiator_socket"; } 91 92 // 93 // Bind initiator socket to target socket 94 // - Binds the port of the initiator socket to the export of the target 95 // socket 96 // - Binds the port of the target socket to the export of the initiator 97 // socket 98 // 99 virtual void 100 bind(base_target_socket_type &s) 101 { 102 // initiator.port -> target.export 103 (get_base_port())(s.get_base_interface()); 104 // target.port -> initiator.export 105 (s.get_base_port())(get_base_interface()); 106 } 107 108 void operator () (base_target_socket_type &s) { bind(s); } 109 110 // 111 // Bind initiator socket to initiator socket (hierarchical bind) 112 // - Binds both the export and the port 113 // 114 virtual void 115 bind(base_type &s) 116 { 117 // port 118 (get_base_port())(s.get_base_port()); 119 // export 120 (s.get_base_export())(get_base_export()); 121 } 122 123 void operator() (base_type &s) { bind(s); } 124 125 // 126 // Bind interface to socket 127 // - Binds the interface to the export of this socket 128 // 129 virtual void bind(bw_interface_type &ifs) { (get_base_export())(ifs); } 130 void operator() (bw_interface_type &s) { bind(s); } 131 132 // Implementation of tlm_base_socket_if functions 133 virtual sc_core::sc_port_base &get_port_base() { return *this; } 134 virtual sc_core::sc_port_base const & 135 get_port_base() const 136 { 137 return *this; 138 } 139 virtual sc_core::sc_export_base &get_export_base() { return m_export; } 140 virtual sc_core::sc_export_base const & 141 get_export_base() const 142 { 143 return m_export; 144 } 145 virtual unsigned int get_bus_width() const { return BUSWIDTH; } 146 virtual tlm_socket_category 147 get_socket_category() const 148 { 149 return TLM_INITIATOR_SOCKET; 150 } 151 152 // Implementation of tlm_base_target_socket_b functions 153 virtual sc_core::sc_port_b<FW_IF> &get_base_port() { return *this; } 154 virtual sc_core::sc_port_b<FW_IF> const & 155 get_base_port() const 156 { 157 return *this; 158 } 159 160 virtual BW_IF &get_base_interface() { return m_export; } 161 virtual BW_IF const &get_base_interface() const { return m_export; } 162 163 virtual sc_core::sc_export<BW_IF> &get_base_export() { return m_export; } 164 virtual sc_core::sc_export<BW_IF> const & 165 get_base_export() const 166 { 167 return m_export; 168 } 169 170 protected: 171 export_type m_export; 172}; 173 174// 175// Convenience socket classes 176// 177 178template <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types, 179 int N=1, sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> 180class tlm_initiator_socket : public tlm_base_initiator_socket< 181 BUSWIDTH, tlm_fw_transport_if<TYPES>, 182 tlm_bw_transport_if<TYPES>, N, POL> 183{ 184 public: 185 tlm_initiator_socket() : tlm_base_initiator_socket< 186 BUSWIDTH, tlm_fw_transport_if<TYPES>, 187 tlm_bw_transport_if<TYPES>, N, POL>() 188 {} 189 190 explicit tlm_initiator_socket(const char *name) : 191 tlm_base_initiator_socket<BUSWIDTH, tlm_fw_transport_if<TYPES>, 192 tlm_bw_transport_if<TYPES>, N, POL>(name) 193 {} 194 195 virtual const char *kind() const { return "tlm_initiator_socket"; } 196 197 virtual std::type_index 198 get_protocol_types() const 199 { 200 return typeid(TYPES); 201 } 202}; 203 204} // namespace tlm 205 206#endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ */
|