gem5  v22.1.0.0
target_socket.hh
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4  more contributor license agreements. See the NOTICE file distributed
5  with this work for additional information regarding copyright ownership.
6  Accellera licenses this file to you under the Apache License, Version 2.0
7  (the "License"); you may not use this file except in compliance with the
8  License. You may obtain a copy of the License at
9 
10  http://www.apache.org/licenses/LICENSE-2.0
11 
12  Unless required by applicable law or agreed to in writing, software
13  distributed under the License is distributed on an "AS IS" BASIS,
14  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15  implied. See the License for the specific language governing
16  permissions and limitations under the License.
17 
18  *****************************************************************************/
19 
20 #ifndef __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__
21 #define __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__
22 
23 #include <typeindex>
24 
25 #include "../interfaces/fw_bw_ifs.hh"
26 #include "base_socket_if.hh"
27 
28 namespace tlm
29 {
30 
31 template <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
32  typename BW_IF=tlm_bw_transport_if<>>
34 {
35  public:
37 
40  virtual FW_IF &get_base_interface() = 0;
41 };
42 
43 template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF>
45 
46 template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N,
49 
50 template <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
51  typename BW_IF=tlm_bw_transport_if<>, int N=1,
52  sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
54  public tlm_base_socket_if,
55  public tlm_base_target_socket_b<BUSWIDTH, FW_IF, BW_IF>,
56  public sc_core::sc_export<FW_IF>
57 {
58  public:
59  typedef FW_IF fw_interface_type;
60  typedef BW_IF bw_interface_type;
62 
67 
70 
71  template <unsigned int, typename, typename, int, sc_core::sc_port_policy>
73 
74  public:
76  export_type(sc_core::sc_gen_unique_name("tlm_base_target_socket")),
77  m_port(sc_core::sc_gen_unique_name("tlm_base_target_socket_port"))
78  {}
79 
80  explicit tlm_base_target_socket(const char *name) :
82  (std::string(name) + "_port").c_str()))
83  {}
84 
85  virtual const char *kind() const { return "tlm_base_target_socket"; }
86 
87  //
88  // Bind target socket to initiator socket
89  // - Binds the port of the initiator socket to the export of the target
90  // socket
91  // - Binds the port of the target socket to the export of the initiator
92  // socket
93  //
94  virtual void
96  {
97  // initiator.port -> target.export
98  (s.get_base_port())(get_base_interface());
99  // target.port -> initiator.export
100  get_base_port()(s.get_base_interface());
101  }
102 
104 
105  //
106  // Bind target socket to target socket (hierarchical bind)
107  // - Binds both the export and the port
108  //
109  virtual void
111  {
112  // export
113  (get_base_export())(s.get_base_export());
114  // port
115  (s.get_base_port())(get_base_port());
116  }
117 
119 
120  //
121  // Bind interface to socket
122  // - Binds the interface to the export
123  //
124  virtual void
126  {
127  export_type *exp = &get_base_export();
128  if (this == exp) {
129  export_type::bind(ifs);
130  } else {
131  exp->bind( ifs );
132  }
133  }
134 
136 
137  //
138  // Forward to 'size()' of port class.
139  //
140  int size() const { return m_port.size(); }
141 
142  //
143  // Forward to 'operator->()' of port class.
144  //
145  bw_interface_type *operator->() { return m_port.operator->(); }
146 
147  //
148  // Forward to 'operator[]()' of port class.
149  //
150  bw_interface_type *operator[](int i) { return m_port.operator[](i); }
151 
152  // Implementation of tlm_base_socket_if functions.
154  virtual sc_core::sc_port_base const &
156  {
157  return m_port;
158  }
159  virtual sc_core::sc_export_base &get_export_base() { return *this; }
160  virtual sc_core::sc_export_base const &
162  {
163  return *this;
164  }
165  virtual unsigned int get_bus_width() const { return BUSWIDTH; }
166  virtual tlm_socket_category
168  {
169  return TLM_TARGET_SOCKET;
170  }
171 
172  // Implementation of tlm_base_target_socket_b functions
174  virtual sc_core::sc_port_b<BW_IF> const &
176  {
177  return m_port;
178  }
179 
180  virtual FW_IF &get_base_interface() { return *this; }
181  virtual FW_IF const &get_base_interface() const { return *this; }
182 
183  virtual sc_core::sc_export<FW_IF> &get_base_export() { return *this; }
184  virtual sc_core::sc_export<FW_IF> const &
186  {
187  return *this;
188  }
189 
190  protected:
192 };
193 
194 template <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types,
197  public tlm_base_target_socket<
198  BUSWIDTH, tlm_fw_transport_if<TYPES>,
199  tlm_bw_transport_if<TYPES>, N, POL>
200 {
201  public:
204  BUSWIDTH, tlm_fw_transport_if<TYPES>,
205  tlm_bw_transport_if<TYPES>, N, POL>()
206  {}
207 
208  explicit tlm_target_socket(const char *name) :
210  BUSWIDTH, tlm_fw_transport_if<TYPES>,
211  tlm_bw_transport_if<TYPES>, N, POL>(name)
212  {}
213 
214  virtual const char* kind() const { return "tlm_target_socket"; }
215 
216  virtual std::type_index
218  {
219  return typeid(TYPES);
220  }
221 };
222 
223 } // namespace tlm
224 
225 #endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_TARGET_SOCKET_HH__ */
virtual void bind(IF &i)
Definition: sc_export.hh:75
const char * name() const
Definition: sc_object.cc:44
int size() const
Definition: sc_port.cc:107
virtual sc_core::sc_export< FW_IF > & get_base_export()=0
virtual sc_core::sc_port_b< BW_IF > & get_base_port()=0
virtual FW_IF & get_base_interface()=0
tlm_base_initiator_socket_b< BUSWIDTH, fw_interface_type, bw_interface_type > base_initiator_socket_type
virtual sc_core::sc_port_base & get_port_base()
virtual void bind(base_initiator_socket_type &s)
virtual tlm_socket_category get_socket_category() const
virtual sc_core::sc_export_base & get_export_base()
virtual FW_IF const & get_base_interface() const
virtual FW_IF & get_base_interface()
tlm_base_target_socket(const char *name)
tlm_base_target_socket_b< BUSWIDTH, fw_interface_type, bw_interface_type > base_type
virtual void bind(base_type &s)
virtual sc_core::sc_export< FW_IF > const & get_base_export() const
virtual const char * kind() const
virtual sc_core::sc_port_b< BW_IF > & get_base_port()
virtual sc_core::sc_export_base const & get_export_base() const
virtual sc_core::sc_export< FW_IF > & get_base_export()
void operator()(base_initiator_socket_type &s)
virtual sc_core::sc_port_base const & get_port_base() const
bw_interface_type * operator[](int i)
virtual unsigned int get_bus_width() const
virtual sc_core::sc_port_b< BW_IF > const & get_base_port() const
bw_interface_type * operator->()
sc_core::sc_port< bw_interface_type, N, POL > port_type
sc_core::sc_export< fw_interface_type > export_type
virtual void bind(fw_interface_type &ifs)
virtual const char * kind() const
virtual std::type_index get_protocol_types() const
tlm_target_socket(const char *name)
Bitfield< 7 > i
Definition: misc_types.hh:67
Bitfield< 1 > s
Definition: pagetable.hh:64
sc_port_policy
Definition: sc_port.hh:68
@ SC_ONE_OR_MORE_BOUND
Definition: sc_port.hh:69
const char * sc_gen_unique_name(const char *seed)
Definition: sc_module.cc:820
Overload hash function for BasicBlockRange type.
Definition: misc.hh:2826
tlm_socket_category
@ TLM_TARGET_SOCKET

Generated on Wed Dec 21 2022 10:22:42 for gem5 by doxygen 1.9.1