/*****************************************************************************

  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
  more contributor license agreements.  See the NOTICE file distributed
  with this work for additional information regarding copyright ownership.
  Accellera licenses this file to you under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with the
  License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  implied.  See the License for the specific language governing
  permissions and limitations under the License.

 *****************************************************************************/

/*****************************************************************************

  sc_nbfriends.inc -- Friend functions for both sc_signed and sc_unsigned
                      classes. The vec_* functions are called through either
                      these functions or those in sc_nbexterns.cpp. These
                      functions perform their work on two inputs u and v, and
                      return the result object. The functions in
                      sc_nbexterns.cpp perform their work on one of their
                      inputs.

                      The functions here try to use faster algorithms in case
                      the input numbers are small. The bitwise functions (and,
                      or, and xor) need the 2's complement representations of
                      their inputs. Instead of complementing their inputs
                      first and then processing, they complement their inputs
                      while processing without allocating extra temporary
                      memory.

  Original Author: Ali Dasdan, Synopsys, Inc.

 *****************************************************************************/

/*****************************************************************************

  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
  changes you are making here.

      Name, Affiliation, Date:
  Description of Modification:

 *****************************************************************************/


// ----------------------------------------------------------------------------
//  Naming conventions:
//  For sc_signed or sc_unsigned number u:
//    us : u's sign, unb : u's number of bits,
//    und : u's number of digits, ud : u's digits array.
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
//  SECTION: Friend functions for PLUS operators.
// ----------------------------------------------------------------------------

// Handles cases 3 and 4 and returns the result.
CLASS_TYPE
ADD_HELPER(small_type us, int unb, int und, const sc_digit *ud,
           small_type vs, int vnb, int vnd, const sc_digit *vd)
{
    und = vec_skip_leading_zeros(und, ud);
    vnd = vec_skip_leading_zeros(vnd, vd);

    int nb = sc_max(unb, vnb);
    int nd = sc_max(und, vnd) + 1;

#ifdef SC_MAX_NBITS
    test_bound(nb);
    sc_digit d[MAX_NDIGITS];
#else
    sc_digit *d = new sc_digit[nd];
#endif

    d[nd - 1] = d[nd - 2] = 0;

    // case 3
    if (us == vs) {

        ++nb;

        if ((und == 1) && (vnd == 1)) {
            sc_digit carry = (*ud) + (*vd);
            d[0] = carry & DIGIT_MASK;
            d[1] = carry >> BITS_PER_DIGIT;
        } else if (und >= vnd) {
            vec_add(und, ud, vnd, vd, d);
        } else {
            vec_add(vnd, vd, und, ud, d);
        }
    } else {
        // case 4
        int cmp_res = vec_cmp(und, ud, vnd, vd);

        if (cmp_res == 0) { // u == v
#ifndef SC_MAX_NBITS
            delete[] d;
#endif
            return CLASS_TYPE();
        }

        if (cmp_res > 0) { // u > v
            if ((und == 1) && (vnd == 1))
                d[0] = (*ud) - (*vd);
            else
                vec_sub(und, ud, vnd, vd, d);
        } else { // u < v
            us = -us;
            if ((und == 1) && (vnd == 1))
                d[0] = (*vd) - (*ud);
            else
                vec_sub(vnd, vd, und, ud, d);
        }
    }
    return CLASS_TYPE(us, nb, nd, d);
}


// ----------------------------------------------------------------------------
//  SECTION: Friend functions of MULTIPLICATION operators.
// ----------------------------------------------------------------------------

// Handles the case 4 and returns the result.
CLASS_TYPE
MUL_HELPER(small_type s, int unb, int und,  const sc_digit *ud,
           int vnb, int vnd, const sc_digit *vd)
{
    und = vec_skip_leading_zeros(und, ud);
    vnd = vec_skip_leading_zeros(vnd, vd);

    int nb = unb + vnb;
    int nd = und + vnd;

#ifdef SC_MAX_NBITS
    test_bound(nb);
    sc_digit d[MAX_NDIGITS];
#else
    sc_digit *d = new sc_digit[nd];
#endif

    vec_zero(nd, d);

    sc_digit ud0 = (*ud);
    sc_digit vd0 = (*vd);

    if ((vnd == 1) && (vd0 == 1)) {
        vec_copy(und, d, ud);
    } else if ((und == 1) && (ud0 == 1)) {
        vec_copy(vnd, d, vd);
    } else if ((und == 1) && (vnd == 1) &&
               (ud0 < HALF_DIGIT_RADIX) && (vd0 < HALF_DIGIT_RADIX)) {
        d[0] = ud0 * vd0;
    } else if ((und == 1) && (ud0 < HALF_DIGIT_RADIX)) {
        vec_mul_small(vnd, vd, ud0, d);
    } else if ((vnd == 1) && (vd0 < HALF_DIGIT_RADIX)) {
        vec_mul_small(und, ud, vd0, d);
    } else if (vnd < und) {
        vec_mul(und, ud, vnd, vd, d);
    } else {
        vec_mul(vnd, vd, und, ud, d);
    }
    return CLASS_TYPE(s, nb, nd, d);
}


// ----------------------------------------------------------------------------
//  SECTION: Friend functions for DIVISION operators.
// ----------------------------------------------------------------------------

// Handles the cases 3-4 and returns the result.
CLASS_TYPE
DIV_HELPER(small_type s, int unb, int und, const sc_digit *ud,
           int vnb, int vnd, const sc_digit *vd)
{
    und = vec_skip_leading_zeros(und, ud);
    vnd = vec_skip_leading_zeros(vnd, vd);

    int cmp_res = vec_cmp(und, ud, vnd, vd);

    // u < v => u / v = 0 - case 4
    if (cmp_res < 0)
        return CLASS_TYPE();

    // One extra digit for d is allocated to simplify vec_div_*().
    int nd = sc_max(und, vnd) + 1;

#ifdef SC_MAX_NBITS
    sc_digit d[MAX_NDIGITS + 1];
#else
    sc_digit *d = new sc_digit[nd];
#endif

    vec_zero(nd, d);
    sc_digit vd0 = (*vd);

    // u = v => u / v = 1 - case 3
    if (cmp_res == 0) {
        d[0] = 1;
    // else if u > v - case 5
    } else if ((vnd == 1) && (vd0 == 1)) {
        vec_copy(und, d, ud);
    } else if ((vnd == 1) && (und == 1)) {
        d[0] = (*ud) / vd0;
    } else if ((vnd == 1) && (vd0 < HALF_DIGIT_RADIX)) {
        vec_div_small(und, ud, vd0, d);
    } else {
        vec_div_large(und, ud, vnd, vd, d);
    }

    return CLASS_TYPE(s, sc_max(unb, vnb), nd - 1, d);
}


// ----------------------------------------------------------------------------
//  SECTION: Friend functions for MOD operators.
// ----------------------------------------------------------------------------

// Handles the cases 3-4 and returns the result.
CLASS_TYPE
MOD_HELPER(small_type us, int unb, int und, const sc_digit *ud,
           int vnb, int vnd, const sc_digit *vd)
{
    und = vec_skip_leading_zeros(und, ud);
    vnd = vec_skip_leading_zeros(vnd, vd);

    int cmp_res = vec_cmp(und, ud, vnd, vd);
    // u = v => u % v = 0 - case 3
    if (cmp_res == 0)
        return CLASS_TYPE();

    sc_digit vd0 = (*vd);
    if ((cmp_res > 0) && (vnd == 1) && (vd0 == 1))
        return CLASS_TYPE();

    // One extra digit for d is allocated to simplify vec_div_*().
    int nd = sc_max(und, vnd) + 1;

#ifdef SC_MAX_NBITS
    sc_digit d[MAX_NDIGITS + 1];
#else
    sc_digit *d = new sc_digit[nd];
#endif

    vec_zero(nd, d);

    // u < v => u % v = u - case 4
    if (cmp_res < 0) {
        vec_copy(und, d, ud);
    // else if u > v - case 5
    } else if ((vnd == 1) && (und == 1)) {
        d[0] = (*ud) % vd0;
    } else if ((vnd == 1) && (vd0 < HALF_DIGIT_RADIX)) {
        d[0] = vec_rem_small(und, ud, vd0);
    } else {
        vec_rem_large(und, ud, vnd, vd, d);
    }

    us = check_for_zero(us, nd - 1, d);

    if (us == SC_ZERO) {
#ifndef SC_MAX_NBITS
        delete[] d;
#endif
        return CLASS_TYPE();
    } else {
        return CLASS_TYPE(us, sc_min(unb, vnb), nd - 1, d);
    }
}


// ----------------------------------------------------------------------------
//  SECTION: Friend functions for AND operators.
// ----------------------------------------------------------------------------

// Handles the cases 2-5 and returns the result.
CLASS_TYPE
AND_HELPER(small_type us, int unb, int und, const sc_digit *ud,
           small_type vs, int vnb, int vnd, const sc_digit *vd)
{
    int nb = sc_max(unb, vnb);
    int nd = sc_max(und, vnd);

#ifdef SC_MAX_NBITS
    sc_digit dbegin[MAX_NDIGITS];
#else
    sc_digit *dbegin = new sc_digit[nd];
#endif

    sc_digit *d = dbegin;

    const sc_digit *x;
    const sc_digit *y;
    int xnd;
    int ynd;
    small_type xs;
    small_type ys;

    if (und >= vnd) {
        x = ud;
        y = vd;
        xnd = und;
        ynd = vnd;
        xs = us;
        ys = vs;
    } else {
        y = ud;
        x = vd;
        ynd = und;
        xnd = vnd;
        ys = us;
        xs = vs;
    }

    const sc_digit *xend = (x + xnd);
    const sc_digit *yend = (y + ynd);

    // x is longer than y.
    small_type s = mul_signs(xs, ys);
    if (s > 0) {
        if (xs > 0) { // case 2
            while (y < yend)
                (*d++) = (*x++) & (*y++);
            while (x++ < xend)
                (*d++) = 0;
        } else { // case 3
            sc_digit xcarry = 1;
            sc_digit ycarry = 1;
            while (y < yend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                ycarry += (~(*y++) & DIGIT_MASK);
                (*d++) = (xcarry & ycarry) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
                ycarry >>= BITS_PER_DIGIT;
            }
            while (x < xend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                ycarry += DIGIT_MASK;
                (*d++) = (xcarry & ycarry) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
                ycarry >>= BITS_PER_DIGIT;
            }
        }
    } else {
        if (xs > 0) { // case 4
            sc_digit ycarry = 1;
            while (y < yend) {
                ycarry += (~(*y++) & DIGIT_MASK);
                (*d++) = ((*x++) & ycarry) & DIGIT_MASK;
                ycarry >>= BITS_PER_DIGIT;
            }
            while (x < xend) {
                ycarry += DIGIT_MASK;
                (*d++) = ((*x++) & ycarry) & DIGIT_MASK;
                ycarry >>= BITS_PER_DIGIT;
            }
        } else { // case 5
            sc_digit xcarry = 1;
            while (y < yend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                (*d++) = (xcarry & (*y++)) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
            }
            while (x++ < xend)
                (*d++) = 0;
        }
    }
    s = convert_signed_2C_to_SM(nb, nd, dbegin);
    return CLASS_TYPE(s, nb, nd, dbegin);
}


// ----------------------------------------------------------------------------
//  SECTION: Friend functions for OR operators.
// ----------------------------------------------------------------------------

// Handles the cases 3-5 and returns the result.
CLASS_TYPE
OR_HELPER(small_type us, int unb, int und, const sc_digit *ud,
          small_type vs, int vnb, int vnd, const sc_digit *vd)
{
    int nb = sc_max(unb, vnb);
    int nd = sc_max(und, vnd);

#ifdef SC_MAX_NBITS
    sc_digit dbegin[MAX_NDIGITS];
#else
    sc_digit *dbegin = new sc_digit[nd];
#endif
    sc_digit *d = dbegin;
    const sc_digit *x;
    const sc_digit *y;
    int xnd;
    int ynd;
    small_type xs;
    small_type ys;

    if (und >= vnd) {
        x = ud;
        y = vd;
        xnd = und;
        ynd = vnd;
        xs = us;
        ys = vs;
    } else {
        y = ud;
        x = vd;
        ynd = und;
        xnd = vnd;
        ys = us;
        xs = vs;
    }

    const sc_digit *xend = (x + xnd);
    const sc_digit *yend = (y + ynd);

    // x is longer than y.
    small_type s = mul_signs(xs, ys);
    if (s > 0) {
        if (xs > 0) { // case 3
            while (y < yend)
                (*d++) = (*x++) | (*y++);
            while (x < xend)
                (*d++) = (*x++);
        } else { // case 4
            sc_digit xcarry = 1;
            sc_digit ycarry = 1;
            while (y < yend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                ycarry += (~(*y++) & DIGIT_MASK);
                (*d++) = (xcarry | ycarry) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
                ycarry >>= BITS_PER_DIGIT;
            }
            while (x < xend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                ycarry += DIGIT_MASK;
                (*d++) = (xcarry | ycarry) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
                ycarry >>= BITS_PER_DIGIT;
            }
        }
    } else {
        if (xs > 0) { // case 5
            sc_digit ycarry = 1;
            while (y < yend) {
                ycarry += (~(*y++) & DIGIT_MASK);
                (*d++) = ((*x++) | ycarry) & DIGIT_MASK;
                ycarry >>= BITS_PER_DIGIT;
            }
            while (x < xend) {
                ycarry += DIGIT_MASK;
                (*d++) = ((*x++) | ycarry) & DIGIT_MASK;
                ycarry >>= BITS_PER_DIGIT;
            }
        } else { // case 6
            sc_digit xcarry = 1;
            while (y < yend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                (*d++) = (xcarry | (*y++)) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
            }
            while (x < xend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                (*d++) = xcarry & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
            }
        }
    }
    s = convert_signed_2C_to_SM(nb, nd, dbegin);
    return CLASS_TYPE(s, nb, nd, dbegin);
}


// ----------------------------------------------------------------------------
//  SECTION: Friend functions for XOR operators.
// ----------------------------------------------------------------------------

// Handles the cases 3-5 and returns the result.
CLASS_TYPE
XOR_HELPER(small_type us, int unb, int und, const sc_digit *ud,
           small_type vs, int vnb, int vnd, const sc_digit *vd)
{
    int nb = sc_max(unb, vnb);
    int nd = sc_max(und, vnd);

#ifdef SC_MAX_NBITS
    sc_digit dbegin[MAX_NDIGITS];
#else
    sc_digit *dbegin = new sc_digit[nd];
#endif

    sc_digit *d = dbegin;

    const sc_digit *x;
    const sc_digit *y;
    int xnd;
    int ynd;
    small_type xs;
    small_type ys;

    if (und >= vnd) {
        x = ud;
        y = vd;
        xnd = und;
        ynd = vnd;
        xs = us;
        ys = vs;
    } else {
        y = ud;
        x = vd;
        ynd = und;
        xnd = vnd;
        ys = us;
        xs = vs;
    }

    const sc_digit *xend = (x + xnd);
    const sc_digit *yend = (y + ynd);

    // x is longer than y.
    small_type s = mul_signs(xs, ys);
    if (s > 0) {
        if (xs > 0) { // case 3
            while (y < yend)
                (*d++) = ((*x++) ^ (*y++)) & DIGIT_MASK;
            while (x < xend)
                (*d++) = (*x++);
        } else { // case 4
            sc_digit xcarry = 1;
            sc_digit ycarry = 1;
            while (y < yend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                ycarry += (~(*y++) & DIGIT_MASK);
                (*d++) = (xcarry ^ ycarry) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
                ycarry >>= BITS_PER_DIGIT;
            }
            while (x < xend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                ycarry += DIGIT_MASK;
                (*d++) = (xcarry ^ ycarry) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
                ycarry >>= BITS_PER_DIGIT;
            }
        }
    } else {
        if (xs > 0) { // case 5
            sc_digit ycarry = 1;
            while (y < yend) {
                ycarry += (~(*y++) & DIGIT_MASK);
                (*d++) = ((*x++) ^ ycarry) & DIGIT_MASK;
                ycarry >>= BITS_PER_DIGIT;
            }
            while (x < xend) {
                ycarry += DIGIT_MASK;
                (*d++) = ((*x++) ^ ycarry) & DIGIT_MASK;
                ycarry >>= BITS_PER_DIGIT;
            }
        } else { // case 6
            sc_digit xcarry = 1;
            while (y < yend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                (*d++) = (xcarry ^ (*y++)) & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
            }
            while (x < xend) {
                xcarry += (~(*x++) & DIGIT_MASK);
                (*d++) = xcarry & DIGIT_MASK;
                xcarry >>= BITS_PER_DIGIT;
            }
        }
    }
    s = convert_signed_2C_to_SM(nb, nd, dbegin);
    return CLASS_TYPE(s, nb, nd, dbegin);
}
