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_fxnum.cpp -
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Martin Janssen, 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_fxnum.cpp,v $
4012027Sjungma@eit.uni-kl.de// Revision 1.3  2011/01/19 18:57:40  acg
4112027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for IEEE_1666_2011.
4212027Sjungma@eit.uni-kl.de//
4312027Sjungma@eit.uni-kl.de// Revision 1.2  2010/12/07 20:09:08  acg
4412027Sjungma@eit.uni-kl.de// Andy Goodrich: Philipp Hartmann's constructor disambiguation fix
4512027Sjungma@eit.uni-kl.de//
4612027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:04  acg
4712027Sjungma@eit.uni-kl.de// SystemC 2.3
4812027Sjungma@eit.uni-kl.de//
4912027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:53:57  acg
5012027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in
5112027Sjungma@eit.uni-kl.de// the source.
5212027Sjungma@eit.uni-kl.de//
5312027Sjungma@eit.uni-kl.de
5412027Sjungma@eit.uni-kl.de#include <math.h>
5512027Sjungma@eit.uni-kl.de
5612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_fxnum.h"
5712027Sjungma@eit.uni-kl.de
5812027Sjungma@eit.uni-kl.de
5912027Sjungma@eit.uni-kl.denamespace sc_dt
6012027Sjungma@eit.uni-kl.de{
6112027Sjungma@eit.uni-kl.de
6212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
6312027Sjungma@eit.uni-kl.de//  CLASS : sc_fxnum_bitref
6412027Sjungma@eit.uni-kl.de//
6512027Sjungma@eit.uni-kl.de//  Proxy class for bit-selection in class sc_fxnum, behaves like sc_bit.
6612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
6712027Sjungma@eit.uni-kl.de
6812027Sjungma@eit.uni-kl.debool
6912027Sjungma@eit.uni-kl.desc_fxnum_bitref::get() const
7012027Sjungma@eit.uni-kl.de{
7112027Sjungma@eit.uni-kl.de    return m_num.get_bit( m_idx );
7212027Sjungma@eit.uni-kl.de}
7312027Sjungma@eit.uni-kl.de
7412027Sjungma@eit.uni-kl.devoid
7512027Sjungma@eit.uni-kl.desc_fxnum_bitref::set( bool high )
7612027Sjungma@eit.uni-kl.de{
7712027Sjungma@eit.uni-kl.de    m_num.set_bit( m_idx, high );
7812027Sjungma@eit.uni-kl.de}
7912027Sjungma@eit.uni-kl.de
8012027Sjungma@eit.uni-kl.de
8112027Sjungma@eit.uni-kl.de// print or dump content
8212027Sjungma@eit.uni-kl.de
8312027Sjungma@eit.uni-kl.devoid
8412027Sjungma@eit.uni-kl.desc_fxnum_bitref::print( ::std::ostream& os ) const
8512027Sjungma@eit.uni-kl.de{
8612027Sjungma@eit.uni-kl.de    os << get();
8712027Sjungma@eit.uni-kl.de}
8812027Sjungma@eit.uni-kl.de
8912027Sjungma@eit.uni-kl.devoid
9012027Sjungma@eit.uni-kl.desc_fxnum_bitref::scan( ::std::istream& is )
9112027Sjungma@eit.uni-kl.de{
9212027Sjungma@eit.uni-kl.de    bool b;
9312027Sjungma@eit.uni-kl.de    is >> b;
9412027Sjungma@eit.uni-kl.de    *this = b;
9512027Sjungma@eit.uni-kl.de}
9612027Sjungma@eit.uni-kl.de
9712027Sjungma@eit.uni-kl.devoid
9812027Sjungma@eit.uni-kl.desc_fxnum_bitref::dump( ::std::ostream& os ) const
9912027Sjungma@eit.uni-kl.de{
10012027Sjungma@eit.uni-kl.de    os << "sc_fxnum_bitref" << ::std::endl;
10112027Sjungma@eit.uni-kl.de    os << "(" << ::std::endl;
10212027Sjungma@eit.uni-kl.de    os << "num = ";
10312027Sjungma@eit.uni-kl.de    m_num.dump( os );
10412027Sjungma@eit.uni-kl.de    os << "idx = " << m_idx << ::std::endl;
10512027Sjungma@eit.uni-kl.de    os << ")" << ::std::endl;
10612027Sjungma@eit.uni-kl.de}
10712027Sjungma@eit.uni-kl.de
10812027Sjungma@eit.uni-kl.de
10912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
11012027Sjungma@eit.uni-kl.de//  CLASS : sc_fxnum_fast_bitref
11112027Sjungma@eit.uni-kl.de//
11212027Sjungma@eit.uni-kl.de//  Proxy class for bit-selection in class sc_fxnum_fast, behaves like sc_bit.
11312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
11412027Sjungma@eit.uni-kl.de
11512027Sjungma@eit.uni-kl.debool
11612027Sjungma@eit.uni-kl.desc_fxnum_fast_bitref::get() const
11712027Sjungma@eit.uni-kl.de{
11812027Sjungma@eit.uni-kl.de    return m_num.get_bit( m_idx );
11912027Sjungma@eit.uni-kl.de}
12012027Sjungma@eit.uni-kl.de
12112027Sjungma@eit.uni-kl.devoid
12212027Sjungma@eit.uni-kl.desc_fxnum_fast_bitref::set( bool high )
12312027Sjungma@eit.uni-kl.de{
12412027Sjungma@eit.uni-kl.de    m_num.set_bit( m_idx, high );
12512027Sjungma@eit.uni-kl.de}
12612027Sjungma@eit.uni-kl.de
12712027Sjungma@eit.uni-kl.de
12812027Sjungma@eit.uni-kl.de// print or dump content
12912027Sjungma@eit.uni-kl.de
13012027Sjungma@eit.uni-kl.devoid
13112027Sjungma@eit.uni-kl.desc_fxnum_fast_bitref::print( ::std::ostream& os ) const
13212027Sjungma@eit.uni-kl.de{
13312027Sjungma@eit.uni-kl.de    os << get();
13412027Sjungma@eit.uni-kl.de}
13512027Sjungma@eit.uni-kl.de
13612027Sjungma@eit.uni-kl.devoid
13712027Sjungma@eit.uni-kl.desc_fxnum_fast_bitref::scan( ::std::istream& is )
13812027Sjungma@eit.uni-kl.de{
13912027Sjungma@eit.uni-kl.de    bool b;
14012027Sjungma@eit.uni-kl.de    is >> b;
14112027Sjungma@eit.uni-kl.de    *this = b;
14212027Sjungma@eit.uni-kl.de}
14312027Sjungma@eit.uni-kl.de
14412027Sjungma@eit.uni-kl.devoid
14512027Sjungma@eit.uni-kl.desc_fxnum_fast_bitref::dump( ::std::ostream& os ) const
14612027Sjungma@eit.uni-kl.de{
14712027Sjungma@eit.uni-kl.de    os << "sc_fxnum_fast_bitref" << ::std::endl;
14812027Sjungma@eit.uni-kl.de    os << "(" << ::std::endl;
14912027Sjungma@eit.uni-kl.de    os << "num = ";
15012027Sjungma@eit.uni-kl.de    m_num.dump( os );
15112027Sjungma@eit.uni-kl.de    os << "idx = " << m_idx << ::std::endl;
15212027Sjungma@eit.uni-kl.de    os << ")" << ::std::endl;
15312027Sjungma@eit.uni-kl.de}
15412027Sjungma@eit.uni-kl.de
15512027Sjungma@eit.uni-kl.de
15612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
15712027Sjungma@eit.uni-kl.de//  CLASS : sc_fxnum_subref
15812027Sjungma@eit.uni-kl.de//
15912027Sjungma@eit.uni-kl.de//  Proxy class for part-selection in class sc_fxnum,
16012027Sjungma@eit.uni-kl.de//  behaves like sc_bv_base.
16112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
16212027Sjungma@eit.uni-kl.de
16312027Sjungma@eit.uni-kl.debool
16412027Sjungma@eit.uni-kl.desc_fxnum_subref::get() const
16512027Sjungma@eit.uni-kl.de{
16612027Sjungma@eit.uni-kl.de    return m_num.get_slice( m_from, m_to, m_bv );
16712027Sjungma@eit.uni-kl.de}
16812027Sjungma@eit.uni-kl.de
16912027Sjungma@eit.uni-kl.debool
17012027Sjungma@eit.uni-kl.desc_fxnum_subref::set()
17112027Sjungma@eit.uni-kl.de{
17212027Sjungma@eit.uni-kl.de    return m_num.set_slice( m_from, m_to, m_bv );
17312027Sjungma@eit.uni-kl.de}
17412027Sjungma@eit.uni-kl.de
17512027Sjungma@eit.uni-kl.de
17612027Sjungma@eit.uni-kl.de// print or dump content
17712027Sjungma@eit.uni-kl.de
17812027Sjungma@eit.uni-kl.devoid
17912027Sjungma@eit.uni-kl.desc_fxnum_subref::print( ::std::ostream& os ) const
18012027Sjungma@eit.uni-kl.de{
18112027Sjungma@eit.uni-kl.de    get();
18212027Sjungma@eit.uni-kl.de    m_bv.print( os );
18312027Sjungma@eit.uni-kl.de}
18412027Sjungma@eit.uni-kl.de
18512027Sjungma@eit.uni-kl.devoid
18612027Sjungma@eit.uni-kl.desc_fxnum_subref::scan( ::std::istream& is )
18712027Sjungma@eit.uni-kl.de{
18812027Sjungma@eit.uni-kl.de    m_bv.scan( is );
18912027Sjungma@eit.uni-kl.de    set();
19012027Sjungma@eit.uni-kl.de}
19112027Sjungma@eit.uni-kl.de
19212027Sjungma@eit.uni-kl.devoid
19312027Sjungma@eit.uni-kl.desc_fxnum_subref::dump( ::std::ostream& os ) const
19412027Sjungma@eit.uni-kl.de{
19512027Sjungma@eit.uni-kl.de    os << "sc_fxnum_subref" << ::std::endl;
19612027Sjungma@eit.uni-kl.de    os << "(" << ::std::endl;
19712027Sjungma@eit.uni-kl.de    os << "num  = ";
19812027Sjungma@eit.uni-kl.de    m_num.dump( os );
19912027Sjungma@eit.uni-kl.de    os << "from = " << m_from << ::std::endl;
20012027Sjungma@eit.uni-kl.de    os << "to   = " << m_to << ::std::endl;
20112027Sjungma@eit.uni-kl.de    os << ")" << ::std::endl;
20212027Sjungma@eit.uni-kl.de}
20312027Sjungma@eit.uni-kl.de
20412027Sjungma@eit.uni-kl.de
20512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
20612027Sjungma@eit.uni-kl.de//  CLASS : sc_fxnum_fast_subref
20712027Sjungma@eit.uni-kl.de//
20812027Sjungma@eit.uni-kl.de//  Proxy class for part-selection in class sc_fxnum_fast,
20912027Sjungma@eit.uni-kl.de//  behaves like sc_bv_base.
21012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
21112027Sjungma@eit.uni-kl.de
21212027Sjungma@eit.uni-kl.debool
21312027Sjungma@eit.uni-kl.desc_fxnum_fast_subref::get() const
21412027Sjungma@eit.uni-kl.de{
21512027Sjungma@eit.uni-kl.de    return m_num.get_slice( m_from, m_to, m_bv );
21612027Sjungma@eit.uni-kl.de}
21712027Sjungma@eit.uni-kl.de
21812027Sjungma@eit.uni-kl.debool
21912027Sjungma@eit.uni-kl.desc_fxnum_fast_subref::set()
22012027Sjungma@eit.uni-kl.de{
22112027Sjungma@eit.uni-kl.de    return m_num.set_slice( m_from, m_to, m_bv );
22212027Sjungma@eit.uni-kl.de}
22312027Sjungma@eit.uni-kl.de
22412027Sjungma@eit.uni-kl.de
22512027Sjungma@eit.uni-kl.de// print or dump content
22612027Sjungma@eit.uni-kl.de
22712027Sjungma@eit.uni-kl.devoid
22812027Sjungma@eit.uni-kl.desc_fxnum_fast_subref::print( ::std::ostream& os ) const
22912027Sjungma@eit.uni-kl.de{
23012027Sjungma@eit.uni-kl.de    get();
23112027Sjungma@eit.uni-kl.de    m_bv.print( os );
23212027Sjungma@eit.uni-kl.de}
23312027Sjungma@eit.uni-kl.de
23412027Sjungma@eit.uni-kl.devoid
23512027Sjungma@eit.uni-kl.desc_fxnum_fast_subref::scan( ::std::istream& is )
23612027Sjungma@eit.uni-kl.de{
23712027Sjungma@eit.uni-kl.de    m_bv.scan( is );
23812027Sjungma@eit.uni-kl.de    set();
23912027Sjungma@eit.uni-kl.de}
24012027Sjungma@eit.uni-kl.de
24112027Sjungma@eit.uni-kl.devoid
24212027Sjungma@eit.uni-kl.desc_fxnum_fast_subref::dump( ::std::ostream& os ) const
24312027Sjungma@eit.uni-kl.de{
24412027Sjungma@eit.uni-kl.de    os << "sc_fxnum_fast_subref" << ::std::endl;
24512027Sjungma@eit.uni-kl.de    os << "(" << ::std::endl;
24612027Sjungma@eit.uni-kl.de    os << "num  = ";
24712027Sjungma@eit.uni-kl.de    m_num.dump( os );
24812027Sjungma@eit.uni-kl.de    os << "from = " << m_from << ::std::endl;
24912027Sjungma@eit.uni-kl.de    os << "to   = " << m_to << ::std::endl;
25012027Sjungma@eit.uni-kl.de    os << ")" << ::std::endl;
25112027Sjungma@eit.uni-kl.de}
25212027Sjungma@eit.uni-kl.de
25312027Sjungma@eit.uni-kl.de
25412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
25512027Sjungma@eit.uni-kl.de//  CLASS : sc_fxnum
25612027Sjungma@eit.uni-kl.de//
25712027Sjungma@eit.uni-kl.de//  Base class for the fixed-point types; arbitrary precision.
25812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
25912027Sjungma@eit.uni-kl.de
26012027Sjungma@eit.uni-kl.de// explicit conversion to character string
26112027Sjungma@eit.uni-kl.de
26212027Sjungma@eit.uni-kl.deconst std::string
26312027Sjungma@eit.uni-kl.desc_fxnum::to_string() const
26412027Sjungma@eit.uni-kl.de{
26512027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_DEC, -1, SC_F, &m_params ) );
26612027Sjungma@eit.uni-kl.de}
26712027Sjungma@eit.uni-kl.de
26812027Sjungma@eit.uni-kl.deconst std::string
26912027Sjungma@eit.uni-kl.desc_fxnum::to_string( sc_numrep numrep ) const
27012027Sjungma@eit.uni-kl.de{
27112027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( numrep, -1, SC_F, &m_params ) );
27212027Sjungma@eit.uni-kl.de}
27312027Sjungma@eit.uni-kl.de
27412027Sjungma@eit.uni-kl.deconst std::string
27512027Sjungma@eit.uni-kl.desc_fxnum::to_string( sc_numrep numrep, bool w_prefix ) const
27612027Sjungma@eit.uni-kl.de{
27712027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( numrep, (w_prefix ? 1 : 0),
27812027Sjungma@eit.uni-kl.de					SC_F, &m_params ) );
27912027Sjungma@eit.uni-kl.de}
28012027Sjungma@eit.uni-kl.de
28112027Sjungma@eit.uni-kl.deconst std::string
28212027Sjungma@eit.uni-kl.desc_fxnum::to_string( sc_fmt fmt ) const
28312027Sjungma@eit.uni-kl.de{
28412027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_DEC, -1, fmt, &m_params ) );
28512027Sjungma@eit.uni-kl.de}
28612027Sjungma@eit.uni-kl.de
28712027Sjungma@eit.uni-kl.deconst std::string
28812027Sjungma@eit.uni-kl.desc_fxnum::to_string( sc_numrep numrep, sc_fmt fmt ) const
28912027Sjungma@eit.uni-kl.de{
29012027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( numrep, -1, fmt, &m_params ) );
29112027Sjungma@eit.uni-kl.de}
29212027Sjungma@eit.uni-kl.de
29312027Sjungma@eit.uni-kl.deconst std::string
29412027Sjungma@eit.uni-kl.desc_fxnum::to_string( sc_numrep numrep, bool w_prefix, sc_fmt fmt ) const
29512027Sjungma@eit.uni-kl.de{
29612027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( numrep, (w_prefix ? 1 : 0),
29712027Sjungma@eit.uni-kl.de					fmt, &m_params ) );
29812027Sjungma@eit.uni-kl.de}
29912027Sjungma@eit.uni-kl.de
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.deconst std::string
30212027Sjungma@eit.uni-kl.desc_fxnum::to_dec() const
30312027Sjungma@eit.uni-kl.de{
30412027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_DEC, -1, SC_F, &m_params ) );
30512027Sjungma@eit.uni-kl.de}
30612027Sjungma@eit.uni-kl.de
30712027Sjungma@eit.uni-kl.deconst std::string
30812027Sjungma@eit.uni-kl.desc_fxnum::to_bin() const
30912027Sjungma@eit.uni-kl.de{
31012027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_BIN, -1, SC_F, &m_params ) );
31112027Sjungma@eit.uni-kl.de}
31212027Sjungma@eit.uni-kl.de
31312027Sjungma@eit.uni-kl.deconst std::string
31412027Sjungma@eit.uni-kl.desc_fxnum::to_oct() const
31512027Sjungma@eit.uni-kl.de{
31612027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_OCT, -1, SC_F, &m_params ) );
31712027Sjungma@eit.uni-kl.de}
31812027Sjungma@eit.uni-kl.de
31912027Sjungma@eit.uni-kl.deconst std::string
32012027Sjungma@eit.uni-kl.desc_fxnum::to_hex() const
32112027Sjungma@eit.uni-kl.de{
32212027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_HEX, -1, SC_F, &m_params ) );
32312027Sjungma@eit.uni-kl.de}
32412027Sjungma@eit.uni-kl.de
32512027Sjungma@eit.uni-kl.de
32612027Sjungma@eit.uni-kl.de// print or dump content
32712027Sjungma@eit.uni-kl.de
32812027Sjungma@eit.uni-kl.devoid
32912027Sjungma@eit.uni-kl.desc_fxnum::print( ::std::ostream& os ) const
33012027Sjungma@eit.uni-kl.de{
33112027Sjungma@eit.uni-kl.de    os << m_rep->to_string( SC_DEC, -1, SC_F, &m_params );
33212027Sjungma@eit.uni-kl.de}
33312027Sjungma@eit.uni-kl.de
33412027Sjungma@eit.uni-kl.devoid
33512027Sjungma@eit.uni-kl.desc_fxnum::scan( ::std::istream& is )
33612027Sjungma@eit.uni-kl.de{
33712027Sjungma@eit.uni-kl.de    std::string s;
33812027Sjungma@eit.uni-kl.de    is >> s;
33912027Sjungma@eit.uni-kl.de    *this = s.c_str();
34012027Sjungma@eit.uni-kl.de}
34112027Sjungma@eit.uni-kl.de
34212027Sjungma@eit.uni-kl.devoid
34312027Sjungma@eit.uni-kl.desc_fxnum::dump( ::std::ostream& os ) const
34412027Sjungma@eit.uni-kl.de{
34512027Sjungma@eit.uni-kl.de    os << "sc_fxnum" << ::std::endl;
34612027Sjungma@eit.uni-kl.de    os << "(" << ::std::endl;
34712027Sjungma@eit.uni-kl.de    os << "rep      = ";
34812027Sjungma@eit.uni-kl.de    m_rep->dump( os );
34912027Sjungma@eit.uni-kl.de    os << "params   = ";
35012027Sjungma@eit.uni-kl.de    m_params.dump( os );
35112027Sjungma@eit.uni-kl.de    os << "q_flag   = " << m_q_flag << ::std::endl;
35212027Sjungma@eit.uni-kl.de    os << "o_flag   = " << m_o_flag << ::std::endl;
35312027Sjungma@eit.uni-kl.de    // TO BE COMPLETED
35412027Sjungma@eit.uni-kl.de    // os << "observer = ";
35512027Sjungma@eit.uni-kl.de    // if( m_observer != 0 )
35612027Sjungma@eit.uni-kl.de    //     m_observer->dump( os );
35712027Sjungma@eit.uni-kl.de    // else
35812027Sjungma@eit.uni-kl.de    //     os << "0" << ::std::endl;
35912027Sjungma@eit.uni-kl.de    os << ")" << ::std::endl;
36012027Sjungma@eit.uni-kl.de}
36112027Sjungma@eit.uni-kl.de
36212027Sjungma@eit.uni-kl.de
36312027Sjungma@eit.uni-kl.desc_fxnum_observer*
36412027Sjungma@eit.uni-kl.desc_fxnum::lock_observer() const
36512027Sjungma@eit.uni-kl.de{
36612027Sjungma@eit.uni-kl.de    SC_ASSERT_( m_observer != 0, "lock observer failed" );
36712027Sjungma@eit.uni-kl.de    sc_fxnum_observer* tmp = m_observer;
36812027Sjungma@eit.uni-kl.de    m_observer = 0;
36912027Sjungma@eit.uni-kl.de    return tmp;
37012027Sjungma@eit.uni-kl.de}
37112027Sjungma@eit.uni-kl.de
37212027Sjungma@eit.uni-kl.devoid
37312027Sjungma@eit.uni-kl.desc_fxnum::unlock_observer( sc_fxnum_observer* observer_ ) const
37412027Sjungma@eit.uni-kl.de{
37512027Sjungma@eit.uni-kl.de    SC_ASSERT_( observer_ != 0, "unlock observer failed" );
37612027Sjungma@eit.uni-kl.de    m_observer = observer_;
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//  CLASS : sc_fxnum_fast
38212027Sjungma@eit.uni-kl.de//
38312027Sjungma@eit.uni-kl.de//  Base class for the fixed-point types; limited precision.
38412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
38512027Sjungma@eit.uni-kl.de
38612027Sjungma@eit.uni-kl.destatic
38712027Sjungma@eit.uni-kl.devoid
38812027Sjungma@eit.uni-kl.dequantization( double& c, const scfx_params& params, bool& q_flag )
38912027Sjungma@eit.uni-kl.de{
39012027Sjungma@eit.uni-kl.de    int fwl = params.wl() - params.iwl();
39112027Sjungma@eit.uni-kl.de    double scale = scfx_pow2( fwl );
39212027Sjungma@eit.uni-kl.de    double val = scale * c;
39312027Sjungma@eit.uni-kl.de    double int_part;
39412027Sjungma@eit.uni-kl.de    double frac_part = modf( val, &int_part );
39512027Sjungma@eit.uni-kl.de
39612027Sjungma@eit.uni-kl.de    q_flag = ( frac_part != 0.0 );
39712027Sjungma@eit.uni-kl.de
39812027Sjungma@eit.uni-kl.de    if( q_flag )
39912027Sjungma@eit.uni-kl.de    {
40012027Sjungma@eit.uni-kl.de        val = int_part;
40112027Sjungma@eit.uni-kl.de
40212027Sjungma@eit.uni-kl.de	switch( params.q_mode() )
40312027Sjungma@eit.uni-kl.de	{
40412027Sjungma@eit.uni-kl.de            case SC_TRN:			// truncation
40512027Sjungma@eit.uni-kl.de	    {
40612027Sjungma@eit.uni-kl.de	        if( c < 0.0 )
40712027Sjungma@eit.uni-kl.de		    val -= 1.0;
40812027Sjungma@eit.uni-kl.de		break;
40912027Sjungma@eit.uni-kl.de	    }
41012027Sjungma@eit.uni-kl.de            case SC_RND:			// rounding to plus infinity
41112027Sjungma@eit.uni-kl.de	    {
41212027Sjungma@eit.uni-kl.de		if( frac_part >= 0.5 )
41312027Sjungma@eit.uni-kl.de		    val += 1.0;
41412027Sjungma@eit.uni-kl.de		else if( frac_part < -0.5 )
41512027Sjungma@eit.uni-kl.de		    val -= 1.0;
41612027Sjungma@eit.uni-kl.de		break;
41712027Sjungma@eit.uni-kl.de	    }
41812027Sjungma@eit.uni-kl.de            case SC_TRN_ZERO:			// truncation to zero
41912027Sjungma@eit.uni-kl.de	    {
42012027Sjungma@eit.uni-kl.de	        break;
42112027Sjungma@eit.uni-kl.de	    }
42212027Sjungma@eit.uni-kl.de            case SC_RND_INF:			// rounding to infinity
42312027Sjungma@eit.uni-kl.de	    {
42412027Sjungma@eit.uni-kl.de		if( frac_part >= 0.5 )
42512027Sjungma@eit.uni-kl.de		    val += 1.0;
42612027Sjungma@eit.uni-kl.de		else if( frac_part <= -0.5 )
42712027Sjungma@eit.uni-kl.de		    val -= 1.0;
42812027Sjungma@eit.uni-kl.de		break;
42912027Sjungma@eit.uni-kl.de	    }
43012027Sjungma@eit.uni-kl.de            case SC_RND_CONV:			// convergent rounding
43112027Sjungma@eit.uni-kl.de	    {
43212027Sjungma@eit.uni-kl.de		if( frac_part > 0.5 ||
43312027Sjungma@eit.uni-kl.de		    ( frac_part == 0.5 && fmod( int_part, 2.0 ) != 0.0 ) )
43412027Sjungma@eit.uni-kl.de		    val += 1.0;
43512027Sjungma@eit.uni-kl.de		else if( frac_part < -0.5 ||
43612027Sjungma@eit.uni-kl.de			 ( frac_part == -0.5 && fmod( int_part, 2.0 ) != 0.0 ) )
43712027Sjungma@eit.uni-kl.de		    val -= 1.0;
43812027Sjungma@eit.uni-kl.de		break;
43912027Sjungma@eit.uni-kl.de	    }
44012027Sjungma@eit.uni-kl.de            case SC_RND_ZERO:			// rounding to zero
44112027Sjungma@eit.uni-kl.de	    {
44212027Sjungma@eit.uni-kl.de		if( frac_part > 0.5 )
44312027Sjungma@eit.uni-kl.de		    val += 1.0;
44412027Sjungma@eit.uni-kl.de		else if( frac_part < -0.5 )
44512027Sjungma@eit.uni-kl.de		    val -= 1.0;
44612027Sjungma@eit.uni-kl.de		break;
44712027Sjungma@eit.uni-kl.de	    }
44812027Sjungma@eit.uni-kl.de            case SC_RND_MIN_INF:		// rounding to minus infinity
44912027Sjungma@eit.uni-kl.de	    {
45012027Sjungma@eit.uni-kl.de		if( frac_part > 0.5 )
45112027Sjungma@eit.uni-kl.de		    val += 1.0;
45212027Sjungma@eit.uni-kl.de		else if( frac_part <= -0.5 )
45312027Sjungma@eit.uni-kl.de		    val -= 1.0;
45412027Sjungma@eit.uni-kl.de		break;
45512027Sjungma@eit.uni-kl.de	    }
45612027Sjungma@eit.uni-kl.de            default:
45712027Sjungma@eit.uni-kl.de	        ;
45812027Sjungma@eit.uni-kl.de	}
45912027Sjungma@eit.uni-kl.de    }
46012027Sjungma@eit.uni-kl.de
46112027Sjungma@eit.uni-kl.de    val /= scale;
46212027Sjungma@eit.uni-kl.de    c = val;
46312027Sjungma@eit.uni-kl.de}
46412027Sjungma@eit.uni-kl.de
46512027Sjungma@eit.uni-kl.destatic
46612027Sjungma@eit.uni-kl.devoid
46712027Sjungma@eit.uni-kl.deoverflow( double& c, const scfx_params& params, bool& o_flag )
46812027Sjungma@eit.uni-kl.de{
46912027Sjungma@eit.uni-kl.de    int iwl = params.iwl();
47012027Sjungma@eit.uni-kl.de    int fwl = params.wl() - iwl;
47112027Sjungma@eit.uni-kl.de    double full_circle = scfx_pow2( iwl );
47212027Sjungma@eit.uni-kl.de    double resolution = scfx_pow2( -fwl );
47312027Sjungma@eit.uni-kl.de    double low, high;
47412027Sjungma@eit.uni-kl.de    if( params.enc() == SC_TC_ )
47512027Sjungma@eit.uni-kl.de    {
47612027Sjungma@eit.uni-kl.de	high = full_circle / 2.0 - resolution;
47712027Sjungma@eit.uni-kl.de	if( params.o_mode() == SC_SAT_SYM )
47812027Sjungma@eit.uni-kl.de	    low = - high;
47912027Sjungma@eit.uni-kl.de	else
48012027Sjungma@eit.uni-kl.de	    low = - full_circle / 2.0;
48112027Sjungma@eit.uni-kl.de    }
48212027Sjungma@eit.uni-kl.de    else
48312027Sjungma@eit.uni-kl.de    {
48412027Sjungma@eit.uni-kl.de	low = 0.0;
48512027Sjungma@eit.uni-kl.de	high = full_circle - resolution;
48612027Sjungma@eit.uni-kl.de    }
48712027Sjungma@eit.uni-kl.de    double val = c;
48812027Sjungma@eit.uni-kl.de    sc_fxval_fast c2(c);
48912027Sjungma@eit.uni-kl.de
49012027Sjungma@eit.uni-kl.de    bool under = ( val < low );
49112027Sjungma@eit.uni-kl.de    bool over = ( val > high );
49212027Sjungma@eit.uni-kl.de
49312027Sjungma@eit.uni-kl.de    o_flag = ( under || over );
49412027Sjungma@eit.uni-kl.de
49512027Sjungma@eit.uni-kl.de    if( o_flag )
49612027Sjungma@eit.uni-kl.de    {
49712027Sjungma@eit.uni-kl.de        switch( params.o_mode() )
49812027Sjungma@eit.uni-kl.de	{
49912027Sjungma@eit.uni-kl.de            case SC_WRAP:			// wrap-around
50012027Sjungma@eit.uni-kl.de	    {
50112027Sjungma@eit.uni-kl.de		int n_bits = params.n_bits();
50212027Sjungma@eit.uni-kl.de
50312027Sjungma@eit.uni-kl.de	        if( n_bits == 0 )
50412027Sjungma@eit.uni-kl.de		{
50512027Sjungma@eit.uni-kl.de		    // wrap-around all 'wl' bits
50612027Sjungma@eit.uni-kl.de		    val -= floor( val / full_circle ) * full_circle;
50712027Sjungma@eit.uni-kl.de		    if( val > high )
50812027Sjungma@eit.uni-kl.de			val -= full_circle;
50912027Sjungma@eit.uni-kl.de		}
51012027Sjungma@eit.uni-kl.de		else if( n_bits < params.wl() )
51112027Sjungma@eit.uni-kl.de		{
51212027Sjungma@eit.uni-kl.de		    double X = scfx_pow2( iwl - n_bits );
51312027Sjungma@eit.uni-kl.de
51412027Sjungma@eit.uni-kl.de		    // wrap-around least significant 'wl - n_bits' bits
51512027Sjungma@eit.uni-kl.de		    val -= floor( val / X ) * X;
51612027Sjungma@eit.uni-kl.de		    if( val > ( X - resolution ) )
51712027Sjungma@eit.uni-kl.de			val -= X;
51812027Sjungma@eit.uni-kl.de
51912027Sjungma@eit.uni-kl.de		    // saturate most significant 'n_bits' bits
52012027Sjungma@eit.uni-kl.de		    if( under )
52112027Sjungma@eit.uni-kl.de		        val += low;
52212027Sjungma@eit.uni-kl.de		    else
52312027Sjungma@eit.uni-kl.de		    {
52412027Sjungma@eit.uni-kl.de		        if( params.enc() == SC_TC_ )
52512027Sjungma@eit.uni-kl.de			    val += full_circle / 2.0 - X;
52612027Sjungma@eit.uni-kl.de			else
52712027Sjungma@eit.uni-kl.de			    val += full_circle - X;
52812027Sjungma@eit.uni-kl.de		    }
52912027Sjungma@eit.uni-kl.de		}
53012027Sjungma@eit.uni-kl.de		else
53112027Sjungma@eit.uni-kl.de		{
53212027Sjungma@eit.uni-kl.de		    // saturate all 'wl' bits
53312027Sjungma@eit.uni-kl.de		    if( under )
53412027Sjungma@eit.uni-kl.de			val = low;
53512027Sjungma@eit.uni-kl.de		    else
53612027Sjungma@eit.uni-kl.de			val = high;
53712027Sjungma@eit.uni-kl.de		}
53812027Sjungma@eit.uni-kl.de		break;
53912027Sjungma@eit.uni-kl.de	    }
54012027Sjungma@eit.uni-kl.de            case SC_SAT:			// saturation
54112027Sjungma@eit.uni-kl.de            case SC_SAT_SYM:			// symmetrical saturation
54212027Sjungma@eit.uni-kl.de	    {
54312027Sjungma@eit.uni-kl.de	        if( under )
54412027Sjungma@eit.uni-kl.de		    val = low;
54512027Sjungma@eit.uni-kl.de		else
54612027Sjungma@eit.uni-kl.de		    val = high;
54712027Sjungma@eit.uni-kl.de		break;
54812027Sjungma@eit.uni-kl.de	    }
54912027Sjungma@eit.uni-kl.de            case SC_SAT_ZERO:			// saturation to zero
55012027Sjungma@eit.uni-kl.de	    {
55112027Sjungma@eit.uni-kl.de	        val = 0.0;
55212027Sjungma@eit.uni-kl.de		break;
55312027Sjungma@eit.uni-kl.de	    }
55412027Sjungma@eit.uni-kl.de            case SC_WRAP_SM:			// sign magnitude wrap-around
55512027Sjungma@eit.uni-kl.de	    {
55612027Sjungma@eit.uni-kl.de		SC_ERROR_IF_( params.enc() == SC_US_,
55712027Sjungma@eit.uni-kl.de			      sc_core::SC_ID_WRAP_SM_NOT_DEFINED_ );
55812027Sjungma@eit.uni-kl.de
55912027Sjungma@eit.uni-kl.de		int n_bits = params.n_bits();
56012027Sjungma@eit.uni-kl.de
56112027Sjungma@eit.uni-kl.de		if( n_bits == 0 )
56212027Sjungma@eit.uni-kl.de		{
56312027Sjungma@eit.uni-kl.de		    // invert conditionally
56412027Sjungma@eit.uni-kl.de		    if( c2.get_bit( iwl ) != c2.get_bit( iwl - 1 ) )
56512027Sjungma@eit.uni-kl.de			val = -val - resolution;
56612027Sjungma@eit.uni-kl.de
56712027Sjungma@eit.uni-kl.de		    // wrap-around all 'wl' bits
56812027Sjungma@eit.uni-kl.de		    val -= floor( val / full_circle ) * full_circle;
56912027Sjungma@eit.uni-kl.de		    if( val > high )
57012027Sjungma@eit.uni-kl.de			val -= full_circle;
57112027Sjungma@eit.uni-kl.de		}
57212027Sjungma@eit.uni-kl.de		else if( n_bits == 1 )
57312027Sjungma@eit.uni-kl.de		{
57412027Sjungma@eit.uni-kl.de		    // invert conditionally
57512027Sjungma@eit.uni-kl.de		    if( c2.is_neg() != c2.get_bit( iwl - 1 ) )
57612027Sjungma@eit.uni-kl.de			val = -val - resolution;
57712027Sjungma@eit.uni-kl.de
57812027Sjungma@eit.uni-kl.de		    // wrap-around all 'wl' bits
57912027Sjungma@eit.uni-kl.de		    val -= floor( val / full_circle ) * full_circle;
58012027Sjungma@eit.uni-kl.de		    if( val > high )
58112027Sjungma@eit.uni-kl.de			val -= full_circle;
58212027Sjungma@eit.uni-kl.de		}
58312027Sjungma@eit.uni-kl.de		else if( n_bits < params.wl() )
58412027Sjungma@eit.uni-kl.de		{
58512027Sjungma@eit.uni-kl.de		    // invert conditionally
58612027Sjungma@eit.uni-kl.de		    if( c2.is_neg() == c2.get_bit( iwl - n_bits ) )
58712027Sjungma@eit.uni-kl.de			val = -val - resolution;
58812027Sjungma@eit.uni-kl.de
58912027Sjungma@eit.uni-kl.de		    double X = scfx_pow2( iwl - n_bits );
59012027Sjungma@eit.uni-kl.de
59112027Sjungma@eit.uni-kl.de		    // wrap-around least significant 'wl - n_bits' bits
59212027Sjungma@eit.uni-kl.de		    val -= floor( val / X ) * X;
59312027Sjungma@eit.uni-kl.de		    if( val > ( X - resolution ) )
59412027Sjungma@eit.uni-kl.de			val -= X;
59512027Sjungma@eit.uni-kl.de
59612027Sjungma@eit.uni-kl.de		    // saturate most significant 'n_bits' bits
59712027Sjungma@eit.uni-kl.de		    if( under )
59812027Sjungma@eit.uni-kl.de		        val += low;
59912027Sjungma@eit.uni-kl.de		    else
60012027Sjungma@eit.uni-kl.de			val += full_circle / 2.0 - X;
60112027Sjungma@eit.uni-kl.de		} else {
60212027Sjungma@eit.uni-kl.de		    // saturate all 'wl' bits
60312027Sjungma@eit.uni-kl.de		    if( under )
60412027Sjungma@eit.uni-kl.de			val = low;
60512027Sjungma@eit.uni-kl.de		    else
60612027Sjungma@eit.uni-kl.de			val = high;
60712027Sjungma@eit.uni-kl.de		}
60812027Sjungma@eit.uni-kl.de	        break;
60912027Sjungma@eit.uni-kl.de	    }
61012027Sjungma@eit.uni-kl.de            default:
61112027Sjungma@eit.uni-kl.de	        ;
61212027Sjungma@eit.uni-kl.de	}
61312027Sjungma@eit.uni-kl.de
61412027Sjungma@eit.uni-kl.de	c = val;
61512027Sjungma@eit.uni-kl.de    }
61612027Sjungma@eit.uni-kl.de}
61712027Sjungma@eit.uni-kl.de
61812027Sjungma@eit.uni-kl.de
61912027Sjungma@eit.uni-kl.devoid
62012027Sjungma@eit.uni-kl.desc_fxnum_fast::cast()
62112027Sjungma@eit.uni-kl.de{
62212027Sjungma@eit.uni-kl.de    scfx_ieee_double id( m_val );
62312027Sjungma@eit.uni-kl.de    SC_ERROR_IF_( id.is_nan() || id.is_inf(), sc_core::SC_ID_INVALID_FX_VALUE_);
62412027Sjungma@eit.uni-kl.de
62512027Sjungma@eit.uni-kl.de    if( m_params.cast_switch() == SC_ON )
62612027Sjungma@eit.uni-kl.de    {
62712027Sjungma@eit.uni-kl.de        m_q_flag = false;
62812027Sjungma@eit.uni-kl.de	m_o_flag = false;
62912027Sjungma@eit.uni-kl.de
63012027Sjungma@eit.uni-kl.de	// check for special cases
63112027Sjungma@eit.uni-kl.de
63212027Sjungma@eit.uni-kl.de	if( id.is_zero() )
63312027Sjungma@eit.uni-kl.de	{
63412027Sjungma@eit.uni-kl.de	    if( id.negative() != 0 )
63512027Sjungma@eit.uni-kl.de	        m_val = -m_val;
63612027Sjungma@eit.uni-kl.de	    return;
63712027Sjungma@eit.uni-kl.de	}
63812027Sjungma@eit.uni-kl.de
63912027Sjungma@eit.uni-kl.de	// perform casting
64012027Sjungma@eit.uni-kl.de
64112027Sjungma@eit.uni-kl.de	sc_dt::quantization( m_val, m_params, m_q_flag );
64212027Sjungma@eit.uni-kl.de	sc_dt::overflow( m_val, m_params, m_o_flag );
64312027Sjungma@eit.uni-kl.de
64412027Sjungma@eit.uni-kl.de	// check for special case: -0
64512027Sjungma@eit.uni-kl.de
64612027Sjungma@eit.uni-kl.de	id = m_val;
64712027Sjungma@eit.uni-kl.de	if( id.is_zero() && id.negative() != 0 ) {
64812027Sjungma@eit.uni-kl.de	    m_val = -m_val;
64912027Sjungma@eit.uni-kl.de	}
65012027Sjungma@eit.uni-kl.de
65112027Sjungma@eit.uni-kl.de	// check for special case: NaN of Inf
65212027Sjungma@eit.uni-kl.de
65312027Sjungma@eit.uni-kl.de	if( id.is_nan() || id.is_inf() ) {
65412027Sjungma@eit.uni-kl.de	    m_val = 0.0;
65512027Sjungma@eit.uni-kl.de	}
65612027Sjungma@eit.uni-kl.de    }
65712027Sjungma@eit.uni-kl.de}
65812027Sjungma@eit.uni-kl.de
65912027Sjungma@eit.uni-kl.de
66012027Sjungma@eit.uni-kl.de// defined in sc_fxval.cpp;
66112027Sjungma@eit.uni-kl.deextern
66212027Sjungma@eit.uni-kl.deconst char*
66312027Sjungma@eit.uni-kl.deto_string( const scfx_ieee_double&,
66412027Sjungma@eit.uni-kl.de	   sc_numrep,
66512027Sjungma@eit.uni-kl.de	   int,
66612027Sjungma@eit.uni-kl.de	   sc_fmt,
66712027Sjungma@eit.uni-kl.de	   const scfx_params* = 0 );
66812027Sjungma@eit.uni-kl.de
66912027Sjungma@eit.uni-kl.de
67012027Sjungma@eit.uni-kl.de// explicit conversion to character string
67112027Sjungma@eit.uni-kl.de
67212027Sjungma@eit.uni-kl.deconst std::string
67312027Sjungma@eit.uni-kl.desc_fxnum_fast::to_string() const
67412027Sjungma@eit.uni-kl.de{
67512027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_DEC, -1, SC_F, &m_params ) );
67612027Sjungma@eit.uni-kl.de}
67712027Sjungma@eit.uni-kl.de
67812027Sjungma@eit.uni-kl.deconst std::string
67912027Sjungma@eit.uni-kl.desc_fxnum_fast::to_string( sc_numrep numrep ) const
68012027Sjungma@eit.uni-kl.de{
68112027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, numrep, -1, SC_F, &m_params ) );
68212027Sjungma@eit.uni-kl.de}
68312027Sjungma@eit.uni-kl.de
68412027Sjungma@eit.uni-kl.deconst std::string
68512027Sjungma@eit.uni-kl.desc_fxnum_fast::to_string( sc_numrep numrep, bool w_prefix ) const
68612027Sjungma@eit.uni-kl.de{
68712027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, numrep, (w_prefix ? 1 : 0),
68812027Sjungma@eit.uni-kl.de					SC_F, &m_params ) );
68912027Sjungma@eit.uni-kl.de}
69012027Sjungma@eit.uni-kl.de
69112027Sjungma@eit.uni-kl.deconst std::string
69212027Sjungma@eit.uni-kl.desc_fxnum_fast::to_string( sc_fmt fmt ) const
69312027Sjungma@eit.uni-kl.de{
69412027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_DEC, -1, fmt, &m_params ) );
69512027Sjungma@eit.uni-kl.de}
69612027Sjungma@eit.uni-kl.de
69712027Sjungma@eit.uni-kl.deconst std::string
69812027Sjungma@eit.uni-kl.desc_fxnum_fast::to_string( sc_numrep numrep, sc_fmt fmt ) const
69912027Sjungma@eit.uni-kl.de{
70012027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, numrep, -1, fmt, &m_params ) );
70112027Sjungma@eit.uni-kl.de}
70212027Sjungma@eit.uni-kl.de
70312027Sjungma@eit.uni-kl.deconst std::string
70412027Sjungma@eit.uni-kl.desc_fxnum_fast::to_string( sc_numrep numrep, bool w_prefix, sc_fmt fmt ) const
70512027Sjungma@eit.uni-kl.de{
70612027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, numrep, (w_prefix ? 1 : 0),
70712027Sjungma@eit.uni-kl.de					fmt, &m_params ) );
70812027Sjungma@eit.uni-kl.de}
70912027Sjungma@eit.uni-kl.de
71012027Sjungma@eit.uni-kl.de
71112027Sjungma@eit.uni-kl.deconst std::string
71212027Sjungma@eit.uni-kl.desc_fxnum_fast::to_dec() const
71312027Sjungma@eit.uni-kl.de{
71412027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_DEC, -1, SC_F, &m_params ) );
71512027Sjungma@eit.uni-kl.de}
71612027Sjungma@eit.uni-kl.de
71712027Sjungma@eit.uni-kl.deconst std::string
71812027Sjungma@eit.uni-kl.desc_fxnum_fast::to_bin() const
71912027Sjungma@eit.uni-kl.de{
72012027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_BIN, -1, SC_F, &m_params ) );
72112027Sjungma@eit.uni-kl.de}
72212027Sjungma@eit.uni-kl.de
72312027Sjungma@eit.uni-kl.deconst std::string
72412027Sjungma@eit.uni-kl.desc_fxnum_fast::to_oct() const
72512027Sjungma@eit.uni-kl.de{
72612027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_OCT, -1, SC_F, &m_params ) );
72712027Sjungma@eit.uni-kl.de}
72812027Sjungma@eit.uni-kl.de
72912027Sjungma@eit.uni-kl.deconst std::string
73012027Sjungma@eit.uni-kl.desc_fxnum_fast::to_hex() const
73112027Sjungma@eit.uni-kl.de{
73212027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_HEX, -1, SC_F, &m_params ) );
73312027Sjungma@eit.uni-kl.de}
73412027Sjungma@eit.uni-kl.de
73512027Sjungma@eit.uni-kl.de
73612027Sjungma@eit.uni-kl.de// print or dump content
73712027Sjungma@eit.uni-kl.de
73812027Sjungma@eit.uni-kl.devoid
73912027Sjungma@eit.uni-kl.desc_fxnum_fast::print( ::std::ostream& os ) const
74012027Sjungma@eit.uni-kl.de{
74112027Sjungma@eit.uni-kl.de    os << sc_dt::to_string( m_val, SC_DEC, -1, SC_F, &m_params );
74212027Sjungma@eit.uni-kl.de}
74312027Sjungma@eit.uni-kl.de
74412027Sjungma@eit.uni-kl.devoid
74512027Sjungma@eit.uni-kl.desc_fxnum_fast::scan( ::std::istream& is )
74612027Sjungma@eit.uni-kl.de{
74712027Sjungma@eit.uni-kl.de    std::string s;
74812027Sjungma@eit.uni-kl.de    is >> s;
74912027Sjungma@eit.uni-kl.de    *this = s.c_str();
75012027Sjungma@eit.uni-kl.de}
75112027Sjungma@eit.uni-kl.de
75212027Sjungma@eit.uni-kl.devoid
75312027Sjungma@eit.uni-kl.desc_fxnum_fast::dump( ::std::ostream& os ) const
75412027Sjungma@eit.uni-kl.de{
75512027Sjungma@eit.uni-kl.de    os << "sc_fxnum_fast" << ::std::endl;
75612027Sjungma@eit.uni-kl.de    os << "(" << ::std::endl;
75712027Sjungma@eit.uni-kl.de    os << "val      = " << m_val << ::std::endl;
75812027Sjungma@eit.uni-kl.de    os << "params   = ";
75912027Sjungma@eit.uni-kl.de    m_params.dump( os );
76012027Sjungma@eit.uni-kl.de    os << "q_flag   = " << m_q_flag << ::std::endl;
76112027Sjungma@eit.uni-kl.de    os << "o_flag   = " << m_o_flag << ::std::endl;
76212027Sjungma@eit.uni-kl.de    // TO BE COMPLETED
76312027Sjungma@eit.uni-kl.de    // os << "observer = ";
76412027Sjungma@eit.uni-kl.de    // if( m_observer != 0 )
76512027Sjungma@eit.uni-kl.de    //     m_observer->dump( os );
76612027Sjungma@eit.uni-kl.de    // else
76712027Sjungma@eit.uni-kl.de    //     os << "0" << ::std::endl;
76812027Sjungma@eit.uni-kl.de    os << ")" << ::std::endl;
76912027Sjungma@eit.uni-kl.de}
77012027Sjungma@eit.uni-kl.de
77112027Sjungma@eit.uni-kl.de
77212027Sjungma@eit.uni-kl.de// internal use only;
77312027Sjungma@eit.uni-kl.debool
77412027Sjungma@eit.uni-kl.desc_fxnum_fast::get_bit( int i ) const
77512027Sjungma@eit.uni-kl.de{
77612027Sjungma@eit.uni-kl.de    scfx_ieee_double id( m_val );
77712027Sjungma@eit.uni-kl.de    if( id.is_zero() || id.is_nan() || id.is_inf() )
77812027Sjungma@eit.uni-kl.de        return false;
77912027Sjungma@eit.uni-kl.de
78012027Sjungma@eit.uni-kl.de    // convert to two's complement
78112027Sjungma@eit.uni-kl.de
78212027Sjungma@eit.uni-kl.de    unsigned int m0 = id.mantissa0();
78312027Sjungma@eit.uni-kl.de    unsigned int m1 = id.mantissa1();
78412027Sjungma@eit.uni-kl.de
78512027Sjungma@eit.uni-kl.de    if( id.is_normal() )
78612027Sjungma@eit.uni-kl.de        m0 += 1U << 20;
78712027Sjungma@eit.uni-kl.de
78812027Sjungma@eit.uni-kl.de    if( id.negative() != 0 )
78912027Sjungma@eit.uni-kl.de    {
79012027Sjungma@eit.uni-kl.de	m0 = ~ m0;
79112027Sjungma@eit.uni-kl.de	m1 = ~ m1;
79212027Sjungma@eit.uni-kl.de	unsigned int tmp = m1;
79312027Sjungma@eit.uni-kl.de	m1 += 1U;
79412027Sjungma@eit.uni-kl.de	if( m1 <= tmp )
79512027Sjungma@eit.uni-kl.de	    m0 += 1U;
79612027Sjungma@eit.uni-kl.de    }
79712027Sjungma@eit.uni-kl.de
79812027Sjungma@eit.uni-kl.de    // get the right bit
79912027Sjungma@eit.uni-kl.de
80012027Sjungma@eit.uni-kl.de    int j = i - id.exponent();
80112027Sjungma@eit.uni-kl.de    if( ( j += 20 ) >= 32 )
80212027Sjungma@eit.uni-kl.de        return ( ( m0 & 1U << 31 ) != 0 );
80312027Sjungma@eit.uni-kl.de    else if( j >= 0 )
80412027Sjungma@eit.uni-kl.de        return ( ( m0 & 1U << j ) != 0 );
80512027Sjungma@eit.uni-kl.de    else if( ( j += 32 ) >= 0 )
80612027Sjungma@eit.uni-kl.de        return ( ( m1 & 1U << j ) != 0 );
80712027Sjungma@eit.uni-kl.de    else
80812027Sjungma@eit.uni-kl.de        return false;
80912027Sjungma@eit.uni-kl.de}
81012027Sjungma@eit.uni-kl.de
81112027Sjungma@eit.uni-kl.de
81212027Sjungma@eit.uni-kl.debool
81312027Sjungma@eit.uni-kl.desc_fxnum_fast::set_bit( int i, bool high )
81412027Sjungma@eit.uni-kl.de{
81512027Sjungma@eit.uni-kl.de    scfx_ieee_double id( m_val );
81612027Sjungma@eit.uni-kl.de    if( id.is_nan() || id.is_inf() )
81712027Sjungma@eit.uni-kl.de        return false;
81812027Sjungma@eit.uni-kl.de
81912027Sjungma@eit.uni-kl.de    if( high )
82012027Sjungma@eit.uni-kl.de    {
82112027Sjungma@eit.uni-kl.de	if( get_bit( i ) )
82212027Sjungma@eit.uni-kl.de	    return true;
82312027Sjungma@eit.uni-kl.de
82412027Sjungma@eit.uni-kl.de	if( m_params.enc() == SC_TC_ && i == m_params.iwl() - 1 )
82512027Sjungma@eit.uni-kl.de	    m_val -= scfx_pow2( i );
82612027Sjungma@eit.uni-kl.de	else
82712027Sjungma@eit.uni-kl.de	    m_val += scfx_pow2( i );
82812027Sjungma@eit.uni-kl.de    }
82912027Sjungma@eit.uni-kl.de    else
83012027Sjungma@eit.uni-kl.de    {
83112027Sjungma@eit.uni-kl.de	if( ! get_bit( i ) )
83212027Sjungma@eit.uni-kl.de	    return true;
83312027Sjungma@eit.uni-kl.de
83412027Sjungma@eit.uni-kl.de	if( m_params.enc() == SC_TC_ && i == m_params.iwl() - 1 )
83512027Sjungma@eit.uni-kl.de	    m_val += scfx_pow2( i );
83612027Sjungma@eit.uni-kl.de	else
83712027Sjungma@eit.uni-kl.de	    m_val -= scfx_pow2( i );
83812027Sjungma@eit.uni-kl.de    }
83912027Sjungma@eit.uni-kl.de
84012027Sjungma@eit.uni-kl.de    return true;
84112027Sjungma@eit.uni-kl.de}
84212027Sjungma@eit.uni-kl.de
84312027Sjungma@eit.uni-kl.de
84412027Sjungma@eit.uni-kl.debool
84512027Sjungma@eit.uni-kl.desc_fxnum_fast::get_slice( int i, int j, sc_bv_base& bv ) const
84612027Sjungma@eit.uni-kl.de{
84712027Sjungma@eit.uni-kl.de    scfx_ieee_double id( m_val );
84812027Sjungma@eit.uni-kl.de    if( id.is_nan() || id.is_inf() )
84912027Sjungma@eit.uni-kl.de	return false;
85012027Sjungma@eit.uni-kl.de
85112027Sjungma@eit.uni-kl.de    // convert to two's complement
85212027Sjungma@eit.uni-kl.de
85312027Sjungma@eit.uni-kl.de    unsigned int m0 = id.mantissa0();
85412027Sjungma@eit.uni-kl.de    unsigned int m1 = id.mantissa1();
85512027Sjungma@eit.uni-kl.de
85612027Sjungma@eit.uni-kl.de    if( id.is_normal() )
85712027Sjungma@eit.uni-kl.de        m0 += 1U << 20;
85812027Sjungma@eit.uni-kl.de
85912027Sjungma@eit.uni-kl.de    if( id.negative() != 0 )
86012027Sjungma@eit.uni-kl.de    {
86112027Sjungma@eit.uni-kl.de	m0 = ~ m0;
86212027Sjungma@eit.uni-kl.de	m1 = ~ m1;
86312027Sjungma@eit.uni-kl.de	unsigned int tmp = m1;
86412027Sjungma@eit.uni-kl.de	m1 += 1U;
86512027Sjungma@eit.uni-kl.de	if( m1 <= tmp )
86612027Sjungma@eit.uni-kl.de	    m0 += 1U;
86712027Sjungma@eit.uni-kl.de    }
86812027Sjungma@eit.uni-kl.de
86912027Sjungma@eit.uni-kl.de    // get the bits
87012027Sjungma@eit.uni-kl.de
87112027Sjungma@eit.uni-kl.de    int l = j;
87212027Sjungma@eit.uni-kl.de    for( int k = 0; k < bv.length(); ++ k )
87312027Sjungma@eit.uni-kl.de    {
87412027Sjungma@eit.uni-kl.de	bool b = false;
87512027Sjungma@eit.uni-kl.de
87612027Sjungma@eit.uni-kl.de        int n = l - id.exponent();
87712027Sjungma@eit.uni-kl.de        if( ( n += 20 ) >= 32 )
87812027Sjungma@eit.uni-kl.de	    b = ( ( m0 & 1U << 31 ) != 0 );
87912027Sjungma@eit.uni-kl.de	else if( n >= 0 )
88012027Sjungma@eit.uni-kl.de	    b = ( ( m0 & 1U << n ) != 0 );
88112027Sjungma@eit.uni-kl.de	else if( ( n += 32 ) >= 0 )
88212027Sjungma@eit.uni-kl.de	    b = ( ( m1 & 1U << n ) != 0 );
88312027Sjungma@eit.uni-kl.de
88412027Sjungma@eit.uni-kl.de	bv[k] = b;
88512027Sjungma@eit.uni-kl.de
88612027Sjungma@eit.uni-kl.de	if( i >= j )
88712027Sjungma@eit.uni-kl.de	    ++ l;
88812027Sjungma@eit.uni-kl.de	else
88912027Sjungma@eit.uni-kl.de	    -- l;
89012027Sjungma@eit.uni-kl.de    }
89112027Sjungma@eit.uni-kl.de
89212027Sjungma@eit.uni-kl.de    return true;
89312027Sjungma@eit.uni-kl.de}
89412027Sjungma@eit.uni-kl.de
89512027Sjungma@eit.uni-kl.debool
89612027Sjungma@eit.uni-kl.desc_fxnum_fast::set_slice( int i, int j, const sc_bv_base& bv )
89712027Sjungma@eit.uni-kl.de{
89812027Sjungma@eit.uni-kl.de    scfx_ieee_double id( m_val );
89912027Sjungma@eit.uni-kl.de    if( id.is_nan() || id.is_inf() )
90012027Sjungma@eit.uni-kl.de        return false;
90112027Sjungma@eit.uni-kl.de
90212027Sjungma@eit.uni-kl.de    // set the bits
90312027Sjungma@eit.uni-kl.de
90412027Sjungma@eit.uni-kl.de    int l = j;
90512027Sjungma@eit.uni-kl.de    for( int k = 0; k < bv.length(); ++ k )
90612027Sjungma@eit.uni-kl.de    {
90712027Sjungma@eit.uni-kl.de	if( bv[k].to_bool() )
90812027Sjungma@eit.uni-kl.de	{
90912027Sjungma@eit.uni-kl.de	    if( ! get_bit( l ) )
91012027Sjungma@eit.uni-kl.de	    {
91112027Sjungma@eit.uni-kl.de		if( m_params.enc() == SC_TC_ && l == m_params.iwl() - 1 )
91212027Sjungma@eit.uni-kl.de		    m_val -= scfx_pow2( l );
91312027Sjungma@eit.uni-kl.de		else
91412027Sjungma@eit.uni-kl.de		    m_val += scfx_pow2( l );
91512027Sjungma@eit.uni-kl.de	    }
91612027Sjungma@eit.uni-kl.de	}
91712027Sjungma@eit.uni-kl.de	else
91812027Sjungma@eit.uni-kl.de	{
91912027Sjungma@eit.uni-kl.de	    if( get_bit( l ) )
92012027Sjungma@eit.uni-kl.de	    {
92112027Sjungma@eit.uni-kl.de		if( m_params.enc() == SC_TC_ && l == m_params.iwl() - 1 )
92212027Sjungma@eit.uni-kl.de		    m_val += scfx_pow2( l );
92312027Sjungma@eit.uni-kl.de		else
92412027Sjungma@eit.uni-kl.de		    m_val -= scfx_pow2( l );
92512027Sjungma@eit.uni-kl.de	    }
92612027Sjungma@eit.uni-kl.de	}
92712027Sjungma@eit.uni-kl.de
92812027Sjungma@eit.uni-kl.de
92912027Sjungma@eit.uni-kl.de	if( i >= j )
93012027Sjungma@eit.uni-kl.de	    ++ l;
93112027Sjungma@eit.uni-kl.de	else
93212027Sjungma@eit.uni-kl.de	    -- l;
93312027Sjungma@eit.uni-kl.de    }
93412027Sjungma@eit.uni-kl.de
93512027Sjungma@eit.uni-kl.de    return true;
93612027Sjungma@eit.uni-kl.de}
93712027Sjungma@eit.uni-kl.de
93812027Sjungma@eit.uni-kl.de
93912027Sjungma@eit.uni-kl.desc_fxnum_fast_observer*
94012027Sjungma@eit.uni-kl.desc_fxnum_fast::lock_observer() const
94112027Sjungma@eit.uni-kl.de{
94212027Sjungma@eit.uni-kl.de    SC_ASSERT_( m_observer != 0, "lock observer failed" );
94312027Sjungma@eit.uni-kl.de    sc_fxnum_fast_observer* tmp = m_observer;
94412027Sjungma@eit.uni-kl.de    m_observer = 0;
94512027Sjungma@eit.uni-kl.de    return tmp;
94612027Sjungma@eit.uni-kl.de}
94712027Sjungma@eit.uni-kl.de
94812027Sjungma@eit.uni-kl.devoid
94912027Sjungma@eit.uni-kl.desc_fxnum_fast::unlock_observer( sc_fxnum_fast_observer* observer_ ) const
95012027Sjungma@eit.uni-kl.de{
95112027Sjungma@eit.uni-kl.de    SC_ASSERT_( observer_ != 0, "unlock observer failed" );
95212027Sjungma@eit.uni-kl.de    m_observer = observer_;
95312027Sjungma@eit.uni-kl.de}
95412027Sjungma@eit.uni-kl.de
95512027Sjungma@eit.uni-kl.de} // namespace sc_dt
95612027Sjungma@eit.uni-kl.de
95712027Sjungma@eit.uni-kl.de
95812027Sjungma@eit.uni-kl.de// Taf!
959