diff options
Diffstat (limited to 'ext/systemc/src/sysc/datatypes/int/sc_signed_subref.inc')
-rw-r--r-- | ext/systemc/src/sysc/datatypes/int/sc_signed_subref.inc | 408 |
1 files changed, 408 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/datatypes/int/sc_signed_subref.inc b/ext/systemc/src/sysc/datatypes/int/sc_signed_subref.inc new file mode 100644 index 000000000..3f50210a7 --- /dev/null +++ b/ext/systemc/src/sysc/datatypes/int/sc_signed_subref.inc @@ -0,0 +1,408 @@ +/***************************************************************************** + + 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_signed_subref.h -- Proxy class that is declared in sc_signed.h. + + Original Author: Ali Dasdan, Synopsys, Inc. + + *****************************************************************************/ + +/***************************************************************************** + + MODIFICATION LOG - modifiers, enter your name, affiliation, date and + changes you are making here. + + Name, Affiliation, Date: + Description of Modification: + + *****************************************************************************/ + + +// ---------------------------------------------------------------------------- +// CLASS : sc_signed_subref_r +// +// Proxy class for sc_signed part selection (r-value only). +// ---------------------------------------------------------------------------- + +// concatenation support + +uint64 sc_signed_subref_r::concat_get_uint64() const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.to_uint64(); +} + + +bool sc_signed_subref_r::concat_get_ctrl(sc_digit* dst_p, int low_i ) const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.concat_get_ctrl( dst_p, low_i ); +} + + +bool sc_signed_subref_r::concat_get_data(sc_digit* dst_p, int low_i ) const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.concat_get_data( dst_p, low_i ); +} + + +// implicit conversion to sc_signed + +sc_signed_subref_r::operator sc_unsigned () const +{ + return sc_unsigned( m_obj_p, m_left, m_right ); +} + + +// explicit conversions + +int +sc_signed_subref_r::to_int() const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.to_int(); +} + +unsigned int +sc_signed_subref_r::to_uint() const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.to_uint(); +} + +long +sc_signed_subref_r::to_long() const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.to_long(); +} + +unsigned long +sc_signed_subref_r::to_ulong() const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.to_ulong(); +} + +int64 +sc_signed_subref_r::to_int64() const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.to_int64(); +} + +uint64 +sc_signed_subref_r::to_uint64() const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.to_uint64(); +} + +double +sc_signed_subref_r::to_double() const +{ + sc_unsigned a( m_obj_p, m_left, m_right ); + return a.to_double(); +} + + +// explicit conversion to character string + +const std::string +sc_signed_subref_r::to_string( sc_numrep numrep ) const +{ + sc_unsigned a( length() ); + a = *this; + return a.to_string( numrep ); +} + +const std::string +sc_signed_subref_r::to_string( sc_numrep numrep, bool w_prefix ) const +{ + sc_unsigned a( length() ); + a = *this; + return a.to_string( numrep, w_prefix ); +} + + +// ---------------------------------------------------------------------------- +// CLASS : sc_signed_subref +// +// Proxy class for sc_signed part selection (r-value and l-value). +// ---------------------------------------------------------------------------- + +// assignment operators + +const sc_signed_subref& +sc_signed_subref::operator = ( const sc_signed_subref_r& a ) +{ + return operator = ( (sc_unsigned)( a ) ); +} + +const sc_signed_subref& +sc_signed_subref::operator = ( const sc_signed_subref& v ) +{ + if( this == &v ) { + return *this; + } + return operator = ( (sc_unsigned)( v ) ); +} + +const sc_signed_subref& +sc_signed_subref::operator = ( const sc_signed& v ) +{ + int i; + int l = sc_min( m_left, v.nbits - 1 + m_right ); + + for( i = m_right; i <= l; ++ i ) m_obj_p->set( i, v.test( i - m_right ) ); + for ( ; i <= m_left; i++ ) m_obj_p->set( i, v.test( l ) ); + + return *this; +} + +const sc_signed_subref& +sc_signed_subref::operator = ( const sc_unsigned_subref_r& v ) +{ + return operator = ( (sc_unsigned)( v ) ); +} + +const sc_signed_subref& +sc_signed_subref::operator = ( const sc_unsigned& v ) +{ + int i; + int l = sc_min( m_left, v.nbits - 1 + m_right ); + + for( i = m_right; i <= l; ++ i ) m_obj_p->set( i, v.test( i - m_right ) ); + for ( ; i <= m_left; i++ ) m_obj_p->set( i, 0 ); + return *this; +} + +const sc_signed_subref& +sc_signed_subref::operator = ( unsigned long v ) +{ + for( int i = m_right; i <= m_left; ++ i ) { + m_obj_p->set( i, static_cast<bool>( v & 1 ) ); + v >>= 1; + } + return *this; +} + +const sc_signed_subref& +sc_signed_subref::operator = ( long v ) +{ + unsigned long v2 = (unsigned long) v; + for( int i = m_right; i <= m_left; ++ i ) { + m_obj_p->set( i, static_cast<bool>( v2 & 1 ) ); + v2 >>= 1; + } + return *this; +} + +const sc_signed_subref& +sc_signed_subref::operator = ( uint64 v ) +{ + for( int i = m_right; i <= m_left; ++ i ) { + m_obj_p->set( i, static_cast<bool>( v & 1 ) ); + v >>= 1; + } + return *this; +} + +const sc_signed_subref& +sc_signed_subref::operator = ( int64 v ) +{ + uint64 v2 = (uint64) v; + for( int i = m_right; i <= m_left; ++ i ) { + m_obj_p->set( i, static_cast<bool>( v2 & 1 ) ); + v2 >>= 1; + } + return *this; +} + +const sc_signed_subref& +sc_signed_subref::operator = ( double v ) +{ + is_bad_double(v); + + int nb = m_left - m_right + 1; + int nd = DIV_CEIL(nb); + +#ifdef SC_MAX_NBITS + sc_digit d[MAX_NDIGITS]; +#else + sc_digit *d = new sc_digit[nd]; +#endif + + if (v < 0) + v = -v; + + int i = 0; + + while (floor(v) && (i < nd)) { +#ifndef _WIN32 + d[i++] = (sc_digit) floor(remainder(v, DIGIT_RADIX)); +#else + d[i++] = (sc_digit) floor(fmod(v, DIGIT_RADIX)); +#endif + v /= DIGIT_RADIX; + } + + vec_zero(i, nd, d); + + sc_digit val = 1; // Bit value. + int j = 0; // Current digit in d. + + i = 0; // Current bit in d. + + while (i < nb) { + + m_obj_p->set(i + m_right, (bool) (d[j] & val)); + + ++i; + + if (i % BITS_PER_DIGIT == 0) { + val = 1; + ++j; + } + else + val <<= 1; + } + +#ifndef SC_MAX_NBITS + delete [] d; +#endif + + return *this; +} + +const sc_signed_subref& +sc_signed_subref::operator = ( const sc_int_base& a ) +{ + return operator = ( (int64) a ); +} + +const sc_signed_subref& +sc_signed_subref::operator = ( const sc_uint_base& a ) +{ + return operator = ( (uint64) a ); +} + +// concatenation methods + + +void sc_signed_subref::concat_set( int64 src, int low_i ) +{ + int i; + int l; + bool sign = src < 0; + + if ( low_i < 64 ) + { + src = src >> low_i; + l = sc_min( m_left, (63-low_i) + m_right ); + for( i = m_right; i <= l; ++ i ) { + m_obj_p->set( i, src & 1 ); + src = src >> 1; + } + for ( ; i <= m_left; i++ ) m_obj_p->set(i, sign); + } + else + { + for( i = m_right; i <= m_left; ++ i ) m_obj_p->set(i, sign); + } +} + +void sc_signed_subref::concat_set( const sc_signed& src, int low_i ) +{ + int i; + int l; + int src_i; + bool sign = src.test(src.nbits-1); + l = src.nbits - (low_i+1); + if ( l >= 0 ) + { + l = sc_min( m_left, l + m_right ); + src_i = low_i; + for( i = m_right; i <= l; ++ i, src_i++ ) { + m_obj_p->set( i, src.test( src_i ) ); + } + for ( ; i <= m_left; i++ ) m_obj_p->set(i, sign); + } + else + { + for( i = m_right; i <= m_left; ++ i ) m_obj_p->set(i, sign); + } +} + +void sc_signed_subref::concat_set( const sc_unsigned& src, int low_i ) +{ + int i; + int l; + int src_i; + l = src.nbits - (low_i+2); + if ( l >= 0 ) + { + l = sc_min( m_left, l + m_right ); + src_i = low_i; + for( i = m_right; i <= l; ++ i, src_i++ ) { + m_obj_p->set( i, src.test( src_i ) ); + } + for ( ; i <= m_left; i++ ) m_obj_p->set(false); + } + else + { + for( i = m_right; i <= m_left; ++ i ) m_obj_p->set(false); + } +} + +void sc_signed_subref::concat_set( uint64 src, int low_i ) +{ + int i; + int l; + + if ( low_i < 64 ) + { + src = src >> low_i; + l = sc_min( m_left, (63-low_i) + m_right ); + for( i = m_right; i <= l; ++ i ) { + m_obj_p->set( i, src & 1 ); + src = src >> 1; + } + for ( ; i <= m_left; i++ ) m_obj_p->set(false); + } + else + { + for( i = m_right; i <= m_left; ++ i ) m_obj_p->set(false); + } +} +// other methods + +void +sc_signed_subref::scan( ::std::istream& is ) +{ + std::string s; + is >> s; + *this = s.c_str(); +} + + +// End of file |