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