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

  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 "../../utils/messages.hh"
#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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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(sc_core::SC_ID_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__
