📄 scfx_rep.h
字号:
for( int i = 0; i < size(); i ++ ) { if( m_mant[i] ) return false; } return true;}inlineboolscfx_rep::is_nan() const{ return ( m_state == not_a_number );}inlineboolscfx_rep::is_inf() const{ return ( m_state == infinity );}inlineboolscfx_rep::is_normal() const{ return ( m_state == normal );}inlinescfx_rep*quantization_scfx_rep( const scfx_rep& a, const scfx_params& params, bool& q_flag ){ scfx_rep& c = *new scfx_rep( a ); c.quantization( params, q_flag ); return &c;}inlinescfx_rep*overflow_scfx_rep( const scfx_rep& a, const scfx_params& params, bool& o_flag ){ scfx_rep& c = *new scfx_rep( a ); c.overflow( params, o_flag ); return &c;}inlineboolscfx_rep::rounding_flag() const{ return m_r_flag;}inlinevoidscfx_rep::resize_to( int new_size, int restore ){ if( restore == -1 ) { int size_incr = new_size - size(); m_wp += size_incr; m_msw += size_incr; m_lsw += size_incr; } m_mant.resize_to( new_size, restore );}inlineconst scfx_indexscfx_rep::calc_indices( int n ) const{ int wi = n / bits_in_word + m_wp; int bi = n % bits_in_word; if( bi < 0 ) { bi += bits_in_word; -- wi; } return scfx_index( wi, bi );}inlinevoidscfx_rep::o_extend( const scfx_index& x, sc_enc enc ){ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); if( enc == SC_US_ || ( m_mant[wi] & ( ((word)1) << bi ) ) == 0 ) { if( bi != bits_in_word - 1 ) m_mant[wi] &= ~( ((word)-1) << ( bi + 1 ) ); for( int i = wi + 1; i < size(); ++ i ) m_mant[i] = 0; m_sign = 1; } else { if( bi != bits_in_word - 1 ) m_mant[wi] |= ( ((word)-1) << ( bi + 1 ) ); for( int i = wi + 1; i < size(); ++ i ) m_mant[i] = static_cast<word>( -1 ); m_sign = -1; }}inlineboolscfx_rep::o_bit_at( const scfx_index& x ) const{ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); return ( m_mant[wi] & ( ((word)1) << bi ) ) != 0;}inlineboolscfx_rep::o_zero_left( const scfx_index& x ) const{ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); bool zero = true; if( bi != bits_in_word - 1 ) zero = ( m_mant[wi] & ( ((word)-1) << ( bi + 1 ) ) ) == 0; for( int i = wi + 1; i < size(); ++ i ) zero = zero && m_mant[i] == 0; return zero;}inlineboolscfx_rep::o_zero_right( const scfx_index& x ) const{ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); bool zero = ( m_mant[wi] & ~( ((word)-1) << bi ) ) == 0; for( int i = wi - 1; i >= 0; -- i ) zero = zero && m_mant[i] == 0; return zero;}inlinevoidscfx_rep::o_set_low( const scfx_index& x, sc_enc enc ){ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); m_mant.clear(); if( enc == SC_TC_ ) { m_mant[wi] |= ( ((word)1) << bi ); m_sign = -1; } else m_sign = 1;}inlinevoidscfx_rep::o_set_high( const scfx_index& x, const scfx_index& x2, sc_enc enc, int sign ){ int wi = x.wi(); int bi = x.bi(); int wi2 = x2.wi(); int bi2 = x2.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); SC_ASSERT_( wi2 >= 0 && wi2 < size(), "word index out of range" ); int i; for( i = 0; i < size(); ++ i ) m_mant[i] = static_cast<word>( -1 ); m_mant[wi] &= ~( ((word)-1) << bi ); for( i = wi + 1; i < size(); ++ i ) m_mant[i] = 0; m_mant[wi2] &= ( ((word)-1) << bi2 ); for( i = wi2 - 1; i >= 0; -- i ) m_mant[i] = 0; if( enc == SC_TC_ ) m_sign = sign; else { m_mant[wi] |= ( ((word)1) << bi ); m_sign = 1; }}inlinevoidscfx_rep::o_set( const scfx_index& x, const scfx_index& x3, sc_enc enc, bool under ){ int wi = x.wi(); int bi = x.bi(); int wi3 = x3.wi(); int bi3 = x3.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); SC_ASSERT_( wi3 >= 0 && wi3 < size(), "word index out of range" ); if( bi3 != bits_in_word - 1 ) { if( under ) m_mant[wi3] &= ~( ((word)-1) << ( bi3 + 1 ) ); else m_mant[wi3] |= ( ((word)-1) << ( bi3 + 1 ) ); } for( int i = wi3 + 1; i < size(); ++ i ) { if( under ) m_mant[i] = 0; else m_mant[i] = static_cast<word>( -1 ); } if( enc == SC_TC_ ) { if( under ) m_mant[wi] |= ( ((word)1) << bi ); else m_mant[wi] &= ~( ((word)1) << bi ); }}inlinevoidscfx_rep::o_invert( const scfx_index& x2 ){ int wi2 = x2.wi(); int bi2 = x2.bi(); m_mant[wi2] ^= ( ((word)-1) << bi2 ); for( int i = wi2 + 1; i < size(); ++ i ) m_mant[i] = ~ m_mant[i];}inlineboolscfx_rep::q_bit( const scfx_index& x ) const{ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); if( bi != 0 ) return ( m_mant[wi] & ( ((word)1) << ( bi - 1 ) ) ) != 0; else if( wi != 0 ) return ( m_mant[wi - 1] & ( ((word)1) << ( bits_in_word - 1 ) ) ) != 0; else return false;}inlinevoidscfx_rep::q_clear( const scfx_index& x ){ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); m_mant[wi] &= ( ((word)-1) << bi ); for( int i = wi - 1; i >= 0; -- i ) m_mant[i] = 0;}inlinevoidscfx_rep::q_incr( const scfx_index& x ){ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); word old_val = m_mant[wi]; m_mant[wi] += ( ((word)1) << bi ); if( m_mant[wi] <= old_val ) { if( wi + 1 == size() ) resize_to( size() + 1, 1 ); for( int i = wi + 1; i < size(); ++ i ) { if( ++ m_mant[i] != 0 ) break; } }}inlineboolscfx_rep::q_odd( const scfx_index& x ) const{ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); return ( m_mant[wi] & ( ((word)1) << bi ) ) != 0;}inlineboolscfx_rep::q_zero( const scfx_index& x ) const{ int wi = x.wi(); int bi = x.bi(); SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); bool zero; if( bi != 0 ) { zero = ( m_mant[wi] & ~( ((word)-1) << (bi - 1) ) ) == 0; for( int i = wi - 1; i >= 0; -- i ) zero = zero && m_mant[i] == 0; } else if( wi != 0 ) { zero = ( m_mant[wi - 1] & ~( ((word)-1) << (bits_in_word - 1) ) ) == 0; for( int i = wi - 2; i >= 0; -- i ) zero = zero && m_mant[i] == 0; } else zero = true; return zero;}inlineintscfx_rep::find_lsw() const{ for( int i = 0; i < size(); i ++ ) { if( m_mant[i] ) return i; } return 0;}inlineintscfx_rep::find_msw() const{ for( int i = size() - 1; i >= 0; i -- ) { if( m_mant[i] ) return i; } return 0;}inlinevoidscfx_rep::find_sw(){ m_lsw = find_lsw(); m_msw = find_msw();}inlinevoidscfx_rep::toggle_tc(){ if( is_neg() ) { complement( m_mant, m_mant, m_mant.size() ); inc( m_mant ); }}} // namespace sc_dt#endif// Taf!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -