| /***************************************************************************** | |
| 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__ |