summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/datatypes/int/sc_signed_subref.inc
diff options
context:
space:
mode:
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.inc408
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