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