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

  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_lv_base.h -- Arbitrary size logic vector class.

  Original Author: Gene Bushuyev, Synopsys, Inc.

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

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

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

      Name, Affiliation, Date:
  Description of Modification:
        Andy Goodrich, Forte Design Systems
          Fixed bug in clean_tail for sizes that are modulo 32, which caused
          zeroing of values.

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

// $Log: sc_lv_base.h,v $
// Revision 1.4  2011/08/26 22:32:00  acg
//  Torsten Maehne: added parentheses to make opearator ordering more obvious.
//
// Revision 1.3  2010/01/27 19:41:29  acg
//  Andy Goodrich: fix 8 instances of sc_concref constructor invocations
//  that failed to indicate that their arguments should be freed when the
//  object was freed.
//
// Revision 1.2  2009/02/28 00:26:14  acg
//  Andy Goodrich: bug fixes.
//
// Revision 1.2  2007/03/14 17:47:49  acg
//  Andy Goodrich: Formatting.
//
// 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.
//

#ifndef __SYSTEMC_EXT_DT_BIT_SC_LV_BASE_HH__
#define __SYSTEMC_EXT_DT_BIT_SC_LV_BASE_HH__

#include "../int/sc_length_param.hh"
#include "sc_bv_base.hh"
#include "sc_logic.hh"

namespace sc_dt
{

// classes defined in this module
class sc_lv_base;


// ----------------------------------------------------------------------------
//  CLASS : sc_lv_base
//
//  Arbitrary size logic vector base class.
// ----------------------------------------------------------------------------

class sc_lv_base : public sc_proxy<sc_lv_base>
{
    friend class sc_bv_base;

    void init(int length_, const sc_logic &init_value=SC_LOGIC_X);
    void assign_from_string(const std::string &);

  public:
    // typedefs
    typedef sc_proxy<sc_lv_base> base_type;
    typedef base_type::value_type value_type;

    // constructors
    explicit sc_lv_base(int length_=sc_length_param().len()) :
        m_len(0), m_size(0), m_data(0), m_ctrl(0)
    {
        init(length_);
    }

    explicit sc_lv_base(
            const sc_logic &a, int length_=sc_length_param().len()) :
        m_len(0), m_size(0), m_data(0), m_ctrl(0)
    {
        init(length_, a);
    }

    sc_lv_base(const char *a);
    sc_lv_base(const char *a, int length_);

    template <class X>
    sc_lv_base(const sc_proxy<X> &a) :
        m_len(0), m_size(0), m_data(0), m_ctrl(0)
    {
        init(a.back_cast().length());
        base_type::assign_(a);
    }

    sc_lv_base(const sc_lv_base &a);

    // destructor
    virtual ~sc_lv_base() { delete [] m_data; }

    // assignment operators
    template <class X>
    sc_lv_base &
    operator = (const sc_proxy<X> &a)
    {
        assign_p_(*this, a);
        return *this;
    }

    sc_lv_base &
    operator = (const sc_lv_base &a)
    {
        assign_p_(*this, a);
        return *this;
    }

    sc_lv_base &operator = (const char *a);

    sc_lv_base &
    operator = (const bool *a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (const sc_logic *a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (const sc_unsigned &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (const sc_signed &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (const sc_uint_base &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (const sc_int_base &a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (unsigned long a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (long a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (unsigned int a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (int a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (uint64 a)
    {
        base_type::assign_(a);
        return *this;
    }

    sc_lv_base &
    operator = (int64 a)
    {
        base_type::assign_(a);
        return *this;
    }

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

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

    sc_digit get_word(int wi) const { return m_data[wi]; }

    // note the test for out of range access here. this is necessary
    // because of the hair-brained way concatenations are set up.
    // an extend_sign on a concatenation uses the whole length of
    // the concatenation to determine how many words to set.
    void
    set_word(int wi, sc_digit w)
    {
        sc_assert(wi < m_size);
        m_data[wi] = w;
    }

    sc_digit get_cword(int wi) const { return m_ctrl[wi]; }

    void
    set_cword(int wi, sc_digit w)
    {
        sc_assert(wi < m_size);
        m_ctrl[wi] = w;
    }
    void clean_tail();

    // other methods
    bool is_01() const;

  protected:
    int m_len; // length in bits
    int m_size; // size of the data array
    sc_digit *m_data; // data array
    sc_digit *m_ctrl; // dito (control part)
};

// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

inline sc_lv_base::value_type
sc_lv_base::get_bit(int i) const
{
    int wi = i / SC_DIGIT_SIZE;
    int bi = i % SC_DIGIT_SIZE;
    return value_type(((m_data[wi] >> bi) & SC_DIGIT_ONE) |
                      (((m_ctrl[wi] >> bi) << 1) & SC_DIGIT_TWO));
}

inline void
sc_lv_base::set_bit(int i, value_type value)
{
    int wi = i / SC_DIGIT_SIZE; // word index
    int bi = i % SC_DIGIT_SIZE; // bit index
    sc_digit mask = SC_DIGIT_ONE << bi;
    m_data[wi] |= mask; // set bit to 1
    m_ctrl[wi] |= mask; // set bit to 1
    m_data[wi] &= value << bi | ~mask;
    m_ctrl[wi] &= value >> 1 << bi | ~mask;
}

inline void
sc_lv_base::clean_tail()
{
    int wi = m_size - 1;
    int bi = m_len % SC_DIGIT_SIZE;
    sc_digit mask = ~SC_DIGIT_ZERO >> (SC_DIGIT_SIZE - bi);
    if (mask) {
        m_data[wi] &= mask;
        m_ctrl[wi] &= mask;
    }
}


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

// bitwise operators and functions

// bitwise complement
template <class X>
inline const sc_lv_base
sc_proxy<X>::operator ~ () const
{
    sc_lv_base a(back_cast());
    return a.b_not();
}

// bitwise and
template <class X, class Y>
inline X &
operator &= (sc_proxy<X> &px, const sc_proxy<Y> &py)
{
    X &x = px.back_cast();
    sc_lv_base a(x.length());
    a = py.back_cast();
    return b_and_assign_(x, a);
}

#define DEFN_BITWISE_AND_ASN_OP_T(tp) \
template <class X> \
inline X & \
sc_proxy<X>::operator &= (tp b) \
{ \
    X &x = back_cast(); \
    sc_lv_base a(x.length()); \
    a = b; \
    return b_and_assign_(x, a); \
}

DEFN_BITWISE_AND_ASN_OP_T(const char *)
DEFN_BITWISE_AND_ASN_OP_T(const bool *)
DEFN_BITWISE_AND_ASN_OP_T(const sc_logic *)
DEFN_BITWISE_AND_ASN_OP_T(const sc_unsigned &)
DEFN_BITWISE_AND_ASN_OP_T(const sc_signed &)
DEFN_BITWISE_AND_ASN_OP_T(unsigned long)
DEFN_BITWISE_AND_ASN_OP_T(long)
DEFN_BITWISE_AND_ASN_OP_T(uint64)
DEFN_BITWISE_AND_ASN_OP_T(int64)

#undef DEFN_BITWISE_AND_ASN_OP_T

template <class X, class Y>
inline const sc_lv_base
operator & (const sc_proxy<X> &px, const sc_proxy<Y> &py)
{
    sc_lv_base a(px.back_cast());
    return (a &= py.back_cast());
}

#define DEFN_BITWISE_AND_OP_T_A(tp) \
template <class X> \
inline const sc_lv_base \
sc_proxy<X>::operator & (tp b) const \
{ \
    sc_lv_base a(back_cast()); \
    return (a &= b); \
}

DEFN_BITWISE_AND_OP_T_A(const char *)
DEFN_BITWISE_AND_OP_T_A(const bool *)
DEFN_BITWISE_AND_OP_T_A(const sc_logic *)
DEFN_BITWISE_AND_OP_T_A(const sc_unsigned &)
DEFN_BITWISE_AND_OP_T_A(const sc_signed &)
DEFN_BITWISE_AND_OP_T_A(const sc_uint_base &)
DEFN_BITWISE_AND_OP_T_A(const sc_int_base &)
DEFN_BITWISE_AND_OP_T_A(unsigned long)
DEFN_BITWISE_AND_OP_T_A(long)
DEFN_BITWISE_AND_OP_T_A(unsigned int)
DEFN_BITWISE_AND_OP_T_A(int)
DEFN_BITWISE_AND_OP_T_A(uint64)
DEFN_BITWISE_AND_OP_T_A(int64)

#undef DEFN_BITWISE_AND_OP_T_A

#define DEFN_BITWISE_AND_OP_T_B(tp) \
template <class X> \
inline const sc_lv_base \
operator & (tp b, const sc_proxy<X> &px) \
{ \
    return (px & b); \
}

DEFN_BITWISE_AND_OP_T_B(const char *)
DEFN_BITWISE_AND_OP_T_B(const bool *)
DEFN_BITWISE_AND_OP_T_B(const sc_logic *)
DEFN_BITWISE_AND_OP_T_B(const sc_unsigned &)
DEFN_BITWISE_AND_OP_T_B(const sc_signed &)
DEFN_BITWISE_AND_OP_T_B(const sc_uint_base &)
DEFN_BITWISE_AND_OP_T_B(const sc_int_base &)
DEFN_BITWISE_AND_OP_T_B(unsigned long)
DEFN_BITWISE_AND_OP_T_B(long)
DEFN_BITWISE_AND_OP_T_B(unsigned int)
DEFN_BITWISE_AND_OP_T_B(int)
DEFN_BITWISE_AND_OP_T_B(uint64)
DEFN_BITWISE_AND_OP_T_B(int64)

#undef DEFN_BITWISE_AND_OP_T_B

// bitwise or
template <class X, class Y>
inline X &
operator |= (sc_proxy<X> &px, const sc_proxy<Y> &py)
{
    X &x = px.back_cast();
    sc_lv_base a(x.length());
    a = py.back_cast();
    return b_or_assign_(x, a);
}

#define DEFN_BITWISE_OR_ASN_OP_T(tp) \
template <class X> \
inline X & \
sc_proxy<X>::operator |= (tp b) \
{ \
    X &x = back_cast(); \
    sc_lv_base a(x.length()); \
    a = b; \
    return b_or_assign_(x, a); \
}

DEFN_BITWISE_OR_ASN_OP_T(const char *)
DEFN_BITWISE_OR_ASN_OP_T(const bool *)
DEFN_BITWISE_OR_ASN_OP_T(const sc_logic *)
DEFN_BITWISE_OR_ASN_OP_T(const sc_unsigned &)
DEFN_BITWISE_OR_ASN_OP_T(const sc_signed &)
DEFN_BITWISE_OR_ASN_OP_T(unsigned long)
DEFN_BITWISE_OR_ASN_OP_T(long)
DEFN_BITWISE_OR_ASN_OP_T(uint64)
DEFN_BITWISE_OR_ASN_OP_T(int64)

#undef DEFN_BITWISE_OR_ASN_OP_T

template <class X, class Y>
inline const sc_lv_base
operator | (const sc_proxy<X> &px, const sc_proxy<Y> &py)
{
    sc_lv_base a(px.back_cast());
    return (a |= py.back_cast());
}

#define DEFN_BITWISE_OR_OP_T_A(tp) \
template <class X> \
inline const sc_lv_base \
sc_proxy<X>::operator | (tp b) const \
{ \
    sc_lv_base a(back_cast()); \
    return (a |= b); \
}

DEFN_BITWISE_OR_OP_T_A(const char *)
DEFN_BITWISE_OR_OP_T_A(const bool *)
DEFN_BITWISE_OR_OP_T_A(const sc_logic *)
DEFN_BITWISE_OR_OP_T_A(const sc_unsigned &)
DEFN_BITWISE_OR_OP_T_A(const sc_signed &)
DEFN_BITWISE_OR_OP_T_A(const sc_uint_base &)
DEFN_BITWISE_OR_OP_T_A(const sc_int_base &)
DEFN_BITWISE_OR_OP_T_A(unsigned long)
DEFN_BITWISE_OR_OP_T_A(long)
DEFN_BITWISE_OR_OP_T_A(unsigned int)
DEFN_BITWISE_OR_OP_T_A(int)
DEFN_BITWISE_OR_OP_T_A(uint64)
DEFN_BITWISE_OR_OP_T_A(int64)

#undef DEFN_BITWISE_OR_OP_T_A

#define DEFN_BITWISE_OR_OP_T_B(tp) \
template <class X> \
inline const sc_lv_base \
operator | (tp b, const sc_proxy<X> &px) \
{ \
    return (px | b); \
}

DEFN_BITWISE_OR_OP_T_B(const char *)
DEFN_BITWISE_OR_OP_T_B(const bool *)
DEFN_BITWISE_OR_OP_T_B(const sc_logic *)
DEFN_BITWISE_OR_OP_T_B(const sc_unsigned &)
DEFN_BITWISE_OR_OP_T_B(const sc_signed &)
DEFN_BITWISE_OR_OP_T_B(const sc_uint_base &)
DEFN_BITWISE_OR_OP_T_B(const sc_int_base &)
DEFN_BITWISE_OR_OP_T_B(unsigned long)
DEFN_BITWISE_OR_OP_T_B(long)
DEFN_BITWISE_OR_OP_T_B(unsigned int)
DEFN_BITWISE_OR_OP_T_B(int)
DEFN_BITWISE_OR_OP_T_B(uint64)
DEFN_BITWISE_OR_OP_T_B(int64)

#undef DEFN_BITWISE_OR_OP_T_B

// bitwise xor
template <class X, class Y>
inline X &
operator ^= (sc_proxy<X> &px, const sc_proxy<Y> &py)
{
    X &x = px.back_cast();
    sc_lv_base a(x.length());
    a = py.back_cast();
    return b_xor_assign_(x, a);
}

#define DEFN_BITWISE_XOR_ASN_OP_T(tp) \
template <class X> \
inline X & \
sc_proxy<X>::operator ^= (tp b) \
{ \
    X &x = back_cast(); \
    sc_lv_base a(x.length()); \
    a = b; \
    return b_xor_assign_(x, a); \
}

DEFN_BITWISE_XOR_ASN_OP_T(const char *)
DEFN_BITWISE_XOR_ASN_OP_T(const bool *)
DEFN_BITWISE_XOR_ASN_OP_T(const sc_logic *)
DEFN_BITWISE_XOR_ASN_OP_T(const sc_unsigned &)
DEFN_BITWISE_XOR_ASN_OP_T(const sc_signed &)
DEFN_BITWISE_XOR_ASN_OP_T(unsigned long)
DEFN_BITWISE_XOR_ASN_OP_T(long)
DEFN_BITWISE_XOR_ASN_OP_T(uint64)
DEFN_BITWISE_XOR_ASN_OP_T(int64)

#undef DEFN_BITWISE_XOR_ASN_OP_T

template <class X, class Y>
inline const sc_lv_base
operator ^ (const sc_proxy<X> &px, const sc_proxy<Y> &py)
{
    sc_lv_base a(px.back_cast());
    return (a ^= py.back_cast());
}

#define DEFN_BITWISE_XOR_OP_T_A(tp) \
template <class X> \
inline const sc_lv_base \
sc_proxy<X>::operator ^ (tp b) const \
{ \
    sc_lv_base a(back_cast()); \
    return (a ^= b); \
}

DEFN_BITWISE_XOR_OP_T_A(const char *)
DEFN_BITWISE_XOR_OP_T_A(const bool *)
DEFN_BITWISE_XOR_OP_T_A(const sc_logic *)
DEFN_BITWISE_XOR_OP_T_A(const sc_unsigned &)
DEFN_BITWISE_XOR_OP_T_A(const sc_signed &)
DEFN_BITWISE_XOR_OP_T_A(const sc_uint_base &)
DEFN_BITWISE_XOR_OP_T_A(const sc_int_base &)
DEFN_BITWISE_XOR_OP_T_A(unsigned long)
DEFN_BITWISE_XOR_OP_T_A(long)
DEFN_BITWISE_XOR_OP_T_A(unsigned int)
DEFN_BITWISE_XOR_OP_T_A(int)
DEFN_BITWISE_XOR_OP_T_A(uint64)
DEFN_BITWISE_XOR_OP_T_A(int64)

#undef DEFN_BITWISE_XOR_OP_T_A

#define DEFN_BITWISE_XOR_OP_T_B(tp) \
template <class X> \
inline const sc_lv_base \
operator ^ (tp b, const sc_proxy<X> &px) \
{ \
    return (px ^ b); \
}

DEFN_BITWISE_XOR_OP_T_B(const char *)
DEFN_BITWISE_XOR_OP_T_B(const bool *)
DEFN_BITWISE_XOR_OP_T_B(const sc_logic *)
DEFN_BITWISE_XOR_OP_T_B(const sc_unsigned &)
DEFN_BITWISE_XOR_OP_T_B(const sc_signed &)
DEFN_BITWISE_XOR_OP_T_B(const sc_uint_base &)
DEFN_BITWISE_XOR_OP_T_B(const sc_int_base &)
DEFN_BITWISE_XOR_OP_T_B(unsigned long)
DEFN_BITWISE_XOR_OP_T_B(long)
DEFN_BITWISE_XOR_OP_T_B(unsigned int)
DEFN_BITWISE_XOR_OP_T_B(int)
DEFN_BITWISE_XOR_OP_T_B(uint64)
DEFN_BITWISE_XOR_OP_T_B(int64)

#undef DEFN_BITWISE_XOR_OP_T_B

// bitwise left shift
template <class X>
inline const sc_lv_base
sc_proxy<X>::operator << (int n) const
{
    sc_lv_base a(back_cast().length() + n);
    a = back_cast();
    return (a <<= n);
}

// bitwise right shift
template <class X>
inline const sc_lv_base
sc_proxy<X>::operator >> (int n) const
{
    sc_lv_base a(back_cast());
    return (a >>= n);
}

// bitwise left rotate
template <class X>
inline X &
sc_proxy<X>::lrotate(int n)
{
    X &x = back_cast();
    if (n < 0) {
        sc_proxy_out_of_bounds("left rotate operation is only allowed with "
                               "positive rotate values, rotate value = ", n);
        return x;
    }
    int len = x.length();
    n %= len;
    // x = (x << n) | (x >> (len - n));
    sc_lv_base a(x << n);
    sc_lv_base b(x >> (len - n));
    int sz = x.size();
    for (int i = 0; i < sz; ++i) {
        x.set_word(i, a.get_word(i) | b.get_word(i));
        x.set_cword(i, a.get_cword(i) | b.get_cword(i));
    }
    x.clean_tail();
    return x;
}

template <class X>
inline const sc_lv_base
lrotate(const sc_proxy<X> &x, int n)
{
    sc_lv_base a(x.back_cast());
    return a.lrotate(n);
}

// bitwise right rotate
template <class X>
inline X &
sc_proxy<X>::rrotate(int n)
{
    X &x = back_cast();
    if (n < 0 ) {
        sc_proxy_out_of_bounds("right rotate operation is only allowed with "
                               "positive rotate values, rotate value = ", n);
        return x;
    }
    int len = x.length();
    n %= len;
    // x = (x >> n) | (x << (len - n));
    sc_lv_base a(x >> n);
    sc_lv_base b(x << (len - n));
    int sz = x.size();
    for (int i = 0; i < sz; ++i) {
        x.set_word(i, a.get_word(i) | b.get_word(i));
        x.set_cword(i, a.get_cword(i) | b.get_cword(i));
    }
    x.clean_tail();
    return x;
}

template <class X>
inline const sc_lv_base
rrotate(const sc_proxy<X> &x, int n)
{
    sc_lv_base a(x.back_cast());
    return a.rrotate(n);
}

// bitwise reverse
template <class X>
inline const sc_lv_base
reverse(const sc_proxy<X> &x)
{
    sc_lv_base a(x.back_cast());
    return a.reverse();
}

// relational operators
template <class X, class Y>
inline bool
operator == (const sc_proxy<X> &px, const sc_proxy<Y> &py)
{
    const X &x = px.back_cast();
    const Y &y = py.back_cast();
    int x_len = x.length();
    int y_len = y.length();
    if (x_len != y_len) {
        return false;
    }
    int sz = x.size();
    for (int i = 0; i < sz; ++i) {
        if (x.get_word(i) != y.get_word(i) ||
            x.get_cword(i) != y.get_cword(i)) {
            return false;
        }
    }
    return true;
}

#define DEFN_REL_OP_T(tp) \
template <class X> \
inline bool \
sc_proxy<X>::operator == (tp b) const \
{ \
    const X &x = back_cast(); \
    sc_lv_base y(x.length()); \
    y = b; \
    return (x == y); \
}

DEFN_REL_OP_T(const char *)
DEFN_REL_OP_T(const bool *)
DEFN_REL_OP_T(const sc_logic *)
DEFN_REL_OP_T(const sc_unsigned &)
DEFN_REL_OP_T(const sc_signed &)
DEFN_REL_OP_T(const sc_uint_base &)
DEFN_REL_OP_T(const sc_int_base &)
DEFN_REL_OP_T(unsigned long)
DEFN_REL_OP_T(long)
DEFN_REL_OP_T(unsigned int)
DEFN_REL_OP_T(int)
DEFN_REL_OP_T(uint64)
DEFN_REL_OP_T(int64)

#undef DEFN_REL_OP_T


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

// r-value concatenation operators and functions

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
operator , (sc_bitref_r<T> a, const char *b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
operator , (const char *a, sc_bitref_r<T> b)
{
    return sc_concref_r<sc_lv_base, sc_bitref_r<T> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
operator , (sc_bitref_r<T> a, const sc_logic &b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
operator , (const sc_logic &a, sc_bitref_r<T> b)
{
    return sc_concref_r<sc_lv_base,sc_bitref_r<T> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_bv_base>
operator , (sc_bitref_r<T> a, bool b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_bv_base, sc_bitref_r<T> >
operator , (bool a, sc_bitref_r<T> b)
{
    return sc_concref_r<sc_bv_base, sc_bitref_r<T> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
concat(sc_bitref_r<T> a, const char *b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
concat(const char *a, sc_bitref_r<T> b)
{
    return sc_concref_r<sc_lv_base, sc_bitref_r<T> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
concat(sc_bitref_r<T> a, const sc_logic &b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
concat(const sc_logic &a, sc_bitref_r<T> b)
{
    return sc_concref_r<sc_lv_base, sc_bitref_r<T> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_bv_base>
concat(sc_bitref_r<T> a, bool b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_bv_base, sc_bitref_r<T> >
concat(bool a, sc_bitref_r<T> b)
{
    return sc_concref_r<sc_bv_base, sc_bitref_r<T> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}


template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
operator , (sc_bitref<T> a, const char *b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
operator , (const char *a, sc_bitref<T> b)
{
    return sc_concref_r<sc_lv_base, sc_bitref_r<T> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
operator , (sc_bitref<T> a, const sc_logic &b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
operator , (const sc_logic &a, sc_bitref<T> b)
{
    return sc_concref_r<sc_lv_base, sc_bitref_r<T> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_bv_base>
operator , (sc_bitref<T> a, bool b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_bv_base, sc_bitref_r<T> >
operator , (bool a, sc_bitref<T> b)
{
    return sc_concref_r<sc_bv_base, sc_bitref_r<T> > (
            *new sc_bv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
concat(sc_bitref<T> a, const char *b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
concat(const char *a, sc_bitref<T> b)
{
    return sc_concref_r<sc_lv_base, sc_bitref_r<T> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
concat(sc_bitref<T> a, const sc_logic &b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
concat(const sc_logic &a, sc_bitref<T> b)
{
    return sc_concref_r<sc_lv_base, sc_bitref_r<T> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_bitref_r<T>, sc_bv_base>
concat(sc_bitref<T> a, bool b)
{
    return sc_concref_r<sc_bitref_r<T>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_bv_base, sc_bitref_r<T> >
concat(bool a, sc_bitref<T> b)
{
    return sc_concref_r<sc_bv_base, sc_bitref_r<T> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}


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

// r-value concatenation operators and functions
template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
operator , (sc_subref_r<T> a, const char *b)
{
    return sc_concref_r<sc_subref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
operator , (const char *a, sc_subref_r<T> b)
{
    return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
operator , (sc_subref_r<T> a, const sc_logic &b)
{
    return sc_concref_r<sc_subref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
operator , (const sc_logic &a, sc_subref_r<T> b)
{
    return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_bv_base>
operator , (sc_subref_r<T> a, bool b)
{
    return sc_concref_r<sc_subref_r<T>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_bv_base, sc_subref_r<T> >
operator , (bool a, sc_subref_r<T> b)
{
    return sc_concref_r<sc_bv_base, sc_subref_r<T> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
concat(sc_subref_r<T> a, const char *b)
{
    return sc_concref_r<sc_subref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
concat(const char *a, sc_subref_r<T> b)
{
    return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
concat(sc_subref_r<T> a, const sc_logic &b)
{
    return sc_concref_r<sc_subref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
concat(const sc_logic &a, sc_subref_r<T> b)
{
    return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_bv_base>
concat(sc_subref_r<T> a, bool b)
{
    return sc_concref_r<sc_subref_r<T>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_bv_base, sc_subref_r<T> >
concat(bool a, sc_subref_r<T> b)
{
    return sc_concref_r<sc_bv_base, sc_subref_r<T> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}


template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
operator , (sc_subref<T> a, const char *b)
{
    return sc_concref_r<sc_subref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
operator , (const char *a, sc_subref<T> b)
{
    return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
operator , (sc_subref<T> a, const sc_logic &b)
{
    return sc_concref_r<sc_subref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
operator , (const sc_logic &a, sc_subref<T> b)
{
    return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_bv_base>
operator , (sc_subref<T> a, bool b)
{
    return sc_concref_r<sc_subref_r<T>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_bv_base, sc_subref_r<T> >
operator , (bool a, sc_subref<T> b)
{
    return sc_concref_r<sc_bv_base, sc_subref_r<T> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}


template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
concat(sc_subref<T> a, const char *b)
{
    return sc_concref_r<sc_subref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
concat(const char *a, sc_subref<T> b)
{
    return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
concat(sc_subref<T> a, const sc_logic &b)
{
    return sc_concref_r<sc_subref_r<T>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
concat(const sc_logic &a, sc_subref<T> b)
{
    return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T>
inline sc_concref_r<sc_subref_r<T>, sc_bv_base>
concat(sc_subref<T> a, bool b)
{
    return sc_concref_r<sc_subref_r<T>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T>
inline sc_concref_r<sc_bv_base, sc_subref_r<T> >
concat(bool a, sc_subref<T> b)
{
    return sc_concref_r<sc_bv_base, sc_subref_r<T> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}


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

template <class X>
inline sc_subref<X> &
sc_subref<X>::operator = (const sc_subref_r<X> &b)
{
    sc_lv_base t(b); // (partial) self assignment protection
    int len = sc_min(this->length(), t.length());
    if (!this->reversed()) {
        for (int i = len - 1; i >= 0; --i) {
            this->m_obj.set_bit(this->m_lo + i, t[i].value());
        }
    } else {
        for (int i = len - 1; i >= 0; --i) {
            this->m_obj.set_bit(this->m_lo - i, t[i].value());
        }
    }
    return *this;
}

template <class X>
inline sc_subref<X> &
sc_subref<X>::operator = (const sc_subref<X> &b)
{
    sc_lv_base t(b); // (partial) self assignment protection
    int len = sc_min(this->length(), t.length());
    if (!this->reversed()) {
        for (int i = len - 1; i >= 0; --i) {
            this->m_obj.set_bit(this->m_lo + i, t[i].value());
        }
    } else {
        for (int i = len - 1; i >= 0; --i) {
            this->m_obj.set_bit(this->m_lo - i, t[i].value());
        }
    }
    return *this;
}


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

// r-value concatenation operators and functions

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

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

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
operator , (sc_concref_r<T1, T2> a, const sc_logic &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
operator , (const sc_logic &a, sc_concref_r<T1, T2> b)
{
    return sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

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

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

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

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

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
concat(sc_concref_r<T1, T2> a, const sc_logic &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
concat(const sc_logic &a, sc_concref_r<T1, T2> b)
{
    return sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

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

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


template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
operator , (sc_concref<T1, T2> a, const char *b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
operator , (const char *a, sc_concref<T1, T2> b)
{
    return sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
operator , (sc_concref<T1, T2> a, const sc_logic &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
operator , (const sc_logic &a, sc_concref<T1, T2> b)
{
    return sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base>
operator , (sc_concref<T1, T2> a, bool b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> >
operator , (bool a, sc_concref<T1, T2> b)
{
    return sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
concat(sc_concref<T1, T2> a, const char *b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
concat(const char *a, sc_concref<T1, T2> b)
{
    return sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >(
            *new sc_lv_base(a), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
concat(sc_concref<T1, T2> a, const sc_logic &b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>(
            *a.clone(), *new sc_lv_base(b, 1), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
concat(const sc_logic &a, sc_concref<T1, T2> b)
{
    return sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >(
            *new sc_lv_base(a, 1), *b.clone(), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base>
concat(sc_concref<T1, T2> a, bool b)
{
    return sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base>(
            *a.clone(), *new sc_bv_base(b, 1), 3);
}

template <class T1, class T2>
inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> >
concat(bool a, sc_concref<T1, T2> b)
{
    return sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> >(
            *new sc_bv_base(a, 1), *b.clone(), 3);
}


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

// r-value concatenation operators and functions

template <class T>
inline sc_concref_r<T, sc_lv_base>
operator , (const sc_proxy<T> &a, const char *b)
{
    return sc_concref_r<T, sc_lv_base>(a.back_cast(), *new sc_lv_base(b), 2);
}

template <class T>
inline sc_concref_r<sc_lv_base, T>
operator , (const char *a, const sc_proxy<T> &b)
{
    return sc_concref_r<sc_lv_base, T>(*new sc_lv_base(a), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_lv_base>
operator , (const sc_proxy<T> &a, const sc_logic &b)
{
    return sc_concref_r<T, sc_lv_base>(
            a.back_cast(), *new sc_lv_base(b, 1), 2);
}

template <class T>
inline sc_concref_r<sc_lv_base, T>
operator , (const sc_logic &a, const sc_proxy<T> &b)
{
    return sc_concref_r<sc_lv_base, T>(
            *new sc_lv_base(a, 1), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_bv_base>
operator , (const sc_proxy<T> &a, bool b)
{
    return sc_concref_r<T, sc_bv_base>(
            a.back_cast(), *new sc_bv_base(b, 1), 2);
}

template <class T>
inline sc_concref_r<sc_bv_base, T>
operator , (bool a, const sc_proxy<T> &b)
{
    return sc_concref_r<sc_bv_base, T>(
            *new sc_bv_base(a, 1), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_lv_base>
concat(const sc_proxy<T> &a, const char *b)
{
    return sc_concref_r<T, sc_lv_base>(a.back_cast(), *new sc_lv_base(b), 2);
}

template <class T>
inline sc_concref_r<sc_lv_base, T>
concat(const char *a, const sc_proxy<T> &b)
{
    return sc_concref_r<sc_lv_base, T>(*new sc_lv_base(a), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_lv_base>
concat(const sc_proxy<T> &a, const sc_logic &b)
{
    return sc_concref_r<T, sc_lv_base>(
            a.back_cast(), *new sc_lv_base(b, 1), 2);
}

template <class T>
inline sc_concref_r<sc_lv_base, T>
concat(const sc_logic &a, const sc_proxy<T> &b)
{
    return sc_concref_r<sc_lv_base, T>(
            *new sc_lv_base(a, 1), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_bv_base>
concat(const sc_proxy<T> &a, bool b)
{
    return sc_concref_r<T, sc_bv_base>(
            a.back_cast(), *new sc_bv_base(b, 1), 2);
}

template <class T>
inline sc_concref_r<sc_bv_base, T>
concat(bool a, const sc_proxy<T> &b)
{
    return sc_concref_r<sc_bv_base, T>(
            *new sc_bv_base(a, 1), b.back_cast(), 1);
}


template <class T>
inline sc_concref_r<T, sc_lv_base>
operator , (sc_proxy<T> &a, const char *b)
{
    return sc_concref_r<T, sc_lv_base>(a.back_cast(), *new sc_lv_base(b), 2);
}

template <class T>
inline sc_concref_r<sc_lv_base, T>
operator , (const char *a, sc_proxy<T> &b)
{
    return sc_concref_r<sc_lv_base, T>(*new sc_lv_base(a), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_lv_base>
operator , (sc_proxy<T> &a, const sc_logic &b)
{
    return sc_concref_r<T, sc_lv_base>(
            a.back_cast(), *new sc_lv_base(b, 1), 2);
}

template <class T>
inline sc_concref_r<sc_lv_base, T>
operator , (const sc_logic &a, sc_proxy<T> &b)
{
    return sc_concref_r<sc_lv_base, T>(
            *new sc_lv_base(a, 1), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_bv_base>
operator , (sc_proxy<T> &a, bool b)
{
    return sc_concref_r<T, sc_bv_base>(
            a.back_cast(), *new sc_bv_base(b, 1), 2);
}

template <class T>
inline sc_concref_r<sc_bv_base, T>
operator , (bool a, sc_proxy<T> &b)
{
    return sc_concref_r<sc_bv_base, T>(
            *new sc_bv_base(a, 1), b.back_cast(), 1);
}


template <class T>
inline sc_concref_r<T, sc_lv_base>
concat(sc_proxy<T> &a, const char *b)
{
    return sc_concref_r<T, sc_lv_base>(a.back_cast(), *new sc_lv_base(b), 2);
}

template <class T>
inline sc_concref_r<sc_lv_base, T>
concat(const char *a, sc_proxy<T> &b)
{
    return sc_concref_r<sc_lv_base, T>(*new sc_lv_base(a), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_lv_base>
concat(sc_proxy<T> &a, const sc_logic &b)
{
    return sc_concref_r<T, sc_lv_base>(
            a.back_cast(), *new sc_lv_base(b, 1), 2);
}

template <class T>
inline sc_concref_r<sc_lv_base, T>
concat(const sc_logic &a, sc_proxy<T> &b)
{
    return sc_concref_r<sc_lv_base, T>(
            *new sc_lv_base(a, 1), b.back_cast(), 1);
}

template <class T>
inline sc_concref_r<T, sc_bv_base>
concat(sc_proxy<T> &a, bool b)
{
    return sc_concref_r<T, sc_bv_base>(
            a.back_cast(), *new sc_bv_base(b, 1), 2);
}

template <class T>
inline sc_concref_r<sc_bv_base, T>
concat(bool a, sc_proxy<T> &b)
{
    return sc_concref_r<sc_bv_base, T>(
            *new sc_bv_base(a, 1), b.back_cast(), 1);
}

// extern template instantiations
extern template class sc_proxy<sc_lv_base>;
extern template class sc_proxy<sc_bv_base>;

} // namespace sc_dt

#endif // __SYSTEMC_EXT_DT_BIT_SC_LV_BASE_HH__
