📄 sc_uint_base.h
字号:
// prefix and postfix increment and decrement operators sc_uint_base& operator ++ () // prefix { ++ m_val; extend_sign(); return *this; } const sc_uint_base operator ++ ( int ) // postfix { sc_uint_base tmp( *this ); ++ m_val; extend_sign(); return tmp; } sc_uint_base& operator -- () // prefix { -- m_val; extend_sign(); return *this; } const sc_uint_base operator -- ( int ) // postfix { sc_uint_base tmp( *this ); -- m_val; extend_sign(); return tmp; } // relational operators friend bool operator == ( const sc_uint_base& a, const sc_uint_base& b ) { return a.m_val == b.m_val; } friend bool operator != ( const sc_uint_base& a, const sc_uint_base& b ) { return a.m_val != b.m_val; } friend bool operator < ( const sc_uint_base& a, const sc_uint_base& b ) { return a.m_val < b.m_val; } friend bool operator <= ( const sc_uint_base& a, const sc_uint_base& b ) { return a.m_val <= b.m_val; } friend bool operator > ( const sc_uint_base& a, const sc_uint_base& b ) { return a.m_val > b.m_val; } friend bool operator >= ( const sc_uint_base& a, const sc_uint_base& b ) { return a.m_val >= b.m_val; } // bit selection sc_uint_bitref& operator [] ( int i ); const sc_uint_bitref_r& operator [] ( int i ) const; sc_uint_bitref& bit( int i ); const sc_uint_bitref_r& bit( int i ) const; // part selection sc_uint_subref& operator () ( int left, int right ); const sc_uint_subref_r& operator () ( int left, int right ) const; sc_uint_subref& range( int left, int right ); const sc_uint_subref_r& range( int left, int right ) const; // bit access, without bounds checking or sign extension bool test( int i ) const { return ( 0 != (m_val & (UINT_ONE << i)) ); } void set( int i ) { m_val |= (UINT_ONE << i); } void set( int i, bool v ) { v ? m_val |= (UINT_ONE << i) : m_val &= ~(UINT_ONE << i); } // capacity int length() const { return m_len; }#ifdef SC_DT_DEPRECATED int bitwidth() const { return length(); }#endif // concatenation support virtual int concat_length(bool* xz_present_p) const { if ( xz_present_p ) *xz_present_p = false; return length(); } virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const; virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const; virtual uint64 concat_get_uint64() const { return m_val; } virtual void concat_set(int64 src, int low_i); virtual void concat_set(const sc_signed& src, int low_i); virtual void concat_set(const sc_unsigned& src, int low_i); virtual void concat_set(uint64 src, int low_i); // reduce methods bool and_reduce() const; bool nand_reduce() const { return ( ! and_reduce() ); } bool or_reduce() const; bool nor_reduce() const { return ( ! or_reduce() ); } bool xor_reduce() const; bool xnor_reduce() const { return ( ! xor_reduce() ); } // implicit conversion to uint_type operator uint_type() const { return m_val; } // explicit conversions uint_type value() const { return operator uint_type(); } int to_int() const { return (int) m_val; } unsigned int to_uint() const { return (unsigned int) m_val; } long to_long() const { return (long) m_val; } unsigned long to_ulong() const { return (unsigned long) m_val; } int64 to_int64() const { return (int64) m_val; } uint64 to_uint64() const { return (uint64) m_val; } double to_double() const { return uint64_to_double( m_val ); }#ifndef _32BIT_ long long_low() const { return (long) (m_val & UINT64_32ONES); } long long_high() const { return (long) ((m_val >> 32) & UINT64_32ONES); }#endif // explicit conversion to character string const std::string to_string( sc_numrep numrep = SC_DEC ) const; const std::string to_string( sc_numrep numrep, bool w_prefix ) const; // other methods void print( ::std::ostream& os = ::std::cout ) const { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); } void scan( ::std::istream& is = ::std::cin );protected: uint_type m_val; // value int m_len; // length int m_ulen; // unused length};inline::std::ostream&operator << ( ::std::ostream&, const sc_uint_base& );inline::std::istream&operator >> ( ::std::istream&, sc_uint_base& );// ----------------------------------------------------------------------------// CLASS : sc_uint_bitref_r//// Proxy class for sc_uint bit selection (r-value only).// ----------------------------------------------------------------------------// implicit conversion to boolinlinesc_uint_bitref_r::operator uint64 () const{ return m_obj_p->test( m_index );}inlineboolsc_uint_bitref_r::operator ! () const{ return ! m_obj_p->test( m_index );}inlineboolsc_uint_bitref_r::operator ~ () const{ return ! m_obj_p->test( m_index );}inline::std::ostream&operator << ( ::std::ostream& os, const sc_uint_bitref_r& a ){ a.print( os ); return os;}// ----------------------------------------------------------------------------// CLASS : sc_uint_bitref//// Proxy class for sc_uint bit selection (r-value and l-value).// ----------------------------------------------------------------------------// assignment operatorsinlinesc_uint_bitref&sc_uint_bitref::operator = ( const sc_uint_bitref_r& b ){ m_obj_p->set( m_index, b.to_bool() ); return *this;}inlinesc_uint_bitref&sc_uint_bitref::operator = ( const sc_uint_bitref& b ){ m_obj_p->set( m_index, b.to_bool() ); return *this;}inlinesc_uint_bitref&sc_uint_bitref::operator = ( bool b ){ m_obj_p->set( m_index, b ); return *this;}inlinesc_uint_bitref&sc_uint_bitref::operator &= ( bool b ){ if( ! b ) { m_obj_p->set( m_index, b ); } return *this;}inlinesc_uint_bitref&sc_uint_bitref::operator |= ( bool b ){ if( b ) { m_obj_p->set( m_index, b ); } return *this;}inlinesc_uint_bitref&sc_uint_bitref::operator ^= ( bool b ){ if( b ) { m_obj_p->m_val ^= (UINT_ONE << m_index); } return *this;}inline::std::istream&operator >> ( ::std::istream& is, sc_uint_bitref& a ){ a.scan( is ); return is;}// ----------------------------------------------------------------------------// CLASS : sc_uint_subref_r//// Proxy class for sc_uint part selection (r-value only).// ----------------------------------------------------------------------------// implicit conversion to uint_typeinlinesc_uint_subref_r::operator uint_type() const{ uint_type val = m_obj_p->m_val; int uleft = SC_INTWIDTH - (m_left + 1); return ( (val & (~UINT_ZERO >> uleft)) >> m_right );}// reduce methodsinlineboolsc_uint_subref_r::and_reduce() const{ sc_uint_base a( *this ); return a.and_reduce();}inlineboolsc_uint_subref_r::or_reduce() const{ sc_uint_base a( *this ); return a.or_reduce();}inlineboolsc_uint_subref_r::xor_reduce() const{ sc_uint_base a( *this ); return a.xor_reduce();}// explicit conversionsinlineintsc_uint_subref_r::to_int() const{ sc_uint_base a( *this ); return a.to_int();}inlineunsigned intsc_uint_subref_r::to_uint() const{ sc_uint_base a( *this ); return a.to_uint();}inlinelongsc_uint_subref_r::to_long() const{ sc_uint_base a( *this ); return a.to_long();}inlineunsigned longsc_uint_subref_r::to_ulong() const{ sc_uint_base a( *this ); return a.to_ulong();}inlineint64sc_uint_subref_r::to_int64() const{ sc_uint_base a( *this ); return a.to_int64();}inlineuint64sc_uint_subref_r::to_uint64() const{ sc_uint_base a( *this ); return a.to_uint64();}inlinedoublesc_uint_subref_r::to_double() const{ sc_uint_base a( *this ); return a.to_double();}// explicit conversion to character stringinlineconst std::stringsc_uint_subref_r::to_string( sc_numrep numrep ) const{ sc_uint_base a( *this ); return a.to_string( numrep );}inlineconst std::stringsc_uint_subref_r::to_string( sc_numrep numrep, bool w_prefix ) const{ sc_uint_base a( *this ); return a.to_string( numrep, w_prefix );}// functional notation for the reduce methodsinlinebooland_reduce( const sc_uint_subref_r& a ){ return a.and_reduce();}inlineboolnand_reduce( const sc_uint_subref_r& a ){ return a.nand_reduce();}inlineboolor_reduce( const sc_uint_subref_r& a ){ return a.or_reduce();}inlineboolnor_reduce( const sc_uint_subref_r& a ){ return a.nor_reduce();}inlineboolxor_reduce( const sc_uint_subref_r& a ){ return a.xor_reduce();}inlineboolxnor_reduce( const sc_uint_subref_r& a ){ return a.xnor_reduce();}inline::std::ostream&operator << ( ::std::ostream& os, const sc_uint_subref_r& a ){ a.print( os ); return os;}// ----------------------------------------------------------------------------// CLASS : sc_uint_subref//// Proxy class for sc_uint part selection (r-value and l-value).// ----------------------------------------------------------------------------// assignment operatorsinlinesc_uint_subref&sc_uint_subref::operator = ( const sc_uint_base& a ){ return operator = ( a.operator uint_type() );}inlinesc_uint_subref&sc_uint_subref::operator = ( const char* a ){ sc_uint_base aa( length() ); return ( *this = aa = a );}inline::std::istream&operator >> ( ::std::istream& is, sc_uint_subref& a ){ a.scan( is ); return is;}// ----------------------------------------------------------------------------// CLASS : sc_uint_base//// Base class for sc_uint.// ----------------------------------------------------------------------------// bit selectioninlinesc_uint_bitref&sc_uint_base::operator [] ( int i ){ check_index( i ); sc_uint_bitref* result_p = sc_uint_bitref::m_pool.allocate(); result_p->initialize(this, i); return *result_p;}inlineconst sc_uint_bitref_r&sc_uint_base::operator [] ( int i ) const{ check_index( i ); sc_uint_bitref* result_p = sc_uint_bitref::m_pool.allocate(); result_p->initialize(this, i); return *result_p;}inlinesc_uint_bitref&sc_uint_base::bit( int i ){ check_index( i ); sc_uint_bitref* result_p = sc_uint_bitref::m_pool.allocate(); result_p->initialize(this, i); return *result_p;}inlineconst sc_uint_bitref_r&sc_uint_base::bit( int i ) const{ check_index( i ); sc_uint_bitref* result_p = sc_uint_bitref::m_pool.allocate(); result_p->initialize(this, i); return *result_p;}// part selectioninlinesc_uint_subref&sc_uint_base::operator () ( int left, int right ){ check_range( left, right ); sc_uint_subref* result_p = sc_uint_subref::m_pool.allocate(); result_p->initialize(this, left, right); return *result_p;}inlineconst sc_uint_subref_r&sc_uint_base::operator () ( int left, int right ) const{ check_range( left, right ); sc_uint_subref* result_p = sc_uint_subref::m_pool.allocate(); result_p->initialize(this, left, right); return *result_p;}inlinesc_uint_subref&sc_uint_base::range( int left, int right ){ check_range( left, right ); sc_uint_subref* result_p = sc_uint_subref::m_pool.allocate(); result_p->initialize(this, left, right); return *result_p;}inlineconst sc_uint_subref_r&sc_uint_base::range( int left, int right ) const{ check_range( left, right ); sc_uint_subref* result_p = sc_uint_subref::m_pool.allocate(); result_p->initialize(this, left, right); return *result_p;}// functional notation for the reduce methodsinlinebooland_reduce( const sc_uint_base& a ){ return a.and_reduce();}inlineboolnand_reduce( const sc_uint_base& a ){ return a.nand_reduce();}inlineboolor_reduce( const sc_uint_base& a ){ return a.or_reduce();}inlineboolnor_reduce( const sc_uint_base& a ){ return a.nor_reduce();}inlineboolxor_reduce( const sc_uint_base& a ){ return a.xor_reduce();}inlineboolxnor_reduce( const sc_uint_base& a ){ return a.xnor_reduce();}inline::std::ostream&operator << ( ::std::ostream& os, const sc_uint_base& a ){ a.print( os ); return os;}inline::std::istream&operator >> ( ::std::istream& is, sc_uint_base& a ){ a.scan( is ); return is;}} // namespace sc_dt#endif// Taf!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -