gem5  v22.1.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__
const char * name() const
Definition: sc_object.cc:44
sc_port_b< IF > & operator=(const sc_port_b< IF > &)
Definition: sc_port.hh:245
sc_port_b(const char *name, int n, sc_port_policy p)
Definition: sc_port.hh:189
const char * _ifTypeName() const override
Definition: sc_port.hh:240
void start_of_simulation() override
Definition: sc_port.hh:183
void end_of_simulation() override
Definition: sc_port.hh:184
std::vector< IF * > _interfaces
Definition: sc_port.hh:215
sc_interface * get_interface()
Definition: sc_port.hh:166
virtual void bind(sc_port_b< IF > &p)
Definition: sc_port.hh:125
int vbind(sc_port_base &pb) override
Definition: sc_port.hh:205
virtual ~sc_port_b()
Definition: sc_port.hh:192
int vbind(sc_interface &i) override
Definition: sc_port.hh:196
IF * operator[](int n)
Definition: sc_port.hh:147
sc_port_b(const sc_port_b< IF > &)
Definition: sc_port.hh:244
sc_port_b(int n, sc_port_policy p)
Definition: sc_port.hh:186
void before_end_of_elaboration() override
Definition: sc_port.hh:181
void _gem5AddInterface(sc_interface *iface) override
Definition: sc_port.hh:227
const sc_interface * get_interface() const
Definition: sc_port.hh:173
virtual void bind(IF &i)
Definition: sc_port.hh:124
sc_interface * _gem5Interface(int n) const override
Definition: sc_port.hh:218
void operator()(IF &i)
Definition: sc_port.hh:121
void end_of_elaboration() override
Definition: sc_port.hh:182
const char * kind() const
Definition: sc_port.hh:85
virtual ~sc_port_base()
Definition: sc_port.cc:79
int maxSize() const
Definition: sc_port.cc:106
virtual const char * _ifTypeName() const =0
virtual sc_port_policy _portPolicy() const =0
virtual int vbind(sc_port_base &)=0
virtual void _gem5AddInterface(sc_interface *i)=0
virtual void before_end_of_elaboration()=0
::sc_gem5::Port * _gem5Port
Definition: sc_port.hh:112
virtual void start_of_simulation()=0
virtual sc_interface * _gem5Interface(int n) const =0
void bind(sc_interface &)
Definition: sc_port.cc:109
void report_error(const char *id, const char *add_msg) const
Definition: sc_port.cc:97
virtual void end_of_simulation()=0
virtual int vbind(sc_interface &)=0
void warn_port_constructor() const
Definition: sc_port.cc:85
virtual void end_of_elaboration()=0
int size() const
Definition: sc_port.cc:107
sc_port_base(const char *name, int n, sc_port_policy p)
Definition: sc_port.cc:59
sc_port(const char *name, sc_port< IF, N, P > &parent)
Definition: sc_port.hh:283
virtual ~sc_port()
Definition: sc_port.hh:254
sc_port(const sc_port< IF, N, P > &)
Definition: sc_port.hh:294
sc_port< IF, N, P > & operator=(const sc_port< IF, N, P > &)
Definition: sc_port.hh:295
sc_port(const char *name, const IF &interface)
Definition: sc_port.hh:262
sc_port(const char *name)
Definition: sc_port.hh:253
sc_port(sc_port< IF, N, P > &parent)
Definition: sc_port.hh:278
sc_port(const IF &interface)
Definition: sc_port.hh:257
virtual sc_port_policy _portPolicy() const override
Definition: sc_port.hh:297
sc_port(const char *name, sc_port_b< IF > &parent)
Definition: sc_port.hh:272
virtual const char * kind() const override
Definition: sc_port.hh:290
sc_port(sc_port_b< IF > &parent)
Definition: sc_port.hh:267
Bitfield< 31 > n
Definition: misc_types.hh:462
Bitfield< 7 > i
Definition: misc_types.hh:67
Bitfield< 54 > p
Definition: pagetable.hh:70
void sc_abort()
Definition: sc_report.cc:178
const char SC_ID_GET_IF_[]
Definition: messages.cc:49
std::vector< sc_trace_params * > sc_trace_params_vec
Definition: sc_port.hh:65
const char SC_ID_BIND_IF_TO_PORT_[]
Definition: messages.cc:44
sc_port_policy
Definition: sc_port.hh:68
@ SC_ALL_BOUND
Definition: sc_port.hh:71
@ SC_ZERO_OR_MORE_BOUND
Definition: sc_port.hh:70
@ SC_ONE_OR_MORE_BOUND
Definition: sc_port.hh:69
const char * sc_gen_unique_name(const char *seed)
Definition: sc_module.cc:820
#define sc_assert(expr)
sc_trace_file * tf
Definition: sc_port.hh:58
sc_trace_params(sc_trace_file *tf, const std::string &name)
Definition: sc_port.hh:61

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