gem5  v22.1.0.0
initiator_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_INITIATOR_SOCKET_HH__
21 #define __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_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,
32  typename FW_IF=tlm_fw_transport_if<>,
33  typename BW_IF=tlm_bw_transport_if<>>
35 {
36  public:
38 
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;
44  virtual sc_core::sc_export<BW_IF> const &get_base_export() const = 0;
45 };
46 
47 template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF>
49 
50 template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N,
53 
54 // The overloaded virtual is intended in SystemC, so we'll disable the warning.
55 // Please check section 9.3 of SystemC 2.3.1 release note for more details.
56 #pragma GCC diagnostic push
57 #pragma GCC diagnostic ignored "-Woverloaded-virtual"
58 template <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
59  typename BW_IF=tlm_bw_transport_if<>, int N=1,
60  sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
62  public tlm_base_socket_if,
63  public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>,
64  public sc_core::sc_port<FW_IF, N, POL>
65 {
66  public:
67  typedef FW_IF fw_interface_type;
68  typedef BW_IF bw_interface_type;
70 
72 
78 
79  template <unsigned int, typename, typename, int, sc_core::sc_port_policy>
80  friend class tlm_base_target_socket;
81 
82  public:
84  port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket")),
86  "tlm_base_initiator_socket_export"))
87  {}
88 
89  explicit tlm_base_initiator_socket(const char *name) : port_type(name),
91  (std::string(name) + "_export").c_str()))
92  {}
93 
94  virtual const char* kind() const { return "tlm_base_initiator_socket"; }
95 
96  //
97  // Bind initiator socket to target socket
98  // - Binds the port of the initiator socket to the export of the target
99  // socket
100  // - Binds the port of the target socket to the export of the initiator
101  // socket
102  //
103  virtual void
105  {
106  // initiator.port -> target.export
107  (get_base_port())(s.get_base_interface());
108  // target.port -> initiator.export
109  (s.get_base_port())(get_base_interface());
110  }
111 
113 
114  //
115  // Bind initiator socket to initiator socket (hierarchical bind)
116  // - Binds both the export and the port
117  //
118  virtual void
120  {
121  // port
122  (get_base_port())(s.get_base_port());
123  // export
124  (s.get_base_export())(get_base_export());
125  }
126 
127  void operator() (base_type &s) { bind(s); }
128 
129  //
130  // Bind interface to socket
131  // - Binds the interface to the export of this socket
132  //
133  virtual void bind(bw_interface_type &ifs) { (get_base_export())(ifs); }
135 
136  // Implementation of tlm_base_socket_if functions
137  virtual sc_core::sc_port_base &get_port_base() { return *this; }
138  virtual sc_core::sc_port_base const &
140  {
141  return *this;
142  }
144  virtual sc_core::sc_export_base const &
146  {
147  return m_export;
148  }
149  virtual unsigned int get_bus_width() const { return BUSWIDTH; }
150  virtual tlm_socket_category
152  {
153  return TLM_INITIATOR_SOCKET;
154  }
155 
156  // Implementation of tlm_base_target_socket_b functions
157  virtual sc_core::sc_port_b<FW_IF> &get_base_port() { return *this; }
158  virtual sc_core::sc_port_b<FW_IF> const &
160  {
161  return *this;
162  }
163 
164  virtual BW_IF &get_base_interface() { return m_export; }
165  virtual BW_IF const &get_base_interface() const { return m_export; }
166 
168  virtual sc_core::sc_export<BW_IF> const &
170  {
171  return m_export;
172  }
173 
174  protected:
176 };
177 #pragma GCC diagnostic pop
178 
179 //
180 // Convenience socket classes
181 //
182 
183 template <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types,
186  BUSWIDTH, tlm_fw_transport_if<TYPES>,
187  tlm_bw_transport_if<TYPES>, N, POL>
188 {
189  public:
191  BUSWIDTH, tlm_fw_transport_if<TYPES>,
192  tlm_bw_transport_if<TYPES>, N, POL>()
193  {}
194 
195  explicit tlm_initiator_socket(const char *name) :
197  tlm_bw_transport_if<TYPES>, N, POL>(name)
198  {}
199 
200  virtual const char *kind() const { return "tlm_initiator_socket"; }
201 
202  virtual std::type_index
204  {
205  return typeid(TYPES);
206  }
207 };
208 
209 } // namespace tlm
210 
211 #endif /* __SYSTEMC_EXT_TLM_CORE_2_SOCKETS_INITIATOR_SOCKET_HH__ */
const char * name() const
Definition: sc_object.cc:44
virtual sc_core::sc_port_b< FW_IF > & get_base_port()=0
virtual sc_core::sc_port_b< FW_IF > const & get_base_port() const =0
virtual BW_IF const & get_base_interface() const =0
virtual sc_core::sc_export< BW_IF > & get_base_export()=0
virtual BW_IF & get_base_interface()=0
virtual sc_core::sc_export< BW_IF > const & get_base_export() const =0
virtual sc_core::sc_export< BW_IF > & get_base_export()
virtual sc_core::sc_export_base & get_export_base()
virtual void bind(base_type &s)
sc_core::sc_export< bw_interface_type > export_type
tlm_base_initiator_socket_b< BUSWIDTH, fw_interface_type, bw_interface_type > base_type
tlm_base_initiator_socket(const char *name)
virtual BW_IF const & get_base_interface() const
virtual const char * kind() const
virtual void bind(base_target_socket_type &s)
virtual sc_core::sc_export_base const & get_export_base() const
virtual void bind(bw_interface_type &ifs)
sc_core::sc_port< fw_interface_type, N, POL > port_type
tlm_base_target_socket_b< BUSWIDTH, fw_interface_type, bw_interface_type > base_target_socket_type
virtual sc_core::sc_port_b< FW_IF > const & get_base_port() const
virtual sc_core::sc_port_base const & get_port_base() const
virtual unsigned int get_bus_width() const
virtual sc_core::sc_port_base & get_port_base()
virtual sc_core::sc_port_b< FW_IF > & get_base_port()
virtual tlm_socket_category get_socket_category() const
virtual sc_core::sc_export< BW_IF > const & get_base_export() const
void operator()(base_target_socket_type &s)
tlm_initiator_socket(const char *name)
virtual std::type_index get_protocol_types() const
virtual const char * kind() const
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_INITIATOR_SOCKET

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