125 int wi()
const {
return m_wi; }
126 int bi()
const {
return m_bi; }
128 void wi(
int wi_ ) { m_wi = wi_; }
180 void*
operator new( std::size_t );
181 void operator delete(
void*, std::size_t );
197 void operator = (
const scfx_rep& );
217 bool is_zero()
const;
220 bool is_normal()
const;
222 void set_zero(
int = 1 );
233 void print( ::std::ostream& )
const;
234 void dump( ::std::ostream& )
const;
245 bool rounding_flag()
const;
253 unsigned int divide_by_ten();
254 int find_lsw()
const;
255 int find_msw()
const;
257 void multiply_by_ten();
258 void normalize(
int );
261 void set_oct(
int,
int );
262 void set_hex(
int,
int );
263 void shift_left(
int );
264 void shift_right(
int );
282 void resize_to(
int,
int = 0 );
317 m_wp = m_msw = m_lsw = 0;
327 m_state = not_a_number;
344: m_mant(
min_mant ), m_wp( 2 ), m_sign( 1 ), m_state( normal ),
345 m_msw(0), m_lsw(0), m_r_flag( false )
381 c.m_sign = - c.m_sign;
414scfx_rep::size()
const
416 return m_mant.
size();
423 return ( m_sign == -1 );
430 if( m_state != normal )
433 for(
int i = 0; i < size(); i ++ )
446 return ( m_state == not_a_number );
453 return ( m_state == infinity );
460 return ( m_state == normal );
470 c.quantization( params, q_flag );
481 c.overflow( params, o_flag );
494scfx_rep::resize_to(
int new_size,
int restore )
498 int size_incr = new_size - size();
508scfx_rep::calc_indices(
int n )
const
519 return scfx_index( wi, bi );
524scfx_rep::o_extend(
const scfx_index& x,
sc_enc enc )
529 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
531 if( enc ==
SC_US_ || ( m_mant[wi] & ( ((
word)1) << bi ) ) == 0 )
534 m_mant[wi] &= ~( ((
word)-1) << ( bi + 1 ) );
535 for(
int i = wi + 1; i < size(); ++ i )
542 m_mant[wi] |= ( ((
word)-1) << ( bi + 1 ) );
543 for(
int i = wi + 1; i < size(); ++ i )
544 m_mant[i] =
static_cast<word>( -1 );
551scfx_rep::o_bit_at(
const scfx_index& x )
const
556 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
558 return ( m_mant[wi] & ( ((
word)1) << bi ) ) != 0;
563scfx_rep::o_zero_left(
const scfx_index& x )
const
568 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
572 zero = ( m_mant[wi] & ( ((
word)-1) << ( bi + 1 ) ) ) == 0;
573 for(
int i = wi + 1; i < size(); ++ i )
574 zero = zero && m_mant[i] == 0;
581scfx_rep::o_zero_right(
const scfx_index& x )
const
586 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
588 bool zero = ( m_mant[wi] & ~( ((
word)-1) << bi ) ) == 0;
589 for(
int i = wi - 1; i >= 0; -- i )
590 zero = zero && m_mant[i] == 0;
597scfx_rep::o_set_low(
const scfx_index& x,
sc_enc enc )
602 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
608 m_mant[wi] |= ( ((
word)1) << bi );
617scfx_rep::o_set_high(
const scfx_index& x,
const scfx_index& x2,
625 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
626 SC_ASSERT_( wi2 >= 0 && wi2 < size(),
"word index out of range" );
630 for( i = 0; i < size(); ++ i )
631 m_mant[i] =
static_cast<word>( -1 );
633 m_mant[wi] &= ~( ((
word)-1) << bi );
634 for( i = wi + 1; i < size(); ++ i )
637 m_mant[wi2] &= ( ((
word)-1) << bi2 );
638 for( i = wi2 - 1; i >= 0; -- i )
645 m_mant[wi] |= ( ((
word)1) << bi );
652scfx_rep::o_set(
const scfx_index& x,
const scfx_index& x3,
660 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
661 SC_ASSERT_( wi3 >= 0 && wi3 < size(),
"word index out of range" );
666 m_mant[wi3] &= ~( ((
word)-1) << ( bi3 + 1 ) );
668 m_mant[wi3] |= ( ((
word)-1) << ( bi3 + 1 ) );
670 for(
int i = wi3 + 1; i < size(); ++ i )
675 m_mant[i] =
static_cast<word>( -1 );
681 m_mant[wi] |= ( ((
word)1) << bi );
683 m_mant[wi] &= ~( ((
word)1) << bi );
689scfx_rep::o_invert(
const scfx_index& x2 )
694 m_mant[wi2] ^= ( ((
word)-1) << bi2 );
695 for(
int i = wi2 + 1; i < size(); ++ i )
696 m_mant[i] = ~ m_mant[i];
701scfx_rep::q_bit(
const scfx_index& x )
const
706 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
709 return ( m_mant[wi] & ( ((
word)1) << ( bi - 1 ) ) ) != 0;
718scfx_rep::q_clear(
const scfx_index& x )
723 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
725 m_mant[wi] &= ( ((
word)-1) << bi );
726 for(
int i = wi - 1; i >= 0; -- i )
732scfx_rep::q_incr(
const scfx_index& x )
737 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
739 word old_val = m_mant[wi];
740 m_mant[wi] += ( ((
word)1) << bi );
741 if( m_mant[wi] <= old_val )
743 if( wi + 1 == size() )
744 resize_to( size() + 1, 1 );
746 for(
int i = wi + 1; i < size(); ++ i )
748 if( ++ m_mant[i] != 0 )
756scfx_rep::q_odd(
const scfx_index& x )
const
761 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
763 return ( m_mant[wi] & ( ((
word)1) << bi ) ) != 0;
768scfx_rep::q_zero(
const scfx_index& x )
const
773 SC_ASSERT_( wi >= 0 && wi < size(),
"word index out of range" );
779 zero = ( m_mant[wi] & ~( ((
word)-1) << (bi - 1) ) ) == 0;
780 for(
int i = wi - 1; i >= 0; -- i )
781 zero = zero && m_mant[i] == 0;
786 for(
int i = wi - 2; i >= 0; -- i )
787 zero = zero && m_mant[i] == 0;
797scfx_rep::find_lsw()
const
799 for(
int i = 0; i < size(); i ++ )
809scfx_rep::find_msw()
const
811 for(
int i = size() - 1; i >= 0; i -- )
#define SC_ASSERT_(cnd, msg)
const int SC_DEFAULT_DIV_WL_
void complement(scfx_mant &target, const scfx_mant &source, int size)
SC_API scfx_rep * neg_scfx_rep(const scfx_rep &)
SC_API scfx_rep * mult_scfx_rep(const scfx_rep &, const scfx_rep &, int max_wl=SC_DEFAULT_MAX_WL_)
SC_API int cmp_scfx_rep(const scfx_rep &, const scfx_rep &)
unsigned long long uint64
SC_API scfx_rep * add_scfx_rep(const scfx_rep &, const scfx_rep &, int max_wl=SC_DEFAULT_MAX_WL_)
SC_API scfx_rep * div_scfx_rep(const scfx_rep &, const scfx_rep &, int max_wl=SC_DEFAULT_DIV_WL_)
const int SC_DEFAULT_MAX_WL_
SC_API scfx_rep * lsh_scfx_rep(const scfx_rep &, int)
void inc(scfx_mant &mant)
SC_API scfx_rep * sub_scfx_rep(const scfx_rep &, const scfx_rep &, int max_wl=SC_DEFAULT_MAX_WL_)
SC_API void multiply(scfx_rep &, const scfx_rep &, const scfx_rep &, int max_wl=SC_DEFAULT_MAX_WL_)
SC_API scfx_rep * rsh_scfx_rep(const scfx_rep &, int)
const int SC_DEFAULT_CTE_WL_
uint64 const sc_uint_base int b
scfx_rep * quantization_scfx_rep(const scfx_rep &a, const scfx_params ¶ms, bool &q_flag)
scfx_rep * overflow_scfx_rep(const scfx_rep &a, const scfx_params ¶ms, bool &o_flag)
void resize_to(int, int=0)
scfx_index(int wi_, int bi_)
void print(::std::ostream &) const
void dump(::std::ostream &) const
void cast(const scfx_params &, bool &, bool &)
friend SC_API int cmp_scfx_rep(const scfx_rep &, const scfx_rep &)
scfx_rep(const sc_unsigned &)
friend int compare_abs(const scfx_rep &, const scfx_rep &)
friend int compare_msw_ff(const scfx_rep &lhs, const scfx_rep &rhs)
void operator=(const scfx_rep &)
friend void print_dec(scfx_string &, const scfx_rep &, int, sc_fmt)
void from_string(const char *, int)
bool rounding_flag() const
friend SC_API scfx_rep * div_scfx_rep(const scfx_rep &, const scfx_rep &, int)
friend SC_API scfx_rep * add_scfx_rep(const scfx_rep &, const scfx_rep &, int)
friend SC_API void multiply(scfx_rep &, const scfx_rep &, const scfx_rep &, int)
scfx_rep(const scfx_rep &)
friend int compare_msw(const scfx_rep &, const scfx_rep &)
void get_type(int &, int &, sc_enc &) const
bool set(int, const scfx_params &)
scfx_rep(const sc_signed &)
bool set_slice(int, int, const scfx_params &, const sc_bv_base &)
friend void align(const scfx_rep &, const scfx_rep &, int &, int &, scfx_mant_ref &, scfx_mant_ref &)
const char * to_string(sc_numrep, int, sc_fmt, const scfx_params *=0) const
friend void print_other(scfx_string &, const scfx_rep &, sc_numrep, int, sc_fmt, const scfx_params *)
bool get_slice(int, int, const scfx_params &, sc_bv_base &) const
bool clear(int, const scfx_params &)
friend SC_API scfx_rep * sub_scfx_rep(const scfx_rep &, const scfx_rep &, int)