178#if !defined(SC_SIGNAL_SIGNED_H)
179#define SC_SIGNAL_SIGNED_H
181#if ( !defined(_MSC_VER) || _MSC_VER > 1200 )
182# define SC_TEMPLATE template<int W>
184# define SC_TEMPLATE template<> template<int W>
193class sc_signed_sigref;
262 virtual bool event()
const = 0;
345 explicit inline sc_signal(
const char* name_);
349 inline bool base_event()
const;
351 inline const sc_event& base_value_changed_event()
const;
358 virtual inline const char*
kind()
const;
359 virtual inline void update();
370 virtual inline void write_part(
sc_dt::int64 v,
int left,
int right );
371 virtual inline void write_part(
sc_dt::uint64 v,
int left,
int right );
372 virtual inline void write_part(
const sc_dt::sc_signed& v,
int left,
int right );
376 virtual inline bool event()
const;
391 inline void operator = (
const this_type& new_val );
392 inline void operator = (
const char* new_val );
398 inline void operator = (
unsigned int new_val );
399 inline void operator = (
unsigned long new_val );
400 inline void operator = (
unsigned short new_val );
410 virtual inline void concat_set(
sc_dt::int64 src,
int low_i);
414 virtual inline void concat_set(
sc_dt::uint64 src,
int low_i);
491 mutable sc_event* m_changed_event_p;
502 return simcontext()->delta_count() == m_event_delta + 1;
516 if ( !m_changed_event_p ) m_changed_event_p =
new sc_event;
517 return *m_changed_event_p;
524# if defined(DEBUG_SYSTEMC)
534# if defined(DEBUG_SYSTEMC)
544# if defined(DEBUG_SYSTEMC)
555# if defined(DEBUG_SYSTEMC)
573 if( m_writer_p == 0 )
575 m_writer_p = writer_p;
577 else if( m_writer_p != writer_p )
580 m_writer_p->name(), writer_p->name() );
600 base_write(src >> low_i);
610 const sc_dt::sc_lv_base& src,
int low_i)
612 sc_dt::sc_unsigned tmp(src.
length());
619 const sc_dt::sc_signed& src,
int low_i)
621 base_write( (src >> low_i) );
626 const sc_dt::sc_unsigned& src,
int low_i)
628 base_write( (src >> low_i) );
634 base_write( (
sc_dt::uint64)(( low_i < 64 ) ? src >> low_i : 0));
641 {
return base_value_changed_event(); }
646 {
return base_event(); }
679 result_p->initialize(
this, left, right);
693 return operator () (bit,bit);
699 { base_write( new_val ); }
703 { sc_dt::sc_bigint<W> tmp = new_val; m_new_val = tmp; request_update(); }
708 { base_write(new_val); }
713 { base_write(new_val); }
748 const sc_dt::sc_generic_base<T>& new_val )
750 sc_dt::sc_unsigned temp(W);
751 new_val->to_sc_unsigned(temp);
757 { base_write(new_val); }
761 { base_write( (sc_dt::sc_bigint<W>)new_val ); }
765 { base_write( (sc_dt::sc_bigint<W>)new_val ); }
771 { base_write(new_val); }
785 int left,
int right )
const
795 std::string nm( if_typename_ );
798 if( m_output_p != 0 )
801 m_output_p->name(), port_.name() );
806 if ( &port_ && if_typename_ ) {}
814 m_changed_event_p(0),
824 m_changed_event_p(0),
834 if ( m_changed_event_p )
delete m_changed_event_p;
841 if ( m_changed_event_p )
843 if ( m_new_val != *
this )
845 m_changed_event_p->notify_delayed();
846 m_event_delta = simcontext()->delta_count();
855 {
return base_value_changed_event(); }
860 { base_write( value ); }
865 { base_write( value ); }
870 { base_write( value); }
887 m_new_val(left, right) =
v;
896 m_new_val(left, right) =
v;
904 const sc_dt::sc_signed& v,
int left,
int right )
906 m_new_val(left, right) =
v;
914 const sc_dt::sc_unsigned& v,
int left,
int right )
916 m_new_val(left, right) =
v;
929class sc_in<sc_dt::sc_bigint<W> > :
930 public sc_port<sc_signal_in_if<sc_dt::sc_bigint<W> >, 1,
931 SC_ONE_OR_MORE_BOUND>,
932 public sc_dt::sc_value_base
938 typedef sc_dt::sc_bigint<W> data_type;
939 typedef sc_signal_in_if<sc_dt::sc_bigint<W> > if_type;
943 typedef if_type in_if_type;
944 typedef base_type in_port_type;
945 typedef sc_signal_inout_if<sc_dt::sc_bigint<W> > inout_if_type;
946 typedef sc_inout<sc_dt::sc_bigint<W> > inout_port_type;
952 void bind(
const in_if_type& interface_ )
956 void bind( in_port_type& parent_ )
960 void bind( inout_port_type& parent_ )
967 virtual inline int vbind( sc_interface& interface_ )
973 in_port_type* in_parent =
dynamic_cast<in_port_type*
>( &parent_ );
974 if( in_parent != 0 ) {
978 inout_port_type* inout_parent =
dynamic_cast<inout_port_type*
>( &parent_ );
979 if( inout_parent != 0 ) {
992 : base_type(), m_traces( 0 )
995 explicit sc_in(
const char* name_ )
996 : base_type( name_ ), m_traces( 0 )
999 explicit sc_in(
const in_if_type& interface_ )
1000 : base_type( const_cast<in_if_type&>( interface_ ) ), m_traces( 0 )
1003 sc_in(
const char* name_,
const in_if_type& interface_ )
1004 : base_type( name_, const_cast<in_if_type&>( interface_ ) ), m_traces( 0 )
1007 explicit sc_in( in_port_type& parent_ )
1008 : base_type( parent_ ), m_traces( 0 )
1011 sc_in(
const char* name_, in_port_type& parent_ )
1012 : base_type( name_, parent_ ), m_traces( 0 )
1015 explicit sc_in( inout_port_type& parent_ )
1016 : base_type(), m_traces( 0 )
1019 sc_in(
const char* name_, inout_port_type& parent_ )
1020 : base_type( name_ ), m_traces( 0 )
1023 sc_in( this_type& parent_ )
1024 : base_type( parent_ ), m_traces( 0 )
1027 sc_in(
const char* name_, this_type& parent_ )
1028 : base_type( name_, parent_ ), m_traces( 0 )
1041 sc_dt::sc_signed_bitref_r
operator [] (
int i )
const
1042 {
return (*this)->read()[
i]; }
1043 sc_dt::sc_signed_bitref_r bit(
int i )
const
1044 {
return (*this)->read()[
i]; }
1045 sc_dt::sc_signed_subref_r
operator () (
int left,
int right )
const
1046 {
return (*this)->read()(left,right); }
1047 sc_dt::sc_signed_subref_r range(
int left,
int right )
const
1048 {
return (*this)->read()(left,right); }
1056 {
return (*this)->value_changed_event(); }
1062 {
return (*this)->value_changed_event(); }
1067 const sc_dt::sc_bigint<W>&
read()
const
1068 {
return (*this)->read(); }
1070 operator const sc_dt::sc_bigint<W>& ()
const
1071 {
return (*this)->read(); }
1076 {
return (*this)->event(); }
1083 return *
new sc_event_finder_t<in_if_type>(
1084 *
this, &in_if_type::value_changed_event );
1092 {
return (*this)->read().and_reduce(); }
1094 {
return (*this)->read().nand_reduce(); }
1096 {
return (*this)->read().nor_reduce(); }
1098 {
return (*this)->read().or_reduce(); }
1100 {
return (*this)->read().xnor_reduce(); }
1102 {
return (*this)->read().xor_reduce(); }
1111 if( m_traces != 0 ) {
1112 for(
unsigned int i = 0;
i < m_traces->size(); ++
i ) {
1113 sc_trace_params*
p = (*m_traces)[
i];
1120 virtual inline const char*
kind()
const
1125 void add_trace( sc_trace_file* tf_,
const std::string& name_ )
const
1128 if( m_traces == 0 ) {
1131 m_traces->push_back(
new sc_trace_params( tf_, name_ ) );
1138 virtual inline int concat_length(
bool* xz_present_p)
const
1139 {
return (*this)->read().concat_length( xz_present_p ); }
1141 {
return (*this)->read().concat_get_uint64(); }
1142 virtual inline bool concat_get_ctrl(
sc_dt::sc_digit* dst_p,
int low_i )
const
1143 {
return (*this)->read().concat_get_ctrl(dst_p, low_i); }
1144 virtual inline bool concat_get_data(
sc_dt::sc_digit* dst_p,
int low_i )
const
1145 {
return (*this)->read().concat_get_data(dst_p, low_i); }
1148 void remove_traces()
const
1150 if( m_traces != 0 ) {
1151 for(
int i = m_traces->size() - 1; i >= 0; -- i ) {
1152 delete (*m_traces)[
i];
1173 static data_type dummy;
1184 a.read().print( os );
1199 public sc_port<sc_signal_inout_if<sc_dt::sc_bigint<W> >, 1,
1200 SC_ONE_OR_MORE_BOUND>,
1212 typedef if_type inout_if_type;
1213 typedef base_type inout_port_type;
1219 void bind(
const inout_if_type& interface_ )
1221 void operator () (
const inout_if_type& interface_ )
1223 void bind( inout_port_type& parent_ )
1230 virtual inline int vbind( sc_interface& interface_ )
1236 inout_port_type* inout_parent =
dynamic_cast<inout_port_type*
>( &parent_ );
1237 if( inout_parent != 0 ) {
1250 : base_type(), m_init_val_p(0), m_traces( 0 )
1253 explicit sc_inout(
const char* name_ )
1254 : base_type( name_ ), m_init_val_p(0), m_traces( 0 )
1257 explicit sc_inout( inout_if_type& interface_ )
1258 : base_type( interface_ ), m_init_val_p(0), m_traces( 0 )
1261 sc_inout(
const char* name_, inout_if_type& interface_ )
1262 : base_type( name_, interface_ ), m_init_val_p(0), m_traces( 0 )
1265 explicit sc_inout( inout_port_type& parent_ )
1266 : base_type( parent_ ), m_init_val_p(0), m_traces( 0 )
1269 sc_inout(
const char* name_, inout_port_type& parent_ )
1270 : base_type( name_, parent_ ), m_init_val_p(0), m_traces( 0 )
1274 : base_type( parent_ ), m_init_val_p(0), m_traces( 0 )
1277 sc_inout(
const char* name_, this_type& parent_ )
1278 : base_type( name_, parent_ ), m_init_val_p(0), m_traces( 0 )
1291 sc_dt::sc_signed_bitref_r
operator [] (
int i )
const
1292 {
return (*this)->read()[
i]; }
1293 sc_dt::sc_signed_bitref_r bit(
int i )
const
1294 {
return (*this)->read()[
i]; }
1296 {
return (*this)->select_part(i,i); }
1297 sc_signed_sigref& bit(
int i )
1298 {
return (*this)->select_part(i,i); }
1299 sc_dt::sc_signed_subref_r
operator () (
int left,
int right )
const
1300 {
return (*this)->read()(left,right); }
1301 sc_dt::sc_signed_subref_r range(
int left,
int right )
const
1302 {
return (*this)->read()(left,right); }
1303 sc_signed_sigref&
operator () (
int left,
int right )
1304 {
return (*this)->select_part(left,right); }
1305 sc_signed_sigref& range(
int left,
int right )
1306 {
return (*this)->select_part(left,right); }
1314 {
return (*this)->value_changed_event(); }
1320 {
return (*this)->value_changed_event(); }
1325 const sc_dt::sc_bigint<W>&
read()
const
1326 {
return (*this)->read(); }
1328 operator const sc_dt::sc_bigint<W>& ()
const
1329 {
return (*this)->read(); }
1334 {
return (*this)->event(); }
1341 return *
new sc_event_finder_t<inout_if_type>(
1342 *
this, &inout_if_type::value_changed_event );
1350 {
return (*this)->read().and_reduce(); }
1352 {
return (*this)->read().nand_reduce(); }
1354 {
return (*this)->read().nor_reduce(); }
1356 {
return (*this)->read().or_reduce(); }
1358 {
return (*this)->read().xnor_reduce(); }
1360 {
return (*this)->read().xor_reduce(); }
1369 if( m_init_val_p != 0 ) {
1370 (*this)->write( *m_init_val_p );
1371 delete m_init_val_p;
1374 if( m_traces != 0 ) {
1375 for(
unsigned int i = 0;
i < m_traces->size(); ++
i ) {
1376 sc_trace_params*
p = (*m_traces)[
i];
1383 virtual inline const char*
kind()
const
1384 {
return "sc_inout"; }
1388 inline void initialize(
const sc_dt::sc_bigint<W>& value_ )
1390 inout_if_type* iface =
dynamic_cast<inout_if_type*
>( this->
get_interface() );
1392 iface->write( value_ );
1394 if( m_init_val_p == 0 ) {
1395 m_init_val_p =
new sc_dt::sc_bigint<W>;
1397 *m_init_val_p = value_;
1403 void add_trace( sc_trace_file* tf_,
const std::string& name_ )
const
1406 if( m_traces == 0 ) {
1409 m_traces->push_back(
new sc_trace_params( tf_, name_ ) );
1416 virtual inline int concat_length(
bool* xz_present_p)
const
1417 {
return (*this)->read().concat_length( xz_present_p ); }
1419 {
return (*this)->read().concat_get_uint64(); }
1420 virtual inline bool concat_get_ctrl(
sc_dt::sc_digit* dst_p,
int low_i )
const
1421 {
return (*this)->read().concat_get_ctrl(dst_p, low_i); }
1422 virtual inline bool concat_get_data(
sc_dt::sc_digit* dst_p,
int low_i )
const
1423 {
return (*this)->read().concat_get_data(dst_p, low_i); }
1424 virtual inline void concat_set(
sc_dt::int64 src,
int low_i)
1425 { *
this = (src >> ((low_i < 64) ? low_i : 63)); }
1427 virtual inline void concat_set(
const sc_dt::sc_lv_base& src,
int low_i)
1428 { *
this = src >> low_i; }
1430 virtual inline void concat_set(
const sc_dt::sc_signed& src,
int low_i)
1431 { *
this = (src >> low_i); }
1432 virtual inline void concat_set(
const sc_dt::sc_unsigned& src,
int low_i)
1433 { *
this = (src >> low_i); }
1434 virtual inline void concat_set(
sc_dt::uint64 src,
int low_i)
1435 { *
this = ((low_i < 64) ? (src >> low_i) : (
sc_dt::uint64)0); }
1439 inline void operator = (
const this_type& new_val )
1440 { (*this)->write( new_val.read() ); }
1441 inline void operator = (
const char* new_val )
1442 { sc_dt::sc_signed
aa(W);
aa = new_val; (*this)->write( aa ); }
1444 { (*this)->write(new_val); }
1446 { (*this)->write(new_val); }
1453 inline void operator = (
unsigned int new_val )
1455 inline void operator = (
unsigned long new_val )
1457 inline void operator = (
unsigned short new_val )
1459 template<
typename T>
1460 inline void operator = (
const sc_dt::sc_generic_base<T>& new_val )
1462 sc_dt::sc_unsigned temp(W);
1463 new_val->to_sc_unsigned(temp);
1464 (*this)->write(temp);
1466 inline void operator = (
const sc_dt::sc_signed& new_val )
1467 { (*this)->write(new_val); }
1468 inline void operator = (
const sc_dt::sc_unsigned& new_val )
1469 { (*this)->write(new_val); }
1470 inline void operator = (
const sc_dt::sc_bv_base& new_val )
1471 { (*this)->write((sc_dt::sc_bigint<W>)new_val); }
1472 inline void operator = (
const sc_dt::sc_lv_base& new_val )
1473 { (*this)->write((sc_dt::sc_bigint<W>)new_val); }
1475 inline void write(
const sc_in<sc_dt::sc_bigint<W> >& new_val )
1476 { (*this)->write( new_val.read() ); }
1477 inline void write(
const sc_inout<sc_dt::sc_bigint<W> >& new_val )
1478 { (*this)->write( new_val.read() ); }
1479 inline void write(
const sc_dt::sc_bigint<W>& new_val )
1480 { (*this)->write( new_val); }
1483 void remove_traces()
const
1485 if( m_traces != 0 ) {
1486 for(
int i = m_traces->size() - 1; i >= 0; -- i ) {
1487 delete (*m_traces)[
i];
1494 sc_dt::sc_bigint<W>* m_init_val_p;
1508 static data_type dummy;
1519 a.read().print( os );
1595 { (*this)->write(new_val); }
1610 template<
typename T>
1614 new_val->to_sc_unsigned(temp);
1615 (*this)->write(temp);
1618 { (*this)->write(new_val); }
1620 { (*this)->write(new_val); }
1697 v->to_sc_unsigned(temp);
1727 const char* first_writer,
1728 const char* second_writer );
1795 tmp = (src < 0) ? -1 : 0;
1822 uint64 tmp = (low_i < 63) ? (src >> low_i) : 0;
sc_in< T > & operator=(const sc_in< T > &)
void add_trace(sc_trace_file *tf, const std::string &name) const
void operator()(const sc_signal_in_if< T > &i)
virtual const char * kind() const
const sc_event & value_changed_event() const
const sc_event & default_event() const
virtual void end_of_elaboration()
virtual void bind(const sc_signal_in_if< T > &i)
sc_event_finder & value_changed() const
virtual const char * kind() const
void initialize(const T &t)
void add_trace(sc_trace_file *tf, const std::string &name) const
const sc_event & value_changed_event() const
sc_event_finder & value_changed() const
const sc_event & default_event() const
virtual void end_of_elaboration()
sc_inout< T > & operator=(const T &t)
sc_out(inout_if_type &interface_)
sc_out(const char *name_, this_type &parent_)
sc_out(const char *name_, inout_port_type &parent_)
sc_out(const char *name_)
sc_dt::sc_bigint< W > data_type
sc_out(this_type &parent_)
sc_out< data_type > this_type
sc_out(inout_port_type &parent_)
sc_out(const char *name_, inout_if_type &interface_)
base_type::inout_port_type inout_port_type
base_type::inout_if_type inout_if_type
sc_inout< data_type > base_type
sc_out(const this_type &)
sc_out< T > & operator=(const T &t)
int vbind(sc_interface &i) override
void bind(sc_interface &)
sc_port_base(const char *name, int n, sc_port_policy p)
virtual const sc_event & value_changed_event() const =0
sc_signal_in_if< T > & operator=(const sc_signal_in_if< T > &)
virtual bool event() const =0
virtual const T & read() const =0
sc_signal< T, WRITER_POLICY > & operator=(const T &t)
virtual sc_dt::sc_signed read_part(int left, int right) const
virtual void write_part(sc_dt::int64 v, int left, int right)
sc_signed_part_if(const sc_signed_part_if &)
virtual sc_dt::sc_signed * part_read_target()
sc_signed_part_if & operator=(const sc_signed_part_if &)
virtual sc_signed_sigref & select_part(int left, int right)
void initialize(sc_signed_part_if *if_p, int left_, int right_)
virtual void concat_set(sc_dt::int64 src, int low_i)
void operator=(sc_dt::uint64 v)
virtual ~sc_signed_sigref()
static sc_vpool< sc_signed_sigref > m_pool
sc_signed_sigref(const sc_signed_sigref &a)
sc_signed_part_if * m_if_p
const sc_signed & operator=(const sc_signed &v)
sc_signed_subref & operator()(int i, int j)
virtual const sc_core::sc_event & default_event() const
virtual const T & read() const
virtual const sc_core::sc_event & value_changed_event() const
virtual void register_port(sc_core::sc_port_base &port, const char *iface_type_name)
virtual bool event() const
virtual void write(const T &t)
virtual const char * kind() const
int vbind(sc_interface &i) override
sc_interface * get_interface()
sc_signal_in_if< T > * operator[](int n)
virtual void bind(sc_signal_inout_if< T > &i)
void operator()(sc_signal_inout_if< T > &i)
static sc_process_b * sc_get_current_process_b()
std::vector< sc_trace_params * > sc_trace_params_vec
void sc_signal_invalid_writer(const char *name, const char *kind, const char *first_writer, const char *second_writer)
std::ostream & operator<<(std::ostream &os, sc_status s)
void sc_trace(sc_trace_file *tf, const sc_in< T > &i, const std::string &name)
const char * sc_gen_unique_name(const char *seed)
const char SC_ID_OPERATION_ON_NON_SPECIALIZED_SIGNAL_[]
sc_proxy< X >::value_type or_reduce(const sc_proxy< X > &a)
sc_proxy< X >::value_type xor_reduce(const sc_proxy< X > &a)
sc_proxy< X >::value_type nor_reduce(const sc_proxy< X > &a)
sc_proxy< X >::value_type and_reduce(const sc_proxy< X > &a)
sc_proxy< X >::value_type xnor_reduce(const sc_proxy< X > &a)
sc_proxy< X >::value_type nand_reduce(const sc_proxy< X > &a)
#define SC_REPORT_ERROR(msg_type, msg)
const std::string & name()