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_proxy.h -- Proxy base class for vector data types.
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de                This class is created for several purposes:
2512027Sjungma@eit.uni-kl.de                1) hiding operators from the global namespace that would be
2612027Sjungma@eit.uni-kl.de		   otherwise found by Koenig lookup
2712027Sjungma@eit.uni-kl.de                2) avoiding repeating the same operations in every class
2812027Sjungma@eit.uni-kl.de		   including proxies that could also be achieved by common
2912027Sjungma@eit.uni-kl.de		   base class, but this method allows
3012027Sjungma@eit.uni-kl.de                3) improve performance by using non-virtual functions
3112027Sjungma@eit.uni-kl.de
3212027Sjungma@eit.uni-kl.de  Original Author: Gene Bushuyev, Synopsys, Inc.
3312027Sjungma@eit.uni-kl.de
3412027Sjungma@eit.uni-kl.de *****************************************************************************/
3512027Sjungma@eit.uni-kl.de
3612027Sjungma@eit.uni-kl.de/*****************************************************************************
3712027Sjungma@eit.uni-kl.de
3812027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3912027Sjungma@eit.uni-kl.de  changes you are making here.
4012027Sjungma@eit.uni-kl.de
4112027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
4212027Sjungma@eit.uni-kl.de  Description of Modification:
4312027Sjungma@eit.uni-kl.de
4412027Sjungma@eit.uni-kl.de *****************************************************************************/
4512027Sjungma@eit.uni-kl.de
4612027Sjungma@eit.uni-kl.de// $Log: sc_proxy.h,v $
4712027Sjungma@eit.uni-kl.de// Revision 1.3  2010/12/07 20:09:07  acg
4812027Sjungma@eit.uni-kl.de// Andy Goodrich: Fix for returning enough data
4912027Sjungma@eit.uni-kl.de//
5012027Sjungma@eit.uni-kl.de// Revision 1.2  2009/02/28 00:26:14  acg
5112027Sjungma@eit.uni-kl.de//  Andy Goodrich: bug fixes.
5212027Sjungma@eit.uni-kl.de//
5312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:31:36  acg
5412027Sjungma@eit.uni-kl.de// SystemC 2.2
5512027Sjungma@eit.uni-kl.de//
5612027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:53:53  acg
5712027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in
5812027Sjungma@eit.uni-kl.de// the source.
5912027Sjungma@eit.uni-kl.de//
6012027Sjungma@eit.uni-kl.de
6112027Sjungma@eit.uni-kl.de#ifndef SC_PROXY_H
6212027Sjungma@eit.uni-kl.de#define SC_PROXY_H
6312027Sjungma@eit.uni-kl.de
6412027Sjungma@eit.uni-kl.de
6512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cmnhdr.h"
6612027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_iostream.h"
6712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h"
6812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h"
6912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_base.h"
7012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h"
7112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit.h"
7212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit_ids.h"
7312027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_logic.h"
7412027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_macros.h"
7512027Sjungma@eit.uni-kl.de
7612027Sjungma@eit.uni-kl.de
7712027Sjungma@eit.uni-kl.denamespace sc_dt
7812027Sjungma@eit.uni-kl.de{
7912027Sjungma@eit.uni-kl.de
8012027Sjungma@eit.uni-kl.de// classes defined in this module
8112027Sjungma@eit.uni-kl.detemplate <class X> class sc_proxy;
8212027Sjungma@eit.uni-kl.de
8312027Sjungma@eit.uni-kl.de// forward class declarations
8412027Sjungma@eit.uni-kl.declass sc_bv_base;
8512027Sjungma@eit.uni-kl.declass sc_lv_base;
8612027Sjungma@eit.uni-kl.detemplate <class X> class sc_bitref_r;
8712027Sjungma@eit.uni-kl.detemplate <class X> class sc_bitref;
8812027Sjungma@eit.uni-kl.detemplate <class X> class sc_subref_r;
8912027Sjungma@eit.uni-kl.detemplate <class X> class sc_subref;
9012027Sjungma@eit.uni-kl.detemplate <class X, class Y> class sc_concref_r;
9112027Sjungma@eit.uni-kl.detemplate <class X, class Y> class sc_concref;
9212027Sjungma@eit.uni-kl.de
9312027Sjungma@eit.uni-kl.de
9412027Sjungma@eit.uni-kl.deconst int SC_DIGIT_SIZE = BITS_PER_BYTE * sizeof( sc_digit );
9512027Sjungma@eit.uni-kl.de
9612027Sjungma@eit.uni-kl.deconst sc_digit SC_DIGIT_ZERO = (sc_digit)0;
9712027Sjungma@eit.uni-kl.deconst sc_digit SC_DIGIT_ONE  = (sc_digit)1;
9812027Sjungma@eit.uni-kl.deconst sc_digit SC_DIGIT_TWO  = (sc_digit)2;
9912027Sjungma@eit.uni-kl.de
10012027Sjungma@eit.uni-kl.de
10112027Sjungma@eit.uni-kl.de// assignment functions; forward declarations
10212027Sjungma@eit.uni-kl.de
10312027Sjungma@eit.uni-kl.detemplate <class X, class Y>
10412027Sjungma@eit.uni-kl.deinline
10512027Sjungma@eit.uni-kl.devoid
10612027Sjungma@eit.uni-kl.deassign_p_( sc_proxy<X>& px, const sc_proxy<Y>& py );
10712027Sjungma@eit.uni-kl.de
10812027Sjungma@eit.uni-kl.de// Vector types that are not derived from sc_proxy must have a length()
10912027Sjungma@eit.uni-kl.de// function and an operator [].
11012027Sjungma@eit.uni-kl.de
11112027Sjungma@eit.uni-kl.detemplate <class X, class T>
11212027Sjungma@eit.uni-kl.deinline
11312027Sjungma@eit.uni-kl.devoid
11412027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const T& a );
11512027Sjungma@eit.uni-kl.de
11612027Sjungma@eit.uni-kl.de
11712027Sjungma@eit.uni-kl.de// other functions; forward declarations
11812027Sjungma@eit.uni-kl.de
11912027Sjungma@eit.uni-kl.deconst std::string convert_to_bin( const char* s );
12012027Sjungma@eit.uni-kl.deconst std::string convert_to_fmt( const std::string& s, sc_numrep numrep, bool );
12112027Sjungma@eit.uni-kl.de
12212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
12312027Sjungma@eit.uni-kl.de//  CLASS TEMPLATE : sc_proxy_traits
12412027Sjungma@eit.uni-kl.de//
12512027Sjungma@eit.uni-kl.de// Template traits helper to select the correct bit/value/vector_types for
12612027Sjungma@eit.uni-kl.de// sc_proxy-based vector classes.
12712027Sjungma@eit.uni-kl.de//
12812027Sjungma@eit.uni-kl.de// All types derived from/based on a bit-vector contain typedef to a plain bool,
12912027Sjungma@eit.uni-kl.de// all others point to the sc_logic_value_t/sc_logic/sc_lv_base types.
13012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
13112027Sjungma@eit.uni-kl.de
13212027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits;
13312027Sjungma@eit.uni-kl.de
13412027Sjungma@eit.uni-kl.detemplate<> struct sc_proxy_traits<sc_bv_base>
13512027Sjungma@eit.uni-kl.de{
13612027Sjungma@eit.uni-kl.de    typedef sc_proxy_traits<sc_bv_base> traits_type;
13712027Sjungma@eit.uni-kl.de    typedef bool                        value_type;
13812027Sjungma@eit.uni-kl.de    typedef bool                        bit_type;
13912027Sjungma@eit.uni-kl.de    typedef sc_bv_base                  vector_type;
14012027Sjungma@eit.uni-kl.de    typedef traits_type                 type;
14112027Sjungma@eit.uni-kl.de};
14212027Sjungma@eit.uni-kl.de
14312027Sjungma@eit.uni-kl.detemplate<> struct sc_proxy_traits<sc_lv_base>
14412027Sjungma@eit.uni-kl.de{
14512027Sjungma@eit.uni-kl.de    typedef sc_proxy_traits<sc_lv_base> traits_type;
14612027Sjungma@eit.uni-kl.de    typedef sc_logic_value_t            value_type;
14712027Sjungma@eit.uni-kl.de    typedef sc_logic                    bit_type;
14812027Sjungma@eit.uni-kl.de    typedef sc_lv_base                  vector_type;
14912027Sjungma@eit.uni-kl.de    typedef traits_type                 type;
15012027Sjungma@eit.uni-kl.de};
15112027Sjungma@eit.uni-kl.de
15212027Sjungma@eit.uni-kl.de
15312027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_bitref_r<X> >
15412027Sjungma@eit.uni-kl.de  : sc_proxy_traits<X> {};
15512027Sjungma@eit.uni-kl.de
15612027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_bitref<X> >
15712027Sjungma@eit.uni-kl.de  : sc_proxy_traits<X> {};
15812027Sjungma@eit.uni-kl.de
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_subref_r<X> >
16112027Sjungma@eit.uni-kl.de  : sc_proxy_traits<X> {};
16212027Sjungma@eit.uni-kl.de
16312027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_subref<X> >
16412027Sjungma@eit.uni-kl.de  : sc_proxy_traits<X> {};
16512027Sjungma@eit.uni-kl.de
16612027Sjungma@eit.uni-kl.de
16712027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_proxy<X> >
16812027Sjungma@eit.uni-kl.de  : sc_proxy_traits<X> {};
16912027Sjungma@eit.uni-kl.de
17012027Sjungma@eit.uni-kl.de
17112027Sjungma@eit.uni-kl.detemplate< typename X, typename Y > struct sc_mixed_proxy_traits_helper
17212027Sjungma@eit.uni-kl.de  : sc_proxy_traits<sc_lv_base> {}; // logic vector by default
17312027Sjungma@eit.uni-kl.de
17412027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_mixed_proxy_traits_helper<X,X>
17512027Sjungma@eit.uni-kl.de  : X {};
17612027Sjungma@eit.uni-kl.de
17712027Sjungma@eit.uni-kl.de
17812027Sjungma@eit.uni-kl.detemplate<typename X, typename Y> struct sc_proxy_traits< sc_concref_r<X,Y> >
17912027Sjungma@eit.uni-kl.de  : sc_mixed_proxy_traits_helper< typename X::traits_type::type
18012027Sjungma@eit.uni-kl.de                                , typename Y::traits_type::type >
18112027Sjungma@eit.uni-kl.de{};
18212027Sjungma@eit.uni-kl.de
18312027Sjungma@eit.uni-kl.detemplate<typename X, typename Y> struct sc_proxy_traits<sc_concref<X,Y> >
18412027Sjungma@eit.uni-kl.de  : sc_mixed_proxy_traits_helper< typename X::traits_type::type
18512027Sjungma@eit.uni-kl.de                                , typename Y::traits_type::type >
18612027Sjungma@eit.uni-kl.de{};
18712027Sjungma@eit.uni-kl.de
18812027Sjungma@eit.uni-kl.de
18912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
19012027Sjungma@eit.uni-kl.de//  CLASS TEMPLATE : sc_proxy
19112027Sjungma@eit.uni-kl.de//
19212027Sjungma@eit.uni-kl.de//  Base class template for bit/logic vector classes.
19312027Sjungma@eit.uni-kl.de//  (Barton/Nackmann implementation)
19412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
19512027Sjungma@eit.uni-kl.de
19612027Sjungma@eit.uni-kl.detemplate <class X>
19712027Sjungma@eit.uni-kl.declass sc_proxy // #### : public sc_value_base
19812027Sjungma@eit.uni-kl.de{
19912027Sjungma@eit.uni-kl.depublic:
20012027Sjungma@eit.uni-kl.de    typedef typename sc_proxy_traits<X>::type traits_type;
20112027Sjungma@eit.uni-kl.de    typedef typename traits_type::bit_type    bit_type;
20212027Sjungma@eit.uni-kl.de
20312027Sjungma@eit.uni-kl.de    // virtual destructor
20412027Sjungma@eit.uni-kl.de
20512027Sjungma@eit.uni-kl.de    virtual ~sc_proxy() {}
20612027Sjungma@eit.uni-kl.de
20712027Sjungma@eit.uni-kl.de
20812027Sjungma@eit.uni-kl.de    // casts
20912027Sjungma@eit.uni-kl.de
21012027Sjungma@eit.uni-kl.de    X& back_cast()
21112027Sjungma@eit.uni-kl.de	{ return SCAST<X&>( *this ); }
21212027Sjungma@eit.uni-kl.de
21312027Sjungma@eit.uni-kl.de    const X& back_cast() const
21412027Sjungma@eit.uni-kl.de	{ return SCAST<const X&>( *this ); }
21512027Sjungma@eit.uni-kl.de
21612027Sjungma@eit.uni-kl.de
21712027Sjungma@eit.uni-kl.de    // assignment operators
21812027Sjungma@eit.uni-kl.de
21912027Sjungma@eit.uni-kl.de    template <class Y>
22012027Sjungma@eit.uni-kl.de    X& assign_( const sc_proxy<Y>& a )
22112027Sjungma@eit.uni-kl.de	{ assign_p_( *this, a ); return back_cast(); }
22212027Sjungma@eit.uni-kl.de
22312027Sjungma@eit.uni-kl.de    X& assign_( const char* a );
22412027Sjungma@eit.uni-kl.de    X& assign_( const bool* a );
22512027Sjungma@eit.uni-kl.de    X& assign_( const sc_logic* a );
22612027Sjungma@eit.uni-kl.de
22712027Sjungma@eit.uni-kl.de    X& assign_( const sc_unsigned& a )
22812027Sjungma@eit.uni-kl.de	{ assign_v_( *this, a ); return back_cast(); }
22912027Sjungma@eit.uni-kl.de
23012027Sjungma@eit.uni-kl.de    X& assign_( const sc_signed& a )
23112027Sjungma@eit.uni-kl.de	{ assign_v_( *this, a ); return back_cast(); }
23212027Sjungma@eit.uni-kl.de
23312027Sjungma@eit.uni-kl.de    X& assign_( const sc_uint_base& a )
23412027Sjungma@eit.uni-kl.de	{ return assign_( (uint64) a ); }
23512027Sjungma@eit.uni-kl.de
23612027Sjungma@eit.uni-kl.de    X& assign_( const sc_int_base& a )
23712027Sjungma@eit.uni-kl.de	{ return assign_( (int64) a ); }
23812027Sjungma@eit.uni-kl.de
23912027Sjungma@eit.uni-kl.de    X& assign_( unsigned int a );
24012027Sjungma@eit.uni-kl.de    X& assign_( int a );
24112027Sjungma@eit.uni-kl.de
24212027Sjungma@eit.uni-kl.de    X& assign_( unsigned long a );
24312027Sjungma@eit.uni-kl.de
24412027Sjungma@eit.uni-kl.de    X& assign_( long a );
24512027Sjungma@eit.uni-kl.de
24612027Sjungma@eit.uni-kl.de    X& assign_( uint64 a );
24712027Sjungma@eit.uni-kl.de    X& assign_( int64 a );
24812027Sjungma@eit.uni-kl.de
24912027Sjungma@eit.uni-kl.de
25012027Sjungma@eit.uni-kl.de    // bitwise operators and functions
25112027Sjungma@eit.uni-kl.de
25212027Sjungma@eit.uni-kl.de    // bitwise complement
25312027Sjungma@eit.uni-kl.de
25412027Sjungma@eit.uni-kl.de    X& b_not();
25512027Sjungma@eit.uni-kl.de
25612027Sjungma@eit.uni-kl.de    const sc_lv_base operator ~ () const;
25712027Sjungma@eit.uni-kl.de
25812027Sjungma@eit.uni-kl.de
25912027Sjungma@eit.uni-kl.de    // bitwise and
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.de    X& operator &= ( const char* b );
26212027Sjungma@eit.uni-kl.de    X& operator &= ( const bool* b );
26312027Sjungma@eit.uni-kl.de    X& operator &= ( const sc_logic* b );
26412027Sjungma@eit.uni-kl.de    X& operator &= ( const sc_unsigned& b );
26512027Sjungma@eit.uni-kl.de    X& operator &= ( const sc_signed& b );
26612027Sjungma@eit.uni-kl.de
26712027Sjungma@eit.uni-kl.de    X& operator &= ( const sc_uint_base& b )
26812027Sjungma@eit.uni-kl.de	{ return operator &= ( (uint64) b ); }
26912027Sjungma@eit.uni-kl.de
27012027Sjungma@eit.uni-kl.de    X& operator &= ( const sc_int_base& b )
27112027Sjungma@eit.uni-kl.de	{ return operator &= ( (int64) b ); }
27212027Sjungma@eit.uni-kl.de
27312027Sjungma@eit.uni-kl.de    X& operator &= ( unsigned long b );
27412027Sjungma@eit.uni-kl.de    X& operator &= ( long b );
27512027Sjungma@eit.uni-kl.de
27612027Sjungma@eit.uni-kl.de    X& operator &= ( unsigned int b )
27712027Sjungma@eit.uni-kl.de	{ return operator &= ( (unsigned long) b ); }
27812027Sjungma@eit.uni-kl.de
27912027Sjungma@eit.uni-kl.de    X& operator &= ( int b )
28012027Sjungma@eit.uni-kl.de	{ return operator &= ( (long) b ); }
28112027Sjungma@eit.uni-kl.de
28212027Sjungma@eit.uni-kl.de    X& operator &= ( uint64 b );
28312027Sjungma@eit.uni-kl.de    X& operator &= ( int64 b );
28412027Sjungma@eit.uni-kl.de
28512027Sjungma@eit.uni-kl.de
28612027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( const char* b ) const;
28712027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( const bool* b ) const;
28812027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( const sc_logic* b ) const;
28912027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( const sc_unsigned& b ) const;
29012027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( const sc_signed& b ) const;
29112027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( const sc_uint_base& b ) const;
29212027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( const sc_int_base& b ) const;
29312027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( unsigned long b ) const;
29412027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( long b ) const;
29512027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( unsigned int b ) const;
29612027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( int b ) const;
29712027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( uint64 b ) const;
29812027Sjungma@eit.uni-kl.de    const sc_lv_base operator & ( int64 b ) const;
29912027Sjungma@eit.uni-kl.de
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.de    // bitwise or
30212027Sjungma@eit.uni-kl.de
30312027Sjungma@eit.uni-kl.de    X& operator |= ( const char* b );
30412027Sjungma@eit.uni-kl.de    X& operator |= ( const bool* b );
30512027Sjungma@eit.uni-kl.de    X& operator |= ( const sc_logic* b );
30612027Sjungma@eit.uni-kl.de    X& operator |= ( const sc_unsigned& b );
30712027Sjungma@eit.uni-kl.de    X& operator |= ( const sc_signed& b );
30812027Sjungma@eit.uni-kl.de
30912027Sjungma@eit.uni-kl.de    X& operator |= ( const sc_uint_base& b )
31012027Sjungma@eit.uni-kl.de	{ return operator |= ( (uint64) b ); }
31112027Sjungma@eit.uni-kl.de
31212027Sjungma@eit.uni-kl.de    X& operator |= ( const sc_int_base& b )
31312027Sjungma@eit.uni-kl.de	{ return operator |= ( (int64) b ); }
31412027Sjungma@eit.uni-kl.de
31512027Sjungma@eit.uni-kl.de    X& operator |= ( unsigned long b );
31612027Sjungma@eit.uni-kl.de    X& operator |= ( long b );
31712027Sjungma@eit.uni-kl.de
31812027Sjungma@eit.uni-kl.de    X& operator |= ( unsigned int b )
31912027Sjungma@eit.uni-kl.de	{ return operator |= ( (unsigned long) b ); }
32012027Sjungma@eit.uni-kl.de
32112027Sjungma@eit.uni-kl.de    X& operator |= ( int b )
32212027Sjungma@eit.uni-kl.de	{ return operator |= ( (long) b ); }
32312027Sjungma@eit.uni-kl.de
32412027Sjungma@eit.uni-kl.de    X& operator |= ( uint64 b );
32512027Sjungma@eit.uni-kl.de    X& operator |= ( int64 b );
32612027Sjungma@eit.uni-kl.de
32712027Sjungma@eit.uni-kl.de
32812027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( const char* b ) const;
32912027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( const bool* b ) const;
33012027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( const sc_logic* b ) const;
33112027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( const sc_unsigned& b ) const;
33212027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( const sc_signed& b ) const;
33312027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( const sc_uint_base& b ) const;
33412027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( const sc_int_base& b ) const;
33512027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( unsigned long b ) const;
33612027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( long b ) const;
33712027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( unsigned int b ) const;
33812027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( int b ) const;
33912027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( uint64 b ) const;
34012027Sjungma@eit.uni-kl.de    const sc_lv_base operator | ( int64 b ) const;
34112027Sjungma@eit.uni-kl.de
34212027Sjungma@eit.uni-kl.de
34312027Sjungma@eit.uni-kl.de    // bitwise xor
34412027Sjungma@eit.uni-kl.de
34512027Sjungma@eit.uni-kl.de    X& operator ^= ( const char* b );
34612027Sjungma@eit.uni-kl.de    X& operator ^= ( const bool* b );
34712027Sjungma@eit.uni-kl.de    X& operator ^= ( const sc_logic* b );
34812027Sjungma@eit.uni-kl.de    X& operator ^= ( const sc_unsigned& b );
34912027Sjungma@eit.uni-kl.de    X& operator ^= ( const sc_signed& b );
35012027Sjungma@eit.uni-kl.de
35112027Sjungma@eit.uni-kl.de    X& operator ^= ( const sc_uint_base& b )
35212027Sjungma@eit.uni-kl.de	{ return operator ^= ( (uint64) b ); }
35312027Sjungma@eit.uni-kl.de
35412027Sjungma@eit.uni-kl.de    X& operator ^= ( const sc_int_base& b )
35512027Sjungma@eit.uni-kl.de	{ return operator ^= ( (int64) b ); }
35612027Sjungma@eit.uni-kl.de
35712027Sjungma@eit.uni-kl.de    X& operator ^= ( unsigned long b );
35812027Sjungma@eit.uni-kl.de    X& operator ^= ( long b );
35912027Sjungma@eit.uni-kl.de
36012027Sjungma@eit.uni-kl.de    X& operator ^= ( unsigned int b )
36112027Sjungma@eit.uni-kl.de	{ return operator ^= ( (unsigned long) b ); }
36212027Sjungma@eit.uni-kl.de
36312027Sjungma@eit.uni-kl.de    X& operator ^= ( int b )
36412027Sjungma@eit.uni-kl.de	{ return operator ^= ( (long) b ); }
36512027Sjungma@eit.uni-kl.de
36612027Sjungma@eit.uni-kl.de    X& operator ^= ( uint64 b );
36712027Sjungma@eit.uni-kl.de    X& operator ^= ( int64 b );
36812027Sjungma@eit.uni-kl.de
36912027Sjungma@eit.uni-kl.de
37012027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( const char* b ) const;
37112027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( const bool* b ) const;
37212027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( const sc_logic* b ) const;
37312027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( const sc_unsigned& b ) const;
37412027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( const sc_signed& b ) const;
37512027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( const sc_uint_base& b ) const;
37612027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( const sc_int_base& b ) const;
37712027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( unsigned long b ) const;
37812027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( long b ) const;
37912027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( unsigned int b ) const;
38012027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( int b ) const;
38112027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( uint64 b ) const;
38212027Sjungma@eit.uni-kl.de    const sc_lv_base operator ^ ( int64 b ) const;
38312027Sjungma@eit.uni-kl.de
38412027Sjungma@eit.uni-kl.de
38512027Sjungma@eit.uni-kl.de    // bitwise left shift
38612027Sjungma@eit.uni-kl.de
38712027Sjungma@eit.uni-kl.de    X& operator <<= ( int n );
38812027Sjungma@eit.uni-kl.de
38912027Sjungma@eit.uni-kl.de    const sc_lv_base operator << ( int n ) const;
39012027Sjungma@eit.uni-kl.de
39112027Sjungma@eit.uni-kl.de
39212027Sjungma@eit.uni-kl.de    // bitwise right shift
39312027Sjungma@eit.uni-kl.de
39412027Sjungma@eit.uni-kl.de    X& operator >>= ( int n );
39512027Sjungma@eit.uni-kl.de
39612027Sjungma@eit.uni-kl.de    const sc_lv_base operator >> ( int n ) const;
39712027Sjungma@eit.uni-kl.de
39812027Sjungma@eit.uni-kl.de
39912027Sjungma@eit.uni-kl.de    // bitwise left rotate
40012027Sjungma@eit.uni-kl.de
40112027Sjungma@eit.uni-kl.de    X& lrotate( int n );
40212027Sjungma@eit.uni-kl.de
40312027Sjungma@eit.uni-kl.de
40412027Sjungma@eit.uni-kl.de    // bitwise right rotate
40512027Sjungma@eit.uni-kl.de
40612027Sjungma@eit.uni-kl.de    X& rrotate( int n );
40712027Sjungma@eit.uni-kl.de
40812027Sjungma@eit.uni-kl.de
40912027Sjungma@eit.uni-kl.de    // bitwise reverse
41012027Sjungma@eit.uni-kl.de
41112027Sjungma@eit.uni-kl.de    X& reverse();
41212027Sjungma@eit.uni-kl.de
41312027Sjungma@eit.uni-kl.de
41412027Sjungma@eit.uni-kl.de    // bit selection
41512027Sjungma@eit.uni-kl.de
41612027Sjungma@eit.uni-kl.de    sc_bitref<X> operator [] ( int i )
41712027Sjungma@eit.uni-kl.de	{ return sc_bitref<X>( back_cast(), i ); }
41812027Sjungma@eit.uni-kl.de
41912027Sjungma@eit.uni-kl.de    sc_bitref_r<X> operator [] ( int i ) const
42012027Sjungma@eit.uni-kl.de	{ return sc_bitref_r<X>( back_cast(), i ); }
42112027Sjungma@eit.uni-kl.de
42212027Sjungma@eit.uni-kl.de    sc_bitref<X> bit( int i )
42312027Sjungma@eit.uni-kl.de	{ return sc_bitref<X>( back_cast(), i ); }
42412027Sjungma@eit.uni-kl.de
42512027Sjungma@eit.uni-kl.de    sc_bitref_r<X> bit( int i ) const
42612027Sjungma@eit.uni-kl.de	{ return sc_bitref_r<X>( back_cast(), i ); }
42712027Sjungma@eit.uni-kl.de
42812027Sjungma@eit.uni-kl.de
42912027Sjungma@eit.uni-kl.de    // part selection
43012027Sjungma@eit.uni-kl.de
43112027Sjungma@eit.uni-kl.de    sc_subref<X> operator () ( int hi, int lo )
43212027Sjungma@eit.uni-kl.de	{ return sc_subref<X>( back_cast(), hi, lo ); }
43312027Sjungma@eit.uni-kl.de
43412027Sjungma@eit.uni-kl.de    sc_subref_r<X> operator () ( int hi, int lo ) const
43512027Sjungma@eit.uni-kl.de	{ return sc_subref_r<X>( back_cast(), hi, lo ); }
43612027Sjungma@eit.uni-kl.de
43712027Sjungma@eit.uni-kl.de    sc_subref<X> range( int hi, int lo )
43812027Sjungma@eit.uni-kl.de	{ return sc_subref<X>( back_cast(), hi, lo ); }
43912027Sjungma@eit.uni-kl.de
44012027Sjungma@eit.uni-kl.de    sc_subref_r<X> range( int hi, int lo ) const
44112027Sjungma@eit.uni-kl.de	{ return sc_subref_r<X>( back_cast(), hi, lo ); }
44212027Sjungma@eit.uni-kl.de
44312027Sjungma@eit.uni-kl.de
44412027Sjungma@eit.uni-kl.de    // reduce functions
44512027Sjungma@eit.uni-kl.de
44612027Sjungma@eit.uni-kl.de    sc_logic_value_t and_reduce() const;
44712027Sjungma@eit.uni-kl.de
44812027Sjungma@eit.uni-kl.de    sc_logic_value_t nand_reduce() const
44912027Sjungma@eit.uni-kl.de	{ return sc_logic::not_table[and_reduce()]; }
45012027Sjungma@eit.uni-kl.de
45112027Sjungma@eit.uni-kl.de    sc_logic_value_t or_reduce() const;
45212027Sjungma@eit.uni-kl.de
45312027Sjungma@eit.uni-kl.de    sc_logic_value_t nor_reduce() const
45412027Sjungma@eit.uni-kl.de	{ return sc_logic::not_table[or_reduce()]; }
45512027Sjungma@eit.uni-kl.de
45612027Sjungma@eit.uni-kl.de    sc_logic_value_t xor_reduce() const;
45712027Sjungma@eit.uni-kl.de
45812027Sjungma@eit.uni-kl.de    sc_logic_value_t xnor_reduce() const
45912027Sjungma@eit.uni-kl.de	{ return sc_logic::not_table[xor_reduce()]; }
46012027Sjungma@eit.uni-kl.de
46112027Sjungma@eit.uni-kl.de
46212027Sjungma@eit.uni-kl.de    // relational operators
46312027Sjungma@eit.uni-kl.de
46412027Sjungma@eit.uni-kl.de    bool operator == ( const char* b ) const;
46512027Sjungma@eit.uni-kl.de    bool operator == ( const bool* b ) const;
46612027Sjungma@eit.uni-kl.de    bool operator == ( const sc_logic* b ) const;
46712027Sjungma@eit.uni-kl.de    bool operator == ( const sc_unsigned& b ) const;
46812027Sjungma@eit.uni-kl.de    bool operator == ( const sc_signed& b ) const;
46912027Sjungma@eit.uni-kl.de    bool operator == ( const sc_uint_base& b ) const;
47012027Sjungma@eit.uni-kl.de    bool operator == ( const sc_int_base& b ) const;
47112027Sjungma@eit.uni-kl.de    bool operator == ( unsigned long b ) const;
47212027Sjungma@eit.uni-kl.de    bool operator == ( long b ) const;
47312027Sjungma@eit.uni-kl.de    bool operator == ( unsigned int b ) const;
47412027Sjungma@eit.uni-kl.de    bool operator == ( int b ) const;
47512027Sjungma@eit.uni-kl.de    bool operator == ( uint64 b ) const;
47612027Sjungma@eit.uni-kl.de    bool operator == ( int64 b ) const;
47712027Sjungma@eit.uni-kl.de
47812027Sjungma@eit.uni-kl.de
47912027Sjungma@eit.uni-kl.de    // explicit conversions to character string
48012027Sjungma@eit.uni-kl.de
48112027Sjungma@eit.uni-kl.de    const std::string to_string() const;
48212027Sjungma@eit.uni-kl.de    const std::string to_string( sc_numrep ) const;
48312027Sjungma@eit.uni-kl.de    const std::string to_string( sc_numrep, bool ) const;
48412027Sjungma@eit.uni-kl.de
48512027Sjungma@eit.uni-kl.de
48612027Sjungma@eit.uni-kl.de    // explicit conversions
48712027Sjungma@eit.uni-kl.de
48812027Sjungma@eit.uni-kl.de    inline int64 to_int64() const
48912027Sjungma@eit.uni-kl.de	{ return to_anything_signed(); }
49012027Sjungma@eit.uni-kl.de    inline uint64 to_uint64() const;
49112027Sjungma@eit.uni-kl.de    int to_int() const
49212027Sjungma@eit.uni-kl.de	{ return (int)to_anything_signed(); }
49312027Sjungma@eit.uni-kl.de
49412027Sjungma@eit.uni-kl.de    unsigned int to_uint() const
49512027Sjungma@eit.uni-kl.de	{ return (unsigned int)to_anything_unsigned(); }
49612027Sjungma@eit.uni-kl.de
49712027Sjungma@eit.uni-kl.de    long to_long() const
49812027Sjungma@eit.uni-kl.de	{ return (long)to_anything_signed(); }
49912027Sjungma@eit.uni-kl.de
50012027Sjungma@eit.uni-kl.de    unsigned long to_ulong() const
50112027Sjungma@eit.uni-kl.de	{ return (unsigned long)to_anything_unsigned(); }
50212027Sjungma@eit.uni-kl.de
50312027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED
50412027Sjungma@eit.uni-kl.de
50512027Sjungma@eit.uni-kl.de    int to_signed() const
50612027Sjungma@eit.uni-kl.de	{ return to_int(); }
50712027Sjungma@eit.uni-kl.de
50812027Sjungma@eit.uni-kl.de    sc_digit to_unsigned() const
50912027Sjungma@eit.uni-kl.de	{ return to_uint(); }
51012027Sjungma@eit.uni-kl.de
51112027Sjungma@eit.uni-kl.de#endif
51212027Sjungma@eit.uni-kl.de
51312027Sjungma@eit.uni-kl.de
51412027Sjungma@eit.uni-kl.de    // other methods
51512027Sjungma@eit.uni-kl.de
51612027Sjungma@eit.uni-kl.de    void print( ::std::ostream& os = ::std::cout ) const
51712027Sjungma@eit.uni-kl.de	{
51812027Sjungma@eit.uni-kl.de	    // the test below will force printing in binary if decimal is
51912027Sjungma@eit.uni-kl.de	    // specified.
52012027Sjungma@eit.uni-kl.de	    if ( sc_io_base(os, SC_DEC) == SC_DEC )
52112027Sjungma@eit.uni-kl.de	        os << to_string();
52212027Sjungma@eit.uni-kl.de	    else
52312027Sjungma@eit.uni-kl.de	        os << to_string(sc_io_base(os,SC_BIN),sc_io_show_base(os));
52412027Sjungma@eit.uni-kl.de	}
52512027Sjungma@eit.uni-kl.de
52612027Sjungma@eit.uni-kl.de    void scan( ::std::istream& is = ::std::cin );
52712027Sjungma@eit.uni-kl.de
52812027Sjungma@eit.uni-kl.deprotected:
52912027Sjungma@eit.uni-kl.de
53012027Sjungma@eit.uni-kl.de    void check_bounds( int n ) const;  // check if bit n accessible
53112027Sjungma@eit.uni-kl.de    void check_wbounds( int n ) const; // check if word n accessible
53212027Sjungma@eit.uni-kl.de
53312027Sjungma@eit.uni-kl.de    sc_digit to_anything_unsigned() const;
53412027Sjungma@eit.uni-kl.de    int64 to_anything_signed() const;
53512027Sjungma@eit.uni-kl.de};
53612027Sjungma@eit.uni-kl.de
53712027Sjungma@eit.uni-kl.de
53812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
53912027Sjungma@eit.uni-kl.de
54012027Sjungma@eit.uni-kl.de// bitwise operators and functions
54112027Sjungma@eit.uni-kl.de
54212027Sjungma@eit.uni-kl.de// bitwise and
54312027Sjungma@eit.uni-kl.de
54412027Sjungma@eit.uni-kl.detemplate <class X, class Y>
54512027Sjungma@eit.uni-kl.deinline
54612027Sjungma@eit.uni-kl.deX&
54712027Sjungma@eit.uni-kl.deoperator &= ( sc_proxy<X>& px, const sc_proxy<Y>& py );
54812027Sjungma@eit.uni-kl.de
54912027Sjungma@eit.uni-kl.de
55012027Sjungma@eit.uni-kl.detemplate <class X, class Y>
55112027Sjungma@eit.uni-kl.deinline
55212027Sjungma@eit.uni-kl.deconst sc_lv_base
55312027Sjungma@eit.uni-kl.deoperator & ( const sc_proxy<X>& px, const sc_proxy<Y>& py );
55412027Sjungma@eit.uni-kl.de
55512027Sjungma@eit.uni-kl.de
55612027Sjungma@eit.uni-kl.de#define DECL_BITWISE_AND_OP_T(tp)                                             \
55712027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
55812027Sjungma@eit.uni-kl.deinline                                                                        \
55912027Sjungma@eit.uni-kl.deconst sc_lv_base                                                              \
56012027Sjungma@eit.uni-kl.deoperator & ( tp b, const sc_proxy<X>& px );
56112027Sjungma@eit.uni-kl.de
56212027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const char*)
56312027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const bool*)
56412027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_logic*)
56512027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_unsigned&)
56612027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_signed&)
56712027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_uint_base&)
56812027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_int_base&)
56912027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(unsigned long)
57012027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(long)
57112027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(unsigned int)
57212027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(int)
57312027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(uint64)
57412027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(int64)
57512027Sjungma@eit.uni-kl.de
57612027Sjungma@eit.uni-kl.de#undef DECL_BITWISE_AND_OP_T
57712027Sjungma@eit.uni-kl.de
57812027Sjungma@eit.uni-kl.de
57912027Sjungma@eit.uni-kl.de// bitwise or
58012027Sjungma@eit.uni-kl.de
58112027Sjungma@eit.uni-kl.detemplate <class X, class Y>
58212027Sjungma@eit.uni-kl.deinline
58312027Sjungma@eit.uni-kl.deX&
58412027Sjungma@eit.uni-kl.deoperator |= ( sc_proxy<X>& px, const sc_proxy<Y>& py );
58512027Sjungma@eit.uni-kl.de
58612027Sjungma@eit.uni-kl.de
58712027Sjungma@eit.uni-kl.detemplate <class X, class Y>
58812027Sjungma@eit.uni-kl.deinline
58912027Sjungma@eit.uni-kl.deconst sc_lv_base
59012027Sjungma@eit.uni-kl.deoperator | ( const sc_proxy<X>& px, const sc_proxy<Y>& py );
59112027Sjungma@eit.uni-kl.de
59212027Sjungma@eit.uni-kl.de
59312027Sjungma@eit.uni-kl.de#define DECL_BITWISE_OR_OP_T(tp)                                              \
59412027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
59512027Sjungma@eit.uni-kl.deinline                                                                        \
59612027Sjungma@eit.uni-kl.deconst sc_lv_base                                                              \
59712027Sjungma@eit.uni-kl.deoperator | ( tp a, const sc_proxy<X>& px );
59812027Sjungma@eit.uni-kl.de
59912027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const char*)
60012027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const bool*)
60112027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_logic*)
60212027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_unsigned&)
60312027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_signed&)
60412027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_uint_base&)
60512027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_int_base&)
60612027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(unsigned long)
60712027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(long)
60812027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(unsigned int)
60912027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(int)
61012027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(uint64)
61112027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(int64)
61212027Sjungma@eit.uni-kl.de
61312027Sjungma@eit.uni-kl.de#undef DECL_BITWISE_OR_OP_T
61412027Sjungma@eit.uni-kl.de
61512027Sjungma@eit.uni-kl.de
61612027Sjungma@eit.uni-kl.de// bitwise xor
61712027Sjungma@eit.uni-kl.de
61812027Sjungma@eit.uni-kl.detemplate <class X, class Y>
61912027Sjungma@eit.uni-kl.deinline
62012027Sjungma@eit.uni-kl.deX&
62112027Sjungma@eit.uni-kl.deoperator ^= ( sc_proxy<X>& px, const sc_proxy<Y>& py );
62212027Sjungma@eit.uni-kl.de
62312027Sjungma@eit.uni-kl.de
62412027Sjungma@eit.uni-kl.detemplate <class X, class Y>
62512027Sjungma@eit.uni-kl.deinline
62612027Sjungma@eit.uni-kl.deconst sc_lv_base
62712027Sjungma@eit.uni-kl.deoperator ^ ( const sc_proxy<X>& px, const sc_proxy<Y>& py );
62812027Sjungma@eit.uni-kl.de
62912027Sjungma@eit.uni-kl.de
63012027Sjungma@eit.uni-kl.de#define DECL_BITWISE_XOR_OP_T(tp)                                             \
63112027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
63212027Sjungma@eit.uni-kl.deinline                                                                        \
63312027Sjungma@eit.uni-kl.deconst sc_lv_base                                                              \
63412027Sjungma@eit.uni-kl.deoperator ^ ( tp a, const sc_proxy<X>& px );
63512027Sjungma@eit.uni-kl.de
63612027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const char*)
63712027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const bool*)
63812027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_logic*)
63912027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_unsigned&)
64012027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_signed&)
64112027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_uint_base&)
64212027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_int_base&)
64312027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(unsigned long)
64412027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(long)
64512027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(unsigned int)
64612027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(int)
64712027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(uint64)
64812027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(int64)
64912027Sjungma@eit.uni-kl.de
65012027Sjungma@eit.uni-kl.de#undef DECL_BITWISE_XOR_OP_T
65112027Sjungma@eit.uni-kl.de
65212027Sjungma@eit.uni-kl.de
65312027Sjungma@eit.uni-kl.de// relational operators
65412027Sjungma@eit.uni-kl.de
65512027Sjungma@eit.uni-kl.detemplate <class X, class Y>
65612027Sjungma@eit.uni-kl.deinline
65712027Sjungma@eit.uni-kl.debool
65812027Sjungma@eit.uni-kl.deoperator == ( const sc_proxy<X>& px, const sc_proxy<Y>& py );
65912027Sjungma@eit.uni-kl.de
66012027Sjungma@eit.uni-kl.detemplate <class X, class Y>
66112027Sjungma@eit.uni-kl.deinline
66212027Sjungma@eit.uni-kl.debool
66312027Sjungma@eit.uni-kl.deoperator != ( const sc_proxy<X>& px, const sc_proxy<Y>& py );
66412027Sjungma@eit.uni-kl.de
66512027Sjungma@eit.uni-kl.de
66612027Sjungma@eit.uni-kl.de#define DECL_REL_OP_T(tp)                                                     \
66712027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
66812027Sjungma@eit.uni-kl.deinline                                                                        \
66912027Sjungma@eit.uni-kl.debool                                                                          \
67012027Sjungma@eit.uni-kl.deoperator == ( tp b, const sc_proxy<X>& px );                                  \
67112027Sjungma@eit.uni-kl.de                                                                              \
67212027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
67312027Sjungma@eit.uni-kl.deinline                                                                        \
67412027Sjungma@eit.uni-kl.debool                                                                          \
67512027Sjungma@eit.uni-kl.deoperator != ( const sc_proxy<X>& px, tp b );                                  \
67612027Sjungma@eit.uni-kl.de                                                                              \
67712027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
67812027Sjungma@eit.uni-kl.deinline                                                                        \
67912027Sjungma@eit.uni-kl.debool                                                                          \
68012027Sjungma@eit.uni-kl.deoperator != ( tp b, const sc_proxy<X>& px );
68112027Sjungma@eit.uni-kl.de
68212027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const char*)
68312027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const bool*)
68412027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_logic*)
68512027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_unsigned&)
68612027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_signed&)
68712027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_uint_base&)
68812027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_int_base&)
68912027Sjungma@eit.uni-kl.deDECL_REL_OP_T(unsigned long)
69012027Sjungma@eit.uni-kl.deDECL_REL_OP_T(long)
69112027Sjungma@eit.uni-kl.deDECL_REL_OP_T(unsigned int)
69212027Sjungma@eit.uni-kl.deDECL_REL_OP_T(int)
69312027Sjungma@eit.uni-kl.deDECL_REL_OP_T(uint64)
69412027Sjungma@eit.uni-kl.deDECL_REL_OP_T(int64)
69512027Sjungma@eit.uni-kl.de
69612027Sjungma@eit.uni-kl.de#undef DECL_REL_OP_T
69712027Sjungma@eit.uni-kl.de
69812027Sjungma@eit.uni-kl.de
69912027Sjungma@eit.uni-kl.de// l-value concatenation
70012027Sjungma@eit.uni-kl.de
70112027Sjungma@eit.uni-kl.de// Due to the fact that temporary objects cannot be passed to non-const
70212027Sjungma@eit.uni-kl.de// references, we have to enumerate, use call by value, and use dynamic
70312027Sjungma@eit.uni-kl.de// memory allocation (and deallocation).
70412027Sjungma@eit.uni-kl.de
70512027Sjungma@eit.uni-kl.de
70612027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
70712027Sjungma@eit.uni-kl.de
70812027Sjungma@eit.uni-kl.detemplate <class X>
70912027Sjungma@eit.uni-kl.deinline
71012027Sjungma@eit.uni-kl.devoid
71112027Sjungma@eit.uni-kl.deget_words_( const X& x, int wi, sc_digit& x_dw, sc_digit& x_cw )
71212027Sjungma@eit.uni-kl.de{
71312027Sjungma@eit.uni-kl.de    x_dw = x.get_word( wi );
71412027Sjungma@eit.uni-kl.de    x_cw = x.get_cword( wi );
71512027Sjungma@eit.uni-kl.de}
71612027Sjungma@eit.uni-kl.de
71712027Sjungma@eit.uni-kl.detemplate <class X>
71812027Sjungma@eit.uni-kl.deinline
71912027Sjungma@eit.uni-kl.devoid
72012027Sjungma@eit.uni-kl.deset_words_( X& x, int wi, sc_digit x_dw, sc_digit x_cw )
72112027Sjungma@eit.uni-kl.de{
72212027Sjungma@eit.uni-kl.de    x.set_word( wi, x_dw );
72312027Sjungma@eit.uni-kl.de    x.set_cword( wi, x_cw );
72412027Sjungma@eit.uni-kl.de}
72512027Sjungma@eit.uni-kl.de
72612027Sjungma@eit.uni-kl.detemplate <class X>
72712027Sjungma@eit.uni-kl.deinline
72812027Sjungma@eit.uni-kl.devoid
72912027Sjungma@eit.uni-kl.deextend_sign_w_( X& x, int wi, bool sign )
73012027Sjungma@eit.uni-kl.de{
73112027Sjungma@eit.uni-kl.de    int sz = x.size();
73212027Sjungma@eit.uni-kl.de    unsigned int sgn = (sign ? ~SC_DIGIT_ZERO : SC_DIGIT_ZERO);
73312027Sjungma@eit.uni-kl.de    for( int i = wi; i < sz; ++ i ) {
73412027Sjungma@eit.uni-kl.de	set_words_( x, i, sgn, SC_DIGIT_ZERO );
73512027Sjungma@eit.uni-kl.de    }
73612027Sjungma@eit.uni-kl.de}
73712027Sjungma@eit.uni-kl.de
73812027Sjungma@eit.uni-kl.de
73912027Sjungma@eit.uni-kl.de// assignment functions
74012027Sjungma@eit.uni-kl.de
74112027Sjungma@eit.uni-kl.detemplate <class X, class Y>
74212027Sjungma@eit.uni-kl.deinline
74312027Sjungma@eit.uni-kl.devoid
74412027Sjungma@eit.uni-kl.deassign_p_( sc_proxy<X>& px, const sc_proxy<Y>& py )
74512027Sjungma@eit.uni-kl.de{
74612027Sjungma@eit.uni-kl.de    if( (void*) &px != (void*) &py ) {
74712027Sjungma@eit.uni-kl.de	X& x = px.back_cast();
74812027Sjungma@eit.uni-kl.de	const Y& y = py.back_cast();
74912027Sjungma@eit.uni-kl.de	int sz = x.size();
75012027Sjungma@eit.uni-kl.de	int min_sz = sc_min( sz, y.size() );
75112027Sjungma@eit.uni-kl.de	int i = 0;
75212027Sjungma@eit.uni-kl.de	for( ; i < min_sz; ++ i ) {
75312027Sjungma@eit.uni-kl.de	    set_words_( x, i, y.get_word( i ), y.get_cword( i ) );
75412027Sjungma@eit.uni-kl.de	}
75512027Sjungma@eit.uni-kl.de	// extend with zeros
75612027Sjungma@eit.uni-kl.de	extend_sign_w_( x, i, false );
75712027Sjungma@eit.uni-kl.de	x.clean_tail();
75812027Sjungma@eit.uni-kl.de    }
75912027Sjungma@eit.uni-kl.de}
76012027Sjungma@eit.uni-kl.de
76112027Sjungma@eit.uni-kl.de// Vector types that are not derived from sc_proxy, sc_int_base,
76212027Sjungma@eit.uni-kl.de// sc_uint_base, sc_signed, or sc_unsigned, must have a length()
76312027Sjungma@eit.uni-kl.de// function and an operator []. The vector argument type must support
76412027Sjungma@eit.uni-kl.de// accessing bits that are beyond the msb. The vector argument type
76512027Sjungma@eit.uni-kl.de// decides what to do there (e.g. sign extension or zero padding).
76612027Sjungma@eit.uni-kl.de
76712027Sjungma@eit.uni-kl.detemplate <class X, class T>
76812027Sjungma@eit.uni-kl.deinline
76912027Sjungma@eit.uni-kl.devoid
77012027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const T& a )
77112027Sjungma@eit.uni-kl.de{
77212027Sjungma@eit.uni-kl.de    X& x = px.back_cast();
77312027Sjungma@eit.uni-kl.de    int i;
77412027Sjungma@eit.uni-kl.de    int len_x = x.length();
77512027Sjungma@eit.uni-kl.de    int len_a = a.length();
77612027Sjungma@eit.uni-kl.de    if ( len_a > len_x ) len_a = len_x;
77712027Sjungma@eit.uni-kl.de    for( i = 0 ; i < len_a; ++ i ) {
77812027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( (bool) a[i] ) );
77912027Sjungma@eit.uni-kl.de    }
78012027Sjungma@eit.uni-kl.de    for( ; i < len_x; ++ i ) {
78112027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( false ) );
78212027Sjungma@eit.uni-kl.de    }
78312027Sjungma@eit.uni-kl.de}
78412027Sjungma@eit.uni-kl.de
78512027Sjungma@eit.uni-kl.detemplate <class X>
78612027Sjungma@eit.uni-kl.deinline
78712027Sjungma@eit.uni-kl.devoid
78812027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const sc_int_base& a )
78912027Sjungma@eit.uni-kl.de{
79012027Sjungma@eit.uni-kl.de    X& x = px.back_cast();
79112027Sjungma@eit.uni-kl.de	int i;
79212027Sjungma@eit.uni-kl.de    bool sign = a < 0;
79312027Sjungma@eit.uni-kl.de    int len_x = x.length();
79412027Sjungma@eit.uni-kl.de    int len_a = a.length();
79512027Sjungma@eit.uni-kl.de    if ( len_a > len_x ) len_a = len_x;
79612027Sjungma@eit.uni-kl.de    for( i = 0 ; i < len_a; ++ i ) {
79712027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( (bool) a[i] ) );
79812027Sjungma@eit.uni-kl.de    }
79912027Sjungma@eit.uni-kl.de    for( ; i < len_x; ++ i ) {
80012027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( sign ) );
80112027Sjungma@eit.uni-kl.de    }
80212027Sjungma@eit.uni-kl.de}
80312027Sjungma@eit.uni-kl.de
80412027Sjungma@eit.uni-kl.detemplate <class X>
80512027Sjungma@eit.uni-kl.deinline
80612027Sjungma@eit.uni-kl.devoid
80712027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const sc_signed& a )
80812027Sjungma@eit.uni-kl.de{
80912027Sjungma@eit.uni-kl.de    X& x = px.back_cast();
81012027Sjungma@eit.uni-kl.de	int i;
81112027Sjungma@eit.uni-kl.de    bool sign = a < 0;
81212027Sjungma@eit.uni-kl.de    int len_x = x.length();
81312027Sjungma@eit.uni-kl.de    int len_a = a.length();
81412027Sjungma@eit.uni-kl.de    if ( len_a > len_x ) len_a = len_x;
81512027Sjungma@eit.uni-kl.de    for( i = 0 ; i < len_a; ++ i ) {
81612027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( (bool) a[i] ) );
81712027Sjungma@eit.uni-kl.de    }
81812027Sjungma@eit.uni-kl.de    for( ; i < len_x; ++ i ) {
81912027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( sign ) );
82012027Sjungma@eit.uni-kl.de    }
82112027Sjungma@eit.uni-kl.de}
82212027Sjungma@eit.uni-kl.de
82312027Sjungma@eit.uni-kl.detemplate <class X>
82412027Sjungma@eit.uni-kl.deinline
82512027Sjungma@eit.uni-kl.devoid
82612027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const sc_uint_base& a )
82712027Sjungma@eit.uni-kl.de{
82812027Sjungma@eit.uni-kl.de    X& x = px.back_cast();
82912027Sjungma@eit.uni-kl.de	int i;
83012027Sjungma@eit.uni-kl.de    int len_x = x.length();
83112027Sjungma@eit.uni-kl.de    int len_a = a.length();
83212027Sjungma@eit.uni-kl.de    if ( len_a > len_x ) len_a = len_x;
83312027Sjungma@eit.uni-kl.de    for( i = 0 ; i < len_a; ++ i ) {
83412027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( (bool) a[i] ) );
83512027Sjungma@eit.uni-kl.de    }
83612027Sjungma@eit.uni-kl.de    for( ; i < len_x; ++ i ) {
83712027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( false ) );
83812027Sjungma@eit.uni-kl.de    }
83912027Sjungma@eit.uni-kl.de}
84012027Sjungma@eit.uni-kl.de
84112027Sjungma@eit.uni-kl.detemplate <class X>
84212027Sjungma@eit.uni-kl.deinline
84312027Sjungma@eit.uni-kl.devoid
84412027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const sc_unsigned& a )
84512027Sjungma@eit.uni-kl.de{
84612027Sjungma@eit.uni-kl.de    X& x = px.back_cast();
84712027Sjungma@eit.uni-kl.de	int i;
84812027Sjungma@eit.uni-kl.de    int len_x = x.length();
84912027Sjungma@eit.uni-kl.de    int len_a = a.length();
85012027Sjungma@eit.uni-kl.de    if ( len_a > len_x ) len_a = len_x;
85112027Sjungma@eit.uni-kl.de    for( i = 0 ; i < len_a; ++ i ) {
85212027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( (bool) a[i] ) );
85312027Sjungma@eit.uni-kl.de    }
85412027Sjungma@eit.uni-kl.de    for( ; i < len_x; ++ i ) {
85512027Sjungma@eit.uni-kl.de        x.set_bit( i, sc_logic_value_t( false ) );
85612027Sjungma@eit.uni-kl.de    }
85712027Sjungma@eit.uni-kl.de}
85812027Sjungma@eit.uni-kl.de
85912027Sjungma@eit.uni-kl.de
86012027Sjungma@eit.uni-kl.de// assignment operators
86112027Sjungma@eit.uni-kl.de
86212027Sjungma@eit.uni-kl.detemplate <class X>
86312027Sjungma@eit.uni-kl.deinline
86412027Sjungma@eit.uni-kl.deX&
86512027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( const char* a )
86612027Sjungma@eit.uni-kl.de{
86712027Sjungma@eit.uni-kl.de    X& x = back_cast();
86812027Sjungma@eit.uni-kl.de    std::string s = convert_to_bin( a );
86912027Sjungma@eit.uni-kl.de    int len = x.length();
87012027Sjungma@eit.uni-kl.de    int s_len = s.length() - 1;
87112027Sjungma@eit.uni-kl.de    int min_len = sc_min( len, s_len );
87212027Sjungma@eit.uni-kl.de    int i = 0;
87312027Sjungma@eit.uni-kl.de    for( ; i < min_len; ++ i ) {
87412027Sjungma@eit.uni-kl.de	char c = s[s_len - i - 1];
87512027Sjungma@eit.uni-kl.de	x.set_bit( i, sc_logic::char_to_logic[(int)c] );
87612027Sjungma@eit.uni-kl.de    }
87712027Sjungma@eit.uni-kl.de    // if formatted, fill the rest with sign(s), otherwise fill with zeros
87812027Sjungma@eit.uni-kl.de    sc_logic_value_t fill = (s[s_len] == 'F' ? sc_logic_value_t( s[0] - '0' )
87912027Sjungma@eit.uni-kl.de		                             : sc_logic_value_t( 0 ));
88012027Sjungma@eit.uni-kl.de    for( ; i < len; ++ i ) {
88112027Sjungma@eit.uni-kl.de	x.set_bit( i, fill );
88212027Sjungma@eit.uni-kl.de    }
88312027Sjungma@eit.uni-kl.de    return x;
88412027Sjungma@eit.uni-kl.de}
88512027Sjungma@eit.uni-kl.de
88612027Sjungma@eit.uni-kl.detemplate <class X>
88712027Sjungma@eit.uni-kl.deinline
88812027Sjungma@eit.uni-kl.deX&
88912027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( const bool* a )
89012027Sjungma@eit.uni-kl.de{
89112027Sjungma@eit.uni-kl.de    // the length of 'a' must be larger than or equal to the length of 'this'
89212027Sjungma@eit.uni-kl.de    X& x = back_cast();
89312027Sjungma@eit.uni-kl.de    int len = x.length();
89412027Sjungma@eit.uni-kl.de    for( int i = 0; i < len; ++ i ) {
89512027Sjungma@eit.uni-kl.de	x.set_bit( i, sc_logic_value_t( a[i] ) );
89612027Sjungma@eit.uni-kl.de    }
89712027Sjungma@eit.uni-kl.de    return x;
89812027Sjungma@eit.uni-kl.de}
89912027Sjungma@eit.uni-kl.de
90012027Sjungma@eit.uni-kl.detemplate <class X>
90112027Sjungma@eit.uni-kl.deinline
90212027Sjungma@eit.uni-kl.deX&
90312027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( const sc_logic* a )
90412027Sjungma@eit.uni-kl.de{
90512027Sjungma@eit.uni-kl.de    // the length of 'a' must be larger than or equal to the length of 'this'
90612027Sjungma@eit.uni-kl.de    X& x = back_cast();
90712027Sjungma@eit.uni-kl.de    int len = x.length();
90812027Sjungma@eit.uni-kl.de    for( int i = 0; i < len; ++ i ) {
90912027Sjungma@eit.uni-kl.de	x.set_bit( i, a[i].value() );
91012027Sjungma@eit.uni-kl.de    }
91112027Sjungma@eit.uni-kl.de    return x;
91212027Sjungma@eit.uni-kl.de}
91312027Sjungma@eit.uni-kl.de
91412027Sjungma@eit.uni-kl.detemplate <class X>
91512027Sjungma@eit.uni-kl.deinline
91612027Sjungma@eit.uni-kl.deX&
91712027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( unsigned int a )
91812027Sjungma@eit.uni-kl.de{
91912027Sjungma@eit.uni-kl.de    X& x = back_cast();
92012027Sjungma@eit.uni-kl.de    set_words_( x, 0, (sc_digit)a, SC_DIGIT_ZERO );
92112027Sjungma@eit.uni-kl.de    // extend with zeros
92212027Sjungma@eit.uni-kl.de    extend_sign_w_( x, 1, false );
92312027Sjungma@eit.uni-kl.de    x.clean_tail();
92412027Sjungma@eit.uni-kl.de    return x;
92512027Sjungma@eit.uni-kl.de}
92612027Sjungma@eit.uni-kl.de
92712027Sjungma@eit.uni-kl.detemplate <class X>
92812027Sjungma@eit.uni-kl.deinline
92912027Sjungma@eit.uni-kl.deX&
93012027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( int a )
93112027Sjungma@eit.uni-kl.de{
93212027Sjungma@eit.uni-kl.de    X& x = back_cast();
93312027Sjungma@eit.uni-kl.de    set_words_( x, 0, (sc_digit) a, SC_DIGIT_ZERO );
93412027Sjungma@eit.uni-kl.de    // extend with sign(a)
93512027Sjungma@eit.uni-kl.de    extend_sign_w_( x, 1, (a < 0) );
93612027Sjungma@eit.uni-kl.de    x.clean_tail();
93712027Sjungma@eit.uni-kl.de    return x;
93812027Sjungma@eit.uni-kl.de}
93912027Sjungma@eit.uni-kl.de
94012027Sjungma@eit.uni-kl.de#if defined(SC_LONG_64)
94112027Sjungma@eit.uni-kl.de	template <class X>
94212027Sjungma@eit.uni-kl.de	inline
94312027Sjungma@eit.uni-kl.de	X&
94412027Sjungma@eit.uni-kl.de	sc_proxy<X>::assign_( unsigned long a )
94512027Sjungma@eit.uni-kl.de	{
94612027Sjungma@eit.uni-kl.de		X& x = back_cast();
94712027Sjungma@eit.uni-kl.de		set_words_( x, 0, ((sc_digit) a & ~SC_DIGIT_ZERO), SC_DIGIT_ZERO );
94812027Sjungma@eit.uni-kl.de		if( x.size() > 1 ) {
94912027Sjungma@eit.uni-kl.de			set_words_( x, 1,
95012027Sjungma@eit.uni-kl.de				((sc_digit) (a >> SC_DIGIT_SIZE) & ~SC_DIGIT_ZERO),
95112027Sjungma@eit.uni-kl.de					SC_DIGIT_ZERO );
95212027Sjungma@eit.uni-kl.de		// extend with zeros
95312027Sjungma@eit.uni-kl.de		extend_sign_w_( x, 2, false );
95412027Sjungma@eit.uni-kl.de		}
95512027Sjungma@eit.uni-kl.de		x.clean_tail();
95612027Sjungma@eit.uni-kl.de		return x;
95712027Sjungma@eit.uni-kl.de	}
95812027Sjungma@eit.uni-kl.de
95912027Sjungma@eit.uni-kl.de	template <class X>
96012027Sjungma@eit.uni-kl.de	inline
96112027Sjungma@eit.uni-kl.de	X&
96212027Sjungma@eit.uni-kl.de	sc_proxy<X>::assign_( long a )
96312027Sjungma@eit.uni-kl.de	{
96412027Sjungma@eit.uni-kl.de		X& x = back_cast();
96512027Sjungma@eit.uni-kl.de		set_words_( x, 0, ((sc_digit) a & ~SC_DIGIT_ZERO), SC_DIGIT_ZERO );
96612027Sjungma@eit.uni-kl.de		if( x.size() > 1 ) {
96712027Sjungma@eit.uni-kl.de			set_words_( x, 1,
96812027Sjungma@eit.uni-kl.de				((sc_digit) ((uint64) a >> SC_DIGIT_SIZE) & ~SC_DIGIT_ZERO),
96912027Sjungma@eit.uni-kl.de				SC_DIGIT_ZERO );
97012027Sjungma@eit.uni-kl.de		// extend with sign(a)
97112027Sjungma@eit.uni-kl.de		extend_sign_w_( x, 2, (a < 0) );
97212027Sjungma@eit.uni-kl.de		}
97312027Sjungma@eit.uni-kl.de		x.clean_tail();
97412027Sjungma@eit.uni-kl.de		return x;
97512027Sjungma@eit.uni-kl.de	}
97612027Sjungma@eit.uni-kl.de
97712027Sjungma@eit.uni-kl.de#else
97812027Sjungma@eit.uni-kl.de    template <class X>
97912027Sjungma@eit.uni-kl.de    inline
98012027Sjungma@eit.uni-kl.de    X&
98112027Sjungma@eit.uni-kl.de    sc_proxy<X>::assign_( unsigned long a )
98212027Sjungma@eit.uni-kl.de    {
98312027Sjungma@eit.uni-kl.de        X& x = back_cast();
98412027Sjungma@eit.uni-kl.de        set_words_( x, 0, (sc_digit)a, SC_DIGIT_ZERO );
98512027Sjungma@eit.uni-kl.de        // extend with zeros
98612027Sjungma@eit.uni-kl.de        extend_sign_w_( x, 1, false );
98712027Sjungma@eit.uni-kl.de        x.clean_tail();
98812027Sjungma@eit.uni-kl.de        return x;
98912027Sjungma@eit.uni-kl.de    }
99012027Sjungma@eit.uni-kl.de
99112027Sjungma@eit.uni-kl.de    template <class X>
99212027Sjungma@eit.uni-kl.de    inline
99312027Sjungma@eit.uni-kl.de    X&
99412027Sjungma@eit.uni-kl.de    sc_proxy<X>::assign_( long a )
99512027Sjungma@eit.uni-kl.de    {
99612027Sjungma@eit.uni-kl.de        X& x = back_cast();
99712027Sjungma@eit.uni-kl.de        set_words_( x, 0, (sc_digit) a, SC_DIGIT_ZERO );
99812027Sjungma@eit.uni-kl.de        // extend with sign(a)
99912027Sjungma@eit.uni-kl.de        extend_sign_w_( x, 1, (a < 0) );
100012027Sjungma@eit.uni-kl.de        x.clean_tail();
100112027Sjungma@eit.uni-kl.de        return x;
100212027Sjungma@eit.uni-kl.de    }
100312027Sjungma@eit.uni-kl.de#endif
100412027Sjungma@eit.uni-kl.detemplate <class X>
100512027Sjungma@eit.uni-kl.deinline
100612027Sjungma@eit.uni-kl.deX&
100712027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( uint64 a )
100812027Sjungma@eit.uni-kl.de{
100912027Sjungma@eit.uni-kl.de    X& x = back_cast();
101012027Sjungma@eit.uni-kl.de    set_words_( x, 0, ((sc_digit) a & ~SC_DIGIT_ZERO), SC_DIGIT_ZERO );
101112027Sjungma@eit.uni-kl.de    if( x.size() > 1 ) {
101212027Sjungma@eit.uni-kl.de	set_words_( x, 1,
101312027Sjungma@eit.uni-kl.de		    ((sc_digit) (a >> SC_DIGIT_SIZE) & ~SC_DIGIT_ZERO),
101412027Sjungma@eit.uni-kl.de		    SC_DIGIT_ZERO );
101512027Sjungma@eit.uni-kl.de	// extend with zeros
101612027Sjungma@eit.uni-kl.de	extend_sign_w_( x, 2, false );
101712027Sjungma@eit.uni-kl.de    }
101812027Sjungma@eit.uni-kl.de    x.clean_tail();
101912027Sjungma@eit.uni-kl.de    return x;
102012027Sjungma@eit.uni-kl.de}
102112027Sjungma@eit.uni-kl.de
102212027Sjungma@eit.uni-kl.detemplate <class X>
102312027Sjungma@eit.uni-kl.deinline
102412027Sjungma@eit.uni-kl.deX&
102512027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( int64 a )
102612027Sjungma@eit.uni-kl.de{
102712027Sjungma@eit.uni-kl.de    X& x = back_cast();
102812027Sjungma@eit.uni-kl.de    set_words_( x, 0, ((sc_digit) a & ~SC_DIGIT_ZERO), SC_DIGIT_ZERO );
102912027Sjungma@eit.uni-kl.de    if( x.size() > 1 ) {
103012027Sjungma@eit.uni-kl.de	set_words_( x, 1,
103112027Sjungma@eit.uni-kl.de		    ((sc_digit) ((uint64) a >> SC_DIGIT_SIZE) & ~SC_DIGIT_ZERO),
103212027Sjungma@eit.uni-kl.de		    SC_DIGIT_ZERO );
103312027Sjungma@eit.uni-kl.de	// extend with sign(a)
103412027Sjungma@eit.uni-kl.de	extend_sign_w_( x, 2, (a < 0) );
103512027Sjungma@eit.uni-kl.de    }
103612027Sjungma@eit.uni-kl.de    x.clean_tail();
103712027Sjungma@eit.uni-kl.de    return x;
103812027Sjungma@eit.uni-kl.de}
103912027Sjungma@eit.uni-kl.de
104012027Sjungma@eit.uni-kl.de
104112027Sjungma@eit.uni-kl.de// bitwise operators and functions
104212027Sjungma@eit.uni-kl.de
104312027Sjungma@eit.uni-kl.de// bitwise complement
104412027Sjungma@eit.uni-kl.de
104512027Sjungma@eit.uni-kl.detemplate <class X>
104612027Sjungma@eit.uni-kl.deinline
104712027Sjungma@eit.uni-kl.deX&
104812027Sjungma@eit.uni-kl.desc_proxy<X>::b_not()
104912027Sjungma@eit.uni-kl.de{
105012027Sjungma@eit.uni-kl.de    X& x = back_cast();
105112027Sjungma@eit.uni-kl.de    int sz = x.size();
105212027Sjungma@eit.uni-kl.de    for( int i = 0; i < sz; ++ i ) {
105312027Sjungma@eit.uni-kl.de	sc_digit x_dw, x_cw;
105412027Sjungma@eit.uni-kl.de	get_words_( x, i, x_dw, x_cw );
105512027Sjungma@eit.uni-kl.de	x.set_word( i, x_cw | ~x_dw );
105612027Sjungma@eit.uni-kl.de    }
105712027Sjungma@eit.uni-kl.de    x.clean_tail();
105812027Sjungma@eit.uni-kl.de    return x;
105912027Sjungma@eit.uni-kl.de}
106012027Sjungma@eit.uni-kl.de
106112027Sjungma@eit.uni-kl.de
106212027Sjungma@eit.uni-kl.de// bitwise and
106312027Sjungma@eit.uni-kl.de
106412027Sjungma@eit.uni-kl.detemplate <class X, class Y>
106512027Sjungma@eit.uni-kl.deinline
106612027Sjungma@eit.uni-kl.deX&
106712027Sjungma@eit.uni-kl.deb_and_assign_( sc_proxy<X>& px, const sc_proxy<Y>& py )
106812027Sjungma@eit.uni-kl.de{
106912027Sjungma@eit.uni-kl.de    X& x = px.back_cast();
107012027Sjungma@eit.uni-kl.de    const Y& y = py.back_cast();
107112027Sjungma@eit.uni-kl.de    assert( x.length() == y.length() );
107212027Sjungma@eit.uni-kl.de    int sz = x.size();
107312027Sjungma@eit.uni-kl.de    for( int i = 0; i < sz; ++ i ) {
107412027Sjungma@eit.uni-kl.de	sc_digit x_dw, x_cw, y_dw, y_cw;
107512027Sjungma@eit.uni-kl.de	get_words_( x, i, x_dw, x_cw );
107612027Sjungma@eit.uni-kl.de	get_words_( y, i, y_dw, y_cw );
107712027Sjungma@eit.uni-kl.de	sc_digit cw = (x_dw & y_cw) | (x_cw & y_dw) | (x_cw & y_cw);
107812027Sjungma@eit.uni-kl.de	sc_digit dw = cw | (x_dw & y_dw);
107912027Sjungma@eit.uni-kl.de	set_words_( x, i, dw, cw );
108012027Sjungma@eit.uni-kl.de    }
108112027Sjungma@eit.uni-kl.de    // tail cleaning not needed
108212027Sjungma@eit.uni-kl.de    return x;
108312027Sjungma@eit.uni-kl.de}
108412027Sjungma@eit.uni-kl.de
108512027Sjungma@eit.uni-kl.de
108612027Sjungma@eit.uni-kl.de// bitwise or
108712027Sjungma@eit.uni-kl.de
108812027Sjungma@eit.uni-kl.detemplate <class X, class Y>
108912027Sjungma@eit.uni-kl.deinline
109012027Sjungma@eit.uni-kl.deX&
109112027Sjungma@eit.uni-kl.deb_or_assign_( sc_proxy<X>& px, const sc_proxy<Y>& py )
109212027Sjungma@eit.uni-kl.de{
109312027Sjungma@eit.uni-kl.de    X& x = px.back_cast();
109412027Sjungma@eit.uni-kl.de    const Y& y = py.back_cast();
109512027Sjungma@eit.uni-kl.de    assert( x.length() == y.length() );
109612027Sjungma@eit.uni-kl.de    int sz = x.size();
109712027Sjungma@eit.uni-kl.de    for( int i = 0; i < sz; ++ i ) {
109812027Sjungma@eit.uni-kl.de	sc_digit x_dw, x_cw, y_dw, y_cw;
109912027Sjungma@eit.uni-kl.de	get_words_( x, i, x_dw, x_cw );
110012027Sjungma@eit.uni-kl.de	get_words_( y, i, y_dw, y_cw );
110112027Sjungma@eit.uni-kl.de	sc_digit cw = (x_cw & y_cw) | (x_cw & ~y_dw) | (~x_dw & y_cw);
110212027Sjungma@eit.uni-kl.de	sc_digit dw = cw | x_dw | y_dw;
110312027Sjungma@eit.uni-kl.de	set_words_( x, i, dw, cw );
110412027Sjungma@eit.uni-kl.de    }
110512027Sjungma@eit.uni-kl.de    // tail cleaning not needed
110612027Sjungma@eit.uni-kl.de    return x;
110712027Sjungma@eit.uni-kl.de}
110812027Sjungma@eit.uni-kl.de
110912027Sjungma@eit.uni-kl.de
111012027Sjungma@eit.uni-kl.de// bitwise xor
111112027Sjungma@eit.uni-kl.de
111212027Sjungma@eit.uni-kl.detemplate <class X, class Y>
111312027Sjungma@eit.uni-kl.deinline
111412027Sjungma@eit.uni-kl.deX&
111512027Sjungma@eit.uni-kl.deb_xor_assign_( sc_proxy<X>& a, const sc_proxy<Y>& b )
111612027Sjungma@eit.uni-kl.de{
111712027Sjungma@eit.uni-kl.de    X& x = a.back_cast();
111812027Sjungma@eit.uni-kl.de    const Y& y = b.back_cast();
111912027Sjungma@eit.uni-kl.de    assert( x.length() == y.length() );
112012027Sjungma@eit.uni-kl.de    int sz = x.size();
112112027Sjungma@eit.uni-kl.de    for( int i = 0; i < sz; ++ i ) {
112212027Sjungma@eit.uni-kl.de	sc_digit x_dw, x_cw, y_dw, y_cw;
112312027Sjungma@eit.uni-kl.de	get_words_( x, i, x_dw, x_cw );
112412027Sjungma@eit.uni-kl.de	get_words_( y, i, y_dw, y_cw );
112512027Sjungma@eit.uni-kl.de	sc_digit cw = x_cw | y_cw;
112612027Sjungma@eit.uni-kl.de	sc_digit dw = cw | (x_dw ^ y_dw);
112712027Sjungma@eit.uni-kl.de	set_words_( x, i, dw, cw );
112812027Sjungma@eit.uni-kl.de    }
112912027Sjungma@eit.uni-kl.de    // tail cleaning not needed
113012027Sjungma@eit.uni-kl.de    return x;
113112027Sjungma@eit.uni-kl.de}
113212027Sjungma@eit.uni-kl.de
113312027Sjungma@eit.uni-kl.de
113412027Sjungma@eit.uni-kl.de// bitwise left shift
113512027Sjungma@eit.uni-kl.de
113612027Sjungma@eit.uni-kl.detemplate <class X>
113712027Sjungma@eit.uni-kl.deinline
113812027Sjungma@eit.uni-kl.deX&
113912027Sjungma@eit.uni-kl.desc_proxy<X>::operator <<= ( int n )
114012027Sjungma@eit.uni-kl.de{
114112027Sjungma@eit.uni-kl.de    X& x = back_cast();
114212027Sjungma@eit.uni-kl.de    if( n < 0 ) {
114312027Sjungma@eit.uni-kl.de	char msg[BUFSIZ];
114412027Sjungma@eit.uni-kl.de	std::sprintf( msg,
114512027Sjungma@eit.uni-kl.de		 "left shift operation is only allowed with positive "
114612027Sjungma@eit.uni-kl.de		 "shift values, shift value = %d", n );
114712027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
114812027Sjungma@eit.uni-kl.de    }
114912027Sjungma@eit.uni-kl.de    if( n >= x.length() ) {
115012027Sjungma@eit.uni-kl.de	extend_sign_w_( x, 0, false );
115112027Sjungma@eit.uni-kl.de	// no tail cleaning needed
115212027Sjungma@eit.uni-kl.de	return x;
115312027Sjungma@eit.uni-kl.de    }
115412027Sjungma@eit.uni-kl.de    int sz = x.size();
115512027Sjungma@eit.uni-kl.de    int wn = n / SC_DIGIT_SIZE;
115612027Sjungma@eit.uni-kl.de    int bn = n % SC_DIGIT_SIZE;
115712027Sjungma@eit.uni-kl.de    if( wn != 0 ) {
115812027Sjungma@eit.uni-kl.de	// shift words
115912027Sjungma@eit.uni-kl.de	int i = sz - 1;
116012027Sjungma@eit.uni-kl.de	for( ; i >= wn; -- i ) {
116112027Sjungma@eit.uni-kl.de	    set_words_( x, i, x.get_word( i - wn ), x.get_cword( i - wn ) );
116212027Sjungma@eit.uni-kl.de	}
116312027Sjungma@eit.uni-kl.de	for( ; i >= 0; -- i ) {
116412027Sjungma@eit.uni-kl.de	    set_words_( x, i, SC_DIGIT_ZERO, SC_DIGIT_ZERO );
116512027Sjungma@eit.uni-kl.de	}
116612027Sjungma@eit.uni-kl.de    }
116712027Sjungma@eit.uni-kl.de    if( bn != 0 ) {
116812027Sjungma@eit.uni-kl.de	// shift bits
116912027Sjungma@eit.uni-kl.de	for( int i = sz - 1; i >= 1; -- i ) {
117012027Sjungma@eit.uni-kl.de	    sc_digit x_dw, x_cw;
117112027Sjungma@eit.uni-kl.de	    get_words_( x, i, x_dw, x_cw );
117212027Sjungma@eit.uni-kl.de	    x_dw <<= bn;
117312027Sjungma@eit.uni-kl.de	    x_dw |= x.get_word( i - 1 ) >> (SC_DIGIT_SIZE - bn);
117412027Sjungma@eit.uni-kl.de	    x_cw <<= bn;
117512027Sjungma@eit.uni-kl.de	    x_cw |= x.get_cword( i - 1 ) >> (SC_DIGIT_SIZE - bn);
117612027Sjungma@eit.uni-kl.de	    set_words_( x, i, x_dw, x_cw );
117712027Sjungma@eit.uni-kl.de	}
117812027Sjungma@eit.uni-kl.de	sc_digit x_dw, x_cw;
117912027Sjungma@eit.uni-kl.de	get_words_( x, 0, x_dw, x_cw );
118012027Sjungma@eit.uni-kl.de	x_dw <<= bn;
118112027Sjungma@eit.uni-kl.de	x_cw <<= bn;
118212027Sjungma@eit.uni-kl.de	set_words_( x, 0, x_dw, x_cw );
118312027Sjungma@eit.uni-kl.de    }
118412027Sjungma@eit.uni-kl.de    x.clean_tail();
118512027Sjungma@eit.uni-kl.de    return x;
118612027Sjungma@eit.uni-kl.de}
118712027Sjungma@eit.uni-kl.de
118812027Sjungma@eit.uni-kl.de
118912027Sjungma@eit.uni-kl.de// bitwise right shift
119012027Sjungma@eit.uni-kl.de
119112027Sjungma@eit.uni-kl.de
119212027Sjungma@eit.uni-kl.detemplate <class X>
119312027Sjungma@eit.uni-kl.deinline
119412027Sjungma@eit.uni-kl.deX&
119512027Sjungma@eit.uni-kl.desc_proxy<X>::operator >>= ( int n )
119612027Sjungma@eit.uni-kl.de{
119712027Sjungma@eit.uni-kl.de    X& x = back_cast();
119812027Sjungma@eit.uni-kl.de    if( n < 0 ) {
119912027Sjungma@eit.uni-kl.de	char msg[BUFSIZ];
120012027Sjungma@eit.uni-kl.de	std::sprintf( msg,
120112027Sjungma@eit.uni-kl.de		 "right shift operation is only allowed with positive "
120212027Sjungma@eit.uni-kl.de		 "shift values, shift value = %d", n );
120312027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
120412027Sjungma@eit.uni-kl.de    }
120512027Sjungma@eit.uni-kl.de    if( n >= x.length() ) {
120612027Sjungma@eit.uni-kl.de	extend_sign_w_( x, 0, false );
120712027Sjungma@eit.uni-kl.de	// no tail cleaning needed
120812027Sjungma@eit.uni-kl.de	return x;
120912027Sjungma@eit.uni-kl.de    }
121012027Sjungma@eit.uni-kl.de    int sz = x.size();
121112027Sjungma@eit.uni-kl.de    int wn = n / SC_DIGIT_SIZE;
121212027Sjungma@eit.uni-kl.de    int bn = n % SC_DIGIT_SIZE;
121312027Sjungma@eit.uni-kl.de    if( wn != 0 ) {
121412027Sjungma@eit.uni-kl.de	// shift words
121512027Sjungma@eit.uni-kl.de	int i = 0;
121612027Sjungma@eit.uni-kl.de	for( ; i < (sz - wn); ++ i ) {
121712027Sjungma@eit.uni-kl.de	    set_words_( x, i, x.get_word( i + wn ), x.get_cword( i + wn ) );
121812027Sjungma@eit.uni-kl.de	}
121912027Sjungma@eit.uni-kl.de	for( ; i < sz; ++ i ) {
122012027Sjungma@eit.uni-kl.de	    set_words_( x, i, SC_DIGIT_ZERO, SC_DIGIT_ZERO );
122112027Sjungma@eit.uni-kl.de	}
122212027Sjungma@eit.uni-kl.de    }
122312027Sjungma@eit.uni-kl.de    if( bn != 0 ) {
122412027Sjungma@eit.uni-kl.de	// shift bits
122512027Sjungma@eit.uni-kl.de	for( int i = 0; i < (sz - 1); ++ i ) {
122612027Sjungma@eit.uni-kl.de	    sc_digit x_dw, x_cw;
122712027Sjungma@eit.uni-kl.de	    get_words_( x, i, x_dw, x_cw );
122812027Sjungma@eit.uni-kl.de	    x_dw >>= bn;
122912027Sjungma@eit.uni-kl.de	    x_dw |= x.get_word( i + 1 ) << (SC_DIGIT_SIZE - bn);
123012027Sjungma@eit.uni-kl.de	    x_cw >>= bn;
123112027Sjungma@eit.uni-kl.de	    x_cw |= x.get_cword( i + 1 ) << (SC_DIGIT_SIZE - bn);
123212027Sjungma@eit.uni-kl.de	    set_words_( x, i, x_dw, x_cw );
123312027Sjungma@eit.uni-kl.de	}
123412027Sjungma@eit.uni-kl.de	sc_digit x_dw, x_cw;
123512027Sjungma@eit.uni-kl.de	get_words_( x, sz - 1, x_dw, x_cw );
123612027Sjungma@eit.uni-kl.de	x_dw >>= bn;
123712027Sjungma@eit.uni-kl.de	x_cw >>= bn;
123812027Sjungma@eit.uni-kl.de	set_words_( x, sz - 1, x_dw, x_cw );
123912027Sjungma@eit.uni-kl.de    }
124012027Sjungma@eit.uni-kl.de    x.clean_tail();
124112027Sjungma@eit.uni-kl.de    return x;
124212027Sjungma@eit.uni-kl.de}
124312027Sjungma@eit.uni-kl.de
124412027Sjungma@eit.uni-kl.de
124512027Sjungma@eit.uni-kl.de// bitwise left rotate
124612027Sjungma@eit.uni-kl.de
124712027Sjungma@eit.uni-kl.detemplate <class X>
124812027Sjungma@eit.uni-kl.deinline
124912027Sjungma@eit.uni-kl.deconst sc_lv_base
125012027Sjungma@eit.uni-kl.delrotate( const sc_proxy<X>& x, int n );
125112027Sjungma@eit.uni-kl.de
125212027Sjungma@eit.uni-kl.de
125312027Sjungma@eit.uni-kl.de// bitwise right rotate
125412027Sjungma@eit.uni-kl.de
125512027Sjungma@eit.uni-kl.detemplate <class X>
125612027Sjungma@eit.uni-kl.deinline
125712027Sjungma@eit.uni-kl.deconst sc_lv_base
125812027Sjungma@eit.uni-kl.derrotate( const sc_proxy<X>& x, int n );
125912027Sjungma@eit.uni-kl.de
126012027Sjungma@eit.uni-kl.de
126112027Sjungma@eit.uni-kl.de// bitwise reverse
126212027Sjungma@eit.uni-kl.de
126312027Sjungma@eit.uni-kl.detemplate <class X>
126412027Sjungma@eit.uni-kl.deinline
126512027Sjungma@eit.uni-kl.deX&
126612027Sjungma@eit.uni-kl.desc_proxy<X>::reverse()
126712027Sjungma@eit.uni-kl.de{
126812027Sjungma@eit.uni-kl.de    X& x = back_cast();
126912027Sjungma@eit.uni-kl.de    int len = x.length();
127012027Sjungma@eit.uni-kl.de    int half_len = len / 2;
127112027Sjungma@eit.uni-kl.de    for( int i = 0, j = len - 1; i < half_len; ++ i, --j ) {
127212027Sjungma@eit.uni-kl.de	sc_logic_value_t t = x.get_bit( i );
127312027Sjungma@eit.uni-kl.de	x.set_bit( i, x.get_bit( j ) );
127412027Sjungma@eit.uni-kl.de	x.set_bit( j, t );
127512027Sjungma@eit.uni-kl.de    }
127612027Sjungma@eit.uni-kl.de    return x;
127712027Sjungma@eit.uni-kl.de}
127812027Sjungma@eit.uni-kl.de
127912027Sjungma@eit.uni-kl.detemplate <class X>
128012027Sjungma@eit.uni-kl.deinline
128112027Sjungma@eit.uni-kl.deconst sc_lv_base
128212027Sjungma@eit.uni-kl.dereverse( const sc_proxy<X>& a );
128312027Sjungma@eit.uni-kl.de
128412027Sjungma@eit.uni-kl.de
128512027Sjungma@eit.uni-kl.de// reduce functions
128612027Sjungma@eit.uni-kl.de
128712027Sjungma@eit.uni-kl.detemplate <class X>
128812027Sjungma@eit.uni-kl.deinline
128912027Sjungma@eit.uni-kl.desc_logic_value_t
129012027Sjungma@eit.uni-kl.desc_proxy<X>::and_reduce() const
129112027Sjungma@eit.uni-kl.de{
129212027Sjungma@eit.uni-kl.de    const X& x = back_cast();
129312027Sjungma@eit.uni-kl.de    sc_logic_value_t result = sc_logic_value_t( 1 );
129412027Sjungma@eit.uni-kl.de    int len = x.length();
129512027Sjungma@eit.uni-kl.de    for( int i = 0; i < len; ++ i ) {
129612027Sjungma@eit.uni-kl.de	result = sc_logic::and_table[result][x.get_bit( i )];
129712027Sjungma@eit.uni-kl.de    }
129812027Sjungma@eit.uni-kl.de    return result;
129912027Sjungma@eit.uni-kl.de}
130012027Sjungma@eit.uni-kl.de
130112027Sjungma@eit.uni-kl.detemplate <class X>
130212027Sjungma@eit.uni-kl.deinline
130312027Sjungma@eit.uni-kl.desc_logic_value_t
130412027Sjungma@eit.uni-kl.desc_proxy<X>::or_reduce() const
130512027Sjungma@eit.uni-kl.de{
130612027Sjungma@eit.uni-kl.de    const X& x = back_cast();
130712027Sjungma@eit.uni-kl.de    sc_logic_value_t result = sc_logic_value_t( 0 );
130812027Sjungma@eit.uni-kl.de    int len = x.length();
130912027Sjungma@eit.uni-kl.de    for( int i = 0; i < len; ++ i ) {
131012027Sjungma@eit.uni-kl.de	result = sc_logic::or_table[result][x.get_bit( i )];
131112027Sjungma@eit.uni-kl.de    }
131212027Sjungma@eit.uni-kl.de    return result;
131312027Sjungma@eit.uni-kl.de}
131412027Sjungma@eit.uni-kl.de
131512027Sjungma@eit.uni-kl.detemplate <class X>
131612027Sjungma@eit.uni-kl.deinline
131712027Sjungma@eit.uni-kl.desc_logic_value_t
131812027Sjungma@eit.uni-kl.desc_proxy<X>::xor_reduce() const
131912027Sjungma@eit.uni-kl.de{
132012027Sjungma@eit.uni-kl.de    const X& x = back_cast();
132112027Sjungma@eit.uni-kl.de    sc_logic_value_t result = sc_logic_value_t( 0 );
132212027Sjungma@eit.uni-kl.de    int len = x.length();
132312027Sjungma@eit.uni-kl.de    for( int i = 0; i < len; ++ i ) {
132412027Sjungma@eit.uni-kl.de	result = sc_logic::xor_table[result][x.get_bit( i )];
132512027Sjungma@eit.uni-kl.de    }
132612027Sjungma@eit.uni-kl.de    return result;
132712027Sjungma@eit.uni-kl.de}
132812027Sjungma@eit.uni-kl.de
132912027Sjungma@eit.uni-kl.de
133012027Sjungma@eit.uni-kl.de// relational operators
133112027Sjungma@eit.uni-kl.de
133212027Sjungma@eit.uni-kl.detemplate <class X, class Y>
133312027Sjungma@eit.uni-kl.deinline
133412027Sjungma@eit.uni-kl.debool
133512027Sjungma@eit.uni-kl.deoperator != ( const sc_proxy<X>& px, const sc_proxy<Y>& py )
133612027Sjungma@eit.uni-kl.de{
133712027Sjungma@eit.uni-kl.de    return !( px == py );
133812027Sjungma@eit.uni-kl.de}
133912027Sjungma@eit.uni-kl.de
134012027Sjungma@eit.uni-kl.de
134112027Sjungma@eit.uni-kl.de#define DEFN_REL_OP_T(tp)                                                     \
134212027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
134312027Sjungma@eit.uni-kl.deinline                                                                        \
134412027Sjungma@eit.uni-kl.debool                                                                          \
134512027Sjungma@eit.uni-kl.deoperator == ( tp b, const sc_proxy<X>& px )                                   \
134612027Sjungma@eit.uni-kl.de{                                                                             \
134712027Sjungma@eit.uni-kl.de    return ( px == b );                                                       \
134812027Sjungma@eit.uni-kl.de}                                                                             \
134912027Sjungma@eit.uni-kl.de                                                                              \
135012027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
135112027Sjungma@eit.uni-kl.deinline                                                                        \
135212027Sjungma@eit.uni-kl.debool                                                                          \
135312027Sjungma@eit.uni-kl.deoperator != ( const sc_proxy<X>& px, tp b )                                   \
135412027Sjungma@eit.uni-kl.de{                                                                             \
135512027Sjungma@eit.uni-kl.de    return !( px == b );                                                      \
135612027Sjungma@eit.uni-kl.de}                                                                             \
135712027Sjungma@eit.uni-kl.de                                                                              \
135812027Sjungma@eit.uni-kl.detemplate <class X>                                                            \
135912027Sjungma@eit.uni-kl.deinline                                                                        \
136012027Sjungma@eit.uni-kl.debool                                                                          \
136112027Sjungma@eit.uni-kl.deoperator != ( tp b, const sc_proxy<X>& px )                                   \
136212027Sjungma@eit.uni-kl.de{                                                                             \
136312027Sjungma@eit.uni-kl.de    return !( px == b );                                                      \
136412027Sjungma@eit.uni-kl.de}
136512027Sjungma@eit.uni-kl.de
136612027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const char*)
136712027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const bool*)
136812027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_logic*)
136912027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_unsigned&)
137012027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_signed&)
137112027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_uint_base&)
137212027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_int_base&)
137312027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(unsigned long)
137412027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(long)
137512027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(unsigned int)
137612027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(int)
137712027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(uint64)
137812027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(int64)
137912027Sjungma@eit.uni-kl.de
138012027Sjungma@eit.uni-kl.de#undef DEFN_REL_OP_T
138112027Sjungma@eit.uni-kl.de
138212027Sjungma@eit.uni-kl.de
138312027Sjungma@eit.uni-kl.de// explicit conversions to character string
138412027Sjungma@eit.uni-kl.de
138512027Sjungma@eit.uni-kl.detemplate <class X>
138612027Sjungma@eit.uni-kl.deinline
138712027Sjungma@eit.uni-kl.deconst std::string
138812027Sjungma@eit.uni-kl.desc_proxy<X>::to_string() const
138912027Sjungma@eit.uni-kl.de{
139012027Sjungma@eit.uni-kl.de    const X& x = back_cast();
139112027Sjungma@eit.uni-kl.de    int len = x.length();
139212027Sjungma@eit.uni-kl.de    std::string s; // ( len + 1 );
139312027Sjungma@eit.uni-kl.de    for( int i = 0; i < len; ++ i ) {
139412027Sjungma@eit.uni-kl.de	s += sc_logic::logic_to_char[x.get_bit( len - i - 1 )];
139512027Sjungma@eit.uni-kl.de    }
139612027Sjungma@eit.uni-kl.de    return s;
139712027Sjungma@eit.uni-kl.de}
139812027Sjungma@eit.uni-kl.de
139912027Sjungma@eit.uni-kl.detemplate <class X>
140012027Sjungma@eit.uni-kl.deinline
140112027Sjungma@eit.uni-kl.deconst std::string
140212027Sjungma@eit.uni-kl.desc_proxy<X>::to_string( sc_numrep numrep ) const
140312027Sjungma@eit.uni-kl.de{
140412027Sjungma@eit.uni-kl.de    return convert_to_fmt( to_string(), numrep, true );
140512027Sjungma@eit.uni-kl.de}
140612027Sjungma@eit.uni-kl.de
140712027Sjungma@eit.uni-kl.detemplate <class X>
140812027Sjungma@eit.uni-kl.deinline
140912027Sjungma@eit.uni-kl.deconst std::string
141012027Sjungma@eit.uni-kl.desc_proxy<X>::to_string( sc_numrep numrep, bool w_prefix ) const
141112027Sjungma@eit.uni-kl.de{
141212027Sjungma@eit.uni-kl.de    return convert_to_fmt( to_string(), numrep, w_prefix );
141312027Sjungma@eit.uni-kl.de}
141412027Sjungma@eit.uni-kl.de
141512027Sjungma@eit.uni-kl.de
141612027Sjungma@eit.uni-kl.de// other methods
141712027Sjungma@eit.uni-kl.de
141812027Sjungma@eit.uni-kl.detemplate <class X>
141912027Sjungma@eit.uni-kl.deinline
142012027Sjungma@eit.uni-kl.devoid
142112027Sjungma@eit.uni-kl.desc_proxy<X>::scan( ::std::istream& is )
142212027Sjungma@eit.uni-kl.de{
142312027Sjungma@eit.uni-kl.de    std::string s;
142412027Sjungma@eit.uni-kl.de    is >> s;
142512027Sjungma@eit.uni-kl.de    back_cast() = s.c_str();
142612027Sjungma@eit.uni-kl.de}
142712027Sjungma@eit.uni-kl.de
142812027Sjungma@eit.uni-kl.de
142912027Sjungma@eit.uni-kl.detemplate <class X>
143012027Sjungma@eit.uni-kl.deinline
143112027Sjungma@eit.uni-kl.devoid
143212027Sjungma@eit.uni-kl.desc_proxy<X>::check_bounds( int n ) const  // check if bit n accessible
143312027Sjungma@eit.uni-kl.de{
143412027Sjungma@eit.uni-kl.de    if( n < 0 || n >= back_cast().length() ) {
143512027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
143612027Sjungma@eit.uni-kl.de    }
143712027Sjungma@eit.uni-kl.de}
143812027Sjungma@eit.uni-kl.de
143912027Sjungma@eit.uni-kl.detemplate <class X>
144012027Sjungma@eit.uni-kl.deinline
144112027Sjungma@eit.uni-kl.devoid
144212027Sjungma@eit.uni-kl.desc_proxy<X>::check_wbounds( int n ) const  // check if word n accessible
144312027Sjungma@eit.uni-kl.de{
144412027Sjungma@eit.uni-kl.de    if( n < 0 || n >= back_cast().size() ) {
144512027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
144612027Sjungma@eit.uni-kl.de    }
144712027Sjungma@eit.uni-kl.de}
144812027Sjungma@eit.uni-kl.de
144912027Sjungma@eit.uni-kl.de
145012027Sjungma@eit.uni-kl.detemplate <class X>
145112027Sjungma@eit.uni-kl.deinline
145212027Sjungma@eit.uni-kl.desc_digit
145312027Sjungma@eit.uni-kl.desc_proxy<X>::to_anything_unsigned() const
145412027Sjungma@eit.uni-kl.de{
145512027Sjungma@eit.uni-kl.de    // only 0 word is returned
145612027Sjungma@eit.uni-kl.de    // can't convert logic values other than 0 and 1
145712027Sjungma@eit.uni-kl.de    const X& x = back_cast();
145812027Sjungma@eit.uni-kl.de    int len = x.length();
145912027Sjungma@eit.uni-kl.de    if( x.get_cword( 0 ) != SC_DIGIT_ZERO ) {
146012027Sjungma@eit.uni-kl.de	SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 );
146112027Sjungma@eit.uni-kl.de    }
146212027Sjungma@eit.uni-kl.de    sc_digit w = x.get_word( 0 );
146312027Sjungma@eit.uni-kl.de    if( len >= SC_DIGIT_SIZE ) {
146412027Sjungma@eit.uni-kl.de	return w;
146512027Sjungma@eit.uni-kl.de    }
146612027Sjungma@eit.uni-kl.de    return ( w & (~SC_DIGIT_ZERO >> (SC_DIGIT_SIZE - len)) );
146712027Sjungma@eit.uni-kl.de}
146812027Sjungma@eit.uni-kl.de
146912027Sjungma@eit.uni-kl.detemplate <class X>
147012027Sjungma@eit.uni-kl.deinline
147112027Sjungma@eit.uni-kl.deuint64
147212027Sjungma@eit.uni-kl.desc_proxy<X>::to_uint64() const
147312027Sjungma@eit.uni-kl.de{
147412027Sjungma@eit.uni-kl.de    // words 1 and 0 returned.
147512027Sjungma@eit.uni-kl.de    // can't convert logic values other than 0 and 1
147612027Sjungma@eit.uni-kl.de    const X& x = back_cast();
147712027Sjungma@eit.uni-kl.de    int len = x.length();
147812027Sjungma@eit.uni-kl.de    if( x.get_cword( 0 ) != SC_DIGIT_ZERO ) {
147912027Sjungma@eit.uni-kl.de	SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 );
148012027Sjungma@eit.uni-kl.de    }
148112027Sjungma@eit.uni-kl.de    uint64 w = x.get_word( 0 );
148212027Sjungma@eit.uni-kl.de    if( len > SC_DIGIT_SIZE )
148312027Sjungma@eit.uni-kl.de    {
148412027Sjungma@eit.uni-kl.de	if( x.get_cword( 1 ) != SC_DIGIT_ZERO ) {
148512027Sjungma@eit.uni-kl.de	    SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 );
148612027Sjungma@eit.uni-kl.de	}
148712027Sjungma@eit.uni-kl.de	uint64 w1 = x.get_word( 1 );
148812027Sjungma@eit.uni-kl.de        w = w | (w1 << SC_DIGIT_SIZE);
148912027Sjungma@eit.uni-kl.de	return w;
149012027Sjungma@eit.uni-kl.de    }
149112027Sjungma@eit.uni-kl.de    else if( len == SC_DIGIT_SIZE )
149212027Sjungma@eit.uni-kl.de    {
149312027Sjungma@eit.uni-kl.de	return w;
149412027Sjungma@eit.uni-kl.de    }
149512027Sjungma@eit.uni-kl.de    else
149612027Sjungma@eit.uni-kl.de    {
149712027Sjungma@eit.uni-kl.de	return ( w & (~SC_DIGIT_ZERO >> (SC_DIGIT_SIZE - len)) );
149812027Sjungma@eit.uni-kl.de    }
149912027Sjungma@eit.uni-kl.de}
150012027Sjungma@eit.uni-kl.de
150112027Sjungma@eit.uni-kl.detemplate <class X>
150212027Sjungma@eit.uni-kl.deinline
150312027Sjungma@eit.uni-kl.deint64
150412027Sjungma@eit.uni-kl.desc_proxy<X>::to_anything_signed() const
150512027Sjungma@eit.uni-kl.de{
150612027Sjungma@eit.uni-kl.de    const X& x = back_cast();
150712027Sjungma@eit.uni-kl.de    int len = x.length();
150812027Sjungma@eit.uni-kl.de    int64 w = 0;
150912027Sjungma@eit.uni-kl.de
151012027Sjungma@eit.uni-kl.de    if( len > SC_DIGIT_SIZE )
151112027Sjungma@eit.uni-kl.de    {
151212027Sjungma@eit.uni-kl.de	if( x.get_cword( 1 ) != SC_DIGIT_ZERO )
151312027Sjungma@eit.uni-kl.de	    SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 );
151412027Sjungma@eit.uni-kl.de	w = x.get_word(1);
151512027Sjungma@eit.uni-kl.de    }
151612027Sjungma@eit.uni-kl.de    if( x.get_cword( 0 ) != SC_DIGIT_ZERO )
151712027Sjungma@eit.uni-kl.de	SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 );
151812027Sjungma@eit.uni-kl.de    w = (w << SC_DIGIT_SIZE) | x.get_word( 0 );
151912027Sjungma@eit.uni-kl.de    if( len >= 64 ) {
152012027Sjungma@eit.uni-kl.de	return w;
152112027Sjungma@eit.uni-kl.de    }
152212027Sjungma@eit.uni-kl.de
152312027Sjungma@eit.uni-kl.de    uint64 zero = 0;
152412027Sjungma@eit.uni-kl.de    sc_logic_value_t sgn = x.get_bit( len - 1 );
152512027Sjungma@eit.uni-kl.de    if( sgn == 0 ) {
152612027Sjungma@eit.uni-kl.de	return (int64)( w & (~zero >> (64 - len)) );
152712027Sjungma@eit.uni-kl.de    } else {
152812027Sjungma@eit.uni-kl.de	return (int64)( w | (~zero << len) );
152912027Sjungma@eit.uni-kl.de    }
153012027Sjungma@eit.uni-kl.de}
153112027Sjungma@eit.uni-kl.de
153212027Sjungma@eit.uni-kl.de
153312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
153412027Sjungma@eit.uni-kl.de
153512027Sjungma@eit.uni-kl.de// functional notation for the reduce methods
153612027Sjungma@eit.uni-kl.de
153712027Sjungma@eit.uni-kl.detemplate <class X>
153812027Sjungma@eit.uni-kl.deinline
153912027Sjungma@eit.uni-kl.desc_logic_value_t
154012027Sjungma@eit.uni-kl.deand_reduce( const sc_proxy<X>& a )
154112027Sjungma@eit.uni-kl.de{
154212027Sjungma@eit.uni-kl.de    return a.and_reduce();
154312027Sjungma@eit.uni-kl.de}
154412027Sjungma@eit.uni-kl.de
154512027Sjungma@eit.uni-kl.detemplate <class X>
154612027Sjungma@eit.uni-kl.deinline
154712027Sjungma@eit.uni-kl.desc_logic_value_t
154812027Sjungma@eit.uni-kl.denand_reduce( const sc_proxy<X>& a )
154912027Sjungma@eit.uni-kl.de{
155012027Sjungma@eit.uni-kl.de    return a.nand_reduce();
155112027Sjungma@eit.uni-kl.de}
155212027Sjungma@eit.uni-kl.de
155312027Sjungma@eit.uni-kl.detemplate <class X>
155412027Sjungma@eit.uni-kl.deinline
155512027Sjungma@eit.uni-kl.desc_logic_value_t
155612027Sjungma@eit.uni-kl.deor_reduce( const sc_proxy<X>& a )
155712027Sjungma@eit.uni-kl.de{
155812027Sjungma@eit.uni-kl.de    return a.or_reduce();
155912027Sjungma@eit.uni-kl.de}
156012027Sjungma@eit.uni-kl.de
156112027Sjungma@eit.uni-kl.detemplate <class X>
156212027Sjungma@eit.uni-kl.deinline
156312027Sjungma@eit.uni-kl.desc_logic_value_t
156412027Sjungma@eit.uni-kl.denor_reduce( const sc_proxy<X>& a )
156512027Sjungma@eit.uni-kl.de{
156612027Sjungma@eit.uni-kl.de    return a.nor_reduce();
156712027Sjungma@eit.uni-kl.de}
156812027Sjungma@eit.uni-kl.de
156912027Sjungma@eit.uni-kl.detemplate <class X>
157012027Sjungma@eit.uni-kl.deinline
157112027Sjungma@eit.uni-kl.desc_logic_value_t
157212027Sjungma@eit.uni-kl.dexor_reduce( const sc_proxy<X>& a )
157312027Sjungma@eit.uni-kl.de{
157412027Sjungma@eit.uni-kl.de    return a.xor_reduce();
157512027Sjungma@eit.uni-kl.de}
157612027Sjungma@eit.uni-kl.de
157712027Sjungma@eit.uni-kl.detemplate <class X>
157812027Sjungma@eit.uni-kl.deinline
157912027Sjungma@eit.uni-kl.desc_logic_value_t
158012027Sjungma@eit.uni-kl.dexnor_reduce( const sc_proxy<X>& a )
158112027Sjungma@eit.uni-kl.de{
158212027Sjungma@eit.uni-kl.de    return a.xnor_reduce();
158312027Sjungma@eit.uni-kl.de}
158412027Sjungma@eit.uni-kl.de
158512027Sjungma@eit.uni-kl.de
158612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
158712027Sjungma@eit.uni-kl.de
158812027Sjungma@eit.uni-kl.detemplate <class X>
158912027Sjungma@eit.uni-kl.deinline
159012027Sjungma@eit.uni-kl.de::std::ostream&
159112027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_proxy<X>& a )
159212027Sjungma@eit.uni-kl.de{
159312027Sjungma@eit.uni-kl.de    a.print( os );
159412027Sjungma@eit.uni-kl.de    return os;
159512027Sjungma@eit.uni-kl.de}
159612027Sjungma@eit.uni-kl.de
159712027Sjungma@eit.uni-kl.detemplate <class X>
159812027Sjungma@eit.uni-kl.deinline
159912027Sjungma@eit.uni-kl.de::std::istream&
160012027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_proxy<X>& a )
160112027Sjungma@eit.uni-kl.de{
160212027Sjungma@eit.uni-kl.de    a.scan( is );
160312027Sjungma@eit.uni-kl.de    return is;
160412027Sjungma@eit.uni-kl.de}
160512027Sjungma@eit.uni-kl.de
160612027Sjungma@eit.uni-kl.de} // namespace sc_dt
160712027Sjungma@eit.uni-kl.de
160812027Sjungma@eit.uni-kl.de
160912027Sjungma@eit.uni-kl.de#endif
1610