📄 sc_int_base.h
字号:
// prefix and postfix increment and decrement operators sc_int_base& operator ++ () // prefix { ++ m_val; extend_sign(); return *this; } const sc_int_base operator ++ ( int ) // postfix { sc_int_base tmp( *this ); ++ m_val; extend_sign(); return tmp; } sc_int_base& operator -- () // prefix { -- m_val; extend_sign(); return *this; } const sc_int_base operator -- ( int ) // postfix { sc_int_base tmp( *this ); -- m_val; extend_sign(); return tmp; } // relational operators friend bool operator == ( const sc_int_base& a, const sc_int_base& b ) { return a.m_val == b.m_val; } friend bool operator != ( const sc_int_base& a, const sc_int_base& b ) { return a.m_val != b.m_val; } friend bool operator < ( const sc_int_base& a, const sc_int_base& b ) { return a.m_val < b.m_val; } friend bool operator <= ( const sc_int_base& a, const sc_int_base& b ) { return a.m_val <= b.m_val; } friend bool operator > ( const sc_int_base& a, const sc_int_base& b ) { return a.m_val > b.m_val; } friend bool operator >= ( const sc_int_base& a, const sc_int_base& b ) { return a.m_val >= b.m_val; } // bit selection sc_int_bitref& operator [] ( int i ); const sc_int_bitref_r& operator [] ( int i ) const; sc_int_bitref& bit( int i ); const sc_int_bitref_r& bit( int i ) const; // part selection sc_int_subref& operator () ( int left, int right ); const sc_int_subref_r& operator () ( int left, int right ) const; sc_int_subref& range( int left, int right ); const sc_int_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 { if ( m_len < 64 ) return (uint64)(m_val & ~((uint_type)-1 << m_len)); else return (uint64)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 int_type operator int_type() const { return m_val; } // explicit conversions int_type value() const { return operator int_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 (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: int_type m_val; // value int m_len; // length int m_ulen; // unused length};inline::std::ostream&operator << ( ::std::ostream&, const sc_int_base& );inline::std::istream&operator >> ( ::std::istream&, sc_int_base& );// ----------------------------------------------------------------------------// CLASS : sc_int_bitref_r//// Proxy class for sc_int bit selection (r-value only).// ----------------------------------------------------------------------------// implicit conversion to uint64inlinesc_int_bitref_r::operator uint64 () const{ return m_obj_p->test( m_index );}inlineboolsc_int_bitref_r::operator ! () const{ return ! m_obj_p->test( m_index );}inlineboolsc_int_bitref_r::operator ~ () const{ return ! m_obj_p->test( m_index );}inline::std::ostream&operator << ( ::std::ostream& os, const sc_int_bitref_r& a ){ a.print( os ); return os;}// ----------------------------------------------------------------------------// CLASS : sc_int_bitref//// Proxy class for sc_int bit selection (r-value and l-value).// ----------------------------------------------------------------------------// assignment operatorsinlinesc_int_bitref&sc_int_bitref::operator = ( const sc_int_bitref_r& b ){ m_obj_p->set( m_index, (bool) b ); m_obj_p->extend_sign(); return *this;}inlinesc_int_bitref&sc_int_bitref::operator = ( const sc_int_bitref& b ){ m_obj_p->set( m_index, (bool) b ); m_obj_p->extend_sign(); return *this;}inlinesc_int_bitref&sc_int_bitref::operator = ( bool b ){ m_obj_p->set( m_index, b ); m_obj_p->extend_sign(); return *this;}inlinesc_int_bitref&sc_int_bitref::operator &= ( bool b ){ if( ! b ) { m_obj_p->set( m_index, b ); m_obj_p->extend_sign(); } return *this;}inlinesc_int_bitref&sc_int_bitref::operator |= ( bool b ){ if( b ) { m_obj_p->set( m_index, b ); m_obj_p->extend_sign(); } return *this;}inlinesc_int_bitref&sc_int_bitref::operator ^= ( bool b ){ if( b ) { m_obj_p->m_val ^= (UINT_ONE << m_index); m_obj_p->extend_sign(); } return *this;}inline::std::istream&operator >> ( ::std::istream& is, sc_int_bitref& a ){ a.scan( is ); return is;}// ----------------------------------------------------------------------------// CLASS : sc_int_subref_r//// Proxy class for sc_int part selection (r-value only).// ----------------------------------------------------------------------------// implicit conversion to int_typeinlinesc_int_subref_r::operator uint_type() const{ uint_type /*int_type*/ val = m_obj_p->m_val; int uleft = SC_INTWIDTH - (m_left + 1); int uright = uleft + m_right; return ( val << uleft >> uright );}// reduce methodsinlineboolsc_int_subref_r::and_reduce() const{ sc_int_base a( *this ); return a.and_reduce();}inlineboolsc_int_subref_r::or_reduce() const{ sc_int_base a( *this ); return a.or_reduce();}inlineboolsc_int_subref_r::xor_reduce() const{ sc_int_base a( *this ); return a.xor_reduce();}// explicit conversionsinlineintsc_int_subref_r::to_int() const{ int result = static_cast<int>(operator uint_type()); return result;}inlineunsigned intsc_int_subref_r::to_uint() const{ unsigned int result = static_cast<unsigned int>(operator uint_type()); return result;}inlinelongsc_int_subref_r::to_long() const{ long result = static_cast<long>(operator uint_type()); return result;}inlineunsigned longsc_int_subref_r::to_ulong() const{ unsigned long result = static_cast<unsigned long>(operator uint_type()); return result;}inlineint64sc_int_subref_r::to_int64() const{ int64 result = operator uint_type(); return result;}inlineuint64sc_int_subref_r::to_uint64() const{ uint64 result = operator uint_type(); return result;}inlinedoublesc_int_subref_r::to_double() const{ double result = static_cast<double>(operator uint_type()); return result;}// explicit conversion to character stringinlineconst std::stringsc_int_subref_r::to_string( sc_numrep numrep ) const{ sc_uint_base a(length()); a = operator uint_type(); return a.to_string( numrep );}inlineconst std::stringsc_int_subref_r::to_string( sc_numrep numrep, bool w_prefix ) const{ sc_uint_base a(length()); a = operator uint_type(); return a.to_string( numrep, w_prefix );}// functional notation for the reduce methodsinlinebooland_reduce( const sc_int_subref_r& a ){ return a.and_reduce();}inlineboolnand_reduce( const sc_int_subref_r& a ){ return a.nand_reduce();}inlineboolor_reduce( const sc_int_subref_r& a ){ return a.or_reduce();}inlineboolnor_reduce( const sc_int_subref_r& a ){ return a.nor_reduce();}inlineboolxor_reduce( const sc_int_subref_r& a ){ return a.xor_reduce();}inlineboolxnor_reduce( const sc_int_subref_r& a ){ return a.xnor_reduce();}inline::std::ostream&operator << ( ::std::ostream& os, const sc_int_subref_r& a ){ a.print( os ); return os;}// ----------------------------------------------------------------------------// CLASS : sc_int_subref//// Proxy class for sc_int part selection (r-value and l-value).// ----------------------------------------------------------------------------// assignment operatorsinlinesc_int_subref&sc_int_subref::operator = ( const sc_int_base& a ){ return operator = ( a.operator int_type() );}inlinesc_int_subref&sc_int_subref::operator = ( const char* a ){ sc_int_base aa( length() ); return ( *this = aa = a );}inline::std::istream&operator >> ( ::std::istream& is, sc_int_subref& a ){ a.scan( is ); return is;}// ----------------------------------------------------------------------------// CLASS : sc_int_base//// Base class for sc_int.// ----------------------------------------------------------------------------// bit selectioninlinesc_int_bitref&sc_int_base::operator [] ( int i ){ check_index( i ); sc_int_bitref* result_p = sc_int_bitref::m_pool.allocate(); result_p->initialize(this, i); return *result_p;}inlineconst sc_int_bitref_r&sc_int_base::operator [] ( int i ) const{ check_index( i ); sc_int_bitref* result_p = sc_int_bitref::m_pool.allocate(); result_p->initialize(this, i); return *result_p;}inlinesc_int_bitref&sc_int_base::bit( int i ){ check_index( i ); sc_int_bitref* result_p = sc_int_bitref::m_pool.allocate(); result_p->initialize(this, i); return *result_p;}inlineconst sc_int_bitref_r&sc_int_base::bit( int i ) const{ check_index( i ); sc_int_bitref* result_p = sc_int_bitref::m_pool.allocate(); result_p->initialize(this, i); return *result_p;}// part selectioninlinesc_int_subref&sc_int_base::operator () ( int left, int right ){ check_range( left, right ); sc_int_subref* result_p = sc_int_subref::m_pool.allocate(); result_p->initialize(this, left, right); return *result_p;}inlineconst sc_int_subref_r&sc_int_base::operator () ( int left, int right ) const{ check_range( left, right ); sc_int_subref* result_p = sc_int_subref::m_pool.allocate(); result_p->initialize(this, left, right); return *result_p;}inlinesc_int_subref&sc_int_base::range( int left, int right ){ check_range( left, right ); sc_int_subref* result_p = sc_int_subref::m_pool.allocate(); result_p->initialize(this, left, right); return *result_p;}inlineconst sc_int_subref_r&sc_int_base::range( int left, int right ) const{ check_range( left, right ); sc_int_subref* result_p = sc_int_subref::m_pool.allocate(); result_p->initialize(this, left, right); return *result_p;}// functional notation for the reduce methodsinlinebooland_reduce( const sc_int_base& a ){ return a.and_reduce();}inlineboolnand_reduce( const sc_int_base& a ){ return a.nand_reduce();}inlineboolor_reduce( const sc_int_base& a ){ return a.or_reduce();}inlineboolnor_reduce( const sc_int_base& a ){ return a.nor_reduce();}inlineboolxor_reduce( const sc_int_base& a ){ return a.xor_reduce();}inlineboolxnor_reduce( const sc_int_base& a ){ return a.xnor_reduce();}inline::std::ostream&operator << ( ::std::ostream& os, const sc_int_base& a ){ a.print( os ); return os;}inline::std::istream&operator >> ( ::std::istream& is, sc_int_base& a ){ a.scan( is ); return is;}} // namespace sc_dt#endif// Taf!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -