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.h -- A sc_int is a signed integer whose length is less than the
2312027Sjungma@eit.uni-kl.de              machine's native integer length. We provide two implementations
2412027Sjungma@eit.uni-kl.de              (i) sc_int with length between 1 - 64, and (ii) sc_int with
2512027Sjungma@eit.uni-kl.de              length between 1 - 32. Implementation (i) is the default
2612027Sjungma@eit.uni-kl.de              implementation, while implementation (ii) can be used only if
2712027Sjungma@eit.uni-kl.de              the class library is compiled with -D_32BIT_. Unlike arbitrary
2812027Sjungma@eit.uni-kl.de              precision, arithmetic and bitwise operations are performed
2912027Sjungma@eit.uni-kl.de              using the native types (hence capped at 32/64 bits). The sc_int
3012027Sjungma@eit.uni-kl.de              integer is useful when the user does not need arbitrary
3112027Sjungma@eit.uni-kl.de              precision and the performance is superior to
3212027Sjungma@eit.uni-kl.de              sc_bigint/sc_biguint.
3312027Sjungma@eit.uni-kl.de
3412027Sjungma@eit.uni-kl.de  Original Author: Amit Rao, Synopsys, Inc.
3512027Sjungma@eit.uni-kl.de
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  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
4112027Sjungma@eit.uni-kl.de  changes you are making here.
4212027Sjungma@eit.uni-kl.de
4312027Sjungma@eit.uni-kl.de      Name, Affiliation, Date: Ali Dasdan, Synopsys, Inc.
4412027Sjungma@eit.uni-kl.de  Description of Modification: - Resolved ambiguity with sc_(un)signed.
4512027Sjungma@eit.uni-kl.de                               - Merged the code for 64- and 32-bit versions
4612027Sjungma@eit.uni-kl.de                                 via the constants in sc_nbdefs.h.
4712027Sjungma@eit.uni-kl.de                               - Eliminated redundant file inclusions.
4812027Sjungma@eit.uni-kl.de
4912027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
5012027Sjungma@eit.uni-kl.de  Description of Modification:
5112027Sjungma@eit.uni-kl.de
5212027Sjungma@eit.uni-kl.de *****************************************************************************/
5312027Sjungma@eit.uni-kl.de
5412027Sjungma@eit.uni-kl.de// $Log: sc_int_base.h,v $
5512027Sjungma@eit.uni-kl.de// Revision 1.3  2011/08/24 22:05:45  acg
5612027Sjungma@eit.uni-kl.de//  Torsten Maehne: initialization changes to remove warnings.
5712027Sjungma@eit.uni-kl.de//
5812027Sjungma@eit.uni-kl.de// Revision 1.2  2011/02/18 20:19:15  acg
5912027Sjungma@eit.uni-kl.de//  Andy Goodrich: updating Copyright notice.
6012027Sjungma@eit.uni-kl.de//
6112027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
6212027Sjungma@eit.uni-kl.de// SystemC 2.3
6312027Sjungma@eit.uni-kl.de//
6412027Sjungma@eit.uni-kl.de// Revision 1.4  2006/05/08 17:50:01  acg
6512027Sjungma@eit.uni-kl.de//   Andy Goodrich: Added David Long's declarations for friend operators,
6612027Sjungma@eit.uni-kl.de//   functions, and methods, to keep the Microsoft compiler happy.
6712027Sjungma@eit.uni-kl.de//
6812027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:49:31  acg
6912027Sjungma@eit.uni-kl.de// Added $Log command so that CVS check in comments are reproduced in the
7012027Sjungma@eit.uni-kl.de// source.
7112027Sjungma@eit.uni-kl.de//
7212027Sjungma@eit.uni-kl.de
7312027Sjungma@eit.uni-kl.de#ifndef SC_INT_BASE_H
7412027Sjungma@eit.uni-kl.de#define SC_INT_BASE_H
7512027Sjungma@eit.uni-kl.de
7612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_object.h"
7712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/misc/sc_value_base.h"
7812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_ids.h"
7912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_length_param.h"
8012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_nbdefs.h"
8112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h"
8212027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_iostream.h"
8312027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_temporary.h"
8412027Sjungma@eit.uni-kl.de
8512027Sjungma@eit.uni-kl.de
8612027Sjungma@eit.uni-kl.denamespace sc_dt
8712027Sjungma@eit.uni-kl.de{
8812027Sjungma@eit.uni-kl.de
8912027Sjungma@eit.uni-kl.declass sc_concatref;
9012027Sjungma@eit.uni-kl.de
9112027Sjungma@eit.uni-kl.de// classes defined in this module
9212027Sjungma@eit.uni-kl.declass sc_int_bitref_r;
9312027Sjungma@eit.uni-kl.declass sc_int_bitref;
9412027Sjungma@eit.uni-kl.declass sc_int_subref_r;
9512027Sjungma@eit.uni-kl.declass sc_int_subref;
9612027Sjungma@eit.uni-kl.declass sc_int_base;
9712027Sjungma@eit.uni-kl.declass sc_signed_subref_r;
9812027Sjungma@eit.uni-kl.declass sc_unsigned_subref_r;
9912027Sjungma@eit.uni-kl.de
10012027Sjungma@eit.uni-kl.de// forward class declarations
10112027Sjungma@eit.uni-kl.declass sc_bv_base;
10212027Sjungma@eit.uni-kl.declass sc_lv_base;
10312027Sjungma@eit.uni-kl.declass sc_signed;
10412027Sjungma@eit.uni-kl.declass sc_unsigned;
10512027Sjungma@eit.uni-kl.declass sc_fxval;
10612027Sjungma@eit.uni-kl.declass sc_fxval_fast;
10712027Sjungma@eit.uni-kl.declass sc_fxnum;
10812027Sjungma@eit.uni-kl.declass sc_fxnum_fast;
10912027Sjungma@eit.uni-kl.de
11012027Sjungma@eit.uni-kl.de
11112027Sjungma@eit.uni-kl.deextern const uint_type mask_int[SC_INTWIDTH][SC_INTWIDTH];
11212027Sjungma@eit.uni-kl.de
11312027Sjungma@eit.uni-kl.de// friend operator declarations
11412027Sjungma@eit.uni-kl.de    // relational operators
11512027Sjungma@eit.uni-kl.de
11612027Sjungma@eit.uni-kl.de    inline bool operator == ( const sc_int_base& a, const sc_int_base& b );
11712027Sjungma@eit.uni-kl.de
11812027Sjungma@eit.uni-kl.de    inline bool operator != ( const sc_int_base& a, const sc_int_base& b );
11912027Sjungma@eit.uni-kl.de
12012027Sjungma@eit.uni-kl.de    inline bool operator <  ( const sc_int_base& a, const sc_int_base& b );
12112027Sjungma@eit.uni-kl.de
12212027Sjungma@eit.uni-kl.de    inline bool operator <= ( const sc_int_base& a, const sc_int_base& b );
12312027Sjungma@eit.uni-kl.de
12412027Sjungma@eit.uni-kl.de    inline bool operator >  ( const sc_int_base& a, const sc_int_base& b );
12512027Sjungma@eit.uni-kl.de
12612027Sjungma@eit.uni-kl.de    inline bool operator >= ( const sc_int_base& a, const sc_int_base& b );
12712027Sjungma@eit.uni-kl.de
12812027Sjungma@eit.uni-kl.de
12912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
13012027Sjungma@eit.uni-kl.de//  CLASS : sc_int_bitref_r
13112027Sjungma@eit.uni-kl.de//
13212027Sjungma@eit.uni-kl.de//  Proxy class for sc_int bit selection (r-value only).
13312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
13412027Sjungma@eit.uni-kl.de
13512027Sjungma@eit.uni-kl.declass sc_int_bitref_r : public sc_value_base
13612027Sjungma@eit.uni-kl.de{
13712027Sjungma@eit.uni-kl.de    friend class sc_int_base;
13812027Sjungma@eit.uni-kl.de
13912027Sjungma@eit.uni-kl.deprotected:
14012027Sjungma@eit.uni-kl.de
14112027Sjungma@eit.uni-kl.de    // constructor
14212027Sjungma@eit.uni-kl.de
14312027Sjungma@eit.uni-kl.de    sc_int_bitref_r() : sc_value_base(), m_index(), m_obj_p()
14412027Sjungma@eit.uni-kl.de        {}
14512027Sjungma@eit.uni-kl.de
14612027Sjungma@eit.uni-kl.de    // initializer for sc_core::sc_vpool:
14712027Sjungma@eit.uni-kl.de
14812027Sjungma@eit.uni-kl.de    void initialize( const sc_int_base* obj_p, int index_ )
14912027Sjungma@eit.uni-kl.de    {
15012027Sjungma@eit.uni-kl.de	m_obj_p = (sc_int_base*)obj_p;
15112027Sjungma@eit.uni-kl.de	m_index = index_;
15212027Sjungma@eit.uni-kl.de    }
15312027Sjungma@eit.uni-kl.de
15412027Sjungma@eit.uni-kl.depublic:
15512027Sjungma@eit.uni-kl.de
15612027Sjungma@eit.uni-kl.de    // copy constructor
15712027Sjungma@eit.uni-kl.de
15812027Sjungma@eit.uni-kl.de    sc_int_bitref_r( const sc_int_bitref_r& a ) :
15912027Sjungma@eit.uni-kl.de        sc_value_base(a), m_index(a.m_index), m_obj_p(a.m_obj_p)
16012027Sjungma@eit.uni-kl.de        {}
16112027Sjungma@eit.uni-kl.de
16212027Sjungma@eit.uni-kl.de    // destructor
16312027Sjungma@eit.uni-kl.de
16412027Sjungma@eit.uni-kl.de    virtual ~sc_int_bitref_r()
16512027Sjungma@eit.uni-kl.de	{}
16612027Sjungma@eit.uni-kl.de
16712027Sjungma@eit.uni-kl.de    // capacity
16812027Sjungma@eit.uni-kl.de
16912027Sjungma@eit.uni-kl.de    int length() const
17012027Sjungma@eit.uni-kl.de	{ return 1; }
17112027Sjungma@eit.uni-kl.de
17212027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED
17312027Sjungma@eit.uni-kl.de    int bitwidth() const
17412027Sjungma@eit.uni-kl.de	{ return length(); }
17512027Sjungma@eit.uni-kl.de#endif
17612027Sjungma@eit.uni-kl.de
17712027Sjungma@eit.uni-kl.de    // concatenation support
17812027Sjungma@eit.uni-kl.de
17912027Sjungma@eit.uni-kl.de    virtual int concat_length( bool *xz_present_p ) const
18012027Sjungma@eit.uni-kl.de	{ if (xz_present_p) *xz_present_p = false; return 1; }
18112027Sjungma@eit.uni-kl.de    virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const
18212027Sjungma@eit.uni-kl.de        {
18312027Sjungma@eit.uni-kl.de	    int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
18412027Sjungma@eit.uni-kl.de	    int word_i = low_i / BITS_PER_DIGIT;
18512027Sjungma@eit.uni-kl.de
18612027Sjungma@eit.uni-kl.de	    dst_p[word_i] &= ~bit_mask;
18712027Sjungma@eit.uni-kl.de	    return false;
18812027Sjungma@eit.uni-kl.de	}
18912027Sjungma@eit.uni-kl.de    virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const
19012027Sjungma@eit.uni-kl.de        {
19112027Sjungma@eit.uni-kl.de	    bool non_zero;
19212027Sjungma@eit.uni-kl.de	    int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
19312027Sjungma@eit.uni-kl.de	    int word_i = low_i / BITS_PER_DIGIT;
19412027Sjungma@eit.uni-kl.de
19512027Sjungma@eit.uni-kl.de	    if ( operator uint64() )
19612027Sjungma@eit.uni-kl.de	    {
19712027Sjungma@eit.uni-kl.de		dst_p[word_i] |= bit_mask;
19812027Sjungma@eit.uni-kl.de		non_zero = true;
19912027Sjungma@eit.uni-kl.de	    }
20012027Sjungma@eit.uni-kl.de	    else
20112027Sjungma@eit.uni-kl.de	    {
20212027Sjungma@eit.uni-kl.de		dst_p[word_i] &= ~bit_mask;
20312027Sjungma@eit.uni-kl.de		non_zero = false;
20412027Sjungma@eit.uni-kl.de	    }
20512027Sjungma@eit.uni-kl.de	    return non_zero;
20612027Sjungma@eit.uni-kl.de	}
20712027Sjungma@eit.uni-kl.de    virtual uint64 concat_get_uint64() const
20812027Sjungma@eit.uni-kl.de	{ return operator uint64(); }
20912027Sjungma@eit.uni-kl.de
21012027Sjungma@eit.uni-kl.de
21112027Sjungma@eit.uni-kl.de
21212027Sjungma@eit.uni-kl.de
21312027Sjungma@eit.uni-kl.de    // implicit conversions
21412027Sjungma@eit.uni-kl.de
21512027Sjungma@eit.uni-kl.de    operator uint64 () const;
21612027Sjungma@eit.uni-kl.de    bool operator ! () const;
21712027Sjungma@eit.uni-kl.de    bool operator ~ () const;
21812027Sjungma@eit.uni-kl.de
21912027Sjungma@eit.uni-kl.de
22012027Sjungma@eit.uni-kl.de    // explicit conversions
22112027Sjungma@eit.uni-kl.de
22212027Sjungma@eit.uni-kl.de    uint64 value() const
22312027Sjungma@eit.uni-kl.de	{ return operator uint64(); }
22412027Sjungma@eit.uni-kl.de
22512027Sjungma@eit.uni-kl.de    bool to_bool() const
22612027Sjungma@eit.uni-kl.de	{ return operator uint64(); }
22712027Sjungma@eit.uni-kl.de
22812027Sjungma@eit.uni-kl.de
22912027Sjungma@eit.uni-kl.de    // other methods
23012027Sjungma@eit.uni-kl.de
23112027Sjungma@eit.uni-kl.de    void print( ::std::ostream& os = ::std::cout ) const
23212027Sjungma@eit.uni-kl.de	{ os << to_bool(); }
23312027Sjungma@eit.uni-kl.de
23412027Sjungma@eit.uni-kl.deprotected:
23512027Sjungma@eit.uni-kl.de    int          m_index;
23612027Sjungma@eit.uni-kl.de    sc_int_base* m_obj_p;
23712027Sjungma@eit.uni-kl.de
23812027Sjungma@eit.uni-kl.deprivate:
23912027Sjungma@eit.uni-kl.de
24012027Sjungma@eit.uni-kl.de    // disabled
24112027Sjungma@eit.uni-kl.de    sc_int_bitref_r& operator = ( const sc_int_bitref_r& );
24212027Sjungma@eit.uni-kl.de};
24312027Sjungma@eit.uni-kl.de
24412027Sjungma@eit.uni-kl.de
24512027Sjungma@eit.uni-kl.deinline
24612027Sjungma@eit.uni-kl.de::std::ostream&
24712027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream&, const sc_int_bitref_r& );
24812027Sjungma@eit.uni-kl.de
24912027Sjungma@eit.uni-kl.de
25012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
25112027Sjungma@eit.uni-kl.de//  CLASS : sc_int_bitref
25212027Sjungma@eit.uni-kl.de//
25312027Sjungma@eit.uni-kl.de//  Proxy class for sc_int bit selection (r-value and l-value).
25412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
25512027Sjungma@eit.uni-kl.de
25612027Sjungma@eit.uni-kl.declass sc_int_bitref
25712027Sjungma@eit.uni-kl.de    : public sc_int_bitref_r
25812027Sjungma@eit.uni-kl.de{
25912027Sjungma@eit.uni-kl.de    friend class sc_int_base;
26012027Sjungma@eit.uni-kl.de    friend class sc_core::sc_vpool<sc_int_bitref>;
26112027Sjungma@eit.uni-kl.de
26212027Sjungma@eit.uni-kl.de
26312027Sjungma@eit.uni-kl.de    // constructor
26412027Sjungma@eit.uni-kl.de
26512027Sjungma@eit.uni-kl.de    sc_int_bitref() : sc_int_bitref_r()
26612027Sjungma@eit.uni-kl.de      {}
26712027Sjungma@eit.uni-kl.de
26812027Sjungma@eit.uni-kl.de
26912027Sjungma@eit.uni-kl.depublic:
27012027Sjungma@eit.uni-kl.de
27112027Sjungma@eit.uni-kl.de    // copy constructor
27212027Sjungma@eit.uni-kl.de
27312027Sjungma@eit.uni-kl.de    sc_int_bitref( const sc_int_bitref& a ) : sc_int_bitref_r( a )
27412027Sjungma@eit.uni-kl.de      {}
27512027Sjungma@eit.uni-kl.de
27612027Sjungma@eit.uni-kl.de    // assignment operators
27712027Sjungma@eit.uni-kl.de
27812027Sjungma@eit.uni-kl.de    sc_int_bitref& operator = ( const sc_int_bitref_r& b );
27912027Sjungma@eit.uni-kl.de    sc_int_bitref& operator = ( const sc_int_bitref& b );
28012027Sjungma@eit.uni-kl.de    sc_int_bitref& operator = ( bool b );
28112027Sjungma@eit.uni-kl.de
28212027Sjungma@eit.uni-kl.de    sc_int_bitref& operator &= ( bool b );
28312027Sjungma@eit.uni-kl.de    sc_int_bitref& operator |= ( bool b );
28412027Sjungma@eit.uni-kl.de    sc_int_bitref& operator ^= ( bool b );
28512027Sjungma@eit.uni-kl.de
28612027Sjungma@eit.uni-kl.de	// concatenation methods
28712027Sjungma@eit.uni-kl.de
28812027Sjungma@eit.uni-kl.de    virtual void concat_set(int64 src, int low_i);
28912027Sjungma@eit.uni-kl.de    virtual void concat_set(const sc_signed& src, int low_i);
29012027Sjungma@eit.uni-kl.de    virtual void concat_set(const sc_unsigned& src, int low_i);
29112027Sjungma@eit.uni-kl.de    virtual void concat_set(uint64 src, int low_i);
29212027Sjungma@eit.uni-kl.de
29312027Sjungma@eit.uni-kl.de
29412027Sjungma@eit.uni-kl.de    // other methods
29512027Sjungma@eit.uni-kl.de
29612027Sjungma@eit.uni-kl.de    void scan( ::std::istream& is = ::std::cin );
29712027Sjungma@eit.uni-kl.de
29812027Sjungma@eit.uni-kl.depublic:
29912027Sjungma@eit.uni-kl.de    static sc_core::sc_vpool<sc_int_bitref> m_pool;
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.de};
30212027Sjungma@eit.uni-kl.de
30312027Sjungma@eit.uni-kl.de
30412027Sjungma@eit.uni-kl.de
30512027Sjungma@eit.uni-kl.deinline
30612027Sjungma@eit.uni-kl.de::std::istream&
30712027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream&, sc_int_bitref& );
30812027Sjungma@eit.uni-kl.de
30912027Sjungma@eit.uni-kl.de
31012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
31112027Sjungma@eit.uni-kl.de//  CLASS : sc_int_subref_r
31212027Sjungma@eit.uni-kl.de//
31312027Sjungma@eit.uni-kl.de//  Proxy class for sc_int part selection (r-value only).
31412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
31512027Sjungma@eit.uni-kl.de
31612027Sjungma@eit.uni-kl.declass sc_int_subref_r : public sc_value_base
31712027Sjungma@eit.uni-kl.de{
31812027Sjungma@eit.uni-kl.de    friend class sc_int_base;
31912027Sjungma@eit.uni-kl.de    friend class sc_int_signal;
32012027Sjungma@eit.uni-kl.de    friend class sc_int_subref;
32112027Sjungma@eit.uni-kl.de
32212027Sjungma@eit.uni-kl.deprotected:
32312027Sjungma@eit.uni-kl.de
32412027Sjungma@eit.uni-kl.de    // constructor
32512027Sjungma@eit.uni-kl.de
32612027Sjungma@eit.uni-kl.de    sc_int_subref_r() : sc_value_base(), m_left(0), m_obj_p(0), m_right(0)
32712027Sjungma@eit.uni-kl.de        {}
32812027Sjungma@eit.uni-kl.de
32912027Sjungma@eit.uni-kl.de    // initializer for sc_core::sc_vpool:
33012027Sjungma@eit.uni-kl.de
33112027Sjungma@eit.uni-kl.de    void initialize( const sc_int_base* obj_p, int left_i, int right_i )
33212027Sjungma@eit.uni-kl.de    {
33312027Sjungma@eit.uni-kl.de	m_obj_p = (sc_int_base*)obj_p;
33412027Sjungma@eit.uni-kl.de	m_left = left_i;
33512027Sjungma@eit.uni-kl.de	m_right = right_i;
33612027Sjungma@eit.uni-kl.de    }
33712027Sjungma@eit.uni-kl.de
33812027Sjungma@eit.uni-kl.de
33912027Sjungma@eit.uni-kl.depublic:
34012027Sjungma@eit.uni-kl.de    // copy constructor
34112027Sjungma@eit.uni-kl.de
34212027Sjungma@eit.uni-kl.de    sc_int_subref_r( const sc_int_subref_r& a ) :
34312027Sjungma@eit.uni-kl.de        sc_value_base(a), m_left( a.m_left ), m_obj_p( a.m_obj_p ),
34412027Sjungma@eit.uni-kl.de	m_right( a.m_right )
34512027Sjungma@eit.uni-kl.de        {}
34612027Sjungma@eit.uni-kl.de
34712027Sjungma@eit.uni-kl.de    // destructor
34812027Sjungma@eit.uni-kl.de
34912027Sjungma@eit.uni-kl.de    virtual ~sc_int_subref_r()
35012027Sjungma@eit.uni-kl.de	{}
35112027Sjungma@eit.uni-kl.de
35212027Sjungma@eit.uni-kl.de    // capacity
35312027Sjungma@eit.uni-kl.de
35412027Sjungma@eit.uni-kl.de    int length() const
35512027Sjungma@eit.uni-kl.de        { return ( m_left - m_right + 1 ); }
35612027Sjungma@eit.uni-kl.de
35712027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED
35812027Sjungma@eit.uni-kl.de    int bitwidth() const
35912027Sjungma@eit.uni-kl.de	{ return length(); }
36012027Sjungma@eit.uni-kl.de#endif
36112027Sjungma@eit.uni-kl.de
36212027Sjungma@eit.uni-kl.de    // concatenation support
36312027Sjungma@eit.uni-kl.de
36412027Sjungma@eit.uni-kl.de    virtual int concat_length(bool* xz_present_p) const
36512027Sjungma@eit.uni-kl.de	{ if ( xz_present_p ) *xz_present_p = false; return length(); }
36612027Sjungma@eit.uni-kl.de    virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
36712027Sjungma@eit.uni-kl.de    virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
36812027Sjungma@eit.uni-kl.de    virtual uint64 concat_get_uint64() const
36912027Sjungma@eit.uni-kl.de    {
37012027Sjungma@eit.uni-kl.de	int    len = length();
37112027Sjungma@eit.uni-kl.de	uint64 val = operator uint_type();
37212027Sjungma@eit.uni-kl.de	if ( len < 64 )
37312027Sjungma@eit.uni-kl.de	    return (uint64)(val & ~((uint_type)-1 << len));
37412027Sjungma@eit.uni-kl.de	else
37512027Sjungma@eit.uni-kl.de	    return (uint64)val;
37612027Sjungma@eit.uni-kl.de    }
37712027Sjungma@eit.uni-kl.de
37812027Sjungma@eit.uni-kl.de    // reduce methods
37912027Sjungma@eit.uni-kl.de
38012027Sjungma@eit.uni-kl.de    bool and_reduce() const;
38112027Sjungma@eit.uni-kl.de
38212027Sjungma@eit.uni-kl.de    bool nand_reduce() const
38312027Sjungma@eit.uni-kl.de	{ return ( ! and_reduce() ); }
38412027Sjungma@eit.uni-kl.de
38512027Sjungma@eit.uni-kl.de    bool or_reduce() const;
38612027Sjungma@eit.uni-kl.de
38712027Sjungma@eit.uni-kl.de    bool nor_reduce() const
38812027Sjungma@eit.uni-kl.de	{ return ( ! or_reduce() ); }
38912027Sjungma@eit.uni-kl.de
39012027Sjungma@eit.uni-kl.de    bool xor_reduce() const;
39112027Sjungma@eit.uni-kl.de
39212027Sjungma@eit.uni-kl.de    bool xnor_reduce() const
39312027Sjungma@eit.uni-kl.de	{ return ( ! xor_reduce() ); }
39412027Sjungma@eit.uni-kl.de
39512027Sjungma@eit.uni-kl.de
39612027Sjungma@eit.uni-kl.de    // implicit conversion to uint_type
39712027Sjungma@eit.uni-kl.de
39812027Sjungma@eit.uni-kl.de    operator uint_type () const;
39912027Sjungma@eit.uni-kl.de
40012027Sjungma@eit.uni-kl.de
40112027Sjungma@eit.uni-kl.de    // explicit conversions
40212027Sjungma@eit.uni-kl.de
40312027Sjungma@eit.uni-kl.de    uint_type value() const
40412027Sjungma@eit.uni-kl.de	{ return operator uint_type(); }
40512027Sjungma@eit.uni-kl.de
40612027Sjungma@eit.uni-kl.de
40712027Sjungma@eit.uni-kl.de    int           to_int() const;
40812027Sjungma@eit.uni-kl.de    unsigned int  to_uint() const;
40912027Sjungma@eit.uni-kl.de    long          to_long() const;
41012027Sjungma@eit.uni-kl.de    unsigned long to_ulong() const;
41112027Sjungma@eit.uni-kl.de    int64         to_int64() const;
41212027Sjungma@eit.uni-kl.de    uint64        to_uint64() const;
41312027Sjungma@eit.uni-kl.de    double        to_double() const;
41412027Sjungma@eit.uni-kl.de
41512027Sjungma@eit.uni-kl.de
41612027Sjungma@eit.uni-kl.de    // explicit conversion to character string
41712027Sjungma@eit.uni-kl.de
41812027Sjungma@eit.uni-kl.de    const std::string to_string( sc_numrep numrep = SC_DEC ) const;
41912027Sjungma@eit.uni-kl.de    const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
42012027Sjungma@eit.uni-kl.de
42112027Sjungma@eit.uni-kl.de
42212027Sjungma@eit.uni-kl.de    // other methods
42312027Sjungma@eit.uni-kl.de
42412027Sjungma@eit.uni-kl.de    void print( ::std::ostream& os = ::std::cout ) const
42512027Sjungma@eit.uni-kl.de	{ os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
42612027Sjungma@eit.uni-kl.de
42712027Sjungma@eit.uni-kl.deprotected:
42812027Sjungma@eit.uni-kl.de
42912027Sjungma@eit.uni-kl.de    int          m_left;
43012027Sjungma@eit.uni-kl.de    sc_int_base* m_obj_p;
43112027Sjungma@eit.uni-kl.de    int          m_right;
43212027Sjungma@eit.uni-kl.de
43312027Sjungma@eit.uni-kl.deprivate:
43412027Sjungma@eit.uni-kl.de    const sc_int_subref_r& operator = ( const sc_int_subref_r& );
43512027Sjungma@eit.uni-kl.de};
43612027Sjungma@eit.uni-kl.de
43712027Sjungma@eit.uni-kl.de
43812027Sjungma@eit.uni-kl.de
43912027Sjungma@eit.uni-kl.deinline
44012027Sjungma@eit.uni-kl.de::std::ostream&
44112027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream&, const sc_int_subref_r& );
44212027Sjungma@eit.uni-kl.de
44312027Sjungma@eit.uni-kl.de
44412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
44512027Sjungma@eit.uni-kl.de//  CLASS : sc_int_subref
44612027Sjungma@eit.uni-kl.de//
44712027Sjungma@eit.uni-kl.de//  Proxy class for sc_int part selection (r-value and l-value).
44812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
44912027Sjungma@eit.uni-kl.de
45012027Sjungma@eit.uni-kl.declass sc_int_subref
45112027Sjungma@eit.uni-kl.de    : public sc_int_subref_r
45212027Sjungma@eit.uni-kl.de{
45312027Sjungma@eit.uni-kl.de    friend class sc_int_base;
45412027Sjungma@eit.uni-kl.de    friend class sc_core::sc_vpool<sc_int_subref>;
45512027Sjungma@eit.uni-kl.de
45612027Sjungma@eit.uni-kl.de
45712027Sjungma@eit.uni-kl.deprotected:
45812027Sjungma@eit.uni-kl.de
45912027Sjungma@eit.uni-kl.de    // constructor
46012027Sjungma@eit.uni-kl.de    sc_int_subref() : sc_int_subref_r()
46112027Sjungma@eit.uni-kl.de        {}
46212027Sjungma@eit.uni-kl.de
46312027Sjungma@eit.uni-kl.depublic:
46412027Sjungma@eit.uni-kl.de
46512027Sjungma@eit.uni-kl.de    // copy constructor
46612027Sjungma@eit.uni-kl.de
46712027Sjungma@eit.uni-kl.de    sc_int_subref( const sc_int_subref& a ) : sc_int_subref_r( a )
46812027Sjungma@eit.uni-kl.de        {}
46912027Sjungma@eit.uni-kl.de
47012027Sjungma@eit.uni-kl.de    // assignment operators
47112027Sjungma@eit.uni-kl.de
47212027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( int_type v );
47312027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const sc_int_base& a );
47412027Sjungma@eit.uni-kl.de
47512027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const sc_int_subref_r& a )
47612027Sjungma@eit.uni-kl.de	{ return operator = ( a.operator uint_type() ); }
47712027Sjungma@eit.uni-kl.de
47812027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const sc_int_subref& a )
47912027Sjungma@eit.uni-kl.de	{ return operator = ( a.operator uint_type() ); }
48012027Sjungma@eit.uni-kl.de
48112027Sjungma@eit.uni-kl.de    template< class T >
48212027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const sc_generic_base<T>& a )
48312027Sjungma@eit.uni-kl.de        { return operator = ( a->to_int64() ); }
48412027Sjungma@eit.uni-kl.de
48512027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const char* a );
48612027Sjungma@eit.uni-kl.de
48712027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( unsigned long a )
48812027Sjungma@eit.uni-kl.de	{ return operator = ( (int_type) a ); }
48912027Sjungma@eit.uni-kl.de
49012027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( long a )
49112027Sjungma@eit.uni-kl.de	{ return operator = ( (int_type) a ); }
49212027Sjungma@eit.uni-kl.de
49312027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( unsigned int a )
49412027Sjungma@eit.uni-kl.de	{ return operator = ( (int_type) a ); }
49512027Sjungma@eit.uni-kl.de
49612027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( int a )
49712027Sjungma@eit.uni-kl.de	{ return operator = ( (int_type) a ); }
49812027Sjungma@eit.uni-kl.de
49912027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( uint64 a )
50012027Sjungma@eit.uni-kl.de	{ return operator = ( (int_type) a ); }
50112027Sjungma@eit.uni-kl.de
50212027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( double a )
50312027Sjungma@eit.uni-kl.de	{ return operator = ( (int_type) a ); }
50412027Sjungma@eit.uni-kl.de
50512027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const sc_signed& );
50612027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const sc_unsigned& );
50712027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const sc_bv_base& );
50812027Sjungma@eit.uni-kl.de    sc_int_subref& operator = ( const sc_lv_base& );
50912027Sjungma@eit.uni-kl.de
51012027Sjungma@eit.uni-kl.de	// concatenation methods
51112027Sjungma@eit.uni-kl.de
51212027Sjungma@eit.uni-kl.de    virtual void concat_set(int64 src, int low_i);
51312027Sjungma@eit.uni-kl.de    virtual void concat_set(const sc_signed& src, int low_i);
51412027Sjungma@eit.uni-kl.de    virtual void concat_set(const sc_unsigned& src, int low_i);
51512027Sjungma@eit.uni-kl.de    virtual void concat_set(uint64 src, int low_i);
51612027Sjungma@eit.uni-kl.de
51712027Sjungma@eit.uni-kl.de    // other methods
51812027Sjungma@eit.uni-kl.de
51912027Sjungma@eit.uni-kl.de    void scan( ::std::istream& is = ::std::cin );
52012027Sjungma@eit.uni-kl.de
52112027Sjungma@eit.uni-kl.depublic:
52212027Sjungma@eit.uni-kl.de    static sc_core::sc_vpool<sc_int_subref> m_pool;
52312027Sjungma@eit.uni-kl.de
52412027Sjungma@eit.uni-kl.de};
52512027Sjungma@eit.uni-kl.de
52612027Sjungma@eit.uni-kl.de
52712027Sjungma@eit.uni-kl.de
52812027Sjungma@eit.uni-kl.deinline
52912027Sjungma@eit.uni-kl.de::std::istream&
53012027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream&, sc_int_subref& );
53112027Sjungma@eit.uni-kl.de
53212027Sjungma@eit.uni-kl.de
53312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
53412027Sjungma@eit.uni-kl.de//  CLASS : sc_int_base
53512027Sjungma@eit.uni-kl.de//
53612027Sjungma@eit.uni-kl.de//  Base class for sc_int.
53712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
53812027Sjungma@eit.uni-kl.de
53912027Sjungma@eit.uni-kl.declass sc_int_base : public sc_value_base
54012027Sjungma@eit.uni-kl.de{
54112027Sjungma@eit.uni-kl.de    friend class sc_int_bitref_r;
54212027Sjungma@eit.uni-kl.de    friend class sc_int_bitref;
54312027Sjungma@eit.uni-kl.de    friend class sc_int_subref_r;
54412027Sjungma@eit.uni-kl.de    friend class sc_int_subref;
54512027Sjungma@eit.uni-kl.de
54612027Sjungma@eit.uni-kl.de
54712027Sjungma@eit.uni-kl.de    // support methods
54812027Sjungma@eit.uni-kl.de
54912027Sjungma@eit.uni-kl.de    void invalid_length() const;
55012027Sjungma@eit.uni-kl.de    void invalid_index( int i ) const;
55112027Sjungma@eit.uni-kl.de    void invalid_range( int l, int r ) const;
55212027Sjungma@eit.uni-kl.de
55312027Sjungma@eit.uni-kl.de    void check_length() const
55412027Sjungma@eit.uni-kl.de	{ if( m_len <= 0 || m_len > SC_INTWIDTH ) { invalid_length(); } }
55512027Sjungma@eit.uni-kl.de
55612027Sjungma@eit.uni-kl.de    void check_index( int i ) const
55712027Sjungma@eit.uni-kl.de	{ if( i < 0 || i >= m_len ) { invalid_index( i ); } }
55812027Sjungma@eit.uni-kl.de
55912027Sjungma@eit.uni-kl.de    void check_range( int l, int r ) const
56012027Sjungma@eit.uni-kl.de	{ if( r < 0 || l >= m_len || l < r ) { invalid_range( l, r ); } }
56112027Sjungma@eit.uni-kl.de
56212027Sjungma@eit.uni-kl.de    void check_value() const;
56312027Sjungma@eit.uni-kl.de
56412027Sjungma@eit.uni-kl.de    void extend_sign()
56512027Sjungma@eit.uni-kl.de	{
56612027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
56712027Sjungma@eit.uni-kl.de	    check_value();
56812027Sjungma@eit.uni-kl.de#endif
56912027Sjungma@eit.uni-kl.de	    m_val = ( m_val << m_ulen >> m_ulen );
57012027Sjungma@eit.uni-kl.de	}
57112027Sjungma@eit.uni-kl.de
57212027Sjungma@eit.uni-kl.depublic:
57312027Sjungma@eit.uni-kl.de
57412027Sjungma@eit.uni-kl.de    // constructors
57512027Sjungma@eit.uni-kl.de
57612027Sjungma@eit.uni-kl.de    explicit sc_int_base( int w = sc_length_param().len() )
57712027Sjungma@eit.uni-kl.de	: m_val( 0 ), m_len( w ), m_ulen( SC_INTWIDTH - m_len )
57812027Sjungma@eit.uni-kl.de	{ check_length(); }
57912027Sjungma@eit.uni-kl.de
58012027Sjungma@eit.uni-kl.de    sc_int_base( int_type v, int w )
58112027Sjungma@eit.uni-kl.de	: m_val( v ), m_len( w ), m_ulen( SC_INTWIDTH - m_len )
58212027Sjungma@eit.uni-kl.de	{ check_length(); extend_sign(); }
58312027Sjungma@eit.uni-kl.de
58412027Sjungma@eit.uni-kl.de    sc_int_base( const sc_int_base& a )
58512027Sjungma@eit.uni-kl.de	: sc_value_base(a), m_val( a.m_val ), m_len( a.m_len ),
58612027Sjungma@eit.uni-kl.de	  m_ulen( a.m_ulen )
58712027Sjungma@eit.uni-kl.de	{}
58812027Sjungma@eit.uni-kl.de
58912027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_int_subref_r& a )
59012027Sjungma@eit.uni-kl.de        : m_val( a ), m_len( a.length() ), m_ulen( SC_INTWIDTH - m_len )
59112027Sjungma@eit.uni-kl.de        { extend_sign(); }
59212027Sjungma@eit.uni-kl.de
59312027Sjungma@eit.uni-kl.de    template< class T >
59412027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_generic_base<T>& a ) :
59512027Sjungma@eit.uni-kl.de        m_val( a->to_int64() ), m_len( a->length() ),
59612027Sjungma@eit.uni-kl.de	m_ulen( SC_INTWIDTH - m_len )
59712027Sjungma@eit.uni-kl.de	{ check_length(); extend_sign(); }
59812027Sjungma@eit.uni-kl.de
59912027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_signed& a );
60012027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_unsigned& a );
60112027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_bv_base& v );
60212027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_lv_base& v );
60312027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_uint_subref_r& v );
60412027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_signed_subref_r& v );
60512027Sjungma@eit.uni-kl.de    explicit sc_int_base( const sc_unsigned_subref_r& v );
60612027Sjungma@eit.uni-kl.de
60712027Sjungma@eit.uni-kl.de
60812027Sjungma@eit.uni-kl.de
60912027Sjungma@eit.uni-kl.de    // destructor
61012027Sjungma@eit.uni-kl.de
61112027Sjungma@eit.uni-kl.de    virtual ~sc_int_base()
61212027Sjungma@eit.uni-kl.de	{}
61312027Sjungma@eit.uni-kl.de
61412027Sjungma@eit.uni-kl.de    // assignment operators
61512027Sjungma@eit.uni-kl.de
61612027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( int_type v )
61712027Sjungma@eit.uni-kl.de	{ m_val = v; extend_sign(); return *this; }
61812027Sjungma@eit.uni-kl.de
61912027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_int_base& a )
62012027Sjungma@eit.uni-kl.de	{ m_val = a.m_val; extend_sign(); return *this; }
62112027Sjungma@eit.uni-kl.de
62212027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_int_subref_r& a )
62312027Sjungma@eit.uni-kl.de        { m_val = a; extend_sign(); return *this; }
62412027Sjungma@eit.uni-kl.de
62512027Sjungma@eit.uni-kl.de    template<class T>
62612027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_generic_base<T>& a )
62712027Sjungma@eit.uni-kl.de        { m_val = a->to_int64(); extend_sign(); return *this; }
62812027Sjungma@eit.uni-kl.de
62912027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_signed& a );
63012027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_unsigned& a );
63112027Sjungma@eit.uni-kl.de
63212027Sjungma@eit.uni-kl.de#ifdef SC_INCLUDE_FX
63312027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_fxval& a );
63412027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_fxval_fast& a );
63512027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_fxnum& a );
63612027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_fxnum_fast& a );
63712027Sjungma@eit.uni-kl.de#endif
63812027Sjungma@eit.uni-kl.de
63912027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_bv_base& a );
64012027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const sc_lv_base& a );
64112027Sjungma@eit.uni-kl.de
64212027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( const char* a );
64312027Sjungma@eit.uni-kl.de
64412027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( unsigned long a )
64512027Sjungma@eit.uni-kl.de	{ m_val = a; extend_sign(); return *this; }
64612027Sjungma@eit.uni-kl.de
64712027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( long a )
64812027Sjungma@eit.uni-kl.de	{ m_val = a; extend_sign(); return *this; }
64912027Sjungma@eit.uni-kl.de
65012027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( unsigned int a )
65112027Sjungma@eit.uni-kl.de	{ m_val = a; extend_sign(); return *this; }
65212027Sjungma@eit.uni-kl.de
65312027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( int a )
65412027Sjungma@eit.uni-kl.de	{ m_val = a; extend_sign(); return *this; }
65512027Sjungma@eit.uni-kl.de
65612027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( uint64 a )
65712027Sjungma@eit.uni-kl.de	{ m_val = a; extend_sign(); return *this; }
65812027Sjungma@eit.uni-kl.de
65912027Sjungma@eit.uni-kl.de    sc_int_base& operator = ( double a )
66012027Sjungma@eit.uni-kl.de	{ m_val = (int_type) a; extend_sign(); return *this; }
66112027Sjungma@eit.uni-kl.de
66212027Sjungma@eit.uni-kl.de
66312027Sjungma@eit.uni-kl.de    // arithmetic assignment operators
66412027Sjungma@eit.uni-kl.de
66512027Sjungma@eit.uni-kl.de    sc_int_base& operator += ( int_type v )
66612027Sjungma@eit.uni-kl.de	{ m_val += v; extend_sign(); return *this; }
66712027Sjungma@eit.uni-kl.de
66812027Sjungma@eit.uni-kl.de    sc_int_base& operator -= ( int_type v )
66912027Sjungma@eit.uni-kl.de	{ m_val -= v; extend_sign(); return *this; }
67012027Sjungma@eit.uni-kl.de
67112027Sjungma@eit.uni-kl.de    sc_int_base& operator *= ( int_type v )
67212027Sjungma@eit.uni-kl.de	{ m_val *= v; extend_sign(); return *this; }
67312027Sjungma@eit.uni-kl.de
67412027Sjungma@eit.uni-kl.de    sc_int_base& operator /= ( int_type v )
67512027Sjungma@eit.uni-kl.de	{ m_val /= v; extend_sign(); return *this; }
67612027Sjungma@eit.uni-kl.de
67712027Sjungma@eit.uni-kl.de    sc_int_base& operator %= ( int_type v )
67812027Sjungma@eit.uni-kl.de	{ m_val %= v; extend_sign(); return *this; }
67912027Sjungma@eit.uni-kl.de
68012027Sjungma@eit.uni-kl.de
68112027Sjungma@eit.uni-kl.de    // bitwise assignment operators
68212027Sjungma@eit.uni-kl.de
68312027Sjungma@eit.uni-kl.de    sc_int_base& operator &= ( int_type v )
68412027Sjungma@eit.uni-kl.de	{ m_val &= v; extend_sign(); return *this; }
68512027Sjungma@eit.uni-kl.de
68612027Sjungma@eit.uni-kl.de    sc_int_base& operator |= ( int_type v )
68712027Sjungma@eit.uni-kl.de	{ m_val |= v; extend_sign(); return *this; }
68812027Sjungma@eit.uni-kl.de
68912027Sjungma@eit.uni-kl.de    sc_int_base& operator ^= ( int_type v )
69012027Sjungma@eit.uni-kl.de	{ m_val ^= v; extend_sign(); return *this; }
69112027Sjungma@eit.uni-kl.de
69212027Sjungma@eit.uni-kl.de
69312027Sjungma@eit.uni-kl.de    sc_int_base& operator <<= ( int_type v )
69412027Sjungma@eit.uni-kl.de	{ m_val <<= v; extend_sign(); return *this; }
69512027Sjungma@eit.uni-kl.de
69612027Sjungma@eit.uni-kl.de    sc_int_base& operator >>= ( int_type v )
69712027Sjungma@eit.uni-kl.de	{ m_val >>= v; /* no sign extension needed */ return *this; }
69812027Sjungma@eit.uni-kl.de
69912027Sjungma@eit.uni-kl.de
70012027Sjungma@eit.uni-kl.de    // prefix and postfix increment and decrement operators
70112027Sjungma@eit.uni-kl.de
70212027Sjungma@eit.uni-kl.de    sc_int_base& operator ++ () // prefix
70312027Sjungma@eit.uni-kl.de	{ ++ m_val; extend_sign(); return *this; }
70412027Sjungma@eit.uni-kl.de
70512027Sjungma@eit.uni-kl.de    const sc_int_base operator ++ ( int ) // postfix
70612027Sjungma@eit.uni-kl.de	{ sc_int_base tmp( *this ); ++ m_val; extend_sign(); return tmp; }
70712027Sjungma@eit.uni-kl.de
70812027Sjungma@eit.uni-kl.de    sc_int_base& operator -- () // prefix
70912027Sjungma@eit.uni-kl.de	{ -- m_val; extend_sign(); return *this; }
71012027Sjungma@eit.uni-kl.de
71112027Sjungma@eit.uni-kl.de    const sc_int_base operator -- ( int ) // postfix
71212027Sjungma@eit.uni-kl.de	{ sc_int_base tmp( *this ); -- m_val; extend_sign(); return tmp; }
71312027Sjungma@eit.uni-kl.de
71412027Sjungma@eit.uni-kl.de
71512027Sjungma@eit.uni-kl.de    // relational operators
71612027Sjungma@eit.uni-kl.de
71712027Sjungma@eit.uni-kl.de    friend bool operator == ( const sc_int_base& a, const sc_int_base& b )
71812027Sjungma@eit.uni-kl.de	{ return a.m_val == b.m_val; }
71912027Sjungma@eit.uni-kl.de
72012027Sjungma@eit.uni-kl.de    friend bool operator != ( const sc_int_base& a, const sc_int_base& b )
72112027Sjungma@eit.uni-kl.de	{ return a.m_val != b.m_val; }
72212027Sjungma@eit.uni-kl.de
72312027Sjungma@eit.uni-kl.de    friend bool operator <  ( const sc_int_base& a, const sc_int_base& b )
72412027Sjungma@eit.uni-kl.de	{ return a.m_val < b.m_val; }
72512027Sjungma@eit.uni-kl.de
72612027Sjungma@eit.uni-kl.de    friend bool operator <= ( const sc_int_base& a, const sc_int_base& b )
72712027Sjungma@eit.uni-kl.de	{ return a.m_val <= b.m_val; }
72812027Sjungma@eit.uni-kl.de
72912027Sjungma@eit.uni-kl.de    friend bool operator >  ( const sc_int_base& a, const sc_int_base& b )
73012027Sjungma@eit.uni-kl.de	{ return a.m_val > b.m_val; }
73112027Sjungma@eit.uni-kl.de
73212027Sjungma@eit.uni-kl.de    friend bool operator >= ( const sc_int_base& a, const sc_int_base& b )
73312027Sjungma@eit.uni-kl.de	{ return a.m_val >= b.m_val; }
73412027Sjungma@eit.uni-kl.de
73512027Sjungma@eit.uni-kl.de
73612027Sjungma@eit.uni-kl.de    // bit selection
73712027Sjungma@eit.uni-kl.de
73812027Sjungma@eit.uni-kl.de    sc_int_bitref&         operator [] ( int i );
73912027Sjungma@eit.uni-kl.de    const sc_int_bitref_r& operator [] ( int i ) const;
74012027Sjungma@eit.uni-kl.de
74112027Sjungma@eit.uni-kl.de    sc_int_bitref&         bit( int i );
74212027Sjungma@eit.uni-kl.de    const sc_int_bitref_r& bit( int i ) const;
74312027Sjungma@eit.uni-kl.de
74412027Sjungma@eit.uni-kl.de
74512027Sjungma@eit.uni-kl.de    // part selection
74612027Sjungma@eit.uni-kl.de
74712027Sjungma@eit.uni-kl.de    sc_int_subref&         operator () ( int left, int right );
74812027Sjungma@eit.uni-kl.de    const sc_int_subref_r& operator () ( int left, int right ) const;
74912027Sjungma@eit.uni-kl.de
75012027Sjungma@eit.uni-kl.de    sc_int_subref&         range( int left, int right );
75112027Sjungma@eit.uni-kl.de    const sc_int_subref_r& range( int left, int right ) const;
75212027Sjungma@eit.uni-kl.de
75312027Sjungma@eit.uni-kl.de
75412027Sjungma@eit.uni-kl.de    // bit access, without bounds checking or sign extension
75512027Sjungma@eit.uni-kl.de
75612027Sjungma@eit.uni-kl.de    bool test( int i ) const
75712027Sjungma@eit.uni-kl.de	{ return ( 0 != (m_val & (UINT_ONE << i)) ); }
75812027Sjungma@eit.uni-kl.de
75912027Sjungma@eit.uni-kl.de    void set( int i )
76012027Sjungma@eit.uni-kl.de	{ m_val |= (UINT_ONE << i); }
76112027Sjungma@eit.uni-kl.de
76212027Sjungma@eit.uni-kl.de    void set( int i, bool v )
76312027Sjungma@eit.uni-kl.de	{ v ? m_val |= (UINT_ONE << i) : m_val &= ~(UINT_ONE << i); }
76412027Sjungma@eit.uni-kl.de
76512027Sjungma@eit.uni-kl.de
76612027Sjungma@eit.uni-kl.de    // capacity
76712027Sjungma@eit.uni-kl.de
76812027Sjungma@eit.uni-kl.de    int length() const
76912027Sjungma@eit.uni-kl.de	{ return m_len; }
77012027Sjungma@eit.uni-kl.de
77112027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED
77212027Sjungma@eit.uni-kl.de    int bitwidth() const
77312027Sjungma@eit.uni-kl.de	{ return length(); }
77412027Sjungma@eit.uni-kl.de#endif
77512027Sjungma@eit.uni-kl.de
77612027Sjungma@eit.uni-kl.de    // concatenation support
77712027Sjungma@eit.uni-kl.de
77812027Sjungma@eit.uni-kl.de    virtual int concat_length(bool* xz_present_p) const
77912027Sjungma@eit.uni-kl.de	{ if ( xz_present_p ) *xz_present_p = false; return length(); }
78012027Sjungma@eit.uni-kl.de    virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
78112027Sjungma@eit.uni-kl.de    virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
78212027Sjungma@eit.uni-kl.de    virtual uint64 concat_get_uint64() const
78312027Sjungma@eit.uni-kl.de	{
78412027Sjungma@eit.uni-kl.de	    if ( m_len < 64 )
78512027Sjungma@eit.uni-kl.de		return (uint64)(m_val & ~((uint_type)-1 << m_len));
78612027Sjungma@eit.uni-kl.de	    else
78712027Sjungma@eit.uni-kl.de		return (uint64)m_val;
78812027Sjungma@eit.uni-kl.de	}
78912027Sjungma@eit.uni-kl.de    virtual void concat_set(int64 src, int low_i);
79012027Sjungma@eit.uni-kl.de    virtual void concat_set(const sc_signed& src, int low_i);
79112027Sjungma@eit.uni-kl.de    virtual void concat_set(const sc_unsigned& src, int low_i);
79212027Sjungma@eit.uni-kl.de    virtual void concat_set(uint64 src, int low_i);
79312027Sjungma@eit.uni-kl.de
79412027Sjungma@eit.uni-kl.de
79512027Sjungma@eit.uni-kl.de    // reduce methods
79612027Sjungma@eit.uni-kl.de
79712027Sjungma@eit.uni-kl.de    bool and_reduce() const;
79812027Sjungma@eit.uni-kl.de
79912027Sjungma@eit.uni-kl.de    bool nand_reduce() const
80012027Sjungma@eit.uni-kl.de	{ return ( ! and_reduce() ); }
80112027Sjungma@eit.uni-kl.de
80212027Sjungma@eit.uni-kl.de    bool or_reduce() const;
80312027Sjungma@eit.uni-kl.de
80412027Sjungma@eit.uni-kl.de    bool nor_reduce() const
80512027Sjungma@eit.uni-kl.de	{ return ( ! or_reduce() ); }
80612027Sjungma@eit.uni-kl.de
80712027Sjungma@eit.uni-kl.de    bool xor_reduce() const;
80812027Sjungma@eit.uni-kl.de
80912027Sjungma@eit.uni-kl.de    bool xnor_reduce() const
81012027Sjungma@eit.uni-kl.de	{ return ( ! xor_reduce() ); }
81112027Sjungma@eit.uni-kl.de
81212027Sjungma@eit.uni-kl.de
81312027Sjungma@eit.uni-kl.de    // implicit conversion to int_type
81412027Sjungma@eit.uni-kl.de
81512027Sjungma@eit.uni-kl.de    operator int_type() const
81612027Sjungma@eit.uni-kl.de	{ return m_val; }
81712027Sjungma@eit.uni-kl.de
81812027Sjungma@eit.uni-kl.de
81912027Sjungma@eit.uni-kl.de    // explicit conversions
82012027Sjungma@eit.uni-kl.de
82112027Sjungma@eit.uni-kl.de    int_type value() const
82212027Sjungma@eit.uni-kl.de	{ return operator int_type(); }
82312027Sjungma@eit.uni-kl.de
82412027Sjungma@eit.uni-kl.de
82512027Sjungma@eit.uni-kl.de    int to_int() const
82612027Sjungma@eit.uni-kl.de	{ return (int) m_val; }
82712027Sjungma@eit.uni-kl.de
82812027Sjungma@eit.uni-kl.de    unsigned int to_uint() const
82912027Sjungma@eit.uni-kl.de	{ return (unsigned int) m_val; }
83012027Sjungma@eit.uni-kl.de
83112027Sjungma@eit.uni-kl.de    long to_long() const
83212027Sjungma@eit.uni-kl.de	{ return (long) m_val; }
83312027Sjungma@eit.uni-kl.de
83412027Sjungma@eit.uni-kl.de    unsigned long to_ulong() const
83512027Sjungma@eit.uni-kl.de	{ return (unsigned long) m_val; }
83612027Sjungma@eit.uni-kl.de
83712027Sjungma@eit.uni-kl.de    int64 to_int64() const
83812027Sjungma@eit.uni-kl.de	{ return (int64) m_val; }
83912027Sjungma@eit.uni-kl.de
84012027Sjungma@eit.uni-kl.de    uint64 to_uint64() const
84112027Sjungma@eit.uni-kl.de	{ return (uint64) m_val; }
84212027Sjungma@eit.uni-kl.de
84312027Sjungma@eit.uni-kl.de    double to_double() const
84412027Sjungma@eit.uni-kl.de	{ return (double) m_val; }
84512027Sjungma@eit.uni-kl.de
84612027Sjungma@eit.uni-kl.de
84712027Sjungma@eit.uni-kl.de#ifndef _32BIT_
84812027Sjungma@eit.uni-kl.de    long long_low() const
84912027Sjungma@eit.uni-kl.de	{ return (long) (m_val & UINT64_32ONES); }
85012027Sjungma@eit.uni-kl.de
85112027Sjungma@eit.uni-kl.de    long long_high() const
85212027Sjungma@eit.uni-kl.de	{ return (long) ((m_val >> 32) & UINT64_32ONES); }
85312027Sjungma@eit.uni-kl.de#endif
85412027Sjungma@eit.uni-kl.de
85512027Sjungma@eit.uni-kl.de
85612027Sjungma@eit.uni-kl.de    // explicit conversion to character string
85712027Sjungma@eit.uni-kl.de
85812027Sjungma@eit.uni-kl.de    const std::string to_string( sc_numrep numrep = SC_DEC ) const;
85912027Sjungma@eit.uni-kl.de    const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
86012027Sjungma@eit.uni-kl.de
86112027Sjungma@eit.uni-kl.de
86212027Sjungma@eit.uni-kl.de    // other methods
86312027Sjungma@eit.uni-kl.de
86412027Sjungma@eit.uni-kl.de    void print( ::std::ostream& os = ::std::cout ) const
86512027Sjungma@eit.uni-kl.de	{ os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
86612027Sjungma@eit.uni-kl.de
86712027Sjungma@eit.uni-kl.de    void scan( ::std::istream& is = ::std::cin );
86812027Sjungma@eit.uni-kl.de
86912027Sjungma@eit.uni-kl.deprotected:
87012027Sjungma@eit.uni-kl.de
87112027Sjungma@eit.uni-kl.de    int_type m_val;   // value
87212027Sjungma@eit.uni-kl.de    int      m_len;   // length
87312027Sjungma@eit.uni-kl.de    int      m_ulen;  // unused length
87412027Sjungma@eit.uni-kl.de};
87512027Sjungma@eit.uni-kl.de
87612027Sjungma@eit.uni-kl.de
87712027Sjungma@eit.uni-kl.de
87812027Sjungma@eit.uni-kl.deinline
87912027Sjungma@eit.uni-kl.de::std::ostream&
88012027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream&, const sc_int_base& );
88112027Sjungma@eit.uni-kl.de
88212027Sjungma@eit.uni-kl.deinline
88312027Sjungma@eit.uni-kl.de::std::istream&
88412027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream&, sc_int_base& );
88512027Sjungma@eit.uni-kl.de
88612027Sjungma@eit.uni-kl.de
88712027Sjungma@eit.uni-kl.de
88812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
88912027Sjungma@eit.uni-kl.de//  CLASS : sc_int_bitref_r
89012027Sjungma@eit.uni-kl.de//
89112027Sjungma@eit.uni-kl.de//  Proxy class for sc_int bit selection (r-value only).
89212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
89312027Sjungma@eit.uni-kl.de
89412027Sjungma@eit.uni-kl.de// implicit conversion to uint64
89512027Sjungma@eit.uni-kl.de
89612027Sjungma@eit.uni-kl.deinline
89712027Sjungma@eit.uni-kl.desc_int_bitref_r::operator uint64 () const
89812027Sjungma@eit.uni-kl.de{
89912027Sjungma@eit.uni-kl.de    return m_obj_p->test( m_index );
90012027Sjungma@eit.uni-kl.de}
90112027Sjungma@eit.uni-kl.de
90212027Sjungma@eit.uni-kl.deinline
90312027Sjungma@eit.uni-kl.debool
90412027Sjungma@eit.uni-kl.desc_int_bitref_r::operator ! () const
90512027Sjungma@eit.uni-kl.de{
90612027Sjungma@eit.uni-kl.de    return ! m_obj_p->test( m_index );
90712027Sjungma@eit.uni-kl.de}
90812027Sjungma@eit.uni-kl.de
90912027Sjungma@eit.uni-kl.deinline
91012027Sjungma@eit.uni-kl.debool
91112027Sjungma@eit.uni-kl.desc_int_bitref_r::operator ~ () const
91212027Sjungma@eit.uni-kl.de{
91312027Sjungma@eit.uni-kl.de    return ! m_obj_p->test( m_index );
91412027Sjungma@eit.uni-kl.de}
91512027Sjungma@eit.uni-kl.de
91612027Sjungma@eit.uni-kl.de
91712027Sjungma@eit.uni-kl.de
91812027Sjungma@eit.uni-kl.deinline
91912027Sjungma@eit.uni-kl.de::std::ostream&
92012027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_int_bitref_r& a )
92112027Sjungma@eit.uni-kl.de{
92212027Sjungma@eit.uni-kl.de    a.print( os );
92312027Sjungma@eit.uni-kl.de    return os;
92412027Sjungma@eit.uni-kl.de}
92512027Sjungma@eit.uni-kl.de
92612027Sjungma@eit.uni-kl.de
92712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
92812027Sjungma@eit.uni-kl.de//  CLASS : sc_int_bitref
92912027Sjungma@eit.uni-kl.de//
93012027Sjungma@eit.uni-kl.de//  Proxy class for sc_int bit selection (r-value and l-value).
93112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
93212027Sjungma@eit.uni-kl.de
93312027Sjungma@eit.uni-kl.de// assignment operators
93412027Sjungma@eit.uni-kl.de
93512027Sjungma@eit.uni-kl.deinline
93612027Sjungma@eit.uni-kl.desc_int_bitref&
93712027Sjungma@eit.uni-kl.desc_int_bitref::operator = ( const sc_int_bitref_r& b )
93812027Sjungma@eit.uni-kl.de{
93912027Sjungma@eit.uni-kl.de    m_obj_p->set( m_index, (bool) b );
94012027Sjungma@eit.uni-kl.de    m_obj_p->extend_sign();
94112027Sjungma@eit.uni-kl.de    return *this;
94212027Sjungma@eit.uni-kl.de}
94312027Sjungma@eit.uni-kl.de
94412027Sjungma@eit.uni-kl.deinline
94512027Sjungma@eit.uni-kl.desc_int_bitref&
94612027Sjungma@eit.uni-kl.desc_int_bitref::operator = ( const sc_int_bitref& b )
94712027Sjungma@eit.uni-kl.de{
94812027Sjungma@eit.uni-kl.de    m_obj_p->set( m_index, (bool) b );
94912027Sjungma@eit.uni-kl.de    m_obj_p->extend_sign();
95012027Sjungma@eit.uni-kl.de    return *this;
95112027Sjungma@eit.uni-kl.de}
95212027Sjungma@eit.uni-kl.de
95312027Sjungma@eit.uni-kl.deinline
95412027Sjungma@eit.uni-kl.desc_int_bitref&
95512027Sjungma@eit.uni-kl.desc_int_bitref::operator = ( bool b )
95612027Sjungma@eit.uni-kl.de{
95712027Sjungma@eit.uni-kl.de    m_obj_p->set( m_index, b );
95812027Sjungma@eit.uni-kl.de    m_obj_p->extend_sign();
95912027Sjungma@eit.uni-kl.de    return *this;
96012027Sjungma@eit.uni-kl.de}
96112027Sjungma@eit.uni-kl.de
96212027Sjungma@eit.uni-kl.de
96312027Sjungma@eit.uni-kl.deinline
96412027Sjungma@eit.uni-kl.desc_int_bitref&
96512027Sjungma@eit.uni-kl.desc_int_bitref::operator &= ( bool b )
96612027Sjungma@eit.uni-kl.de{
96712027Sjungma@eit.uni-kl.de    if( ! b ) {
96812027Sjungma@eit.uni-kl.de	m_obj_p->set( m_index, b );
96912027Sjungma@eit.uni-kl.de	m_obj_p->extend_sign();
97012027Sjungma@eit.uni-kl.de    }
97112027Sjungma@eit.uni-kl.de    return *this;
97212027Sjungma@eit.uni-kl.de}
97312027Sjungma@eit.uni-kl.de
97412027Sjungma@eit.uni-kl.deinline
97512027Sjungma@eit.uni-kl.desc_int_bitref&
97612027Sjungma@eit.uni-kl.desc_int_bitref::operator |= ( bool b )
97712027Sjungma@eit.uni-kl.de{
97812027Sjungma@eit.uni-kl.de    if( b ) {
97912027Sjungma@eit.uni-kl.de	m_obj_p->set( m_index, b );
98012027Sjungma@eit.uni-kl.de	m_obj_p->extend_sign();
98112027Sjungma@eit.uni-kl.de    }
98212027Sjungma@eit.uni-kl.de    return *this;
98312027Sjungma@eit.uni-kl.de}
98412027Sjungma@eit.uni-kl.de
98512027Sjungma@eit.uni-kl.deinline
98612027Sjungma@eit.uni-kl.desc_int_bitref&
98712027Sjungma@eit.uni-kl.desc_int_bitref::operator ^= ( bool b )
98812027Sjungma@eit.uni-kl.de{
98912027Sjungma@eit.uni-kl.de    if( b ) {
99012027Sjungma@eit.uni-kl.de	m_obj_p->m_val ^= (UINT_ONE << m_index);
99112027Sjungma@eit.uni-kl.de	m_obj_p->extend_sign();
99212027Sjungma@eit.uni-kl.de    }
99312027Sjungma@eit.uni-kl.de    return *this;
99412027Sjungma@eit.uni-kl.de}
99512027Sjungma@eit.uni-kl.de
99612027Sjungma@eit.uni-kl.de
99712027Sjungma@eit.uni-kl.de
99812027Sjungma@eit.uni-kl.deinline
99912027Sjungma@eit.uni-kl.de::std::istream&
100012027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_int_bitref& a )
100112027Sjungma@eit.uni-kl.de{
100212027Sjungma@eit.uni-kl.de    a.scan( is );
100312027Sjungma@eit.uni-kl.de    return is;
100412027Sjungma@eit.uni-kl.de}
100512027Sjungma@eit.uni-kl.de
100612027Sjungma@eit.uni-kl.de
100712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
100812027Sjungma@eit.uni-kl.de//  CLASS : sc_int_subref_r
100912027Sjungma@eit.uni-kl.de//
101012027Sjungma@eit.uni-kl.de//  Proxy class for sc_int part selection (r-value only).
101112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
101212027Sjungma@eit.uni-kl.de
101312027Sjungma@eit.uni-kl.de// implicit conversion to int_type
101412027Sjungma@eit.uni-kl.de
101512027Sjungma@eit.uni-kl.deinline
101612027Sjungma@eit.uni-kl.desc_int_subref_r::operator uint_type() const
101712027Sjungma@eit.uni-kl.de{
101812027Sjungma@eit.uni-kl.de    uint_type /*int_type*/ val = m_obj_p->m_val;
101912027Sjungma@eit.uni-kl.de    int uleft = SC_INTWIDTH - (m_left + 1);
102012027Sjungma@eit.uni-kl.de    int uright = uleft + m_right;
102112027Sjungma@eit.uni-kl.de    return ( val << uleft >> uright );
102212027Sjungma@eit.uni-kl.de}
102312027Sjungma@eit.uni-kl.de
102412027Sjungma@eit.uni-kl.de
102512027Sjungma@eit.uni-kl.de// reduce methods
102612027Sjungma@eit.uni-kl.de
102712027Sjungma@eit.uni-kl.deinline
102812027Sjungma@eit.uni-kl.debool
102912027Sjungma@eit.uni-kl.desc_int_subref_r::and_reduce() const
103012027Sjungma@eit.uni-kl.de{
103112027Sjungma@eit.uni-kl.de    sc_int_base a( *this );
103212027Sjungma@eit.uni-kl.de    return a.and_reduce();
103312027Sjungma@eit.uni-kl.de}
103412027Sjungma@eit.uni-kl.de
103512027Sjungma@eit.uni-kl.deinline
103612027Sjungma@eit.uni-kl.debool
103712027Sjungma@eit.uni-kl.desc_int_subref_r::or_reduce() const
103812027Sjungma@eit.uni-kl.de{
103912027Sjungma@eit.uni-kl.de    sc_int_base a( *this );
104012027Sjungma@eit.uni-kl.de    return a.or_reduce();
104112027Sjungma@eit.uni-kl.de}
104212027Sjungma@eit.uni-kl.de
104312027Sjungma@eit.uni-kl.deinline
104412027Sjungma@eit.uni-kl.debool
104512027Sjungma@eit.uni-kl.desc_int_subref_r::xor_reduce() const
104612027Sjungma@eit.uni-kl.de{
104712027Sjungma@eit.uni-kl.de    sc_int_base a( *this );
104812027Sjungma@eit.uni-kl.de    return a.xor_reduce();
104912027Sjungma@eit.uni-kl.de}
105012027Sjungma@eit.uni-kl.de
105112027Sjungma@eit.uni-kl.de
105212027Sjungma@eit.uni-kl.de// explicit conversions
105312027Sjungma@eit.uni-kl.de
105412027Sjungma@eit.uni-kl.deinline
105512027Sjungma@eit.uni-kl.deint
105612027Sjungma@eit.uni-kl.desc_int_subref_r::to_int() const
105712027Sjungma@eit.uni-kl.de{
105812027Sjungma@eit.uni-kl.de	int result = static_cast<int>(operator uint_type());
105912027Sjungma@eit.uni-kl.de	return result;
106012027Sjungma@eit.uni-kl.de}
106112027Sjungma@eit.uni-kl.de
106212027Sjungma@eit.uni-kl.deinline
106312027Sjungma@eit.uni-kl.deunsigned int
106412027Sjungma@eit.uni-kl.desc_int_subref_r::to_uint() const
106512027Sjungma@eit.uni-kl.de{
106612027Sjungma@eit.uni-kl.de	unsigned int result = static_cast<unsigned int>(operator uint_type());
106712027Sjungma@eit.uni-kl.de	return result;
106812027Sjungma@eit.uni-kl.de}
106912027Sjungma@eit.uni-kl.de
107012027Sjungma@eit.uni-kl.deinline
107112027Sjungma@eit.uni-kl.delong
107212027Sjungma@eit.uni-kl.desc_int_subref_r::to_long() const
107312027Sjungma@eit.uni-kl.de{
107412027Sjungma@eit.uni-kl.de	long result = static_cast<long>(operator uint_type());
107512027Sjungma@eit.uni-kl.de	return result;
107612027Sjungma@eit.uni-kl.de}
107712027Sjungma@eit.uni-kl.de
107812027Sjungma@eit.uni-kl.deinline
107912027Sjungma@eit.uni-kl.deunsigned long
108012027Sjungma@eit.uni-kl.desc_int_subref_r::to_ulong() const
108112027Sjungma@eit.uni-kl.de{
108212027Sjungma@eit.uni-kl.de	unsigned long result = static_cast<unsigned long>(operator uint_type());
108312027Sjungma@eit.uni-kl.de	return result;
108412027Sjungma@eit.uni-kl.de}
108512027Sjungma@eit.uni-kl.de
108612027Sjungma@eit.uni-kl.deinline
108712027Sjungma@eit.uni-kl.deint64
108812027Sjungma@eit.uni-kl.desc_int_subref_r::to_int64() const
108912027Sjungma@eit.uni-kl.de{
109012027Sjungma@eit.uni-kl.de	int64 result = operator uint_type();
109112027Sjungma@eit.uni-kl.de	return result;
109212027Sjungma@eit.uni-kl.de}
109312027Sjungma@eit.uni-kl.de
109412027Sjungma@eit.uni-kl.deinline
109512027Sjungma@eit.uni-kl.deuint64
109612027Sjungma@eit.uni-kl.desc_int_subref_r::to_uint64() const
109712027Sjungma@eit.uni-kl.de{
109812027Sjungma@eit.uni-kl.de	uint64 result = operator uint_type();
109912027Sjungma@eit.uni-kl.de	return result;
110012027Sjungma@eit.uni-kl.de}
110112027Sjungma@eit.uni-kl.de
110212027Sjungma@eit.uni-kl.deinline
110312027Sjungma@eit.uni-kl.dedouble
110412027Sjungma@eit.uni-kl.desc_int_subref_r::to_double() const
110512027Sjungma@eit.uni-kl.de{
110612027Sjungma@eit.uni-kl.de	double result = static_cast<double>(operator uint_type());
110712027Sjungma@eit.uni-kl.de	return result;
110812027Sjungma@eit.uni-kl.de}
110912027Sjungma@eit.uni-kl.de
111012027Sjungma@eit.uni-kl.de
111112027Sjungma@eit.uni-kl.de// explicit conversion to character string
111212027Sjungma@eit.uni-kl.de
111312027Sjungma@eit.uni-kl.deinline
111412027Sjungma@eit.uni-kl.deconst std::string
111512027Sjungma@eit.uni-kl.desc_int_subref_r::to_string( sc_numrep numrep ) const
111612027Sjungma@eit.uni-kl.de{
111712027Sjungma@eit.uni-kl.de	sc_uint_base a(length());
111812027Sjungma@eit.uni-kl.de    a = operator uint_type();
111912027Sjungma@eit.uni-kl.de    return a.to_string( numrep );
112012027Sjungma@eit.uni-kl.de}
112112027Sjungma@eit.uni-kl.de
112212027Sjungma@eit.uni-kl.deinline
112312027Sjungma@eit.uni-kl.deconst std::string
112412027Sjungma@eit.uni-kl.desc_int_subref_r::to_string( sc_numrep numrep, bool w_prefix ) const
112512027Sjungma@eit.uni-kl.de{
112612027Sjungma@eit.uni-kl.de	sc_uint_base a(length());
112712027Sjungma@eit.uni-kl.de    a = operator uint_type();
112812027Sjungma@eit.uni-kl.de    return a.to_string( numrep, w_prefix );
112912027Sjungma@eit.uni-kl.de}
113012027Sjungma@eit.uni-kl.de
113112027Sjungma@eit.uni-kl.de
113212027Sjungma@eit.uni-kl.de// functional notation for the reduce methods
113312027Sjungma@eit.uni-kl.de
113412027Sjungma@eit.uni-kl.deinline
113512027Sjungma@eit.uni-kl.debool
113612027Sjungma@eit.uni-kl.deand_reduce( const sc_int_subref_r& a )
113712027Sjungma@eit.uni-kl.de{
113812027Sjungma@eit.uni-kl.de    return a.and_reduce();
113912027Sjungma@eit.uni-kl.de}
114012027Sjungma@eit.uni-kl.de
114112027Sjungma@eit.uni-kl.deinline
114212027Sjungma@eit.uni-kl.debool
114312027Sjungma@eit.uni-kl.denand_reduce( const sc_int_subref_r& a )
114412027Sjungma@eit.uni-kl.de{
114512027Sjungma@eit.uni-kl.de    return a.nand_reduce();
114612027Sjungma@eit.uni-kl.de}
114712027Sjungma@eit.uni-kl.de
114812027Sjungma@eit.uni-kl.deinline
114912027Sjungma@eit.uni-kl.debool
115012027Sjungma@eit.uni-kl.deor_reduce( const sc_int_subref_r& a )
115112027Sjungma@eit.uni-kl.de{
115212027Sjungma@eit.uni-kl.de    return a.or_reduce();
115312027Sjungma@eit.uni-kl.de}
115412027Sjungma@eit.uni-kl.de
115512027Sjungma@eit.uni-kl.deinline
115612027Sjungma@eit.uni-kl.debool
115712027Sjungma@eit.uni-kl.denor_reduce( const sc_int_subref_r& a )
115812027Sjungma@eit.uni-kl.de{
115912027Sjungma@eit.uni-kl.de    return a.nor_reduce();
116012027Sjungma@eit.uni-kl.de}
116112027Sjungma@eit.uni-kl.de
116212027Sjungma@eit.uni-kl.deinline
116312027Sjungma@eit.uni-kl.debool
116412027Sjungma@eit.uni-kl.dexor_reduce( const sc_int_subref_r& a )
116512027Sjungma@eit.uni-kl.de{
116612027Sjungma@eit.uni-kl.de    return a.xor_reduce();
116712027Sjungma@eit.uni-kl.de}
116812027Sjungma@eit.uni-kl.de
116912027Sjungma@eit.uni-kl.deinline
117012027Sjungma@eit.uni-kl.debool
117112027Sjungma@eit.uni-kl.dexnor_reduce( const sc_int_subref_r& a )
117212027Sjungma@eit.uni-kl.de{
117312027Sjungma@eit.uni-kl.de    return a.xnor_reduce();
117412027Sjungma@eit.uni-kl.de}
117512027Sjungma@eit.uni-kl.de
117612027Sjungma@eit.uni-kl.de
117712027Sjungma@eit.uni-kl.de
117812027Sjungma@eit.uni-kl.deinline
117912027Sjungma@eit.uni-kl.de::std::ostream&
118012027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_int_subref_r& a )
118112027Sjungma@eit.uni-kl.de{
118212027Sjungma@eit.uni-kl.de    a.print( os );
118312027Sjungma@eit.uni-kl.de    return os;
118412027Sjungma@eit.uni-kl.de}
118512027Sjungma@eit.uni-kl.de
118612027Sjungma@eit.uni-kl.de
118712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
118812027Sjungma@eit.uni-kl.de//  CLASS : sc_int_subref
118912027Sjungma@eit.uni-kl.de//
119012027Sjungma@eit.uni-kl.de//  Proxy class for sc_int part selection (r-value and l-value).
119112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
119212027Sjungma@eit.uni-kl.de
119312027Sjungma@eit.uni-kl.de// assignment operators
119412027Sjungma@eit.uni-kl.de
119512027Sjungma@eit.uni-kl.deinline
119612027Sjungma@eit.uni-kl.desc_int_subref&
119712027Sjungma@eit.uni-kl.desc_int_subref::operator = ( const sc_int_base& a )
119812027Sjungma@eit.uni-kl.de{
119912027Sjungma@eit.uni-kl.de    return operator = ( a.operator int_type() );
120012027Sjungma@eit.uni-kl.de}
120112027Sjungma@eit.uni-kl.de
120212027Sjungma@eit.uni-kl.deinline
120312027Sjungma@eit.uni-kl.desc_int_subref&
120412027Sjungma@eit.uni-kl.desc_int_subref::operator = ( const char* a )
120512027Sjungma@eit.uni-kl.de{
120612027Sjungma@eit.uni-kl.de    sc_int_base aa( length() );
120712027Sjungma@eit.uni-kl.de    return ( *this = aa = a );
120812027Sjungma@eit.uni-kl.de}
120912027Sjungma@eit.uni-kl.de
121012027Sjungma@eit.uni-kl.de
121112027Sjungma@eit.uni-kl.de
121212027Sjungma@eit.uni-kl.deinline
121312027Sjungma@eit.uni-kl.de::std::istream&
121412027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_int_subref& a )
121512027Sjungma@eit.uni-kl.de{
121612027Sjungma@eit.uni-kl.de    a.scan( is );
121712027Sjungma@eit.uni-kl.de    return is;
121812027Sjungma@eit.uni-kl.de}
121912027Sjungma@eit.uni-kl.de
122012027Sjungma@eit.uni-kl.de
122112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
122212027Sjungma@eit.uni-kl.de//  CLASS : sc_int_base
122312027Sjungma@eit.uni-kl.de//
122412027Sjungma@eit.uni-kl.de//  Base class for sc_int.
122512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
122612027Sjungma@eit.uni-kl.de
122712027Sjungma@eit.uni-kl.de// bit selection
122812027Sjungma@eit.uni-kl.de
122912027Sjungma@eit.uni-kl.deinline
123012027Sjungma@eit.uni-kl.desc_int_bitref&
123112027Sjungma@eit.uni-kl.desc_int_base::operator [] ( int i )
123212027Sjungma@eit.uni-kl.de{
123312027Sjungma@eit.uni-kl.de    check_index( i );
123412027Sjungma@eit.uni-kl.de    sc_int_bitref* result_p = sc_int_bitref::m_pool.allocate();
123512027Sjungma@eit.uni-kl.de    result_p->initialize(this, i);
123612027Sjungma@eit.uni-kl.de    return *result_p;
123712027Sjungma@eit.uni-kl.de}
123812027Sjungma@eit.uni-kl.de
123912027Sjungma@eit.uni-kl.deinline
124012027Sjungma@eit.uni-kl.deconst sc_int_bitref_r&
124112027Sjungma@eit.uni-kl.desc_int_base::operator [] ( int i ) const
124212027Sjungma@eit.uni-kl.de{
124312027Sjungma@eit.uni-kl.de    check_index( i );
124412027Sjungma@eit.uni-kl.de    sc_int_bitref* result_p = sc_int_bitref::m_pool.allocate();
124512027Sjungma@eit.uni-kl.de    result_p->initialize(this, i);
124612027Sjungma@eit.uni-kl.de    return *result_p;
124712027Sjungma@eit.uni-kl.de}
124812027Sjungma@eit.uni-kl.de
124912027Sjungma@eit.uni-kl.de
125012027Sjungma@eit.uni-kl.deinline
125112027Sjungma@eit.uni-kl.desc_int_bitref&
125212027Sjungma@eit.uni-kl.desc_int_base::bit( int i )
125312027Sjungma@eit.uni-kl.de{
125412027Sjungma@eit.uni-kl.de    check_index( i );
125512027Sjungma@eit.uni-kl.de    sc_int_bitref* result_p = sc_int_bitref::m_pool.allocate();
125612027Sjungma@eit.uni-kl.de    result_p->initialize(this, i);
125712027Sjungma@eit.uni-kl.de    return *result_p;
125812027Sjungma@eit.uni-kl.de}
125912027Sjungma@eit.uni-kl.de
126012027Sjungma@eit.uni-kl.deinline
126112027Sjungma@eit.uni-kl.deconst sc_int_bitref_r&
126212027Sjungma@eit.uni-kl.desc_int_base::bit( int i ) const
126312027Sjungma@eit.uni-kl.de{
126412027Sjungma@eit.uni-kl.de    check_index( i );
126512027Sjungma@eit.uni-kl.de    sc_int_bitref* result_p = sc_int_bitref::m_pool.allocate();
126612027Sjungma@eit.uni-kl.de    result_p->initialize(this, i);
126712027Sjungma@eit.uni-kl.de    return *result_p;
126812027Sjungma@eit.uni-kl.de}
126912027Sjungma@eit.uni-kl.de
127012027Sjungma@eit.uni-kl.de
127112027Sjungma@eit.uni-kl.de// part selection
127212027Sjungma@eit.uni-kl.de
127312027Sjungma@eit.uni-kl.deinline
127412027Sjungma@eit.uni-kl.desc_int_subref&
127512027Sjungma@eit.uni-kl.desc_int_base::operator () ( int left, int right )
127612027Sjungma@eit.uni-kl.de{
127712027Sjungma@eit.uni-kl.de    check_range( left, right );
127812027Sjungma@eit.uni-kl.de    sc_int_subref* result_p = sc_int_subref::m_pool.allocate();
127912027Sjungma@eit.uni-kl.de    result_p->initialize(this, left, right);
128012027Sjungma@eit.uni-kl.de    return *result_p;
128112027Sjungma@eit.uni-kl.de}
128212027Sjungma@eit.uni-kl.de
128312027Sjungma@eit.uni-kl.deinline
128412027Sjungma@eit.uni-kl.deconst sc_int_subref_r&
128512027Sjungma@eit.uni-kl.desc_int_base::operator () ( int left, int right ) const
128612027Sjungma@eit.uni-kl.de{
128712027Sjungma@eit.uni-kl.de    check_range( left, right );
128812027Sjungma@eit.uni-kl.de    sc_int_subref* result_p = sc_int_subref::m_pool.allocate();
128912027Sjungma@eit.uni-kl.de    result_p->initialize(this, left, right);
129012027Sjungma@eit.uni-kl.de    return *result_p;
129112027Sjungma@eit.uni-kl.de}
129212027Sjungma@eit.uni-kl.de
129312027Sjungma@eit.uni-kl.de
129412027Sjungma@eit.uni-kl.deinline
129512027Sjungma@eit.uni-kl.desc_int_subref&
129612027Sjungma@eit.uni-kl.desc_int_base::range( int left, int right )
129712027Sjungma@eit.uni-kl.de{
129812027Sjungma@eit.uni-kl.de    check_range( left, right );
129912027Sjungma@eit.uni-kl.de    sc_int_subref* result_p = sc_int_subref::m_pool.allocate();
130012027Sjungma@eit.uni-kl.de    result_p->initialize(this, left, right);
130112027Sjungma@eit.uni-kl.de    return *result_p;
130212027Sjungma@eit.uni-kl.de}
130312027Sjungma@eit.uni-kl.de
130412027Sjungma@eit.uni-kl.deinline
130512027Sjungma@eit.uni-kl.deconst sc_int_subref_r&
130612027Sjungma@eit.uni-kl.desc_int_base::range( int left, int right ) const
130712027Sjungma@eit.uni-kl.de{
130812027Sjungma@eit.uni-kl.de    check_range( left, right );
130912027Sjungma@eit.uni-kl.de    sc_int_subref* result_p = sc_int_subref::m_pool.allocate();
131012027Sjungma@eit.uni-kl.de    result_p->initialize(this, left, right);
131112027Sjungma@eit.uni-kl.de    return *result_p;
131212027Sjungma@eit.uni-kl.de}
131312027Sjungma@eit.uni-kl.de
131412027Sjungma@eit.uni-kl.de
131512027Sjungma@eit.uni-kl.de// functional notation for the reduce methods
131612027Sjungma@eit.uni-kl.de
131712027Sjungma@eit.uni-kl.deinline
131812027Sjungma@eit.uni-kl.debool
131912027Sjungma@eit.uni-kl.deand_reduce( const sc_int_base& a )
132012027Sjungma@eit.uni-kl.de{
132112027Sjungma@eit.uni-kl.de    return a.and_reduce();
132212027Sjungma@eit.uni-kl.de}
132312027Sjungma@eit.uni-kl.de
132412027Sjungma@eit.uni-kl.deinline
132512027Sjungma@eit.uni-kl.debool
132612027Sjungma@eit.uni-kl.denand_reduce( const sc_int_base& a )
132712027Sjungma@eit.uni-kl.de{
132812027Sjungma@eit.uni-kl.de    return a.nand_reduce();
132912027Sjungma@eit.uni-kl.de}
133012027Sjungma@eit.uni-kl.de
133112027Sjungma@eit.uni-kl.deinline
133212027Sjungma@eit.uni-kl.debool
133312027Sjungma@eit.uni-kl.deor_reduce( const sc_int_base& a )
133412027Sjungma@eit.uni-kl.de{
133512027Sjungma@eit.uni-kl.de    return a.or_reduce();
133612027Sjungma@eit.uni-kl.de}
133712027Sjungma@eit.uni-kl.de
133812027Sjungma@eit.uni-kl.deinline
133912027Sjungma@eit.uni-kl.debool
134012027Sjungma@eit.uni-kl.denor_reduce( const sc_int_base& a )
134112027Sjungma@eit.uni-kl.de{
134212027Sjungma@eit.uni-kl.de    return a.nor_reduce();
134312027Sjungma@eit.uni-kl.de}
134412027Sjungma@eit.uni-kl.de
134512027Sjungma@eit.uni-kl.deinline
134612027Sjungma@eit.uni-kl.debool
134712027Sjungma@eit.uni-kl.dexor_reduce( const sc_int_base& a )
134812027Sjungma@eit.uni-kl.de{
134912027Sjungma@eit.uni-kl.de    return a.xor_reduce();
135012027Sjungma@eit.uni-kl.de}
135112027Sjungma@eit.uni-kl.de
135212027Sjungma@eit.uni-kl.deinline
135312027Sjungma@eit.uni-kl.debool
135412027Sjungma@eit.uni-kl.dexnor_reduce( const sc_int_base& a )
135512027Sjungma@eit.uni-kl.de{
135612027Sjungma@eit.uni-kl.de    return a.xnor_reduce();
135712027Sjungma@eit.uni-kl.de}
135812027Sjungma@eit.uni-kl.de
135912027Sjungma@eit.uni-kl.de
136012027Sjungma@eit.uni-kl.de
136112027Sjungma@eit.uni-kl.deinline
136212027Sjungma@eit.uni-kl.de::std::ostream&
136312027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_int_base& a )
136412027Sjungma@eit.uni-kl.de{
136512027Sjungma@eit.uni-kl.de    a.print( os );
136612027Sjungma@eit.uni-kl.de    return os;
136712027Sjungma@eit.uni-kl.de}
136812027Sjungma@eit.uni-kl.de
136912027Sjungma@eit.uni-kl.deinline
137012027Sjungma@eit.uni-kl.de::std::istream&
137112027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_int_base& a )
137212027Sjungma@eit.uni-kl.de{
137312027Sjungma@eit.uni-kl.de    a.scan( is );
137412027Sjungma@eit.uni-kl.de    return is;
137512027Sjungma@eit.uni-kl.de}
137612027Sjungma@eit.uni-kl.de
137712027Sjungma@eit.uni-kl.de} // namespace sc_dt
137812027Sjungma@eit.uni-kl.de
137912027Sjungma@eit.uni-kl.de
138012027Sjungma@eit.uni-kl.de#endif
138112027Sjungma@eit.uni-kl.de
138212027Sjungma@eit.uni-kl.de// Taf!
1383