sc_nbcommon.inc
来自「system C源码 一种替代verilog的语言」· INC 代码 · 共 3,013 行 · 第 1/4 页
INC
3,013 行
xor_on_help(sgn, nbits, ndigits, digit, vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); convert_2C_to_SM(); return *this;}const CLASS_TYPE&CLASS_TYPE::operator^=(uint64 v){ if (v == 0) // case 1 return *this; if (sgn == SC_ZERO) // case 2 return (*this = v); // other cases CONVERT_INT64(v); xor_on_help(sgn, nbits, ndigits, digit, vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd); convert_2C_to_SM(); return *this;}const CLASS_TYPE&CLASS_TYPE::operator^=(long v){ if (v == 0) // case 1 return *this; if (sgn == SC_ZERO) // case 2 return (*this = v); // other cases CONVERT_LONG(v); xor_on_help(sgn, nbits, ndigits, digit, vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); convert_2C_to_SM(); return *this;}const CLASS_TYPE&CLASS_TYPE::operator^=(unsigned long v){ if (v == 0) // case 1 return *this; if (sgn == SC_ZERO) // case 2 return (*this = v); // other cases CONVERT_LONG(v); xor_on_help(sgn, nbits, ndigits, digit, vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd); convert_2C_to_SM(); return *this;}// ----------------------------------------------------------------------------// SECTION: Bitwise NOT operator: ~// ----------------------------------------------------------------------------CLASS_TYPEoperator~(const CLASS_TYPE& u){ small_type s = u.sgn; if (s == SC_ZERO) { sc_digit d = 1; return CLASS_TYPE(SC_NEG, u.nbits, 1, &d, false); } int nd = u.ndigits;#ifdef SC_MAX_NBITS sc_digit d[MAX_NDIGITS];#else sc_digit *d = new sc_digit[nd];#endif vec_copy(nd, d, u.digit); if (s == SC_POS) { s = SC_NEG; vec_add_small_on(nd, d, 1); } else { s = SC_POS; vec_sub_small_on(nd, d, 1); if (check_for_zero(nd, d)) s = SC_ZERO; } return CLASS_TYPE(s, u.nbits, nd, d);}// ----------------------------------------------------------------------------// SECTION: LEFT SHIFT operators: <<, <<=// ----------------------------------------------------------------------------CLASS_TYPEoperator<<(const CLASS_TYPE& u, const CLASS_TYPE& v){ if (v.sgn == SC_ZERO) return CLASS_TYPE(u);#ifdef SC_SIGNED if (v.sgn == SC_NEG) return CLASS_TYPE(u);#endif return operator<<(u, v.to_ulong());}const CLASS_TYPE&CLASS_TYPE::operator<<=(const CLASS_TYPE& v){ if (v.sgn == SC_ZERO) return *this;#ifdef SC_SIGNED if (v.sgn == SC_NEG) return *this;#endif return operator<<=(v.to_ulong());}const CLASS_TYPE&CLASS_TYPE::operator<<=(const OTHER_CLASS_TYPE& v){ if (v.sgn == SC_ZERO) return *this;#ifdef SC_UNSIGNED if (v.sgn == SC_NEG) return *this;#endif return operator<<=(v.to_ulong());}CLASS_TYPEoperator<<(const CLASS_TYPE& u, int64 v){ if (v <= 0) return CLASS_TYPE(u); return operator<<(u, (unsigned long) v);}CLASS_TYPEoperator<<(const CLASS_TYPE& u, uint64 v){ if (v == 0) return CLASS_TYPE(u); return operator<<(u, (unsigned long) v);}const CLASS_TYPE&CLASS_TYPE::operator<<=(int64 v){ if (v <= 0) return *this; return operator<<=((unsigned long) v);}const CLASS_TYPE&CLASS_TYPE::operator<<=(uint64 v){ if (v == 0) return *this; return operator<<=((unsigned long) v);}CLASS_TYPEoperator<<(const CLASS_TYPE& u, long v){ if (v <= 0) return CLASS_TYPE(u); return operator<<(u, (unsigned long) v);}CLASS_TYPEoperator<<(const CLASS_TYPE& u, unsigned long v){ if (v == 0) return CLASS_TYPE(u); if (u.sgn == SC_ZERO) return CLASS_TYPE(u); int nb = u.nbits + v; int nd = DIV_CEIL(nb);#ifdef SC_MAX_NBITS test_bound(nb); sc_digit d[MAX_NDIGITS];#else sc_digit *d = new sc_digit[nd];#endif vec_copy_and_zero(nd, d, u.ndigits, u.digit); convert_SM_to_2C(u.sgn, nd, d); vec_shift_left(nd, d, v); small_type s = convert_signed_2C_to_SM(nb, nd, d); return CLASS_TYPE(s, nb, nd, d);}const CLASS_TYPE&CLASS_TYPE::operator<<=(long v){ if (v <= 0) return *this; return operator<<=((unsigned long) v);}const CLASS_TYPE&CLASS_TYPE::operator<<=(unsigned long v){ if (v == 0) return *this; if (sgn == SC_ZERO) return *this; convert_SM_to_2C(); vec_shift_left(ndigits, digit, v); convert_2C_to_SM(); return *this;}// ----------------------------------------------------------------------------// SECTION: RIGHT SHIFT operators: >>, >>=// ----------------------------------------------------------------------------CLASS_TYPEoperator>>(const CLASS_TYPE& u, const CLASS_TYPE& v){ if (v.sgn == SC_ZERO) return CLASS_TYPE(u);#ifdef SC_SIGNED if (v.sgn == SC_NEG) return CLASS_TYPE(u);#endif return operator>>(u, v.to_long());}const CLASS_TYPE&CLASS_TYPE::operator>>=(const CLASS_TYPE& v){ if (v.sgn == SC_ZERO) return *this;#ifdef SC_SIGNED if (v.sgn == SC_NEG) return *this;#endif return operator>>=(v.to_long());}const CLASS_TYPE&CLASS_TYPE::operator>>=(const OTHER_CLASS_TYPE& v){ if (v.sgn == SC_ZERO) return *this;#ifdef SC_UNSIGNED if (v.sgn == SC_NEG) return *this;#endif return operator>>=(v.to_ulong());}CLASS_TYPEoperator>>(const CLASS_TYPE& u, int64 v){ if (v <= 0) return CLASS_TYPE(u); return operator>>(u, (unsigned long) v);}CLASS_TYPEoperator>>(const CLASS_TYPE& u, uint64 v){ if (v == 0) return CLASS_TYPE(u); return operator>>(u, (unsigned long) v);}const CLASS_TYPE&CLASS_TYPE::operator>>=(int64 v){ if (v <= 0) return *this; return operator>>=((unsigned long) v);}const CLASS_TYPE&CLASS_TYPE::operator>>=(uint64 v){ if (v == 0) return *this; return operator>>=((unsigned long) v);}CLASS_TYPEoperator>>(const CLASS_TYPE& u, long v){ if (v <= 0) return CLASS_TYPE(u); return operator>>(u, (unsigned long) v);}CLASS_TYPEoperator>>(const CLASS_TYPE& u, unsigned long v){ if (v == 0) return CLASS_TYPE(u); if (u.sgn == SC_ZERO) return CLASS_TYPE(u); int nb = u.nbits; int nd = u.ndigits;#ifdef SC_MAX_NBITS sc_digit d[MAX_NDIGITS];#else sc_digit *d = new sc_digit[nd];#endif vec_copy(nd, d, u.digit); convert_SM_to_2C(u.sgn, nd, d); if (u.sgn == SC_NEG) vec_shift_right(nd, d, v, DIGIT_MASK); else vec_shift_right(nd, d, v, 0); small_type s = convert_signed_2C_to_SM(nb, nd, d); return CLASS_TYPE(s, nb, nd, d);}const CLASS_TYPE&CLASS_TYPE::operator>>=(long v){ if (v <= 0) return *this; return operator>>=((unsigned long) v);}const CLASS_TYPE&CLASS_TYPE::operator>>=(unsigned long v){ if (v == 0) return *this; if (sgn == SC_ZERO) return *this; convert_SM_to_2C(); if (sgn == SC_NEG) vec_shift_right(ndigits, digit, v, DIGIT_MASK); else vec_shift_right(ndigits, digit, v, 0); convert_2C_to_SM(); return *this;}// ----------------------------------------------------------------------------// SECTION: EQUAL TO operator: ==// ----------------------------------------------------------------------------// Defined in the sc_signed.cpp and sc_unsigned.cpp.// ----------------------------------------------------------------------------// SECTION: NOT_EQUAL operator: !=// ----------------------------------------------------------------------------booloperator!=(const CLASS_TYPE& u, const CLASS_TYPE& v){ return (! operator==(u, v));}booloperator!=(const CLASS_TYPE& u, int64 v){ return (! operator==(u, v));}booloperator!=(int64 u, const CLASS_TYPE& v){ return (! operator==(u, v)); }booloperator!=(const CLASS_TYPE& u, uint64 v){ return (! operator==(u, v)); }booloperator!=(uint64 u, const CLASS_TYPE& v){ return (! operator==(u, v)); }booloperator!=(const CLASS_TYPE& u, long v){ return (! operator==(u, v));}booloperator!=(long u, const CLASS_TYPE& v){ return (! operator==(u, v)); }booloperator!=(const CLASS_TYPE& u, unsigned long v){ return (! operator==(u, v)); }booloperator!=(unsigned long u, const CLASS_TYPE& v){ return (! operator==(u, v)); }// ----------------------------------------------------------------------------// SECTION: LESS THAN operator: <// ----------------------------------------------------------------------------// Defined in the sc_signed.cpp and sc_unsigned.cpp.// ----------------------------------------------------------------------------// SECTION: LESS THAN or EQUAL operator: <=// ----------------------------------------------------------------------------booloperator<=(const CLASS_TYPE& u, const CLASS_TYPE& v){ return (operator<(u, v) || operator==(u, v));}booloperator<=(const CLASS_TYPE& u, int64 v){ return (operator<(u, v) || operator==(u, v));}booloperator<=(int64 u, const CLASS_TYPE& v){ return (operator<(u, v) || operator==(u, v));}booloperator<=(const CLASS_TYPE& u, uint64 v){ return (operator<(u, v) || operator==(u, v));}booloperator<=(uint64 u, const CLASS_TYPE& v){ return (operator<(u, v) || operator==(u, v));}booloperator<=(const CLASS_TYPE& u, long v){ return (operator<(u, v) || operator==(u, v));}booloperator<=(long u, const CLASS_TYPE& v){ return (operator<(u, v) || operator==(u, v));}booloperator<=(const CLASS_TYPE& u, unsigned long v){ return (operator<(u, v) || operator==(u, v));}booloperator<=(unsigned long u, const CLASS_TYPE& v){ return (operator<(u, v) || operator==(u, v));}// ----------------------------------------------------------------------------// SECTION: GREATER THAN operator: >// ----------------------------------------------------------------------------booloperator>(const CLASS_TYPE& u, const CLASS_TYPE& v){ return (! (operator<=(u, v)));}booloperator>(const CLASS_TYPE& u, int64 v){ return (! (operator<=(u, v)));}booloperator>(int64 u, const CLASS_TYPE& v){ return (! (operator<=(u, v)));}booloperator>(const CLASS_TYPE& u, uint64 v){ return (! (operator<=(u, v)));}booloperator>(uint64 u, const CLASS_TYPE& v){ return (! (operator<=(u, v)));}booloperator>(const CLASS_TYPE& u, long v){ return (! (operator<=(u, v)));}booloperator>(long u, const CLASS_TYPE& v){ return (! (operator<=(u, v)));}booloperator>(const CLASS_TYPE& u, unsigned long v){ return (! (operator<=(u, v)));}booloperator>(unsigned long u, const CLASS_TYPE& v){ return (! (operator<=(u, v)));}// ----------------------------------------------------------------------------// SECTION: GREATER THAN or EQUAL operator: >=// ----------------------------------------------------------------------------booloperator>=(const CLASS_TYPE& u, const CLASS_TYPE& v){ return (! (operator<(u, v)));}booloperator>=(const CLASS_TYPE& u, int64 v){ return (! (operator<(u, v)));}booloperator>=(int64 u, const CLASS_TYPE& v){ return (! (operator<(u, v)));}booloperator>=(const CLASS_TYPE& u, uint64 v){ return (! (operator<(u, v)));}booloperator>=(uint64 u, const CLASS_TYPE& v){ return (! (operator<(u, v)));}booloperator>=(const CLASS_TYPE& u, long v){ return (! (operator<(u, v)));}booloperator>=(long u, const CLASS_TYPE& v){ return (! (operator<(u, v)));}booloperator>=(const CLASS_TYPE& u, unsigned long v){ return (! (operator<(u, v)));}booloperator>=(unsigned long u, const CLASS_TYPE& v){ return (! (operator<(u, v)));}// ----------------------------------------------------------------------------// SECTION: Public members - Other utils.// ----------------------------------------------------------------------------// Convert to int64, long, or int.#define TO_INTX(RET_TYPE, UP_RET_TYPE) \ \if (sgn == SC_ZERO) \return 0; \ \int vnd = sc_min((int)DIGITS_PER_ ## UP_RET_TYPE, ndigits); \ \RET_TYPE v = 0; \while (--vnd >= 0) \v = (v << BITS_PER_DIGIT) + digit[vnd]; \ \if (sgn == SC_NEG) \return -v; \else \return v; int64CLASS_TYPE::to_int64() const{ TO_INTX(int64, INT64);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?