sc_uint_base.cpp revision 12027
112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_uint_base.cpp -- contains interface definitions between sc_uint and 2312027Sjungma@eit.uni-kl.de sc_signed, sc_unsigned, and definitions for sc_uint_subref. 2412027Sjungma@eit.uni-kl.de 2512027Sjungma@eit.uni-kl.de Original Author: Ali Dasdan, Synopsys, Inc. 2612027Sjungma@eit.uni-kl.de 2712027Sjungma@eit.uni-kl.de *****************************************************************************/ 2812027Sjungma@eit.uni-kl.de 2912027Sjungma@eit.uni-kl.de/***************************************************************************** 3012027Sjungma@eit.uni-kl.de 3112027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3212027Sjungma@eit.uni-kl.de changes you are making here. 3312027Sjungma@eit.uni-kl.de 3412027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 3512027Sjungma@eit.uni-kl.de Description of Modification: 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de *****************************************************************************/ 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.de 4012027Sjungma@eit.uni-kl.de// $Log: sc_uint_base.cpp,v $ 4112027Sjungma@eit.uni-kl.de// Revision 1.5 2011/02/18 20:19:15 acg 4212027Sjungma@eit.uni-kl.de// Andy Goodrich: updating Copyright notice. 4312027Sjungma@eit.uni-kl.de// 4412027Sjungma@eit.uni-kl.de// Revision 1.4 2010/02/04 22:23:29 acg 4512027Sjungma@eit.uni-kl.de// Andy Goodrich: fixed bug in concatenation reads for part selections, 4612027Sjungma@eit.uni-kl.de// the mask being used was 32 bits and should have been 64 bits. 4712027Sjungma@eit.uni-kl.de// 4812027Sjungma@eit.uni-kl.de// Revision 1.3 2008/06/19 17:47:57 acg 4912027Sjungma@eit.uni-kl.de// Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES. 5012027Sjungma@eit.uni-kl.de// 5112027Sjungma@eit.uni-kl.de// Revision 1.2 2007/11/04 21:27:00 acg 5212027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to make sure the proper value is returned from 5312027Sjungma@eit.uni-kl.de// concat_get_data(). 5412027Sjungma@eit.uni-kl.de// 5512027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:05 acg 5612027Sjungma@eit.uni-kl.de// SystemC 2.3 5712027Sjungma@eit.uni-kl.de// 5812027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:49:32 acg 5912027Sjungma@eit.uni-kl.de// Added $Log command so that CVS check in comments are reproduced in the 6012027Sjungma@eit.uni-kl.de// source. 6112027Sjungma@eit.uni-kl.de// 6212027Sjungma@eit.uni-kl.de 6312027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_macros.h" 6412027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h" 6512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h" 6612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h" 6712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_ids.h" 6812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bv_base.h" 6912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_lv_base.h" 7012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/misc/sc_concatref.h" 7112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_ufix.h" 7212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_other_defs.h" 7312027Sjungma@eit.uni-kl.de 7412027Sjungma@eit.uni-kl.de 7512027Sjungma@eit.uni-kl.denamespace sc_dt 7612027Sjungma@eit.uni-kl.de{ 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.de// to avoid code bloat in sc_uint_concat<T1,T2> 7912027Sjungma@eit.uni-kl.de 8012027Sjungma@eit.uni-kl.devoid 8112027Sjungma@eit.uni-kl.desc_uint_concref_invalid_length( int length ) 8212027Sjungma@eit.uni-kl.de{ 8312027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 8412027Sjungma@eit.uni-kl.de std::sprintf( msg, 8512027Sjungma@eit.uni-kl.de "sc_uint_concref<T1,T2> initialization: length = %d " 8612027Sjungma@eit.uni-kl.de "violates 1 <= length <= %d", 8712027Sjungma@eit.uni-kl.de length, SC_INTWIDTH ); 8812027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 8912027Sjungma@eit.uni-kl.de} 9012027Sjungma@eit.uni-kl.de 9112027Sjungma@eit.uni-kl.de 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 9412027Sjungma@eit.uni-kl.de// CLASS : sc_uint_bitref 9512027Sjungma@eit.uni-kl.de// 9612027Sjungma@eit.uni-kl.de// Proxy class for sc_uint bit selection (r-value and l-value). 9712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 9812027Sjungma@eit.uni-kl.de 9912027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_uint_bitref> sc_uint_bitref::m_pool(9); 10012027Sjungma@eit.uni-kl.de 10112027Sjungma@eit.uni-kl.de// concatenation methods: 10212027Sjungma@eit.uni-kl.de 10312027Sjungma@eit.uni-kl.de// #### OPTIMIZE 10412027Sjungma@eit.uni-kl.devoid sc_uint_bitref::concat_set(int64 src, int low_i) 10512027Sjungma@eit.uni-kl.de{ 10612027Sjungma@eit.uni-kl.de sc_uint_base aa( 1 ); 10712027Sjungma@eit.uni-kl.de *this = aa = (low_i < 64) ? src >> low_i : src >> 63; 10812027Sjungma@eit.uni-kl.de} 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.devoid sc_uint_bitref::concat_set(const sc_signed& src, int low_i) 11112027Sjungma@eit.uni-kl.de{ 11212027Sjungma@eit.uni-kl.de sc_uint_base aa( 1 ); 11312027Sjungma@eit.uni-kl.de if ( low_i < src.length() ) 11412027Sjungma@eit.uni-kl.de *this = aa = 1 & (src >> low_i); 11512027Sjungma@eit.uni-kl.de else 11612027Sjungma@eit.uni-kl.de *this = aa = (src < 0) ? (int_type)-1 : 0; 11712027Sjungma@eit.uni-kl.de} 11812027Sjungma@eit.uni-kl.de 11912027Sjungma@eit.uni-kl.devoid sc_uint_bitref::concat_set(const sc_unsigned& src, int low_i) 12012027Sjungma@eit.uni-kl.de{ 12112027Sjungma@eit.uni-kl.de sc_uint_base aa( 1 ); 12212027Sjungma@eit.uni-kl.de if ( low_i < src.length() ) 12312027Sjungma@eit.uni-kl.de *this = aa = 1 & (src >> low_i); 12412027Sjungma@eit.uni-kl.de else 12512027Sjungma@eit.uni-kl.de *this = aa = 0; 12612027Sjungma@eit.uni-kl.de} 12712027Sjungma@eit.uni-kl.de 12812027Sjungma@eit.uni-kl.devoid sc_uint_bitref::concat_set(uint64 src, int low_i) 12912027Sjungma@eit.uni-kl.de{ 13012027Sjungma@eit.uni-kl.de sc_uint_base aa( 1 ); 13112027Sjungma@eit.uni-kl.de *this = aa = (low_i < 64) ? src >> low_i : 0; 13212027Sjungma@eit.uni-kl.de} 13312027Sjungma@eit.uni-kl.de 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.de// other methods 13612027Sjungma@eit.uni-kl.de 13712027Sjungma@eit.uni-kl.devoid 13812027Sjungma@eit.uni-kl.desc_uint_bitref::scan( ::std::istream& is ) 13912027Sjungma@eit.uni-kl.de{ 14012027Sjungma@eit.uni-kl.de bool b; 14112027Sjungma@eit.uni-kl.de is >> b; 14212027Sjungma@eit.uni-kl.de *this = b; 14312027Sjungma@eit.uni-kl.de} 14412027Sjungma@eit.uni-kl.de 14512027Sjungma@eit.uni-kl.de 14612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 14712027Sjungma@eit.uni-kl.de// CLASS : sc_uint_subref_r 14812027Sjungma@eit.uni-kl.de// 14912027Sjungma@eit.uni-kl.de// Proxy class for sc_uint part selection (l-value). 15012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 15112027Sjungma@eit.uni-kl.de 15212027Sjungma@eit.uni-kl.debool sc_uint_subref_r::concat_get_ctrl( sc_digit* dst_p, int low_i ) const 15312027Sjungma@eit.uni-kl.de{ 15412027Sjungma@eit.uni-kl.de int dst_i; // Word in dst_p now processing. 15512027Sjungma@eit.uni-kl.de int end_i; // Highest order word in dst_p to process. 15612027Sjungma@eit.uni-kl.de int left_shift; // Left shift for val. 15712027Sjungma@eit.uni-kl.de uint_type mask; // Mask for bits to extract or keep. 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de dst_i = low_i / BITS_PER_DIGIT; 16012027Sjungma@eit.uni-kl.de left_shift = low_i % BITS_PER_DIGIT; 16112027Sjungma@eit.uni-kl.de end_i = (low_i + (m_left-m_right)) / BITS_PER_DIGIT; 16212027Sjungma@eit.uni-kl.de 16312027Sjungma@eit.uni-kl.de mask = ~(-1 << left_shift); 16412027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)((dst_p[dst_i] & mask)); 16512027Sjungma@eit.uni-kl.de 16612027Sjungma@eit.uni-kl.de dst_i++; 16712027Sjungma@eit.uni-kl.de for ( ; dst_i <= end_i; dst_i++ ) dst_p[dst_i] = 0; 16812027Sjungma@eit.uni-kl.de 16912027Sjungma@eit.uni-kl.de return false; 17012027Sjungma@eit.uni-kl.de} 17112027Sjungma@eit.uni-kl.de 17212027Sjungma@eit.uni-kl.debool sc_uint_subref_r::concat_get_data( sc_digit* dst_p, int low_i ) const 17312027Sjungma@eit.uni-kl.de{ 17412027Sjungma@eit.uni-kl.de int dst_i; // Word in dst_p now processing. 17512027Sjungma@eit.uni-kl.de int end_i; // Highest order word in dst_p to process. 17612027Sjungma@eit.uni-kl.de int high_i; // Index of high order bit in dst_p to set. 17712027Sjungma@eit.uni-kl.de int left_shift; // Left shift for val. 17812027Sjungma@eit.uni-kl.de uint_type mask; // Mask for bits to extract or keep. 17912027Sjungma@eit.uni-kl.de bool result; // True if inserting non-zero value. 18012027Sjungma@eit.uni-kl.de uint_type val; // Selection value extracted from m_obj_p. 18112027Sjungma@eit.uni-kl.de 18212027Sjungma@eit.uni-kl.de dst_i = low_i / BITS_PER_DIGIT; 18312027Sjungma@eit.uni-kl.de left_shift = low_i % BITS_PER_DIGIT; 18412027Sjungma@eit.uni-kl.de high_i = low_i + (m_left-m_right); 18512027Sjungma@eit.uni-kl.de end_i = high_i / BITS_PER_DIGIT; 18612027Sjungma@eit.uni-kl.de mask = ~mask_int[m_left][m_right]; 18712027Sjungma@eit.uni-kl.de val = (m_obj_p->m_val & mask) >> m_right; 18812027Sjungma@eit.uni-kl.de result = val != 0; 18912027Sjungma@eit.uni-kl.de 19012027Sjungma@eit.uni-kl.de 19112027Sjungma@eit.uni-kl.de // PROCESS THE FIRST WORD: 19212027Sjungma@eit.uni-kl.de 19312027Sjungma@eit.uni-kl.de mask = ~(-1 << left_shift); 19412027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)(((dst_p[dst_i] & mask)) | 19512027Sjungma@eit.uni-kl.de ((val << left_shift) & DIGIT_MASK)); 19612027Sjungma@eit.uni-kl.de 19712027Sjungma@eit.uni-kl.de switch ( end_i - dst_i ) 19812027Sjungma@eit.uni-kl.de { 19912027Sjungma@eit.uni-kl.de // BITS ARE ACROSS TWO WORDS: 20012027Sjungma@eit.uni-kl.de 20112027Sjungma@eit.uni-kl.de case 1: 20212027Sjungma@eit.uni-kl.de dst_i++; 20312027Sjungma@eit.uni-kl.de val >>= (BITS_PER_DIGIT-left_shift); 20412027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)val; 20512027Sjungma@eit.uni-kl.de break; 20612027Sjungma@eit.uni-kl.de 20712027Sjungma@eit.uni-kl.de // BITS ARE ACROSS THREE WORDS: 20812027Sjungma@eit.uni-kl.de 20912027Sjungma@eit.uni-kl.de case 2: 21012027Sjungma@eit.uni-kl.de dst_i++; 21112027Sjungma@eit.uni-kl.de val >>= (BITS_PER_DIGIT-left_shift); 21212027Sjungma@eit.uni-kl.de dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK); 21312027Sjungma@eit.uni-kl.de val >>= BITS_PER_DIGIT; 21412027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)val; 21512027Sjungma@eit.uni-kl.de break; 21612027Sjungma@eit.uni-kl.de 21712027Sjungma@eit.uni-kl.de // BITS ARE ACROSS THREE WORDS: 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.de case 3: 22012027Sjungma@eit.uni-kl.de dst_i++; 22112027Sjungma@eit.uni-kl.de val >>= (BITS_PER_DIGIT-left_shift); 22212027Sjungma@eit.uni-kl.de dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK); 22312027Sjungma@eit.uni-kl.de val >>= BITS_PER_DIGIT; 22412027Sjungma@eit.uni-kl.de dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK); 22512027Sjungma@eit.uni-kl.de val >>= BITS_PER_DIGIT; 22612027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)val; 22712027Sjungma@eit.uni-kl.de break; 22812027Sjungma@eit.uni-kl.de } 22912027Sjungma@eit.uni-kl.de return result; 23012027Sjungma@eit.uni-kl.de} 23112027Sjungma@eit.uni-kl.de 23212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 23312027Sjungma@eit.uni-kl.de// CLASS : sc_uint_subref 23412027Sjungma@eit.uni-kl.de// 23512027Sjungma@eit.uni-kl.de// Proxy class for sc_uint part selection (r-value and l-value). 23612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 23712027Sjungma@eit.uni-kl.de 23812027Sjungma@eit.uni-kl.desc_core::sc_vpool<sc_uint_subref> sc_uint_subref::m_pool(9); 23912027Sjungma@eit.uni-kl.de 24012027Sjungma@eit.uni-kl.de// assignment operators 24112027Sjungma@eit.uni-kl.de 24212027Sjungma@eit.uni-kl.desc_uint_subref& 24312027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( uint_type v ) 24412027Sjungma@eit.uni-kl.de{ 24512027Sjungma@eit.uni-kl.de uint_type val = m_obj_p->m_val; 24612027Sjungma@eit.uni-kl.de uint_type mask = mask_int[m_left][m_right]; 24712027Sjungma@eit.uni-kl.de val &= mask; 24812027Sjungma@eit.uni-kl.de val |= (v << m_right) & ~mask; 24912027Sjungma@eit.uni-kl.de m_obj_p->m_val = val; 25012027Sjungma@eit.uni-kl.de m_obj_p->extend_sign(); 25112027Sjungma@eit.uni-kl.de return *this; 25212027Sjungma@eit.uni-kl.de} 25312027Sjungma@eit.uni-kl.de 25412027Sjungma@eit.uni-kl.desc_uint_subref& 25512027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_signed& a ) 25612027Sjungma@eit.uni-kl.de{ 25712027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 25812027Sjungma@eit.uni-kl.de return ( *this = aa = a ); 25912027Sjungma@eit.uni-kl.de} 26012027Sjungma@eit.uni-kl.de 26112027Sjungma@eit.uni-kl.desc_uint_subref& 26212027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_unsigned& a ) 26312027Sjungma@eit.uni-kl.de{ 26412027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 26512027Sjungma@eit.uni-kl.de return ( *this = aa = a ); 26612027Sjungma@eit.uni-kl.de} 26712027Sjungma@eit.uni-kl.de 26812027Sjungma@eit.uni-kl.desc_uint_subref& 26912027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_bv_base& a ) 27012027Sjungma@eit.uni-kl.de{ 27112027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 27212027Sjungma@eit.uni-kl.de return ( *this = aa = a ); 27312027Sjungma@eit.uni-kl.de} 27412027Sjungma@eit.uni-kl.de 27512027Sjungma@eit.uni-kl.desc_uint_subref& 27612027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_lv_base& a ) 27712027Sjungma@eit.uni-kl.de{ 27812027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 27912027Sjungma@eit.uni-kl.de return ( *this = aa = a ); 28012027Sjungma@eit.uni-kl.de} 28112027Sjungma@eit.uni-kl.de 28212027Sjungma@eit.uni-kl.de// concatenation methods: 28312027Sjungma@eit.uni-kl.de 28412027Sjungma@eit.uni-kl.de// #### OPTIMIZE 28512027Sjungma@eit.uni-kl.devoid sc_uint_subref::concat_set(int64 src, int low_i) 28612027Sjungma@eit.uni-kl.de{ 28712027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 28812027Sjungma@eit.uni-kl.de *this = aa = (low_i < 64) ? src >> low_i : src >> 63; 28912027Sjungma@eit.uni-kl.de} 29012027Sjungma@eit.uni-kl.de 29112027Sjungma@eit.uni-kl.devoid sc_uint_subref::concat_set(const sc_signed& src, int low_i) 29212027Sjungma@eit.uni-kl.de{ 29312027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 29412027Sjungma@eit.uni-kl.de if ( low_i < src.length() ) 29512027Sjungma@eit.uni-kl.de *this = aa = src >> low_i; 29612027Sjungma@eit.uni-kl.de else 29712027Sjungma@eit.uni-kl.de *this = aa = (src < 0) ? (int_type)-1 : 0; 29812027Sjungma@eit.uni-kl.de} 29912027Sjungma@eit.uni-kl.de 30012027Sjungma@eit.uni-kl.devoid sc_uint_subref::concat_set(const sc_unsigned& src, int low_i) 30112027Sjungma@eit.uni-kl.de{ 30212027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 30312027Sjungma@eit.uni-kl.de if ( low_i < src.length() ) 30412027Sjungma@eit.uni-kl.de *this = aa = src >> low_i; 30512027Sjungma@eit.uni-kl.de else 30612027Sjungma@eit.uni-kl.de *this = aa = 0; 30712027Sjungma@eit.uni-kl.de} 30812027Sjungma@eit.uni-kl.de 30912027Sjungma@eit.uni-kl.devoid sc_uint_subref::concat_set(uint64 src, int low_i) 31012027Sjungma@eit.uni-kl.de{ 31112027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 31212027Sjungma@eit.uni-kl.de *this = aa = (low_i < 64) ? src >> low_i : 0; 31312027Sjungma@eit.uni-kl.de} 31412027Sjungma@eit.uni-kl.de 31512027Sjungma@eit.uni-kl.de// other methods 31612027Sjungma@eit.uni-kl.de 31712027Sjungma@eit.uni-kl.devoid 31812027Sjungma@eit.uni-kl.desc_uint_subref::scan( ::std::istream& is ) 31912027Sjungma@eit.uni-kl.de{ 32012027Sjungma@eit.uni-kl.de std::string s; 32112027Sjungma@eit.uni-kl.de is >> s; 32212027Sjungma@eit.uni-kl.de *this = s.c_str(); 32312027Sjungma@eit.uni-kl.de} 32412027Sjungma@eit.uni-kl.de 32512027Sjungma@eit.uni-kl.de 32612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 32712027Sjungma@eit.uni-kl.de// CLASS : sc_uint_base 32812027Sjungma@eit.uni-kl.de// 32912027Sjungma@eit.uni-kl.de// Base class for sc_uint. 33012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 33112027Sjungma@eit.uni-kl.de 33212027Sjungma@eit.uni-kl.de// support methods 33312027Sjungma@eit.uni-kl.de 33412027Sjungma@eit.uni-kl.devoid 33512027Sjungma@eit.uni-kl.desc_uint_base::invalid_length() const 33612027Sjungma@eit.uni-kl.de{ 33712027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 33812027Sjungma@eit.uni-kl.de std::sprintf( msg, 33912027Sjungma@eit.uni-kl.de "sc_uint[_base] initialization: length = %d violates " 34012027Sjungma@eit.uni-kl.de "1 <= length <= %d", 34112027Sjungma@eit.uni-kl.de m_len, SC_INTWIDTH ); 34212027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 34312027Sjungma@eit.uni-kl.de} 34412027Sjungma@eit.uni-kl.de 34512027Sjungma@eit.uni-kl.devoid 34612027Sjungma@eit.uni-kl.desc_uint_base::invalid_index( int i ) const 34712027Sjungma@eit.uni-kl.de{ 34812027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 34912027Sjungma@eit.uni-kl.de std::sprintf( msg, 35012027Sjungma@eit.uni-kl.de "sc_uint[_base] bit selection: index = %d violates " 35112027Sjungma@eit.uni-kl.de "0 <= index <= %d", 35212027Sjungma@eit.uni-kl.de i, m_len - 1 ); 35312027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 35412027Sjungma@eit.uni-kl.de} 35512027Sjungma@eit.uni-kl.de 35612027Sjungma@eit.uni-kl.devoid 35712027Sjungma@eit.uni-kl.desc_uint_base::invalid_range( int l, int r ) const 35812027Sjungma@eit.uni-kl.de{ 35912027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 36012027Sjungma@eit.uni-kl.de std::sprintf( msg, 36112027Sjungma@eit.uni-kl.de "sc_uint[_base] part selection: left = %d, right = %d violates " 36212027Sjungma@eit.uni-kl.de "%d >= left >= right >= 0", 36312027Sjungma@eit.uni-kl.de l, r, m_len - 1 ); 36412027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 36512027Sjungma@eit.uni-kl.de} 36612027Sjungma@eit.uni-kl.de 36712027Sjungma@eit.uni-kl.de 36812027Sjungma@eit.uni-kl.devoid 36912027Sjungma@eit.uni-kl.desc_uint_base::check_value() const 37012027Sjungma@eit.uni-kl.de{ 37112027Sjungma@eit.uni-kl.de uint_type limit = (~UINT_ZERO >> m_ulen); 37212027Sjungma@eit.uni-kl.de if( m_val > limit ) { 37312027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 37412027Sjungma@eit.uni-kl.de std::sprintf( msg, "sc_uint[_base]: value does not fit into a length of %d", 37512027Sjungma@eit.uni-kl.de m_len ); 37612027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 37712027Sjungma@eit.uni-kl.de } 37812027Sjungma@eit.uni-kl.de} 37912027Sjungma@eit.uni-kl.de 38012027Sjungma@eit.uni-kl.de 38112027Sjungma@eit.uni-kl.de// constructors 38212027Sjungma@eit.uni-kl.de 38312027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_bv_base& v ) 38412027Sjungma@eit.uni-kl.de : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len ) 38512027Sjungma@eit.uni-kl.de{ 38612027Sjungma@eit.uni-kl.de check_length(); 38712027Sjungma@eit.uni-kl.de *this = v; 38812027Sjungma@eit.uni-kl.de} 38912027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_lv_base& v ) 39012027Sjungma@eit.uni-kl.de : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len ) 39112027Sjungma@eit.uni-kl.de{ 39212027Sjungma@eit.uni-kl.de check_length(); 39312027Sjungma@eit.uni-kl.de *this = v; 39412027Sjungma@eit.uni-kl.de} 39512027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_int_subref_r& v ) 39612027Sjungma@eit.uni-kl.de : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len ) 39712027Sjungma@eit.uni-kl.de{ 39812027Sjungma@eit.uni-kl.de check_length(); 39912027Sjungma@eit.uni-kl.de *this = v.to_uint64(); 40012027Sjungma@eit.uni-kl.de} 40112027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_signed_subref_r& v ) 40212027Sjungma@eit.uni-kl.de : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len ) 40312027Sjungma@eit.uni-kl.de{ 40412027Sjungma@eit.uni-kl.de check_length(); 40512027Sjungma@eit.uni-kl.de *this = v.to_uint64(); 40612027Sjungma@eit.uni-kl.de} 40712027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_unsigned_subref_r& v ) 40812027Sjungma@eit.uni-kl.de : m_val(0), m_len( v.length() ), m_ulen( SC_INTWIDTH - m_len ) 40912027Sjungma@eit.uni-kl.de{ 41012027Sjungma@eit.uni-kl.de check_length(); 41112027Sjungma@eit.uni-kl.de *this = v.to_uint64(); 41212027Sjungma@eit.uni-kl.de} 41312027Sjungma@eit.uni-kl.de 41412027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_signed& a ) 41512027Sjungma@eit.uni-kl.de : m_val( 0 ), m_len( a.length() ), m_ulen( SC_INTWIDTH - m_len ) 41612027Sjungma@eit.uni-kl.de{ 41712027Sjungma@eit.uni-kl.de check_length(); 41812027Sjungma@eit.uni-kl.de#if 0 41912027Sjungma@eit.uni-kl.de for( int i = m_len - 1; i >= 0; -- i ) { 42012027Sjungma@eit.uni-kl.de set( i, a.test( i ) ); 42112027Sjungma@eit.uni-kl.de } 42212027Sjungma@eit.uni-kl.de extend_sign(); 42312027Sjungma@eit.uni-kl.de#else 42412027Sjungma@eit.uni-kl.de *this = a.to_uint64(); 42512027Sjungma@eit.uni-kl.de#endif 42612027Sjungma@eit.uni-kl.de} 42712027Sjungma@eit.uni-kl.de 42812027Sjungma@eit.uni-kl.desc_uint_base::sc_uint_base( const sc_unsigned& a ) 42912027Sjungma@eit.uni-kl.de : m_val( 0 ), m_len( a.length() ), m_ulen( SC_INTWIDTH - m_len ) 43012027Sjungma@eit.uni-kl.de{ 43112027Sjungma@eit.uni-kl.de check_length(); 43212027Sjungma@eit.uni-kl.de#if 0 43312027Sjungma@eit.uni-kl.de for( int i = m_len - 1; i >= 0; -- i ) { 43412027Sjungma@eit.uni-kl.de set( i, a.test( i ) ); 43512027Sjungma@eit.uni-kl.de } 43612027Sjungma@eit.uni-kl.de extend_sign(); 43712027Sjungma@eit.uni-kl.de#else 43812027Sjungma@eit.uni-kl.de *this = a.to_uint64(); 43912027Sjungma@eit.uni-kl.de#endif 44012027Sjungma@eit.uni-kl.de} 44112027Sjungma@eit.uni-kl.de 44212027Sjungma@eit.uni-kl.de// assignment operators 44312027Sjungma@eit.uni-kl.de 44412027Sjungma@eit.uni-kl.desc_uint_base& 44512027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const sc_signed& a ) 44612027Sjungma@eit.uni-kl.de{ 44712027Sjungma@eit.uni-kl.de int minlen = sc_min( m_len, a.length() ); 44812027Sjungma@eit.uni-kl.de int i = 0; 44912027Sjungma@eit.uni-kl.de for( ; i < minlen; ++ i ) { 45012027Sjungma@eit.uni-kl.de set( i, a.test( i ) ); 45112027Sjungma@eit.uni-kl.de } 45212027Sjungma@eit.uni-kl.de bool sgn = a.sign(); 45312027Sjungma@eit.uni-kl.de for( ; i < m_len; ++ i ) { 45412027Sjungma@eit.uni-kl.de // sign extension 45512027Sjungma@eit.uni-kl.de set( i, sgn ); 45612027Sjungma@eit.uni-kl.de } 45712027Sjungma@eit.uni-kl.de extend_sign(); 45812027Sjungma@eit.uni-kl.de return *this; 45912027Sjungma@eit.uni-kl.de} 46012027Sjungma@eit.uni-kl.de 46112027Sjungma@eit.uni-kl.desc_uint_base& 46212027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const sc_unsigned& a ) 46312027Sjungma@eit.uni-kl.de{ 46412027Sjungma@eit.uni-kl.de int minlen = sc_min( m_len, a.length() ); 46512027Sjungma@eit.uni-kl.de int i = 0; 46612027Sjungma@eit.uni-kl.de for( ; i < minlen; ++ i ) { 46712027Sjungma@eit.uni-kl.de set( i, a.test( i ) ); 46812027Sjungma@eit.uni-kl.de } 46912027Sjungma@eit.uni-kl.de for( ; i < m_len; ++ i ) { 47012027Sjungma@eit.uni-kl.de // zero extension 47112027Sjungma@eit.uni-kl.de set( i, 0 ); 47212027Sjungma@eit.uni-kl.de } 47312027Sjungma@eit.uni-kl.de extend_sign(); 47412027Sjungma@eit.uni-kl.de return *this; 47512027Sjungma@eit.uni-kl.de} 47612027Sjungma@eit.uni-kl.de 47712027Sjungma@eit.uni-kl.de 47812027Sjungma@eit.uni-kl.desc_uint_base& 47912027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const sc_bv_base& a ) 48012027Sjungma@eit.uni-kl.de{ 48112027Sjungma@eit.uni-kl.de int minlen = sc_min( m_len, a.length() ); 48212027Sjungma@eit.uni-kl.de int i = 0; 48312027Sjungma@eit.uni-kl.de for( ; i < minlen; ++ i ) { 48412027Sjungma@eit.uni-kl.de set( i, a.get_bit( i ) ); 48512027Sjungma@eit.uni-kl.de } 48612027Sjungma@eit.uni-kl.de for( ; i < m_len; ++ i ) { 48712027Sjungma@eit.uni-kl.de // zero extension 48812027Sjungma@eit.uni-kl.de set( i, 0 ); 48912027Sjungma@eit.uni-kl.de } 49012027Sjungma@eit.uni-kl.de extend_sign(); 49112027Sjungma@eit.uni-kl.de return *this; 49212027Sjungma@eit.uni-kl.de} 49312027Sjungma@eit.uni-kl.de 49412027Sjungma@eit.uni-kl.desc_uint_base& 49512027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const sc_lv_base& a ) 49612027Sjungma@eit.uni-kl.de{ 49712027Sjungma@eit.uni-kl.de int minlen = sc_min( m_len, a.length() ); 49812027Sjungma@eit.uni-kl.de int i = 0; 49912027Sjungma@eit.uni-kl.de for( ; i < minlen; ++ i ) { 50012027Sjungma@eit.uni-kl.de set( i, sc_logic( a.get_bit( i ) ).to_bool() ); 50112027Sjungma@eit.uni-kl.de } 50212027Sjungma@eit.uni-kl.de for( ; i < m_len; ++ i ) { 50312027Sjungma@eit.uni-kl.de // zero extension 50412027Sjungma@eit.uni-kl.de set( i, 0 ); 50512027Sjungma@eit.uni-kl.de } 50612027Sjungma@eit.uni-kl.de extend_sign(); 50712027Sjungma@eit.uni-kl.de return *this; 50812027Sjungma@eit.uni-kl.de} 50912027Sjungma@eit.uni-kl.de 51012027Sjungma@eit.uni-kl.desc_uint_base& 51112027Sjungma@eit.uni-kl.desc_uint_base::operator = ( const char* a ) 51212027Sjungma@eit.uni-kl.de{ 51312027Sjungma@eit.uni-kl.de if( a == 0 ) { 51412027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_, 51512027Sjungma@eit.uni-kl.de "character string is zero" ); 51612027Sjungma@eit.uni-kl.de } 51712027Sjungma@eit.uni-kl.de if( *a == 0 ) { 51812027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_, 51912027Sjungma@eit.uni-kl.de "character string is empty" ); 52012027Sjungma@eit.uni-kl.de } 52112027Sjungma@eit.uni-kl.de try { 52212027Sjungma@eit.uni-kl.de int len = m_len; 52312027Sjungma@eit.uni-kl.de sc_ufix aa( a, len, len, SC_TRN, SC_WRAP, 0, SC_ON ); 52412027Sjungma@eit.uni-kl.de return this->operator = ( aa ); 52512027Sjungma@eit.uni-kl.de } catch( sc_core::sc_report ) { 52612027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 52712027Sjungma@eit.uni-kl.de std::sprintf( msg, "character string '%s' is not valid", a ); 52812027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_CONVERSION_FAILED_, msg ); 52912027Sjungma@eit.uni-kl.de // never reached 53012027Sjungma@eit.uni-kl.de return *this; 53112027Sjungma@eit.uni-kl.de } 53212027Sjungma@eit.uni-kl.de} 53312027Sjungma@eit.uni-kl.de 53412027Sjungma@eit.uni-kl.de 53512027Sjungma@eit.uni-kl.de// explicit conversion to character string 53612027Sjungma@eit.uni-kl.de 53712027Sjungma@eit.uni-kl.deconst std::string 53812027Sjungma@eit.uni-kl.desc_uint_base::to_string( sc_numrep numrep ) const 53912027Sjungma@eit.uni-kl.de{ 54012027Sjungma@eit.uni-kl.de int len = m_len; 54112027Sjungma@eit.uni-kl.de sc_ufix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON ); 54212027Sjungma@eit.uni-kl.de return aa.to_string( numrep ); 54312027Sjungma@eit.uni-kl.de} 54412027Sjungma@eit.uni-kl.de 54512027Sjungma@eit.uni-kl.deconst std::string 54612027Sjungma@eit.uni-kl.desc_uint_base::to_string( sc_numrep numrep, bool w_prefix ) const 54712027Sjungma@eit.uni-kl.de{ 54812027Sjungma@eit.uni-kl.de int len = m_len; 54912027Sjungma@eit.uni-kl.de sc_ufix aa( *this, len, len, SC_TRN, SC_WRAP, 0, SC_ON ); 55012027Sjungma@eit.uni-kl.de return aa.to_string( numrep, w_prefix ); 55112027Sjungma@eit.uni-kl.de} 55212027Sjungma@eit.uni-kl.de 55312027Sjungma@eit.uni-kl.de 55412027Sjungma@eit.uni-kl.de// reduce methods 55512027Sjungma@eit.uni-kl.de 55612027Sjungma@eit.uni-kl.debool 55712027Sjungma@eit.uni-kl.desc_uint_base::and_reduce() const 55812027Sjungma@eit.uni-kl.de{ 55912027Sjungma@eit.uni-kl.de return ( m_val == (~UINT_ZERO >> m_ulen) ); 56012027Sjungma@eit.uni-kl.de} 56112027Sjungma@eit.uni-kl.de 56212027Sjungma@eit.uni-kl.debool 56312027Sjungma@eit.uni-kl.desc_uint_base::or_reduce() const 56412027Sjungma@eit.uni-kl.de{ 56512027Sjungma@eit.uni-kl.de return ( m_val != uint_type( 0 ) ); 56612027Sjungma@eit.uni-kl.de} 56712027Sjungma@eit.uni-kl.de 56812027Sjungma@eit.uni-kl.debool 56912027Sjungma@eit.uni-kl.desc_uint_base::xor_reduce() const 57012027Sjungma@eit.uni-kl.de{ 57112027Sjungma@eit.uni-kl.de uint_type mask = ~UINT_ZERO; 57212027Sjungma@eit.uni-kl.de uint_type val = m_val; 57312027Sjungma@eit.uni-kl.de int n = SC_INTWIDTH; 57412027Sjungma@eit.uni-kl.de do { 57512027Sjungma@eit.uni-kl.de n >>= 1; 57612027Sjungma@eit.uni-kl.de mask >>= n; 57712027Sjungma@eit.uni-kl.de val = ((val & (mask << n)) >> n) ^ (val & mask); 57812027Sjungma@eit.uni-kl.de } while( n != 1 ); 57912027Sjungma@eit.uni-kl.de return ( val != uint_type( 0 ) ); 58012027Sjungma@eit.uni-kl.de} 58112027Sjungma@eit.uni-kl.de 58212027Sjungma@eit.uni-kl.de 58312027Sjungma@eit.uni-kl.debool sc_uint_base::concat_get_ctrl( sc_digit* dst_p, int low_i ) const 58412027Sjungma@eit.uni-kl.de{ 58512027Sjungma@eit.uni-kl.de int dst_i; // Word in dst_p now processing. 58612027Sjungma@eit.uni-kl.de int end_i; // Highest order word in dst_p to process. 58712027Sjungma@eit.uni-kl.de int left_shift; // Left shift for val. 58812027Sjungma@eit.uni-kl.de uint_type mask; // Mask for bits to extract or keep. 58912027Sjungma@eit.uni-kl.de 59012027Sjungma@eit.uni-kl.de dst_i = low_i / BITS_PER_DIGIT; 59112027Sjungma@eit.uni-kl.de left_shift = low_i % BITS_PER_DIGIT; 59212027Sjungma@eit.uni-kl.de end_i = (low_i + (m_len-1)) / BITS_PER_DIGIT; 59312027Sjungma@eit.uni-kl.de 59412027Sjungma@eit.uni-kl.de // PROCESS THE FIRST WORD: 59512027Sjungma@eit.uni-kl.de 59612027Sjungma@eit.uni-kl.de mask = ~((uint_type)-1 << left_shift); 59712027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)((dst_p[dst_i] & mask)); 59812027Sjungma@eit.uni-kl.de 59912027Sjungma@eit.uni-kl.de dst_i++; 60012027Sjungma@eit.uni-kl.de for ( ; dst_i <= end_i; dst_i++ ) dst_p[dst_i] = 0; 60112027Sjungma@eit.uni-kl.de return false; 60212027Sjungma@eit.uni-kl.de} 60312027Sjungma@eit.uni-kl.de 60412027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 60512027Sjungma@eit.uni-kl.de//"sc_uint_base::concat_get_data" 60612027Sjungma@eit.uni-kl.de// 60712027Sjungma@eit.uni-kl.de// This method transfers the value of this object instance to the supplied 60812027Sjungma@eit.uni-kl.de// array of sc_unsigned digits starting with the bit specified by low_i within 60912027Sjungma@eit.uni-kl.de// the array of digits. 61012027Sjungma@eit.uni-kl.de// 61112027Sjungma@eit.uni-kl.de// Notes: 61212027Sjungma@eit.uni-kl.de// (1) we don't worry about masking the high order data we transfer since 61312027Sjungma@eit.uni-kl.de// concat_get_data() is called from low order bit to high order bit. So 61412027Sjungma@eit.uni-kl.de// the bits above where we place ours will be filled in by someone else. 61512027Sjungma@eit.uni-kl.de// 61612027Sjungma@eit.uni-kl.de// dst_p -> array of sc_unsigned digits to be filled in. 61712027Sjungma@eit.uni-kl.de// low_i = first bit within dst_p to be set. 61812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 61912027Sjungma@eit.uni-kl.debool sc_uint_base::concat_get_data( sc_digit* dst_p, int low_i ) const 62012027Sjungma@eit.uni-kl.de{ 62112027Sjungma@eit.uni-kl.de int dst_i; // Word in dst_p now processing. 62212027Sjungma@eit.uni-kl.de int end_i; // Highest order word in dst_p to process. 62312027Sjungma@eit.uni-kl.de int high_i; // Index of high order bit in dst_p to set. 62412027Sjungma@eit.uni-kl.de int left_shift; // Left shift for val. 62512027Sjungma@eit.uni-kl.de uint_type mask; // Mask for bits to extract or keep. 62612027Sjungma@eit.uni-kl.de bool result; // True if inserting non-zero value. 62712027Sjungma@eit.uni-kl.de uint_type val; // Value for this object. 62812027Sjungma@eit.uni-kl.de 62912027Sjungma@eit.uni-kl.de dst_i = low_i / BITS_PER_DIGIT; 63012027Sjungma@eit.uni-kl.de left_shift = low_i % BITS_PER_DIGIT; 63112027Sjungma@eit.uni-kl.de high_i = low_i + (m_len-1); 63212027Sjungma@eit.uni-kl.de end_i = high_i / BITS_PER_DIGIT; 63312027Sjungma@eit.uni-kl.de val = m_val; 63412027Sjungma@eit.uni-kl.de result = val != 0; 63512027Sjungma@eit.uni-kl.de 63612027Sjungma@eit.uni-kl.de // MASK OFF DATA TO BE TRANSFERRED BASE ON WIDTH: 63712027Sjungma@eit.uni-kl.de 63812027Sjungma@eit.uni-kl.de if ( m_len < 64 ) 63912027Sjungma@eit.uni-kl.de { 64012027Sjungma@eit.uni-kl.de mask = ~((uint_type)-1 << m_len); 64112027Sjungma@eit.uni-kl.de val &= mask; 64212027Sjungma@eit.uni-kl.de } 64312027Sjungma@eit.uni-kl.de 64412027Sjungma@eit.uni-kl.de // PROCESS THE FIRST WORD: 64512027Sjungma@eit.uni-kl.de 64612027Sjungma@eit.uni-kl.de mask = ~((uint_type)-1 << left_shift); 64712027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)(((dst_p[dst_i] & mask)) | 64812027Sjungma@eit.uni-kl.de ((val << left_shift) & DIGIT_MASK)); 64912027Sjungma@eit.uni-kl.de 65012027Sjungma@eit.uni-kl.de switch ( end_i - dst_i ) 65112027Sjungma@eit.uni-kl.de { 65212027Sjungma@eit.uni-kl.de // BITS ARE ACROSS TWO WORDS: 65312027Sjungma@eit.uni-kl.de 65412027Sjungma@eit.uni-kl.de case 1: 65512027Sjungma@eit.uni-kl.de dst_i++; 65612027Sjungma@eit.uni-kl.de val >>= (BITS_PER_DIGIT-left_shift); 65712027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)val; 65812027Sjungma@eit.uni-kl.de break; 65912027Sjungma@eit.uni-kl.de 66012027Sjungma@eit.uni-kl.de // BITS ARE ACROSS THREE WORDS: 66112027Sjungma@eit.uni-kl.de 66212027Sjungma@eit.uni-kl.de case 2: 66312027Sjungma@eit.uni-kl.de dst_i++; 66412027Sjungma@eit.uni-kl.de val >>= (BITS_PER_DIGIT-left_shift); 66512027Sjungma@eit.uni-kl.de dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK); 66612027Sjungma@eit.uni-kl.de val >>= BITS_PER_DIGIT; 66712027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)val; 66812027Sjungma@eit.uni-kl.de break; 66912027Sjungma@eit.uni-kl.de 67012027Sjungma@eit.uni-kl.de // BITS ARE ACROSS FOUR WORDS: 67112027Sjungma@eit.uni-kl.de 67212027Sjungma@eit.uni-kl.de case 3: 67312027Sjungma@eit.uni-kl.de dst_i++; 67412027Sjungma@eit.uni-kl.de val >>= (BITS_PER_DIGIT-left_shift); 67512027Sjungma@eit.uni-kl.de dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK); 67612027Sjungma@eit.uni-kl.de val >>= BITS_PER_DIGIT; 67712027Sjungma@eit.uni-kl.de dst_p[dst_i++] = (sc_digit)(val & DIGIT_MASK); 67812027Sjungma@eit.uni-kl.de val >>= BITS_PER_DIGIT; 67912027Sjungma@eit.uni-kl.de dst_p[dst_i] = (sc_digit)val; 68012027Sjungma@eit.uni-kl.de break; 68112027Sjungma@eit.uni-kl.de 68212027Sjungma@eit.uni-kl.de } 68312027Sjungma@eit.uni-kl.de return result; 68412027Sjungma@eit.uni-kl.de} 68512027Sjungma@eit.uni-kl.de 68612027Sjungma@eit.uni-kl.de// #### OPTIMIZE 68712027Sjungma@eit.uni-kl.devoid sc_uint_base::concat_set(int64 src, int low_i) 68812027Sjungma@eit.uni-kl.de{ 68912027Sjungma@eit.uni-kl.de *this = (low_i < 64) ? src >> low_i : src >> 63; 69012027Sjungma@eit.uni-kl.de} 69112027Sjungma@eit.uni-kl.de 69212027Sjungma@eit.uni-kl.devoid sc_uint_base::concat_set(const sc_signed& src, int low_i) 69312027Sjungma@eit.uni-kl.de{ 69412027Sjungma@eit.uni-kl.de if ( low_i < src.length() ) 69512027Sjungma@eit.uni-kl.de *this = src >> low_i; 69612027Sjungma@eit.uni-kl.de else 69712027Sjungma@eit.uni-kl.de *this = (src < 0) ? (int_type)-1 : 0; 69812027Sjungma@eit.uni-kl.de} 69912027Sjungma@eit.uni-kl.de 70012027Sjungma@eit.uni-kl.devoid sc_uint_base::concat_set(const sc_unsigned& src, int low_i) 70112027Sjungma@eit.uni-kl.de{ 70212027Sjungma@eit.uni-kl.de if ( low_i < src.length() ) 70312027Sjungma@eit.uni-kl.de *this = src >> low_i; 70412027Sjungma@eit.uni-kl.de else 70512027Sjungma@eit.uni-kl.de *this = 0; 70612027Sjungma@eit.uni-kl.de} 70712027Sjungma@eit.uni-kl.de 70812027Sjungma@eit.uni-kl.devoid sc_uint_base::concat_set(uint64 src, int low_i) 70912027Sjungma@eit.uni-kl.de{ 71012027Sjungma@eit.uni-kl.de *this = (low_i < 64) ? src >> low_i : 0; 71112027Sjungma@eit.uni-kl.de} 71212027Sjungma@eit.uni-kl.de 71312027Sjungma@eit.uni-kl.de 71412027Sjungma@eit.uni-kl.de// other methods 71512027Sjungma@eit.uni-kl.de 71612027Sjungma@eit.uni-kl.devoid 71712027Sjungma@eit.uni-kl.desc_uint_base::scan( ::std::istream& is ) 71812027Sjungma@eit.uni-kl.de{ 71912027Sjungma@eit.uni-kl.de std::string s; 72012027Sjungma@eit.uni-kl.de is >> s; 72112027Sjungma@eit.uni-kl.de *this = s.c_str(); 72212027Sjungma@eit.uni-kl.de} 72312027Sjungma@eit.uni-kl.de 72412027Sjungma@eit.uni-kl.de} // namespace sc_dt 72512027Sjungma@eit.uni-kl.de 72612027Sjungma@eit.uni-kl.de 72712027Sjungma@eit.uni-kl.de// Taf! 728