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_uint_base.cpp -- contains interface definitions between sc_uint and
2312027Sjungma@eit.uni-kl.de                 sc_signed, sc_unsigned, and definitions for sc_uint_subref.
2412027Sjungma@eit.uni-kl.de
2512027Sjungma@eit.uni-kl.de  Original Author: Ali Dasdan, Synopsys, Inc.
2612027Sjungma@eit.uni-kl.de
2712027Sjungma@eit.uni-kl.de *****************************************************************************/
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de/*****************************************************************************
3012027Sjungma@eit.uni-kl.de
3112027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3212027Sjungma@eit.uni-kl.de  changes you are making here.
3312027Sjungma@eit.uni-kl.de
3412027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
3512027Sjungma@eit.uni-kl.de  Description of Modification:
3612027Sjungma@eit.uni-kl.de
3712027Sjungma@eit.uni-kl.de *****************************************************************************/
3812027Sjungma@eit.uni-kl.de
3912027Sjungma@eit.uni-kl.de
4012027Sjungma@eit.uni-kl.de// $Log: sc_uint_base.cpp,v $
4112027Sjungma@eit.uni-kl.de// Revision 1.5  2011/02/18 20:19:15  acg
4212027Sjungma@eit.uni-kl.de//  Andy Goodrich: updating Copyright notice.
4312027Sjungma@eit.uni-kl.de//
4412027Sjungma@eit.uni-kl.de// Revision 1.4  2010/02/04 22:23:29  acg
4512027Sjungma@eit.uni-kl.de//  Andy Goodrich: fixed bug in concatenation reads for part selections,
4612027Sjungma@eit.uni-kl.de//  the mask being used was 32 bits and should have been 64 bits.
4712027Sjungma@eit.uni-kl.de//
4812027Sjungma@eit.uni-kl.de// Revision 1.3  2008/06/19 17:47:57  acg
4912027Sjungma@eit.uni-kl.de//  Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES.
5012027Sjungma@eit.uni-kl.de//
5112027Sjungma@eit.uni-kl.de// Revision 1.2  2007/11/04 21:27:00  acg
5212027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes to make sure the proper value is returned from
5312027Sjungma@eit.uni-kl.de//  concat_get_data().
5412027Sjungma@eit.uni-kl.de//
5512027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
5612027Sjungma@eit.uni-kl.de// SystemC 2.3
5712027Sjungma@eit.uni-kl.de//
5812027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:49:32  acg
5912027Sjungma@eit.uni-kl.de// Added $Log command so that CVS check in comments are reproduced in the
6012027Sjungma@eit.uni-kl.de// source.
6112027Sjungma@eit.uni-kl.de//
6212027Sjungma@eit.uni-kl.de
6312027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_macros.h"
6412027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h"
6512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h"
6612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h"
6712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_ids.h"
6812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bv_base.h"
6912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_lv_base.h"
7012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/misc/sc_concatref.h"
7112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_ufix.h"
7212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_other_defs.h"
7312027Sjungma@eit.uni-kl.de
7412027Sjungma@eit.uni-kl.de
7512027Sjungma@eit.uni-kl.denamespace sc_dt
7612027Sjungma@eit.uni-kl.de{
7712027Sjungma@eit.uni-kl.de
7812027Sjungma@eit.uni-kl.de// to avoid code bloat in sc_uint_concat<T1,T2>
7912027Sjungma@eit.uni-kl.de
8012027Sjungma@eit.uni-kl.devoid
8112027Sjungma@eit.uni-kl.desc_uint_concref_invalid_length( int length )
8212027Sjungma@eit.uni-kl.de{
8312027Sjungma@eit.uni-kl.de    char msg[BUFSIZ];
8412027Sjungma@eit.uni-kl.de    std::sprintf( msg,
8512027Sjungma@eit.uni-kl.de	     "sc_uint_concref<T1,T2> initialization: length = %d "
8612027Sjungma@eit.uni-kl.de	     "violates 1 <= length <= %d",
8712027Sjungma@eit.uni-kl.de	     length, SC_INTWIDTH );
8812027Sjungma@eit.uni-kl.de    SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
8912027Sjungma@eit.uni-kl.de}
9012027Sjungma@eit.uni-kl.de
9112027Sjungma@eit.uni-kl.de
9212027Sjungma@eit.uni-kl.de
9312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
9412027Sjungma@eit.uni-kl.de//  CLASS : sc_uint_bitref
9512027Sjungma@eit.uni-kl.de//
9612027Sjungma@eit.uni-kl.de//  Proxy class for sc_uint bit selection (r-value and l-value).
9712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
9812027Sjungma@eit.uni-kl.de
9912027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_uint_bitref> sc_uint_bitref::m_pool(9);
10012027Sjungma@eit.uni-kl.de
10112027Sjungma@eit.uni-kl.de// concatenation methods:
10212027Sjungma@eit.uni-kl.de
10312027Sjungma@eit.uni-kl.de// #### OPTIMIZE
10412027Sjungma@eit.uni-kl.devoid sc_uint_bitref::concat_set(int64 src, int low_i)
10512027Sjungma@eit.uni-kl.de{
10612027Sjungma@eit.uni-kl.de    sc_uint_base aa( 1 );
10712027Sjungma@eit.uni-kl.de    *this = aa = (low_i < 64) ? src >> low_i : src >> 63;
10812027Sjungma@eit.uni-kl.de}
10912027Sjungma@eit.uni-kl.de
11012027Sjungma@eit.uni-kl.devoid sc_uint_bitref::concat_set(const sc_signed& src, int low_i)
11112027Sjungma@eit.uni-kl.de{
11212027Sjungma@eit.uni-kl.de    sc_uint_base aa( 1 );
11312027Sjungma@eit.uni-kl.de    if ( low_i < src.length() )
11412027Sjungma@eit.uni-kl.de        *this = aa = 1 & (src >> low_i);
11512027Sjungma@eit.uni-kl.de    else
11612027Sjungma@eit.uni-kl.de        *this = aa = (src < 0) ? (int_type)-1 : 0;
11712027Sjungma@eit.uni-kl.de}
11812027Sjungma@eit.uni-kl.de
11912027Sjungma@eit.uni-kl.devoid sc_uint_bitref::concat_set(const sc_unsigned& src, int low_i)
12012027Sjungma@eit.uni-kl.de{
12112027Sjungma@eit.uni-kl.de    sc_uint_base aa( 1 );
12212027Sjungma@eit.uni-kl.de    if ( low_i < src.length() )
12312027Sjungma@eit.uni-kl.de        *this = aa = 1 & (src >> low_i);
12412027Sjungma@eit.uni-kl.de    else
12512027Sjungma@eit.uni-kl.de        *this = aa = 0;
12612027Sjungma@eit.uni-kl.de}
12712027Sjungma@eit.uni-kl.de
12812027Sjungma@eit.uni-kl.devoid sc_uint_bitref::concat_set(uint64 src, int low_i)
12912027Sjungma@eit.uni-kl.de{
13012027Sjungma@eit.uni-kl.de    sc_uint_base aa( 1 );
13112027Sjungma@eit.uni-kl.de    *this = aa = (low_i < 64) ? src >> low_i : 0;
13212027Sjungma@eit.uni-kl.de}
13312027Sjungma@eit.uni-kl.de
13412027Sjungma@eit.uni-kl.de
13512027Sjungma@eit.uni-kl.de// other methods
13612027Sjungma@eit.uni-kl.de
13712027Sjungma@eit.uni-kl.devoid
13812027Sjungma@eit.uni-kl.desc_uint_bitref::scan( ::std::istream& is )
13912027Sjungma@eit.uni-kl.de{
14012027Sjungma@eit.uni-kl.de    bool b;
14112027Sjungma@eit.uni-kl.de    is >> b;
14212027Sjungma@eit.uni-kl.de    *this = b;
14312027Sjungma@eit.uni-kl.de}
14412027Sjungma@eit.uni-kl.de
14512027Sjungma@eit.uni-kl.de
14612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
14712027Sjungma@eit.uni-kl.de//  CLASS : sc_uint_subref_r
14812027Sjungma@eit.uni-kl.de//
14912027Sjungma@eit.uni-kl.de//  Proxy class for sc_uint part selection (l-value).
15012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
15112027Sjungma@eit.uni-kl.de
15212027Sjungma@eit.uni-kl.debool sc_uint_subref_r::concat_get_ctrl( sc_digit* dst_p, int low_i ) const
15312027Sjungma@eit.uni-kl.de{
15412027Sjungma@eit.uni-kl.de    int       dst_i;	   // Word in dst_p now processing.
15512027Sjungma@eit.uni-kl.de    int       end_i;	   // Highest order word in dst_p to process.
15612027Sjungma@eit.uni-kl.de    int       left_shift;  // Left shift for val.
15712027Sjungma@eit.uni-kl.de    uint_type mask;	   // Mask for bits to extract or keep.
15812027Sjungma@eit.uni-kl.de
15912027Sjungma@eit.uni-kl.de    dst_i = low_i / BITS_PER_DIGIT;
16012027Sjungma@eit.uni-kl.de    left_shift = low_i % BITS_PER_DIGIT;
16112027Sjungma@eit.uni-kl.de    end_i = (low_i + (m_left-m_right)) / BITS_PER_DIGIT;
16212027Sjungma@eit.uni-kl.de
16312027Sjungma@eit.uni-kl.de    mask = ~(-1 << left_shift);
16412027Sjungma@eit.uni-kl.de    dst_p[dst_i] = (sc_digit)((dst_p[dst_i] & mask));
16512027Sjungma@eit.uni-kl.de
16612027Sjungma@eit.uni-kl.de    dst_i++;
16712027Sjungma@eit.uni-kl.de    for ( ; dst_i <= end_i; dst_i++ ) dst_p[dst_i] = 0;
16812027Sjungma@eit.uni-kl.de
16912027Sjungma@eit.uni-kl.de    return false;
17012027Sjungma@eit.uni-kl.de}
17112027Sjungma@eit.uni-kl.de
17212027Sjungma@eit.uni-kl.debool sc_uint_subref_r::concat_get_data( sc_digit* dst_p, int low_i ) const
17312027Sjungma@eit.uni-kl.de{
17412027Sjungma@eit.uni-kl.de    int       dst_i;	   // Word in dst_p now processing.
17512027Sjungma@eit.uni-kl.de    int       end_i;	   // Highest order word in dst_p to process.
17612027Sjungma@eit.uni-kl.de    int       high_i;	   // Index of high order bit in dst_p to set.
17712027Sjungma@eit.uni-kl.de    int       left_shift;  // Left shift for val.
17812027Sjungma@eit.uni-kl.de    uint_type mask;	   // Mask for bits to extract or keep.
17912027Sjungma@eit.uni-kl.de    bool      result;	   // True if inserting non-zero value.
18012027Sjungma@eit.uni-kl.de    uint_type val;	   // Selection value extracted from m_obj_p.
18112027Sjungma@eit.uni-kl.de
18212027Sjungma@eit.uni-kl.de    dst_i = low_i / BITS_PER_DIGIT;
18312027Sjungma@eit.uni-kl.de    left_shift = low_i % BITS_PER_DIGIT;
18412027Sjungma@eit.uni-kl.de    high_i = low_i + (m_left-m_right);
18512027Sjungma@eit.uni-kl.de    end_i = high_i / BITS_PER_DIGIT;
18612027Sjungma@eit.uni-kl.de    mask = ~mask_int[m_left][m_right];
18712027Sjungma@eit.uni-kl.de    val = (m_obj_p->m_val & mask) >> m_right;
18812027Sjungma@eit.uni-kl.de    result = val != 0;
18912027Sjungma@eit.uni-kl.de
19012027Sjungma@eit.uni-kl.de
19112027Sjungma@eit.uni-kl.de    // PROCESS THE FIRST WORD:
19212027Sjungma@eit.uni-kl.de
19312027Sjungma@eit.uni-kl.de    mask = ~(-1 << left_shift);
19412027Sjungma@eit.uni-kl.de    dst_p[dst_i] = (sc_digit)(((dst_p[dst_i] & mask)) |
19512027Sjungma@eit.uni-kl.de	((val << left_shift) & DIGIT_MASK));
19612027Sjungma@eit.uni-kl.de
19712027Sjungma@eit.uni-kl.de    switch ( end_i - dst_i )
19812027Sjungma@eit.uni-kl.de    {
19912027Sjungma@eit.uni-kl.de     // BITS ARE ACROSS TWO WORDS:
20012027Sjungma@eit.uni-kl.de
20112027Sjungma@eit.uni-kl.de     case 1:
20212027Sjungma@eit.uni-kl.de        dst_i++;
20312027Sjungma@eit.uni-kl.de        val >>= (BITS_PER_DIGIT-left_shift);
20412027Sjungma@eit.uni-kl.de        dst_p[dst_i] = (sc_digit)val;
20512027Sjungma@eit.uni-kl.de        break;
20612027Sjungma@eit.uni-kl.de
20712027Sjungma@eit.uni-kl.de     // BITS ARE ACROSS THREE WORDS:
20812027Sjungma@eit.uni-kl.de
20912027Sjungma@eit.uni-kl.de     case 2:
21012027Sjungma@eit.uni-kl.de        dst_i++;
21112027Sjungma@eit.uni-kl.de        val >>= (BITS_PER_DIGIT-left_shift);
21212027Sjungma@eit.uni-kl.de        dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK);
21312027Sjungma@eit.uni-kl.de        val >>= BITS_PER_DIGIT;
21412027Sjungma@eit.uni-kl.de        dst_p[dst_i] = (sc_digit)val;
21512027Sjungma@eit.uni-kl.de        break;
21612027Sjungma@eit.uni-kl.de
21712027Sjungma@eit.uni-kl.de     // BITS ARE ACROSS THREE WORDS:
21812027Sjungma@eit.uni-kl.de
21912027Sjungma@eit.uni-kl.de     case 3:
22012027Sjungma@eit.uni-kl.de        dst_i++;
22112027Sjungma@eit.uni-kl.de        val >>= (BITS_PER_DIGIT-left_shift);
22212027Sjungma@eit.uni-kl.de        dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK);
22312027Sjungma@eit.uni-kl.de        val >>= BITS_PER_DIGIT;
22412027Sjungma@eit.uni-kl.de        dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK);
22512027Sjungma@eit.uni-kl.de        val >>= BITS_PER_DIGIT;
22612027Sjungma@eit.uni-kl.de        dst_p[dst_i] = (sc_digit)val;
22712027Sjungma@eit.uni-kl.de        break;
22812027Sjungma@eit.uni-kl.de    }
22912027Sjungma@eit.uni-kl.de    return result;
23012027Sjungma@eit.uni-kl.de}
23112027Sjungma@eit.uni-kl.de
23212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
23312027Sjungma@eit.uni-kl.de//  CLASS : sc_uint_subref
23412027Sjungma@eit.uni-kl.de//
23512027Sjungma@eit.uni-kl.de//  Proxy class for sc_uint part selection (r-value and l-value).
23612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
23712027Sjungma@eit.uni-kl.de
23812027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_uint_subref> sc_uint_subref::m_pool(9);
23912027Sjungma@eit.uni-kl.de
24012027Sjungma@eit.uni-kl.de// assignment operators
24112027Sjungma@eit.uni-kl.de
24212027Sjungma@eit.uni-kl.desc_uint_subref&
24312027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( uint_type v )
24412027Sjungma@eit.uni-kl.de{
24512027Sjungma@eit.uni-kl.de    uint_type val = m_obj_p->m_val;
24612027Sjungma@eit.uni-kl.de    uint_type mask = mask_int[m_left][m_right];
24712027Sjungma@eit.uni-kl.de    val &= mask;
24812027Sjungma@eit.uni-kl.de    val |= (v << m_right) & ~mask;
24912027Sjungma@eit.uni-kl.de    m_obj_p->m_val = val;
25012027Sjungma@eit.uni-kl.de    m_obj_p->extend_sign();
25112027Sjungma@eit.uni-kl.de    return *this;
25212027Sjungma@eit.uni-kl.de}
25312027Sjungma@eit.uni-kl.de
25412027Sjungma@eit.uni-kl.desc_uint_subref&
25512027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_signed& a )
25612027Sjungma@eit.uni-kl.de{
25712027Sjungma@eit.uni-kl.de    sc_uint_base aa( length() );
25812027Sjungma@eit.uni-kl.de    return ( *this = aa = a );
25912027Sjungma@eit.uni-kl.de}
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.desc_uint_subref&
26212027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_unsigned& a )
26312027Sjungma@eit.uni-kl.de{
26412027Sjungma@eit.uni-kl.de    sc_uint_base aa( length() );
26512027Sjungma@eit.uni-kl.de    return ( *this = aa = a );
26612027Sjungma@eit.uni-kl.de}
26712027Sjungma@eit.uni-kl.de
26812027Sjungma@eit.uni-kl.desc_uint_subref&
26912027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_bv_base& a )
27012027Sjungma@eit.uni-kl.de{
27112027Sjungma@eit.uni-kl.de    sc_uint_base aa( length() );
27212027Sjungma@eit.uni-kl.de    return ( *this = aa = a );
27312027Sjungma@eit.uni-kl.de}
27412027Sjungma@eit.uni-kl.de
27512027Sjungma@eit.uni-kl.desc_uint_subref&
27612027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_lv_base& a )
27712027Sjungma@eit.uni-kl.de{
27812027Sjungma@eit.uni-kl.de    sc_uint_base aa( length() );
27912027Sjungma@eit.uni-kl.de    return ( *this = aa = a );
28012027Sjungma@eit.uni-kl.de}
28112027Sjungma@eit.uni-kl.de
28212027Sjungma@eit.uni-kl.de// concatenation methods:
28312027Sjungma@eit.uni-kl.de
28412027Sjungma@eit.uni-kl.de// #### OPTIMIZE
28512027Sjungma@eit.uni-kl.devoid sc_uint_subref::concat_set(int64 src, int low_i)
28612027Sjungma@eit.uni-kl.de{
28712027Sjungma@eit.uni-kl.de    sc_uint_base aa( length() );
28812027Sjungma@eit.uni-kl.de    *this = aa = (low_i < 64) ? src >> low_i : src >> 63;
28912027Sjungma@eit.uni-kl.de}
29012027Sjungma@eit.uni-kl.de
29112027Sjungma@eit.uni-kl.devoid sc_uint_subref::concat_set(const sc_signed& src, int low_i)
29212027Sjungma@eit.uni-kl.de{
29312027Sjungma@eit.uni-kl.de    sc_uint_base aa( length() );
29412027Sjungma@eit.uni-kl.de    if ( low_i < src.length() )
29512027Sjungma@eit.uni-kl.de        *this = aa = src >> low_i;
29612027Sjungma@eit.uni-kl.de    else
29712027Sjungma@eit.uni-kl.de        *this = aa = (src < 0) ? (int_type)-1 : 0;
29812027Sjungma@eit.uni-kl.de}
29912027Sjungma@eit.uni-kl.de
30012027Sjungma@eit.uni-kl.devoid sc_uint_subref::concat_set(const sc_unsigned& src, int low_i)
30112027Sjungma@eit.uni-kl.de{
30212027Sjungma@eit.uni-kl.de    sc_uint_base aa( length() );
30312027Sjungma@eit.uni-kl.de    if ( low_i < src.length() )
30412027Sjungma@eit.uni-kl.de        *this = aa = src >> low_i;
30512027Sjungma@eit.uni-kl.de    else
30612027Sjungma@eit.uni-kl.de        *this = aa = 0;
30712027Sjungma@eit.uni-kl.de}
30812027Sjungma@eit.uni-kl.de
30912027Sjungma@eit.uni-kl.devoid sc_uint_subref::concat_set(uint64 src, int low_i)
31012027Sjungma@eit.uni-kl.de{
31112027Sjungma@eit.uni-kl.de    sc_uint_base aa( length() );
31212027Sjungma@eit.uni-kl.de    *this = aa = (low_i < 64) ? src >> low_i : 0;
31312027Sjungma@eit.uni-kl.de}
31412027Sjungma@eit.uni-kl.de
31512027Sjungma@eit.uni-kl.de// other methods
31612027Sjungma@eit.uni-kl.de
31712027Sjungma@eit.uni-kl.devoid
31812027Sjungma@eit.uni-kl.desc_uint_subref::scan( ::std::istream& is )
31912027Sjungma@eit.uni-kl.de{
32012027Sjungma@eit.uni-kl.de    std::string s;
32112027Sjungma@eit.uni-kl.de    is >> s;
32212027Sjungma@eit.uni-kl.de    *this = s.c_str();
32312027Sjungma@eit.uni-kl.de}
32412027Sjungma@eit.uni-kl.de
32512027Sjungma@eit.uni-kl.de
32612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
32712027Sjungma@eit.uni-kl.de//  CLASS : sc_uint_base
32812027Sjungma@eit.uni-kl.de//
32912027Sjungma@eit.uni-kl.de//  Base class for sc_uint.
33012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
33112027Sjungma@eit.uni-kl.de
33212027Sjungma@eit.uni-kl.de// support methods
33312027Sjungma@eit.uni-kl.de
33412027Sjungma@eit.uni-kl.devoid
33512027Sjungma@eit.uni-kl.desc_uint_base::invalid_length() const
33612027Sjungma@eit.uni-kl.de{
33712027Sjungma@eit.uni-kl.de    char msg[BUFSIZ];
33812027Sjungma@eit.uni-kl.de    std::sprintf( msg,
33912027Sjungma@eit.uni-kl.de	     "sc_uint[_base] initialization: length = %d violates "
34012027Sjungma@eit.uni-kl.de	     "1 <= length <= %d",
34112027Sjungma@eit.uni-kl.de	     m_len, SC_INTWIDTH );
34212027Sjungma@eit.uni-kl.de    SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
34312027Sjungma@eit.uni-kl.de}
34412027Sjungma@eit.uni-kl.de
34512027Sjungma@eit.uni-kl.devoid
34612027Sjungma@eit.uni-kl.desc_uint_base::invalid_index( int i ) const
34712027Sjungma@eit.uni-kl.de{
34812027Sjungma@eit.uni-kl.de    char msg[BUFSIZ];
34912027Sjungma@eit.uni-kl.de    std::sprintf( msg,
35012027Sjungma@eit.uni-kl.de	     "sc_uint[_base] bit selection: index = %d violates "
35112027Sjungma@eit.uni-kl.de	     "0 <= index <= %d",
35212027Sjungma@eit.uni-kl.de	     i, m_len - 1 );
35312027Sjungma@eit.uni-kl.de    SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
35412027Sjungma@eit.uni-kl.de}
35512027Sjungma@eit.uni-kl.de
35612027Sjungma@eit.uni-kl.devoid
35712027Sjungma@eit.uni-kl.desc_uint_base::invalid_range( int l, int r ) const
35812027Sjungma@eit.uni-kl.de{
35912027Sjungma@eit.uni-kl.de    char msg[BUFSIZ];
36012027Sjungma@eit.uni-kl.de    std::sprintf( msg,
36112027Sjungma@eit.uni-kl.de	     "sc_uint[_base] part selection: left = %d, right = %d violates "
36212027Sjungma@eit.uni-kl.de	     "%d >= left >= right >= 0",
36312027Sjungma@eit.uni-kl.de	     l, r, m_len - 1 );
36412027Sjungma@eit.uni-kl.de    SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
36512027Sjungma@eit.uni-kl.de}
36612027Sjungma@eit.uni-kl.de
36712027Sjungma@eit.uni-kl.de
36812027Sjungma@eit.uni-kl.devoid
36912027Sjungma@eit.uni-kl.desc_uint_base::check_value() const
37012027Sjungma@eit.uni-kl.de{
37112027Sjungma@eit.uni-kl.de    uint_type limit = (~UINT_ZERO >> m_ulen);
37212027Sjungma@eit.uni-kl.de    if( m_val > limit ) {
37312027Sjungma@eit.uni-kl.de	char msg[BUFSIZ];
37412027Sjungma@eit.uni-kl.de	std::sprintf( msg, "sc_uint[_base]: value does not fit into a length of %d",
37512027Sjungma@eit.uni-kl.de		 m_len );
37612027Sjungma@eit.uni-kl.de	SC_REPORT_WARNING( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
37712027Sjungma@eit.uni-kl.de    }
37812027Sjungma@eit.uni-kl.de}
37912027Sjungma@eit.uni-kl.de
38012027Sjungma@eit.uni-kl.de
38112027Sjungma@eit.uni-kl.de// constructors
38212027Sjungma@eit.uni-kl.de
38312027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_bv_base& v )
38412027Sjungma@eit.uni-kl.de    : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len )
38512027Sjungma@eit.uni-kl.de{
38612027Sjungma@eit.uni-kl.de    check_length();
38712027Sjungma@eit.uni-kl.de    *this = v;
38812027Sjungma@eit.uni-kl.de}
38912027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_lv_base& v )
39012027Sjungma@eit.uni-kl.de    : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len )
39112027Sjungma@eit.uni-kl.de{
39212027Sjungma@eit.uni-kl.de    check_length();
39312027Sjungma@eit.uni-kl.de    *this = v;
39412027Sjungma@eit.uni-kl.de}
39512027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_int_subref_r& v )
39612027Sjungma@eit.uni-kl.de    : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len )
39712027Sjungma@eit.uni-kl.de{
39812027Sjungma@eit.uni-kl.de    check_length();
39912027Sjungma@eit.uni-kl.de    *this = v.to_uint64();
40012027Sjungma@eit.uni-kl.de}
40112027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_signed_subref_r& v )
40212027Sjungma@eit.uni-kl.de    : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len )
40312027Sjungma@eit.uni-kl.de{
40412027Sjungma@eit.uni-kl.de    check_length();
40512027Sjungma@eit.uni-kl.de    *this = v.to_uint64();
40612027Sjungma@eit.uni-kl.de}
40712027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_unsigned_subref_r& v )
40812027Sjungma@eit.uni-kl.de    : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len )
40912027Sjungma@eit.uni-kl.de{
41012027Sjungma@eit.uni-kl.de    check_length();
41112027Sjungma@eit.uni-kl.de    *this = v.to_uint64();
41212027Sjungma@eit.uni-kl.de}
41312027Sjungma@eit.uni-kl.de
41412027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_signed& a )
41512027Sjungma@eit.uni-kl.de    : m_val( 0 ), m_len( a.length() ), m_ulen( SC_INTWIDTH - m_len )
41612027Sjungma@eit.uni-kl.de{
41712027Sjungma@eit.uni-kl.de    check_length();
41812027Sjungma@eit.uni-kl.de#if 0
41912027Sjungma@eit.uni-kl.de    for( int i = m_len - 1; i >= 0; -- i ) {
42012027Sjungma@eit.uni-kl.de	set( i, a.test( i ) );
42112027Sjungma@eit.uni-kl.de    }
42212027Sjungma@eit.uni-kl.de    extend_sign();
42312027Sjungma@eit.uni-kl.de#else
42412027Sjungma@eit.uni-kl.de    *this = a.to_uint64();
42512027Sjungma@eit.uni-kl.de#endif
42612027Sjungma@eit.uni-kl.de}
42712027Sjungma@eit.uni-kl.de
42812027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_unsigned& a )
42912027Sjungma@eit.uni-kl.de    : m_val( 0 ), m_len( a.length() ), m_ulen( SC_INTWIDTH - m_len )
43012027Sjungma@eit.uni-kl.de{
43112027Sjungma@eit.uni-kl.de    check_length();
43212027Sjungma@eit.uni-kl.de#if 0
43312027Sjungma@eit.uni-kl.de    for( int i = m_len - 1; i >= 0; -- i ) {
43412027Sjungma@eit.uni-kl.de	set( i, a.test( i ) );
43512027Sjungma@eit.uni-kl.de    }
43612027Sjungma@eit.uni-kl.de    extend_sign();
43712027Sjungma@eit.uni-kl.de#else
43812027Sjungma@eit.uni-kl.de    *this = a.to_uint64();
43912027Sjungma@eit.uni-kl.de#endif
44012027Sjungma@eit.uni-kl.de}
44112027Sjungma@eit.uni-kl.de
44212027Sjungma@eit.uni-kl.de// assignment operators
44312027Sjungma@eit.uni-kl.de
44412027Sjungma@eit.uni-kl.desc_uint_base&
44512027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const sc_signed& a )
44612027Sjungma@eit.uni-kl.de{
44712027Sjungma@eit.uni-kl.de    int minlen = sc_min( m_len, a.length() );
44812027Sjungma@eit.uni-kl.de    int i = 0;
44912027Sjungma@eit.uni-kl.de    for( ; i < minlen; ++ i ) {
45012027Sjungma@eit.uni-kl.de	set( i, a.test( i ) );
45112027Sjungma@eit.uni-kl.de    }
45212027Sjungma@eit.uni-kl.de    bool sgn = a.sign();
45312027Sjungma@eit.uni-kl.de    for( ; i < m_len; ++ i ) {
45412027Sjungma@eit.uni-kl.de	// sign extension
45512027Sjungma@eit.uni-kl.de	set( i, sgn );
45612027Sjungma@eit.uni-kl.de    }
45712027Sjungma@eit.uni-kl.de    extend_sign();
45812027Sjungma@eit.uni-kl.de    return *this;
45912027Sjungma@eit.uni-kl.de}
46012027Sjungma@eit.uni-kl.de
46112027Sjungma@eit.uni-kl.desc_uint_base&
46212027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const sc_unsigned& a )
46312027Sjungma@eit.uni-kl.de{
46412027Sjungma@eit.uni-kl.de    int minlen = sc_min( m_len, a.length() );
46512027Sjungma@eit.uni-kl.de    int i = 0;
46612027Sjungma@eit.uni-kl.de    for( ; i < minlen; ++ i ) {
46712027Sjungma@eit.uni-kl.de	set( i, a.test( i ) );
46812027Sjungma@eit.uni-kl.de    }
46912027Sjungma@eit.uni-kl.de    for( ; i < m_len; ++ i ) {
47012027Sjungma@eit.uni-kl.de	// zero extension
47112027Sjungma@eit.uni-kl.de	set( i, 0 );
47212027Sjungma@eit.uni-kl.de    }
47312027Sjungma@eit.uni-kl.de    extend_sign();
47412027Sjungma@eit.uni-kl.de    return *this;
47512027Sjungma@eit.uni-kl.de}
47612027Sjungma@eit.uni-kl.de
47712027Sjungma@eit.uni-kl.de
47812027Sjungma@eit.uni-kl.desc_uint_base&
47912027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const sc_bv_base& a )
48012027Sjungma@eit.uni-kl.de{
48112027Sjungma@eit.uni-kl.de    int minlen = sc_min( m_len, a.length() );
48212027Sjungma@eit.uni-kl.de    int i = 0;
48312027Sjungma@eit.uni-kl.de    for( ; i < minlen; ++ i ) {
48412027Sjungma@eit.uni-kl.de	set( i, a.get_bit( i ) );
48512027Sjungma@eit.uni-kl.de    }
48612027Sjungma@eit.uni-kl.de    for( ; i < m_len; ++ i ) {
48712027Sjungma@eit.uni-kl.de	// zero extension
48812027Sjungma@eit.uni-kl.de	set( i, 0 );
48912027Sjungma@eit.uni-kl.de    }
49012027Sjungma@eit.uni-kl.de    extend_sign();
49112027Sjungma@eit.uni-kl.de    return *this;
49212027Sjungma@eit.uni-kl.de}
49312027Sjungma@eit.uni-kl.de
49412027Sjungma@eit.uni-kl.desc_uint_base&
49512027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const sc_lv_base& a )
49612027Sjungma@eit.uni-kl.de{
49712027Sjungma@eit.uni-kl.de    int minlen = sc_min( m_len, a.length() );
49812027Sjungma@eit.uni-kl.de    int i = 0;
49912027Sjungma@eit.uni-kl.de    for( ; i < minlen; ++ i ) {
50012027Sjungma@eit.uni-kl.de	set( i, sc_logic( a.get_bit( i ) ).to_bool() );
50112027Sjungma@eit.uni-kl.de    }
50212027Sjungma@eit.uni-kl.de    for( ; i < m_len; ++ i ) {
50312027Sjungma@eit.uni-kl.de	// zero extension
50412027Sjungma@eit.uni-kl.de	set( i, 0 );
50512027Sjungma@eit.uni-kl.de    }
50612027Sjungma@eit.uni-kl.de    extend_sign();
50712027Sjungma@eit.uni-kl.de    return *this;
50812027Sjungma@eit.uni-kl.de}
50912027Sjungma@eit.uni-kl.de
51012027Sjungma@eit.uni-kl.desc_uint_base&
51112027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const char* a )
51212027Sjungma@eit.uni-kl.de{
51312027Sjungma@eit.uni-kl.de    if( a == 0 ) {
51412027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_,
51512027Sjungma@eit.uni-kl.de			 "character string is zero" );
51612027Sjungma@eit.uni-kl.de    }
51712027Sjungma@eit.uni-kl.de    if( *a == 0 ) {
51812027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_,
51912027Sjungma@eit.uni-kl.de			 "character string is empty" );
52012027Sjungma@eit.uni-kl.de    }
52112027Sjungma@eit.uni-kl.de    try {
52212027Sjungma@eit.uni-kl.de	int len = m_len;
52312027Sjungma@eit.uni-kl.de	sc_ufix aa( a, len, len, SC_TRN, SC_WRAP, 0, SC_ON );
52412027Sjungma@eit.uni-kl.de	return this->operator = ( aa );
52512027Sjungma@eit.uni-kl.de    } catch( sc_core::sc_report ) {
52612027Sjungma@eit.uni-kl.de	char msg[BUFSIZ];
52712027Sjungma@eit.uni-kl.de	std::sprintf( msg, "character string '%s' is not valid", a );
52812027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_, msg );
52912027Sjungma@eit.uni-kl.de	// never reached
53012027Sjungma@eit.uni-kl.de	return *this;
53112027Sjungma@eit.uni-kl.de    }
53212027Sjungma@eit.uni-kl.de}
53312027Sjungma@eit.uni-kl.de
53412027Sjungma@eit.uni-kl.de
53512027Sjungma@eit.uni-kl.de// explicit conversion to character string
53612027Sjungma@eit.uni-kl.de
53712027Sjungma@eit.uni-kl.deconst std::string
53812027Sjungma@eit.uni-kl.desc_uint_base::to_string( sc_numrep numrep ) const
53912027Sjungma@eit.uni-kl.de{
54012027Sjungma@eit.uni-kl.de    int len = m_len;
54112027Sjungma@eit.uni-kl.de    sc_ufix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON );
54212027Sjungma@eit.uni-kl.de    return aa.to_string( numrep );
54312027Sjungma@eit.uni-kl.de}
54412027Sjungma@eit.uni-kl.de
54512027Sjungma@eit.uni-kl.deconst std::string
54612027Sjungma@eit.uni-kl.desc_uint_base::to_string( sc_numrep numrep, bool w_prefix ) const
54712027Sjungma@eit.uni-kl.de{
54812027Sjungma@eit.uni-kl.de    int len = m_len;
54912027Sjungma@eit.uni-kl.de    sc_ufix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON );
55012027Sjungma@eit.uni-kl.de    return aa.to_string( numrep, w_prefix );
55112027Sjungma@eit.uni-kl.de}
55212027Sjungma@eit.uni-kl.de
55312027Sjungma@eit.uni-kl.de
55412027Sjungma@eit.uni-kl.de// reduce methods
55512027Sjungma@eit.uni-kl.de
55612027Sjungma@eit.uni-kl.debool
55712027Sjungma@eit.uni-kl.desc_uint_base::and_reduce() const
55812027Sjungma@eit.uni-kl.de{
55912027Sjungma@eit.uni-kl.de    return ( m_val == (~UINT_ZERO >> m_ulen) );
56012027Sjungma@eit.uni-kl.de}
56112027Sjungma@eit.uni-kl.de
56212027Sjungma@eit.uni-kl.debool
56312027Sjungma@eit.uni-kl.desc_uint_base::or_reduce() const
56412027Sjungma@eit.uni-kl.de{
56512027Sjungma@eit.uni-kl.de    return ( m_val != uint_type( 0 ) );
56612027Sjungma@eit.uni-kl.de}
56712027Sjungma@eit.uni-kl.de
56812027Sjungma@eit.uni-kl.debool
56912027Sjungma@eit.uni-kl.desc_uint_base::xor_reduce() const
57012027Sjungma@eit.uni-kl.de{
57112027Sjungma@eit.uni-kl.de    uint_type mask = ~UINT_ZERO;
57212027Sjungma@eit.uni-kl.de    uint_type val = m_val;
57312027Sjungma@eit.uni-kl.de    int n = SC_INTWIDTH;
57412027Sjungma@eit.uni-kl.de    do {
57512027Sjungma@eit.uni-kl.de	n >>= 1;
57612027Sjungma@eit.uni-kl.de	mask >>= n;
57712027Sjungma@eit.uni-kl.de	val = ((val & (mask << n)) >> n) ^ (val & mask);
57812027Sjungma@eit.uni-kl.de    } while( n != 1 );
57912027Sjungma@eit.uni-kl.de    return ( val != uint_type( 0 ) );
58012027Sjungma@eit.uni-kl.de}
58112027Sjungma@eit.uni-kl.de
58212027Sjungma@eit.uni-kl.de
58312027Sjungma@eit.uni-kl.debool sc_uint_base::concat_get_ctrl( sc_digit* dst_p, int low_i ) const
58412027Sjungma@eit.uni-kl.de{
58512027Sjungma@eit.uni-kl.de    int       dst_i;       // Word in dst_p now processing.
58612027Sjungma@eit.uni-kl.de    int       end_i;       // Highest order word in dst_p to process.
58712027Sjungma@eit.uni-kl.de    int       left_shift;  // Left shift for val.
58812027Sjungma@eit.uni-kl.de    uint_type mask;        // Mask for bits to extract or keep.
58912027Sjungma@eit.uni-kl.de
59012027Sjungma@eit.uni-kl.de    dst_i = low_i / BITS_PER_DIGIT;
59112027Sjungma@eit.uni-kl.de    left_shift = low_i % BITS_PER_DIGIT;
59212027Sjungma@eit.uni-kl.de    end_i = (low_i + (m_len-1)) / BITS_PER_DIGIT;
59312027Sjungma@eit.uni-kl.de
59412027Sjungma@eit.uni-kl.de    // PROCESS THE FIRST WORD:
59512027Sjungma@eit.uni-kl.de
59612027Sjungma@eit.uni-kl.de    mask = ~((uint_type)-1 << left_shift);
59712027Sjungma@eit.uni-kl.de    dst_p[dst_i] = (sc_digit)((dst_p[dst_i] & mask));
59812027Sjungma@eit.uni-kl.de
59912027Sjungma@eit.uni-kl.de    dst_i++;
60012027Sjungma@eit.uni-kl.de    for ( ; dst_i <= end_i; dst_i++ ) dst_p[dst_i] = 0;
60112027Sjungma@eit.uni-kl.de    return false;
60212027Sjungma@eit.uni-kl.de}
60312027Sjungma@eit.uni-kl.de
60412027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
60512027Sjungma@eit.uni-kl.de//"sc_uint_base::concat_get_data"
60612027Sjungma@eit.uni-kl.de//
60712027Sjungma@eit.uni-kl.de// This method transfers the value of this object instance to the supplied
60812027Sjungma@eit.uni-kl.de// array of sc_unsigned digits starting with the bit specified by low_i within
60912027Sjungma@eit.uni-kl.de// the array of digits.
61012027Sjungma@eit.uni-kl.de//
61112027Sjungma@eit.uni-kl.de// Notes:
61212027Sjungma@eit.uni-kl.de//   (1) we don't worry about masking the high order data we transfer since
61312027Sjungma@eit.uni-kl.de//       concat_get_data() is called from low order bit to high order bit. So
61412027Sjungma@eit.uni-kl.de//       the bits above where we place ours will be filled in by someone else.
61512027Sjungma@eit.uni-kl.de//
61612027Sjungma@eit.uni-kl.de//   dst_p -> array of sc_unsigned digits to be filled in.
61712027Sjungma@eit.uni-kl.de//   low_i =  first bit within dst_p to be set.
61812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
61912027Sjungma@eit.uni-kl.debool sc_uint_base::concat_get_data( sc_digit* dst_p, int low_i ) const
62012027Sjungma@eit.uni-kl.de{
62112027Sjungma@eit.uni-kl.de    int       dst_i;       // Word in dst_p now processing.
62212027Sjungma@eit.uni-kl.de    int       end_i;       // Highest order word in dst_p to process.
62312027Sjungma@eit.uni-kl.de    int       high_i;      // Index of high order bit in dst_p to set.
62412027Sjungma@eit.uni-kl.de    int       left_shift;  // Left shift for val.
62512027Sjungma@eit.uni-kl.de    uint_type mask;        // Mask for bits to extract or keep.
62612027Sjungma@eit.uni-kl.de    bool      result;	   // True if inserting non-zero value.
62712027Sjungma@eit.uni-kl.de    uint_type val;         // Value for this object.
62812027Sjungma@eit.uni-kl.de
62912027Sjungma@eit.uni-kl.de    dst_i = low_i / BITS_PER_DIGIT;
63012027Sjungma@eit.uni-kl.de    left_shift = low_i % BITS_PER_DIGIT;
63112027Sjungma@eit.uni-kl.de    high_i = low_i + (m_len-1);
63212027Sjungma@eit.uni-kl.de    end_i = high_i / BITS_PER_DIGIT;
63312027Sjungma@eit.uni-kl.de    val = m_val;
63412027Sjungma@eit.uni-kl.de    result = val != 0;
63512027Sjungma@eit.uni-kl.de
63612027Sjungma@eit.uni-kl.de    // MASK OFF DATA TO BE TRANSFERRED BASE ON WIDTH:
63712027Sjungma@eit.uni-kl.de
63812027Sjungma@eit.uni-kl.de    if ( m_len < 64 )
63912027Sjungma@eit.uni-kl.de    {
64012027Sjungma@eit.uni-kl.de	mask = ~((uint_type)-1 << m_len);
64112027Sjungma@eit.uni-kl.de        val &=  mask;
64212027Sjungma@eit.uni-kl.de    }
64312027Sjungma@eit.uni-kl.de
64412027Sjungma@eit.uni-kl.de    // PROCESS THE FIRST WORD:
64512027Sjungma@eit.uni-kl.de
64612027Sjungma@eit.uni-kl.de    mask = ~((uint_type)-1 << left_shift);
64712027Sjungma@eit.uni-kl.de    dst_p[dst_i] = (sc_digit)(((dst_p[dst_i] & mask)) |
64812027Sjungma@eit.uni-kl.de	((val << left_shift) & DIGIT_MASK));
64912027Sjungma@eit.uni-kl.de
65012027Sjungma@eit.uni-kl.de    switch ( end_i - dst_i )
65112027Sjungma@eit.uni-kl.de    {
65212027Sjungma@eit.uni-kl.de     // BITS ARE ACROSS TWO WORDS:
65312027Sjungma@eit.uni-kl.de
65412027Sjungma@eit.uni-kl.de     case 1:
65512027Sjungma@eit.uni-kl.de	dst_i++;
65612027Sjungma@eit.uni-kl.de	val >>= (BITS_PER_DIGIT-left_shift);
65712027Sjungma@eit.uni-kl.de	dst_p[dst_i] = (sc_digit)val;
65812027Sjungma@eit.uni-kl.de	break;
65912027Sjungma@eit.uni-kl.de
66012027Sjungma@eit.uni-kl.de     // BITS ARE ACROSS THREE WORDS:
66112027Sjungma@eit.uni-kl.de
66212027Sjungma@eit.uni-kl.de     case 2:
66312027Sjungma@eit.uni-kl.de	dst_i++;
66412027Sjungma@eit.uni-kl.de	val >>= (BITS_PER_DIGIT-left_shift);
66512027Sjungma@eit.uni-kl.de	dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK);
66612027Sjungma@eit.uni-kl.de	val >>= BITS_PER_DIGIT;
66712027Sjungma@eit.uni-kl.de	dst_p[dst_i] = (sc_digit)val;
66812027Sjungma@eit.uni-kl.de	break;
66912027Sjungma@eit.uni-kl.de
67012027Sjungma@eit.uni-kl.de     // BITS ARE ACROSS FOUR WORDS:
67112027Sjungma@eit.uni-kl.de
67212027Sjungma@eit.uni-kl.de     case 3:
67312027Sjungma@eit.uni-kl.de        dst_i++;
67412027Sjungma@eit.uni-kl.de        val >>= (BITS_PER_DIGIT-left_shift);
67512027Sjungma@eit.uni-kl.de        dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK);
67612027Sjungma@eit.uni-kl.de        val >>= BITS_PER_DIGIT;
67712027Sjungma@eit.uni-kl.de        dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK);
67812027Sjungma@eit.uni-kl.de        val >>= BITS_PER_DIGIT;
67912027Sjungma@eit.uni-kl.de        dst_p[dst_i] = (sc_digit)val;
68012027Sjungma@eit.uni-kl.de        break;
68112027Sjungma@eit.uni-kl.de
68212027Sjungma@eit.uni-kl.de    }
68312027Sjungma@eit.uni-kl.de    return result;
68412027Sjungma@eit.uni-kl.de}
68512027Sjungma@eit.uni-kl.de
68612027Sjungma@eit.uni-kl.de// #### OPTIMIZE
68712027Sjungma@eit.uni-kl.devoid sc_uint_base::concat_set(int64 src, int low_i)
68812027Sjungma@eit.uni-kl.de{
68912027Sjungma@eit.uni-kl.de    *this = (low_i < 64) ? src >> low_i : src >> 63;
69012027Sjungma@eit.uni-kl.de}
69112027Sjungma@eit.uni-kl.de
69212027Sjungma@eit.uni-kl.devoid sc_uint_base::concat_set(const sc_signed& src, int low_i)
69312027Sjungma@eit.uni-kl.de{
69412027Sjungma@eit.uni-kl.de    if ( low_i < src.length() )
69512027Sjungma@eit.uni-kl.de        *this = src >> low_i;
69612027Sjungma@eit.uni-kl.de    else
69712027Sjungma@eit.uni-kl.de        *this = (src < 0) ? (int_type)-1 : 0;
69812027Sjungma@eit.uni-kl.de}
69912027Sjungma@eit.uni-kl.de
70012027Sjungma@eit.uni-kl.devoid sc_uint_base::concat_set(const sc_unsigned& src, int low_i)
70112027Sjungma@eit.uni-kl.de{
70212027Sjungma@eit.uni-kl.de    if ( low_i < src.length() )
70312027Sjungma@eit.uni-kl.de        *this = src >> low_i;
70412027Sjungma@eit.uni-kl.de    else
70512027Sjungma@eit.uni-kl.de        *this = 0;
70612027Sjungma@eit.uni-kl.de}
70712027Sjungma@eit.uni-kl.de
70812027Sjungma@eit.uni-kl.devoid sc_uint_base::concat_set(uint64 src, int low_i)
70912027Sjungma@eit.uni-kl.de{
71012027Sjungma@eit.uni-kl.de    *this = (low_i < 64) ? src >> low_i : 0;
71112027Sjungma@eit.uni-kl.de}
71212027Sjungma@eit.uni-kl.de
71312027Sjungma@eit.uni-kl.de
71412027Sjungma@eit.uni-kl.de// other methods
71512027Sjungma@eit.uni-kl.de
71612027Sjungma@eit.uni-kl.devoid
71712027Sjungma@eit.uni-kl.desc_uint_base::scan( ::std::istream& is )
71812027Sjungma@eit.uni-kl.de{
71912027Sjungma@eit.uni-kl.de    std::string s;
72012027Sjungma@eit.uni-kl.de    is >> s;
72112027Sjungma@eit.uni-kl.de    *this = s.c_str();
72212027Sjungma@eit.uni-kl.de}
72312027Sjungma@eit.uni-kl.de
72412027Sjungma@eit.uni-kl.de} // namespace sc_dt
72512027Sjungma@eit.uni-kl.de
72612027Sjungma@eit.uni-kl.de
72712027Sjungma@eit.uni-kl.de// Taf!
728