scc  2022.4.0
SystemC components library
signal_opt_ports.h
1 /*******************************************************************************
2  * Copyright 2001 - 2023 Accellera Systems Initiative Inc. (Accellera)
3  * Copyright 2023 MINRES Technologies GmbH
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *******************************************************************************/
17 /*
18  * Created on: Dec 17, 2023
19  * Author: eyck
20  */
21 
22 #ifndef _SYSC_SCC_OPT_SIGNAL_PORTS_H_
23 #define _SYSC_SCC_OPT_SIGNAL_PORTS_H_
24 
25 #include "sysc/communication/sc_event_finder.h"
26 #include "sysc/communication/sc_port.h"
27 #include "sysc/communication/sc_signal_ifs.h"
28 #include "sysc/datatypes/bit/sc_logic.h"
29 #include "sysc/tracing/sc_trace.h"
30 
31 #if !defined(SC_DISABLE_VIRTUAL_BIND)
32 #define SCC_VIRT virtual
33 #else
34 #define SCC_VIRT /* non-virtual */
35 #endif
36 
37 namespace scc {
38 
39 template <class T> class sc_in_opt : public sc_core::sc_port<sc_core::sc_signal_in_if<T>, 1, sc_core::SC_ZERO_OR_MORE_BOUND> {
40 public:
41  typedef T data_type;
42 
43  typedef sc_core::sc_signal_in_if<data_type> if_type;
44  typedef sc_core::sc_port<if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> base_type;
46  typedef typename base_type::port_type base_port_type;
47 
48  typedef if_type in_if_type;
49  typedef base_type in_port_type;
50  typedef sc_core::sc_signal_inout_if<data_type> inout_if_type;
51  typedef sc_core::sc_port<inout_if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> inout_port_type;
52 
53 public:
54  sc_in_opt()
55  : base_type() {}
56 
57  explicit sc_in_opt(const char* name_)
58  : base_type(name_) {}
59 
60  explicit sc_in_opt(const in_if_type& interface_)
61  : base_type(const_cast<in_if_type&>(interface_)) {}
62 
63  sc_in_opt(const char* name_, const in_if_type& interface_)
64  : base_type(name_, const_cast<in_if_type&>(interface_)) {}
65 
66  explicit sc_in_opt(in_port_type& parent_)
67  : base_type(parent_) {}
68 
69  sc_in_opt(const char* name_, in_port_type& parent_)
70  : base_type(name_, parent_) {}
71 
72  explicit sc_in_opt(inout_port_type& parent_)
73  : base_type() {
74  sc_core::sc_port_base::bind(parent_);
75  }
76 
77  sc_in_opt(const char* name_, inout_port_type& parent_)
78  : base_type(name_) {
79  sc_core::sc_port_base::bind(parent_);
80  }
81 
82  sc_in_opt(this_type& parent_)
83  : base_type(parent_) {}
84 
85  sc_in_opt(const char* name_, this_type& parent_)
86  : base_type(name_, parent_) {}
87 
88  sc_in_opt(const this_type&) = delete;
89 
90  virtual ~sc_in_opt() {}
91 
92  this_type& operator=(const this_type&) = delete;
93 
94  SCC_VIRT void bind(const in_if_type& interface_) { sc_core::sc_port_base::bind(const_cast<in_if_type&>(interface_)); }
95 
96  SCC_VIRT void bind(in_if_type& interface_) { this->bind(const_cast<const in_if_type&>(interface_)); }
97 
98  void operator()(const in_if_type& interface_) { this->bind(interface_); }
99 
100  SCC_VIRT void bind(in_port_type& parent_) { sc_core::sc_port_base::bind(parent_); }
101 
102  void operator()(in_port_type& parent_) { this->bind(parent_); }
103 
104  SCC_VIRT void bind(inout_port_type& parent_) { sc_core::sc_port_base::bind(parent_); }
105 
106  void operator()(inout_port_type& parent_) { this->bind(parent_); }
107 
108  const sc_core::sc_event& default_event() const { return (*this)->default_event(); }
109 
110  const sc_core::sc_event& value_changed_event() const { return (*this)->value_changed_event(); }
111 
112  const data_type& read() const { return (*this)->read(); }
113 
114  operator const data_type&() const { return (*this)->read(); }
115 
116  bool event() const { return (*this)->event(); }
117 
118  virtual const char* kind() const { return "sc_in"; }
119 };
120 
121 template <typename T>::std::ostream& operator<<(::std::ostream& os, const sc_in_opt<T>& a) { return os << a->read(); }
122 } // namespace scc
123 
124 SC_API_TEMPLATE_DECL_ sc_core::sc_port<sc_core::sc_signal_in_if<bool>, 1, sc_core::SC_ZERO_OR_MORE_BOUND>;
125 
126 namespace scc {
127 template <> class SC_API sc_in_opt<bool> : public sc_core::sc_port<sc_core::sc_signal_in_if<bool>, 1, sc_core::SC_ZERO_OR_MORE_BOUND> {
128 public:
129  typedef bool data_type;
130 
131  typedef sc_core::sc_signal_in_if<data_type> if_type;
132  typedef sc_core::sc_port<if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> base_type;
134  typedef /* typename */ base_type::port_type base_port_type;
135 
136  typedef if_type in_if_type;
137  typedef base_type in_port_type;
138  typedef sc_core::sc_signal_inout_if<data_type> inout_if_type;
139  typedef sc_core::sc_port<inout_if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> inout_port_type;
140 
141 public:
142  sc_in_opt()
143  : base_type() {}
144 
145  explicit sc_in_opt(const char* name_)
146  : base_type(name_) {}
147 
148  explicit sc_in_opt(const in_if_type& interface_)
149  : base_type(const_cast<in_if_type&>(interface_)) {}
150 
151  sc_in_opt(const char* name_, const in_if_type& interface_)
152  : base_type(name_, const_cast<in_if_type&>(interface_)) {}
153 
154  explicit sc_in_opt(in_port_type& parent_)
155  : base_type(parent_) {}
156 
157  sc_in_opt(const char* name_, in_port_type& parent_)
158  : base_type(name_, parent_) {}
159 
160  explicit sc_in_opt(inout_port_type& parent_)
161  : base_type() {
162  sc_port_base::bind(parent_);
163  }
164 
165  sc_in_opt(const char* name_, inout_port_type& parent_)
166  : base_type(name_) {
167  sc_port_base::bind(parent_);
168  }
169 
170  sc_in_opt(this_type& parent_)
171  : base_type(parent_) {}
172 
173  sc_in_opt(const char* name_, this_type& parent_)
174  : base_type(name_, parent_) {}
175 
176  sc_in_opt(const this_type&) = delete;
177 
178  virtual ~sc_in_opt() = default;
179 
180  this_type& operator=(const this_type&) = delete;
181 
182  SCC_VIRT void bind(const in_if_type& interface_) { sc_port_base::bind(const_cast<in_if_type&>(interface_)); }
183 
184  SCC_VIRT void bind(in_if_type& interface_) { this->bind(const_cast<const in_if_type&>(interface_)); }
185 
186  void operator()(const in_if_type& interface_) { this->bind(interface_); }
187 
188  SCC_VIRT void bind(in_port_type& parent_) { sc_port_base::bind(parent_); }
189 
190  void operator()(in_port_type& parent_) { this->bind(parent_); }
191 
192  SCC_VIRT void bind(inout_port_type& parent_) { sc_port_base::bind(parent_); }
193 
194  void operator()(inout_port_type& parent_) { this->bind(parent_); }
195 
196  const sc_core::sc_event& default_event() const { return (*this)->default_event(); }
197 
198  const sc_core::sc_event& value_changed_event() const { return (*this)->value_changed_event(); }
199 
200  const sc_core::sc_event& posedge_event() const { return (*this)->posedge_event(); }
201 
202  const sc_core::sc_event& negedge_event() const { return (*this)->negedge_event(); }
203 
204  const data_type& read() const { return (*this)->read(); }
205 
206  operator const data_type&() const { return (*this)->read(); }
207 
208  bool event() const { return (*this)->event(); }
209 
210  bool posedge() const { return (*this)->posedge(); }
211 
212  bool negedge() const { return (*this)->negedge(); }
213 
214  virtual const char* kind() const { return "sc_in"; }
215 };
216 
217 } // namespace scc
218 
219 SC_API_TEMPLATE_DECL_ sc_core::sc_port<sc_core::sc_signal_in_if<sc_dt::sc_logic>, 1, sc_core::SC_ZERO_OR_MORE_BOUND>;
220 
221 namespace scc {
222 template <>
223 class SC_API sc_in_opt<sc_dt::sc_logic>
224 : public sc_core::sc_port<sc_core::sc_signal_in_if<sc_dt::sc_logic>, 1, sc_core::SC_ZERO_OR_MORE_BOUND> {
225 public:
226  typedef sc_dt::sc_logic data_type;
227 
228  typedef sc_core::sc_signal_in_if<data_type> if_type;
229  typedef sc_core::sc_port<if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> base_type;
231  typedef /* typename */ base_type::port_type base_port_type;
232 
233  typedef if_type in_if_type;
234  typedef base_type in_port_type;
235  typedef sc_core::sc_signal_inout_if<data_type> inout_if_type;
236  typedef sc_core::sc_port<inout_if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> inout_port_type;
237 
238 public:
239  sc_in_opt()
240  : base_type() {}
241 
242  explicit sc_in_opt(const char* name_)
243  : base_type(name_) {}
244 
245  explicit sc_in_opt(const in_if_type& interface_)
246  : base_type(const_cast<in_if_type&>(interface_)) {}
247 
248  sc_in_opt(const char* name_, const in_if_type& interface_)
249  : base_type(name_, const_cast<in_if_type&>(interface_)) {}
250 
251  explicit sc_in_opt(in_port_type& parent_)
252  : base_type(parent_) {}
253 
254  sc_in_opt(const char* name_, in_port_type& parent_)
255  : base_type(name_, parent_) {}
256 
257  explicit sc_in_opt(inout_port_type& parent_)
258  : base_type() {
259  sc_port_base::bind(parent_);
260  }
261 
262  sc_in_opt(const char* name_, inout_port_type& parent_)
263  : base_type(name_) {
264  sc_port_base::bind(parent_);
265  }
266 
267  sc_in_opt(this_type& parent_)
268  : base_type(parent_) {}
269 
270  sc_in_opt(const char* name_, this_type& parent_)
271  : base_type(name_, parent_) {}
272 
273  sc_in_opt(const this_type&) = delete;
274 
275  virtual ~sc_in_opt() = default;
276 
277  this_type& operator=(const this_type&) = delete;
278 
279  SCC_VIRT void bind(const in_if_type& interface_) { sc_port_base::bind(const_cast<in_if_type&>(interface_)); }
280 
281  SCC_VIRT void bind(in_if_type& interface_) { this->bind(const_cast<const in_if_type&>(interface_)); }
282 
283  void operator()(const in_if_type& interface_) { this->bind(interface_); }
284 
285  SCC_VIRT void bind(in_port_type& parent_) { sc_port_base::bind(parent_); }
286 
287  void operator()(in_port_type& parent_) { this->bind(parent_); }
288 
289  SCC_VIRT void bind(inout_port_type& parent_) { sc_port_base::bind(parent_); }
290 
291  void operator()(inout_port_type& parent_) { this->bind(parent_); }
292 
293  const sc_core::sc_event& default_event() const { return (*this)->default_event(); }
294 
295  const sc_core::sc_event& value_changed_event() const { return (*this)->value_changed_event(); }
296 
297  const sc_core::sc_event& posedge_event() const { return (*this)->posedge_event(); }
298 
299  const sc_core::sc_event& negedge_event() const { return (*this)->negedge_event(); }
300 
301  const data_type& read() const { return (*this)->read(); }
302 
303  operator const data_type&() const { return (*this)->read(); }
304 
305  bool event() const { return (*this)->event(); }
306 
307  bool posedge() const { return (*this)->posedge(); }
308 
309  bool negedge() const { return (*this)->negedge(); }
310 
311  virtual const char* kind() const { return "sc_in"; }
312 };
313 
314 template <class T> class sc_inout_opt : public sc_core::sc_port<sc_core::sc_signal_inout_if<T>, 1, sc_core::SC_ZERO_OR_MORE_BOUND> {
315 public:
316  typedef T data_type;
317 
318  typedef sc_core::sc_signal_inout_if<data_type> if_type;
319  typedef sc_core::sc_port<if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> base_type;
321 
322  typedef sc_core::sc_signal_in_if<data_type> in_if_type;
323  typedef sc_core::sc_port<in_if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> in_port_type;
324  typedef if_type inout_if_type;
325  typedef base_type inout_port_type;
326 
327 public:
328  sc_inout_opt()
329  : base_type()
330  , m_init_val(0) {}
331 
332  explicit sc_inout_opt(const char* name_)
333  : base_type(name_)
334  , m_init_val(0) {}
335 
336  explicit sc_inout_opt(inout_if_type& interface_)
337  : base_type(interface_)
338  , m_init_val(0) {}
339 
340  sc_inout_opt(const char* name_, inout_if_type& interface_)
341  : base_type(name_, interface_)
342  , m_init_val(0) {}
343 
344  explicit sc_inout_opt(inout_port_type& parent_)
345  : base_type(parent_)
346  , m_init_val(0) {}
347 
348  sc_inout_opt(const char* name_, inout_port_type& parent_)
349  : base_type(name_, parent_)
350  , m_init_val(0) {}
351 
352  sc_inout_opt(this_type& parent_)
353  : base_type(parent_)
354  , m_init_val(0) {}
355 
356  sc_inout_opt(const char* name_, this_type& parent_)
357  : base_type(name_, parent_)
358  , m_init_val(0) {}
359 
360  sc_inout_opt(const this_type&) = delete;
361 
362  virtual ~sc_inout_opt() = default;
363 
364  const sc_core::sc_event& default_event() const { return (*this)->default_event(); }
365 
366  const sc_core::sc_event& value_changed_event() const { return (*this)->value_changed_event(); }
367 
368  const data_type& read() const { return (*this)->read(); }
369 
370  operator const data_type&() const { return (*this)->read(); }
371 
372  bool event() const { return (*this)->event(); }
373 
374  void write(const data_type& value_) { (*this)->write(value_); }
375 
376  this_type& operator=(const data_type& value_) {
377  (*this)->write(value_);
378  return *this;
379  }
380 
381  this_type& operator=(const in_if_type& interface_) {
382  (*this)->write(interface_.read());
383  return *this;
384  }
385 
386  this_type& operator=(const in_port_type& port_) {
387  (*this)->write(port_->read());
388  return *this;
389  }
390 
391  this_type& operator=(const inout_port_type& port_) {
392  (*this)->write(port_->read());
393  return *this;
394  }
395 
396  this_type& operator=(const this_type& port_) {
397  (*this)->write(port_->read());
398  return *this;
399  }
400 
401  void initialize(const data_type& value_);
402 
403  void initialize(const in_if_type& interface_) { initialize(interface_.read()); }
404 
405  void end_of_elaboration() override;
406 
407  virtual const char* kind() const { return "sc_inout"; }
408 
409 protected:
410  data_type* m_init_val;
411 };
412 
413 template <typename T>::std::ostream& operator<<(::std::ostream& os, const sc_inout_opt<T>& a) { return os << a->read(); }
414 
415 template <class T> inline void sc_inout_opt<T>::initialize(const data_type& value_) {
416  inout_if_type* iface = dynamic_cast<inout_if_type*>(this->get_interface());
417  if(iface != 0) {
418  iface->write(value_);
419  } else {
420  if(m_init_val == 0) {
421  m_init_val = new data_type;
422  }
423  *m_init_val = value_;
424  }
425 }
426 
427 template <class T> inline void sc_inout_opt<T>::end_of_elaboration() {
428  if(m_init_val != 0) {
429  write(*m_init_val);
430  delete m_init_val;
431  m_init_val = 0;
432  }
433 }
434 } // namespace scc
435 
436 SC_API_TEMPLATE_DECL_ sc_core::sc_port<sc_core::sc_signal_inout_if<bool>, 1, sc_core::SC_ZERO_OR_MORE_BOUND>;
437 
438 namespace scc {
439 template <>
440 class SC_API sc_inout_opt<bool> : public sc_core::sc_port<sc_core::sc_signal_inout_if<bool>, 1, sc_core::SC_ZERO_OR_MORE_BOUND> {
441 public:
442  typedef bool data_type;
443 
444  typedef sc_core::sc_signal_inout_if<data_type> if_type;
445  typedef sc_core::sc_port<if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> base_type;
447 
448  typedef sc_core::sc_signal_in_if<data_type> in_if_type;
449  typedef sc_core::sc_port<in_if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> in_port_type;
450  typedef if_type inout_if_type;
451  typedef base_type inout_port_type;
452 
453 public:
454  sc_inout_opt()
455  : base_type()
456  , m_init_val(0) {}
457 
458  explicit sc_inout_opt(const char* name_)
459  : base_type(name_)
460  , m_init_val(0) {}
461 
462  explicit sc_inout_opt(inout_if_type& interface_)
463  : base_type(interface_)
464  , m_init_val(0) {}
465 
466  sc_inout_opt(const char* name_, inout_if_type& interface_)
467  : base_type(name_, interface_)
468  , m_init_val(0) {}
469 
470  explicit sc_inout_opt(inout_port_type& parent_)
471  : base_type(parent_)
472  , m_init_val(0) {}
473 
474  sc_inout_opt(const char* name_, inout_port_type& parent_)
475  : base_type(name_, parent_)
476  , m_init_val(0) {}
477 
478  sc_inout_opt(this_type& parent_)
479  : base_type(parent_)
480  , m_init_val(0) {}
481 
482  sc_inout_opt(const char* name_, this_type& parent_)
483  : base_type(name_, parent_)
484  , m_init_val(0) {}
485 
486  sc_inout_opt(const this_type&) = delete;
487 
488  virtual ~sc_inout_opt() = default;
489 
490  const sc_core::sc_event& default_event() const { return (*this)->default_event(); }
491 
492  const sc_core::sc_event& value_changed_event() const { return (*this)->value_changed_event(); }
493 
494  const sc_core::sc_event& posedge_event() const { return (*this)->posedge_event(); }
495 
496  const sc_core::sc_event& negedge_event() const { return (*this)->negedge_event(); }
497 
498  const data_type& read() const { return (*this)->read(); }
499 
500  operator const data_type&() const { return (*this)->read(); }
501 
502  bool event() const { return (*this)->event(); }
503 
504  bool posedge() const { return (*this)->posedge(); }
505 
506  bool negedge() const { return (*this)->negedge(); }
507 
508  void write(const data_type& value_) { (*this)->write(value_); }
509 
510  this_type& operator=(const data_type& value_) {
511  (*this)->write(value_);
512  return *this;
513  }
514 
515  this_type& operator=(const in_if_type& interface_) {
516  (*this)->write(interface_.read());
517  return *this;
518  }
519 
520  this_type& operator=(const in_port_type& port_) {
521  (*this)->write(port_->read());
522  return *this;
523  }
524 
525  this_type& operator=(const inout_port_type& port_) {
526  (*this)->write(port_->read());
527  return *this;
528  }
529 
530  this_type& operator=(const this_type& port_) {
531  (*this)->write(port_->read());
532  return *this;
533  }
534 
535  void initialize(const data_type& value_);
536 
537  void initialize(const in_if_type& interface_) { initialize(interface_.read()); }
538 
539  void end_of_elaboration() override {
540  if(m_init_val != 0) {
541  write(*m_init_val);
542  delete m_init_val;
543  m_init_val = 0;
544  }
545  }
546 
547  virtual const char* kind() const { return "sc_inout"; }
548 
549 protected:
550  data_type* m_init_val;
551 };
552 } // namespace scc
553 
554 SC_API_TEMPLATE_DECL_ sc_core::sc_port<sc_core::sc_signal_inout_if<sc_dt::sc_logic>, 1, sc_core::SC_ZERO_OR_MORE_BOUND>;
555 
556 namespace scc {
557 template <>
558 class SC_API sc_inout_opt<sc_dt::sc_logic>
559 : public sc_core::sc_port<sc_core::sc_signal_inout_if<sc_dt::sc_logic>, 1, sc_core::SC_ZERO_OR_MORE_BOUND> {
560 public:
561  typedef sc_dt::sc_logic data_type;
562 
563  typedef sc_core::sc_signal_inout_if<data_type> if_type;
564  typedef sc_core::sc_port<if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> base_type;
566 
567  typedef sc_core::sc_signal_in_if<data_type> in_if_type;
568  typedef sc_core::sc_port<in_if_type, 1, sc_core::SC_ZERO_OR_MORE_BOUND> in_port_type;
569  typedef if_type inout_if_type;
570  typedef base_type inout_port_type;
571 
572 public:
573  sc_inout_opt()
574  : base_type()
575  , m_init_val(0) {}
576 
577  explicit sc_inout_opt(const char* name_)
578  : base_type(name_)
579  , m_init_val(0) {}
580 
581  explicit sc_inout_opt(inout_if_type& interface_)
582  : base_type(interface_)
583  , m_init_val(0) {}
584 
585  sc_inout_opt(const char* name_, inout_if_type& interface_)
586  : base_type(name_, interface_)
587  , m_init_val(0) {}
588 
589  explicit sc_inout_opt(inout_port_type& parent_)
590  : base_type(parent_)
591  , m_init_val(0) {}
592 
593  sc_inout_opt(const char* name_, inout_port_type& parent_)
594  : base_type(name_, parent_)
595  , m_init_val(0) {}
596 
597  sc_inout_opt(this_type& parent_)
598  : base_type(parent_)
599  , m_init_val(0) {}
600 
601  sc_inout_opt(const char* name_, this_type& parent_)
602  : base_type(name_, parent_)
603  , m_init_val(0) {}
604 
605  sc_inout_opt(const this_type&) = delete;
606 
607  virtual ~sc_inout_opt();
608 
609  const sc_core::sc_event& default_event() const { return (*this)->default_event(); }
610 
611  const sc_core::sc_event& value_changed_event() const { return (*this)->value_changed_event(); }
612 
613  const sc_core::sc_event& posedge_event() const { return (*this)->posedge_event(); }
614 
615  const sc_core::sc_event& negedge_event() const { return (*this)->negedge_event(); }
616 
617  const data_type& read() const { return (*this)->read(); }
618 
619  operator const data_type&() const { return (*this)->read(); }
620 
621  bool event() const { return (*this)->event(); }
622 
623  bool posedge() const { return (*this)->posedge(); }
624 
625  bool negedge() const { return (*this)->negedge(); }
626 
627  void write(const data_type& value_) { (*this)->write(value_); }
628 
629  this_type& operator=(const data_type& value_) {
630  (*this)->write(value_);
631  return *this;
632  }
633 
634  this_type& operator=(const in_if_type& interface_) {
635  (*this)->write(interface_.read());
636  return *this;
637  }
638 
639  this_type& operator=(const in_port_type& port_) {
640  (*this)->write(port_->read());
641  return *this;
642  }
643 
644  this_type& operator=(const inout_port_type& port_) {
645  (*this)->write(port_->read());
646  return *this;
647  }
648 
649  this_type& operator=(const this_type& port_) {
650  (*this)->write(port_->read());
651  return *this;
652  }
653 
654  void initialize(const data_type& value_);
655 
656  void initialize(const in_if_type& interface_) { initialize(interface_.read()); }
657 
658  // called when elaboration is done
659  void end_of_elaboration() override {
660  if(m_init_val != 0) {
661  write(*m_init_val);
662  delete m_init_val;
663  m_init_val = 0;
664  }
665  }
666 
667  virtual const char* kind() const { return "sc_inout"; }
668 
669 protected:
670  data_type* m_init_val;
671 };
672 
673 template <class T> class sc_out_opt : public sc_inout_opt<T> {
674 public:
675  typedef T data_type;
676 
678  typedef sc_inout_opt<data_type> base_type;
679 
680  typedef typename base_type::in_if_type in_if_type;
681  typedef typename base_type::in_port_type in_port_type;
682  typedef typename base_type::inout_if_type inout_if_type;
683  typedef typename base_type::inout_port_type inout_port_type;
684 
685 public:
686  sc_out_opt()
687  : base_type() {}
688 
689  explicit sc_out_opt(const char* name_)
690  : base_type(name_) {}
691 
692  explicit sc_out_opt(inout_if_type& interface_)
693  : base_type(interface_) {}
694 
695  sc_out_opt(const char* name_, inout_if_type& interface_)
696  : base_type(name_, interface_) {}
697 
698  explicit sc_out_opt(inout_port_type& parent_)
699  : base_type(parent_) {}
700 
701  sc_out_opt(const char* name_, inout_port_type& parent_)
702  : base_type(name_, parent_) {}
703 
704  sc_out_opt(this_type& parent_)
705  : base_type(parent_) {}
706 
707  sc_out_opt(const char* name_, this_type& parent_)
708  : base_type(name_, parent_) {}
709 
710  virtual ~sc_out_opt() {}
711 
712  this_type& operator=(const data_type& value_) {
713  (*this)->write(value_);
714  return *this;
715  }
716 
717  this_type& operator=(const in_if_type& interface_) {
718  (*this)->write(interface_.read());
719  return *this;
720  }
721 
722  this_type& operator=(const in_port_type& port_) {
723  (*this)->write(port_->read());
724  return *this;
725  }
726 
727  this_type& operator=(const inout_port_type& port_) {
728  (*this)->write(port_->read());
729  return *this;
730  }
731 
732  this_type& operator=(const this_type& port_) {
733  (*this)->write(port_->read());
734  return *this;
735  }
736 
737  virtual const char* kind() const { return "sc_out"; }
738 
739 private:
740  sc_out_opt(const this_type&) = delete;
741 };
742 
743 template <class T> inline void sc_trace(sc_core::sc_trace_file* tf, const sc_in_opt<T>& port, const std::string& name) {
744  const sc_core::sc_signal_in_if<T>* iface = 0;
745  if(sc_core::sc_get_curr_simcontext()->elaboration_done()) {
746  iface = dynamic_cast<const sc_core::sc_signal_in_if<T>*>(port.get_interface());
747  }
748  if(iface)
749  sc_trace(tf, iface->read(), name);
750  else
751  port.add_trace_internal(tf, name);
752 }
753 
754 template <class T> inline void sc_trace(sc_core::sc_trace_file* tf, const sc_inout_opt<T>& port, const std::string& name) {
755  const sc_core::sc_signal_in_if<T>* iface = 0;
756  if(sc_core::sc_get_curr_simcontext()->elaboration_done()) {
757  iface = dynamic_cast<const sc_core::sc_signal_in_if<T>*>(port.get_interface());
758  }
759 
760  if(iface)
761  sc_trace(tf, iface->read(), name);
762  else
763  port.add_trace_internal(tf, name);
764 }
765 
766 } // namespace scc
767 
768 #undef SCC_VIRT
769 
770 #if defined(_MSC_VER) && !defined(SC_WIN_DLL_WARN)
771 #pragma warning(pop)
772 #endif
773 #endif /* SCC_SRC_SYSC_SCC_OPT_SIGNAL_PORTS_H_ */
SCC SystemC utilities.
std::ostream & operator<<(std::ostream &os, log const &val)
output the textual representation of the log level
Definition: report.h:124