gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
sc_in.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  * 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_main.hh"
37 #include "../core/sc_port.hh"
38 #include "../utils/sc_trace_file.hh"
39 #include "sc_signal_in_if.hh"
40 #include "sc_signal_inout_if.hh"
41 
42 namespace sc_core
43 {
44 
45 class sc_event;
46 class sc_trace_file;
47 
48 template <class T>
49 class sc_in : public sc_port<sc_signal_in_if<T>, 1>
50 {
51  public:
54  {}
55  explicit sc_in(const char *name) : sc_port<sc_signal_in_if<T>, 1>(name),
57  {}
58  virtual ~sc_in() {}
59 
60  // Deprecated binding constructors.
61  explicit sc_in(const sc_signal_in_if<T> &interface) :
62  sc_port<sc_signal_in_if<T>, 1>(interface),
64  {}
65  sc_in(const char *name, const sc_signal_in_if<T> &interface) :
66  sc_port<sc_signal_in_if<T>, 1>(name, interface),
68  {}
69  explicit sc_in(sc_port_b<sc_signal_in_if<T> > &parent) :
70  sc_port<sc_signal_in_if<T>, 1>(parent),
72  {}
73  sc_in(const char *name, sc_port_b<sc_signal_in_if<T> > &parent) :
74  sc_port<sc_signal_in_if<T>, 1>(name, parent),
76  {}
77  explicit sc_in(sc_port<sc_signal_in_if<T>, 1> &parent) :
78  sc_port<sc_signal_in_if<T>, 1>(parent),
80  {}
81  sc_in(const char *name, sc_port<sc_signal_in_if<T>, 1> &parent) :
82  sc_port<sc_signal_in_if<T>, 1>(name, parent),
84  {}
85 
87  virtual void
89  {
91  const_cast<sc_signal_in_if<T> &>(i));
92  }
93  void operator () (const sc_signal_in_if<T> &i) { bind(i); }
94 
95  virtual void
97  {
99  }
100  void
102  {
103  bind(p);
104  }
105 
106  virtual void
108  {
110  }
111  void
113  {
114  bind(p);
115  }
116 
117  virtual void
119  {
120  for (auto params: traceParamsVec)
121  sc_trace(params->tf, (*this)->read(), params->name);
122 
123  traceParamsVec.clear();
124  }
125 
126  const T &read() const { return (*this)->read(); }
127  operator const T& () const { return (*this)->read(); }
128 
129  const sc_event &default_event() const { return (*this)->default_event(); }
130  const sc_event &
132  {
133  return (*this)->value_changed_event();
134  }
135  bool event() const { return (*this)->event(); }
137 
138  virtual const char *kind() const { return "sc_in"; }
139 
140  void
141  add_trace(sc_trace_file *tf, const std::string &name) const
142  {
143  traceParamsVec.push_back(new sc_trace_params(tf, name));
144  }
145 
146  private:
148 
150 
151  // Disabled
152  sc_in(const sc_in<T> &);
153  sc_in<T> &operator = (const sc_in<T> &);
154 };
155 
156 template <class T>
157 inline void
158 sc_trace(sc_trace_file *tf, const sc_in<T> &i, const std::string &name)
159 {
161  i.add_trace(tf, name);
162  else
163  sc_trace(tf, i->read(), name);
164 }
165 
166 template <>
167 class sc_in<bool> : public sc_port<sc_signal_in_if<bool>, 1>
168 {
169  public:
170  sc_in() : sc_port<sc_signal_in_if<bool>, 1>(),
171  _valueChangedFinder(*this,
173  _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
174  _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
175  {}
176  explicit sc_in(const char *name) :
177  sc_port<sc_signal_in_if<bool>, 1>(name),
178  _valueChangedFinder(*this,
180  _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
181  _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
182  {}
183  virtual ~sc_in() {}
184 
185  // Deprecated binding constructors.
186  explicit sc_in(const sc_signal_in_if<bool> &interface) :
187  sc_port<sc_signal_in_if<bool>, 1>(interface),
188  _valueChangedFinder(*this,
190  _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
191  _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
192  {}
193  sc_in(const char *name, const sc_signal_in_if<bool> &interface) :
194  sc_port<sc_signal_in_if<bool>, 1>(name, interface),
195  _valueChangedFinder(*this,
197  _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
198  _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
199  {}
200  explicit sc_in(sc_port_b<sc_signal_in_if<bool> > &parent) :
201  sc_port<sc_signal_in_if<bool>, 1>(parent),
202  _valueChangedFinder(*this,
204  _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
205  _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
206  {}
207  sc_in(const char *name, sc_port_b<sc_signal_in_if<bool> > &parent) :
208  sc_port<sc_signal_in_if<bool>, 1>(name, parent),
209  _valueChangedFinder(*this,
211  _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
212  _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
213  {}
214  explicit sc_in(sc_port<sc_signal_in_if<bool>, 1> &parent) :
215  sc_port<sc_signal_in_if<bool>, 1>(parent),
216  _valueChangedFinder(*this,
218  _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
219  _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
220  {}
221  sc_in(const char *name, sc_port<sc_signal_in_if<bool>, 1> &parent) :
222  sc_port<sc_signal_in_if<bool>, 1>(name, parent),
223  _valueChangedFinder(*this,
225  _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
226  _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
227  {}
228 
230 
231  virtual void
233  {
235  const_cast<sc_signal_in_if<bool> &>(i));
236  }
238 
239  virtual void
241  {
243  }
244  void
246  {
247  bind(p);
248  }
249 
250  virtual void
252  {
254  }
255  void
257  {
258  bind(p);
259  }
260 
261  virtual void
263  {
264  for (auto params: traceParamsVec)
265  sc_trace(params->tf, (*this)->read(), params->name);
266 
267  traceParamsVec.clear();
268  }
269 
270  const bool &read() const { return (*this)->read(); }
271  operator const bool& () const { return (*this)->read(); }
272 
273  const sc_event &default_event() const { return (*this)->default_event(); }
274  const sc_event &
276  {
277  return (*this)->value_changed_event();
278  }
279  const sc_event &
281  {
282  return (*this)->posedge_event();
283  }
284  const sc_event &
286  {
287  return (*this)->negedge_event();
288  }
289 
290  bool event() const { return (*this)->event(); }
291  bool posedge() const { return (*this)->posedge(); }
292  bool negedge() const { return (*this)->negedge(); }
293 
295  sc_event_finder &pos() const { return _posFinder; }
296  sc_event_finder &neg() const { return _negFinder; }
297 
298  virtual const char *kind() const { return "sc_in"; }
299 
300  void
301  add_trace(sc_trace_file *tf, const std::string &name) const
302  {
303  traceParamsVec.push_back(new sc_trace_params(tf, name));
304  }
305 
306  private:
310 
312 
313  // Disabled
314  sc_in(const sc_in<bool> &);
316 };
317 
318 template <>
319 inline void
321  const std::string &name)
322 {
324  i.add_trace(tf, name);
325  else
326  sc_trace(tf, i->read(), name);
327 }
328 
329 template <>
330 class sc_in<sc_dt::sc_logic> :
331  public sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>
332 {
333  public:
334  sc_in() : sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(),
335  _valueChangedFinder(*this,
337  _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
338  _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
339  {}
340  explicit sc_in(const char *name) :
341  sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name),
342  _valueChangedFinder(*this,
344  _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
345  _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
346  {}
347  virtual ~sc_in() {}
348 
349  // Deprecated binding constructors.
350  explicit sc_in(const sc_signal_in_if<sc_dt::sc_logic> &interface) :
351  sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(interface),
352  _valueChangedFinder(*this,
354  _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
355  _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
356  {}
357  sc_in(const char *name,
358  const sc_signal_in_if<sc_dt::sc_logic> &interface) :
359  sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, interface),
360  _valueChangedFinder(*this,
362  _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
363  _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
364  {}
366  sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(parent),
367  _valueChangedFinder(*this,
369  _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
370  _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
371  {}
372  sc_in(const char *name,
374  sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, parent),
375  _valueChangedFinder(*this,
377  _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
378  _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
379  {}
381  sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(parent),
382  _valueChangedFinder(*this,
384  _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
385  _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
386  {}
387  sc_in(const char *name,
389  sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, parent),
390  _valueChangedFinder(*this,
392  _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
393  _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
394  {}
395 
397 
398  virtual void
400  {
402  const_cast<sc_signal_in_if<sc_dt::sc_logic> &>(i));
403  }
404  void
406 
407  virtual void
409  {
411  }
412  void
414  {
415  bind(p);
416  }
417 
418  virtual void
420  {
422  }
423  void
425  {
426  bind(p);
427  }
428 
429  virtual void
431  {
432  for (auto params: traceParamsVec)
433  sc_trace(params->tf, (*this)->read(), params->name);
434 
435  traceParamsVec.clear();
436  }
437 
438  const sc_dt::sc_logic &read() const { return (*this)->read(); }
439  operator const sc_dt::sc_logic& () const { return (*this)->read(); }
440 
441  const sc_event &default_event() const { return (*this)->default_event(); }
442  const sc_event &
444  {
445  return (*this)->value_changed_event();
446  }
447  const sc_event &posedge_event() const { return (*this)->posedge_event(); }
448  const sc_event &negedge_event() const { return (*this)->negedge_event(); }
449 
450  bool event() const { return (*this)->event(); }
451  bool posedge() const { return (*this)->posedge(); }
452  bool negedge() const { return (*this)->negedge(); }
453 
455  sc_event_finder &pos() const { return _posFinder; }
456  sc_event_finder &neg() const { return _negFinder; }
457 
458  virtual const char *kind() const { return "sc_in"; }
459 
460  void
461  add_trace(sc_trace_file *tf, const std::string &name) const
462  {
463  traceParamsVec.push_back(new sc_trace_params(tf, name));
464  }
465 
466  private:
471 
473 
474  // Disabled
475  sc_in(const sc_in<sc_dt::sc_logic> &);
477 };
478 
479 template <>
480 inline void
481 sc_trace<sc_dt::sc_logic>(sc_trace_file *tf, const sc_in<sc_dt::sc_logic> &i,
482  const std::string &name)
483 {
485  i.add_trace(tf, name);
486  else
487  sc_trace(tf, i->read(), name);
488 }
489 
490 } // namespace sc_core
491 
492 #endif //__SYSTEMC_EXT_CHANNEL_SC_IN_HH__
sc_event_finder_t< sc_signal_in_if< sc_dt::sc_logic > > _posFinder
Definition: sc_in.hh:469
sc_in< T > & operator=(const sc_in< T > &)
sc_event_finder_t< sc_signal_in_if< sc_dt::sc_logic > > _negFinder
Definition: sc_in.hh:470
virtual void bind(sc_port< sc_signal_in_if< T >, 1 > &i)
Definition: sc_in.hh:96
sc_event_finder & value_changed() const
Definition: sc_in.hh:454
void sc_trace< bool >(sc_trace_file *tf, const sc_in< bool > &i, const std::string &name)
Definition: sc_in.hh:320
sc_event_finder_t< sc_signal_in_if< T > > _valueChangedFinder
Definition: sc_in.hh:147
Bitfield< 7 > i
const sc_event & value_changed_event() const
Definition: sc_in.hh:131
sc_in(const char *name, const sc_signal_in_if< bool > &interface)
Definition: sc_in.hh:193
const sc_event & default_event() const
Definition: sc_in.hh:129
const sc_event & negedge_event() const
Definition: sc_in.hh:448
sc_in(sc_port_b< sc_signal_in_if< bool > > &parent)
Definition: sc_in.hh:200
sc_in(const char *name)
Definition: sc_in.hh:55
sc_event_finder & pos() const
Definition: sc_in.hh:455
sc_trace_params_vec traceParamsVec
Definition: sc_in.hh:311
sc_in(const char *name, sc_port_b< sc_signal_in_if< bool > > &parent)
Definition: sc_in.hh:207
Definition: sc_bit.cc:67
const char * name() const
Definition: sc_object.cc:46
bool negedge() const
Definition: sc_in.hh:292
sc_in(const sc_signal_in_if< T > &interface)
Definition: sc_in.hh:61
sc_event_finder & value_changed() const
Definition: sc_in.hh:136
virtual void bind(const sc_signal_in_if< sc_dt::sc_logic > &i)
Definition: sc_in.hh:399
sc_in(const char *name, sc_port_b< sc_signal_in_if< sc_dt::sc_logic > > &parent)
Definition: sc_in.hh:372
void add_trace(sc_trace_file *tf, const std::string &name) const
Definition: sc_in.hh:301
sc_in(const char *name, const sc_signal_in_if< T > &interface)
Definition: sc_in.hh:65
const sc_event & negedge_event() const
Definition: sc_in.hh:285
sc_event_finder_t< sc_signal_in_if< bool > > _valueChangedFinder
Definition: sc_in.hh:307
STL vector class.
Definition: stl.hh:40
sc_trace_params_vec traceParamsVec
Definition: sc_in.hh:472
sc_in(const sc_signal_in_if< sc_dt::sc_logic > &interface)
Definition: sc_in.hh:350
sc_event_finder & neg() const
Definition: sc_in.hh:296
virtual void bind(sc_port< sc_signal_inout_if< T >, 1 > &p)
Definition: sc_in.hh:107
virtual const char * kind() const
Definition: sc_in.hh:458
sc_event_finder & value_changed() const
Definition: sc_in.hh:294
virtual void bind(sc_port< sc_signal_inout_if< sc_dt::sc_logic >, 1 > &p)
Definition: sc_in.hh:419
sc_trace_params_vec traceParamsVec
Definition: sc_in.hh:149
virtual const char * kind() const
Definition: sc_in.hh:298
sc_event_finder & pos() const
Definition: sc_in.hh:295
const sc_event & value_changed_event() const
Definition: sc_in.hh:443
void sc_trace(sc_trace_file *tf, const sc_in< T > &i, const std::string &name)
Definition: sc_in.hh:158
sc_in(const char *name, sc_port< sc_signal_in_if< T >, 1 > &parent)
Definition: sc_in.hh:81
const sc_event & default_event() const
Definition: sc_in.hh:441
sc_event_finder_t< sc_signal_in_if< bool > > _posFinder
Definition: sc_in.hh:308
sc_in(const char *name, sc_port_b< sc_signal_in_if< T > > &parent)
Definition: sc_in.hh:73
sc_in(const char *name, const sc_signal_in_if< sc_dt::sc_logic > &interface)
Definition: sc_in.hh:357
sc_in(const char *name, sc_port< sc_signal_in_if< sc_dt::sc_logic >, 1 > &parent)
Definition: sc_in.hh:387
void operator()(const sc_signal_in_if< T > &i)
Definition: sc_in.hh:93
sc_event_finder_t< sc_signal_in_if< sc_dt::sc_logic > > _valueChangedFinder
Definition: sc_in.hh:468
virtual void end_of_elaboration()
Definition: sc_in.hh:430
void add_trace(sc_trace_file *tf, const std::string &name) const
Definition: sc_in.hh:461
sc_in(const sc_signal_in_if< bool > &interface)
Definition: sc_in.hh:186
sc_in(const char *name)
Definition: sc_in.hh:176
virtual void bind(sc_port< sc_signal_in_if< sc_dt::sc_logic >, 1 > &i)
Definition: sc_in.hh:408
virtual ~sc_in()
Definition: sc_in.hh:58
sc_status sc_get_status()
Definition: sc_main.cc:175
sc_in(sc_port< sc_signal_in_if< T >, 1 > &parent)
Definition: sc_in.hh:77
bool posedge() const
Definition: sc_in.hh:291
sc_in(const char *name, sc_port< sc_signal_in_if< bool >, 1 > &parent)
Definition: sc_in.hh:221
sc_in(sc_port_b< sc_signal_in_if< T > > &parent)
Definition: sc_in.hh:69
virtual ~sc_in()
Definition: sc_in.hh:183
virtual void bind(sc_port< sc_signal_in_if< bool >, 1 > &p)
Definition: sc_in.hh:240
const T & read() const
Definition: sc_in.hh:126
sc_in(sc_port< sc_signal_in_if< bool >, 1 > &parent)
Definition: sc_in.hh:214
const sc_event & posedge_event() const
Definition: sc_in.hh:280
virtual void bind(sc_port< sc_signal_inout_if< bool >, 1 > &p)
Definition: sc_in.hh:251
virtual const char * kind() const
Definition: sc_in.hh:138
virtual void bind(const sc_signal_in_if< bool > &i)
Definition: sc_in.hh:232
const sc_dt::sc_logic & read() const
Definition: sc_in.hh:438
sc_in(const char *name)
Definition: sc_in.hh:340
sc_event_finder & neg() const
Definition: sc_in.hh:456
void add_trace(sc_trace_file *tf, const std::string &name) const
Definition: sc_in.hh:141
bool event() const
Definition: sc_in.hh:135
sc_in(sc_port_b< sc_signal_in_if< sc_dt::sc_logic > > &parent)
Definition: sc_in.hh:365
Bitfield< 8 > tf
Definition: misc.hh:571
bool event() const
Definition: sc_in.hh:290
const sc_event & value_changed_event() const
Definition: sc_in.hh:275
virtual void end_of_elaboration()
Definition: sc_in.hh:262
const bool & read() const
Definition: sc_in.hh:270
Bitfield< 0 > p
void bind(sc_interface &)
Definition: sc_port.cc:111
virtual void bind(const sc_signal_in_if< T > &i)
Definition: sc_in.hh:88
const sc_event & default_event() const
Definition: sc_in.hh:273
sc_in(sc_port< sc_signal_in_if< sc_dt::sc_logic >, 1 > &parent)
Definition: sc_in.hh:380
const sc_event & posedge_event() const
Definition: sc_in.hh:447
sc_event_finder_t< sc_signal_in_if< bool > > _negFinder
Definition: sc_in.hh:309
virtual void end_of_elaboration()
Definition: sc_in.hh:118

Generated on Fri Feb 28 2020 16:27:03 for gem5 by doxygen 1.8.13