112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  sc_unsigned.cpp -- Arbitrary precision signed arithmetic.
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de    This file includes the definitions of sc_unsigned_bitref,
2512027Sjungma@eit.uni-kl.de    sc_unsigned_subref, and sc_unsigned classes. The first two classes
2612027Sjungma@eit.uni-kl.de    are proxy classes to reference one bit and a range of bits of a
2712027Sjungma@eit.uni-kl.de    sc_unsigned number, respectively. This file also includes
2812027Sjungma@eit.uni-kl.de    sc_nbcommon.cpp and sc_nbfriends.cpp, which contain the
2912027Sjungma@eit.uni-kl.de    definitions shared by sc_unsigned.
3012027Sjungma@eit.uni-kl.de
3112027Sjungma@eit.uni-kl.de  Original Author: Ali Dasdan, Synopsys, Inc.
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de *****************************************************************************/
3412027Sjungma@eit.uni-kl.de
3512027Sjungma@eit.uni-kl.de/*****************************************************************************
3612027Sjungma@eit.uni-kl.de
3712027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3812027Sjungma@eit.uni-kl.de  changes you are making here.
3912027Sjungma@eit.uni-kl.de
4012027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
4112027Sjungma@eit.uni-kl.de  Description of Modification:
4212027Sjungma@eit.uni-kl.de
4312027Sjungma@eit.uni-kl.de *****************************************************************************/
4412027Sjungma@eit.uni-kl.de
4512027Sjungma@eit.uni-kl.de
4612027Sjungma@eit.uni-kl.de// $Log: sc_unsigned.cpp,v $
4712027Sjungma@eit.uni-kl.de// Revision 1.7  2011/02/18 20:19:15  acg
4812027Sjungma@eit.uni-kl.de//  Andy Goodrich: updating Copyright notice.
4912027Sjungma@eit.uni-kl.de//
5012027Sjungma@eit.uni-kl.de// Revision 1.6  2008/12/10 20:38:45  acg
5112027Sjungma@eit.uni-kl.de//  Andy Goodrich: fixed conversion of double values to the digits vector.
5212027Sjungma@eit.uni-kl.de//  The bits above the radix were not being masked off.
5312027Sjungma@eit.uni-kl.de//
5412027Sjungma@eit.uni-kl.de// Revision 1.5  2008/06/19 17:47:57  acg
5512027Sjungma@eit.uni-kl.de//  Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES.
5612027Sjungma@eit.uni-kl.de//
5712027Sjungma@eit.uni-kl.de// Revision 1.4  2008/06/19 16:57:57  acg
5812027Sjungma@eit.uni-kl.de//  Andy Goodrich: added case for negative unsigned values to the support in
5912027Sjungma@eit.uni-kl.de//  concate_get_data().
6012027Sjungma@eit.uni-kl.de//
6112027Sjungma@eit.uni-kl.de// Revision 1.3  2007/11/04 21:27:00  acg
6212027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes to make sure the proper value is returned from
6312027Sjungma@eit.uni-kl.de//  concat_get_data().
6412027Sjungma@eit.uni-kl.de//
6512027Sjungma@eit.uni-kl.de// Revision 1.2  2007/02/22 21:35:05  acg
6612027Sjungma@eit.uni-kl.de//  Andy Goodrich: cleaned up comments in concat_get_ctrl and concat_get_data.
6712027Sjungma@eit.uni-kl.de//
6812027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
6912027Sjungma@eit.uni-kl.de// SystemC 2.3
7012027Sjungma@eit.uni-kl.de//
7112027Sjungma@eit.uni-kl.de// Revision 1.4  2006/08/29 23:36:54  acg
7212027Sjungma@eit.uni-kl.de//  Andy Goodrich: fixed and_reduce and optimized or_reduce.
7312027Sjungma@eit.uni-kl.de//
7412027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:49:32  acg
7512027Sjungma@eit.uni-kl.de// Added $Log command so that CVS check in comments are reproduced in the
7612027Sjungma@eit.uni-kl.de// source.
7712027Sjungma@eit.uni-kl.de//
7812027Sjungma@eit.uni-kl.de
7912027Sjungma@eit.uni-kl.de#include <ctype.h>
8012027Sjungma@eit.uni-kl.de#include <math.h>
8112027Sjungma@eit.uni-kl.de
8212027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cmnhdr.h"
8312027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_macros.h"
8412027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h"
8512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h"
8612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_base.h"
8712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h"
8812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_ids.h"
8912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bv_base.h"
9012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_lv_base.h"
9112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/misc/sc_concatref.h"
9212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_ufix.h"
9312027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_other_defs.h"
9412027Sjungma@eit.uni-kl.de
9512027Sjungma@eit.uni-kl.denamespace sc_dt
9612027Sjungma@eit.uni-kl.de{
9712027Sjungma@eit.uni-kl.de
9812027Sjungma@eit.uni-kl.de// Pool of temporary instances:
9912027Sjungma@eit.uni-kl.de//   The sc_unsigned pool is used by the concatenation support.
10012027Sjungma@eit.uni-kl.de//   The bit and part reference pools allow references to be returned.
10112027Sjungma@eit.uni-kl.de
10212027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_unsigned> sc_unsigned::m_pool(8);
10312027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_unsigned_bitref> sc_unsigned_bitref::m_pool(9);
10412027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_unsigned_subref> sc_unsigned_subref::m_pool(9);
10512027Sjungma@eit.uni-kl.de
10612027Sjungma@eit.uni-kl.de// -----------------------------------------------------------------------------
10712027Sjungma@eit.uni-kl.de// SECTION: Public members - Invalid selections.
10812027Sjungma@eit.uni-kl.de// -----------------------------------------------------------------------------
10912027Sjungma@eit.uni-kl.de
11012027Sjungma@eit.uni-kl.devoid
11112027Sjungma@eit.uni-kl.desc_unsigned::invalid_index( int i ) const
11212027Sjungma@eit.uni-kl.de{
11312027Sjungma@eit.uni-kl.de    char msg[BUFSIZ];
11412027Sjungma@eit.uni-kl.de    std::sprintf( msg,
11512027Sjungma@eit.uni-kl.de         "sc_biguint bit selection: index = %d violates "
11612027Sjungma@eit.uni-kl.de         "0 <= index <= %d",
11712027Sjungma@eit.uni-kl.de         i, nbits - 2 );
11812027Sjungma@eit.uni-kl.de    SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
11912027Sjungma@eit.uni-kl.de}
12012027Sjungma@eit.uni-kl.de
12112027Sjungma@eit.uni-kl.devoid
12212027Sjungma@eit.uni-kl.desc_unsigned::invalid_range( int l, int r ) const
12312027Sjungma@eit.uni-kl.de{
12412027Sjungma@eit.uni-kl.de    char msg[BUFSIZ];
12512027Sjungma@eit.uni-kl.de    std::sprintf( msg,
12612027Sjungma@eit.uni-kl.de         "sc_biguint part selection: left = %d, right = %d \n"
12712027Sjungma@eit.uni-kl.de	 "  violates either (%d >= left >= 0) or (%d >= right >= 0)",
12812027Sjungma@eit.uni-kl.de         l, r, nbits-2, nbits-2 );
12912027Sjungma@eit.uni-kl.de    SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
13012027Sjungma@eit.uni-kl.de}
13112027Sjungma@eit.uni-kl.de
13212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
13312027Sjungma@eit.uni-kl.de//  SECTION: Public members - Concatenation support.
13412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
13512027Sjungma@eit.uni-kl.de
13612027Sjungma@eit.uni-kl.de// Most public members are included from sc_nbcommon.inc. However, some
13712027Sjungma@eit.uni-kl.de// concatenation support appears here to optimize between the signed and
13812027Sjungma@eit.uni-kl.de// unsigned cases.
13912027Sjungma@eit.uni-kl.de
14012027Sjungma@eit.uni-kl.de
14112027Sjungma@eit.uni-kl.de
14212027Sjungma@eit.uni-kl.de// Insert this object's value at the specified place in a vector of big style
14312027Sjungma@eit.uni-kl.de// values.
14412027Sjungma@eit.uni-kl.de
14512027Sjungma@eit.uni-kl.debool sc_unsigned::concat_get_ctrl( sc_digit* dst_p, int low_i ) const
14612027Sjungma@eit.uni-kl.de{
14712027Sjungma@eit.uni-kl.de    int      dst_i;        // Index to next word to set in dst_p.
14812027Sjungma@eit.uni-kl.de    int      end_i;        // Index of high order word to set.
14912027Sjungma@eit.uni-kl.de    int      left_shift;   // Amount to shift value left.
15012027Sjungma@eit.uni-kl.de    sc_digit mask;         // Mask for partial word sets.
15112027Sjungma@eit.uni-kl.de
15212027Sjungma@eit.uni-kl.de
15312027Sjungma@eit.uni-kl.de    // CALCULATE METRICS FOR DATA MOVEMENT:
15412027Sjungma@eit.uni-kl.de
15512027Sjungma@eit.uni-kl.de    dst_i = low_i / BITS_PER_DIGIT;
15612027Sjungma@eit.uni-kl.de    end_i = (low_i + nbits - 2) / BITS_PER_DIGIT;
15712027Sjungma@eit.uni-kl.de    left_shift = low_i % BITS_PER_DIGIT;
15812027Sjungma@eit.uni-kl.de
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.de    // MOVE FIRST WORD (IT MAY BE PARTIAL) AND THEN ANY OTHERS:
16112027Sjungma@eit.uni-kl.de    //
16212027Sjungma@eit.uni-kl.de    // We may "clobber" upper bits, but they will be written at some point
16312027Sjungma@eit.uni-kl.de    // anyway.
16412027Sjungma@eit.uni-kl.de
16512027Sjungma@eit.uni-kl.de    mask = ~(-1 << left_shift);
16612027Sjungma@eit.uni-kl.de    dst_p[dst_i] = ( dst_p[dst_i] & ~mask );
16712027Sjungma@eit.uni-kl.de    dst_i++;
16812027Sjungma@eit.uni-kl.de
16912027Sjungma@eit.uni-kl.de    for ( ; dst_i <= end_i; dst_i++ ) dst_p[dst_i] = 0;
17012027Sjungma@eit.uni-kl.de
17112027Sjungma@eit.uni-kl.de    return false;
17212027Sjungma@eit.uni-kl.de}
17312027Sjungma@eit.uni-kl.de
17412027Sjungma@eit.uni-kl.debool sc_unsigned::concat_get_data( sc_digit* dst_p, int low_i ) const
17512027Sjungma@eit.uni-kl.de{
17612027Sjungma@eit.uni-kl.de    sc_digit carry;        // Carry for negating value.
17712027Sjungma@eit.uni-kl.de    int      dst_i;        // Index to next word to set in dst_p.
17812027Sjungma@eit.uni-kl.de    int      end_i;        // Index of high order word to set.
17912027Sjungma@eit.uni-kl.de    int      high_i;       // Index w/in word of high order bit.
18012027Sjungma@eit.uni-kl.de    int      left_shift;   // Amount to shift value left.
18112027Sjungma@eit.uni-kl.de    sc_digit left_word;    // High word component for set.
18212027Sjungma@eit.uni-kl.de    sc_digit mask;         // Mask for partial word sets.
18312027Sjungma@eit.uni-kl.de    bool     result;       // True if inserting non-zero data.
18412027Sjungma@eit.uni-kl.de    int      right_shift;  // Amount to shift value right.
18512027Sjungma@eit.uni-kl.de    sc_digit right_word;   // Low word component for set.
18612027Sjungma@eit.uni-kl.de    int      real_bits;    // nbits - 1.
18712027Sjungma@eit.uni-kl.de    int      src_i;        // Index to next word to get from digit.
18812027Sjungma@eit.uni-kl.de
18912027Sjungma@eit.uni-kl.de
19012027Sjungma@eit.uni-kl.de    // CALCULATE METRICS FOR DATA MOVEMENT:
19112027Sjungma@eit.uni-kl.de
19212027Sjungma@eit.uni-kl.de    real_bits = nbits - 1;          // Remove that extra sign bit.
19312027Sjungma@eit.uni-kl.de    dst_i = low_i / BITS_PER_DIGIT;
19412027Sjungma@eit.uni-kl.de    high_i = low_i + real_bits - 1;
19512027Sjungma@eit.uni-kl.de    end_i = high_i / BITS_PER_DIGIT;
19612027Sjungma@eit.uni-kl.de    left_shift = low_i % BITS_PER_DIGIT;
19712027Sjungma@eit.uni-kl.de
19812027Sjungma@eit.uni-kl.de
19912027Sjungma@eit.uni-kl.de    switch ( sgn )
20012027Sjungma@eit.uni-kl.de    {
20112027Sjungma@eit.uni-kl.de
20212027Sjungma@eit.uni-kl.de      // POSITIVE SOURCE VALUE:
20312027Sjungma@eit.uni-kl.de
20412027Sjungma@eit.uni-kl.de      case SC_POS:
20512027Sjungma@eit.uni-kl.de	result = true;
20612027Sjungma@eit.uni-kl.de
20712027Sjungma@eit.uni-kl.de	// ALL DATA TO BE MOVED IS IN A SINGLE WORD:
20812027Sjungma@eit.uni-kl.de
20912027Sjungma@eit.uni-kl.de	if ( dst_i == end_i )
21012027Sjungma@eit.uni-kl.de	{
21112027Sjungma@eit.uni-kl.de	    mask = ~(-1 << left_shift);
21212027Sjungma@eit.uni-kl.de	    dst_p[dst_i] = ( ( dst_p[dst_i] & mask ) |
21312027Sjungma@eit.uni-kl.de		(digit[0] << left_shift) ) & DIGIT_MASK;
21412027Sjungma@eit.uni-kl.de	}
21512027Sjungma@eit.uni-kl.de
21612027Sjungma@eit.uni-kl.de
21712027Sjungma@eit.uni-kl.de	// DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
21812027Sjungma@eit.uni-kl.de
21912027Sjungma@eit.uni-kl.de	else if ( left_shift == 0 )
22012027Sjungma@eit.uni-kl.de	{
22112027Sjungma@eit.uni-kl.de	    for ( src_i = 0; dst_i < end_i; dst_i++, src_i++ )
22212027Sjungma@eit.uni-kl.de	    {
22312027Sjungma@eit.uni-kl.de		dst_p[dst_i] = digit[src_i];
22412027Sjungma@eit.uni-kl.de	    }
22512027Sjungma@eit.uni-kl.de	    high_i = high_i % BITS_PER_DIGIT;
22612027Sjungma@eit.uni-kl.de	    mask = ~(-2 << high_i) & DIGIT_MASK;
22712027Sjungma@eit.uni-kl.de	    dst_p[dst_i] = digit[src_i] & mask;
22812027Sjungma@eit.uni-kl.de	}
22912027Sjungma@eit.uni-kl.de
23012027Sjungma@eit.uni-kl.de
23112027Sjungma@eit.uni-kl.de	// DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
23212027Sjungma@eit.uni-kl.de
23312027Sjungma@eit.uni-kl.de	else
23412027Sjungma@eit.uni-kl.de	{
23512027Sjungma@eit.uni-kl.de	    high_i = high_i % BITS_PER_DIGIT;
23612027Sjungma@eit.uni-kl.de	    right_shift = BITS_PER_DIGIT - left_shift;
23712027Sjungma@eit.uni-kl.de	    mask = ~(-1 << left_shift);
23812027Sjungma@eit.uni-kl.de	    right_word = digit[0];
23912027Sjungma@eit.uni-kl.de	    dst_p[dst_i] = (dst_p[dst_i] & mask) |
24012027Sjungma@eit.uni-kl.de		((right_word << left_shift) & DIGIT_MASK);
24112027Sjungma@eit.uni-kl.de	    for ( src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++ )
24212027Sjungma@eit.uni-kl.de	    {
24312027Sjungma@eit.uni-kl.de		left_word = digit[src_i];
24412027Sjungma@eit.uni-kl.de		dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
24512027Sjungma@eit.uni-kl.de		    (right_word >> right_shift);
24612027Sjungma@eit.uni-kl.de		right_word = left_word;
24712027Sjungma@eit.uni-kl.de	    }
24812027Sjungma@eit.uni-kl.de	    left_word = (src_i < ndigits) ? digit[src_i] : 0;
24912027Sjungma@eit.uni-kl.de	    mask = ~(-2 << high_i) & DIGIT_MASK;
25012027Sjungma@eit.uni-kl.de	    dst_p[dst_i] = ((left_word << left_shift) |
25112027Sjungma@eit.uni-kl.de		(right_word >> right_shift)) & mask;
25212027Sjungma@eit.uni-kl.de	}
25312027Sjungma@eit.uni-kl.de	break;
25412027Sjungma@eit.uni-kl.de
25512027Sjungma@eit.uni-kl.de      // SOURCE VALUE IS NEGATIVE:
25612027Sjungma@eit.uni-kl.de
25712027Sjungma@eit.uni-kl.de      case SC_NEG:
25812027Sjungma@eit.uni-kl.de
25912027Sjungma@eit.uni-kl.de        // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.de	result = true;
26212027Sjungma@eit.uni-kl.de        if ( dst_i == end_i )
26312027Sjungma@eit.uni-kl.de        {
26412027Sjungma@eit.uni-kl.de            mask = ~(-1 << nbits);
26512027Sjungma@eit.uni-kl.de            right_word = ((digit[0] ^ DIGIT_MASK) + 1) & mask;
26612027Sjungma@eit.uni-kl.de            mask = ~(-1 << left_shift);
26712027Sjungma@eit.uni-kl.de            dst_p[dst_i] = ( ( dst_p[dst_i] & mask ) |
26812027Sjungma@eit.uni-kl.de                (right_word << left_shift) ) & DIGIT_MASK;
26912027Sjungma@eit.uni-kl.de        }
27012027Sjungma@eit.uni-kl.de
27112027Sjungma@eit.uni-kl.de
27212027Sjungma@eit.uni-kl.de        // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
27312027Sjungma@eit.uni-kl.de
27412027Sjungma@eit.uni-kl.de        else if ( left_shift == 0 )
27512027Sjungma@eit.uni-kl.de        {
27612027Sjungma@eit.uni-kl.de            carry = 1;
27712027Sjungma@eit.uni-kl.de            for ( src_i = 0; dst_i < end_i; dst_i++, src_i++ )
27812027Sjungma@eit.uni-kl.de            {
27912027Sjungma@eit.uni-kl.de                right_word = (digit[src_i] ^ DIGIT_MASK) + carry;
28012027Sjungma@eit.uni-kl.de                dst_p[dst_i] = right_word &  DIGIT_MASK;
28112027Sjungma@eit.uni-kl.de                carry = right_word >> BITS_PER_DIGIT;
28212027Sjungma@eit.uni-kl.de            }
28312027Sjungma@eit.uni-kl.de            high_i = high_i % BITS_PER_DIGIT;
28412027Sjungma@eit.uni-kl.de            mask = (~(-2 << high_i)) & DIGIT_MASK;
28512027Sjungma@eit.uni-kl.de            right_word = (src_i < ndigits) ?
28612027Sjungma@eit.uni-kl.de		(digit[src_i] ^ DIGIT_MASK) + carry : DIGIT_MASK + carry;
28712027Sjungma@eit.uni-kl.de            dst_p[dst_i] = right_word & mask;
28812027Sjungma@eit.uni-kl.de        }
28912027Sjungma@eit.uni-kl.de
29012027Sjungma@eit.uni-kl.de
29112027Sjungma@eit.uni-kl.de        // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
29212027Sjungma@eit.uni-kl.de
29312027Sjungma@eit.uni-kl.de        else
29412027Sjungma@eit.uni-kl.de        {
29512027Sjungma@eit.uni-kl.de            high_i = high_i % BITS_PER_DIGIT;
29612027Sjungma@eit.uni-kl.de            right_shift = BITS_PER_DIGIT - left_shift;
29712027Sjungma@eit.uni-kl.de            mask = ~(-1 << left_shift);
29812027Sjungma@eit.uni-kl.de            carry = 1;
29912027Sjungma@eit.uni-kl.de            right_word = (digit[0] ^ DIGIT_MASK) + carry;
30012027Sjungma@eit.uni-kl.de            dst_p[dst_i] = (dst_p[dst_i] & mask) |
30112027Sjungma@eit.uni-kl.de                ((right_word << left_shift) & DIGIT_MASK);
30212027Sjungma@eit.uni-kl.de	    carry = right_word >> BITS_PER_DIGIT;
30312027Sjungma@eit.uni-kl.de	    right_word &= DIGIT_MASK;
30412027Sjungma@eit.uni-kl.de            for ( src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++ )
30512027Sjungma@eit.uni-kl.de            {
30612027Sjungma@eit.uni-kl.de                left_word = (digit[src_i] ^ DIGIT_MASK) + carry;
30712027Sjungma@eit.uni-kl.de                dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
30812027Sjungma@eit.uni-kl.de                    (right_word >> right_shift);
30912027Sjungma@eit.uni-kl.de                carry = left_word >> BITS_PER_DIGIT;
31012027Sjungma@eit.uni-kl.de                right_word = left_word & DIGIT_MASK;
31112027Sjungma@eit.uni-kl.de            }
31212027Sjungma@eit.uni-kl.de            left_word = (src_i < ndigits) ?
31312027Sjungma@eit.uni-kl.de		(digit[src_i] ^ DIGIT_MASK) + carry : carry;
31412027Sjungma@eit.uni-kl.de            mask = ~(-2 << high_i) & DIGIT_MASK;
31512027Sjungma@eit.uni-kl.de            dst_p[dst_i] = ((left_word << left_shift) |
31612027Sjungma@eit.uni-kl.de                (right_word >> right_shift)) & mask;
31712027Sjungma@eit.uni-kl.de        }
31812027Sjungma@eit.uni-kl.de	break;
31912027Sjungma@eit.uni-kl.de
32012027Sjungma@eit.uni-kl.de
32112027Sjungma@eit.uni-kl.de      // VALUE IS ZERO:
32212027Sjungma@eit.uni-kl.de
32312027Sjungma@eit.uni-kl.de      default:
32412027Sjungma@eit.uni-kl.de	result = false;
32512027Sjungma@eit.uni-kl.de
32612027Sjungma@eit.uni-kl.de        // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
32712027Sjungma@eit.uni-kl.de
32812027Sjungma@eit.uni-kl.de        if ( dst_i == end_i )
32912027Sjungma@eit.uni-kl.de        {
33012027Sjungma@eit.uni-kl.de            mask = ~(-1 << real_bits) << left_shift;
33112027Sjungma@eit.uni-kl.de            dst_p[dst_i] = dst_p[dst_i] & ~mask;
33212027Sjungma@eit.uni-kl.de        }
33312027Sjungma@eit.uni-kl.de
33412027Sjungma@eit.uni-kl.de
33512027Sjungma@eit.uni-kl.de        // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
33612027Sjungma@eit.uni-kl.de
33712027Sjungma@eit.uni-kl.de        else if ( left_shift == 0 )
33812027Sjungma@eit.uni-kl.de        {
33912027Sjungma@eit.uni-kl.de            for ( src_i = 0; dst_i < end_i; dst_i++, src_i++ )
34012027Sjungma@eit.uni-kl.de            {
34112027Sjungma@eit.uni-kl.de                dst_p[dst_i] = 0;
34212027Sjungma@eit.uni-kl.de            }
34312027Sjungma@eit.uni-kl.de            high_i = high_i % BITS_PER_DIGIT;
34412027Sjungma@eit.uni-kl.de            mask = ~(-2 << high_i) & DIGIT_MASK;
34512027Sjungma@eit.uni-kl.de            dst_p[dst_i] = 0;
34612027Sjungma@eit.uni-kl.de        }
34712027Sjungma@eit.uni-kl.de
34812027Sjungma@eit.uni-kl.de
34912027Sjungma@eit.uni-kl.de        // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
35012027Sjungma@eit.uni-kl.de
35112027Sjungma@eit.uni-kl.de        else
35212027Sjungma@eit.uni-kl.de        {
35312027Sjungma@eit.uni-kl.de            high_i = high_i % BITS_PER_DIGIT;
35412027Sjungma@eit.uni-kl.de            right_shift = BITS_PER_DIGIT - left_shift;
35512027Sjungma@eit.uni-kl.de            mask = ~(-1 << left_shift);
35612027Sjungma@eit.uni-kl.de            dst_p[dst_i] = (dst_p[dst_i] & mask);
35712027Sjungma@eit.uni-kl.de            for ( dst_i++; dst_i <= end_i; dst_i++ )
35812027Sjungma@eit.uni-kl.de            {
35912027Sjungma@eit.uni-kl.de                dst_p[dst_i] = 0;
36012027Sjungma@eit.uni-kl.de            }
36112027Sjungma@eit.uni-kl.de        }
36212027Sjungma@eit.uni-kl.de        break;
36312027Sjungma@eit.uni-kl.de    }
36412027Sjungma@eit.uni-kl.de    return result;
36512027Sjungma@eit.uni-kl.de}
36612027Sjungma@eit.uni-kl.de
36712027Sjungma@eit.uni-kl.de// Return this object instance's bits as a uint64 without sign extension.
36812027Sjungma@eit.uni-kl.de
36912027Sjungma@eit.uni-kl.deuint64 sc_unsigned::concat_get_uint64() const
37012027Sjungma@eit.uni-kl.de{
37112027Sjungma@eit.uni-kl.de    uint64        result;
37212027Sjungma@eit.uni-kl.de
37312027Sjungma@eit.uni-kl.de    switch ( sgn )
37412027Sjungma@eit.uni-kl.de    {
37512027Sjungma@eit.uni-kl.de      case SC_POS:
37612027Sjungma@eit.uni-kl.de        result = 0;
37712027Sjungma@eit.uni-kl.de        if ( ndigits > 2 )
37812027Sjungma@eit.uni-kl.de            result = digit[2];
37912027Sjungma@eit.uni-kl.de        if ( ndigits > 1 )
38012027Sjungma@eit.uni-kl.de            result = (result << BITS_PER_DIGIT) | digit[1];
38112027Sjungma@eit.uni-kl.de        result = (result << BITS_PER_DIGIT) | digit[0];
38212027Sjungma@eit.uni-kl.de        break;
38312027Sjungma@eit.uni-kl.de      default:
38412027Sjungma@eit.uni-kl.de        result = 0;
38512027Sjungma@eit.uni-kl.de        break;
38612027Sjungma@eit.uni-kl.de    }
38712027Sjungma@eit.uni-kl.de    return result;
38812027Sjungma@eit.uni-kl.de}
38912027Sjungma@eit.uni-kl.de
39012027Sjungma@eit.uni-kl.de// #### OPTIMIZE
39112027Sjungma@eit.uni-kl.devoid sc_unsigned::concat_set(int64 src, int low_i)
39212027Sjungma@eit.uni-kl.de{
39312027Sjungma@eit.uni-kl.de    *this = (low_i < 64) ? src >> low_i : src >> 63;
39412027Sjungma@eit.uni-kl.de}
39512027Sjungma@eit.uni-kl.de
39612027Sjungma@eit.uni-kl.devoid sc_unsigned::concat_set(const sc_signed& src, int low_i)
39712027Sjungma@eit.uni-kl.de{
39812027Sjungma@eit.uni-kl.de    if ( low_i < src.length() )
39912027Sjungma@eit.uni-kl.de        *this = src >> low_i;
40012027Sjungma@eit.uni-kl.de    else
40112027Sjungma@eit.uni-kl.de        *this = (src<0) ? (int_type)-1 : 0;
40212027Sjungma@eit.uni-kl.de}
40312027Sjungma@eit.uni-kl.de
40412027Sjungma@eit.uni-kl.devoid sc_unsigned::concat_set(const sc_unsigned& src, int low_i)
40512027Sjungma@eit.uni-kl.de{
40612027Sjungma@eit.uni-kl.de    if ( low_i < src.length() )
40712027Sjungma@eit.uni-kl.de        *this = src >> low_i;
40812027Sjungma@eit.uni-kl.de    else
40912027Sjungma@eit.uni-kl.de        *this = 0;
41012027Sjungma@eit.uni-kl.de}
41112027Sjungma@eit.uni-kl.de
41212027Sjungma@eit.uni-kl.devoid sc_unsigned::concat_set(uint64 src, int low_i)
41312027Sjungma@eit.uni-kl.de{
41412027Sjungma@eit.uni-kl.de    *this = (low_i < 64) ? src >> low_i : 0;
41512027Sjungma@eit.uni-kl.de}
41612027Sjungma@eit.uni-kl.de
41712027Sjungma@eit.uni-kl.de
41812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
41912027Sjungma@eit.uni-kl.de//  SECTION: Public members - Reduction methods.
42012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
42112027Sjungma@eit.uni-kl.de
42212027Sjungma@eit.uni-kl.debool sc_unsigned::and_reduce() const
42312027Sjungma@eit.uni-kl.de{
42412027Sjungma@eit.uni-kl.de    int i;   // Digit examining.
42512027Sjungma@eit.uni-kl.de
42612027Sjungma@eit.uni-kl.de	if ( sgn == SC_ZERO ) return false;
42712027Sjungma@eit.uni-kl.de    for ( i = 0; i < ndigits-1; i++ )
42812027Sjungma@eit.uni-kl.de        if ( (digit[i] & DIGIT_MASK) != DIGIT_MASK ) return false;
42912027Sjungma@eit.uni-kl.de    if ( (digit[i] & ~(-1 << ((nbits-1) % BITS_PER_DIGIT))) ==
43012027Sjungma@eit.uni-kl.de        (sc_digit)~(-1 << ((nbits-1) % BITS_PER_DIGIT)))
43112027Sjungma@eit.uni-kl.de		return true;
43212027Sjungma@eit.uni-kl.de    return false;
43312027Sjungma@eit.uni-kl.de}
43412027Sjungma@eit.uni-kl.de
43512027Sjungma@eit.uni-kl.debool sc_unsigned::or_reduce() const
43612027Sjungma@eit.uni-kl.de{
43712027Sjungma@eit.uni-kl.de	return ( sgn == SC_ZERO ) ? false : true;
43812027Sjungma@eit.uni-kl.de}
43912027Sjungma@eit.uni-kl.de
44012027Sjungma@eit.uni-kl.debool sc_unsigned::xor_reduce() const
44112027Sjungma@eit.uni-kl.de{
44212027Sjungma@eit.uni-kl.de    int i;   // Digit examining.
44312027Sjungma@eit.uni-kl.de    int odd; // Flag for odd number of digits.
44412027Sjungma@eit.uni-kl.de
44512027Sjungma@eit.uni-kl.de    odd = 0;
44612027Sjungma@eit.uni-kl.de    for ( i = 0; i < nbits-1; i++ )
44712027Sjungma@eit.uni-kl.de	if ( test(i) ) odd = ~odd;
44812027Sjungma@eit.uni-kl.de    return odd ? true : false;
44912027Sjungma@eit.uni-kl.de}
45012027Sjungma@eit.uni-kl.de
45112027Sjungma@eit.uni-kl.de
45212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
45312027Sjungma@eit.uni-kl.de//  SECTION: Public members - Assignment operators.
45412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
45512027Sjungma@eit.uni-kl.de
45612027Sjungma@eit.uni-kl.de// assignment operators
45712027Sjungma@eit.uni-kl.de
45812027Sjungma@eit.uni-kl.deconst sc_unsigned&
45912027Sjungma@eit.uni-kl.desc_unsigned::operator = ( const char* a )
46012027Sjungma@eit.uni-kl.de{
46112027Sjungma@eit.uni-kl.de    if( a == 0 ) {
46212027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_,
46312027Sjungma@eit.uni-kl.de                         "character string is zero" );
46412027Sjungma@eit.uni-kl.de    }
46512027Sjungma@eit.uni-kl.de    if( *a == 0 ) {
46612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_,
46712027Sjungma@eit.uni-kl.de                         "character string is empty" );
46812027Sjungma@eit.uni-kl.de    }
46912027Sjungma@eit.uni-kl.de    try {
47012027Sjungma@eit.uni-kl.de        int len = length();
47112027Sjungma@eit.uni-kl.de        sc_ufix aa( a, len, len, SC_TRN, SC_WRAP, 0, SC_ON );
47212027Sjungma@eit.uni-kl.de        return this->operator = ( aa );
47312027Sjungma@eit.uni-kl.de    } catch( sc_core::sc_report ) {
47412027Sjungma@eit.uni-kl.de        char msg[BUFSIZ];
47512027Sjungma@eit.uni-kl.de        std::sprintf( msg, "character string '%s' is not valid", a );
47612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_, msg );
47712027Sjungma@eit.uni-kl.de        // never reached
47812027Sjungma@eit.uni-kl.de    }
47912027Sjungma@eit.uni-kl.de    return *this;
48012027Sjungma@eit.uni-kl.de}
48112027Sjungma@eit.uni-kl.de
48212027Sjungma@eit.uni-kl.deconst sc_unsigned&
48312027Sjungma@eit.uni-kl.desc_unsigned::operator=(int64 v)
48412027Sjungma@eit.uni-kl.de{
48512027Sjungma@eit.uni-kl.de  sgn = get_sign(v);
48612027Sjungma@eit.uni-kl.de  if ( sgn == SC_ZERO ) {
48712027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
48812027Sjungma@eit.uni-kl.de  }
48912027Sjungma@eit.uni-kl.de  else {
49012027Sjungma@eit.uni-kl.de    from_uint(ndigits, digit, (uint64) v);
49112027Sjungma@eit.uni-kl.de    convert_SM_to_2C_to_SM();
49212027Sjungma@eit.uni-kl.de  }
49312027Sjungma@eit.uni-kl.de  return *this;
49412027Sjungma@eit.uni-kl.de}
49512027Sjungma@eit.uni-kl.de
49612027Sjungma@eit.uni-kl.deconst sc_unsigned&
49712027Sjungma@eit.uni-kl.desc_unsigned::operator=(uint64 v)
49812027Sjungma@eit.uni-kl.de{
49912027Sjungma@eit.uni-kl.de  if (v == 0) {
50012027Sjungma@eit.uni-kl.de    sgn = SC_ZERO;
50112027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
50212027Sjungma@eit.uni-kl.de  }
50312027Sjungma@eit.uni-kl.de  else {
50412027Sjungma@eit.uni-kl.de    sgn = SC_POS;
50512027Sjungma@eit.uni-kl.de    from_uint(ndigits, digit, v);
50612027Sjungma@eit.uni-kl.de    convert_SM_to_2C_to_SM();
50712027Sjungma@eit.uni-kl.de  }
50812027Sjungma@eit.uni-kl.de  return *this;
50912027Sjungma@eit.uni-kl.de}
51012027Sjungma@eit.uni-kl.de
51112027Sjungma@eit.uni-kl.deconst sc_unsigned&
51212027Sjungma@eit.uni-kl.desc_unsigned::operator=(long v)
51312027Sjungma@eit.uni-kl.de{
51412027Sjungma@eit.uni-kl.de  sgn = get_sign(v);
51512027Sjungma@eit.uni-kl.de  if ( sgn == SC_ZERO ) {
51612027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
51712027Sjungma@eit.uni-kl.de  }
51812027Sjungma@eit.uni-kl.de  else {
51912027Sjungma@eit.uni-kl.de    from_uint(ndigits, digit, (unsigned long) v);
52012027Sjungma@eit.uni-kl.de    convert_SM_to_2C_to_SM();
52112027Sjungma@eit.uni-kl.de  }
52212027Sjungma@eit.uni-kl.de  return *this;
52312027Sjungma@eit.uni-kl.de}
52412027Sjungma@eit.uni-kl.de
52512027Sjungma@eit.uni-kl.deconst sc_unsigned&
52612027Sjungma@eit.uni-kl.desc_unsigned::operator=(unsigned long v)
52712027Sjungma@eit.uni-kl.de{
52812027Sjungma@eit.uni-kl.de  if (v == 0) {
52912027Sjungma@eit.uni-kl.de    sgn = SC_ZERO;
53012027Sjungma@eit.uni-kl.de    vec_zero(ndigits, digit);
53112027Sjungma@eit.uni-kl.de  }
53212027Sjungma@eit.uni-kl.de  else {
53312027Sjungma@eit.uni-kl.de    sgn = SC_POS;
53412027Sjungma@eit.uni-kl.de    from_uint(ndigits, digit, v);
53512027Sjungma@eit.uni-kl.de    convert_SM_to_2C_to_SM();
53612027Sjungma@eit.uni-kl.de  }
53712027Sjungma@eit.uni-kl.de  return *this;
53812027Sjungma@eit.uni-kl.de}
53912027Sjungma@eit.uni-kl.de
54012027Sjungma@eit.uni-kl.deconst sc_unsigned&
54112027Sjungma@eit.uni-kl.desc_unsigned::operator=(double v)
54212027Sjungma@eit.uni-kl.de{
54312027Sjungma@eit.uni-kl.de  is_bad_double(v);
54412027Sjungma@eit.uni-kl.de  sgn = SC_POS;
54512027Sjungma@eit.uni-kl.de  int i = 0;
54612027Sjungma@eit.uni-kl.de  while (floor(v) && (i < ndigits)) {
54712027Sjungma@eit.uni-kl.de#ifndef _WIN32
54812027Sjungma@eit.uni-kl.de    digit[i++] = ((sc_digit)floor(remainder(v, DIGIT_RADIX))) & DIGIT_MASK;
54912027Sjungma@eit.uni-kl.de#else
55012027Sjungma@eit.uni-kl.de    digit[i++] = ((sc_digit)floor(fmod(v, DIGIT_RADIX))) & DIGIT_MASK;
55112027Sjungma@eit.uni-kl.de#endif
55212027Sjungma@eit.uni-kl.de    v /= DIGIT_RADIX;
55312027Sjungma@eit.uni-kl.de  }
55412027Sjungma@eit.uni-kl.de  vec_zero(i, ndigits, digit);
55512027Sjungma@eit.uni-kl.de  convert_SM_to_2C_to_SM();
55612027Sjungma@eit.uni-kl.de  return *this;
55712027Sjungma@eit.uni-kl.de}
55812027Sjungma@eit.uni-kl.de
55912027Sjungma@eit.uni-kl.de
56012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
56112027Sjungma@eit.uni-kl.de
56212027Sjungma@eit.uni-kl.deconst sc_unsigned&
56312027Sjungma@eit.uni-kl.desc_unsigned::operator = ( const sc_bv_base& v )
56412027Sjungma@eit.uni-kl.de{
56512027Sjungma@eit.uni-kl.de    int minlen = sc_min( nbits, v.length() );
56612027Sjungma@eit.uni-kl.de    int i = 0;
56712027Sjungma@eit.uni-kl.de    for( ; i < minlen; ++ i ) {
56812027Sjungma@eit.uni-kl.de	safe_set( i, v.get_bit( i ), digit );
56912027Sjungma@eit.uni-kl.de    }
57012027Sjungma@eit.uni-kl.de    for( ; i < nbits; ++ i ) {
57112027Sjungma@eit.uni-kl.de	safe_set( i, 0, digit );  // zero-extend
57212027Sjungma@eit.uni-kl.de    }
57312027Sjungma@eit.uni-kl.de    convert_2C_to_SM();
57412027Sjungma@eit.uni-kl.de    return *this;
57512027Sjungma@eit.uni-kl.de}
57612027Sjungma@eit.uni-kl.de
57712027Sjungma@eit.uni-kl.deconst sc_unsigned&
57812027Sjungma@eit.uni-kl.desc_unsigned::operator = ( const sc_lv_base& v )
57912027Sjungma@eit.uni-kl.de{
58012027Sjungma@eit.uni-kl.de    int minlen = sc_min( nbits, v.length() );
58112027Sjungma@eit.uni-kl.de    int i = 0;
58212027Sjungma@eit.uni-kl.de    for( ; i < minlen; ++ i ) {
58312027Sjungma@eit.uni-kl.de	safe_set( i, sc_logic( v.get_bit( i ) ).to_bool(), digit );
58412027Sjungma@eit.uni-kl.de    }
58512027Sjungma@eit.uni-kl.de    for( ; i < nbits; ++ i ) {
58612027Sjungma@eit.uni-kl.de	safe_set( i, 0, digit );  // zero-extend
58712027Sjungma@eit.uni-kl.de    }
58812027Sjungma@eit.uni-kl.de    convert_2C_to_SM();
58912027Sjungma@eit.uni-kl.de    return *this;
59012027Sjungma@eit.uni-kl.de}
59112027Sjungma@eit.uni-kl.de
59212027Sjungma@eit.uni-kl.de
59312027Sjungma@eit.uni-kl.de// explicit conversion to character string
59412027Sjungma@eit.uni-kl.de
59512027Sjungma@eit.uni-kl.deconst std::string
59612027Sjungma@eit.uni-kl.desc_unsigned::to_string( sc_numrep numrep ) const
59712027Sjungma@eit.uni-kl.de{
59812027Sjungma@eit.uni-kl.de    int len = length();
59912027Sjungma@eit.uni-kl.de    sc_ufix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON );
60012027Sjungma@eit.uni-kl.de    return aa.to_string( numrep );
60112027Sjungma@eit.uni-kl.de}
60212027Sjungma@eit.uni-kl.de
60312027Sjungma@eit.uni-kl.deconst std::string
60412027Sjungma@eit.uni-kl.desc_unsigned::to_string( sc_numrep numrep, bool w_prefix ) const
60512027Sjungma@eit.uni-kl.de{
60612027Sjungma@eit.uni-kl.de    int len = length();
60712027Sjungma@eit.uni-kl.de    sc_ufix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON );
60812027Sjungma@eit.uni-kl.de    return aa.to_string( numrep, w_prefix );
60912027Sjungma@eit.uni-kl.de}
61012027Sjungma@eit.uni-kl.de
61112027Sjungma@eit.uni-kl.de
61212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
61312027Sjungma@eit.uni-kl.de//  SECTION: Interfacing with sc_int_base
61412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
61512027Sjungma@eit.uni-kl.de
61612027Sjungma@eit.uni-kl.deconst sc_unsigned&
61712027Sjungma@eit.uni-kl.desc_unsigned::operator= (const sc_int_base& v)
61812027Sjungma@eit.uni-kl.de{ return operator=((int64) v); }
61912027Sjungma@eit.uni-kl.de
62012027Sjungma@eit.uni-kl.deconst sc_unsigned&
62112027Sjungma@eit.uni-kl.desc_unsigned::operator+=(const sc_int_base& v)
62212027Sjungma@eit.uni-kl.de{ return operator+=((int64) v); }
62312027Sjungma@eit.uni-kl.de
62412027Sjungma@eit.uni-kl.deconst sc_unsigned&
62512027Sjungma@eit.uni-kl.desc_unsigned::operator-=(const sc_int_base& v)
62612027Sjungma@eit.uni-kl.de{ return operator-=((int64) v); }
62712027Sjungma@eit.uni-kl.de
62812027Sjungma@eit.uni-kl.deconst sc_unsigned&
62912027Sjungma@eit.uni-kl.desc_unsigned::operator*=(const sc_int_base& v)
63012027Sjungma@eit.uni-kl.de{ return operator*=((int64) v); }
63112027Sjungma@eit.uni-kl.de
63212027Sjungma@eit.uni-kl.deconst sc_unsigned&
63312027Sjungma@eit.uni-kl.desc_unsigned::operator/=(const sc_int_base& v)
63412027Sjungma@eit.uni-kl.de{ return operator/=((int64) v); }
63512027Sjungma@eit.uni-kl.de
63612027Sjungma@eit.uni-kl.deconst sc_unsigned&
63712027Sjungma@eit.uni-kl.desc_unsigned::operator%=(const sc_int_base& v)
63812027Sjungma@eit.uni-kl.de{ return operator%=((int64) v); }
63912027Sjungma@eit.uni-kl.de
64012027Sjungma@eit.uni-kl.deconst sc_unsigned&
64112027Sjungma@eit.uni-kl.desc_unsigned::operator&=(const sc_int_base& v)
64212027Sjungma@eit.uni-kl.de{ return operator&=((int64) v); }
64312027Sjungma@eit.uni-kl.de
64412027Sjungma@eit.uni-kl.deconst sc_unsigned&
64512027Sjungma@eit.uni-kl.desc_unsigned::operator|=(const sc_int_base& v)
64612027Sjungma@eit.uni-kl.de{ return operator|=((int64) v); }
64712027Sjungma@eit.uni-kl.de
64812027Sjungma@eit.uni-kl.deconst sc_unsigned&
64912027Sjungma@eit.uni-kl.desc_unsigned::operator^=(const sc_int_base& v)
65012027Sjungma@eit.uni-kl.de{ return operator^=((int64) v); }
65112027Sjungma@eit.uni-kl.de
65212027Sjungma@eit.uni-kl.desc_unsigned
65312027Sjungma@eit.uni-kl.deoperator<<(const sc_unsigned& u, const sc_int_base& v)
65412027Sjungma@eit.uni-kl.de{ return operator<<(u, (int64) v); }
65512027Sjungma@eit.uni-kl.deconst sc_unsigned&
65612027Sjungma@eit.uni-kl.desc_unsigned::operator<<=(const sc_int_base& v)
65712027Sjungma@eit.uni-kl.de{ return operator<<=((int64) v); }
65812027Sjungma@eit.uni-kl.de
65912027Sjungma@eit.uni-kl.desc_unsigned
66012027Sjungma@eit.uni-kl.deoperator>>(const sc_unsigned&    u, const sc_int_base&  v)
66112027Sjungma@eit.uni-kl.de{ return operator>>(u, (int64) v); }
66212027Sjungma@eit.uni-kl.deconst sc_unsigned&
66312027Sjungma@eit.uni-kl.desc_unsigned::operator>>=(const sc_int_base&  v)
66412027Sjungma@eit.uni-kl.de{ return operator>>=((int64) v); }
66512027Sjungma@eit.uni-kl.de
66612027Sjungma@eit.uni-kl.debool
66712027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, const sc_int_base& v)
66812027Sjungma@eit.uni-kl.de{ return operator==(u, (int64) v); }
66912027Sjungma@eit.uni-kl.debool
67012027Sjungma@eit.uni-kl.deoperator==(const sc_int_base& u, const sc_unsigned& v)
67112027Sjungma@eit.uni-kl.de{ return operator==((int64) u, v); }
67212027Sjungma@eit.uni-kl.de
67312027Sjungma@eit.uni-kl.debool
67412027Sjungma@eit.uni-kl.deoperator!=(const sc_unsigned& u, const sc_int_base& v)
67512027Sjungma@eit.uni-kl.de{ return operator!=(u, (int64) v); }
67612027Sjungma@eit.uni-kl.debool
67712027Sjungma@eit.uni-kl.deoperator!=(const sc_int_base& u, const sc_unsigned& v)
67812027Sjungma@eit.uni-kl.de{ return operator!=((int64) u, v); }
67912027Sjungma@eit.uni-kl.de
68012027Sjungma@eit.uni-kl.debool
68112027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, const sc_int_base& v)
68212027Sjungma@eit.uni-kl.de{ return operator<(u, (int64) v); }
68312027Sjungma@eit.uni-kl.debool
68412027Sjungma@eit.uni-kl.deoperator<(const sc_int_base& u, const sc_unsigned& v)
68512027Sjungma@eit.uni-kl.de{ return operator<((int64) u, v); }
68612027Sjungma@eit.uni-kl.de
68712027Sjungma@eit.uni-kl.debool
68812027Sjungma@eit.uni-kl.deoperator<=(const sc_unsigned& u, const sc_int_base& v)
68912027Sjungma@eit.uni-kl.de{ return operator<=(u, (int64) v); }
69012027Sjungma@eit.uni-kl.debool
69112027Sjungma@eit.uni-kl.deoperator<=(const sc_int_base& u, const sc_unsigned& v)
69212027Sjungma@eit.uni-kl.de{ return operator<=((int64) u, v); }
69312027Sjungma@eit.uni-kl.de
69412027Sjungma@eit.uni-kl.debool
69512027Sjungma@eit.uni-kl.deoperator>(const sc_unsigned& u, const sc_int_base& v)
69612027Sjungma@eit.uni-kl.de{ return operator>(u, (int64) v); }
69712027Sjungma@eit.uni-kl.debool
69812027Sjungma@eit.uni-kl.deoperator>(const sc_int_base& u, const sc_unsigned& v)
69912027Sjungma@eit.uni-kl.de{ return operator>((int64) u, v); }
70012027Sjungma@eit.uni-kl.de
70112027Sjungma@eit.uni-kl.debool
70212027Sjungma@eit.uni-kl.deoperator>=(const sc_unsigned& u, const sc_int_base& v)
70312027Sjungma@eit.uni-kl.de{ return operator>=(u, (int64) v); }
70412027Sjungma@eit.uni-kl.debool
70512027Sjungma@eit.uni-kl.deoperator>=(const sc_int_base& u, const sc_unsigned& v)
70612027Sjungma@eit.uni-kl.de{ return operator>=((int64) u, v); }
70712027Sjungma@eit.uni-kl.de
70812027Sjungma@eit.uni-kl.de
70912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
71012027Sjungma@eit.uni-kl.de//  SECTION: Interfacing with sc_uint_base
71112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
71212027Sjungma@eit.uni-kl.de
71312027Sjungma@eit.uni-kl.deconst sc_unsigned&
71412027Sjungma@eit.uni-kl.desc_unsigned::operator= (const sc_uint_base& v)
71512027Sjungma@eit.uni-kl.de{ return operator=((uint64) v); }
71612027Sjungma@eit.uni-kl.de
71712027Sjungma@eit.uni-kl.desc_unsigned
71812027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned& u, const sc_uint_base& v)
71912027Sjungma@eit.uni-kl.de{ return operator+(u, (uint64) v); }
72012027Sjungma@eit.uni-kl.desc_unsigned
72112027Sjungma@eit.uni-kl.deoperator+(const sc_uint_base& u, const sc_unsigned& v)
72212027Sjungma@eit.uni-kl.de{ return operator+((uint64) u, v); }
72312027Sjungma@eit.uni-kl.deconst sc_unsigned&
72412027Sjungma@eit.uni-kl.desc_unsigned::operator+=(const sc_uint_base& v)
72512027Sjungma@eit.uni-kl.de{ return operator+=((uint64) v); }
72612027Sjungma@eit.uni-kl.de
72712027Sjungma@eit.uni-kl.deconst sc_unsigned&
72812027Sjungma@eit.uni-kl.desc_unsigned::operator-=(const sc_uint_base& v)
72912027Sjungma@eit.uni-kl.de{ return operator-=((uint64) v); }
73012027Sjungma@eit.uni-kl.de
73112027Sjungma@eit.uni-kl.desc_unsigned
73212027Sjungma@eit.uni-kl.deoperator*(const sc_unsigned& u, const sc_uint_base& v)
73312027Sjungma@eit.uni-kl.de{ return operator*(u, (uint64) v); }
73412027Sjungma@eit.uni-kl.desc_unsigned
73512027Sjungma@eit.uni-kl.deoperator*(const sc_uint_base& u, const sc_unsigned& v)
73612027Sjungma@eit.uni-kl.de{ return operator*((uint64) u, v); }
73712027Sjungma@eit.uni-kl.deconst sc_unsigned&
73812027Sjungma@eit.uni-kl.desc_unsigned::operator*=(const sc_uint_base& v)
73912027Sjungma@eit.uni-kl.de{ return operator*=((uint64) v); }
74012027Sjungma@eit.uni-kl.de
74112027Sjungma@eit.uni-kl.desc_unsigned
74212027Sjungma@eit.uni-kl.deoperator/(const sc_unsigned& u, const sc_uint_base& v)
74312027Sjungma@eit.uni-kl.de{ return operator/(u, (uint64) v); }
74412027Sjungma@eit.uni-kl.desc_unsigned
74512027Sjungma@eit.uni-kl.deoperator/(const sc_uint_base& u, const sc_unsigned& v)
74612027Sjungma@eit.uni-kl.de{ return operator/((uint64) u, v); }
74712027Sjungma@eit.uni-kl.deconst sc_unsigned&
74812027Sjungma@eit.uni-kl.desc_unsigned::operator/=(const sc_uint_base& v)
74912027Sjungma@eit.uni-kl.de{ return operator/=((uint64) v); }
75012027Sjungma@eit.uni-kl.de
75112027Sjungma@eit.uni-kl.desc_unsigned
75212027Sjungma@eit.uni-kl.deoperator%(const sc_unsigned& u, const sc_uint_base& v)
75312027Sjungma@eit.uni-kl.de{ return operator%(u, (uint64) v); }
75412027Sjungma@eit.uni-kl.desc_unsigned
75512027Sjungma@eit.uni-kl.deoperator%(const sc_uint_base& u, const sc_unsigned& v)
75612027Sjungma@eit.uni-kl.de{ return operator%((uint64) u, v); }
75712027Sjungma@eit.uni-kl.deconst sc_unsigned&
75812027Sjungma@eit.uni-kl.desc_unsigned::operator%=(const sc_uint_base& v)
75912027Sjungma@eit.uni-kl.de{ return operator%=((uint64) v); }
76012027Sjungma@eit.uni-kl.de
76112027Sjungma@eit.uni-kl.desc_unsigned
76212027Sjungma@eit.uni-kl.deoperator&(const sc_unsigned& u, const sc_uint_base& v)
76312027Sjungma@eit.uni-kl.de{ return operator&(u, (uint64) v); }
76412027Sjungma@eit.uni-kl.desc_unsigned
76512027Sjungma@eit.uni-kl.deoperator&(const sc_uint_base& u, const sc_unsigned& v)
76612027Sjungma@eit.uni-kl.de{ return operator&((uint64) u, v); }
76712027Sjungma@eit.uni-kl.deconst sc_unsigned&
76812027Sjungma@eit.uni-kl.desc_unsigned::operator&=(const sc_uint_base& v)
76912027Sjungma@eit.uni-kl.de{ return operator&=((uint64) v); }
77012027Sjungma@eit.uni-kl.de
77112027Sjungma@eit.uni-kl.desc_unsigned
77212027Sjungma@eit.uni-kl.deoperator|(const sc_unsigned& u, const sc_uint_base& v)
77312027Sjungma@eit.uni-kl.de{ return operator|(u, (uint64) v); }
77412027Sjungma@eit.uni-kl.desc_unsigned
77512027Sjungma@eit.uni-kl.deoperator|(const sc_uint_base& u, const sc_unsigned& v)
77612027Sjungma@eit.uni-kl.de{ return operator|((uint64) u, v); }
77712027Sjungma@eit.uni-kl.deconst sc_unsigned&
77812027Sjungma@eit.uni-kl.desc_unsigned::operator|=(const sc_uint_base& v)
77912027Sjungma@eit.uni-kl.de{ return operator|=((uint64) v); }
78012027Sjungma@eit.uni-kl.de
78112027Sjungma@eit.uni-kl.desc_unsigned
78212027Sjungma@eit.uni-kl.deoperator^(const sc_unsigned& u, const sc_uint_base& v)
78312027Sjungma@eit.uni-kl.de{ return operator^(u, (uint64) v); }
78412027Sjungma@eit.uni-kl.desc_unsigned
78512027Sjungma@eit.uni-kl.deoperator^(const sc_uint_base& u, const sc_unsigned& v)
78612027Sjungma@eit.uni-kl.de{ return operator^((uint64) u, v); }
78712027Sjungma@eit.uni-kl.deconst sc_unsigned&
78812027Sjungma@eit.uni-kl.desc_unsigned::operator^=(const sc_uint_base& v)
78912027Sjungma@eit.uni-kl.de{ return operator^=((uint64) v); }
79012027Sjungma@eit.uni-kl.de
79112027Sjungma@eit.uni-kl.desc_unsigned
79212027Sjungma@eit.uni-kl.deoperator<<(const sc_unsigned& u, const sc_uint_base& v)
79312027Sjungma@eit.uni-kl.de{ return operator<<(u, (uint64) v); }
79412027Sjungma@eit.uni-kl.deconst sc_unsigned&
79512027Sjungma@eit.uni-kl.desc_unsigned::operator<<=(const sc_uint_base& v)
79612027Sjungma@eit.uni-kl.de{ return operator<<=((uint64) v); }
79712027Sjungma@eit.uni-kl.de
79812027Sjungma@eit.uni-kl.desc_unsigned
79912027Sjungma@eit.uni-kl.deoperator>>(const sc_unsigned&    u, const sc_uint_base&  v)
80012027Sjungma@eit.uni-kl.de{ return operator>>(u, (uint64) v); }
80112027Sjungma@eit.uni-kl.deconst sc_unsigned&
80212027Sjungma@eit.uni-kl.desc_unsigned::operator>>=(const sc_uint_base&  v)
80312027Sjungma@eit.uni-kl.de{ return operator>>=((uint64) v); }
80412027Sjungma@eit.uni-kl.de
80512027Sjungma@eit.uni-kl.debool
80612027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, const sc_uint_base& v)
80712027Sjungma@eit.uni-kl.de{ return operator==(u, (uint64) v); }
80812027Sjungma@eit.uni-kl.debool
80912027Sjungma@eit.uni-kl.deoperator==(const sc_uint_base& u, const sc_unsigned& v)
81012027Sjungma@eit.uni-kl.de{ return operator==((uint64) u, v); }
81112027Sjungma@eit.uni-kl.de
81212027Sjungma@eit.uni-kl.debool
81312027Sjungma@eit.uni-kl.deoperator!=(const sc_unsigned& u, const sc_uint_base& v)
81412027Sjungma@eit.uni-kl.de{ return operator!=(u, (uint64) v); }
81512027Sjungma@eit.uni-kl.debool
81612027Sjungma@eit.uni-kl.deoperator!=(const sc_uint_base& u, const sc_unsigned& v)
81712027Sjungma@eit.uni-kl.de{ return operator!=((uint64) u, v); }
81812027Sjungma@eit.uni-kl.de
81912027Sjungma@eit.uni-kl.debool
82012027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, const sc_uint_base& v)
82112027Sjungma@eit.uni-kl.de{ return operator<(u, (uint64) v); }
82212027Sjungma@eit.uni-kl.debool
82312027Sjungma@eit.uni-kl.deoperator<(const sc_uint_base& u, const sc_unsigned& v)
82412027Sjungma@eit.uni-kl.de{ return operator<((uint64) u, v); }
82512027Sjungma@eit.uni-kl.de
82612027Sjungma@eit.uni-kl.debool
82712027Sjungma@eit.uni-kl.deoperator<=(const sc_unsigned& u, const sc_uint_base& v)
82812027Sjungma@eit.uni-kl.de{ return operator<=(u, (uint64) v); }
82912027Sjungma@eit.uni-kl.debool
83012027Sjungma@eit.uni-kl.deoperator<=(const sc_uint_base& u, const sc_unsigned& v)
83112027Sjungma@eit.uni-kl.de{ return operator<=((uint64) u, v); }
83212027Sjungma@eit.uni-kl.de
83312027Sjungma@eit.uni-kl.debool
83412027Sjungma@eit.uni-kl.deoperator>(const sc_unsigned& u, const sc_uint_base& v)
83512027Sjungma@eit.uni-kl.de{ return operator>(u, (uint64) v); }
83612027Sjungma@eit.uni-kl.debool
83712027Sjungma@eit.uni-kl.deoperator>(const sc_uint_base& u, const sc_unsigned& v)
83812027Sjungma@eit.uni-kl.de{ return operator>((uint64) u, v); }
83912027Sjungma@eit.uni-kl.de
84012027Sjungma@eit.uni-kl.debool
84112027Sjungma@eit.uni-kl.deoperator>=(const sc_unsigned& u, const sc_uint_base& v)
84212027Sjungma@eit.uni-kl.de{ return operator>=(u, (uint64) v); }
84312027Sjungma@eit.uni-kl.debool
84412027Sjungma@eit.uni-kl.deoperator>=(const sc_uint_base& u, const sc_unsigned& v)
84512027Sjungma@eit.uni-kl.de{ return operator>=((uint64) u, v); }
84612027Sjungma@eit.uni-kl.de
84712027Sjungma@eit.uni-kl.de
84812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
84912027Sjungma@eit.uni-kl.de//  SECTION: Input and output operators
85012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
85112027Sjungma@eit.uni-kl.de
85212027Sjungma@eit.uni-kl.de// The operators in this section are included from sc_nbcommon.cpp.
85312027Sjungma@eit.uni-kl.de
85412027Sjungma@eit.uni-kl.de
85512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
85612027Sjungma@eit.uni-kl.de//  SECTION: Operator macros.
85712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
85812027Sjungma@eit.uni-kl.de
85912027Sjungma@eit.uni-kl.de#define CONVERT_LONG(u) \
86012027Sjungma@eit.uni-kl.desmall_type u ## s = get_sign(u);                   \
86112027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_ULONG];                    \
86212027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
86312027Sjungma@eit.uni-kl.de
86412027Sjungma@eit.uni-kl.de#define CONVERT_LONG_2(u) \
86512027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_ULONG];                     \
86612027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
86712027Sjungma@eit.uni-kl.de
86812027Sjungma@eit.uni-kl.de#define CONVERT_INT(u) \
86912027Sjungma@eit.uni-kl.desmall_type u ## s = get_sign(u);                        \
87012027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_UINT];                    \
87112027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
87212027Sjungma@eit.uni-kl.de
87312027Sjungma@eit.uni-kl.de#define CONVERT_INT_2(u) \
87412027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_UINT];                     \
87512027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
87612027Sjungma@eit.uni-kl.de
87712027Sjungma@eit.uni-kl.de#define CONVERT_INT64(u) \
87812027Sjungma@eit.uni-kl.desmall_type u ## s = get_sign(u);                   \
87912027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_UINT64];              \
88012027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
88112027Sjungma@eit.uni-kl.de
88212027Sjungma@eit.uni-kl.de#define CONVERT_INT64_2(u) \
88312027Sjungma@eit.uni-kl.desc_digit u ## d[DIGITS_PER_UINT64];              \
88412027Sjungma@eit.uni-kl.defrom_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
88512027Sjungma@eit.uni-kl.de
88612027Sjungma@eit.uni-kl.de
88712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
88812027Sjungma@eit.uni-kl.de//  SECTION: PLUS operators: +, +=, ++
88912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
89012027Sjungma@eit.uni-kl.de
89112027Sjungma@eit.uni-kl.de// Cases to consider when computing u + v:
89212027Sjungma@eit.uni-kl.de// 1. 0 + v = v
89312027Sjungma@eit.uni-kl.de// 2. u + 0 = u
89412027Sjungma@eit.uni-kl.de// 3. if sgn(u) == sgn(v)
89512027Sjungma@eit.uni-kl.de//    3.1 u + v = +(u + v) = sgn(u) * (u + v)
89612027Sjungma@eit.uni-kl.de//    3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v)
89712027Sjungma@eit.uni-kl.de// 4. if sgn(u) != sgn(v)
89812027Sjungma@eit.uni-kl.de//    4.1 u + (-v) = u - v = sgn(u) * (u - v)
89912027Sjungma@eit.uni-kl.de//    4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v)
90012027Sjungma@eit.uni-kl.de//
90112027Sjungma@eit.uni-kl.de// Specialization of above cases for computing ++u or u++:
90212027Sjungma@eit.uni-kl.de// 1. 0 + 1 = 1
90312027Sjungma@eit.uni-kl.de// 3. u + 1 = u + 1 = sgn(u) * (u + 1)
90412027Sjungma@eit.uni-kl.de// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1)
90512027Sjungma@eit.uni-kl.de
90612027Sjungma@eit.uni-kl.desc_unsigned
90712027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned& u, const sc_unsigned& v)
90812027Sjungma@eit.uni-kl.de{
90912027Sjungma@eit.uni-kl.de
91012027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO) // case 1
91112027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
91212027Sjungma@eit.uni-kl.de
91312027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO) // case 2
91412027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
91512027Sjungma@eit.uni-kl.de
91612027Sjungma@eit.uni-kl.de  // cases 3 and 4
91712027Sjungma@eit.uni-kl.de  return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
91812027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
91912027Sjungma@eit.uni-kl.de
92012027Sjungma@eit.uni-kl.de}
92112027Sjungma@eit.uni-kl.de
92212027Sjungma@eit.uni-kl.de
92312027Sjungma@eit.uni-kl.desc_unsigned
92412027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned &u, uint64 v)
92512027Sjungma@eit.uni-kl.de{
92612027Sjungma@eit.uni-kl.de
92712027Sjungma@eit.uni-kl.de  if (v == 0)  // case 2
92812027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
92912027Sjungma@eit.uni-kl.de
93012027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
93112027Sjungma@eit.uni-kl.de
93212027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)  // case 1
93312027Sjungma@eit.uni-kl.de    return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
93412027Sjungma@eit.uni-kl.de
93512027Sjungma@eit.uni-kl.de  // cases 3 and 4
93612027Sjungma@eit.uni-kl.de  return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
93712027Sjungma@eit.uni-kl.de                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
93812027Sjungma@eit.uni-kl.de
93912027Sjungma@eit.uni-kl.de}
94012027Sjungma@eit.uni-kl.de
94112027Sjungma@eit.uni-kl.de
94212027Sjungma@eit.uni-kl.desc_unsigned
94312027Sjungma@eit.uni-kl.deoperator+(uint64 u, const sc_unsigned &v)
94412027Sjungma@eit.uni-kl.de{
94512027Sjungma@eit.uni-kl.de
94612027Sjungma@eit.uni-kl.de  if (u == 0) // case 1
94712027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
94812027Sjungma@eit.uni-kl.de
94912027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
95012027Sjungma@eit.uni-kl.de
95112027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 2
95212027Sjungma@eit.uni-kl.de    return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
95312027Sjungma@eit.uni-kl.de
95412027Sjungma@eit.uni-kl.de  // cases 3 and 4
95512027Sjungma@eit.uni-kl.de
95612027Sjungma@eit.uni-kl.de  return add_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
95712027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
95812027Sjungma@eit.uni-kl.de
95912027Sjungma@eit.uni-kl.de}
96012027Sjungma@eit.uni-kl.de
96112027Sjungma@eit.uni-kl.de
96212027Sjungma@eit.uni-kl.desc_unsigned
96312027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned &u, unsigned long v)
96412027Sjungma@eit.uni-kl.de{
96512027Sjungma@eit.uni-kl.de
96612027Sjungma@eit.uni-kl.de  if (v == 0) // case 2
96712027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
96812027Sjungma@eit.uni-kl.de
96912027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
97012027Sjungma@eit.uni-kl.de
97112027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)  // case 1
97212027Sjungma@eit.uni-kl.de    return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
97312027Sjungma@eit.uni-kl.de
97412027Sjungma@eit.uni-kl.de  // cases 3 and 4
97512027Sjungma@eit.uni-kl.de  return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
97612027Sjungma@eit.uni-kl.de                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
97712027Sjungma@eit.uni-kl.de
97812027Sjungma@eit.uni-kl.de}
97912027Sjungma@eit.uni-kl.de
98012027Sjungma@eit.uni-kl.de
98112027Sjungma@eit.uni-kl.desc_unsigned
98212027Sjungma@eit.uni-kl.deoperator+(unsigned long u, const sc_unsigned &v)
98312027Sjungma@eit.uni-kl.de{
98412027Sjungma@eit.uni-kl.de
98512027Sjungma@eit.uni-kl.de  if (u == 0) // case 1
98612027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
98712027Sjungma@eit.uni-kl.de
98812027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
98912027Sjungma@eit.uni-kl.de
99012027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 2
99112027Sjungma@eit.uni-kl.de    return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
99212027Sjungma@eit.uni-kl.de
99312027Sjungma@eit.uni-kl.de  // cases 3 and 4
99412027Sjungma@eit.uni-kl.de  return add_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
99512027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
99612027Sjungma@eit.uni-kl.de
99712027Sjungma@eit.uni-kl.de}
99812027Sjungma@eit.uni-kl.de
99912027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
100012027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
100112027Sjungma@eit.uni-kl.de
100212027Sjungma@eit.uni-kl.de
100312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
100412027Sjungma@eit.uni-kl.de//  SECTION: MINUS operators: -, -=, --
100512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
100612027Sjungma@eit.uni-kl.de
100712027Sjungma@eit.uni-kl.de// Cases to consider when computing u + v:
100812027Sjungma@eit.uni-kl.de// 1. u - 0 = u
100912027Sjungma@eit.uni-kl.de// 2. 0 - v = -v
101012027Sjungma@eit.uni-kl.de// 3. if sgn(u) != sgn(v)
101112027Sjungma@eit.uni-kl.de//    3.1 u - (-v) = u + v = sgn(u) * (u + v)
101212027Sjungma@eit.uni-kl.de//    3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v)
101312027Sjungma@eit.uni-kl.de// 4. if sgn(u) == sgn(v)
101412027Sjungma@eit.uni-kl.de//    4.1 u - v = +(u - v) = sgn(u) * (u - v)
101512027Sjungma@eit.uni-kl.de//    4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v)
101612027Sjungma@eit.uni-kl.de//
101712027Sjungma@eit.uni-kl.de// Specialization of above cases for computing --u or u--:
101812027Sjungma@eit.uni-kl.de// 1. 0 - 1 = -1
101912027Sjungma@eit.uni-kl.de// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1)
102012027Sjungma@eit.uni-kl.de// 4. u - 1 = u - 1 = sgn(u) * (u - 1)
102112027Sjungma@eit.uni-kl.de
102212027Sjungma@eit.uni-kl.de// The operators in this section are included from sc_nbcommon.cpp.
102312027Sjungma@eit.uni-kl.de
102412027Sjungma@eit.uni-kl.de
102512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
102612027Sjungma@eit.uni-kl.de//  SECTION: MULTIPLICATION operators: *, *=
102712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
102812027Sjungma@eit.uni-kl.de
102912027Sjungma@eit.uni-kl.de// Cases to consider when computing u * v:
103012027Sjungma@eit.uni-kl.de// 1. u * 0 = 0 * v = 0
103112027Sjungma@eit.uni-kl.de// 2. 1 * v = v and -1 * v = -v
103212027Sjungma@eit.uni-kl.de// 3. u * 1 = u and u * -1 = -u
103312027Sjungma@eit.uni-kl.de// 4. u * v = u * v
103412027Sjungma@eit.uni-kl.de
103512027Sjungma@eit.uni-kl.desc_unsigned
103612027Sjungma@eit.uni-kl.deoperator*(const sc_unsigned& u, const sc_unsigned& v)
103712027Sjungma@eit.uni-kl.de{
103812027Sjungma@eit.uni-kl.de
103912027Sjungma@eit.uni-kl.de  small_type s = mul_signs(u.sgn, v.sgn);
104012027Sjungma@eit.uni-kl.de
104112027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) // case 1
104212027Sjungma@eit.uni-kl.de    return sc_unsigned();
104312027Sjungma@eit.uni-kl.de
104412027Sjungma@eit.uni-kl.de  // cases 2-4
104512027Sjungma@eit.uni-kl.de  return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
104612027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
104712027Sjungma@eit.uni-kl.de
104812027Sjungma@eit.uni-kl.de}
104912027Sjungma@eit.uni-kl.de
105012027Sjungma@eit.uni-kl.de
105112027Sjungma@eit.uni-kl.desc_unsigned
105212027Sjungma@eit.uni-kl.deoperator*(const sc_unsigned& u, uint64 v)
105312027Sjungma@eit.uni-kl.de{
105412027Sjungma@eit.uni-kl.de
105512027Sjungma@eit.uni-kl.de  small_type s = mul_signs(u.sgn, get_sign(v));
105612027Sjungma@eit.uni-kl.de
105712027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) // case 1
105812027Sjungma@eit.uni-kl.de    return sc_unsigned();
105912027Sjungma@eit.uni-kl.de
106012027Sjungma@eit.uni-kl.de  CONVERT_INT64_2(v);
106112027Sjungma@eit.uni-kl.de
106212027Sjungma@eit.uni-kl.de  // cases 2-4
106312027Sjungma@eit.uni-kl.de  return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
106412027Sjungma@eit.uni-kl.de                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
106512027Sjungma@eit.uni-kl.de
106612027Sjungma@eit.uni-kl.de}
106712027Sjungma@eit.uni-kl.de
106812027Sjungma@eit.uni-kl.de
106912027Sjungma@eit.uni-kl.desc_unsigned
107012027Sjungma@eit.uni-kl.deoperator*(uint64 u, const sc_unsigned& v)
107112027Sjungma@eit.uni-kl.de{
107212027Sjungma@eit.uni-kl.de
107312027Sjungma@eit.uni-kl.de  small_type s = mul_signs(v.sgn, get_sign(u));
107412027Sjungma@eit.uni-kl.de
107512027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) // case 1
107612027Sjungma@eit.uni-kl.de    return sc_unsigned();
107712027Sjungma@eit.uni-kl.de
107812027Sjungma@eit.uni-kl.de  CONVERT_INT64_2(u);
107912027Sjungma@eit.uni-kl.de
108012027Sjungma@eit.uni-kl.de  // cases 2-4
108112027Sjungma@eit.uni-kl.de  return mul_unsigned_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
108212027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
108312027Sjungma@eit.uni-kl.de
108412027Sjungma@eit.uni-kl.de}
108512027Sjungma@eit.uni-kl.de
108612027Sjungma@eit.uni-kl.de
108712027Sjungma@eit.uni-kl.desc_unsigned
108812027Sjungma@eit.uni-kl.deoperator*(const sc_unsigned& u, unsigned long v)
108912027Sjungma@eit.uni-kl.de{
109012027Sjungma@eit.uni-kl.de
109112027Sjungma@eit.uni-kl.de  small_type s = mul_signs(u.sgn, get_sign(v));
109212027Sjungma@eit.uni-kl.de
109312027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) // case 1
109412027Sjungma@eit.uni-kl.de    return sc_unsigned();
109512027Sjungma@eit.uni-kl.de
109612027Sjungma@eit.uni-kl.de  CONVERT_LONG_2(v);
109712027Sjungma@eit.uni-kl.de
109812027Sjungma@eit.uni-kl.de  // else cases 2-4
109912027Sjungma@eit.uni-kl.de  return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
110012027Sjungma@eit.uni-kl.de                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
110112027Sjungma@eit.uni-kl.de
110212027Sjungma@eit.uni-kl.de}
110312027Sjungma@eit.uni-kl.de
110412027Sjungma@eit.uni-kl.desc_unsigned
110512027Sjungma@eit.uni-kl.deoperator*(unsigned long u, const sc_unsigned& v)
110612027Sjungma@eit.uni-kl.de{
110712027Sjungma@eit.uni-kl.de
110812027Sjungma@eit.uni-kl.de  small_type s = mul_signs(v.sgn, get_sign(u));
110912027Sjungma@eit.uni-kl.de
111012027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) // case 1
111112027Sjungma@eit.uni-kl.de    return sc_unsigned();
111212027Sjungma@eit.uni-kl.de
111312027Sjungma@eit.uni-kl.de  CONVERT_LONG_2(u);
111412027Sjungma@eit.uni-kl.de
111512027Sjungma@eit.uni-kl.de  // cases 2-4
111612027Sjungma@eit.uni-kl.de  return mul_unsigned_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
111712027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
111812027Sjungma@eit.uni-kl.de
111912027Sjungma@eit.uni-kl.de}
112012027Sjungma@eit.uni-kl.de
112112027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
112212027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
112312027Sjungma@eit.uni-kl.de
112412027Sjungma@eit.uni-kl.de
112512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
112612027Sjungma@eit.uni-kl.de//  SECTION: DIVISION operators: /, /=
112712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
112812027Sjungma@eit.uni-kl.de
112912027Sjungma@eit.uni-kl.de// Cases to consider when finding the quotient q = floor(u/v):
113012027Sjungma@eit.uni-kl.de// Note that u = q * v + r for r < q.
113112027Sjungma@eit.uni-kl.de// 1. 0 / 0 or u / 0 => error
113212027Sjungma@eit.uni-kl.de// 2. 0 / v => 0 = 0 * v + 0
113312027Sjungma@eit.uni-kl.de// 3. u / v && u = v => u = 1 * u + 0  - u or v can be 1 or -1
113412027Sjungma@eit.uni-kl.de// 4. u / v && u < v => u = 0 * v + u  - u can be 1 or -1
113512027Sjungma@eit.uni-kl.de// 5. u / v && u > v => u = q * v + r  - v can be 1 or -1
113612027Sjungma@eit.uni-kl.de
113712027Sjungma@eit.uni-kl.desc_unsigned
113812027Sjungma@eit.uni-kl.deoperator/(const sc_unsigned& u, const sc_unsigned& v)
113912027Sjungma@eit.uni-kl.de{
114012027Sjungma@eit.uni-kl.de
114112027Sjungma@eit.uni-kl.de  small_type s = mul_signs(u.sgn, v.sgn);
114212027Sjungma@eit.uni-kl.de
114312027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) {
114412027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn); // case 1
114512027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
114612027Sjungma@eit.uni-kl.de  }
114712027Sjungma@eit.uni-kl.de
114812027Sjungma@eit.uni-kl.de  // other cases
114912027Sjungma@eit.uni-kl.de  return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
115012027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
115112027Sjungma@eit.uni-kl.de
115212027Sjungma@eit.uni-kl.de}
115312027Sjungma@eit.uni-kl.de
115412027Sjungma@eit.uni-kl.de
115512027Sjungma@eit.uni-kl.desc_unsigned
115612027Sjungma@eit.uni-kl.deoperator/(const sc_unsigned& u, uint64 v)
115712027Sjungma@eit.uni-kl.de{
115812027Sjungma@eit.uni-kl.de
115912027Sjungma@eit.uni-kl.de  small_type s = mul_signs(u.sgn, get_sign(v));
116012027Sjungma@eit.uni-kl.de
116112027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) {
116212027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
116312027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
116412027Sjungma@eit.uni-kl.de  }
116512027Sjungma@eit.uni-kl.de
116612027Sjungma@eit.uni-kl.de  CONVERT_INT64_2(v);
116712027Sjungma@eit.uni-kl.de
116812027Sjungma@eit.uni-kl.de  // other cases
116912027Sjungma@eit.uni-kl.de  return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
117012027Sjungma@eit.uni-kl.de                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
117112027Sjungma@eit.uni-kl.de
117212027Sjungma@eit.uni-kl.de}
117312027Sjungma@eit.uni-kl.de
117412027Sjungma@eit.uni-kl.de
117512027Sjungma@eit.uni-kl.desc_unsigned
117612027Sjungma@eit.uni-kl.deoperator/(uint64 u, const sc_unsigned& v)
117712027Sjungma@eit.uni-kl.de{
117812027Sjungma@eit.uni-kl.de
117912027Sjungma@eit.uni-kl.de  small_type s = mul_signs(v.sgn, get_sign(u));
118012027Sjungma@eit.uni-kl.de
118112027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) {
118212027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn);  // case 1
118312027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
118412027Sjungma@eit.uni-kl.de
118512027Sjungma@eit.uni-kl.de  }
118612027Sjungma@eit.uni-kl.de
118712027Sjungma@eit.uni-kl.de  CONVERT_INT64_2(u);
118812027Sjungma@eit.uni-kl.de
118912027Sjungma@eit.uni-kl.de  // other cases
119012027Sjungma@eit.uni-kl.de  return div_unsigned_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
119112027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
119212027Sjungma@eit.uni-kl.de
119312027Sjungma@eit.uni-kl.de}
119412027Sjungma@eit.uni-kl.de
119512027Sjungma@eit.uni-kl.de
119612027Sjungma@eit.uni-kl.desc_unsigned
119712027Sjungma@eit.uni-kl.deoperator/(const sc_unsigned& u, unsigned long v)
119812027Sjungma@eit.uni-kl.de{
119912027Sjungma@eit.uni-kl.de
120012027Sjungma@eit.uni-kl.de  small_type s = mul_signs(u.sgn, get_sign(v));
120112027Sjungma@eit.uni-kl.de
120212027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) {
120312027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
120412027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
120512027Sjungma@eit.uni-kl.de  }
120612027Sjungma@eit.uni-kl.de
120712027Sjungma@eit.uni-kl.de  CONVERT_LONG_2(v);
120812027Sjungma@eit.uni-kl.de
120912027Sjungma@eit.uni-kl.de  // other cases
121012027Sjungma@eit.uni-kl.de  return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
121112027Sjungma@eit.uni-kl.de                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
121212027Sjungma@eit.uni-kl.de
121312027Sjungma@eit.uni-kl.de}
121412027Sjungma@eit.uni-kl.de
121512027Sjungma@eit.uni-kl.de
121612027Sjungma@eit.uni-kl.desc_unsigned
121712027Sjungma@eit.uni-kl.deoperator/(unsigned long u, const sc_unsigned& v)
121812027Sjungma@eit.uni-kl.de{
121912027Sjungma@eit.uni-kl.de
122012027Sjungma@eit.uni-kl.de  small_type s = mul_signs(v.sgn, get_sign(u));
122112027Sjungma@eit.uni-kl.de
122212027Sjungma@eit.uni-kl.de  if (s == SC_ZERO) {
122312027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn);  // case 1
122412027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
122512027Sjungma@eit.uni-kl.de
122612027Sjungma@eit.uni-kl.de  }
122712027Sjungma@eit.uni-kl.de
122812027Sjungma@eit.uni-kl.de  CONVERT_LONG_2(u);
122912027Sjungma@eit.uni-kl.de
123012027Sjungma@eit.uni-kl.de  // other cases
123112027Sjungma@eit.uni-kl.de  return div_unsigned_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
123212027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
123312027Sjungma@eit.uni-kl.de
123412027Sjungma@eit.uni-kl.de}
123512027Sjungma@eit.uni-kl.de
123612027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
123712027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
123812027Sjungma@eit.uni-kl.de
123912027Sjungma@eit.uni-kl.de
124012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
124112027Sjungma@eit.uni-kl.de//  SECTION: MOD operators: %, %=.
124212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
124312027Sjungma@eit.uni-kl.de
124412027Sjungma@eit.uni-kl.de// Cases to consider when finding the remainder r = u % v:
124512027Sjungma@eit.uni-kl.de// Note that u = q * v + r for r < q.
124612027Sjungma@eit.uni-kl.de// 1. 0 % 0 or u % 0 => error
124712027Sjungma@eit.uni-kl.de// 2. 0 % v => 0 = 0 * v + 0
124812027Sjungma@eit.uni-kl.de// 3. u % v && u = v => u = 1 * u + 0  - u or v can be 1 or -1
124912027Sjungma@eit.uni-kl.de// 4. u % v && u < v => u = 0 * v + u  - u can be 1 or -1
125012027Sjungma@eit.uni-kl.de// 5. u % v && u > v => u = q * v + r  - v can be 1 or -1
125112027Sjungma@eit.uni-kl.de
125212027Sjungma@eit.uni-kl.desc_unsigned
125312027Sjungma@eit.uni-kl.deoperator%(const sc_unsigned& u, const sc_unsigned& v)
125412027Sjungma@eit.uni-kl.de{
125512027Sjungma@eit.uni-kl.de
125612027Sjungma@eit.uni-kl.de  if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
125712027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn);  // case 1
125812027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
125912027Sjungma@eit.uni-kl.de  }
126012027Sjungma@eit.uni-kl.de
126112027Sjungma@eit.uni-kl.de  // other cases
126212027Sjungma@eit.uni-kl.de  return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
126312027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
126412027Sjungma@eit.uni-kl.de}
126512027Sjungma@eit.uni-kl.de
126612027Sjungma@eit.uni-kl.de
126712027Sjungma@eit.uni-kl.desc_unsigned
126812027Sjungma@eit.uni-kl.deoperator%(const sc_unsigned& u, uint64 v)
126912027Sjungma@eit.uni-kl.de{
127012027Sjungma@eit.uni-kl.de
127112027Sjungma@eit.uni-kl.de  if ((u.sgn == SC_ZERO) || (v == 0)) {
127212027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
127312027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
127412027Sjungma@eit.uni-kl.de  }
127512027Sjungma@eit.uni-kl.de
127612027Sjungma@eit.uni-kl.de  CONVERT_INT64_2(v);
127712027Sjungma@eit.uni-kl.de
127812027Sjungma@eit.uni-kl.de  // other cases
127912027Sjungma@eit.uni-kl.de  return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
128012027Sjungma@eit.uni-kl.de                             BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
128112027Sjungma@eit.uni-kl.de
128212027Sjungma@eit.uni-kl.de}
128312027Sjungma@eit.uni-kl.de
128412027Sjungma@eit.uni-kl.de
128512027Sjungma@eit.uni-kl.desc_unsigned
128612027Sjungma@eit.uni-kl.deoperator%(uint64 u, const sc_unsigned& v)
128712027Sjungma@eit.uni-kl.de{
128812027Sjungma@eit.uni-kl.de
128912027Sjungma@eit.uni-kl.de  if ((u == 0) || (v.sgn == SC_ZERO)) {
129012027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn);  // case 1
129112027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
129212027Sjungma@eit.uni-kl.de  }
129312027Sjungma@eit.uni-kl.de
129412027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
129512027Sjungma@eit.uni-kl.de
129612027Sjungma@eit.uni-kl.de  // other cases
129712027Sjungma@eit.uni-kl.de  return mod_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
129812027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
129912027Sjungma@eit.uni-kl.de
130012027Sjungma@eit.uni-kl.de}
130112027Sjungma@eit.uni-kl.de
130212027Sjungma@eit.uni-kl.de
130312027Sjungma@eit.uni-kl.desc_unsigned
130412027Sjungma@eit.uni-kl.deoperator%(const sc_unsigned& u, unsigned long v)
130512027Sjungma@eit.uni-kl.de{
130612027Sjungma@eit.uni-kl.de
130712027Sjungma@eit.uni-kl.de  if ((u.sgn == SC_ZERO) || (v == 0)) {
130812027Sjungma@eit.uni-kl.de    div_by_zero(v);  // case 1
130912027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
131012027Sjungma@eit.uni-kl.de  }
131112027Sjungma@eit.uni-kl.de
131212027Sjungma@eit.uni-kl.de  CONVERT_LONG_2(v);
131312027Sjungma@eit.uni-kl.de
131412027Sjungma@eit.uni-kl.de  // other cases
131512027Sjungma@eit.uni-kl.de  return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
131612027Sjungma@eit.uni-kl.de                             BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
131712027Sjungma@eit.uni-kl.de
131812027Sjungma@eit.uni-kl.de}
131912027Sjungma@eit.uni-kl.de
132012027Sjungma@eit.uni-kl.de
132112027Sjungma@eit.uni-kl.desc_unsigned
132212027Sjungma@eit.uni-kl.deoperator%(unsigned long u, const sc_unsigned& v)
132312027Sjungma@eit.uni-kl.de{
132412027Sjungma@eit.uni-kl.de
132512027Sjungma@eit.uni-kl.de  if ((u == 0) || (v.sgn == SC_ZERO)) {
132612027Sjungma@eit.uni-kl.de    div_by_zero(v.sgn);  // case 1
132712027Sjungma@eit.uni-kl.de    return sc_unsigned();  // case 2
132812027Sjungma@eit.uni-kl.de  }
132912027Sjungma@eit.uni-kl.de
133012027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
133112027Sjungma@eit.uni-kl.de
133212027Sjungma@eit.uni-kl.de  // other cases
133312027Sjungma@eit.uni-kl.de  return mod_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
133412027Sjungma@eit.uni-kl.de                             v.nbits, v.ndigits, v.digit);
133512027Sjungma@eit.uni-kl.de
133612027Sjungma@eit.uni-kl.de}
133712027Sjungma@eit.uni-kl.de
133812027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
133912027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
134012027Sjungma@eit.uni-kl.de
134112027Sjungma@eit.uni-kl.de
134212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
134312027Sjungma@eit.uni-kl.de//  SECTION: Bitwise AND operators: &, &=
134412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
134512027Sjungma@eit.uni-kl.de
134612027Sjungma@eit.uni-kl.de// Cases to consider when computing u & v:
134712027Sjungma@eit.uni-kl.de// 1. u & 0 = 0 & v = 0
134812027Sjungma@eit.uni-kl.de// 2. u & v => sgn = +
134912027Sjungma@eit.uni-kl.de// 3. (-u) & (-v) => sgn = -
135012027Sjungma@eit.uni-kl.de// 4. u & (-v) => sgn = +
135112027Sjungma@eit.uni-kl.de// 5. (-u) & v => sgn = +
135212027Sjungma@eit.uni-kl.de
135312027Sjungma@eit.uni-kl.desc_unsigned
135412027Sjungma@eit.uni-kl.deoperator&(const sc_unsigned& u, const sc_unsigned& v)
135512027Sjungma@eit.uni-kl.de{
135612027Sjungma@eit.uni-kl.de
135712027Sjungma@eit.uni-kl.de  if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
135812027Sjungma@eit.uni-kl.de    return sc_unsigned();
135912027Sjungma@eit.uni-kl.de
136012027Sjungma@eit.uni-kl.de  // other cases
136112027Sjungma@eit.uni-kl.de  return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
136212027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
136312027Sjungma@eit.uni-kl.de
136412027Sjungma@eit.uni-kl.de}
136512027Sjungma@eit.uni-kl.de
136612027Sjungma@eit.uni-kl.de
136712027Sjungma@eit.uni-kl.desc_unsigned
136812027Sjungma@eit.uni-kl.deoperator&(const sc_unsigned& u, uint64 v)
136912027Sjungma@eit.uni-kl.de{
137012027Sjungma@eit.uni-kl.de
137112027Sjungma@eit.uni-kl.de  if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
137212027Sjungma@eit.uni-kl.de    return sc_unsigned();
137312027Sjungma@eit.uni-kl.de
137412027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
137512027Sjungma@eit.uni-kl.de
137612027Sjungma@eit.uni-kl.de  // other cases
137712027Sjungma@eit.uni-kl.de  return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
137812027Sjungma@eit.uni-kl.de                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
137912027Sjungma@eit.uni-kl.de
138012027Sjungma@eit.uni-kl.de}
138112027Sjungma@eit.uni-kl.de
138212027Sjungma@eit.uni-kl.de
138312027Sjungma@eit.uni-kl.desc_unsigned
138412027Sjungma@eit.uni-kl.deoperator&(uint64 u, const sc_unsigned& v)
138512027Sjungma@eit.uni-kl.de{
138612027Sjungma@eit.uni-kl.de
138712027Sjungma@eit.uni-kl.de  if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
138812027Sjungma@eit.uni-kl.de    return sc_unsigned();
138912027Sjungma@eit.uni-kl.de
139012027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
139112027Sjungma@eit.uni-kl.de
139212027Sjungma@eit.uni-kl.de  // other cases
139312027Sjungma@eit.uni-kl.de  return and_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
139412027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
139512027Sjungma@eit.uni-kl.de
139612027Sjungma@eit.uni-kl.de}
139712027Sjungma@eit.uni-kl.de
139812027Sjungma@eit.uni-kl.de
139912027Sjungma@eit.uni-kl.desc_unsigned
140012027Sjungma@eit.uni-kl.deoperator&(const sc_unsigned& u, unsigned long v)
140112027Sjungma@eit.uni-kl.de{
140212027Sjungma@eit.uni-kl.de
140312027Sjungma@eit.uni-kl.de  if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
140412027Sjungma@eit.uni-kl.de    return sc_unsigned();
140512027Sjungma@eit.uni-kl.de
140612027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
140712027Sjungma@eit.uni-kl.de
140812027Sjungma@eit.uni-kl.de  // other cases
140912027Sjungma@eit.uni-kl.de  return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
141012027Sjungma@eit.uni-kl.de                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
141112027Sjungma@eit.uni-kl.de
141212027Sjungma@eit.uni-kl.de}
141312027Sjungma@eit.uni-kl.de
141412027Sjungma@eit.uni-kl.de
141512027Sjungma@eit.uni-kl.desc_unsigned
141612027Sjungma@eit.uni-kl.deoperator&(unsigned long u, const sc_unsigned& v)
141712027Sjungma@eit.uni-kl.de{
141812027Sjungma@eit.uni-kl.de
141912027Sjungma@eit.uni-kl.de  if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
142012027Sjungma@eit.uni-kl.de    return sc_unsigned();
142112027Sjungma@eit.uni-kl.de
142212027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
142312027Sjungma@eit.uni-kl.de
142412027Sjungma@eit.uni-kl.de  // other cases
142512027Sjungma@eit.uni-kl.de  return and_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
142612027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
142712027Sjungma@eit.uni-kl.de
142812027Sjungma@eit.uni-kl.de}
142912027Sjungma@eit.uni-kl.de
143012027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
143112027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
143212027Sjungma@eit.uni-kl.de
143312027Sjungma@eit.uni-kl.de
143412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
143512027Sjungma@eit.uni-kl.de//  SECTION: Bitwise OR operators: |, |=
143612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
143712027Sjungma@eit.uni-kl.de
143812027Sjungma@eit.uni-kl.de// Cases to consider when computing u | v:
143912027Sjungma@eit.uni-kl.de// 1. u | 0 = u
144012027Sjungma@eit.uni-kl.de// 2. 0 | v = v
144112027Sjungma@eit.uni-kl.de// 3. u | v => sgn = +
144212027Sjungma@eit.uni-kl.de// 4. (-u) | (-v) => sgn = -
144312027Sjungma@eit.uni-kl.de// 5. u | (-v) => sgn = -
144412027Sjungma@eit.uni-kl.de// 6. (-u) | v => sgn = -
144512027Sjungma@eit.uni-kl.de
144612027Sjungma@eit.uni-kl.desc_unsigned
144712027Sjungma@eit.uni-kl.deoperator|(const sc_unsigned& u, const sc_unsigned& v)
144812027Sjungma@eit.uni-kl.de{
144912027Sjungma@eit.uni-kl.de
145012027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 1
145112027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
145212027Sjungma@eit.uni-kl.de
145312027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)  // case 2
145412027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
145512027Sjungma@eit.uni-kl.de
145612027Sjungma@eit.uni-kl.de  // other cases
145712027Sjungma@eit.uni-kl.de  return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
145812027Sjungma@eit.uni-kl.de                            v.sgn, v.nbits, v.ndigits, v.digit);
145912027Sjungma@eit.uni-kl.de
146012027Sjungma@eit.uni-kl.de}
146112027Sjungma@eit.uni-kl.de
146212027Sjungma@eit.uni-kl.de
146312027Sjungma@eit.uni-kl.desc_unsigned
146412027Sjungma@eit.uni-kl.deoperator|(const sc_unsigned& u, uint64 v)
146512027Sjungma@eit.uni-kl.de{
146612027Sjungma@eit.uni-kl.de
146712027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
146812027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
146912027Sjungma@eit.uni-kl.de
147012027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
147112027Sjungma@eit.uni-kl.de
147212027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)  // case 2
147312027Sjungma@eit.uni-kl.de    return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
147412027Sjungma@eit.uni-kl.de
147512027Sjungma@eit.uni-kl.de  // other cases
147612027Sjungma@eit.uni-kl.de  return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
147712027Sjungma@eit.uni-kl.de                            vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
147812027Sjungma@eit.uni-kl.de
147912027Sjungma@eit.uni-kl.de}
148012027Sjungma@eit.uni-kl.de
148112027Sjungma@eit.uni-kl.de
148212027Sjungma@eit.uni-kl.desc_unsigned
148312027Sjungma@eit.uni-kl.deoperator|(uint64 u, const sc_unsigned& v)
148412027Sjungma@eit.uni-kl.de{
148512027Sjungma@eit.uni-kl.de
148612027Sjungma@eit.uni-kl.de  if (u == 0)
148712027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
148812027Sjungma@eit.uni-kl.de
148912027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
149012027Sjungma@eit.uni-kl.de
149112027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
149212027Sjungma@eit.uni-kl.de    return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
149312027Sjungma@eit.uni-kl.de
149412027Sjungma@eit.uni-kl.de  // other cases
149512027Sjungma@eit.uni-kl.de  return or_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
149612027Sjungma@eit.uni-kl.de                            v.sgn, v.nbits, v.ndigits, v.digit);
149712027Sjungma@eit.uni-kl.de
149812027Sjungma@eit.uni-kl.de}
149912027Sjungma@eit.uni-kl.de
150012027Sjungma@eit.uni-kl.de
150112027Sjungma@eit.uni-kl.desc_unsigned
150212027Sjungma@eit.uni-kl.deoperator|(const sc_unsigned& u, unsigned long v)
150312027Sjungma@eit.uni-kl.de{
150412027Sjungma@eit.uni-kl.de
150512027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
150612027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
150712027Sjungma@eit.uni-kl.de
150812027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
150912027Sjungma@eit.uni-kl.de
151012027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)  // case 2
151112027Sjungma@eit.uni-kl.de    return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
151212027Sjungma@eit.uni-kl.de
151312027Sjungma@eit.uni-kl.de  // other cases
151412027Sjungma@eit.uni-kl.de  return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
151512027Sjungma@eit.uni-kl.de                            vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
151612027Sjungma@eit.uni-kl.de
151712027Sjungma@eit.uni-kl.de}
151812027Sjungma@eit.uni-kl.de
151912027Sjungma@eit.uni-kl.de
152012027Sjungma@eit.uni-kl.desc_unsigned
152112027Sjungma@eit.uni-kl.deoperator|(unsigned long u, const sc_unsigned& v)
152212027Sjungma@eit.uni-kl.de{
152312027Sjungma@eit.uni-kl.de
152412027Sjungma@eit.uni-kl.de  if (u == 0)
152512027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
152612027Sjungma@eit.uni-kl.de
152712027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
152812027Sjungma@eit.uni-kl.de
152912027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
153012027Sjungma@eit.uni-kl.de    return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
153112027Sjungma@eit.uni-kl.de
153212027Sjungma@eit.uni-kl.de  // other cases
153312027Sjungma@eit.uni-kl.de  return or_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
153412027Sjungma@eit.uni-kl.de                            v.sgn, v.nbits, v.ndigits, v.digit);
153512027Sjungma@eit.uni-kl.de
153612027Sjungma@eit.uni-kl.de}
153712027Sjungma@eit.uni-kl.de
153812027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
153912027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
154012027Sjungma@eit.uni-kl.de
154112027Sjungma@eit.uni-kl.de
154212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
154312027Sjungma@eit.uni-kl.de//  SECTION: Bitwise XOR operators: ^, ^=
154412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
154512027Sjungma@eit.uni-kl.de
154612027Sjungma@eit.uni-kl.de// Cases to consider when computing u ^ v:
154712027Sjungma@eit.uni-kl.de// Note that  u ^ v = (~u & v) | (u & ~v).
154812027Sjungma@eit.uni-kl.de// 1. u ^ 0 = u
154912027Sjungma@eit.uni-kl.de// 2. 0 ^ v = v
155012027Sjungma@eit.uni-kl.de// 3. u ^ v => sgn = +
155112027Sjungma@eit.uni-kl.de// 4. (-u) ^ (-v) => sgn = -
155212027Sjungma@eit.uni-kl.de// 5. u ^ (-v) => sgn = -
155312027Sjungma@eit.uni-kl.de// 6. (-u) ^ v => sgn = +
155412027Sjungma@eit.uni-kl.de
155512027Sjungma@eit.uni-kl.desc_unsigned
155612027Sjungma@eit.uni-kl.deoperator^(const sc_unsigned& u, const sc_unsigned& v)
155712027Sjungma@eit.uni-kl.de{
155812027Sjungma@eit.uni-kl.de
155912027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)  // case 1
156012027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
156112027Sjungma@eit.uni-kl.de
156212027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)  // case 2
156312027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
156412027Sjungma@eit.uni-kl.de
156512027Sjungma@eit.uni-kl.de  // other cases
156612027Sjungma@eit.uni-kl.de  return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
156712027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
156812027Sjungma@eit.uni-kl.de
156912027Sjungma@eit.uni-kl.de}
157012027Sjungma@eit.uni-kl.de
157112027Sjungma@eit.uni-kl.de
157212027Sjungma@eit.uni-kl.desc_unsigned
157312027Sjungma@eit.uni-kl.deoperator^(const sc_unsigned& u, uint64 v)
157412027Sjungma@eit.uni-kl.de{
157512027Sjungma@eit.uni-kl.de
157612027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
157712027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
157812027Sjungma@eit.uni-kl.de
157912027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
158012027Sjungma@eit.uni-kl.de
158112027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)  // case 2
158212027Sjungma@eit.uni-kl.de    return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
158312027Sjungma@eit.uni-kl.de
158412027Sjungma@eit.uni-kl.de  // other cases
158512027Sjungma@eit.uni-kl.de  return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
158612027Sjungma@eit.uni-kl.de                             vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
158712027Sjungma@eit.uni-kl.de
158812027Sjungma@eit.uni-kl.de}
158912027Sjungma@eit.uni-kl.de
159012027Sjungma@eit.uni-kl.desc_unsigned
159112027Sjungma@eit.uni-kl.deoperator^(uint64 u, const sc_unsigned& v)
159212027Sjungma@eit.uni-kl.de{
159312027Sjungma@eit.uni-kl.de  if (u == 0)
159412027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
159512027Sjungma@eit.uni-kl.de
159612027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
159712027Sjungma@eit.uni-kl.de
159812027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
159912027Sjungma@eit.uni-kl.de    return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
160012027Sjungma@eit.uni-kl.de
160112027Sjungma@eit.uni-kl.de  // other cases
160212027Sjungma@eit.uni-kl.de  return xor_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
160312027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
160412027Sjungma@eit.uni-kl.de
160512027Sjungma@eit.uni-kl.de}
160612027Sjungma@eit.uni-kl.de
160712027Sjungma@eit.uni-kl.de
160812027Sjungma@eit.uni-kl.desc_unsigned
160912027Sjungma@eit.uni-kl.deoperator^(const sc_unsigned& u, unsigned long v)
161012027Sjungma@eit.uni-kl.de{
161112027Sjungma@eit.uni-kl.de
161212027Sjungma@eit.uni-kl.de  if (v == 0)  // case 1
161312027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
161412027Sjungma@eit.uni-kl.de
161512027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
161612027Sjungma@eit.uni-kl.de
161712027Sjungma@eit.uni-kl.de  if (u.sgn == SC_ZERO)  // case 2
161812027Sjungma@eit.uni-kl.de    return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
161912027Sjungma@eit.uni-kl.de
162012027Sjungma@eit.uni-kl.de  // other cases
162112027Sjungma@eit.uni-kl.de  return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
162212027Sjungma@eit.uni-kl.de                             vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
162312027Sjungma@eit.uni-kl.de
162412027Sjungma@eit.uni-kl.de}
162512027Sjungma@eit.uni-kl.de
162612027Sjungma@eit.uni-kl.desc_unsigned
162712027Sjungma@eit.uni-kl.deoperator^(unsigned long u, const sc_unsigned& v)
162812027Sjungma@eit.uni-kl.de{
162912027Sjungma@eit.uni-kl.de  if (u == 0)
163012027Sjungma@eit.uni-kl.de    return sc_unsigned(v);
163112027Sjungma@eit.uni-kl.de
163212027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
163312027Sjungma@eit.uni-kl.de
163412027Sjungma@eit.uni-kl.de  if (v.sgn == SC_ZERO)
163512027Sjungma@eit.uni-kl.de    return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
163612027Sjungma@eit.uni-kl.de
163712027Sjungma@eit.uni-kl.de  // other cases
163812027Sjungma@eit.uni-kl.de  return xor_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
163912027Sjungma@eit.uni-kl.de                             v.sgn, v.nbits, v.ndigits, v.digit);
164012027Sjungma@eit.uni-kl.de
164112027Sjungma@eit.uni-kl.de}
164212027Sjungma@eit.uni-kl.de
164312027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
164412027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
164512027Sjungma@eit.uni-kl.de
164612027Sjungma@eit.uni-kl.de
164712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
164812027Sjungma@eit.uni-kl.de//  SECTION: Bitwise NOT operator: ~
164912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
165012027Sjungma@eit.uni-kl.de
165112027Sjungma@eit.uni-kl.de// Operators in this section are included from sc_nbcommon.cpp.
165212027Sjungma@eit.uni-kl.de
165312027Sjungma@eit.uni-kl.de
165412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
165512027Sjungma@eit.uni-kl.de//  SECTION: LEFT SHIFT operators: <<, <<=
165612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
165712027Sjungma@eit.uni-kl.de
165812027Sjungma@eit.uni-kl.desc_unsigned
165912027Sjungma@eit.uni-kl.deoperator<<(const sc_unsigned& u, const sc_signed& v)
166012027Sjungma@eit.uni-kl.de{
166112027Sjungma@eit.uni-kl.de  if ((v.sgn == SC_ZERO) || (v.sgn == SC_NEG))
166212027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
166312027Sjungma@eit.uni-kl.de
166412027Sjungma@eit.uni-kl.de  return operator<<(u, v.to_ulong());
166512027Sjungma@eit.uni-kl.de}
166612027Sjungma@eit.uni-kl.de
166712027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
166812027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
166912027Sjungma@eit.uni-kl.de
167012027Sjungma@eit.uni-kl.de
167112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
167212027Sjungma@eit.uni-kl.de//  SECTION: RIGHT SHIFT operators: >>, >>=
167312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
167412027Sjungma@eit.uni-kl.de
167512027Sjungma@eit.uni-kl.desc_unsigned
167612027Sjungma@eit.uni-kl.deoperator>>(const sc_unsigned& u, const sc_signed& v)
167712027Sjungma@eit.uni-kl.de{
167812027Sjungma@eit.uni-kl.de
167912027Sjungma@eit.uni-kl.de  if ((v.sgn == SC_ZERO) || (v.sgn == SC_NEG))
168012027Sjungma@eit.uni-kl.de    return sc_unsigned(u);
168112027Sjungma@eit.uni-kl.de
168212027Sjungma@eit.uni-kl.de  return operator>>(u, v.to_long());
168312027Sjungma@eit.uni-kl.de
168412027Sjungma@eit.uni-kl.de}
168512027Sjungma@eit.uni-kl.de
168612027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from
168712027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
168812027Sjungma@eit.uni-kl.de
168912027Sjungma@eit.uni-kl.de
169012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
169112027Sjungma@eit.uni-kl.de//  SECTION: Unary arithmetic operators.
169212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
169312027Sjungma@eit.uni-kl.de
169412027Sjungma@eit.uni-kl.desc_unsigned
169512027Sjungma@eit.uni-kl.deoperator+(const sc_unsigned& u)
169612027Sjungma@eit.uni-kl.de{
169712027Sjungma@eit.uni-kl.de  return sc_unsigned(u);
169812027Sjungma@eit.uni-kl.de}
169912027Sjungma@eit.uni-kl.de
170012027Sjungma@eit.uni-kl.de
170112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
170212027Sjungma@eit.uni-kl.de//  SECTION: EQUAL operator: ==
170312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
170412027Sjungma@eit.uni-kl.de
170512027Sjungma@eit.uni-kl.debool
170612027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, const sc_unsigned& v)
170712027Sjungma@eit.uni-kl.de{
170812027Sjungma@eit.uni-kl.de  if (&u == &v)
170912027Sjungma@eit.uni-kl.de    return true;
171012027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
171112027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) != 0)
171212027Sjungma@eit.uni-kl.de    return false;
171312027Sjungma@eit.uni-kl.de  return true;
171412027Sjungma@eit.uni-kl.de}
171512027Sjungma@eit.uni-kl.de
171612027Sjungma@eit.uni-kl.de
171712027Sjungma@eit.uni-kl.debool
171812027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, const sc_signed& v)
171912027Sjungma@eit.uni-kl.de{
172012027Sjungma@eit.uni-kl.de  if (v.sgn == SC_NEG)
172112027Sjungma@eit.uni-kl.de    return false;
172212027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
172312027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit, 0, 1) != 0)
172412027Sjungma@eit.uni-kl.de    return false;
172512027Sjungma@eit.uni-kl.de  return true;
172612027Sjungma@eit.uni-kl.de}
172712027Sjungma@eit.uni-kl.de
172812027Sjungma@eit.uni-kl.de
172912027Sjungma@eit.uni-kl.debool
173012027Sjungma@eit.uni-kl.deoperator==(const sc_signed& u, const sc_unsigned& v)
173112027Sjungma@eit.uni-kl.de{
173212027Sjungma@eit.uni-kl.de  if (u.sgn == SC_NEG)
173312027Sjungma@eit.uni-kl.de    return false;
173412027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
173512027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit, 1, 0) != 0)
173612027Sjungma@eit.uni-kl.de    return false;
173712027Sjungma@eit.uni-kl.de  return true;
173812027Sjungma@eit.uni-kl.de}
173912027Sjungma@eit.uni-kl.de
174012027Sjungma@eit.uni-kl.de
174112027Sjungma@eit.uni-kl.debool
174212027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, int64 v)
174312027Sjungma@eit.uni-kl.de{
174412027Sjungma@eit.uni-kl.de  if (v < 0)
174512027Sjungma@eit.uni-kl.de    return false;
174612027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
174712027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
174812027Sjungma@eit.uni-kl.de                       vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) != 0)
174912027Sjungma@eit.uni-kl.de    return false;
175012027Sjungma@eit.uni-kl.de  return true;
175112027Sjungma@eit.uni-kl.de}
175212027Sjungma@eit.uni-kl.de
175312027Sjungma@eit.uni-kl.de
175412027Sjungma@eit.uni-kl.debool
175512027Sjungma@eit.uni-kl.deoperator==(int64 u, const sc_unsigned& v)
175612027Sjungma@eit.uni-kl.de{
175712027Sjungma@eit.uni-kl.de  if (u < 0)
175812027Sjungma@eit.uni-kl.de    return false;
175912027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
176012027Sjungma@eit.uni-kl.de  if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
176112027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) != 0)
176212027Sjungma@eit.uni-kl.de    return false;
176312027Sjungma@eit.uni-kl.de  return true;
176412027Sjungma@eit.uni-kl.de}
176512027Sjungma@eit.uni-kl.de
176612027Sjungma@eit.uni-kl.de
176712027Sjungma@eit.uni-kl.debool
176812027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, uint64 v)
176912027Sjungma@eit.uni-kl.de{
177012027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
177112027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
177212027Sjungma@eit.uni-kl.de                       vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) != 0)
177312027Sjungma@eit.uni-kl.de    return false;
177412027Sjungma@eit.uni-kl.de  return true;
177512027Sjungma@eit.uni-kl.de}
177612027Sjungma@eit.uni-kl.de
177712027Sjungma@eit.uni-kl.de
177812027Sjungma@eit.uni-kl.debool
177912027Sjungma@eit.uni-kl.deoperator==(uint64 u, const sc_unsigned& v)
178012027Sjungma@eit.uni-kl.de{
178112027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
178212027Sjungma@eit.uni-kl.de  if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
178312027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) != 0)
178412027Sjungma@eit.uni-kl.de    return false;
178512027Sjungma@eit.uni-kl.de  return true;
178612027Sjungma@eit.uni-kl.de}
178712027Sjungma@eit.uni-kl.de
178812027Sjungma@eit.uni-kl.de
178912027Sjungma@eit.uni-kl.debool
179012027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, long v)
179112027Sjungma@eit.uni-kl.de{
179212027Sjungma@eit.uni-kl.de  if (v < 0)
179312027Sjungma@eit.uni-kl.de    return false;
179412027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
179512027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
179612027Sjungma@eit.uni-kl.de                       vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) != 0)
179712027Sjungma@eit.uni-kl.de    return false;
179812027Sjungma@eit.uni-kl.de  return true;
179912027Sjungma@eit.uni-kl.de}
180012027Sjungma@eit.uni-kl.de
180112027Sjungma@eit.uni-kl.de
180212027Sjungma@eit.uni-kl.debool
180312027Sjungma@eit.uni-kl.deoperator==(long u, const sc_unsigned& v)
180412027Sjungma@eit.uni-kl.de{
180512027Sjungma@eit.uni-kl.de  if (u < 0)
180612027Sjungma@eit.uni-kl.de    return false;
180712027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
180812027Sjungma@eit.uni-kl.de  if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
180912027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) != 0)
181012027Sjungma@eit.uni-kl.de    return false;
181112027Sjungma@eit.uni-kl.de  return true;
181212027Sjungma@eit.uni-kl.de}
181312027Sjungma@eit.uni-kl.de
181412027Sjungma@eit.uni-kl.de
181512027Sjungma@eit.uni-kl.debool
181612027Sjungma@eit.uni-kl.deoperator==(const sc_unsigned& u, unsigned long v)
181712027Sjungma@eit.uni-kl.de{
181812027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
181912027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
182012027Sjungma@eit.uni-kl.de                       vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) != 0)
182112027Sjungma@eit.uni-kl.de    return false;
182212027Sjungma@eit.uni-kl.de  return true;
182312027Sjungma@eit.uni-kl.de}
182412027Sjungma@eit.uni-kl.de
182512027Sjungma@eit.uni-kl.de
182612027Sjungma@eit.uni-kl.debool
182712027Sjungma@eit.uni-kl.deoperator==(unsigned long u, const sc_unsigned& v)
182812027Sjungma@eit.uni-kl.de{
182912027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
183012027Sjungma@eit.uni-kl.de  if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
183112027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) != 0)
183212027Sjungma@eit.uni-kl.de    return false;
183312027Sjungma@eit.uni-kl.de  return true;
183412027Sjungma@eit.uni-kl.de}
183512027Sjungma@eit.uni-kl.de
183612027Sjungma@eit.uni-kl.de
183712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
183812027Sjungma@eit.uni-kl.de//  SECTION: NOT_EQUAL operator: !=
183912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
184012027Sjungma@eit.uni-kl.de
184112027Sjungma@eit.uni-kl.debool
184212027Sjungma@eit.uni-kl.deoperator!=(const sc_unsigned& u, const sc_signed& v)
184312027Sjungma@eit.uni-kl.de{
184412027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
184512027Sjungma@eit.uni-kl.de}
184612027Sjungma@eit.uni-kl.de
184712027Sjungma@eit.uni-kl.de
184812027Sjungma@eit.uni-kl.debool
184912027Sjungma@eit.uni-kl.deoperator!=(const sc_signed& u, const sc_unsigned& v)
185012027Sjungma@eit.uni-kl.de{
185112027Sjungma@eit.uni-kl.de  return (! operator==(u, v));
185212027Sjungma@eit.uni-kl.de}
185312027Sjungma@eit.uni-kl.de
185412027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from sc_nbcommon.cpp.
185512027Sjungma@eit.uni-kl.de
185612027Sjungma@eit.uni-kl.de
185712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
185812027Sjungma@eit.uni-kl.de//  SECTION: LESS THAN operator: <
185912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
186012027Sjungma@eit.uni-kl.de
186112027Sjungma@eit.uni-kl.debool
186212027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, const sc_unsigned& v)
186312027Sjungma@eit.uni-kl.de{
186412027Sjungma@eit.uni-kl.de  if (&u == &v)
186512027Sjungma@eit.uni-kl.de    return false;
186612027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
186712027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) < 0)
186812027Sjungma@eit.uni-kl.de    return true;
186912027Sjungma@eit.uni-kl.de  return false;
187012027Sjungma@eit.uni-kl.de}
187112027Sjungma@eit.uni-kl.de
187212027Sjungma@eit.uni-kl.de
187312027Sjungma@eit.uni-kl.debool
187412027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, const sc_signed& v)
187512027Sjungma@eit.uni-kl.de{
187612027Sjungma@eit.uni-kl.de  if (v.sgn == SC_NEG)
187712027Sjungma@eit.uni-kl.de    return false;
187812027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
187912027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit, 0, 1) < 0)
188012027Sjungma@eit.uni-kl.de    return true;
188112027Sjungma@eit.uni-kl.de  return false;
188212027Sjungma@eit.uni-kl.de}
188312027Sjungma@eit.uni-kl.de
188412027Sjungma@eit.uni-kl.de
188512027Sjungma@eit.uni-kl.debool
188612027Sjungma@eit.uni-kl.deoperator<(const sc_signed& u, const sc_unsigned& v)
188712027Sjungma@eit.uni-kl.de{
188812027Sjungma@eit.uni-kl.de  if (u.sgn == SC_NEG)
188912027Sjungma@eit.uni-kl.de    return true;
189012027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
189112027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit, 1, 0) < 0)
189212027Sjungma@eit.uni-kl.de    return true;
189312027Sjungma@eit.uni-kl.de  return false;
189412027Sjungma@eit.uni-kl.de}
189512027Sjungma@eit.uni-kl.de
189612027Sjungma@eit.uni-kl.de
189712027Sjungma@eit.uni-kl.debool
189812027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, int64 v)
189912027Sjungma@eit.uni-kl.de{
190012027Sjungma@eit.uni-kl.de  if (v < 0)
190112027Sjungma@eit.uni-kl.de    return false;
190212027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
190312027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
190412027Sjungma@eit.uni-kl.de                       vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) < 0)
190512027Sjungma@eit.uni-kl.de    return true;
190612027Sjungma@eit.uni-kl.de  return false;
190712027Sjungma@eit.uni-kl.de}
190812027Sjungma@eit.uni-kl.de
190912027Sjungma@eit.uni-kl.de
191012027Sjungma@eit.uni-kl.debool
191112027Sjungma@eit.uni-kl.deoperator<(int64 u, const sc_unsigned& v)
191212027Sjungma@eit.uni-kl.de{
191312027Sjungma@eit.uni-kl.de  if (u < 0)
191412027Sjungma@eit.uni-kl.de    return true;
191512027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
191612027Sjungma@eit.uni-kl.de  if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
191712027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) < 0)
191812027Sjungma@eit.uni-kl.de    return true;
191912027Sjungma@eit.uni-kl.de  return false;
192012027Sjungma@eit.uni-kl.de}
192112027Sjungma@eit.uni-kl.de
192212027Sjungma@eit.uni-kl.de
192312027Sjungma@eit.uni-kl.debool
192412027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, uint64 v)
192512027Sjungma@eit.uni-kl.de{
192612027Sjungma@eit.uni-kl.de  CONVERT_INT64(v);
192712027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
192812027Sjungma@eit.uni-kl.de                       vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) < 0)
192912027Sjungma@eit.uni-kl.de    return true;
193012027Sjungma@eit.uni-kl.de  return false;
193112027Sjungma@eit.uni-kl.de}
193212027Sjungma@eit.uni-kl.de
193312027Sjungma@eit.uni-kl.de
193412027Sjungma@eit.uni-kl.debool
193512027Sjungma@eit.uni-kl.deoperator<(uint64 u, const sc_unsigned& v)
193612027Sjungma@eit.uni-kl.de{
193712027Sjungma@eit.uni-kl.de  CONVERT_INT64(u);
193812027Sjungma@eit.uni-kl.de  if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
193912027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) < 0)
194012027Sjungma@eit.uni-kl.de    return true;
194112027Sjungma@eit.uni-kl.de  return false;
194212027Sjungma@eit.uni-kl.de}
194312027Sjungma@eit.uni-kl.de
194412027Sjungma@eit.uni-kl.de
194512027Sjungma@eit.uni-kl.debool
194612027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, long v)
194712027Sjungma@eit.uni-kl.de{
194812027Sjungma@eit.uni-kl.de  if (v < 0)
194912027Sjungma@eit.uni-kl.de    return false;
195012027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
195112027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
195212027Sjungma@eit.uni-kl.de                       vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) < 0)
195312027Sjungma@eit.uni-kl.de    return true;
195412027Sjungma@eit.uni-kl.de  return false;
195512027Sjungma@eit.uni-kl.de}
195612027Sjungma@eit.uni-kl.de
195712027Sjungma@eit.uni-kl.de
195812027Sjungma@eit.uni-kl.debool
195912027Sjungma@eit.uni-kl.deoperator<(long u, const sc_unsigned& v)
196012027Sjungma@eit.uni-kl.de{
196112027Sjungma@eit.uni-kl.de  if (u < 0)
196212027Sjungma@eit.uni-kl.de    return true;
196312027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
196412027Sjungma@eit.uni-kl.de  if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
196512027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) < 0)
196612027Sjungma@eit.uni-kl.de    return true;
196712027Sjungma@eit.uni-kl.de  return false;
196812027Sjungma@eit.uni-kl.de}
196912027Sjungma@eit.uni-kl.de
197012027Sjungma@eit.uni-kl.de
197112027Sjungma@eit.uni-kl.debool
197212027Sjungma@eit.uni-kl.deoperator<(const sc_unsigned& u, unsigned long v)
197312027Sjungma@eit.uni-kl.de{
197412027Sjungma@eit.uni-kl.de  CONVERT_LONG(v);
197512027Sjungma@eit.uni-kl.de  if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
197612027Sjungma@eit.uni-kl.de                       vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) < 0)
197712027Sjungma@eit.uni-kl.de    return true;
197812027Sjungma@eit.uni-kl.de  return false;
197912027Sjungma@eit.uni-kl.de}
198012027Sjungma@eit.uni-kl.de
198112027Sjungma@eit.uni-kl.de
198212027Sjungma@eit.uni-kl.debool
198312027Sjungma@eit.uni-kl.deoperator<(unsigned long u, const sc_unsigned& v)
198412027Sjungma@eit.uni-kl.de{
198512027Sjungma@eit.uni-kl.de  CONVERT_LONG(u);
198612027Sjungma@eit.uni-kl.de  if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
198712027Sjungma@eit.uni-kl.de                       v.sgn, v.nbits, v.ndigits, v.digit) < 0)
198812027Sjungma@eit.uni-kl.de    return true;
198912027Sjungma@eit.uni-kl.de  return false;
199012027Sjungma@eit.uni-kl.de}
199112027Sjungma@eit.uni-kl.de
199212027Sjungma@eit.uni-kl.de
199312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
199412027Sjungma@eit.uni-kl.de//  SECTION: LESS THAN or EQUAL operator: <=
199512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
199612027Sjungma@eit.uni-kl.de
199712027Sjungma@eit.uni-kl.debool
199812027Sjungma@eit.uni-kl.deoperator<=(const sc_unsigned& u, const sc_signed& v)
199912027Sjungma@eit.uni-kl.de{
200012027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
200112027Sjungma@eit.uni-kl.de}
200212027Sjungma@eit.uni-kl.de
200312027Sjungma@eit.uni-kl.de
200412027Sjungma@eit.uni-kl.debool
200512027Sjungma@eit.uni-kl.deoperator<=(const sc_signed& u, const sc_unsigned& v)
200612027Sjungma@eit.uni-kl.de{
200712027Sjungma@eit.uni-kl.de  return (operator<(u, v) || operator==(u, v));
200812027Sjungma@eit.uni-kl.de}
200912027Sjungma@eit.uni-kl.de
201012027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from sc_nbcommon.cpp.
201112027Sjungma@eit.uni-kl.de
201212027Sjungma@eit.uni-kl.de
201312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
201412027Sjungma@eit.uni-kl.de//  SECTION: GREATER THAN operator: >
201512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
201612027Sjungma@eit.uni-kl.de
201712027Sjungma@eit.uni-kl.debool
201812027Sjungma@eit.uni-kl.deoperator>(const sc_unsigned& u, const sc_signed& v)
201912027Sjungma@eit.uni-kl.de{
202012027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
202112027Sjungma@eit.uni-kl.de}
202212027Sjungma@eit.uni-kl.de
202312027Sjungma@eit.uni-kl.de
202412027Sjungma@eit.uni-kl.debool
202512027Sjungma@eit.uni-kl.deoperator>(const sc_signed& u, const sc_unsigned& v)
202612027Sjungma@eit.uni-kl.de{
202712027Sjungma@eit.uni-kl.de  return (! (operator<=(u, v)));
202812027Sjungma@eit.uni-kl.de}
202912027Sjungma@eit.uni-kl.de
203012027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from sc_nbcommon.cpp.
203112027Sjungma@eit.uni-kl.de
203212027Sjungma@eit.uni-kl.de
203312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
203412027Sjungma@eit.uni-kl.de//  SECTION: GREATER THAN or EQUAL operator: >=
203512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
203612027Sjungma@eit.uni-kl.de
203712027Sjungma@eit.uni-kl.debool
203812027Sjungma@eit.uni-kl.deoperator>=(const sc_unsigned& u, const sc_signed& v)
203912027Sjungma@eit.uni-kl.de{
204012027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
204112027Sjungma@eit.uni-kl.de}
204212027Sjungma@eit.uni-kl.de
204312027Sjungma@eit.uni-kl.de
204412027Sjungma@eit.uni-kl.debool
204512027Sjungma@eit.uni-kl.deoperator>=(const sc_signed& u, const sc_unsigned& v)
204612027Sjungma@eit.uni-kl.de{
204712027Sjungma@eit.uni-kl.de  return (! (operator<(u, v)));
204812027Sjungma@eit.uni-kl.de}
204912027Sjungma@eit.uni-kl.de
205012027Sjungma@eit.uni-kl.de// The rest of the operators in this section are included from sc_nbcommon.cpp.
205112027Sjungma@eit.uni-kl.de
205212027Sjungma@eit.uni-kl.de
205312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
205412027Sjungma@eit.uni-kl.de//  SECTION: Friends
205512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
205612027Sjungma@eit.uni-kl.de
205712027Sjungma@eit.uni-kl.de// Compare u and v as unsigned and return r
205812027Sjungma@eit.uni-kl.de//  r = 0 if u == v
205912027Sjungma@eit.uni-kl.de//  r < 0 if u < v
206012027Sjungma@eit.uni-kl.de//  r > 0 if u > v
206112027Sjungma@eit.uni-kl.de
206212027Sjungma@eit.uni-kl.deint
206312027Sjungma@eit.uni-kl.decompare_unsigned(small_type us,
206412027Sjungma@eit.uni-kl.de                 int unb, int und, const sc_digit *ud,
206512027Sjungma@eit.uni-kl.de                 small_type vs,
206612027Sjungma@eit.uni-kl.de                 int vnb, int vnd, const sc_digit *vd,
206712027Sjungma@eit.uni-kl.de                 small_type if_u_signed,
206812027Sjungma@eit.uni-kl.de                 small_type if_v_signed)
206912027Sjungma@eit.uni-kl.de{
207012027Sjungma@eit.uni-kl.de
207112027Sjungma@eit.uni-kl.de  if (us == vs) {
207212027Sjungma@eit.uni-kl.de
207312027Sjungma@eit.uni-kl.de    if (us == SC_ZERO)
207412027Sjungma@eit.uni-kl.de      return 0;
207512027Sjungma@eit.uni-kl.de
207612027Sjungma@eit.uni-kl.de    else {
207712027Sjungma@eit.uni-kl.de
207812027Sjungma@eit.uni-kl.de      int cmp_res = vec_skip_and_cmp(und, ud, vnd, vd);
207912027Sjungma@eit.uni-kl.de
208012027Sjungma@eit.uni-kl.de      if (us == SC_POS)
208112027Sjungma@eit.uni-kl.de        return cmp_res;
208212027Sjungma@eit.uni-kl.de      else
208312027Sjungma@eit.uni-kl.de        return -cmp_res;
208412027Sjungma@eit.uni-kl.de
208512027Sjungma@eit.uni-kl.de    }
208612027Sjungma@eit.uni-kl.de  }
208712027Sjungma@eit.uni-kl.de  else {
208812027Sjungma@eit.uni-kl.de
208912027Sjungma@eit.uni-kl.de    if (us == SC_ZERO)
209012027Sjungma@eit.uni-kl.de      return -vs;
209112027Sjungma@eit.uni-kl.de
209212027Sjungma@eit.uni-kl.de    if (vs == SC_ZERO)
209312027Sjungma@eit.uni-kl.de      return us;
209412027Sjungma@eit.uni-kl.de
209512027Sjungma@eit.uni-kl.de    int cmp_res;
209612027Sjungma@eit.uni-kl.de
209712027Sjungma@eit.uni-kl.de    int nd = (us == SC_NEG ? und : vnd);
209812027Sjungma@eit.uni-kl.de
209912027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
210012027Sjungma@eit.uni-kl.de    sc_digit d[MAX_NDIGITS];
210112027Sjungma@eit.uni-kl.de#else
210212027Sjungma@eit.uni-kl.de    sc_digit *d = new sc_digit[nd];
210312027Sjungma@eit.uni-kl.de#endif
210412027Sjungma@eit.uni-kl.de
210512027Sjungma@eit.uni-kl.de    if (us == SC_NEG) {
210612027Sjungma@eit.uni-kl.de
210712027Sjungma@eit.uni-kl.de      vec_copy(nd, d, ud);
210812027Sjungma@eit.uni-kl.de      vec_complement(nd, d);
210912027Sjungma@eit.uni-kl.de      trim(if_u_signed, unb, nd, d);
211012027Sjungma@eit.uni-kl.de      cmp_res = vec_skip_and_cmp(nd, d, vnd, vd);
211112027Sjungma@eit.uni-kl.de
211212027Sjungma@eit.uni-kl.de    }
211312027Sjungma@eit.uni-kl.de    else {
211412027Sjungma@eit.uni-kl.de
211512027Sjungma@eit.uni-kl.de      vec_copy(nd, d, vd);
211612027Sjungma@eit.uni-kl.de      vec_complement(nd, d);
211712027Sjungma@eit.uni-kl.de      trim(if_v_signed, vnb, nd, d);
211812027Sjungma@eit.uni-kl.de      cmp_res = vec_skip_and_cmp(und, ud, nd, d);
211912027Sjungma@eit.uni-kl.de
212012027Sjungma@eit.uni-kl.de    }
212112027Sjungma@eit.uni-kl.de
212212027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
212312027Sjungma@eit.uni-kl.de    delete [] d;
212412027Sjungma@eit.uni-kl.de#endif
212512027Sjungma@eit.uni-kl.de
212612027Sjungma@eit.uni-kl.de    return cmp_res;
212712027Sjungma@eit.uni-kl.de
212812027Sjungma@eit.uni-kl.de  }
212912027Sjungma@eit.uni-kl.de}
213012027Sjungma@eit.uni-kl.de
213112027Sjungma@eit.uni-kl.de
213212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
213312027Sjungma@eit.uni-kl.de//  SECTION: Public members - Other utils.
213412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
213512027Sjungma@eit.uni-kl.de
213612027Sjungma@eit.uni-kl.debool
213712027Sjungma@eit.uni-kl.desc_unsigned::iszero() const
213812027Sjungma@eit.uni-kl.de{
213912027Sjungma@eit.uni-kl.de  if (sgn == SC_ZERO)
214012027Sjungma@eit.uni-kl.de    return true;
214112027Sjungma@eit.uni-kl.de
214212027Sjungma@eit.uni-kl.de  else if (sgn == SC_NEG) {
214312027Sjungma@eit.uni-kl.de
214412027Sjungma@eit.uni-kl.de    // A negative unsigned number can be zero, e.g., -16 in 4 bits, so
214512027Sjungma@eit.uni-kl.de    // check that.
214612027Sjungma@eit.uni-kl.de
214712027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
214812027Sjungma@eit.uni-kl.de    sc_digit d[MAX_NDIGITS];
214912027Sjungma@eit.uni-kl.de#else
215012027Sjungma@eit.uni-kl.de    sc_digit *d = new sc_digit[ndigits];
215112027Sjungma@eit.uni-kl.de#endif
215212027Sjungma@eit.uni-kl.de
215312027Sjungma@eit.uni-kl.de    vec_copy(ndigits, d, digit);
215412027Sjungma@eit.uni-kl.de    vec_complement(ndigits, d);
215512027Sjungma@eit.uni-kl.de    trim_unsigned(nbits, ndigits, d);
215612027Sjungma@eit.uni-kl.de
215712027Sjungma@eit.uni-kl.de    bool res = check_for_zero(ndigits, d);
215812027Sjungma@eit.uni-kl.de
215912027Sjungma@eit.uni-kl.de#ifndef SC_MAX_NBITS
216012027Sjungma@eit.uni-kl.de    delete [] d;
216112027Sjungma@eit.uni-kl.de#endif
216212027Sjungma@eit.uni-kl.de
216312027Sjungma@eit.uni-kl.de    return res;
216412027Sjungma@eit.uni-kl.de
216512027Sjungma@eit.uni-kl.de  }
216612027Sjungma@eit.uni-kl.de  else
216712027Sjungma@eit.uni-kl.de    return false;
216812027Sjungma@eit.uni-kl.de}
216912027Sjungma@eit.uni-kl.de
217012027Sjungma@eit.uni-kl.de// The rest of the utils in this section are included from sc_nbcommon.cpp.
217112027Sjungma@eit.uni-kl.de
217212027Sjungma@eit.uni-kl.de
217312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
217412027Sjungma@eit.uni-kl.de//  SECTION: Private members.
217512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
217612027Sjungma@eit.uni-kl.de
217712027Sjungma@eit.uni-kl.de// The private members in this section are included from
217812027Sjungma@eit.uni-kl.de// sc_nbcommon.cpp.
217912027Sjungma@eit.uni-kl.de
218012027Sjungma@eit.uni-kl.de#define CLASS_TYPE sc_unsigned
218112027Sjungma@eit.uni-kl.de#define CLASS_TYPE_STR "sc_unsigned"
218212027Sjungma@eit.uni-kl.de
218312027Sjungma@eit.uni-kl.de#define ADD_HELPER add_unsigned_friend
218412027Sjungma@eit.uni-kl.de#define SUB_HELPER sub_unsigned_friend
218512027Sjungma@eit.uni-kl.de#define MUL_HELPER mul_unsigned_friend
218612027Sjungma@eit.uni-kl.de#define DIV_HELPER div_unsigned_friend
218712027Sjungma@eit.uni-kl.de#define MOD_HELPER mod_unsigned_friend
218812027Sjungma@eit.uni-kl.de#define AND_HELPER and_unsigned_friend
218912027Sjungma@eit.uni-kl.de#define  OR_HELPER  or_unsigned_friend
219012027Sjungma@eit.uni-kl.de#define XOR_HELPER xor_unsigned_friend
219112027Sjungma@eit.uni-kl.de
219212027Sjungma@eit.uni-kl.de#include "sc_nbfriends.inc"
219312027Sjungma@eit.uni-kl.de
219412027Sjungma@eit.uni-kl.de#undef  SC_SIGNED
219512027Sjungma@eit.uni-kl.de#define SC_UNSIGNED
219612027Sjungma@eit.uni-kl.de#define IF_SC_SIGNED              0  // 0 = sc_unsigned
219712027Sjungma@eit.uni-kl.de#define CLASS_TYPE_SUBREF         sc_unsigned_subref_r
219812027Sjungma@eit.uni-kl.de#define OTHER_CLASS_TYPE          sc_signed
219912027Sjungma@eit.uni-kl.de#define OTHER_CLASS_TYPE_SUBREF   sc_signed_subref_r
220012027Sjungma@eit.uni-kl.de
220112027Sjungma@eit.uni-kl.de#define MUL_ON_HELPER mul_on_help_unsigned
220212027Sjungma@eit.uni-kl.de#define DIV_ON_HELPER div_on_help_unsigned
220312027Sjungma@eit.uni-kl.de#define MOD_ON_HELPER mod_on_help_unsigned
220412027Sjungma@eit.uni-kl.de
220512027Sjungma@eit.uni-kl.de#include "sc_nbcommon.inc"
220612027Sjungma@eit.uni-kl.de
220712027Sjungma@eit.uni-kl.de#undef MOD_ON_HELPER
220812027Sjungma@eit.uni-kl.de#undef DIV_ON_HELPER
220912027Sjungma@eit.uni-kl.de#undef MUL_ON_HELPER
221012027Sjungma@eit.uni-kl.de
221112027Sjungma@eit.uni-kl.de#undef OTHER_CLASS_TYPE_SUBREF
221212027Sjungma@eit.uni-kl.de#undef OTHER_CLASS_TYPE
221312027Sjungma@eit.uni-kl.de#undef CLASS_TYPE_SUBREF
221412027Sjungma@eit.uni-kl.de#undef IF_SC_SIGNED
221512027Sjungma@eit.uni-kl.de#undef SC_UNSIGNED
221612027Sjungma@eit.uni-kl.de
221712027Sjungma@eit.uni-kl.de#undef XOR_HELPER
221812027Sjungma@eit.uni-kl.de#undef  OR_HELPER
221912027Sjungma@eit.uni-kl.de#undef AND_HELPER
222012027Sjungma@eit.uni-kl.de#undef MOD_HELPER
222112027Sjungma@eit.uni-kl.de#undef DIV_HELPER
222212027Sjungma@eit.uni-kl.de#undef MUL_HELPER
222312027Sjungma@eit.uni-kl.de#undef SUB_HELPER
222412027Sjungma@eit.uni-kl.de#undef ADD_HELPER
222512027Sjungma@eit.uni-kl.de
222612027Sjungma@eit.uni-kl.de#undef CLASS_TYPE
222712027Sjungma@eit.uni-kl.de#undef CLASS_TYPE_STR
222812027Sjungma@eit.uni-kl.de
222912027Sjungma@eit.uni-kl.de#include "sc_unsigned_bitref.inc"
223012027Sjungma@eit.uni-kl.de#include "sc_unsigned_subref.inc"
223112027Sjungma@eit.uni-kl.de
223212027Sjungma@eit.uni-kl.de#undef CONVERT_LONG
223312027Sjungma@eit.uni-kl.de#undef CONVERT_LONG_2
223412027Sjungma@eit.uni-kl.de#undef CONVERT_INT64
223512027Sjungma@eit.uni-kl.de#undef CONVERT_INT64_2
223612027Sjungma@eit.uni-kl.de
223712027Sjungma@eit.uni-kl.de} // namespace sc_dt
223812027Sjungma@eit.uni-kl.de
223912027Sjungma@eit.uni-kl.de
224012027Sjungma@eit.uni-kl.de// End of file.
2241