⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scfx_rep.h

📁 system C源码 一种替代verilog的语言
💻 H
📖 第 1 页 / 共 2 页
字号:
    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 + -