/*****************************************************************************

  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
  more contributor license agreements.  See the NOTICE file distributed
  with this work for additional information regarding copyright ownership.
  Accellera licenses this file to you under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with the
  License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  implied.  See the License for the specific language governing
  permissions and limitations under the License.

 *****************************************************************************/

/*****************************************************************************

  sc_uint_base.h -- An unsigned integer whose length is less than 64 bits.

               Unlike arbitrary precision, arithmetic and bitwise operations
               are performed using the native types (hence capped at 64 bits).
               The sc_uint integer is useful when the user does not need
               arbitrary precision and the performance is superior to
               sc_bigint/sc_biguint.

  Original Author: Amit Rao, Synopsys, Inc.

 *****************************************************************************/

/*****************************************************************************

  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
  changes you are making here.

      Name, Affiliation, Date: Ali Dasdan, Synopsys, Inc.
  Description of Modification: - Resolved ambiguity with sc_(un)signed.
                               - Merged the code for 64- and 32-bit versions
                                 via the constants in sc_nbdefs.h.
                               - Eliminated redundant file inclusions.

      Name, Affiliation, Date:
  Description of Modification:

 *****************************************************************************/

// $Log: sc_uint_base.h,v $
// Revision 1.3  2011/08/24 22:05:46  acg
//  Torsten Maehne: initialization changes to remove warnings.
//
// Revision 1.2  2011/02/18 20:19:15  acg
//  Andy Goodrich: updating Copyright notice.
//
// Revision 1.1.1.1  2006/12/15 20:20:05  acg
// SystemC 2.3
//
// Revision 1.4  2006/05/08 17:50:02  acg
//   Andy Goodrich: Added David Long's declarations for friend operators,
//   functions, and methods, to keep the Microsoft compiler happy.
//
// Revision 1.3  2006/01/13 18:49:32  acg
// Added $Log command so that CVS check in comments are reproduced in the
// source.
//

#ifndef __SYSTEMC_EXT_DT_INT_SC_UINT_BASE_HH__
#define __SYSTEMC_EXT_DT_INT_SC_UINT_BASE_HH__

#include <iostream>

#include "../fx/scfx_ieee.hh"
#include "../misc/sc_value_base.hh"
#include "../sc_temporary.hh"
#include "sc_length_param.hh"
#include "sc_nbdefs.hh"

namespace sc_dt
{

class sc_concatref;

// classes defined in this module
class sc_uint_bitref_r;
class sc_uint_bitref;
class sc_uint_subref_r;
class sc_uint_subref;
class sc_uint_base;

// forward class declarations
class sc_bv_base;
class sc_lv_base;
class sc_int_subref_r;
class sc_signed_subref_r;
class sc_unsigned_subref_r;
class sc_signed;
class sc_unsigned;
class sc_fxval;
class sc_fxval_fast;
class sc_fxnum;
class sc_fxnum_fast;

} // namespace sc_dt

// extern template instantiations
namespace sc_core
{

extern template class sc_vpool<sc_dt::sc_uint_bitref>;
extern template class sc_vpool<sc_dt::sc_uint_subref>;

} // namespace sc_core

namespace sc_dt
{

extern const uint_type mask_int[SC_INTWIDTH][SC_INTWIDTH];

// friend operator declarations
inline bool operator == (const sc_uint_base &a, const sc_uint_base &b);
inline bool operator != (const sc_uint_base &a, const sc_uint_base &b);
inline bool operator < (const sc_uint_base &a, const sc_uint_base &b);
inline bool operator <= (const sc_uint_base &a, const sc_uint_base &b);
inline bool operator > (const sc_uint_base &a, const sc_uint_base &b);
inline bool operator >= (const sc_uint_base &a, const sc_uint_base &b);


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_bitref_r
//
//  Proxy class for sc_uint bit selection (r-value only).
// ----------------------------------------------------------------------------

class sc_uint_bitref_r : public sc_value_base
{
    friend class sc_uint_base;
    friend class sc_uint_signal;

    // constructors
  public:
    sc_uint_bitref_r(const sc_uint_bitref_r &init) :
         sc_value_base(init), m_index(init.m_index), m_obj_p(init.m_obj_p)
    {}

  protected:
    sc_uint_bitref_r() : sc_value_base(), m_index(0), m_obj_p(0) {}

    // initializer for sc_core::sc_vpool:
    void
    initialize(const sc_uint_base* obj_p, int index_)
    {
        m_obj_p = (sc_uint_base *)obj_p;
        m_index = index_;
    }

  public:
    // destructor
    virtual ~sc_uint_bitref_r() {}

    // concatenation support
    virtual int
    concat_length(bool *xz_present_p) const
    {
        if (xz_present_p)
            *xz_present_p = false;
        return 1;
    }
    virtual bool
    concat_get_ctrl(sc_digit *dst_p, int low_i) const
    {
        int  bit_mask = 1 << (low_i % BITS_PER_DIGIT);
        int  word_i = low_i / BITS_PER_DIGIT;

        dst_p[word_i] &= ~bit_mask;
        return false;
    }
    virtual bool
    concat_get_data(sc_digit *dst_p, int low_i) const
    {
        int  bit_mask = 1 << (low_i % BITS_PER_DIGIT);
        bool result;             // True is non-zero.
        int  word_i = low_i / BITS_PER_DIGIT;

        if (operator uint64()) {
            dst_p[word_i] |= bit_mask;
            result = true;
        } else {
            dst_p[word_i] &= ~bit_mask;
            result = false;
        }
        return result;
    }
    virtual uint64 concat_get_uint64() const { return operator uint64(); }

    // capacity
    int length() const { return 1; }

    // implicit conversion to uint64
    operator uint64 () const;
    bool operator ! () const;
    bool operator ~ () const;

    // explicit conversions
    uint64 value() const { return operator uint64 (); }
    bool to_bool() const { return operator uint64 (); }

    // other methods
    void print(::std::ostream &os=::std::cout) const { os << to_bool(); }

  protected:
    int m_index;
    sc_uint_base *m_obj_p;

  private:
    // Disabled
    sc_uint_bitref_r &operator = (const sc_uint_bitref_r &);
};

inline ::std::ostream &operator << (
        ::std::ostream &, const sc_uint_bitref_r &);


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_bitref
//
//  Proxy class for sc_uint bit selection (r-value and l-value).
// ----------------------------------------------------------------------------

class sc_uint_bitref : public sc_uint_bitref_r
{
    friend class sc_uint_base;
    friend class sc_core::sc_vpool<sc_uint_bitref>;

    // constructors
  protected:
    sc_uint_bitref() : sc_uint_bitref_r() {}

  public:
    sc_uint_bitref(const sc_uint_bitref &init) : sc_uint_bitref_r(init) {}

  public:
    // assignment operators
    sc_uint_bitref &operator = (const sc_uint_bitref_r &b);
    sc_uint_bitref &operator = (const sc_uint_bitref &b);
    sc_uint_bitref &operator = (bool b);

    sc_uint_bitref &operator &= (bool b);
    sc_uint_bitref &operator |= (bool b);
    sc_uint_bitref &operator ^= (bool b);

    // concatenation methods
    virtual void concat_set(int64 src, int low_i);
    virtual void concat_set(const sc_signed &src, int low_i);
    virtual void concat_set(const sc_unsigned &src, int low_i);
    virtual void concat_set(uint64 src, int low_i);

    // other methods
    void scan(::std::istream &is=::std::cin);

  protected:
    static sc_core::sc_vpool<sc_uint_bitref> m_pool;
};

inline ::std::istream &operator >> (::std::istream &, sc_uint_bitref &);


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_subref_r
//
//  Proxy class for sc_uint part selection (r-value only).
// ----------------------------------------------------------------------------

class sc_uint_subref_r : public sc_value_base
{
    friend class sc_uint_base;
    friend class sc_uint_subref;

    // constructors
  public:
    sc_uint_subref_r( const sc_uint_subref_r& init ) :
        sc_value_base(init), m_left(init.m_left), m_obj_p(init.m_obj_p),
        m_right(init.m_right)
    {}

  protected:
    sc_uint_subref_r() : sc_value_base(), m_left(0), m_obj_p(0), m_right(0) {}

    // initializer for sc_core::sc_vpool:
    void
    initialize(const sc_uint_base *obj_p, int left_i, int right_i)
    {
        m_obj_p = (sc_uint_base *)obj_p;
        m_left = left_i;
        m_right = right_i;
    }

  public:
    // destructor
    virtual ~sc_uint_subref_r() {}

    // capacity
    int length() const { return (m_left - m_right + 1); }

    // concatenation support
    virtual int
    concat_length(bool *xz_present_p) const
    {
        if (xz_present_p)
            *xz_present_p = false;
        return length();
    }
    virtual bool concat_get_ctrl(sc_digit *dst_p, int low_i) const;
    virtual bool concat_get_data(sc_digit *dst_p, int low_i) const;
    virtual uint64
    concat_get_uint64() const
    {
        return (uint64)operator uint_type();
    }

    // reduce methods
    bool and_reduce() const;
    bool nand_reduce() const { return !and_reduce(); }
    bool or_reduce() const;
    bool nor_reduce() const { return !or_reduce(); }
    bool xor_reduce() const;
    bool xnor_reduce() const { return !xor_reduce(); }

    // implicit conversion to uint_type
    operator uint_type() const;

    // explicit conversions
    uint_type value() const { return operator uint_type(); }

    int to_int() const;
    unsigned int to_uint() const;
    long to_long() const;
    unsigned long to_ulong() const;
    int64 to_int64() const;
    uint64 to_uint64() const;
    double to_double() const;

    // explicit conversion to character string
    const std::string to_string(sc_numrep numrep=SC_DEC) const;
    const std::string to_string(sc_numrep numrep, bool w_prefix) const;

    // other methods
    void
    print(::std::ostream &os=::std::cout) const
    {
        os << to_string(sc_io_base(os, SC_DEC), sc_io_show_base(os));
    }

  protected:
    int m_left;
    sc_uint_base *m_obj_p;
    int m_right;

  private:
    // Disabled
    sc_uint_subref_r &operator = (const sc_uint_subref_r &);
};

inline ::std::ostream &operator << (
        ::std::ostream &, const sc_uint_subref_r &);


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_subref
//
//  Proxy class for sc_uint part selection (r-value and l-value).
// ----------------------------------------------------------------------------

class sc_uint_subref : public sc_uint_subref_r
{
    friend class sc_uint_base;
    friend class sc_core::sc_vpool<sc_uint_subref>;

    // constructors
  protected:
    sc_uint_subref() : sc_uint_subref_r() {}

  public:
    sc_uint_subref(const sc_uint_subref &init) : sc_uint_subref_r(init) {}

  public:
    // assignment operators
    sc_uint_subref &operator = (uint_type v);
    sc_uint_subref &operator = (const sc_uint_base &a);
    sc_uint_subref &
    operator = (const sc_uint_subref_r &a)
    {
        return operator = (a.operator uint_type());
    }
    sc_uint_subref &
    operator = (const sc_uint_subref &a)
    {
        return operator = (a.operator uint_type());
    }
    template<class T>
    sc_uint_subref &
    operator = (const sc_generic_base<T> &a)
    {
        return operator = (a->to_uint64());
    }
    sc_uint_subref &operator = (const char *a);
    sc_uint_subref &
    operator = (unsigned long a)
    {
        return operator = ((uint_type)a);
    }
    sc_uint_subref &
    operator = (long a)
    {
        return operator = ((uint_type)a);
    }
    sc_uint_subref &
    operator = (unsigned int a)
    {
        return operator = ((uint_type)a);
    }
    sc_uint_subref &
    operator = (int a)
    {
        return operator = ((uint_type)a);
    }
    sc_uint_subref &
    operator = (int64 a)
    {
        return operator = ((uint_type)a);
    }
    sc_uint_subref &
    operator = (double a)
    {
        return operator = ((uint_type)a);
    }
    sc_uint_subref &operator = (const sc_signed &);
    sc_uint_subref &operator = (const sc_unsigned &);
    sc_uint_subref &operator = (const sc_bv_base &);
    sc_uint_subref &operator = (const sc_lv_base &);

    // concatenation methods
    virtual void concat_set(int64 src, int low_i);
    virtual void concat_set(const sc_signed &src, int low_i);
    virtual void concat_set(const sc_unsigned &src, int low_i);
    virtual void concat_set(uint64 src, int low_i);

    // other methods
    void scan(::std::istream &is=::std::cin);

  protected:
    static sc_core::sc_vpool<sc_uint_subref> m_pool;
};

inline ::std::istream &operator >> (::std::istream &, sc_uint_subref &);


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_base
//
//  Base class for sc_uint.
// ----------------------------------------------------------------------------

class sc_uint_base : public sc_value_base
{
    friend class sc_uint_bitref_r;
    friend class sc_uint_bitref;
    friend class sc_uint_subref_r;
    friend class sc_uint_subref;

    // support methods
    void invalid_length() const;
    void invalid_index(int i) const;
    void invalid_range(int l, int r) const;

    void
    check_length() const
    {
        if (m_len <= 0 || m_len > SC_INTWIDTH) {
            invalid_length();
        }
    }

    void
    check_index(int i) const
    {
        if (i < 0 || i >= m_len) {
            invalid_index( i );
        }
    }

    void
    check_range(int l, int r) const
    {
        if (r < 0 || l >= m_len || l < r) {
            invalid_range( l, r );
        }
    }

    void check_value() const;

    void
    extend_sign()
    {
#ifdef DEBUG_SYSTEMC
        check_value();
#endif
        m_val &= (~UINT_ZERO >> m_ulen);
    }

  public:
    // constructors
    explicit sc_uint_base(int w=sc_length_param().len()) :
            m_val(0), m_len(w), m_ulen(SC_INTWIDTH - m_len)
    {
        check_length();
    }

    sc_uint_base(uint_type v, int w) :
        m_val(v), m_len(w), m_ulen(SC_INTWIDTH - m_len)
    {
        check_length();
        extend_sign();
    }

    sc_uint_base(const sc_uint_base &a) :
            sc_value_base(a), m_val(a.m_val), m_len(a.m_len), m_ulen(a.m_ulen)
    {}

    explicit sc_uint_base(const sc_uint_subref_r &a) :
            m_val(a), m_len(a.length()), m_ulen(SC_INTWIDTH - m_len)
    {
        extend_sign();
    }

    template<class T>
    explicit sc_uint_base(const sc_generic_base<T> &a) :
            m_val(a->to_uint64()), m_len(a->length()),
            m_ulen(SC_INTWIDTH - m_len)
    {
        check_length();
        extend_sign();
    }

    explicit sc_uint_base(const sc_bv_base &v);
    explicit sc_uint_base(const sc_lv_base &v);
    explicit sc_uint_base(const sc_int_subref_r &v);
    explicit sc_uint_base(const sc_signed_subref_r &v);
    explicit sc_uint_base(const sc_unsigned_subref_r &v);
    explicit sc_uint_base(const sc_signed &a);
    explicit sc_uint_base(const sc_unsigned &a);

    // destructor
    virtual ~sc_uint_base() {}

    // assignment operators
    sc_uint_base &
    operator = (uint_type v)
    {
        m_val = v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator = (const sc_uint_base &a)
    {
        m_val = a.m_val;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator = (const sc_uint_subref_r &a)
    {
        m_val = a;
        extend_sign();
        return *this;
    }
    template<class T>
    sc_uint_base &
    operator = (const sc_generic_base<T> &a)
    {
        m_val = a->to_uint64();
        extend_sign();
        return *this;
    }
    sc_uint_base &operator = (const sc_signed &a);
    sc_uint_base &operator = (const sc_unsigned &a);
    sc_uint_base &operator = (const sc_fxval &a);
    sc_uint_base &operator = (const sc_fxval_fast &a);
    sc_uint_base &operator = (const sc_fxnum &a);
    sc_uint_base &operator = (const sc_fxnum_fast &a);
    sc_uint_base &operator = (const sc_bv_base &a);
    sc_uint_base &operator = (const sc_lv_base &a);
    sc_uint_base &operator = (const char *a);
    sc_uint_base &
    operator = (unsigned long a)
    {
        m_val = a;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator = (long a)
    {
        m_val = a;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator = (unsigned int a)
    {
        m_val = a;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator = (int a)
    {
        m_val = a;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator = (int64 a)
    {
        m_val = a;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator = (double a)
    {
        m_val = (uint_type)a;
        extend_sign();
        return *this;
    }

    // arithmetic assignment operators
    sc_uint_base &
    operator += (uint_type v)
    {
        m_val += v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator -= (uint_type v)
    {
        m_val -= v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator *= (uint_type v)
    {
        m_val *= v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator /= (uint_type v)
    {
        m_val /= v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator %= (uint_type v)
    {
        m_val %= v;
        extend_sign();
        return *this;
    }

    // bitwise assignment operators
    sc_uint_base &
    operator &= (uint_type v)
    {
        m_val &= v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator |= (uint_type v)
    {
        m_val |= v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator ^= (uint_type v)
    {
        m_val ^= v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator <<= (uint_type v)
    {
        m_val <<= v;
        extend_sign();
        return *this;
    }
    sc_uint_base &
    operator >>= (uint_type v)
    {
        m_val >>= v;
        /* no sign extension needed */
        return *this;
    }

    // prefix and postfix increment and decrement operators
    sc_uint_base &
    operator ++ () // prefix
    {
        ++m_val;
        extend_sign();
        return *this;
    }
    const sc_uint_base
    operator ++ (int) // postfix
    {
        sc_uint_base tmp(*this);
        ++m_val;
        extend_sign();
        return tmp;
    }

    sc_uint_base &
    operator -- () // prefix
    {
        --m_val;
        extend_sign();
        return *this;
    }
    const sc_uint_base
    operator -- (int) // postfix
    {
        sc_uint_base tmp(*this);
        --m_val;
        extend_sign();
        return tmp;
    }

    // relational operators
    friend bool
    operator == (const sc_uint_base &a, const sc_uint_base &b)
    {
        return a.m_val == b.m_val;
    }
    friend bool
    operator != (const sc_uint_base &a, const sc_uint_base &b)
    {
        return a.m_val != b.m_val;
    }
    friend bool
    operator <  (const sc_uint_base &a, const sc_uint_base &b)
    {
        return a.m_val < b.m_val;
    }
    friend bool
    operator <= (const sc_uint_base &a, const sc_uint_base &b)
    {
        return a.m_val <= b.m_val;
    }
    friend bool
    operator >  (const sc_uint_base &a, const sc_uint_base &b)
    {
        return a.m_val > b.m_val;
    }
    friend bool
    operator >= (const sc_uint_base &a, const sc_uint_base &b)
    {
        return a.m_val >= b.m_val;
    }

    // bit selection
    sc_uint_bitref &operator [] (int i);
    const sc_uint_bitref_r &operator [] (int i) const;

    sc_uint_bitref &bit(int i);
    const sc_uint_bitref_r &bit(int i) const;

    // part selection
    sc_uint_subref &operator () (int left, int right);
    const sc_uint_subref_r &operator () (int left, int right) const;

    sc_uint_subref &range(int left, int right);
    const sc_uint_subref_r &range(int left, int right) const;

    // bit access, without bounds checking or sign extension
    bool test(int i) const { return (0 != (m_val & (UINT_ONE << i))); }

    void set(int i) { m_val |= (UINT_ONE << i); }
    void
    set(int i, bool v)
    {
        v ? m_val |= (UINT_ONE << i) : m_val &= ~(UINT_ONE << i);
    }

    // capacity
    int length() const { return m_len; }

    // concatenation support
    virtual int
    concat_length(bool *xz_present_p) const
    {
        if (xz_present_p)
            *xz_present_p = false;
        return length();
    }
    virtual bool concat_get_ctrl(sc_digit *dst_p, int low_i) const;
    virtual bool concat_get_data( sc_digit *dst_p, int low_i) const;
    virtual uint64 concat_get_uint64() const { return m_val; }
    virtual void concat_set(int64 src, int low_i);
    virtual void concat_set(const sc_signed &src, int low_i);
    virtual void concat_set(const sc_unsigned &src, int low_i);
    virtual void concat_set(uint64 src, int low_i);

    // reduce methods
    bool and_reduce() const;
    bool nand_reduce() const { return !and_reduce(); }
    bool or_reduce() const;
    bool nor_reduce() const { return !or_reduce(); }
    bool xor_reduce() const;
    bool xnor_reduce() const { return !xor_reduce(); }

    // implicit conversion to uint_type
    operator uint_type() const { return m_val; }

    // explicit conversions
    uint_type value() const { return operator uint_type(); }

    int to_int() const { return (int) m_val; }
    unsigned int to_uint() const { return (unsigned int)m_val; }
    long to_long() const { return (long)m_val; }
    unsigned long to_ulong() const { return (unsigned long)m_val; }
    int64 to_int64() const { return (int64)m_val; }
    uint64 to_uint64() const { return (uint64)m_val; }
    double to_double() const { return uint64_to_double(m_val); }

    long long_low() const { return (long)(m_val & UINT64_32ONES); }
    long long_high() const { return (long)((m_val >> 32) & UINT64_32ONES); }

    // explicit conversion to character string
    const std::string to_string(sc_numrep numrep=SC_DEC) const;
    const std::string to_string(sc_numrep numrep, bool w_prefix) const;

    // other methods
    void
    print(::std::ostream &os=::std::cout) const
    {
        os << to_string(sc_io_base(os, SC_DEC), sc_io_show_base(os));
    }

    void scan(::std::istream &is=::std::cin);

  protected:
    uint_type m_val; // value
    int m_len; // length
    int m_ulen; // unused length
};

inline ::std::ostream &operator << (::std::ostream &, const sc_uint_base &);
inline ::std::istream &operator >> (::std::istream &, sc_uint_base &);


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_bitref_r
//
//  Proxy class for sc_uint bit selection (r-value only).
// ----------------------------------------------------------------------------

// implicit conversion to bool

inline sc_uint_bitref_r::operator uint64 () const
{
    return m_obj_p->test(m_index);
}

inline bool
sc_uint_bitref_r::operator ! () const
{
    return !m_obj_p->test(m_index);
}

inline bool
sc_uint_bitref_r::operator ~ () const
{
    return !m_obj_p->test(m_index);
}

inline ::std::ostream &
operator << (::std::ostream &os, const sc_uint_bitref_r &a)
{
    a.print(os);
    return os;
}


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_bitref
//
//  Proxy class for sc_uint bit selection (r-value and l-value).
// ----------------------------------------------------------------------------

// assignment operators

inline sc_uint_bitref &
sc_uint_bitref::operator = (const sc_uint_bitref_r &b)
{
    m_obj_p->set(m_index, b.to_bool());
    return *this;
}

inline sc_uint_bitref &
sc_uint_bitref::operator = (const sc_uint_bitref &b)
{
    m_obj_p->set(m_index, b.to_bool());
    return *this;
}

inline sc_uint_bitref &
sc_uint_bitref::operator = (bool b)
{
    m_obj_p->set(m_index, b);
    return *this;
}

inline sc_uint_bitref &
sc_uint_bitref::operator &= (bool b)
{
    if (!b) {
        m_obj_p->set(m_index, b);
    }
    return *this;
}

inline sc_uint_bitref &
sc_uint_bitref::operator |= (bool b)
{
    if (b) {
        m_obj_p->set(m_index, b);
    }
    return *this;
}

inline sc_uint_bitref &
sc_uint_bitref::operator ^= (bool b)
{
    if (b) {
        m_obj_p->m_val ^= (UINT_ONE << m_index);
    }
    return *this;
}

inline ::std::istream &
operator >> (::std::istream &is, sc_uint_bitref &a)
{
    a.scan(is);
    return is;
}


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_subref_r
//
//  Proxy class for sc_uint part selection (r-value only).
// ----------------------------------------------------------------------------

// implicit conversion to uint_type

inline sc_uint_subref_r::operator uint_type() const
{
    uint_type val = m_obj_p->m_val;
    int uleft = SC_INTWIDTH - (m_left + 1);
    return ((val & (~UINT_ZERO >> uleft)) >> m_right);
}


// reduce methods
inline bool
sc_uint_subref_r::and_reduce() const
{
    sc_uint_base a(*this);
    return a.and_reduce();
}
inline bool
sc_uint_subref_r::or_reduce() const
{
    sc_uint_base a(*this);
    return a.or_reduce();
}
inline bool
sc_uint_subref_r::xor_reduce() const
{
    sc_uint_base a(*this);
    return a.xor_reduce();
}

// explicit conversions
inline int
sc_uint_subref_r::to_int() const
{
    sc_uint_base a(*this);
    return a.to_int();
}
inline unsigned int
sc_uint_subref_r::to_uint() const
{
    sc_uint_base a(*this);
    return a.to_uint();
}
inline long
sc_uint_subref_r::to_long() const
{
    sc_uint_base a(*this);
    return a.to_long();
}
inline unsigned long
sc_uint_subref_r::to_ulong() const
{
    sc_uint_base a(*this);
    return a.to_ulong();
}
inline int64
sc_uint_subref_r::to_int64() const
{
    sc_uint_base a(*this);
    return a.to_int64();
}
inline uint64
sc_uint_subref_r::to_uint64() const
{
    sc_uint_base a(*this);
    return a.to_uint64();
}
inline double
sc_uint_subref_r::to_double() const
{
    sc_uint_base a(*this);
    return a.to_double();
}

// explicit conversion to character string
inline const std::string
sc_uint_subref_r::to_string(sc_numrep numrep) const
{
    sc_uint_base a(*this);
    return a.to_string(numrep);
}

inline const std::string
sc_uint_subref_r::to_string(sc_numrep numrep, bool w_prefix) const
{
    sc_uint_base a(*this);
    return a.to_string(numrep, w_prefix);
}

// functional notation for the reduce methods
inline bool
and_reduce(const sc_uint_subref_r &a)
{
    return a.and_reduce();
}
inline bool
nand_reduce(const sc_uint_subref_r &a)
{
    return a.nand_reduce();
}
inline bool
or_reduce(const sc_uint_subref_r &a)
{
    return a.or_reduce();
}
inline bool
nor_reduce(const sc_uint_subref_r &a)
{
    return a.nor_reduce();
}
inline bool
xor_reduce(const sc_uint_subref_r &a)
{
    return a.xor_reduce();
}
inline bool
xnor_reduce(const sc_uint_subref_r &a)
{
    return a.xnor_reduce();
}

inline ::std::ostream &
operator << (::std::ostream &os, const sc_uint_subref_r &a)
{
    a.print(os);
    return os;
}


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_subref
//
//  Proxy class for sc_uint part selection (r-value and l-value).
// ----------------------------------------------------------------------------

// assignment operators

inline sc_uint_subref &
sc_uint_subref::operator = (const sc_uint_base &a)
{
    return operator = (a.operator uint_type());
}

inline sc_uint_subref &
sc_uint_subref::operator = (const char *a)
{
    sc_uint_base aa(length());
    return (*this = aa = a);
}

inline ::std::istream &
operator >> (::std::istream &is, sc_uint_subref &a)
{
    a.scan(is);
    return is;
}


// ----------------------------------------------------------------------------
//  CLASS : sc_uint_base
//
//  Base class for sc_uint.
// ----------------------------------------------------------------------------

// bit selection
inline sc_uint_bitref &
sc_uint_base::operator [] (int i)
{
    check_index(i);
    sc_uint_bitref *result_p = sc_uint_bitref::m_pool.allocate();
    result_p->initialize(this, i);
    return *result_p;
}

inline const sc_uint_bitref_r &
sc_uint_base::operator [] (int i) const
{
    check_index(i);
    sc_uint_bitref *result_p = sc_uint_bitref::m_pool.allocate();
    result_p->initialize(this, i);
    return *result_p;
}

inline sc_uint_bitref &
sc_uint_base::bit(int i)
{
    check_index(i);
    sc_uint_bitref *result_p = sc_uint_bitref::m_pool.allocate();
    result_p->initialize(this, i);
    return *result_p;
}

inline const sc_uint_bitref_r &
sc_uint_base::bit(int i) const
{
    check_index(i);
    sc_uint_bitref *result_p = sc_uint_bitref::m_pool.allocate();
    result_p->initialize(this, i);
    return *result_p;
}

// part selection
inline sc_uint_subref &
sc_uint_base::operator () (int left, int right)
{
    check_range(left, right);
    sc_uint_subref *result_p = sc_uint_subref::m_pool.allocate();
    result_p->initialize(this, left, right);
    return *result_p;
}

inline const sc_uint_subref_r &
sc_uint_base::operator () (int left, int right) const
{
    check_range(left, right);
    sc_uint_subref *result_p = sc_uint_subref::m_pool.allocate();
    result_p->initialize(this, left, right);
    return *result_p;
}

inline sc_uint_subref &
sc_uint_base::range(int left, int right)
{
    check_range(left, right);
    sc_uint_subref *result_p = sc_uint_subref::m_pool.allocate();
    result_p->initialize(this, left, right);
    return *result_p;
}

inline const sc_uint_subref_r &
sc_uint_base::range(int left, int right) const
{
    check_range(left, right);
    sc_uint_subref *result_p = sc_uint_subref::m_pool.allocate();
    result_p->initialize(this, left, right);
    return *result_p;
}

// functional notation for the reduce methods
inline bool
and_reduce(const sc_uint_base &a)
{
    return a.and_reduce();
}
inline bool
nand_reduce(const sc_uint_base &a)
{
    return a.nand_reduce();
}
inline bool
or_reduce(const sc_uint_base &a)
{
    return a.or_reduce();
}
inline bool
nor_reduce(const sc_uint_base &a)
{
    return a.nor_reduce();
}
inline bool
xor_reduce(const sc_uint_base &a)
{
    return a.xor_reduce();
}
inline bool
xnor_reduce(const sc_uint_base &a)
{
    return a.xnor_reduce();
}

inline ::std::ostream &
operator << (::std::ostream &os, const sc_uint_base &a)
{
    a.print(os);
    return os;
}

inline ::std::istream &
operator >> (::std::istream &is, sc_uint_base &a)
{
    a.scan(is);
    return is;
}

} // namespace sc_dt

#endif // __SYSTEMC_EXT_DT_INT_SC_UINT_BASE_HH__
