22 #ifndef _SYSC_SCC_OPT_SIGNAL_PORTS_H_
23 #define _SYSC_SCC_OPT_SIGNAL_PORTS_H_
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"
31 #if !defined(SC_DISABLE_VIRTUAL_BIND)
32 #define SCC_VIRT virtual
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> {
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;
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;
60 explicit sc_in_opt(
const in_if_type& interface_)
61 : base_type(
const_cast<in_if_type&
>(interface_)) {}
63 sc_in_opt(
const char* name_,
const in_if_type& interface_)
64 : base_type(name_,
const_cast<in_if_type&
>(interface_)) {}
67 : base_type(parent_) {}
69 sc_in_opt(
const char* name_, in_port_type& parent_)
70 : base_type(name_, parent_) {}
72 explicit sc_in_opt(inout_port_type& parent_)
74 sc_core::sc_port_base::bind(parent_);
77 sc_in_opt(
const char* name_, inout_port_type& parent_)
79 sc_core::sc_port_base::bind(parent_);
83 : base_type(parent_) {}
86 : base_type(name_, parent_) {}
94 SCC_VIRT
void bind(
const in_if_type& interface_) { sc_core::sc_port_base::bind(
const_cast<in_if_type&
>(interface_)); }
96 SCC_VIRT
void bind(in_if_type& interface_) { this->bind(
const_cast<const in_if_type&
>(interface_)); }
98 void operator()(
const in_if_type& interface_) { this->bind(interface_); }
100 SCC_VIRT
void bind(in_port_type& parent_) { sc_core::sc_port_base::bind(parent_); }
102 void operator()(in_port_type& parent_) { this->bind(parent_); }
104 SCC_VIRT
void bind(inout_port_type& parent_) { sc_core::sc_port_base::bind(parent_); }
106 void operator()(inout_port_type& parent_) { this->bind(parent_); }
108 const sc_core::sc_event& default_event()
const {
return (*this)->default_event(); }
110 const sc_core::sc_event& value_changed_event()
const {
return (*this)->value_changed_event(); }
112 const data_type& read()
const {
return (*this)->read(); }
114 operator const data_type&()
const {
return (*this)->read(); }
116 bool event()
const {
return (*this)->event(); }
118 virtual const char* kind()
const {
return "sc_in"; }
121 template <typename T>::std::ostream&
operator<<(::std::ostream& os,
const sc_in_opt<T>& a) {
return os << a->read(); }
124 SC_API_TEMPLATE_DECL_ sc_core::sc_port<sc_core::sc_signal_in_if<bool>, 1, sc_core::SC_ZERO_OR_MORE_BOUND>;
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> {
129 typedef bool data_type;
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 base_type::port_type base_port_type;
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;
146 : base_type(name_) {}
148 explicit sc_in_opt(
const in_if_type& interface_)
149 : base_type(
const_cast<in_if_type&
>(interface_)) {}
151 sc_in_opt(
const char* name_,
const in_if_type& interface_)
152 : base_type(name_,
const_cast<in_if_type&
>(interface_)) {}
154 explicit sc_in_opt(in_port_type& parent_)
155 : base_type(parent_) {}
157 sc_in_opt(
const char* name_, in_port_type& parent_)
158 : base_type(name_, parent_) {}
160 explicit sc_in_opt(inout_port_type& parent_)
162 sc_port_base::bind(parent_);
165 sc_in_opt(
const char* name_, inout_port_type& parent_)
167 sc_port_base::bind(parent_);
171 : base_type(parent_) {}
174 : base_type(name_, parent_) {}
182 SCC_VIRT
void bind(
const in_if_type& interface_) { sc_port_base::bind(
const_cast<in_if_type&
>(interface_)); }
184 SCC_VIRT
void bind(in_if_type& interface_) { this->bind(
const_cast<const in_if_type&
>(interface_)); }
186 void operator()(
const in_if_type& interface_) { this->bind(interface_); }
188 SCC_VIRT
void bind(in_port_type& parent_) { sc_port_base::bind(parent_); }
190 void operator()(in_port_type& parent_) { this->bind(parent_); }
192 SCC_VIRT
void bind(inout_port_type& parent_) { sc_port_base::bind(parent_); }
194 void operator()(inout_port_type& parent_) { this->bind(parent_); }
196 const sc_core::sc_event& default_event()
const {
return (*this)->default_event(); }
198 const sc_core::sc_event& value_changed_event()
const {
return (*this)->value_changed_event(); }
200 const sc_core::sc_event& posedge_event()
const {
return (*this)->posedge_event(); }
202 const sc_core::sc_event& negedge_event()
const {
return (*this)->negedge_event(); }
204 const data_type& read()
const {
return (*this)->read(); }
206 operator const data_type&()
const {
return (*this)->read(); }
208 bool event()
const {
return (*this)->event(); }
210 bool posedge()
const {
return (*this)->posedge(); }
212 bool negedge()
const {
return (*this)->negedge(); }
214 virtual const char* kind()
const {
return "sc_in"; }
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>;
224 :
public sc_core::sc_port<sc_core::sc_signal_in_if<sc_dt::sc_logic>, 1, sc_core::SC_ZERO_OR_MORE_BOUND> {
226 typedef sc_dt::sc_logic data_type;
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 base_type::port_type base_port_type;
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;
243 : base_type(name_) {}
245 explicit sc_in_opt(
const in_if_type& interface_)
246 : base_type(
const_cast<in_if_type&
>(interface_)) {}
248 sc_in_opt(
const char* name_,
const in_if_type& interface_)
249 : base_type(name_,
const_cast<in_if_type&
>(interface_)) {}
251 explicit sc_in_opt(in_port_type& parent_)
252 : base_type(parent_) {}
254 sc_in_opt(
const char* name_, in_port_type& parent_)
255 : base_type(name_, parent_) {}
257 explicit sc_in_opt(inout_port_type& parent_)
259 sc_port_base::bind(parent_);
262 sc_in_opt(
const char* name_, inout_port_type& parent_)
264 sc_port_base::bind(parent_);
268 : base_type(parent_) {}
271 : base_type(name_, parent_) {}
279 SCC_VIRT
void bind(
const in_if_type& interface_) { sc_port_base::bind(
const_cast<in_if_type&
>(interface_)); }
281 SCC_VIRT
void bind(in_if_type& interface_) { this->bind(
const_cast<const in_if_type&
>(interface_)); }
283 void operator()(
const in_if_type& interface_) { this->bind(interface_); }
285 SCC_VIRT
void bind(in_port_type& parent_) { sc_port_base::bind(parent_); }
287 void operator()(in_port_type& parent_) { this->bind(parent_); }
289 SCC_VIRT
void bind(inout_port_type& parent_) { sc_port_base::bind(parent_); }
291 void operator()(inout_port_type& parent_) { this->bind(parent_); }
293 const sc_core::sc_event& default_event()
const {
return (*this)->default_event(); }
295 const sc_core::sc_event& value_changed_event()
const {
return (*this)->value_changed_event(); }
297 const sc_core::sc_event& posedge_event()
const {
return (*this)->posedge_event(); }
299 const sc_core::sc_event& negedge_event()
const {
return (*this)->negedge_event(); }
301 const data_type& read()
const {
return (*this)->read(); }
303 operator const data_type&()
const {
return (*this)->read(); }
305 bool event()
const {
return (*this)->event(); }
307 bool posedge()
const {
return (*this)->posedge(); }
309 bool negedge()
const {
return (*this)->negedge(); }
311 virtual const char* kind()
const {
return "sc_in"; }
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> {
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;
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;
337 : base_type(interface_)
340 sc_inout_opt(
const char* name_, inout_if_type& interface_)
341 : base_type(name_, interface_)
348 sc_inout_opt(
const char* name_, inout_port_type& parent_)
349 : base_type(name_, parent_)
357 : base_type(name_, parent_)
364 const sc_core::sc_event& default_event()
const {
return (*this)->default_event(); }
366 const sc_core::sc_event& value_changed_event()
const {
return (*this)->value_changed_event(); }
368 const data_type& read()
const {
return (*this)->read(); }
370 operator const data_type&()
const {
return (*this)->read(); }
372 bool event()
const {
return (*this)->event(); }
374 void write(
const data_type& value_) { (*this)->write(value_); }
376 this_type& operator=(
const data_type& value_) {
377 (*this)->write(value_);
381 this_type& operator=(
const in_if_type& interface_) {
382 (*this)->write(interface_.read());
386 this_type& operator=(
const in_port_type& port_) {
387 (*this)->write(port_->read());
391 this_type& operator=(
const inout_port_type& port_) {
392 (*this)->write(port_->read());
397 (*this)->write(port_->read());
401 void initialize(
const data_type& value_);
403 void initialize(
const in_if_type& interface_) { initialize(interface_.read()); }
405 void end_of_elaboration()
override;
407 virtual const char* kind()
const {
return "sc_inout"; }
410 data_type* m_init_val;
413 template <typename T>::std::ostream&
operator<<(::std::ostream& os,
const sc_inout_opt<T>& a) {
return os << a->read(); }
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());
418 iface->write(value_);
420 if(m_init_val == 0) {
421 m_init_val =
new data_type;
423 *m_init_val = value_;
427 template <
class T>
inline void sc_inout_opt<T>::end_of_elaboration() {
428 if(m_init_val != 0) {
436 SC_API_TEMPLATE_DECL_ sc_core::sc_port<sc_core::sc_signal_inout_if<bool>, 1, sc_core::SC_ZERO_OR_MORE_BOUND>;
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> {
442 typedef bool data_type;
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;
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;
463 : base_type(interface_)
466 sc_inout_opt(
const char* name_, inout_if_type& interface_)
467 : base_type(name_, interface_)
474 sc_inout_opt(
const char* name_, inout_port_type& parent_)
475 : base_type(name_, parent_)
483 : base_type(name_, parent_)
490 const sc_core::sc_event& default_event()
const {
return (*this)->default_event(); }
492 const sc_core::sc_event& value_changed_event()
const {
return (*this)->value_changed_event(); }
494 const sc_core::sc_event& posedge_event()
const {
return (*this)->posedge_event(); }
496 const sc_core::sc_event& negedge_event()
const {
return (*this)->negedge_event(); }
498 const data_type& read()
const {
return (*this)->read(); }
500 operator const data_type&()
const {
return (*this)->read(); }
502 bool event()
const {
return (*this)->event(); }
504 bool posedge()
const {
return (*this)->posedge(); }
506 bool negedge()
const {
return (*this)->negedge(); }
508 void write(
const data_type& value_) { (*this)->write(value_); }
510 this_type& operator=(
const data_type& value_) {
511 (*this)->write(value_);
515 this_type& operator=(
const in_if_type& interface_) {
516 (*this)->write(interface_.read());
520 this_type& operator=(
const in_port_type& port_) {
521 (*this)->write(port_->read());
525 this_type& operator=(
const inout_port_type& port_) {
526 (*this)->write(port_->read());
531 (*this)->write(port_->read());
535 void initialize(
const data_type& value_);
537 void initialize(
const in_if_type& interface_) { initialize(interface_.read()); }
539 void end_of_elaboration()
override {
540 if(m_init_val != 0) {
547 virtual const char* kind()
const {
return "sc_inout"; }
550 data_type* m_init_val;
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>;
559 :
public sc_core::sc_port<sc_core::sc_signal_inout_if<sc_dt::sc_logic>, 1, sc_core::SC_ZERO_OR_MORE_BOUND> {
561 typedef sc_dt::sc_logic data_type;
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;
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;
582 : base_type(interface_)
585 sc_inout_opt(
const char* name_, inout_if_type& interface_)
586 : base_type(name_, interface_)
593 sc_inout_opt(
const char* name_, inout_port_type& parent_)
594 : base_type(name_, parent_)
602 : base_type(name_, parent_)
609 const sc_core::sc_event& default_event()
const {
return (*this)->default_event(); }
611 const sc_core::sc_event& value_changed_event()
const {
return (*this)->value_changed_event(); }
613 const sc_core::sc_event& posedge_event()
const {
return (*this)->posedge_event(); }
615 const sc_core::sc_event& negedge_event()
const {
return (*this)->negedge_event(); }
617 const data_type& read()
const {
return (*this)->read(); }
619 operator const data_type&()
const {
return (*this)->read(); }
621 bool event()
const {
return (*this)->event(); }
623 bool posedge()
const {
return (*this)->posedge(); }
625 bool negedge()
const {
return (*this)->negedge(); }
627 void write(
const data_type& value_) { (*this)->write(value_); }
629 this_type& operator=(
const data_type& value_) {
630 (*this)->write(value_);
634 this_type& operator=(
const in_if_type& interface_) {
635 (*this)->write(interface_.read());
639 this_type& operator=(
const in_port_type& port_) {
640 (*this)->write(port_->read());
644 this_type& operator=(
const inout_port_type& port_) {
645 (*this)->write(port_->read());
650 (*this)->write(port_->read());
654 void initialize(
const data_type& value_);
656 void initialize(
const in_if_type& interface_) { initialize(interface_.read()); }
659 void end_of_elaboration()
override {
660 if(m_init_val != 0) {
667 virtual const char* kind()
const {
return "sc_inout"; }
670 data_type* m_init_val;
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;
690 : base_type(name_) {}
692 explicit sc_out_opt(inout_if_type& interface_)
693 : base_type(interface_) {}
695 sc_out_opt(
const char* name_, inout_if_type& interface_)
696 : base_type(name_, interface_) {}
699 : base_type(parent_) {}
701 sc_out_opt(
const char* name_, inout_port_type& parent_)
702 : base_type(name_, parent_) {}
705 : base_type(parent_) {}
708 : base_type(name_, parent_) {}
712 this_type& operator=(
const data_type& value_) {
713 (*this)->write(value_);
717 this_type& operator=(
const in_if_type& interface_) {
718 (*this)->write(interface_.read());
722 this_type& operator=(
const in_port_type& port_) {
723 (*this)->write(port_->read());
727 this_type& operator=(
const inout_port_type& port_) {
728 (*this)->write(port_->read());
733 (*this)->write(port_->read());
737 virtual const char* kind()
const {
return "sc_out"; }
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());
749 sc_trace(tf, iface->read(), name);
751 port.add_trace_internal(tf, name);
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());
761 sc_trace(tf, iface->read(), name);
763 port.add_trace_internal(tf, name);
770 #if defined(_MSC_VER) && !defined(SC_WIN_DLL_WARN)
std::ostream & operator<<(std::ostream &os, log const &val)
output the textual representation of the log level