gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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<>>
33 class tlm_base_target_socket_b
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 
65  BUSWIDTH, fw_interface_type, bw_interface_type>
67 
69  BUSWIDTH, fw_interface_type, bw_interface_type> base_type;
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) :
81  export_type(name), m_port(sc_core::sc_gen_unique_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
99  // target.port -> initiator.export
101  }
102 
103  void operator () (base_initiator_socket_type &s) { bind(s); }
104 
105  //
106  // Bind target socket to target socket (hierarchical bind)
107  // - Binds both the export and the port
108  //
109  virtual void
110  bind(base_type &s)
111  {
112  // export
114  // port
115  (s.get_base_port())(get_base_port());
116  }
117 
118  void operator () (base_type &s) { bind(s); }
119 
120  //
121  // Bind interface to socket
122  // - Binds the interface to the export
123  //
124  virtual void
125  bind(fw_interface_type &ifs)
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 
135  void operator () (fw_interface_type &s) { bind(s); }
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.
153  virtual sc_core::sc_port_base &get_port_base() { return m_port; }
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
173  virtual sc_core::sc_port_b<BW_IF> &get_base_port() { return m_port; }
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:
191  port_type m_port;
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 sc_core::sc_port_b< BW_IF > & get_base_port()=0
virtual const char * kind() const
virtual void bind(fw_interface_type &ifs)
virtual unsigned int get_bus_width() const
const std::string & name()
Definition: trace.cc:54
Bitfield< 7 > i
virtual sc_core::sc_port_b< BW_IF > & get_base_port()
sc_core::sc_port< bw_interface_type, N, POL > port_type
const char * sc_gen_unique_name(const char *seed)
Definition: sc_module.cc:822
virtual sc_core::sc_export_base const & get_export_base() const
Overload hash function for BasicBlockRange type.
Definition: vec_reg.hh:586
tlm_target_socket(const char *name)
virtual sc_core::sc_port_b< BW_IF > const & get_base_port() const
sc_core::sc_export< fw_interface_type > export_type
virtual void bind(base_initiator_socket_type &s)
Bitfield< 4 > s
tlm_base_target_socket_b< BUSWIDTH, fw_interface_type, bw_interface_type > base_type
virtual FW_IF const & get_base_interface() const
virtual sc_core::sc_export< FW_IF > & get_base_export()=0
virtual sc_core::sc_export_base & get_export_base()
virtual const char * kind() const
virtual FW_IF & get_base_interface()
virtual std::type_index get_protocol_types() const
virtual tlm_socket_category get_socket_category() const
virtual sc_core::sc_export< FW_IF > & get_base_export()
sc_port_policy
Definition: sc_port.hh:69
tlm_base_initiator_socket_b< BUSWIDTH, fw_interface_type, bw_interface_type > base_initiator_socket_type
bw_interface_type * operator->()
virtual void bind(base_type &s)
virtual sc_core::sc_port_base const & get_port_base() const
virtual BW_IF & get_base_interface()=0
virtual sc_core::sc_port_base & get_port_base()
virtual sc_core::sc_port_b< FW_IF > & get_base_port()=0
virtual FW_IF & get_base_interface()=0
bw_interface_type * operator[](int i)
virtual void bind(IF &i)
Definition: sc_export.hh:77
virtual sc_core::sc_export< FW_IF > const & get_base_export() const
tlm_socket_category
tlm_base_target_socket(const char *name)

Generated on Fri Feb 28 2020 16:27:04 for gem5 by doxygen 1.8.13