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

  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_bit_proxies.h -- Proxy classes for vector data types.

  Original Author: Gene Bushuyev, Synopsys, Inc.

 CHANGE LOG AT THE END OF THE FILE
 *****************************************************************************/

#ifndef __SYSTEMC_EXT_DT_BIT_SC_BIT_PROXIES_HH__
#define __SYSTEMC_EXT_DT_BIT_SC_BIT_PROXIES_HH__

#include <iostream>

#include "sc_proxy.hh"

namespace sc_dt
{

// classes defined in this module
template <class X, class Traits>
class sc_bitref_conv_r;
template <class X>
class sc_bitref_r;
template <class X>
class sc_bitref;
template <class X>
class sc_subref_r;
template <class X>
class sc_subref;
template <class X, class Y>
class sc_concref_r;
template <class X, class Y>
class sc_concref;

// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_bitref_conv_r<T>
//
//  Proxy class for sc_proxy bit selection (r-value only, boolean conversion).
// ----------------------------------------------------------------------------
template <class T, class Traits=typename T::traits_type>
class sc_bitref_conv_r { /* empty by default */ };

// specialization for bit-vector based sc_proxy classes
template<typename T>
class sc_bitref_conv_r<T, sc_proxy_traits<sc_bv_base> >
{
  public:
#if __cplusplus >= 201103L // explicit operator needs C++11
    // explicit conversion to bool
    explicit operator bool() const
    {
        return static_cast<const sc_bitref_r<T> &>(*this).to_bool();
    }
#endif

    // explicit (negating) conversion to bool
    bool
    operator ! () const
    {
        return !static_cast<const sc_bitref_r<T> &>(*this).to_bool();
    }
};

// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_bitref_r<T>
//
//  Proxy class for sc_proxy bit selection (r-value only).
// ----------------------------------------------------------------------------

template <class T>
class sc_bitref_r : public sc_bitref_conv_r<T>
{
    friend class sc_bv_base;
    friend class sc_lv_base;

  public:
    // typedefs
    typedef typename T::traits_type traits_type;
    typedef typename traits_type::bit_type bit_type;
    typedef typename traits_type::value_type value_type;

    // constructor
    sc_bitref_r(const T &obj_, int index_) :
            m_obj(const_cast<T &>(obj_)), m_index(index_)
    {}

    // copy constructor
    sc_bitref_r(const sc_bitref_r<T> &a) : m_obj(a.m_obj), m_index(a.m_index)
    {}

    // cloning
    sc_bitref_r<T> *clone() const { return new sc_bitref_r<T>(*this); }

    // bitwise operators and functions

    // bitwise complement
    bit_type
    operator ~ () const
    {
        return bit_type(sc_logic::not_table[value()]);
    }

    // implicit conversion to bit_type
    operator bit_type() const { return bit_type(m_obj.get_bit(m_index)); }

    // explicit conversions
    value_type value() const { return m_obj.get_bit(m_index); }
    bool is_01() const { return sc_logic(value()).is_01(); }
    bool to_bool() const { return sc_logic(value()).to_bool(); }
    char to_char() const { return sc_logic(value()).to_char(); }

    // common methods
    int length() const { return 1; }
    int size() const { return ((length() - 1) / SC_DIGIT_SIZE + 1); }

    value_type get_bit(int n) const;

    sc_digit get_word(int i) const;
    sc_digit get_cword(int i) const;

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

  protected:
    T &m_obj;
    int m_index;

  private:
    // Disabled
    sc_bitref_r();
    sc_bitref_r<T> &operator = (const sc_bitref_r<T> &);
};

// bitwise operators and functions

// bitwise and
template <class T1, class T2>
inline sc_logic operator & (
        const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b);


// bitwise or
template <class T1, class T2>
inline sc_logic operator | (
        const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b);

// bitwise xor
template <class T1, class T2>
inline sc_logic operator ^ (
        const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b);

// relational operators and functions
template <class T1, class T2>
inline bool operator == (const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b);

template <class T1, class T2>
inline bool operator != (const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b);

// r-value concatenation operators and functions
template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> > operator , (
        sc_bitref_r<T1>, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> > operator , (
        sc_bitref_r<T1>, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2,T3> > operator , (
        sc_bitref_r<T1>, sc_concref_r<T2,T3>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2> operator , (
        sc_bitref_r<T1>, const sc_proxy<T2> &);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> operator , (
        sc_bitref_r<T>, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > operator , (
        const char *, sc_bitref_r<T>);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> operator , (
        sc_bitref_r<T>, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > operator , (
        const sc_logic &, sc_bitref_r<T>);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> operator , (
        sc_bitref_r<T>, bool);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > operator , (
        bool, sc_bitref_r<T>);


template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> > concat(
        sc_bitref_r<T1>, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> > concat(
        sc_bitref_r<T1>, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2,T3> > concat(
        sc_bitref_r<T1>, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2> concat(
        sc_bitref_r<T1>, const sc_proxy<T2> &);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> concat(
        sc_bitref_r<T>, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > concat(
        const char *, sc_bitref_r<T>);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> concat(
        sc_bitref_r<T>, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > concat(
        const sc_logic &, sc_bitref_r<T>);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> concat(
        sc_bitref_r<T>, bool);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > concat(
        bool, sc_bitref_r<T>);


template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> > operator , (
        sc_bitref_r<T1>, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> > operator , (
        sc_bitref<T1>, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> > operator , (
        sc_bitref_r<T1>, sc_subref<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> > operator , (
        sc_bitref<T1>, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> > operator , (
        sc_bitref_r<T1>, sc_concref<T2, T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2,T3> > operator , (
        sc_bitref<T1>, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2> operator , (
        sc_bitref<T1>, const sc_proxy<T2> &);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2> operator , (
        sc_bitref_r<T1>, sc_proxy<T2> &);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> operator , (
        sc_bitref<T>, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > operator , (
        const char *, sc_bitref<T>);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> operator , (
        sc_bitref<T>, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > operator , (
        const sc_logic &, sc_bitref<T>);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> operator , (
        sc_bitref<T>, bool);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > operator , (
        bool, sc_bitref<T>);


template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> > concat(
        sc_bitref_r<T1>, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> > concat(
        sc_bitref<T1>, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> > concat(
        sc_bitref_r<T1>, sc_subref<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> > concat(
        sc_bitref<T1>, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> > concat(
        sc_bitref_r<T1>, sc_concref<T2, T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> > concat(
        sc_bitref<T1>, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2> concat(
        sc_bitref<T1>, const sc_proxy<T2> &);

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2> concat(
        sc_bitref_r<T1>, sc_proxy<T2> &);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> concat(
        sc_bitref<T>, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > concat(
        const char *, sc_bitref<T>);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> concat(
        sc_bitref<T>, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > concat(
        const sc_logic &, sc_bitref<T>);

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base> concat(sc_bitref<T>, bool);

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> > concat(bool, sc_bitref<T>);


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_bitref<X>
//
//  Proxy class for sc_proxy bit selection (r-value and l-value).
// ----------------------------------------------------------------------------

template <class X>
class sc_bitref : public sc_bitref_r<X>
{
    friend class sc_bv_base;
    friend class sc_lv_base;

  public:
    typedef typename sc_bitref_r<X>::value_type value_type;

    // constructor
    sc_bitref(X &obj_, int index_) : sc_bitref_r<X>(obj_, index_) {}

    // copy constructor
    sc_bitref(const sc_bitref<X> &a) : sc_bitref_r<X>(a) {}

    // cloning
    sc_bitref<X> *clone() const { return new sc_bitref<X>(*this); }

    // assignment operators
    sc_bitref<X> &operator = (const sc_bitref_r<X> &a);
    sc_bitref<X> &operator = (const sc_bitref<X> &a);

    sc_bitref<X> &
    operator = (const sc_logic &a)
    {
        this->m_obj.set_bit(this->m_index, a.value());
        return *this;
    }

    sc_bitref<X> &
    operator = (sc_logic_value_t v)
    {
        *this = sc_logic(v);
        return *this;
    }

    sc_bitref<X> &
    operator = (bool a)
    {
        *this = sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator = (char a)
    {
        *this = sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator = (int a)
    {
        *this = sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator = (const sc_bit &a)
    {
        *this = sc_logic(a);
        return *this;
    }

    // bitwise assignment operators
    sc_bitref<X> &operator &= (const sc_bitref_r<X> &a);
    sc_bitref<X> &operator &= (const sc_logic &a);

    sc_bitref<X> &
    operator &= (sc_logic_value_t v)
    {
        *this &= sc_logic(v);
        return *this;
    }

    sc_bitref<X> &
    operator &= (bool a)
    {
        *this &= sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator &= (char a)
    {
        *this &= sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator &= (int a)
    {
        *this &= sc_logic(a);
        return *this;
    }

    sc_bitref<X> &operator |= (const sc_bitref_r<X> &a);
    sc_bitref<X> &operator |= (const sc_logic &a);

    sc_bitref<X> &
    operator |= (sc_logic_value_t v)
    {
        *this |= sc_logic(v);
        return *this;
    }

    sc_bitref<X> &
    operator |= (bool a)
    {
        *this |= sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator |= (char a)
    {
        *this |= sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator |= (int a)
    {
        *this |= sc_logic(a);
        return *this;
    }

    sc_bitref<X> &operator ^= (const sc_bitref_r<X> &a);
    sc_bitref<X> &operator ^= (const sc_logic &a);

    sc_bitref<X> &
    operator ^= (sc_logic_value_t v)
    {
        *this ^= sc_logic(v);
        return *this;
    }

    sc_bitref<X> &
    operator ^= (bool a)
    {
        *this ^= sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator ^= (char a)
    {
        *this ^= sc_logic(a);
        return *this;
    }

    sc_bitref<X> &
    operator ^= (int a)
    {
        *this ^= sc_logic(a);
        return *this;
    }

    // bitwise operators and functions

    // bitwise complement
    sc_bitref<X> &b_not();

    // common methods
    void set_bit(int n, value_type value);

    void set_word(int i, sc_digit w);
    void set_cword(int i, sc_digit w);

    void clean_tail() { this->m_obj.clean_tail(); }

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

  private:
    // Disabled
    sc_bitref();
};


// l-value concatenation operators and functions

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, sc_bitref<T2> > operator , (
        sc_bitref<T1>, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, sc_subref<T2> > operator , (
        sc_bitref<T1>, sc_subref<T2>);

template <class T1, class T2, class T3>
inline sc_concref<sc_bitref<T1>, sc_concref<T2, T3> > operator , (
        sc_bitref<T1>, sc_concref<T2, T3>);

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, T2> operator , (
        sc_bitref<T1>, sc_proxy<T2> &);


template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, sc_bitref<T2> > concat(
        sc_bitref<T1>, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, sc_subref<T2> > concat(
        sc_bitref<T1>, sc_subref<T2>);

template <class T1, class T2, class T3>
inline sc_concref<sc_bitref<T1>, sc_concref<T2,T3> > concat(
        sc_bitref<T1>, sc_concref<T2, T3>);

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, T2> concat(sc_bitref<T1>, sc_proxy<T2> &);


template <class T>
::std::istream &operator >> (::std::istream &, sc_bitref<T>);


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_subref_r<X>
//
//  Proxy class for sc_proxy part selection (r-value only).
// ----------------------------------------------------------------------------

template <class X>
class sc_subref_r : public sc_proxy<sc_subref_r<X> >
{
    void check_bounds();

  public:
    typedef typename sc_proxy<sc_subref_r<X> >::value_type value_type;

    // constructor
    sc_subref_r(const X &obj_, int hi_, int lo_) :
            m_obj(const_cast<X &>(obj_)), m_hi(hi_), m_lo(lo_), m_len(0)
    { check_bounds(); }

    // copy constructor
    sc_subref_r(const sc_subref_r<X> &a) :
        m_obj(a.m_obj), m_hi(a.m_hi), m_lo(a.m_lo), m_len(a.m_len)
    {}

    // cloning
    sc_subref_r<X> *clone() const { return new sc_subref_r<X>(*this); }

    // common methods
    int length() const { return m_len; }

    int size() const { return ((length() - 1) / SC_DIGIT_SIZE + 1); }

    value_type get_bit(int n) const;
    void set_bit(int n, value_type value);

    sc_digit get_word(int i) const;
    void set_word(int i, sc_digit w);

    sc_digit get_cword(int i) const;
    void set_cword(int i, sc_digit w);

    void clean_tail() { m_obj.clean_tail(); }

    // other methods
    bool is_01() const;
    bool reversed() const { return m_lo > m_hi; }

  protected:
    X &m_obj;
    int m_hi;
    int m_lo;
    int m_len;

  private:
    // Disabled
    sc_subref_r();
    sc_subref_r<X> &operator = (const sc_subref_r<X> &);
};


// r-value concatenation operators and functions

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> > operator , (
        sc_subref_r<T1>, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> > operator , (
        sc_subref_r<T1>, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2,T3> > operator , (
        sc_subref_r<T1>, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2> operator , (
        sc_subref_r<T1>, const sc_proxy<T2> &);

template <class T>
inline sc_concref_r<sc_subref_r<T>,sc_lv_base> operator , (
        sc_subref_r<T>, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> > operator , (
        const char *, sc_subref_r<T>);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base> operator , (
        sc_subref_r<T>, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> > operator , (
        const sc_logic &, sc_subref_r<T>);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_bv_base> operator , (
        sc_subref_r<T>, bool);

template <class T>
inline sc_concref_r<sc_bv_base, sc_subref_r<T> > operator , (
        bool, sc_subref_r<T>);


template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> > concat(
        sc_subref_r<T1>, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> > concat(
        sc_subref_r<T1>, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> > concat(
        sc_subref_r<T1>, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2> concat(
        sc_subref_r<T1>, const sc_proxy<T2> &);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base> concat(
        sc_subref_r<T>, const char *);

template <class T>
inline sc_concref_r<sc_lv_base,sc_subref_r<T> > concat(
        const char *, sc_subref_r<T>);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base> concat(
        sc_subref_r<T>, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> > concat(
        const sc_logic &, sc_subref_r<T>);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_bv_base> concat(sc_subref_r<T>, bool);

template <class T>
inline sc_concref_r<sc_bv_base, sc_subref_r<T> > concat(bool, sc_subref_r<T>);


template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> > operator , (
        sc_subref_r<T1>, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> > operator , (
        sc_subref<T1>, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> > operator , (
        sc_subref_r<T1>, sc_subref<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> > operator , (
        sc_subref<T1>, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> > operator , (
        sc_subref_r<T1>, sc_concref<T2, T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> > operator , (
        sc_subref<T1>, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2> operator , (
        sc_subref<T1>, const sc_proxy<T2> &);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2> operator , (
        sc_subref_r<T1>, sc_proxy<T2> &);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base> operator , (
        sc_subref<T>, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> > operator , (
        const char *, sc_subref<T>);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base> operator , (
        sc_subref<T>, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> > operator , (
        const sc_logic &, sc_subref<T>);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_bv_base> operator , (
        sc_subref<T>, bool);

template <class T>
inline sc_concref_r<sc_bv_base, sc_subref_r<T> > operator , (
        bool, sc_subref<T>);


template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> > concat(
        sc_subref_r<T1>, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> > concat(
        sc_subref<T1>, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> > concat(
        sc_subref_r<T1>, sc_subref<T2>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> > concat(
        sc_subref<T1>, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> > concat(
        sc_subref_r<T1>, sc_concref<T2, T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> > concat(
        sc_subref<T1>, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2> concat(
        sc_subref<T1>, const sc_proxy<T2> &);

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2> concat(
        sc_subref_r<T1>, sc_proxy<T2> &);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base> concat(
        sc_subref<T>, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> > concat(
        const char *, sc_subref<T>);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base> concat(
        sc_subref<T>, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> > concat(
        const sc_logic &, sc_subref<T>);

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_bv_base> concat(sc_subref<T>, bool);

template <class T>
inline sc_concref_r<sc_bv_base, sc_subref_r<T> > concat(bool, sc_subref<T>);


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_subref<X>
//
//  Proxy class for sc_proxy part selection (r-value and l-value).
// ----------------------------------------------------------------------------

template <class X>
class sc_subref : public sc_subref_r<X>
{
  public:
    // typedefs
    typedef sc_subref_r<X> base_type;

    // constructor
    sc_subref(X &obj_, int hi_, int lo_) : sc_subref_r<X>(obj_, hi_, lo_) {}

    // copy constructor
    sc_subref(const sc_subref<X> &a) : sc_subref_r<X>(a) {}

    // cloning
    sc_subref<X> *clone() const { return new sc_subref<X>(*this); }

    // assignment operators
    template <class Y>
    sc_subref<X> &
    operator = (const sc_proxy<Y> &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &operator = (const sc_subref_r<X> &a);
    sc_subref<X> &operator = (const sc_subref<X> &a);

    sc_subref<X> &
    operator = (const char *a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (const bool *a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (const sc_logic *a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (const sc_unsigned &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (const sc_signed &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (const sc_uint_base &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (const sc_int_base &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (unsigned long a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (long a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (unsigned int a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (int a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (uint64 a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_subref<X> &
    operator = (int64 a)
    {
        base_type::assign_(a);
        return *this;
    }

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

  private:
    // Disabled
    sc_subref();
};


// l-value concatenation operators and functions

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, sc_bitref<T2> > operator , (
        sc_subref<T1>, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, sc_subref<T2> > operator , (
        sc_subref<T1>, sc_subref<T2>);

template <class T1, class T2, class T3>
inline sc_concref<sc_subref<T1>, sc_concref<T2, T3> > operator , (
        sc_subref<T1>, sc_concref<T2, T3>);

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, T2> operator , (
        sc_subref<T1>, sc_proxy<T2> &);


template <class T1, class T2>
inline sc_concref<sc_subref<T1>, sc_bitref<T2> > concat(
        sc_subref<T1>, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, sc_subref<T2> > concat(
        sc_subref<T1>, sc_subref<T2>);

template <class T1, class T2, class T3>
inline sc_concref<sc_subref<T1>, sc_concref<T2, T3> > concat(
        sc_subref<T1>, sc_concref<T2, T3>);

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, T2> concat(sc_subref<T1>, sc_proxy<T2> &);


template <class T>
inline ::std::istream &operator >> (::std::istream &, sc_subref<T>);


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_concref_r<X,Y>
//
//  Proxy class for sc_proxy concatenation (r-value only).
// ----------------------------------------------------------------------------

template <class X, class Y>
class sc_concref_r : public sc_proxy<sc_concref_r<X, Y> >
{
  public:
    typedef typename sc_proxy<sc_concref_r<X, Y> >::value_type value_type;

    // constructor
    sc_concref_r(const X &left_, const Y &right_, int delete_=0) :
        m_left(const_cast<X &>(left_)), m_right(const_cast<Y &>(right_)),
          m_delete(delete_), m_refs(*new int(1))
    {}

    // copy constructor
    sc_concref_r(const sc_concref_r<X, Y> &a) :
            m_left(a.m_left), m_right(a.m_right),
            m_delete(a.m_delete), m_refs(a.m_refs)
    { ++ m_refs; }

    // destructor
    virtual ~sc_concref_r();

    // cloning
    sc_concref_r<X, Y> *clone() const { return new sc_concref_r<X, Y>(*this); }

    // common methods
    int length() const { return (m_left.length() + m_right.length()); }

    int size() const { return ((length() - 1) / SC_DIGIT_SIZE + 1); }

    value_type get_bit(int n) const;
    void set_bit(int n, value_type value);

    sc_digit get_word(int i) const;
    void set_word(int i, sc_digit w);

    sc_digit get_cword(int i) const;
    void set_cword(int i, sc_digit w);

    void clean_tail() { m_left.clean_tail(); m_right.clean_tail(); }

    // other methods
    bool is_01() const { return (m_left.is_01() && m_right.is_01()); }

  protected:
    X &m_left;
    Y &m_right;
    mutable int m_delete;
    int &m_refs;

  private:
    // Disabled
    sc_concref_r();
    sc_concref_r<X, Y> &operator = (const sc_concref_r<X, Y> &);
};


// r-value concatenation operators and functions

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>,sc_bitref_r<T3> > operator , (
        sc_concref_r<T1, T2>, sc_bitref_r<T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> > operator , (
        sc_concref_r<T1, T2>, sc_subref_r<T3>);

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> > operator , (
        sc_concref_r<T1, T2>, sc_concref_r<T3, T4>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3> operator , (
        sc_concref_r<T1, T2>, const sc_proxy<T3> &);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base> operator , (
        sc_concref_r<T1, T2>, const char *);

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> > operator , (
        const char *, sc_concref_r<T1, T2>);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base> operator , (
        sc_concref_r<T1, T2>, const sc_logic &);

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> > operator , (
        const sc_logic &, sc_concref_r<T1, T2>);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base> operator , (
        sc_concref_r<T1, T2>, bool);

template <class T1, class T2>
inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> > operator , (
        bool, sc_concref_r<T1, T2>);


template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> > concat(
        sc_concref_r<T1, T2>, sc_bitref_r<T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> > concat(
        sc_concref_r<T1, T2>, sc_subref_r<T3>);

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> > concat(
        sc_concref_r<T1, T2>, sc_concref_r<T3, T4>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3> concat(
        sc_concref_r<T1, T2>, const sc_proxy<T3> &);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base> concat(
        sc_concref_r<T1, T2>, const char *);

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> > concat(
        const char *, sc_concref_r<T1, T2>);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base> concat(
        sc_concref_r<T1, T2>, const sc_logic &);

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> > concat(
        const sc_logic &, sc_concref_r<T1, T2>);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base> concat(
        sc_concref_r<T1, T2>, bool);

template <class T1, class T2>
inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> > concat(
        bool, sc_concref_r<T1, T2>);


template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> > operator , (
        sc_concref_r<T1, T2>, sc_bitref<T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> > operator , (
        sc_concref<T1, T2>, sc_bitref_r<T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> > operator , (
        sc_concref_r<T1, T2>, sc_subref<T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> > operator , (
        sc_concref<T1, T2>, sc_subref_r<T3>);

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> > operator , (
        sc_concref_r<T1, T2>, sc_concref<T3, T4>);

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> > operator , (
        sc_concref<T1, T2>, sc_concref_r<T3, T4>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3> operator , (
        sc_concref<T1, T2>, const sc_proxy<T3> &);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3> operator , (
        sc_concref_r<T1, T2>, sc_proxy<T3> &);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base> operator , (
        sc_concref<T1, T2>, const char *);

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> > operator , (
        const char *, sc_concref<T1, T2>);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base> operator , (
        sc_concref<T1, T2>, const sc_logic &);

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> > operator , (
        const sc_logic &, sc_concref<T1, T2>);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base> operator , (
        sc_concref<T1, T2>, bool);

template <class T1, class T2>
inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> > operator , (
        bool, sc_concref<T1, T2>);


template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> > concat(
        sc_concref_r<T1, T2>, sc_bitref<T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> > concat(
        sc_concref<T1, T2>, sc_bitref_r<T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> > concat(
        sc_concref_r<T1, T2>, sc_subref<T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> > concat(
        sc_concref<T1, T2>, sc_subref_r<T3>);

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> > concat(
        sc_concref_r<T1, T2>, sc_concref<T3, T4>);

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> > concat(
        sc_concref<T1, T2>, sc_concref_r<T3, T4> );

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3> concat(
        sc_concref<T1, T2>, const sc_proxy<T3> &);

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3> concat(
        sc_concref_r<T1, T2>, sc_proxy<T3> &);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base> concat(
        sc_concref<T1, T2>, const char *);

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> > concat(
        const char *, sc_concref<T1, T2>);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base> concat(
        sc_concref<T1, T2>, const sc_logic &);

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> > concat(
        const sc_logic &, sc_concref<T1, T2>);

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base> concat(
        sc_concref<T1, T2>, bool);

template <class T1, class T2>
inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> > concat(
        bool, sc_concref<T1, T2>);


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_concref<X,Y>
//
//  Proxy class for sc_proxy concatenation (r-value and l-value).
// ----------------------------------------------------------------------------

template <class X, class Y>
class sc_concref : public sc_concref_r<X, Y>
{
  public:
    // typedefs
    typedef sc_concref_r<X, Y> base_type;

    // constructor
    sc_concref(X &left_, Y &right_, int delete_=0) :
            sc_concref_r<X, Y>(left_, right_, delete_)
    {}

    // copy constructor
    sc_concref(const sc_concref<X, Y> &a) : sc_concref_r<X, Y>(a) {}

    // cloning
    sc_concref<X, Y> *clone() const { return new sc_concref<X, Y>(*this); }

    // assignment operators
    template <class Z>
    sc_concref<X, Y> &
    operator = (const sc_proxy<Z> &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (const sc_concref<X, Y> &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (const char *a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (const bool *a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (const sc_logic *a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (const sc_unsigned &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (const sc_signed &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (const sc_uint_base &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (const sc_int_base &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (unsigned long a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (long a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (unsigned int a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (int a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (uint64 a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_concref<X, Y> &
    operator = (int64 a)
    {
        base_type::assign_(a);
        return *this;
    }

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

  private:
    // Disabled
    sc_concref();
};


// l-value concatenation operators and functions

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, sc_bitref<T3> > operator , (
        sc_concref<T1, T2>, sc_bitref<T3>);

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, sc_subref<T3> > operator , (
        sc_concref<T1, T2>, sc_subref<T3>);

template <class T1, class T2, class T3, class T4>
inline sc_concref<sc_concref<T1, T2>, sc_concref<T3, T4> > operator , (
        sc_concref<T1, T2>, sc_concref<T3, T4>);

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, T3> operator , (
        sc_concref<T1, T2>, sc_proxy<T3> &);


template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, sc_bitref<T3> > concat(
        sc_concref<T1, T2>, sc_bitref<T3>);

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, sc_subref<T3> > concat(
        sc_concref<T1, T2>, sc_subref<T3>);

template <class T1, class T2, class T3, class T4>
inline sc_concref<sc_concref<T1, T2>, sc_concref<T3, T4> > concat(
        sc_concref<T1, T2>, sc_concref<T3, T4>);

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, T3> concat(
        sc_concref<T1, T2>, sc_proxy<T3> &);


template <class T1, class T2>
inline ::std::istream &operator >> (::std::istream &, sc_concref<T1, T2>);


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_proxy<T>
//
//  Base class template for bit/logic vector classes.
//  (Barton/Nackmann implementation)
// ----------------------------------------------------------------------------

// r-value concatenation operators and functions

template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> > operator , (
        const sc_proxy<T1> &, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> > operator , (
        const sc_proxy<T1> &, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> > operator , (
        const sc_proxy<T1> &, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<T1, T2> operator , (
        const sc_proxy<T1> &, const sc_proxy<T2> &);

template <class T>
inline sc_concref_r<T, sc_lv_base> operator , (
        const sc_proxy<T> &, const char *);

template <class T>
inline sc_concref_r<sc_lv_base,T> operator , (
        const char *, const sc_proxy<T> &);

template <class T>
inline sc_concref_r<T, sc_lv_base> operator , (
        const sc_proxy<T> &, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, T> operator , (
        const sc_logic &, const sc_proxy<T> &);

template <class T>
inline sc_concref_r<T, sc_bv_base> operator , (const sc_proxy<T> &, bool);

template <class T>
inline sc_concref_r<sc_bv_base, T> operator , (bool, const sc_proxy<T> &);


template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> > concat(
        const sc_proxy<T1> &, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> > concat(
        const sc_proxy<T1> &, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> > concat(
        const sc_proxy<T1> &, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<T1, T2> concat(const sc_proxy<T1> &, const sc_proxy<T2> &);

template <class T>
inline sc_concref_r<T, sc_lv_base> concat(const sc_proxy<T> &, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, T> concat(const char *, const sc_proxy<T> &);

template <class T>
inline sc_concref_r<T, sc_lv_base> concat(
        const sc_proxy<T> &, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, T> concat(
        const sc_logic &, const sc_proxy<T> &);

template <class T>
inline sc_concref_r<T, sc_bv_base> concat(const sc_proxy<T> &, bool);

template <class T>
inline sc_concref_r<sc_bv_base, T> concat(bool, const sc_proxy<T> &);


template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> > operator , (
        const sc_proxy<T1> &, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> > operator , (
        sc_proxy<T1> &, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> > operator , (
        const sc_proxy<T1> &, sc_subref<T2>);

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> > operator , (
        sc_proxy<T1> &, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> > operator , (
        const sc_proxy<T1> &, sc_concref<T2, T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> > operator , (
        sc_proxy<T1> &, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<T1, T2> operator , (const sc_proxy<T1> &, sc_proxy<T2> &);

template <class T1, class T2>
inline sc_concref_r<T1, T2> operator , (sc_proxy<T1> &, const sc_proxy<T2> &);

template <class T>
inline sc_concref_r<T, sc_lv_base> operator , (sc_proxy<T> &, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, T> operator , (const char *, sc_proxy<T> &);

template <class T>
inline sc_concref_r<T, sc_lv_base> operator , (
        sc_proxy<T> &, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, T> operator , (
        const sc_logic &, sc_proxy<T> &);

template <class T>
inline sc_concref_r<T, sc_bv_base> operator , (sc_proxy<T> &, bool);

template <class T>
inline sc_concref_r<sc_bv_base, T> operator , (bool, sc_proxy<T> &);


template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> > concat(
        const sc_proxy<T1> &, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> > concat(
        sc_proxy<T1> &, sc_bitref_r<T2>);

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> > concat(
        const sc_proxy<T1> &, sc_subref<T2>);

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> > concat(
        sc_proxy<T1> &, sc_subref_r<T2>);

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> > concat(
        const sc_proxy<T1> &, sc_concref<T2, T3>);

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> > concat(
        sc_proxy<T1> &, sc_concref_r<T2, T3>);

template <class T1, class T2>
inline sc_concref_r<T1, T2> concat(const sc_proxy<T1> &, sc_proxy<T2> &);

template <class T1, class T2>
inline sc_concref_r<T1, T2> concat(sc_proxy<T1> &, const sc_proxy<T2> &);

template <class T>
inline sc_concref_r<T, sc_lv_base> concat(sc_proxy<T> &, const char *);

template <class T>
inline sc_concref_r<sc_lv_base, T> concat(const char *, sc_proxy<T> &);

template <class T>
inline sc_concref_r<T, sc_lv_base> concat(sc_proxy<T> &, const sc_logic &);

template <class T>
inline sc_concref_r<sc_lv_base, T> concat(const sc_logic &, sc_proxy<T> &);

template <class T>
inline sc_concref_r<T, sc_bv_base> concat(sc_proxy<T> &, bool);

template <class T>
inline sc_concref_r<sc_bv_base, T> concat(bool, sc_proxy<T> &);


// l-value concatenation operators and functions
template <class T1, class T2>
inline sc_concref<T1,sc_bitref<T2> > operator , (
        sc_proxy<T1> &, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref<T1, sc_subref<T2> > operator , (
        sc_proxy<T1> &, sc_subref<T2>);

template <class T1, class T2, class T3>
inline sc_concref<T1, sc_concref<T2, T3> > operator , (
        sc_proxy<T1> &, sc_concref<T2, T3>);

template <class T1, class T2>
inline sc_concref<T1, T2> operator , (sc_proxy<T1> &, sc_proxy<T2> &);


template <class T1, class T2>
inline sc_concref<T1, sc_bitref<T2> > concat(sc_proxy<T1> &, sc_bitref<T2>);

template <class T1, class T2>
inline sc_concref<T1, sc_subref<T2> > concat(sc_proxy<T1> &, sc_subref<T2>);

template <class T1, class T2, class T3>
inline sc_concref<T1, sc_concref<T2, T3> > concat(
        sc_proxy<T1> &, sc_concref<T2, T3>);

template <class T1, class T2>
inline sc_concref<T1, T2> concat(sc_proxy<T1> &, sc_proxy<T2> &);


// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_bitref_r<T>
//
//  Proxy class for sc_proxy bit selection (r-value only).
// ----------------------------------------------------------------------------

// bitwise operators and functions

// bitwise and
template <class T1, class T2>
inline sc_logic
operator & (const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b)
{
    return sc_logic(sc_logic::and_table[a.value()][b.value()]);
}

// bitwise or
template <class T1, class T2>
inline sc_logic
operator | (const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b)
{
    return sc_logic(sc_logic::or_table[a.value()][b.value()]);
}

// bitwise xor
template <class T1, class T2>
inline sc_logic
operator ^ (const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b)
{
    return sc_logic(sc_logic::xor_table[a.value()][b.value()]);
}

// relational operators and functions
template <class T1, class T2>
inline bool
operator == (const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b)
{
    return ((int)a.value() == b.value());
}

template <class T1, class T2>
inline bool
operator != (const sc_bitref_r<T1> &a, const sc_bitref_r<T2> &b)
{
    return ((int)a.value() != b.value());
}

// common methods
template <class T>
inline typename sc_bitref_r<T>::value_type
sc_bitref_r<T>::get_bit(int n) const
{
    if (n == 0) {
        return m_obj.get_bit(m_index);
    } else {
        SC_REPORT_ERROR("out of bounds", 0);
        return Log_0;
    }
}

template <class T>
inline sc_digit
sc_bitref_r<T>::get_word(int n) const
{
    if (n == 0) {
        return (get_bit(n) & SC_DIGIT_ONE);
    } else {
        SC_REPORT_ERROR("out of bounds", 0);
        return 0;
    }
}

template <class T>
inline sc_digit
sc_bitref_r<T>::get_cword(int n) const
{
    if (n == 0) {
        return ((get_bit(n) & SC_DIGIT_TWO) >> 1);
    } else {
        SC_REPORT_ERROR("out of bounds", 0);
        return 0;
    }
}

// r-value concatenation operators and functions
template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >
operator , (sc_bitref_r<T1> a, sc_bitref_r<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >
operator , (sc_bitref_r<T1> a, sc_subref_r<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >
operator , (sc_bitref_r<T1> a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2>
operator , (sc_bitref_r<T1> a, const sc_proxy<T2> &b)
{
    return sc_concref_r<sc_bitref_r<T1>, T2>(
        *a.clone(), b.back_cast(), 1);
}


template <class T1, class T2>
inline
sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >
concat(sc_bitref_r<T1> a, sc_bitref_r<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >
concat(sc_bitref_r<T1> a, sc_subref_r<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >
concat(sc_bitref_r<T1> a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2>
concat(sc_bitref_r<T1> a, const sc_proxy<T2> &b)
{
    return sc_concref_r<sc_bitref_r<T1>, T2>(
        *a.clone(), b.back_cast(), 1);
}


template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >
operator , (sc_bitref_r<T1> a, sc_bitref<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >
operator , (sc_bitref<T1> a, sc_bitref_r<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >
operator , (sc_bitref_r<T1> a, sc_subref<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >
operator , (sc_bitref<T1> a, sc_subref_r<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >
operator , (sc_bitref_r<T1> a, sc_concref<T2, T3> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >
operator , (sc_bitref<T1> a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2>
operator , (sc_bitref<T1> a, const sc_proxy<T2> &b)
{
    return sc_concref_r<sc_bitref_r<T1>, T2>(
        *a.clone(), b.back_cast(), 1);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2>
operator , (sc_bitref_r<T1> a, sc_proxy<T2> &b)
{
    return sc_concref_r<sc_bitref_r<T1>, T2>(
        *a.clone(), b.back_cast(), 1);
}


template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >
concat(sc_bitref_r<T1> a, sc_bitref<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >
concat(sc_bitref<T1> a, sc_bitref_r<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_bitref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >
concat(sc_bitref_r<T1> a, sc_subref<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >
concat(sc_bitref<T1> a, sc_subref_r<T2> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_subref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >
concat(sc_bitref_r<T1> a, sc_concref<T2, T3> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2,T3> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2, T3> >
concat(sc_bitref<T1> a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<sc_bitref_r<T1>, sc_concref_r<T2,T3> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2>
concat(sc_bitref<T1> a, const sc_proxy<T2> &b)
{
    return sc_concref_r<sc_bitref_r<T1>, T2>(*a.clone(), b.back_cast(), 1);
}

template <class T1, class T2>
inline sc_concref_r<sc_bitref_r<T1>, T2>
concat(sc_bitref_r<T1> a, sc_proxy<T2> &b)
{
    return sc_concref_r<sc_bitref_r<T1>, T2>(*a.clone(), b.back_cast(), 1);
}


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_bitref<X>
//
//  Proxy class for sc_proxy bit selection (r-value and l-value).
// ----------------------------------------------------------------------------

// assignment operators
template <class X>
inline sc_bitref<X> &
sc_bitref<X>::operator = (const sc_bitref_r<X> &a)
{
    this->m_obj.set_bit(this->m_index, a.value());
    return *this;
}

template <class X>
inline sc_bitref<X> &
sc_bitref<X>::operator = (const sc_bitref<X> &a)
{
    if (&a != this) {
        this->m_obj.set_bit(this->m_index, a.value());
    }
    return *this;
}


// bitwise assignment operators
template <class X>
inline sc_bitref<X> &
sc_bitref<X>::operator &= (const sc_bitref_r<X> &a)
{
    if (&a != this) {
        this->m_obj.set_bit(
                this->m_index, sc_logic::and_table[this->value()][a.value()]);
    }
    return *this;
}

template <class X>
inline sc_bitref<X> &
sc_bitref<X>::operator &= (const sc_logic &a)
{
    this->m_obj.set_bit(
            this->m_index, sc_logic::and_table[this->value()][a.value()]);
    return *this;
}


template <class X>
inline sc_bitref<X> &
sc_bitref<X>::operator |= (const sc_bitref_r<X> &a)
{
    if (&a != this) {
        this->m_obj.set_bit(
                this->m_index, sc_logic::or_table[this->value()][a.value()]);
    }
    return *this;
}

template <class X>
inline sc_bitref<X> &
sc_bitref<X>::operator |= (const sc_logic &a)
{
    this->m_obj.set_bit(
            this->m_index, sc_logic::or_table[this->value()][a.value()]);
    return *this;
}


template <class X>
inline sc_bitref<X> &
sc_bitref<X>::operator ^= (const sc_bitref_r<X> &a)
{
    if (&a != this) {
        this->m_obj.set_bit(
                this->m_index, sc_logic::xor_table[this->value()][a.value()]);
    }
    return *this;
}

template <class X>
inline sc_bitref<X> &
sc_bitref<X>::operator ^= (const sc_logic &a)
{
    this->m_obj.set_bit(
            this->m_index, sc_logic::xor_table[this->value()][a.value()]);
    return *this;
}

// bitwise operators and functions

// bitwise complement
template <class X>
inline sc_bitref<X> &
sc_bitref<X>::b_not()
{
    this->m_obj.set_bit(this->m_index, sc_logic::not_table[this->value()]);
    return *this;
}

// common methods
template <class X>
inline void
sc_bitref<X>::set_bit(int n, value_type value)
{
    if (n == 0) {
        this->m_obj.set_bit(this->m_index, value);
    } else {
        SC_REPORT_ERROR("out of bounds", 0);
    }
}

template <class X>
inline void
sc_bitref<X>::set_word(int n, sc_digit w)
{
    unsigned int bi = this->m_index % (8 * sizeof(sc_digit));
    sc_digit temp;
    unsigned int wi = this->m_index / (8 * sizeof(sc_digit));
    if (n == 0) {
        temp = this->m_obj.get_word(wi);
        temp = (temp & ~(1 << bi)) | ((w & 1) << bi);
        this->m_obj.set_word(wi, temp);
    } else {
        SC_REPORT_ERROR("out of bounds", 0);
    }
}

template <class X>
inline void
sc_bitref<X>::set_cword(int n, sc_digit w)
{
    unsigned int bi = this->m_index % (8 * sizeof(sc_digit));
    sc_digit temp;
    unsigned int wi = this->m_index / (8 * sizeof(sc_digit));
    if (n == 0) {
        temp = this->m_obj.get_cword(wi);
        temp = (temp & ~(1 << bi)) | ((w & 1) << bi);
        this->m_obj.set_cword(wi, temp);
    } else {
        SC_REPORT_ERROR("out of bounds", 0);
    }
}

// other methods
template <class X>
inline void
sc_bitref<X>::scan(::std::istream &is)
{
    char c;
    is >> c;
    *this = c;
}

// l-value concatenation operators and functions
template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, sc_bitref<T2> >
operator , (sc_bitref<T1> a, sc_bitref<T2> b)
{
    return sc_concref<sc_bitref<T1>, sc_bitref<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, sc_subref<T2> >
operator , (sc_bitref<T1> a, sc_subref<T2> b)
{
    return sc_concref<sc_bitref<T1>, sc_subref<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref<sc_bitref<T1>, sc_concref<T2, T3> >
operator , (sc_bitref<T1> a, sc_concref<T2, T3> b)
{
    return sc_concref<sc_bitref<T1>, sc_concref<T2, T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, T2>
operator , (sc_bitref<T1> a, sc_proxy<T2> &b)
{
    return sc_concref<sc_bitref<T1>, T2>(*a.clone(), b.back_cast(), 1);
}


template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, sc_bitref<T2> >
concat(sc_bitref<T1> a, sc_bitref<T2> b)
{
    return sc_concref<sc_bitref<T1>, sc_bitref<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, sc_subref<T2> >
concat(sc_bitref<T1> a, sc_subref<T2> b)
{
    return sc_concref<sc_bitref<T1>, sc_subref<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref<sc_bitref<T1>, sc_concref<T2, T3> >
concat(sc_bitref<T1> a, sc_concref<T2, T3> b)
{
    return sc_concref<sc_bitref<T1>, sc_concref<T2,T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref<sc_bitref<T1>, T2>
concat(sc_bitref<T1> a, sc_proxy<T2> &b)
{
    return sc_concref<sc_bitref<T1>, T2>(*a.clone(), b.back_cast(), 1);
}

template <class X>
inline ::std::istream &
operator >> (::std::istream &is, sc_bitref<X> a)
{
    a.scan(is);
    return is;
}


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_subref_r<X>
//
//  Proxy class for sc_proxy part selection (r-value only).
// ----------------------------------------------------------------------------

template <class X>
inline void
sc_subref_r<X>::check_bounds()
{
    int len = m_obj.length();
    if (m_hi < 0 || m_hi >= len || m_lo < 0 || m_lo >= len) {
        SC_REPORT_ERROR("out of bounds", 0);
        sc_core::sc_abort(); // can't recover from here
    }
    if (reversed()) {
        m_len = m_lo - m_hi + 1;
    } else {
        m_len = m_hi - m_lo + 1;
    }
}

// common methods
template <class X>
inline typename sc_subref_r<X>::value_type
sc_subref_r<X>::get_bit(int n) const
{
    if (reversed()) {
        return m_obj.get_bit(m_lo - n);
    } else {
        return m_obj.get_bit(m_lo + n);
    }
}

template <class X>
inline void
sc_subref_r<X>::set_bit(int n, value_type value)
{
    if (reversed()) {
        m_obj.set_bit(m_lo - n, value);
    } else {
        m_obj.set_bit(m_lo + n, value);
    }
}

template <class X>
inline sc_digit
sc_subref_r<X>::get_word(int i) const
{
    int n1 = 0;
    int n2 = 0;
    sc_digit result = 0;
    int k = 0;
    if (reversed()) {
        n1 = m_lo - i * SC_DIGIT_SIZE;
        n2 = sc_max(n1 - SC_DIGIT_SIZE, m_hi - 1);
        for (int n = n1; n > n2; n--) {
            result |= (m_obj[n].value() & SC_DIGIT_ONE) << k++;
        }
    } else {
        n1 = m_lo + i * SC_DIGIT_SIZE;
        n2 = sc_min(n1 + SC_DIGIT_SIZE, m_hi + 1);
        for (int n = n1; n < n2; n++) {
            result |= (m_obj[n].value() & SC_DIGIT_ONE) << k++;
        }
    }
    return result;
}

template <class X>
inline void
sc_subref_r<X>::set_word(int i, sc_digit w)
{
    int n1 = 0;
    int n2 = 0;
    int k = 0;
    if (reversed()) {
        n1 = m_lo - i * SC_DIGIT_SIZE;
        n2 = sc_max(n1 - SC_DIGIT_SIZE, m_hi - 1);
        for (int n = n1; n > n2; n--) {
            m_obj.set_bit(n, value_type(
                    ((w >> k++) & SC_DIGIT_ONE) |
                    (m_obj[n].value() & SC_DIGIT_TWO)));
        }
    } else {
        n1 = m_lo + i * SC_DIGIT_SIZE;
        n2 = sc_min(n1 + SC_DIGIT_SIZE, m_hi + 1);
        for (int n = n1; n < n2; n++) {
            m_obj.set_bit(n, value_type(
                    ((w >> k++) & SC_DIGIT_ONE) |
                    (m_obj[n].value() & SC_DIGIT_TWO)));
        }
    }
}


template <class X>
inline sc_digit
sc_subref_r<X>::get_cword(int i) const
{
    int n1 = 0;
    int n2 = 0;
    sc_digit result = 0;
    int k = 0;
    if (reversed()) {
        n1 = m_lo - i * SC_DIGIT_SIZE;
        n2 = sc_max(n1 - SC_DIGIT_SIZE, m_hi - 1);
        for (int n = n1; n > n2; n--) {
            result |= ((m_obj[n].value() & SC_DIGIT_TWO) >> 1) << k++;
        }
    } else {
        n1 = m_lo + i * SC_DIGIT_SIZE;
        n2 = sc_min(n1 + SC_DIGIT_SIZE, m_hi + 1);
        for (int n = n1; n < n2; n++) {
            result |= ((m_obj[n].value() & SC_DIGIT_TWO) >> 1) << k++;
        }
    }
    return result;
}

template <class X>
inline void
sc_subref_r<X>::set_cword(int i, sc_digit w)
{
    int n1 = 0;
    int n2 = 0;
    int k = 0;
    if (reversed()) {
        n1 = m_lo - i * SC_DIGIT_SIZE;
        n2 = sc_max(n1 - SC_DIGIT_SIZE, m_hi - 1);
        for (int n = n1; n > n2; n--) {
            m_obj.set_bit(n, value_type(
                    (((w >> k++) & SC_DIGIT_ONE) << 1) |
                    (m_obj[n].value() & SC_DIGIT_ONE)));
        }
    } else {
        n1 = m_lo + i * SC_DIGIT_SIZE;
        n2 = sc_min(n1 + SC_DIGIT_SIZE, m_hi + 1);
        for (int n = n1; n < n2; n++) {
            m_obj.set_bit(n, value_type(
                    (((w >> k++) & SC_DIGIT_ONE) << 1) |
                    (m_obj[n].value() & SC_DIGIT_ONE)));
        }
    }
}

// other methods
template <class X>
inline bool
sc_subref_r<X>::is_01() const
{
    int sz = size();
    for (int i = 0; i < sz; ++i) {
        if (get_cword(i) != SC_DIGIT_ZERO) {
            return false;
        }
    }
    return true;
}

// r-value concatenation operators and functions
template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >
operator , (sc_subref_r<T1> a, sc_bitref_r<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >
operator , (sc_subref_r<T1> a, sc_subref_r<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >
operator , (sc_subref_r<T1> a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2>
operator , (sc_subref_r<T1> a, const sc_proxy<T2> &b)
{
    return sc_concref_r<sc_subref_r<T1>, T2>(
            *a.clone(), b.back_cast(), 1);
}


template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >
concat(sc_subref_r<T1> a, sc_bitref_r<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >
concat(sc_subref_r<T1> a, sc_subref_r<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >
concat(sc_subref_r<T1> a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2>
concat(sc_subref_r<T1> a, const sc_proxy<T2> &b)
{
    return sc_concref_r<sc_subref_r<T1>, T2>(*a.clone(), b.back_cast(), 1);
}


template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >
operator , (sc_subref_r<T1> a, sc_bitref<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >
operator , (sc_subref<T1> a, sc_bitref_r<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >
operator , (sc_subref_r<T1> a, sc_subref<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >
operator , (sc_subref<T1> a, sc_subref_r<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline
sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >
operator , (sc_subref_r<T1> a, sc_concref<T2, T3> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >
operator , (sc_subref<T1> a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >(
        *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2>
operator , (sc_subref<T1> a, const sc_proxy<T2> &b)
{
    return sc_concref_r<sc_subref_r<T1>, T2>(*a.clone(), b.back_cast(), 1);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2>
operator , (sc_subref_r<T1> a, sc_proxy<T2> &b)
{
    return sc_concref_r<sc_subref_r<T1>, T2>(*a.clone(), b.back_cast(), 1);
}


template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >
concat(sc_subref_r<T1> a, sc_bitref<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >
concat(sc_subref<T1> a, sc_bitref_r<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_bitref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >
concat(sc_subref_r<T1> a, sc_subref<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >
concat(sc_subref<T1> a, sc_subref_r<T2> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_subref_r<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >
concat(sc_subref_r<T1> a, sc_concref<T2, T3> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >
concat(sc_subref<T1> a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<sc_subref_r<T1>, sc_concref_r<T2, T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2>
concat(sc_subref<T1> a, const sc_proxy<T2> &b)
{
    return sc_concref_r<sc_subref_r<T1>, T2>(*a.clone(), b.back_cast(), 1);
}

template <class T1, class T2>
inline sc_concref_r<sc_subref_r<T1>, T2>
concat(sc_subref_r<T1> a, sc_proxy<T2> &b)
{
    return sc_concref_r<sc_subref_r<T1>, T2>(*a.clone(), b.back_cast(), 1);
}


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_subref<X>
//
//  Proxy class for sc_proxy part selection (r-value and l-value).
// ----------------------------------------------------------------------------

// assignment operators
// sc_subref<X>::operator = ( const sc_subref_r<X>& ) in sc_lv_base.h
// sc_subref<X>::operator = ( const sc_subref<X>& )   in sc_lv_base.h

// other methods
template <class T>
inline void
sc_subref<T>::scan(::std::istream &is)
{
    std::string s;
    is >> s;
    *this = s.c_str();
}

// l-value concatenation operators and functions
template <class T1, class T2>
inline
sc_concref<sc_subref<T1>, sc_bitref<T2> >
operator , (sc_subref<T1> a, sc_bitref<T2> b)
{
    return sc_concref<sc_subref<T1>, sc_bitref<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, sc_subref<T2> >
operator , (sc_subref<T1> a, sc_subref<T2> b)
{
    return sc_concref<sc_subref<T1>, sc_subref<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref<sc_subref<T1>, sc_concref<T2,T3> >
operator , (sc_subref<T1> a, sc_concref<T2, T3> b)
{
    return sc_concref<sc_subref<T1>, sc_concref<T2, T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, T2>
operator , (sc_subref<T1> a, sc_proxy<T2> &b)
{
    return sc_concref<sc_subref<T1>, T2>(*a.clone(), b.back_cast(), 1);
}


template <class T1, class T2>
inline sc_concref<sc_subref<T1>, sc_bitref<T2> >
concat(sc_subref<T1> a, sc_bitref<T2> b)
{
    return sc_concref<sc_subref<T1>, sc_bitref<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, sc_subref<T2> >
concat(sc_subref<T1> a, sc_subref<T2> b)
{
    return sc_concref<sc_subref<T1>, sc_subref<T2> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref<sc_subref<T1>, sc_concref<T2, T3> >
concat(sc_subref<T1> a, sc_concref<T2, T3> b)
{
    return sc_concref<sc_subref<T1>, sc_concref<T2, T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref<sc_subref<T1>, T2>
concat(sc_subref<T1> a, sc_proxy<T2> &b)
{
    return sc_concref<sc_subref<T1>, T2>(*a.clone(), b.back_cast(), 1);
}

template <class X>
inline ::std::istream &
operator >> (::std::istream &is, sc_subref<X> a)
{
    a.scan(is);
    return is;
}

// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_concref_r<X,Y>
//
//  Proxy class for sc_proxy concatenation (r-value only).
// ----------------------------------------------------------------------------

// destructor
template <class X, class Y>
inline sc_concref_r<X, Y>::~sc_concref_r()
{
    if (--m_refs == 0) {
        delete &m_refs;
        if (m_delete == 0) {
            return;
        }
        if (m_delete & 1) {
            delete &m_left;
        }
        if (m_delete & 2) {
            delete &m_right;
        }
    }
}

// common methods
template <class X, class Y>
inline typename sc_concref_r<X, Y>::value_type
sc_concref_r<X, Y>::get_bit(int n) const
{
    int r_len = m_right.length();
    if (n < r_len) {
        return value_type(m_right.get_bit(n));
    } else if (n < r_len + m_left.length()) {
        return value_type(m_left.get_bit(n - r_len));
    } else {
        SC_REPORT_ERROR("out of bounds", 0);
        return Log_0;
    }
}

template <class X, class Y>
inline void
sc_concref_r<X, Y>::set_bit(int n, value_type v)
{
    int r_len = m_right.length();
    if (n < r_len) {
        m_right.set_bit(n, typename Y::value_type(v));
    } else if (n < r_len + m_left.length()) {
        m_left.set_bit(n - r_len, typename X::value_type(v));
    } else {
        SC_REPORT_ERROR("out of bounds", 0);
    }
}

template <class X, class Y>
inline sc_digit
sc_concref_r<X, Y>::get_word(int i) const
{
    if (i < 0 || i >= size()) {
        SC_REPORT_ERROR("out of bounds", 0);
    }
    // 0 <= i < size()
    Y &r = m_right;
    int r_len = r.length();
    int border = r_len / SC_DIGIT_SIZE;
    if (i < border) {
        return r.get_word(i);
    }
    // border <= i < size()
    X& l = m_left;
    int shift = r_len % SC_DIGIT_SIZE;
    int j = i - border;
    if (shift == 0) {
        return l.get_word(j);
    }
    // border <= i < size() && shift != 0
    int nshift = SC_DIGIT_SIZE - shift;
    if (i == border) {
        sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift;
        return ((r.get_word(i) & rl_mask) | (l.get_word(0) << shift));
    }
    // border < i < size() && shift != 0
    if (j < l.size())
        return ((l.get_word(j - 1) >> nshift) | (l.get_word(j) << shift));
    else
        return (l.get_word(j - 1) >> nshift);
}

template <class X, class Y>
inline void
sc_concref_r<X, Y>::set_word(int i, sc_digit w)
{
    if (i < 0 || i >= size()) {
        SC_REPORT_ERROR("out of bounds", 0);
    }
    // 0 <= i < size()
    Y &r = m_right;
    int r_len = r.length();
    int border = r_len / SC_DIGIT_SIZE;
    if (i < border) {
        r.set_word(i, w);
        return;
    }
    // border <= i < size()
    X &l = m_left;
    int shift = r_len % SC_DIGIT_SIZE;
    int j = i - border;
    if (shift == 0) {
        l.set_word(j, w);
        return;
    }
    // border <= i < size() && shift != 0
    int nshift = SC_DIGIT_SIZE - shift;
    sc_digit lh_mask = ~SC_DIGIT_ZERO << nshift;
    if (i == border) {
        sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift;
        r.set_word(i, w & rl_mask);
        l.set_word(0, (l.get_word(0) & lh_mask) | (w >> shift));
        return;
    }
    // border < i < size() && shift != 0
    sc_digit ll_mask = ~SC_DIGIT_ZERO >> shift;
    l.set_word(j - 1, (l.get_word(j - 1) & ll_mask) | (w << nshift));
    if (j < l.size())
        l.set_word(j, (l.get_word(j) & lh_mask) | (w >> shift));
}

template <class X, class Y>
inline sc_digit
sc_concref_r<X, Y>::get_cword(int i) const
{
    if (i < 0 || i >= size()) {
        SC_REPORT_ERROR("out of bounds", 0);
    }
    // 0 <= i < size()
    Y &r = m_right;
    int r_len = r.length();
    int border = r_len / SC_DIGIT_SIZE;
    if (i < border) {
        return r.get_cword(i);
    }
    // border <= i < size()
    X &l = m_left;
    int shift = r_len % SC_DIGIT_SIZE;
    int j = i - border;
    if (shift == 0) {
        return l.get_cword(j);
    }
    // border <= i < size() && shift != 0
    int nshift = SC_DIGIT_SIZE - shift;
    if (i == border) {
        sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift;
        return ((r.get_cword(i) & rl_mask) | (l.get_cword(0) << shift));
    }
    // border < i < size() && shift != 0
    if (j < l.size())
        return ((l.get_cword(j - 1) >> nshift) | (l.get_cword(j) << shift));
    else
        return (l.get_cword( j - 1 ) >> nshift);
}

template <class X, class Y>
inline void
sc_concref_r<X, Y>::set_cword(int i, sc_digit w)
{
    if (i < 0 || i >= size()) {
        SC_REPORT_ERROR("out of bounds", 0);
    }
    // 0 <= i < size()
    Y &r = m_right;
    int r_len = r.length();
    int border = r_len / SC_DIGIT_SIZE;
    if (i < border) {
        r.set_cword(i, w);
        return;
    }
    // border <= i < size()
    X &l = m_left;
    int shift = r_len % SC_DIGIT_SIZE;
    int j = i - border;
    if (shift == 0) {
        l.set_cword(j, w);
        return;
    }
    // border <= i < size() && shift != 0
    int nshift = SC_DIGIT_SIZE - shift;
    sc_digit lh_mask = ~SC_DIGIT_ZERO << nshift;
    if (i == border) {
        sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift;
        r.set_cword(i, w & rl_mask);
        l.set_cword(0, (l.get_cword(0) & lh_mask) | (w >> shift));
        return;
    }
    // border < i < size() && shift != 0
    sc_digit ll_mask = ~SC_DIGIT_ZERO >> shift;
    l.set_cword(j - 1, (l.get_cword(j - 1) & ll_mask) | (w << nshift));
    if (j < l.size())
        l.set_cword(j, (l.get_cword(j) & lh_mask) | (w >> shift));
}

// r-value concatenation operators and functions
template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>,sc_bitref_r<T3> >
operator , (sc_concref_r<T1, T2> a, sc_bitref_r<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>,sc_bitref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >
operator , (sc_concref_r<T1, T2> a, sc_subref_r<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >
operator , (sc_concref_r<T1, T2> a, sc_concref_r<T3, T4> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>,sc_concref_r<T3, T4> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3>
operator , (sc_concref_r<T1, T2> a, const sc_proxy<T3> &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, T3>(
            *a.clone(), b.back_cast(), 1);
}


template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >
concat(sc_concref_r<T1, T2> a, sc_bitref_r<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >
concat(sc_concref_r<T1, T2> a, sc_subref_r<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >
concat(sc_concref_r<T1, T2> a, sc_concref_r<T3, T4> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3>
concat(sc_concref_r<T1, T2> a, const sc_proxy<T3> &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, T3>(
            *a.clone(), b.back_cast(), 1);
}


template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >
operator , (sc_concref_r<T1, T2> a, sc_bitref<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >
operator , (sc_concref<T1, T2> a, sc_bitref_r<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline
sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >
operator , (sc_concref_r<T1, T2> a, sc_subref<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >
operator , (sc_concref<T1, T2> a, sc_subref_r<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >
operator , (sc_concref_r<T1, T2> a, sc_concref<T3, T4> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >
operator , (sc_concref<T1, T2> a, sc_concref_r<T3, T4> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3>
operator , (sc_concref<T1, T2> a, const sc_proxy<T3> &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, T3>(
            *a.clone(), b.back_cast(), 1);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3>
operator , (sc_concref_r<T1, T2> a, sc_proxy<T3> &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, T3>(
            *a.clone(), b.back_cast(), 1);
}


template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >
concat(sc_concref_r<T1, T2> a, sc_bitref<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >
concat(sc_concref<T1, T2> a, sc_bitref_r<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_bitref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >
concat(sc_concref_r<T1, T2> a, sc_subref<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >
concat(sc_concref<T1, T2> a, sc_subref_r<T3> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_subref_r<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >
concat(sc_concref_r<T1, T2> a, sc_concref<T3, T4> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3, class T4>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >
concat(sc_concref<T1, T2> a, sc_concref_r<T3, T4> b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_concref_r<T3, T4> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3>
concat(sc_concref<T1, T2> a, const sc_proxy<T3> &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, T3>(
            *a.clone(), b.back_cast(), 1);
}

template <class T1, class T2, class T3>
inline sc_concref_r<sc_concref_r<T1, T2>, T3>
concat(sc_concref_r<T1, T2> a, sc_proxy<T3> &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, T3>(
            *a.clone(), b.back_cast(), 1);
}


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_concref<X,Y>
//
//  Proxy class for sc_proxy concatenation (r-value and l-value).
// ----------------------------------------------------------------------------

// other methods
template <class T1, class T2>
inline void
sc_concref<T1, T2>::scan(::std::istream &is)
{
    std::string s;
    is >> s;
    *this = s.c_str();
}

// l-value concatenation operators and functions
template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, sc_bitref<T3> >
operator , (sc_concref<T1, T2> a, sc_bitref<T3> b)
{
    return sc_concref<sc_concref<T1, T2>, sc_bitref<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, sc_subref<T3> >
operator , (sc_concref<T1, T2> a, sc_subref<T3>b)
{
    return sc_concref<sc_concref<T1, T2>, sc_subref<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3, class T4>
inline sc_concref<sc_concref<T1, T2>, sc_concref<T3, T4> >
operator , (sc_concref<T1, T2> a, sc_concref<T3, T4> b)
{
    return sc_concref<sc_concref<T1, T2>, sc_concref<T3, T4> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, T3>
operator , (sc_concref<T1, T2> a, sc_proxy<T3> &b)
{
    return sc_concref<sc_concref<T1, T2>, T3>(
            *a.clone(), b.back_cast(), 1);
}


template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, sc_bitref<T3> >
concat(sc_concref<T1, T2> a, sc_bitref<T3> b)
{
    return sc_concref<sc_concref<T1, T2>, sc_bitref<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, sc_subref<T3> >
concat(sc_concref<T1, T2> a, sc_subref<T3> b)
{
    return sc_concref<sc_concref<T1, T2>, sc_subref<T3> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3, class T4>
inline sc_concref<sc_concref<T1, T2>, sc_concref<T3, T4> >
concat(sc_concref<T1, T2> a, sc_concref<T3, T4> b)
{
    return sc_concref<sc_concref<T1, T2>, sc_concref<T3, T4> >(
            *a.clone(), *b.clone(), 3);
}

template <class T1, class T2, class T3>
inline sc_concref<sc_concref<T1, T2>, T3>
concat(sc_concref<T1, T2> a, sc_proxy<T3> &b)
{
    return sc_concref<sc_concref<T1, T2>, T3>(
            *a.clone(), b.back_cast(), 1);
}

template <class X, class Y>
inline ::std::istream &
operator >> (::std::istream &is, sc_concref<X, Y> a)
{
    a.scan(is);
    return is;
}


// ----------------------------------------------------------------------------
//  CLASS TEMPLATE : sc_proxy<T>
//
//  Base class template for bit/logic vector classes.
//  (Barton/Nackmann implementation)
// ----------------------------------------------------------------------------

// r-value concatenation operators and functions

template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> >
operator , (const sc_proxy<T1> &a, sc_bitref_r<T2> b)
{
    return sc_concref_r<T1, sc_bitref_r<T2> >(
            a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> >
operator , (const sc_proxy<T1> &a, sc_subref_r<T2> b)
{
    return sc_concref_r<T1, sc_subref_r<T2> >(
            a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> >
operator , (const sc_proxy<T1> &a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<T1, sc_concref_r<T2, T3> >(
            a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, T2>
operator , (const sc_proxy<T1> &a, const sc_proxy<T2> &b)
{
    return sc_concref_r<T1, T2>(a.back_cast(), b.back_cast());
}


template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> >
concat(const sc_proxy<T1> &a, sc_bitref_r<T2> b)
{
    return sc_concref_r<T1, sc_bitref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> >
concat(const sc_proxy<T1> &a, sc_subref_r<T2> b)
{
    return sc_concref_r<T1, sc_subref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> >
concat(const sc_proxy<T1> &a, sc_concref_r<T2, T3> b )
{
    return sc_concref_r<T1, sc_concref_r<T2, T3> >(
            a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, T2>
concat(const sc_proxy<T1> &a, const sc_proxy<T2> &b)
{
    return sc_concref_r<T1, T2>(a.back_cast(), b.back_cast());
}


template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> >
operator , (const sc_proxy<T1> &a, sc_bitref<T2> b)
{
    return sc_concref_r<T1, sc_bitref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> >
operator , (sc_proxy<T1> &a, sc_bitref_r<T2> b)
{
    return sc_concref_r<T1, sc_bitref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> >
operator , (const sc_proxy<T1> &a, sc_subref<T2> b)
{
    return sc_concref_r<T1, sc_subref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> >
operator , (sc_proxy<T1> &a, sc_subref_r<T2> b)
{
    return sc_concref_r<T1, sc_subref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> >
operator , (const sc_proxy<T1> &a, sc_concref<T2, T3> b)
{
    return sc_concref_r<T1, sc_concref_r<T2, T3> >(
            a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> >
operator , (sc_proxy<T1> &a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<T1, sc_concref_r<T2, T3> >(
            a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, T2>
operator , (const sc_proxy<T1> &a, sc_proxy<T2> &b)
{
    return sc_concref_r<T1, T2>(a.back_cast(), b.back_cast());
}

template <class T1, class T2>
inline sc_concref_r<T1, T2>
operator , (sc_proxy<T1> &a, const sc_proxy<T2> &b)
{
    return sc_concref_r<T1, T2>(a.back_cast(), b.back_cast());
}


template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> >
concat(const sc_proxy<T1> &a, sc_bitref<T2> b)
{
    return sc_concref_r<T1, sc_bitref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, sc_bitref_r<T2> >
concat(sc_proxy<T1> &a, sc_bitref_r<T2> b)
{
    return sc_concref_r<T1, sc_bitref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> >
concat(const sc_proxy<T1> &a, sc_subref<T2> b)
{
    return sc_concref_r<T1, sc_subref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, sc_subref_r<T2> >
concat(sc_proxy<T1> &a, sc_subref_r<T2> b)
{
    return sc_concref_r<T1, sc_subref_r<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> >
concat(const sc_proxy<T1> &a, sc_concref<T2, T3> b)
{
    return sc_concref_r<T1, sc_concref_r<T2, T3> >(
            a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2, class T3>
inline sc_concref_r<T1, sc_concref_r<T2, T3> >
concat(sc_proxy<T1> &a, sc_concref_r<T2, T3> b)
{
    return sc_concref_r<T1, sc_concref_r<T2, T3> >(
            a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref_r<T1, T2>
concat(const sc_proxy<T1> &a, sc_proxy<T2> &b)
{
    return sc_concref_r<T1, T2>(a.back_cast(), b.back_cast());
}

template <class T1, class T2>
inline sc_concref_r<T1, T2>
concat(sc_proxy<T1> &a, const sc_proxy<T2> &b)
{
    return sc_concref_r<T1, T2>(a.back_cast(), b.back_cast());
}


// l-value concatenation operators and functions

template <class T1, class T2>
inline sc_concref<T1, sc_bitref<T2> >
operator , (sc_proxy<T1> &a, sc_bitref<T2> b)
{
    return sc_concref<T1, sc_bitref<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref<T1, sc_subref<T2> >
operator , (sc_proxy<T1> &a, sc_subref<T2> b)
{
    return sc_concref<T1, sc_subref<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2, class T3>
inline sc_concref<T1, sc_concref<T2, T3> >
operator , (sc_proxy<T1> &a, sc_concref<T2, T3> b)
{
    return sc_concref<T1, sc_concref<T2, T3> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref<T1, T2>
operator , (sc_proxy<T1> &a, sc_proxy<T2> &b)
{
    return sc_concref<T1, T2>(a.back_cast(), b.back_cast());
}


template <class T1, class T2>
inline sc_concref<T1, sc_bitref<T2> >
concat(sc_proxy<T1> &a, sc_bitref<T2> b)
{
    return sc_concref<T1, sc_bitref<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref<T1, sc_subref<T2> >
concat(sc_proxy<T1> &a, sc_subref<T2> b)
{
    return sc_concref<T1, sc_subref<T2> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2, class T3>
inline sc_concref<T1, sc_concref<T2, T3> >
concat(sc_proxy<T1> &a, sc_concref<T2, T3> b)
{
    return sc_concref<T1, sc_concref<T2, T3> >(a.back_cast(), *b.clone(), 2);
}

template <class T1, class T2>
inline sc_concref<T1, T2>
concat(sc_proxy<T1> &a, sc_proxy<T2> &b)
{
    return sc_concref<T1, T2>(a.back_cast(), b.back_cast());
}

} // namespace sc_dt

// $Log: sc_bit_proxies.h,v $
// Revision 1.10  2011/09/05 21:19:53  acg
//  Philipp A. Hartmann: added parentheses to expressions to eliminate
//  compiler warnings.
//
// Revision 1.9  2011/09/01 15:03:42  acg
//  Philipp A. Hartmann: add parentheses to eliminate compiler warnings.
//
// Revision 1.8  2011/08/29 18:04:32  acg
//  Philipp A. Hartmann: miscellaneous clean ups.
//
// Revision 1.7  2011/08/24 22:05:40  acg
//  Torsten Maehne: initialization changes to remove warnings.
//
// Revision 1.6  2010/02/22 14:25:43  acg
//  Andy Goodrich: removed 'mutable' directive from references, since it
//  is not a legal C++ construct.
//
// Revision 1.5  2009/02/28 00:26:14  acg
//  Andy Goodrich: bug fixes.
//
// Revision 1.4  2007/03/14 17:48:37  acg
//  Andy Goodrich: fixed bug.
//
// Revision 1.3  2007/01/18 19:29:18  acg
//  Andy Goodrich: fixed bug in concatenations of bit selects on sc_lv and
//  sc_bv types. The offending code was in sc_bitref<X>::set_word and
//  sc_bitref<X>::get_word. These methods were not writing the bit they
//  represented, but rather writing an entire word whose index was the
//  index of the bit they represented. This not only did not write the
//  correct bit, but clobbered a word that might not even be in the
//  variable the reference was for.
//
// Revision 1.2  2007/01/17 22:45:08  acg
//  Andy Goodrich: fixed sc_bitref<X>::set_bit().
//
// Revision 1.1.1.1  2006/12/15 20:31:36  acg
// SystemC 2.2
//
// Revision 1.3  2006/01/13 18:53:53  acg
// Andy Goodrich: added $Log command so that CVS comments are reproduced in
// the source.
//

#endif // __SYSTEMC_EXT_DT_BIT_SC_BIT_PROXIES_HH__
