gem5  v21.2.0.0
sc_port.hh
Go to the documentation of this file.
1 /*
2  * Copyright 2018 Google, Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met: redistributions of source code must retain the above copyright
7  * notice, this list of conditions and the following disclaimer;
8  * redistributions in binary form must reproduce the above copyright
9  * notice, this list of conditions and the following disclaimer in the
10  * documentation and/or other materials provided with the distribution;
11  * neither the name of the copyright holders nor the names of its
12  * contributors may be used to endorse or promote products derived from
13  * this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef __SYSTEMC_EXT_CORE_SC_PORT_HH__
29 #define __SYSTEMC_EXT_CORE_SC_PORT_HH__
30 
31 #include <typeinfo>
32 #include <vector>
33 
34 #include "../channel/messages.hh"
35 #include "../utils/sc_report_handler.hh"
36 #include "sc_module.hh" // for sc_gen_unique_name
37 #include "sc_object.hh"
38 
39 namespace sc_gem5
40 {
41 
42 class Port;
43 
44 };
45 
46 namespace sc_core
47 {
48 
49 class sc_interface;
50 class sc_trace_file;
51 
52 // Nonstandard
53 // Despite having a warning "FOR INTERNAL USE ONLY!" in all caps above this
54 // class definition in the Accellera implementation, it appears in their
55 // examples and test programs, and so we need to have it here as well.
57 {
59  std::string name;
60 
61  sc_trace_params(sc_trace_file *tf, const std::string &name) :
62  tf(tf), name(name)
63  {}
64 };
66 
68 {
72 };
73 
74 class sc_port_base : public sc_object
75 {
76  public:
77  sc_port_base(const char *name, int n, sc_port_policy p);
78  virtual ~sc_port_base();
79 
80  void warn_port_constructor() const;
81 
82  int maxSize() const;
83  int size() const;
84 
85  const char *kind() const { return "sc_port_base"; }
86 
87  protected:
88  // Implementation defined, but depended on by the tests.
89  void bind(sc_interface &);
90  void bind(sc_port_base &);
91 
92  friend class ::sc_gem5::Module;
93 
94  // Implementation defined, but depended on by the tests.
95  virtual int vbind(sc_interface &) = 0;
96  virtual int vbind(sc_port_base &) = 0;
97 
98  virtual void before_end_of_elaboration() = 0;
99  virtual void end_of_elaboration() = 0;
100  virtual void start_of_simulation() = 0;
101  virtual void end_of_simulation() = 0;
102 
103  void report_error(const char *id, const char *add_msg) const;
104 
105  private:
106  friend class ::sc_gem5::Port;
107  friend class ::sc_gem5::Kernel;
108 
109  virtual sc_interface *_gem5Interface(int n) const = 0;
110  virtual void _gem5AddInterface(sc_interface *i) = 0;
111 
113  virtual const char *_ifTypeName() const = 0;
114  virtual sc_port_policy _portPolicy() const = 0;
115 };
116 
117 template <class IF>
118 class sc_port_b : public sc_port_base
119 {
120  public:
121  void operator () (IF &i) { bind(i); }
123 
124  virtual void bind(IF &i) { sc_port_base::bind(i); }
125  virtual void bind(sc_port_b<IF> &p) { sc_port_base::bind(p); }
126 
127  IF *
129  {
130  if (_interfaces.empty()) {
131  report_error(SC_ID_GET_IF_, "port is not bound");
132  sc_abort();
133  }
134  return _interfaces[0];
135  }
136  const IF *
137  operator -> () const
138  {
139  if (_interfaces.empty()) {
140  report_error(SC_ID_GET_IF_, "port is not bound");
141  sc_abort();
142  }
143  return _interfaces[0];
144  }
145 
146  IF *
148  {
149  if (n < 0 || n >= size()) {
150  report_error(SC_ID_GET_IF_, "index out of range");
151  return NULL;
152  }
153  return _interfaces[n];
154  }
155  const IF *
156  operator [] (int n) const
157  {
158  if (n < 0 || n >= size()) {
159  report_error(SC_ID_GET_IF_, "index out of range");
160  return NULL;
161  }
162  return _interfaces[n];
163  }
164 
165  sc_interface *
167  {
168  if (_interfaces.empty())
169  return NULL;
170  return _interfaces[0];
171  }
172  const sc_interface *
174  {
175  if (_interfaces.empty())
176  return NULL;
177  return _interfaces[0];
178  }
179 
180  protected:
181  void before_end_of_elaboration() override {}
182  void end_of_elaboration() override {}
183  void start_of_simulation() override {}
184  void end_of_simulation() override {}
185 
186  explicit sc_port_b(int n, sc_port_policy p) :
188  {}
189  sc_port_b(const char *name, int n, sc_port_policy p) :
190  sc_port_base(name, n, p)
191  {}
192  virtual ~sc_port_b() {}
193 
194  // Implementation defined, but depended on by the tests.
195  int
196  vbind(sc_interface &i) override
197  {
198  IF *interface = dynamic_cast<IF *>(&i);
199  if (!interface)
200  return 2;
201  sc_port_base::bind(*interface);
202  return 0;
203  }
204  int
205  vbind(sc_port_base &pb) override
206  {
207  sc_port_b<IF> *p = dynamic_cast<sc_port_b<IF> *>(&pb);
208  if (!p)
209  return 2;
211  return 0;
212  }
213 
214  private:
216 
217  sc_interface *
218  _gem5Interface(int n) const override
219  {
220  if (n < 0 || n >= size()) {
221  report_error(SC_ID_GET_IF_, "index out of range");
222  return NULL;
223  }
224  return _interfaces[n];
225  }
226  void
228  {
229  IF *interface = dynamic_cast<IF *>(iface);
230  sc_assert(interface);
231  for (unsigned i = 0; i < _interfaces.size(); i++) {
232  if (interface == _interfaces[i]) {
234  "interface already bound to port");
235  }
236  }
237  _interfaces.push_back(interface);
238  }
239 
240  const char *_ifTypeName() const override { return typeid(IF).name(); }
241 
242  // Disabled
245  sc_port_b<IF> &operator = (const sc_port_b<IF> &) { return *this; }
246 };
247 
248 template <class IF, int N=1, sc_port_policy P=SC_ONE_OR_MORE_BOUND>
249 class sc_port : public sc_port_b<IF>
250 {
251  public:
252  sc_port() : sc_port_b<IF>(N, P) {}
253  explicit sc_port(const char *name) : sc_port_b<IF>(name, N, P) {}
254  virtual ~sc_port() {}
255 
256  // Deprecated binding constructors.
257  explicit sc_port(const IF &interface) : sc_port_b<IF>(N, P)
258  {
259  this->warn_port_constructor();
260  sc_port_b<IF>::bind(const_cast<IF &>(interface));
261  }
262  sc_port(const char *name, const IF &interface) : sc_port_b<IF>(name, N, P)
263  {
264  this->warn_port_constructor();
265  sc_port_b<IF>::bind(const_cast<IF &>(interface));
266  }
267  explicit sc_port(sc_port_b<IF> &parent) : sc_port_b<IF>(N, P)
268  {
269  this->warn_port_constructor();
270  sc_port_b<IF>::bind(parent);
271  }
272  sc_port(const char *name, sc_port_b<IF> &parent) :
273  sc_port_b<IF>(name, N, P)
274  {
275  this->warn_port_constructor();
276  sc_port_b<IF>::bind(parent);
277  }
278  explicit sc_port(sc_port<IF, N, P> &parent) : sc_port_b<IF>(N, P)
279  {
280  this->warn_port_constructor();
281  sc_port_b<IF>::bind(parent);
282  }
283  sc_port(const char *name, sc_port<IF, N, P> &parent) :
284  sc_port_b<IF>(name, N, P)
285  {
286  this->warn_port_constructor();
287  sc_port_b<IF>::bind(parent);
288  }
289 
290  virtual const char *kind() const override { return "sc_port"; }
291 
292  private:
293  // Disabled
295  sc_port<IF, N, P> &operator = (const sc_port<IF, N, P> &) { return *this; }
296 
297  virtual sc_port_policy _portPolicy() const override { return P; }
298 };
299 
300 } // namespace sc_core
301 
302 #endif //__SYSTEMC_EXT_CORE_SC_PORT_HH__
sc_core::sc_port_b
Definition: sc_port.hh:118
sc_core::sc_port_base
Definition: sc_port.hh:74
sc_core::SC_ALL_BOUND
@ SC_ALL_BOUND
Definition: sc_port.hh:71
sc_core::SC_ONE_OR_MORE_BOUND
@ SC_ONE_OR_MORE_BOUND
Definition: sc_port.hh:69
sc_core::sc_port::sc_port
sc_port(const IF &interface)
Definition: sc_port.hh:257
sc_core::sc_port_b::vbind
int vbind(sc_port_base &pb) override
Definition: sc_port.hh:205
sc_core::sc_port_base::warn_port_constructor
void warn_port_constructor() const
Definition: sc_port.cc:85
sc_core::sc_port_base::_gem5Interface
virtual sc_interface * _gem5Interface(int n) const =0
sc_core::sc_port_b::vbind
int vbind(sc_interface &i) override
Definition: sc_port.hh:196
sc_core::sc_port_b::start_of_simulation
void start_of_simulation() override
Definition: sc_port.hh:183
sc_core::sc_port_b::before_end_of_elaboration
void before_end_of_elaboration() override
Definition: sc_port.hh:181
sc_core::sc_port_b::end_of_elaboration
void end_of_elaboration() override
Definition: sc_port.hh:182
sc_core::sc_trace_params::name
std::string name
Definition: sc_port.hh:59
sc_core::sc_port
Definition: sc_port.hh:249
sc_core::sc_port_b::_ifTypeName
const char * _ifTypeName() const override
Definition: sc_port.hh:240
sc_core::sc_port::~sc_port
virtual ~sc_port()
Definition: sc_port.hh:254
sc_core::sc_trace_params_vec
std::vector< sc_trace_params * > sc_trace_params_vec
Definition: sc_port.hh:65
sc_core
Definition: messages.cc:31
sc_core::sc_port::kind
virtual const char * kind() const override
Definition: sc_port.hh:290
sc_core::sc_port_base::report_error
void report_error(const char *id, const char *add_msg) const
Definition: sc_port.cc:97
sc_core::sc_trace_params
Definition: sc_port.hh:56
sc_core::sc_interface
Definition: sc_interface.hh:37
sc_core::SC_ID_GET_IF_
const char SC_ID_GET_IF_[]
Definition: messages.cc:49
sc_core::sc_port_b::sc_port_b
sc_port_b(const char *name, int n, sc_port_policy p)
Definition: sc_port.hh:189
sc_core::sc_trace_file
Definition: sc_trace_file.hh:61
sc_core::sc_port_base::sc_port_base
sc_port_base(const char *name, int n, sc_port_policy p)
Definition: sc_port.cc:59
std::vector< sc_trace_params * >
sc_core::sc_port_b::sc_port_b
sc_port_b()
Definition: sc_port.hh:243
sc_core::sc_port_base::start_of_simulation
virtual void start_of_simulation()=0
sc_core::sc_port_base::_gem5AddInterface
virtual void _gem5AddInterface(sc_interface *i)=0
sc_core::sc_port_base::bind
void bind(sc_interface &)
Definition: sc_port.cc:109
sc_core::sc_port_b::bind
virtual void bind(IF &i)
Definition: sc_port.hh:124
sc_core::sc_port_b::~sc_port_b
virtual ~sc_port_b()
Definition: sc_port.hh:192
gem5::ArmISA::i
Bitfield< 7 > i
Definition: misc_types.hh:67
sc_assert
#define sc_assert(expr)
Definition: sc_report_handler.hh:135
sc_core::sc_port::sc_port
sc_port()
Definition: sc_port.hh:252
sc_core::sc_port_base::_ifTypeName
virtual const char * _ifTypeName() const =0
sc_core::sc_trace_params::tf
sc_trace_file * tf
Definition: sc_port.hh:58
sc_core::sc_port::sc_port
sc_port(const char *name, const IF &interface)
Definition: sc_port.hh:262
sc_core::sc_port::sc_port
sc_port(const char *name, sc_port_b< IF > &parent)
Definition: sc_port.hh:272
sc_core::sc_port_b::sc_port_b
sc_port_b(int n, sc_port_policy p)
Definition: sc_port.hh:186
sc_core::sc_port_base::vbind
virtual int vbind(sc_interface &)=0
sc_core::SC_ZERO_OR_MORE_BOUND
@ SC_ZERO_OR_MORE_BOUND
Definition: sc_port.hh:70
sc_core::sc_port_b::end_of_simulation
void end_of_simulation() override
Definition: sc_port.hh:184
sc_core::sc_port_b::_gem5Interface
sc_interface * _gem5Interface(int n) const override
Definition: sc_port.hh:218
sc_core::sc_port::sc_port
sc_port(const char *name, sc_port< IF, N, P > &parent)
Definition: sc_port.hh:283
sc_core::sc_port_b::operator=
sc_port_b< IF > & operator=(const sc_port_b< IF > &)
Definition: sc_port.hh:245
gem5::MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:326
sc_core::sc_port_base::kind
const char * kind() const
Definition: sc_port.hh:85
sc_core::sc_port_b::bind
virtual void bind(sc_port_b< IF > &p)
Definition: sc_port.hh:125
sc_core::sc_port::sc_port
sc_port(const sc_port< IF, N, P > &)
Definition: sc_port.hh:294
sc_core::sc_port_b::sc_port_b
sc_port_b(const sc_port_b< IF > &)
Definition: sc_port.hh:244
sc_core::sc_gen_unique_name
const char * sc_gen_unique_name(const char *seed)
Definition: sc_module.cc:820
sc_core::sc_port_policy
sc_port_policy
Definition: sc_port.hh:67
sc_core::sc_port_base::_gem5Port
::sc_gem5::Port * _gem5Port
Definition: sc_port.hh:112
sc_core::sc_object
Definition: sc_object.hh:50
sc_module.hh
sc_core::sc_port::operator=
sc_port< IF, N, P > & operator=(const sc_port< IF, N, P > &)
Definition: sc_port.hh:295
sc_core::sc_port_base::~sc_port_base
virtual ~sc_port_base()
Definition: sc_port.cc:79
sc_core::sc_port::sc_port
sc_port(const char *name)
Definition: sc_port.hh:253
sc_core::sc_port_b::_gem5AddInterface
void _gem5AddInterface(sc_interface *iface) override
Definition: sc_port.hh:227
sc_core::sc_port_base::_portPolicy
virtual sc_port_policy _portPolicy() const =0
gem5::ArmISA::n
Bitfield< 31 > n
Definition: misc_types.hh:456
sc_core::sc_object::name
const char * name() const
Definition: sc_object.cc:44
sc_core::sc_trace_params::sc_trace_params
sc_trace_params(sc_trace_file *tf, const std::string &name)
Definition: sc_port.hh:61
sc_object.hh
sc_core::sc_port::_portPolicy
virtual sc_port_policy _portPolicy() const override
Definition: sc_port.hh:297
sc_core::sc_abort
void sc_abort()
Definition: sc_report.cc:178
sc_gem5::Port
Definition: port.hh:50
sc_core::sc_port_b::operator->
IF * operator->()
Definition: sc_port.hh:128
sc_core::sc_port_b::get_interface
const sc_interface * get_interface() const
Definition: sc_port.hh:173
sc_core::sc_port_base::end_of_elaboration
virtual void end_of_elaboration()=0
sc_gem5
Definition: sc_clock.cc:41
sc_core::sc_port_base::before_end_of_elaboration
virtual void before_end_of_elaboration()=0
sc_core::sc_port_b::_interfaces
std::vector< IF * > _interfaces
Definition: sc_port.hh:215
sc_core::sc_port_b::operator[]
IF * operator[](int n)
Definition: sc_port.hh:147
sc_core::sc_port::sc_port
sc_port(sc_port_b< IF > &parent)
Definition: sc_port.hh:267
sc_core::sc_port_base::end_of_simulation
virtual void end_of_simulation()=0
sc_core::sc_port::sc_port
sc_port(sc_port< IF, N, P > &parent)
Definition: sc_port.hh:278
sc_core::sc_port_base::size
int size() const
Definition: sc_port.cc:107
sc_core::sc_port_b::get_interface
sc_interface * get_interface()
Definition: sc_port.hh:166
sc_core::sc_port_b::operator()
void operator()(IF &i)
Definition: sc_port.hh:121
sc_core::SC_ID_BIND_IF_TO_PORT_
const char SC_ID_BIND_IF_TO_PORT_[]
Definition: messages.cc:44
sc_core::sc_port_base::maxSize
int maxSize() const
Definition: sc_port.cc:106

Generated on Tue Dec 21 2021 11:34:36 for gem5 by doxygen 1.8.17