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