gem5 v23.0.0.1
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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
39namespace sc_gem5
40{
41
42class Port;
43
44};
45
46namespace sc_core
47{
48
49class sc_interface;
50class 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
74class 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
117template <class IF>
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 *
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
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) :
187 sc_port_base(sc_gen_unique_name("port"), n, 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
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
248template <class IF, int N=1, sc_port_policy P=SC_ONE_OR_MORE_BOUND>
249class 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
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(const char *name, int n, sc_port_policy p)
Definition sc_port.hh:189
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
const sc_interface * get_interface() const
Definition sc_port.hh:173
virtual void bind(sc_port_b< IF > &p)
Definition sc_port.hh:125
sc_interface * _gem5Interface(int n) const override
Definition sc_port.hh:218
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
sc_interface * get_interface()
Definition sc_port.hh:166
sc_port_b(const sc_port_b< IF > &)
Definition sc_port.hh:244
IF * operator[](int n)
Definition sc_port.hh:147
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
const char * _ifTypeName() const override
Definition sc_port.hh:240
void _gem5AddInterface(sc_interface *iface) override
Definition sc_port.hh:227
virtual void bind(IF &i)
Definition sc_port.hh:124
sc_port_b< IF > & operator=(const sc_port_b< IF > &)
Definition sc_port.hh:245
void operator()(IF &i)
Definition sc_port.hh:121
void end_of_elaboration() override
Definition sc_port.hh:182
virtual ~sc_port_base()
Definition sc_port.cc:79
int maxSize() const
Definition sc_port.cc:106
const char * kind() const
Definition sc_port.hh:85
virtual const char * _ifTypeName() const =0
virtual sc_port_policy _portPolicy() const =0
virtual sc_interface * _gem5Interface(int n) 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
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
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(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< IF, N, P > & operator=(const sc_port< IF, N, P > &)
Definition sc_port.hh:295
sc_port(const char *name, sc_port_b< IF > &parent)
Definition sc_port.hh:272
sc_port(sc_port_b< IF > &parent)
Definition sc_port.hh:267
virtual const char * kind() const override
Definition sc_port.hh:290
STL vector class.
Definition stl.hh:37
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 Mon Jul 10 2023 15:32:05 for gem5 by doxygen 1.9.7