📄 sc_signed.cpp
字号:
sc_signed::operator = ( const sc_lv_base& v ){ int minlen = sc_min( nbits, v.length() ); int i = 0; for( ; i < minlen; ++ i ) { safe_set( i, sc_logic( v.get_bit( i ) ).to_bool(), digit ); } for( ; i < nbits; ++ i ) { safe_set( i, 0, digit ); // zero-extend } convert_2C_to_SM(); return *this;}// explicit conversion to character stringconst std::stringsc_signed::to_string( sc_numrep numrep ) const{ int len = length(); sc_fix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON ); return aa.to_string( numrep );}const std::stringsc_signed::to_string( sc_numrep numrep, bool w_prefix ) const{ int len = length(); sc_fix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON ); return aa.to_string( numrep, w_prefix );}// ----------------------------------------------------------------------------// SECTION: Interfacing with sc_int_base// ----------------------------------------------------------------------------const sc_signed&sc_signed::operator = (const sc_int_base& v){ return operator=((int64) v); }sc_signedoperator + ( const sc_unsigned& u, const sc_int_base& v ){ return operator + ( u, SCAST<int64>( v ) ); }sc_signedoperator + ( const sc_int_base& u, const sc_unsigned& v ){ return operator + ( SCAST<int64>( u ), v ); }sc_signed operator + (const sc_signed& u, const sc_int_base& v) { return operator+(u, (int64) v); }sc_signed operator + (const sc_int_base& u, const sc_signed& v) { return operator+((int64) u, v); }const sc_signed& sc_signed::operator += (const sc_int_base& v){ return operator+=((int64) v); }sc_signed operator - (const sc_unsigned& u, const sc_int_base& v) { return operator-(u, (int64) v); }sc_signed operator - (const sc_int_base& u, const sc_unsigned& v) { return operator-((int64) u, v); }sc_signed operator-(const sc_signed& u, const sc_int_base& v) { return operator-(u, (int64) v); }sc_signed operator - (const sc_int_base& u, const sc_signed& v) { return operator-((int64) u, v); }const sc_signed& sc_signed::operator -= (const sc_int_base& v){ return operator-=((int64) v); }sc_signedoperator * ( const sc_unsigned& u, const sc_int_base& v ){ return operator * ( u, SCAST<int64>( v ) ); }sc_signedoperator * ( const sc_int_base& u, const sc_unsigned& v ){ return operator * ( SCAST<int64>( u ), v ); }sc_signed operator * (const sc_signed& u, const sc_int_base& v) { return operator*(u, (int64) v); }sc_signed operator * (const sc_int_base& u, const sc_signed& v) { return operator*((int64) u, v); }const sc_signed& sc_signed::operator *= (const sc_int_base& v){ return operator*=((int64) v); }sc_signedoperator / ( const sc_unsigned& u, const sc_int_base& v ){ return operator / ( u, SCAST<int64>( v ) ); }sc_signedoperator / ( const sc_int_base& u, const sc_unsigned& v ){ return operator / ( SCAST<int64>( u ), v ); }sc_signed operator / (const sc_signed& u, const sc_int_base& v) { return operator/(u, (int64) v); }sc_signed operator / (const sc_int_base& u, const sc_signed& v) { return operator/((int64) u, v); }const sc_signed& sc_signed::operator /= (const sc_int_base& v){ return operator/=((int64) v); }sc_signedoperator % ( const sc_unsigned& u, const sc_int_base& v ){ return operator % ( u, SCAST<int64>( v ) ); }sc_signedoperator % ( const sc_int_base& u, const sc_unsigned& v ){ return operator % ( SCAST<int64>( u ), v ); }sc_signed operator % (const sc_signed& u, const sc_int_base& v) { return operator%(u, (int64) v); }sc_signed operator % (const sc_int_base& u, const sc_signed& v) { return operator%((int64) u, v); }const sc_signed& sc_signed::operator %= (const sc_int_base& v){ return operator%=((int64) v); }sc_signedoperator & ( const sc_unsigned& u, const sc_int_base& v ){ return operator & ( u, SCAST<int64>( v ) ); }sc_signedoperator & ( const sc_int_base& u, const sc_unsigned& v ){ return operator & ( SCAST<int64>( u ), v ); }sc_signed operator & (const sc_signed& u, const sc_int_base& v) { return operator&(u, (int64) v); }sc_signed operator & (const sc_int_base& u, const sc_signed& v) { return operator&((int64) u, v); }const sc_signed& sc_signed::operator &= (const sc_int_base& v){ return operator&=((int64) v); }sc_signedoperator | ( const sc_unsigned& u, const sc_int_base& v ){ return operator | ( u, SCAST<int64>( v ) ); }sc_signedoperator | ( const sc_int_base& u, const sc_unsigned& v ){ return operator | ( SCAST<int64>( u ), v ); }sc_signed operator | (const sc_signed& u, const sc_int_base& v) { return operator|(u, (int64) v); }sc_signed operator | (const sc_int_base& u, const sc_signed& v) { return operator|((int64) u, v); }const sc_signed& sc_signed::operator |= (const sc_int_base& v){ return operator|=((int64) v); }sc_signedoperator ^ ( const sc_unsigned& u, const sc_int_base& v ){ return operator ^ ( u, SCAST<int64>( v ) ); }sc_signedoperator ^ ( const sc_int_base& u, const sc_unsigned& v ){ return operator ^ ( SCAST<int64>( u ), v ); }sc_signed operator ^ (const sc_signed& u, const sc_int_base& v) { return operator^(u, (int64) v); }sc_signed operator ^ (const sc_int_base& u, const sc_signed& v) { return operator^((int64) u, v); }const sc_signed& sc_signed::operator ^= (const sc_int_base& v){ return operator^=((int64) v); }sc_signed operator << (const sc_signed& u, const sc_int_base& v){ return operator<<(u, (int64) v); }const sc_signed& sc_signed::operator <<= (const sc_int_base& v){ return operator<<=((int64) v); }sc_signed operator >> (const sc_signed& u, const sc_int_base& v){ return operator>>(u, (int64) v); }const sc_signed& sc_signed::operator >>= (const sc_int_base& v){ return operator>>=((int64) v); }bool operator == (const sc_signed& u, const sc_int_base& v){ return operator==(u, (int64) v); }bool operator == (const sc_int_base& u, const sc_signed& v) { return operator==((int64) u, v); }bool operator != (const sc_signed& u, const sc_int_base& v){ return operator!=(u, (int64) v); }bool operator != (const sc_int_base& u, const sc_signed& v) { return operator!=((int64) u, v); }bool operator < (const sc_signed& u, const sc_int_base& v){ return operator<(u, (int64) v); }bool operator < (const sc_int_base& u, const sc_signed& v) { return operator<((int64) u, v); }bool operator <= (const sc_signed& u, const sc_int_base& v){ return operator<=(u, (int64) v); }booloperator <= (const sc_int_base& u, const sc_signed& v) { return operator<=((int64) u, v); }bool operator > (const sc_signed& u, const sc_int_base& v){ return operator>(u, (int64) v); }bool operator > (const sc_int_base& u, const sc_signed& v) { return operator>((int64) u, v); }bool operator >= (const sc_signed& u, const sc_int_base& v){ return operator>=(u, (int64) v); }bool operator >= (const sc_int_base& u, const sc_signed& v) { return operator>=((int64) u, v); }// ----------------------------------------------------------------------------// SECTION: Interfacing with sc_uint_base// ----------------------------------------------------------------------------const sc_signed&sc_signed::operator = (const sc_uint_base& v){ return operator=((uint64) v); }sc_signedoperator + (const sc_signed& u, const sc_uint_base& v) { return operator+(u, (uint64) v); }sc_signedoperator + (const sc_uint_base& u, const sc_signed& v) { return operator+((uint64) u, v); }const sc_signed&sc_signed::operator += (const sc_uint_base& v){ return operator+=((uint64) v); }sc_signedoperator - (const sc_unsigned& u, const sc_uint_base& v) { return operator-(u, (uint64) v); }sc_signedoperator - (const sc_uint_base& u, const sc_unsigned& v) { return operator-((uint64) u, v); }sc_signedoperator - (const sc_signed& u, const sc_uint_base& v) { return operator-(u, (uint64) v); }sc_signedoperator - (const sc_uint_base& u, const sc_signed& v) { return operator-((uint64) u, v); }const sc_signed&sc_signed::operator -= (const sc_uint_base& v){ return operator-=((uint64) v); }sc_signed operator * (const sc_signed& u, const sc_uint_base& v) { return operator*(u, (uint64) v); }sc_signed operator * (const sc_uint_base& u, const sc_signed& v) { return operator*((uint64) u, v); }const sc_signed& sc_signed::operator *= (const sc_uint_base& v){ return operator*=((uint64) v); }sc_signedoperator / (const sc_signed& u, const sc_uint_base& v) { return operator/(u, (uint64) v); }sc_signedoperator / (const sc_uint_base& u, const sc_signed& v) { return operator/((uint64) u, v); }const sc_signed&sc_signed::operator /= (const sc_uint_base& v){ return operator/=((uint64) v); }sc_signed operator % (const sc_signed& u, const sc_uint_base& v) { return operator%(u, (uint64) v); }sc_signed operator % (const sc_uint_base& u, const sc_signed& v) { return operator%((uint64) u, v); }const sc_signed& sc_signed::operator %= (const sc_uint_base& v){ return operator%=((uint64) v); }sc_signed operator & (const sc_signed& u, const sc_uint_base& v) { return operator&(u, (uint64) v); }sc_signed operator & (const sc_uint_base& u, const sc_signed& v) { return operator&((uint64) u, v); }const sc_signed& sc_signed::operator &= (const sc_uint_base& v){ return operator&=((uint64) v); }sc_signed operator | (const sc_signed& u, const sc_uint_base& v) { return operator|(u, (uint64) v); }sc_signed operator | (const sc_uint_base& u, const sc_signed& v) { return operator|((uint64) u, v); }const sc_signed& sc_signed::operator |= (const sc_uint_base& v){ return operator|=((uint64) v); }sc_signed operator ^ (const sc_signed& u, const sc_uint_base& v) { return operator^(u, (uint64) v); }sc_signed operator ^ (const sc_uint_base& u, const sc_signed& v) { return operator^((uint64) u, v); }const sc_signed& sc_signed::operator ^= (const sc_uint_base& v){ return operator^=((uint64) v); }sc_signed operator << (const sc_signed& u, const sc_uint_base& v){ return operator<<(u, (uint64) v); }const sc_signed& sc_signed::operator <<= (const sc_uint_base& v){ return operator<<=((uint64) v); }sc_signedoperator >> (const sc_signed& u, const sc_uint_base& v){ return operator>>(u, (uint64) v); }const sc_signed& sc_signed::operator >>= (const sc_uint_base& v){ return operator>>=((uint64) v); }bool operator == (const sc_signed& u, const sc_uint_base& v){ return operator==(u, (uint64) v); }bool operator == (const sc_uint_base& u, const sc_signed& v) { return operator==((uint64) u, v); }bool operator != (const sc_signed& u, const sc_uint_base& v){ return operator!=(u, (uint64) v); }bool operator != (const sc_uint_base& u, const sc_signed& v) { return operator!=((uint64) u, v); }bool operator < (const sc_signed& u, const sc_uint_base& v){ return operator<(u, (uint64) v); }bool operator < (const sc_uint_base& u, const sc_signed& v) { return operator<((uint64) u, v); }bool operator <= (const sc_signed& u, const sc_uint_base& v){ return operator<=(u, (uint64) v); }bool operator <= (const sc_uint_base& u, const sc_signed& v) { return operator<=((uint64) u, v); }bool operator > (const sc_signed& u, const sc_uint_base& v){ return operator>(u, (uint64) v); }bool operator > (const sc_uint_base& u, const sc_signed& v) { return operator>((uint64) u, v); }bool operator >= (const sc_signed& u, const sc_uint_base& v){ return operator>=(u, (uint64) v); }bool operator >= (const sc_uint_base& u, const sc_signed& v) { return operator>=((uint64) u, v); }// ----------------------------------------------------------------------------// SECTION: Input and output operators// ----------------------------------------------------------------------------// Operators in this section are included from sc_nbcommon.cpp.// ----------------------------------------------------------------------------// SECTION: Operator macros.// ----------------------------------------------------------------------------#define CONVERT_LONG(u) \small_type u ## s = get_sign(u); \sc_digit u ## d[DIGITS_PER_ULONG]; \from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u); #define CONVERT_LONG_2(u) \sc_digit u ## d[DIGITS_PER_ULONG]; \from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u); #define CONVERT_INT(u) \small_type u ## s = get_sign(u); \sc_digit u ## d[DIGITS_PER_UINT]; \from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u); #define CONVERT_INT_2(u) \sc_digit u ## d[DIGITS_PER_UINT]; \from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u); #define CONVERT_INT64(u) \small_type u ## s = get_sign(u); \sc_digit u ## d[DIGITS_PER_UINT64]; \from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u); #define CONVERT_INT64_2(u) \sc_digit u ## d[DIGITS_PER_UINT64]; \from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u); // ----------------------------------------------------------------------------// SECTION: PLUS operators: +, +=, ++// ----------------------------------------------------------------------------// Cases to consider when computing u + v:// 1. 0 + v = v// 2. u + 0 = u// 3. if sgn(u) == sgn(v)// 3.1 u + v = +(u + v) = sgn(u) * (u + v) // 3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v)// 4. if sgn(u) != sgn(v)// 4.1 u + (-v) = u - v = sgn(u) * (u - v)// 4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v)//// Specialization of above cases for computing ++u or u++: // 1. 0 + 1 = 1// 3. u + 1 = u + 1 = sgn(u) * (u + 1)// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1)sc_signedoperator+(const sc_unsigned& u, const sc_signed& v){ if (u.sgn == SC_ZERO) // case 1 return sc_signed(v); if (v.sgn == SC_ZERO) // case 2 return sc_signed(u); // cases 3 and 4 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, v.sgn, v.nbits, v.ndigits, v.digit);}sc_signedoperator+(const sc_signed& u, const sc_unsigned& v){ if (u.sgn == SC_ZERO) // case 1 return sc_signed(v); if (v.sgn == SC_ZERO) // case 2 return sc_signed(u); // cases 3 and 4 return add_signed_friend(u.sgn, u.nbits, u.ndigits, u.digit, v.sgn, v.nbits, v.ndigits, v.digit);}sc_signedoperator+(const sc_signed& u, const sc_signed& v){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -