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