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_bv_base.cpp -- Arbitrary size bit vector class. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Gene Bushuyev, Synopsys, Inc. 2512027Sjungma@eit.uni-kl.de 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 MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3112027Sjungma@eit.uni-kl.de changes you are making here. 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 3412027Sjungma@eit.uni-kl.de Description of Modification: 3512027Sjungma@eit.uni-kl.de 3612027Sjungma@eit.uni-kl.de *****************************************************************************/ 3712027Sjungma@eit.uni-kl.de 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.de// $Log: sc_bv_base.cpp,v $ 4012027Sjungma@eit.uni-kl.de// Revision 1.2 2011/08/24 22:05:40 acg 4112027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 4212027Sjungma@eit.uni-kl.de// 4312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:04 acg 4412027Sjungma@eit.uni-kl.de// SystemC 2.3 4512027Sjungma@eit.uni-kl.de// 4612027Sjungma@eit.uni-kl.de// Revision 1.4 2006/04/11 23:12:26 acg 4712027Sjungma@eit.uni-kl.de// Andy Goodrich: Fixed bug in parsing of extended string constants like 4812027Sjungma@eit.uni-kl.de// 0bus1110011. 4912027Sjungma@eit.uni-kl.de// 5012027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:53:53 acg 5112027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in 5212027Sjungma@eit.uni-kl.de// the source. 5312027Sjungma@eit.uni-kl.de// 5412027Sjungma@eit.uni-kl.de 5512027Sjungma@eit.uni-kl.de#include <string.h> 5612027Sjungma@eit.uni-kl.de 5712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit_ids.h" 5812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bv_base.h" 5912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_fix.h" 6012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_ufix.h" 6112027Sjungma@eit.uni-kl.de 6212027Sjungma@eit.uni-kl.de 6312027Sjungma@eit.uni-kl.denamespace sc_dt 6412027Sjungma@eit.uni-kl.de{ 6512027Sjungma@eit.uni-kl.de 6612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 6712027Sjungma@eit.uni-kl.de// CLASS : sc_bv_base 6812027Sjungma@eit.uni-kl.de// 6912027Sjungma@eit.uni-kl.de// Arbitrary size bit vector base class. 7012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.devoid 7312027Sjungma@eit.uni-kl.desc_bv_base::init( int length_, bool init_value ) 7412027Sjungma@eit.uni-kl.de{ 7512027Sjungma@eit.uni-kl.de // check the length 7612027Sjungma@eit.uni-kl.de if( length_ <= 0 ) { 7712027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_ZERO_LENGTH_, 0 ); 7812027Sjungma@eit.uni-kl.de } 7912027Sjungma@eit.uni-kl.de // allocate memory for the data and control words 8012027Sjungma@eit.uni-kl.de m_len = length_; 8112027Sjungma@eit.uni-kl.de m_size = (m_len - 1) / SC_DIGIT_SIZE + 1; 8212027Sjungma@eit.uni-kl.de m_data = new sc_digit[m_size]; 8312027Sjungma@eit.uni-kl.de // initialize the bits to 'init_value' 8412027Sjungma@eit.uni-kl.de sc_digit dw = init_value ? ~SC_DIGIT_ZERO : SC_DIGIT_ZERO; 8512027Sjungma@eit.uni-kl.de int sz = m_size; 8612027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 8712027Sjungma@eit.uni-kl.de m_data[i] = dw; 8812027Sjungma@eit.uni-kl.de } 8912027Sjungma@eit.uni-kl.de clean_tail(); 9012027Sjungma@eit.uni-kl.de} 9112027Sjungma@eit.uni-kl.de 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.devoid 9412027Sjungma@eit.uni-kl.desc_bv_base::assign_from_string( const std::string& s ) 9512027Sjungma@eit.uni-kl.de{ 9612027Sjungma@eit.uni-kl.de // s must have been converted to bin 9712027Sjungma@eit.uni-kl.de int len = m_len; 9812027Sjungma@eit.uni-kl.de int s_len = s.length() - 1; 9912027Sjungma@eit.uni-kl.de int min_len = sc_min( len, s_len ); 10012027Sjungma@eit.uni-kl.de int i = 0; 10112027Sjungma@eit.uni-kl.de for( ; i < min_len; ++ i ) { 10212027Sjungma@eit.uni-kl.de char c = s[s_len - i - 1]; 10312027Sjungma@eit.uni-kl.de if( c != '0' && c != '1' ) { 10412027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_CANNOT_CONVERT_, 10512027Sjungma@eit.uni-kl.de "string can contain only '0' and '1' characters" ); 10612027Sjungma@eit.uni-kl.de } 10712027Sjungma@eit.uni-kl.de set_bit( i, sc_logic_value_t( c - '0' ) ); 10812027Sjungma@eit.uni-kl.de } 10912027Sjungma@eit.uni-kl.de // if formatted, fill the rest with sign(s), otherwise fill with zeros 11012027Sjungma@eit.uni-kl.de sc_logic_value_t fill = (s[s_len] == 'F' ? sc_logic_value_t( s[0] - '0' ) 11112027Sjungma@eit.uni-kl.de : sc_logic_value_t( 0 )); 11212027Sjungma@eit.uni-kl.de for( ; i < len; ++ i ) { 11312027Sjungma@eit.uni-kl.de set_bit( i, fill ); 11412027Sjungma@eit.uni-kl.de } 11512027Sjungma@eit.uni-kl.de} 11612027Sjungma@eit.uni-kl.de 11712027Sjungma@eit.uni-kl.de 11812027Sjungma@eit.uni-kl.de// constructors 11912027Sjungma@eit.uni-kl.de 12012027Sjungma@eit.uni-kl.desc_bv_base::sc_bv_base( const char* a ) 12112027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 12212027Sjungma@eit.uni-kl.de{ 12312027Sjungma@eit.uni-kl.de std::string s = convert_to_bin( a ); 12412027Sjungma@eit.uni-kl.de init( s.length() - 1 ); 12512027Sjungma@eit.uni-kl.de assign_from_string( s ); 12612027Sjungma@eit.uni-kl.de} 12712027Sjungma@eit.uni-kl.de 12812027Sjungma@eit.uni-kl.desc_bv_base::sc_bv_base( const char* a, int length_ ) 12912027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 13012027Sjungma@eit.uni-kl.de{ 13112027Sjungma@eit.uni-kl.de init( length_ ); 13212027Sjungma@eit.uni-kl.de assign_from_string( convert_to_bin( a ) ); 13312027Sjungma@eit.uni-kl.de} 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.desc_bv_base::sc_bv_base( const sc_bv_base& a ) 13612027Sjungma@eit.uni-kl.de : sc_proxy<sc_bv_base>(), 13712027Sjungma@eit.uni-kl.de m_len( a.m_len ), 13812027Sjungma@eit.uni-kl.de m_size( a.m_size ), 13912027Sjungma@eit.uni-kl.de m_data( new sc_digit[m_size] ) 14012027Sjungma@eit.uni-kl.de{ 14112027Sjungma@eit.uni-kl.de // copy the bits 14212027Sjungma@eit.uni-kl.de int sz = m_size; 14312027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 14412027Sjungma@eit.uni-kl.de m_data[i] = a.m_data[i]; 14512027Sjungma@eit.uni-kl.de } 14612027Sjungma@eit.uni-kl.de} 14712027Sjungma@eit.uni-kl.de 14812027Sjungma@eit.uni-kl.de 14912027Sjungma@eit.uni-kl.de// assignment operators 15012027Sjungma@eit.uni-kl.de 15112027Sjungma@eit.uni-kl.desc_bv_base& 15212027Sjungma@eit.uni-kl.desc_bv_base::operator = ( const char* a ) 15312027Sjungma@eit.uni-kl.de{ 15412027Sjungma@eit.uni-kl.de assign_from_string( convert_to_bin( a ) ); 15512027Sjungma@eit.uni-kl.de return *this; 15612027Sjungma@eit.uni-kl.de} 15712027Sjungma@eit.uni-kl.de 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de#if 0 16012027Sjungma@eit.uni-kl.de 16112027Sjungma@eit.uni-kl.de// bitwise complement 16212027Sjungma@eit.uni-kl.de 16312027Sjungma@eit.uni-kl.desc_bv_base& 16412027Sjungma@eit.uni-kl.desc_bv_base::b_not() 16512027Sjungma@eit.uni-kl.de{ 16612027Sjungma@eit.uni-kl.de int sz = m_size; 16712027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 16812027Sjungma@eit.uni-kl.de m_data[i] = ~m_data[i]; 16912027Sjungma@eit.uni-kl.de } 17012027Sjungma@eit.uni-kl.de clean_tail(); 17112027Sjungma@eit.uni-kl.de return *this; 17212027Sjungma@eit.uni-kl.de} 17312027Sjungma@eit.uni-kl.de 17412027Sjungma@eit.uni-kl.de 17512027Sjungma@eit.uni-kl.de// bitwise left shift 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.desc_bv_base& 17812027Sjungma@eit.uni-kl.desc_bv_base::operator <<= ( int n ) 17912027Sjungma@eit.uni-kl.de{ 18012027Sjungma@eit.uni-kl.de if( n < 0 ) { 18112027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 18212027Sjungma@eit.uni-kl.de std::sprintf( msg, 18312027Sjungma@eit.uni-kl.de "left shift operation is only allowed with positive " 18412027Sjungma@eit.uni-kl.de "shift values, shift value = %d", n ); 18512027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 18612027Sjungma@eit.uni-kl.de } 18712027Sjungma@eit.uni-kl.de int sz = m_size; 18812027Sjungma@eit.uni-kl.de if( n >= m_len ) { 18912027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 19012027Sjungma@eit.uni-kl.de m_data[i] = SC_DIGIT_ZERO; 19112027Sjungma@eit.uni-kl.de } 19212027Sjungma@eit.uni-kl.de // clean_tail(); 19312027Sjungma@eit.uni-kl.de return *this; 19412027Sjungma@eit.uni-kl.de } 19512027Sjungma@eit.uni-kl.de int wn = n / SC_DIGIT_SIZE; 19612027Sjungma@eit.uni-kl.de int bn = n % SC_DIGIT_SIZE; 19712027Sjungma@eit.uni-kl.de if( wn != 0 ) { 19812027Sjungma@eit.uni-kl.de // shift words 19912027Sjungma@eit.uni-kl.de int i = sz - 1; 20012027Sjungma@eit.uni-kl.de for( ; i >= wn; -- i ) { 20112027Sjungma@eit.uni-kl.de m_data[i] = m_data[i - wn]; 20212027Sjungma@eit.uni-kl.de } 20312027Sjungma@eit.uni-kl.de for( ; i >= 0; -- i ) { 20412027Sjungma@eit.uni-kl.de m_data[i] = SC_DIGIT_ZERO; 20512027Sjungma@eit.uni-kl.de } 20612027Sjungma@eit.uni-kl.de } 20712027Sjungma@eit.uni-kl.de if( bn != 0 ) { 20812027Sjungma@eit.uni-kl.de // shift bits 20912027Sjungma@eit.uni-kl.de for( int i = sz - 1; i >= 1; -- i ) { 21012027Sjungma@eit.uni-kl.de m_data[i] <<= bn; 21112027Sjungma@eit.uni-kl.de m_data[i] |= m_data[i - 1] >> (SC_DIGIT_SIZE - bn); 21212027Sjungma@eit.uni-kl.de } 21312027Sjungma@eit.uni-kl.de m_data[0] <<= bn; 21412027Sjungma@eit.uni-kl.de } 21512027Sjungma@eit.uni-kl.de clean_tail(); 21612027Sjungma@eit.uni-kl.de return *this; 21712027Sjungma@eit.uni-kl.de} 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.de 22012027Sjungma@eit.uni-kl.de// bitwise right shift 22112027Sjungma@eit.uni-kl.de 22212027Sjungma@eit.uni-kl.desc_bv_base& 22312027Sjungma@eit.uni-kl.desc_bv_base::operator >>= ( int n ) 22412027Sjungma@eit.uni-kl.de{ 22512027Sjungma@eit.uni-kl.de if( n < 0 ) { 22612027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 22712027Sjungma@eit.uni-kl.de std::sprintf( msg, 22812027Sjungma@eit.uni-kl.de "right shift operation is only allowed with positive " 22912027Sjungma@eit.uni-kl.de "shift values, shift value = %d", n ); 23012027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 23112027Sjungma@eit.uni-kl.de } 23212027Sjungma@eit.uni-kl.de int sz = m_size; 23312027Sjungma@eit.uni-kl.de if( n >= m_len ) { 23412027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 23512027Sjungma@eit.uni-kl.de m_data[i] = SC_DIGIT_ZERO; 23612027Sjungma@eit.uni-kl.de } 23712027Sjungma@eit.uni-kl.de // clean_tail(); 23812027Sjungma@eit.uni-kl.de return *this; 23912027Sjungma@eit.uni-kl.de } 24012027Sjungma@eit.uni-kl.de int wn = n / SC_DIGIT_SIZE; 24112027Sjungma@eit.uni-kl.de int bn = n % SC_DIGIT_SIZE; 24212027Sjungma@eit.uni-kl.de if( wn != 0 ) { 24312027Sjungma@eit.uni-kl.de // shift words 24412027Sjungma@eit.uni-kl.de int i = 0; 24512027Sjungma@eit.uni-kl.de for( ; i < (sz - wn); ++ i ) { 24612027Sjungma@eit.uni-kl.de m_data[i] = m_data[i + wn]; 24712027Sjungma@eit.uni-kl.de } 24812027Sjungma@eit.uni-kl.de for( ; i < sz; ++ i ) { 24912027Sjungma@eit.uni-kl.de m_data[i] = SC_DIGIT_ZERO; 25012027Sjungma@eit.uni-kl.de } 25112027Sjungma@eit.uni-kl.de } 25212027Sjungma@eit.uni-kl.de if( bn != 0 ) { 25312027Sjungma@eit.uni-kl.de // shift bits 25412027Sjungma@eit.uni-kl.de for( int i = 0; i < (sz - 1); ++ i ) { 25512027Sjungma@eit.uni-kl.de m_data[i] >>= bn; 25612027Sjungma@eit.uni-kl.de m_data[i] |= m_data[i + 1] << (SC_DIGIT_SIZE - bn); 25712027Sjungma@eit.uni-kl.de } 25812027Sjungma@eit.uni-kl.de m_data[sz - 1] >>= bn; 25912027Sjungma@eit.uni-kl.de } 26012027Sjungma@eit.uni-kl.de clean_tail(); 26112027Sjungma@eit.uni-kl.de return *this; 26212027Sjungma@eit.uni-kl.de} 26312027Sjungma@eit.uni-kl.de 26412027Sjungma@eit.uni-kl.de 26512027Sjungma@eit.uni-kl.de// bitwise left rotate 26612027Sjungma@eit.uni-kl.de 26712027Sjungma@eit.uni-kl.desc_bv_base& 26812027Sjungma@eit.uni-kl.desc_bv_base::lrotate( int n ) 26912027Sjungma@eit.uni-kl.de{ 27012027Sjungma@eit.uni-kl.de if( n < 0 ) { 27112027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 27212027Sjungma@eit.uni-kl.de std::sprintf( msg, 27312027Sjungma@eit.uni-kl.de "left rotate operation is only allowed with positive " 27412027Sjungma@eit.uni-kl.de "rotate values, rotate value = %d", n ); 27512027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 27612027Sjungma@eit.uni-kl.de } 27712027Sjungma@eit.uni-kl.de int len = m_len; 27812027Sjungma@eit.uni-kl.de n %= len; 27912027Sjungma@eit.uni-kl.de *this = (*this << n) | (*this >> (len - n)); 28012027Sjungma@eit.uni-kl.de return *this; 28112027Sjungma@eit.uni-kl.de} 28212027Sjungma@eit.uni-kl.de 28312027Sjungma@eit.uni-kl.de 28412027Sjungma@eit.uni-kl.de// bitwise right rotate 28512027Sjungma@eit.uni-kl.de 28612027Sjungma@eit.uni-kl.desc_bv_base& 28712027Sjungma@eit.uni-kl.desc_bv_base::rrotate( int n ) 28812027Sjungma@eit.uni-kl.de{ 28912027Sjungma@eit.uni-kl.de if( n < 0 ) { 29012027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 29112027Sjungma@eit.uni-kl.de std::sprintf( msg, 29212027Sjungma@eit.uni-kl.de "right rotate operation is only allowed with positive " 29312027Sjungma@eit.uni-kl.de "rotate values, rotate value = %d", n ); 29412027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 29512027Sjungma@eit.uni-kl.de } 29612027Sjungma@eit.uni-kl.de int len = m_len; 29712027Sjungma@eit.uni-kl.de n %= len; 29812027Sjungma@eit.uni-kl.de *this = (*this >> n) | (*this << (len - n)); 29912027Sjungma@eit.uni-kl.de return *this; 30012027Sjungma@eit.uni-kl.de} 30112027Sjungma@eit.uni-kl.de 30212027Sjungma@eit.uni-kl.de#endif 30312027Sjungma@eit.uni-kl.de 30412027Sjungma@eit.uni-kl.de 30512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 30612027Sjungma@eit.uni-kl.de 30712027Sjungma@eit.uni-kl.de// convert formatted string to binary string 30812027Sjungma@eit.uni-kl.de 30912027Sjungma@eit.uni-kl.deconst std::string 31012027Sjungma@eit.uni-kl.deconvert_to_bin( const char* s ) 31112027Sjungma@eit.uni-kl.de{ 31212027Sjungma@eit.uni-kl.de // Beware: logic character strings cannot start with '0x' or '0X', 31312027Sjungma@eit.uni-kl.de // because this is seen as a hexadecimal encoding prefix! 31412027Sjungma@eit.uni-kl.de 31512027Sjungma@eit.uni-kl.de if( s == 0 ) { 31612027Sjungma@eit.uni-kl.de SC_REPORT_ERROR(sc_core::SC_ID_CANNOT_CONVERT_, 31712027Sjungma@eit.uni-kl.de "character string is zero" ); 31812027Sjungma@eit.uni-kl.de } 31912027Sjungma@eit.uni-kl.de if( *s == 0 ) { 32012027Sjungma@eit.uni-kl.de SC_REPORT_ERROR(sc_core::SC_ID_CANNOT_CONVERT_, 32112027Sjungma@eit.uni-kl.de "character string is empty"); 32212027Sjungma@eit.uni-kl.de } 32312027Sjungma@eit.uni-kl.de 32412027Sjungma@eit.uni-kl.de int n = strlen( s ); 32512027Sjungma@eit.uni-kl.de int i = 0; 32612027Sjungma@eit.uni-kl.de if( s[0] == '-' || s[0] == '+' ) { 32712027Sjungma@eit.uni-kl.de ++ i; 32812027Sjungma@eit.uni-kl.de } 32912027Sjungma@eit.uni-kl.de if( n > (i + 2) && s[i] == '0' ) 33012027Sjungma@eit.uni-kl.de { 33112027Sjungma@eit.uni-kl.de if (s[i+1] == 'b' || s[i+1] == 'B' ) 33212027Sjungma@eit.uni-kl.de { 33312027Sjungma@eit.uni-kl.de if ( s[i+2] == '0' || s[i+2] == '1' ) 33412027Sjungma@eit.uni-kl.de { 33512027Sjungma@eit.uni-kl.de std::string str( &s[2] ); 33612027Sjungma@eit.uni-kl.de str += "F"; 33712027Sjungma@eit.uni-kl.de return str; 33812027Sjungma@eit.uni-kl.de } 33912027Sjungma@eit.uni-kl.de } 34012027Sjungma@eit.uni-kl.de if ( s[i+1] == 'b' || s[i+1] == 'B' || 34112027Sjungma@eit.uni-kl.de s[i+1] == 'c' || s[i+1] == 'C' || 34212027Sjungma@eit.uni-kl.de s[i+1] == 'd' || s[i+1] == 'D' || 34312027Sjungma@eit.uni-kl.de s[i+1] == 'o' || s[i+1] == 'O' || 34412027Sjungma@eit.uni-kl.de s[i+1] == 'x' || s[i+1] == 'X') 34512027Sjungma@eit.uni-kl.de { 34612027Sjungma@eit.uni-kl.de try { 34712027Sjungma@eit.uni-kl.de // worst case length = n * 4 34812027Sjungma@eit.uni-kl.de sc_fix a( s, n * 4, n * 4, SC_TRN, SC_WRAP, 0, SC_ON ); 34912027Sjungma@eit.uni-kl.de std::string str = a.to_bin(); 35012027Sjungma@eit.uni-kl.de str += "F"; // mark the string as formatted 35112027Sjungma@eit.uni-kl.de // get rid of prefix (0b) and redundant leading bits 35212027Sjungma@eit.uni-kl.de const char* p = str.c_str() + 2; 35312027Sjungma@eit.uni-kl.de while( p[1] && p[0] == p[1] ) { 35412027Sjungma@eit.uni-kl.de ++ p; 35512027Sjungma@eit.uni-kl.de } 35612027Sjungma@eit.uni-kl.de return std::string( p ); 35712027Sjungma@eit.uni-kl.de } catch( sc_core::sc_report ) { 35812027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 35912027Sjungma@eit.uni-kl.de std::sprintf( msg, "character string '%s' is not valid", s ); 36012027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_CANNOT_CONVERT_, msg ); 36112027Sjungma@eit.uni-kl.de // never reached 36212027Sjungma@eit.uni-kl.de return std::string(); 36312027Sjungma@eit.uni-kl.de } 36412027Sjungma@eit.uni-kl.de } 36512027Sjungma@eit.uni-kl.de 36612027Sjungma@eit.uni-kl.de } 36712027Sjungma@eit.uni-kl.de 36812027Sjungma@eit.uni-kl.de // bin by default 36912027Sjungma@eit.uni-kl.de 37012027Sjungma@eit.uni-kl.de std::string str( s ); 37112027Sjungma@eit.uni-kl.de str += "U"; // mark the string as unformatted 37212027Sjungma@eit.uni-kl.de return str; 37312027Sjungma@eit.uni-kl.de} 37412027Sjungma@eit.uni-kl.de 37512027Sjungma@eit.uni-kl.de// convert binary string to formatted string 37612027Sjungma@eit.uni-kl.de 37712027Sjungma@eit.uni-kl.deconst std::string 37812027Sjungma@eit.uni-kl.deconvert_to_fmt( const std::string& s, sc_numrep numrep, bool w_prefix ) 37912027Sjungma@eit.uni-kl.de{ 38012027Sjungma@eit.uni-kl.de int n = s.length(); 38112027Sjungma@eit.uni-kl.de std::string str("0bus"); 38212027Sjungma@eit.uni-kl.de // str += "0bus"; 38312027Sjungma@eit.uni-kl.de str += s; 38412027Sjungma@eit.uni-kl.de sc_ufix a( str.c_str(), n, n, SC_TRN, SC_WRAP, 0, SC_ON ); 38512027Sjungma@eit.uni-kl.de return a.to_string( numrep, w_prefix ); 38612027Sjungma@eit.uni-kl.de} 38712027Sjungma@eit.uni-kl.de 38812027Sjungma@eit.uni-kl.de} // namespace sc_dt 389