Deleted Added
sdiff udiff text old ( 13054:bce8a8124325 ) new ( 13245:c666c5d4996b )
full compact
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 * Authors: Gabe Black
28 */
29
30#ifndef __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
31#define __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
32
33#include <string>
34
35#include "../core/sc_event.hh"
36#include "../core/sc_port.hh"
37#include "sc_signal_in_if.hh"
38#include "sc_signal_inout_if.hh"
39#include "warn_unimpl.hh"
40
41namespace sc_core
42{
43
44class sc_event;
45class sc_trace_file;
46
47template <class T>
48class sc_in : public sc_port<sc_signal_in_if<T>, 1>
49{
50 public:
51 sc_in() : sc_port<sc_signal_in_if<T>, 1>(),
52 _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
53 {}
54 explicit sc_in(const char *name) : sc_port<sc_signal_in_if<T>, 1>(name),
55 _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
56 {}
57 virtual ~sc_in() {}
58
59 // Deprecated binding constructors.
60 explicit sc_in(const sc_signal_in_if<T> &interface) :
61 sc_port<sc_signal_in_if<T>, 1>(interface),
62 _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
63 {}
64 sc_in(const char *name, const sc_signal_in_if<T> &interface) :
65 sc_port<sc_signal_in_if<T>, 1>(name, interface),
66 _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
67 {}
68 explicit sc_in(sc_port_b<sc_signal_in_if<T> > &parent) :
69 sc_port<sc_signal_in_if<T>, 1>(parent),
70 _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
71 {}
72 sc_in(const char *name, sc_port_b<sc_signal_in_if<T> > &parent) :
73 sc_port<sc_signal_in_if<T>, 1>(name, parent),
74 _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
75 {}
76 explicit sc_in(sc_port<sc_signal_in_if<T>, 1> &parent) :
77 sc_port<sc_signal_in_if<T>, 1>(parent),
78 _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
79 {}
80 sc_in(const char *name, sc_port<sc_signal_in_if<T>, 1> &parent) :
81 sc_port<sc_signal_in_if<T>, 1>(name, parent),
82 _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
83 {}
84
85 virtual void
86 bind(const sc_signal_in_if<T> &i)
87 {
88 sc_port<sc_signal_in_if<T>, 1>::bind(
89 const_cast<sc_signal_in_if<T> &>(i));
90 }
91 void operator () (const sc_signal_in_if<T> &i) { bind(i); }
92
93 virtual void
94 bind(sc_port<sc_signal_in_if<T>, 1> &i)
95 {
96 sc_port<sc_signal_in_if<T>, 1>::bind(i);
97 }
98 void
99 operator () (sc_port<sc_signal_in_if<T>, 1> &p)
100 {
101 bind(p);
102 }
103
104 virtual void
105 bind(sc_port<sc_signal_inout_if<T>, 1> &p)
106 {
107 sc_port_base::bind(p);
108 }
109 void
110 operator () (sc_port<sc_signal_inout_if<T>, 1> &p)
111 {
112 bind(p);
113 }
114
115 virtual void end_of_elaboration() { /* Implementation defined. */ }
116
117 const T &read() const { return (*this)->read(); }
118 operator const T& () const { return (*this)->read(); }
119
120 const sc_event &default_event() const { return (*this)->default_event(); }
121 const sc_event &
122 value_changed_event() const
123 {
124 return (*this)->value_changed_event();
125 }
126 bool event() const { return (*this)->event(); }
127 sc_event_finder &value_changed() const { return _valueChangedFinder; }
128
129 virtual const char *kind() const { return "sc_in"; }
130
131 private:
132 mutable sc_event_finder_t<sc_signal_in_if<T> > _valueChangedFinder;
133
134 // Disabled
135 sc_in(const sc_in<T> &);
136 sc_in<T> &operator = (const sc_in<T> &);
137};
138
139template <class T>
140inline void
141sc_trace(sc_trace_file *, const sc_in<T> &, const std::string &)
142{
143 sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
144}
145
146template <>
147class sc_in<bool> : public sc_port<sc_signal_in_if<bool>, 1>
148{
149 public:
150 sc_in() : sc_port<sc_signal_in_if<bool>, 1>(),
151 _valueChangedFinder(*this,
152 &sc_signal_in_if<bool>::value_changed_event),
153 _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
154 _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
155 {}
156 explicit sc_in(const char *name) :
157 sc_port<sc_signal_in_if<bool>, 1>(name),
158 _valueChangedFinder(*this,
159 &sc_signal_in_if<bool>::value_changed_event),
160 _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
161 _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
162 {}
163 virtual ~sc_in() {}
164
165 // Deprecated binding constructors.
166 explicit sc_in(const sc_signal_in_if<bool> &interface) :
167 sc_port<sc_signal_in_if<bool>, 1>(interface),
168 _valueChangedFinder(*this,
169 &sc_signal_in_if<bool>::value_changed_event),
170 _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
171 _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
172 {}
173 sc_in(const char *name, const sc_signal_in_if<bool> &interface) :
174 sc_port<sc_signal_in_if<bool>, 1>(name, interface),
175 _valueChangedFinder(*this,
176 &sc_signal_in_if<bool>::value_changed_event),
177 _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
178 _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
179 {}
180 explicit sc_in(sc_port_b<sc_signal_in_if<bool> > &parent) :
181 sc_port<sc_signal_in_if<bool>, 1>(parent),
182 _valueChangedFinder(*this,
183 &sc_signal_in_if<bool>::value_changed_event),
184 _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
185 _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
186 {}
187 sc_in(const char *name, sc_port_b<sc_signal_in_if<bool> > &parent) :
188 sc_port<sc_signal_in_if<bool>, 1>(name, parent),
189 _valueChangedFinder(*this,
190 &sc_signal_in_if<bool>::value_changed_event),
191 _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
192 _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
193 {}
194 explicit sc_in(sc_port<sc_signal_in_if<bool>, 1> &parent) :
195 sc_port<sc_signal_in_if<bool>, 1>(parent),
196 _valueChangedFinder(*this,
197 &sc_signal_in_if<bool>::value_changed_event),
198 _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
199 _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
200 {}
201 sc_in(const char *name, sc_port<sc_signal_in_if<bool>, 1> &parent) :
202 sc_port<sc_signal_in_if<bool>, 1>(name, parent),
203 _valueChangedFinder(*this,
204 &sc_signal_in_if<bool>::value_changed_event),
205 _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
206 _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
207 {}
208
209 virtual void
210 bind(const sc_signal_in_if<bool> &i)
211 {
212 sc_port<sc_signal_in_if<bool>, 1>::bind(
213 const_cast<sc_signal_in_if<bool> &>(i));
214 }
215 void operator () (const sc_signal_in_if<bool> &i) { bind(i); }
216
217 virtual void
218 bind(sc_port<sc_signal_in_if<bool>, 1> &p)
219 {
220 sc_port<sc_signal_in_if<bool>, 1>::bind(p);
221 }
222 void
223 operator () (sc_port<sc_signal_in_if<bool>, 1> &p)
224 {
225 bind(p);
226 }
227
228 virtual void
229 bind(sc_port<sc_signal_inout_if<bool>, 1> &p)
230 {
231 sc_port_base::bind(p);
232 }
233 void
234 operator () (sc_port<sc_signal_inout_if<bool>, 1> &p)
235 {
236 bind(p);
237 }
238
239 virtual void end_of_elaboration() { /* Implementation defined. */ }
240
241 const bool &read() const { return (*this)->read(); }
242 operator const bool& () const { return (*this)->read(); }
243
244 const sc_event &default_event() const { return (*this)->default_event(); }
245 const sc_event &
246 value_changed_event() const
247 {
248 return (*this)->value_changed_event();
249 }
250 const sc_event &
251 posedge_event() const
252 {
253 return (*this)->posedge_event();
254 }
255 const sc_event &
256 negedge_event() const
257 {
258 return (*this)->negedge_event();
259 }
260
261 bool event() const { return (*this)->event(); }
262 bool posedge() const { return (*this)->posedge(); }
263 bool negedge() const { return (*this)->negedge(); }
264
265 sc_event_finder &value_changed() const { return _valueChangedFinder; }
266 sc_event_finder &pos() const { return _posFinder; }
267 sc_event_finder &neg() const { return _negFinder; }
268
269 virtual const char *kind() const { return "sc_in"; }
270
271 private:
272 mutable sc_event_finder_t<sc_signal_in_if<bool> > _valueChangedFinder;
273 mutable sc_event_finder_t<sc_signal_in_if<bool> > _posFinder;
274 mutable sc_event_finder_t<sc_signal_in_if<bool> > _negFinder;
275
276 // Disabled
277 sc_in(const sc_in<bool> &);
278 sc_in<bool> &operator = (const sc_in<bool> &);
279};
280
281template <>
282inline void
283sc_trace<bool>(sc_trace_file *, const sc_in<bool> &, const std::string &)
284{
285 sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
286}
287
288template <>
289class sc_in<sc_dt::sc_logic> :
290 public sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>
291{
292 public:
293 sc_in() : sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(),
294 _valueChangedFinder(*this,
295 &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
296 _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
297 _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
298 {}
299 explicit sc_in(const char *name) :
300 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name),
301 _valueChangedFinder(*this,
302 &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
303 _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
304 _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
305 {}
306 virtual ~sc_in() {}
307
308 // Deprecated binding constructors.
309 explicit sc_in(const sc_signal_in_if<sc_dt::sc_logic> &interface) :
310 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(interface),
311 _valueChangedFinder(*this,
312 &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
313 _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
314 _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
315 {}
316 sc_in(const char *name,
317 const sc_signal_in_if<sc_dt::sc_logic> &interface) :
318 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, interface),
319 _valueChangedFinder(*this,
320 &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
321 _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
322 _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
323 {}
324 explicit sc_in(sc_port_b<sc_signal_in_if<sc_dt::sc_logic> > &parent) :
325 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(parent),
326 _valueChangedFinder(*this,
327 &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
328 _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
329 _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
330 {}
331 sc_in(const char *name,
332 sc_port_b<sc_signal_in_if<sc_dt::sc_logic> > &parent) :
333 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, parent),
334 _valueChangedFinder(*this,
335 &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
336 _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
337 _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
338 {}
339 explicit sc_in(sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &parent) :
340 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(parent),
341 _valueChangedFinder(*this,
342 &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
343 _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
344 _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
345 {}
346 sc_in(const char *name,
347 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &parent) :
348 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, parent),
349 _valueChangedFinder(*this,
350 &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
351 _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
352 _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
353 {}
354
355 virtual void
356 bind(const sc_signal_in_if<sc_dt::sc_logic> &i)
357 {
358 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>::bind(
359 const_cast<sc_signal_in_if<sc_dt::sc_logic> &>(i));
360 }
361 void
362 operator () (const sc_signal_in_if<sc_dt::sc_logic> &i) { bind(i); }
363
364 virtual void
365 bind(sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &i)
366 {
367 sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>::bind(i);
368 }
369 void
370 operator () (sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &p)
371 {
372 bind(p);
373 }
374
375 virtual void
376 bind(sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &p)
377 {
378 sc_port_base::bind(p);
379 }
380 void
381 operator () (sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &p)
382 {
383 bind(p);
384 }
385
386 virtual void end_of_elaboration() { /* Implementation defined. */ }
387
388 const sc_dt::sc_logic &read() const { return (*this)->read(); }
389 operator const sc_dt::sc_logic& () const { return (*this)->read(); }
390
391 const sc_event &default_event() const { return (*this)->default_event(); }
392 const sc_event &
393 value_changed_event() const
394 {
395 return (*this)->value_changed_event();
396 }
397 const sc_event &posedge_event() const { return (*this)->posedge_event(); }
398 const sc_event &negedge_event() const { return (*this)->negedge_event(); }
399
400 bool event() const { return (*this)->event(); }
401 bool posedge() const { return (*this)->posedge(); }
402 bool negedge() const { return (*this)->negedge(); }
403
404 sc_event_finder &value_changed() const { return _valueChangedFinder; }
405 sc_event_finder &pos() const { return _posFinder; }
406 sc_event_finder &neg() const { return _negFinder; }
407
408 virtual const char *kind() const { return "sc_in"; }
409
410 private:
411 mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> >
412 _valueChangedFinder;
413 mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> > _posFinder;
414 mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> > _negFinder;
415
416 // Disabled
417 sc_in(const sc_in<sc_dt::sc_logic> &);
418 sc_in<sc_dt::sc_logic> &operator = (const sc_in<sc_dt::sc_logic> &);
419};
420
421template <>
422inline void
423sc_trace(
424 sc_trace_file *, const sc_in<sc_dt::sc_logic> &, const std::string &)
425{
426 sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
427}
428
429} // namespace sc_core
430
431#endif //__SYSTEMC_EXT_CHANNEL_SC_IN_HH__