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 scfx_rep.h - 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Robert Graulich, Synopsys, Inc. 2512027Sjungma@eit.uni-kl.de Martin Janssen, Synopsys, Inc. 2612027Sjungma@eit.uni-kl.de 2712027Sjungma@eit.uni-kl.de *****************************************************************************/ 2812027Sjungma@eit.uni-kl.de 2912027Sjungma@eit.uni-kl.de/***************************************************************************** 3012027Sjungma@eit.uni-kl.de 3112027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3212027Sjungma@eit.uni-kl.de changes you are making here. 3312027Sjungma@eit.uni-kl.de 3412027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 3512027Sjungma@eit.uni-kl.de Description of Modification: 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de *****************************************************************************/ 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.de// $Log: scfx_rep.h,v $ 4012027Sjungma@eit.uni-kl.de// Revision 1.6 2011/08/24 22:05:43 acg 4112027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 4212027Sjungma@eit.uni-kl.de// 4312027Sjungma@eit.uni-kl.de// Revision 1.5 2011/07/25 10:20:29 acg 4412027Sjungma@eit.uni-kl.de// Andy Goodrich: check in aftermath of call to automake. 4512027Sjungma@eit.uni-kl.de// 4612027Sjungma@eit.uni-kl.de// Revision 1.4 2010/12/07 20:09:08 acg 4712027Sjungma@eit.uni-kl.de// Andy Goodrich: Philipp Hartmann's constructor disambiguation fix 4812027Sjungma@eit.uni-kl.de// 4912027Sjungma@eit.uni-kl.de// Revision 1.3 2010/08/03 15:54:52 acg 5012027Sjungma@eit.uni-kl.de// Andy Goodrich: formatting. 5112027Sjungma@eit.uni-kl.de// 5212027Sjungma@eit.uni-kl.de// Revision 1.2 2010/03/15 18:29:01 acg 5312027Sjungma@eit.uni-kl.de// Andy Goodrich: Moved default argument specifications from friend 5412027Sjungma@eit.uni-kl.de// declarations to the actual function signatures. 5512027Sjungma@eit.uni-kl.de// 5612027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:04 acg 5712027Sjungma@eit.uni-kl.de// SystemC 2.3 5812027Sjungma@eit.uni-kl.de// 5912027Sjungma@eit.uni-kl.de// Revision 1.4 2006/03/13 20:24:27 acg 6012027Sjungma@eit.uni-kl.de// Andy Goodrich: Addition of function declarations, e.g., neg_scfx_rep(), 6112027Sjungma@eit.uni-kl.de// to keep gcc 4.x happy. 6212027Sjungma@eit.uni-kl.de// 6312027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:53:58 acg 6412027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in 6512027Sjungma@eit.uni-kl.de// the source. 6612027Sjungma@eit.uni-kl.de// 6712027Sjungma@eit.uni-kl.de 6812027Sjungma@eit.uni-kl.de#ifndef SCFX_REP_H 6912027Sjungma@eit.uni-kl.de#define SCFX_REP_H 7012027Sjungma@eit.uni-kl.de 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.de#include <climits> 7312027Sjungma@eit.uni-kl.de 7412027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_mant.h" 7512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_params.h" 7612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_string.h" 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.de 7912027Sjungma@eit.uni-kl.denamespace sc_dt 8012027Sjungma@eit.uni-kl.de{ 8112027Sjungma@eit.uni-kl.de 8212027Sjungma@eit.uni-kl.de// classes defined in this module 8312027Sjungma@eit.uni-kl.declass scfx_index; 8412027Sjungma@eit.uni-kl.declass scfx_rep; 8512027Sjungma@eit.uni-kl.de 8612027Sjungma@eit.uni-kl.de// forward class declarations 8712027Sjungma@eit.uni-kl.declass sc_bv_base; 8812027Sjungma@eit.uni-kl.declass sc_signed; 8912027Sjungma@eit.uni-kl.declass sc_unsigned; 9012027Sjungma@eit.uni-kl.de 9112027Sjungma@eit.uni-kl.de// function declarations 9212027Sjungma@eit.uni-kl.devoid multiply( scfx_rep&, const scfx_rep&, const scfx_rep&, 9312027Sjungma@eit.uni-kl.de int max_wl = SC_DEFAULT_MAX_WL_ ); 9412027Sjungma@eit.uni-kl.descfx_rep* neg_scfx_rep( const scfx_rep& ); 9512027Sjungma@eit.uni-kl.descfx_rep* mult_scfx_rep( const scfx_rep&, const scfx_rep&, 9612027Sjungma@eit.uni-kl.de int max_wl = SC_DEFAULT_MAX_WL_ ); 9712027Sjungma@eit.uni-kl.descfx_rep* div_scfx_rep( const scfx_rep&, const scfx_rep&, 9812027Sjungma@eit.uni-kl.de int max_wl = SC_DEFAULT_DIV_WL_ ); 9912027Sjungma@eit.uni-kl.descfx_rep* add_scfx_rep( const scfx_rep&, const scfx_rep&, 10012027Sjungma@eit.uni-kl.de int max_wl = SC_DEFAULT_MAX_WL_ ); 10112027Sjungma@eit.uni-kl.descfx_rep* sub_scfx_rep( const scfx_rep&, const scfx_rep&, 10212027Sjungma@eit.uni-kl.de int max_wl = SC_DEFAULT_MAX_WL_ ); 10312027Sjungma@eit.uni-kl.descfx_rep* lsh_scfx_rep( const scfx_rep&, int ); 10412027Sjungma@eit.uni-kl.descfx_rep* rsh_scfx_rep( const scfx_rep&, int ); 10512027Sjungma@eit.uni-kl.deint cmp_scfx_rep( const scfx_rep&, const scfx_rep& ); 10612027Sjungma@eit.uni-kl.de 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.deconst int min_mant = 4; 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.deconst int bits_in_int = sizeof(int) * CHAR_BIT; 11112027Sjungma@eit.uni-kl.deconst int bits_in_word = sizeof(word) * CHAR_BIT; 11212027Sjungma@eit.uni-kl.de 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 11512027Sjungma@eit.uni-kl.de// CLASS : scfx_index 11612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 11712027Sjungma@eit.uni-kl.de 11812027Sjungma@eit.uni-kl.declass scfx_index 11912027Sjungma@eit.uni-kl.de{ 12012027Sjungma@eit.uni-kl.de 12112027Sjungma@eit.uni-kl.depublic: 12212027Sjungma@eit.uni-kl.de 12312027Sjungma@eit.uni-kl.de scfx_index( int wi_, int bi_ ) : m_wi( wi_ ), m_bi( bi_ ) {} 12412027Sjungma@eit.uni-kl.de 12512027Sjungma@eit.uni-kl.de int wi() const { return m_wi; } 12612027Sjungma@eit.uni-kl.de int bi() const { return m_bi; } 12712027Sjungma@eit.uni-kl.de 12812027Sjungma@eit.uni-kl.de void wi( int wi_ ) { m_wi = wi_; } 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.deprivate: 13112027Sjungma@eit.uni-kl.de 13212027Sjungma@eit.uni-kl.de int m_wi; 13312027Sjungma@eit.uni-kl.de int m_bi; 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.de}; 13612027Sjungma@eit.uni-kl.de 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 13912027Sjungma@eit.uni-kl.de// CLASS : scfx_rep 14012027Sjungma@eit.uni-kl.de// 14112027Sjungma@eit.uni-kl.de// Arbitrary-precision fixed-point implementation class. 14212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 14312027Sjungma@eit.uni-kl.de 14412027Sjungma@eit.uni-kl.declass scfx_rep 14512027Sjungma@eit.uni-kl.de{ 14612027Sjungma@eit.uni-kl.de enum state 14712027Sjungma@eit.uni-kl.de { 14812027Sjungma@eit.uni-kl.de normal, 14912027Sjungma@eit.uni-kl.de infinity, 15012027Sjungma@eit.uni-kl.de not_a_number 15112027Sjungma@eit.uni-kl.de }; 15212027Sjungma@eit.uni-kl.de 15312027Sjungma@eit.uni-kl.depublic: 15412027Sjungma@eit.uni-kl.de 15512027Sjungma@eit.uni-kl.de // constructors 15612027Sjungma@eit.uni-kl.de 15712027Sjungma@eit.uni-kl.de scfx_rep(); 15812027Sjungma@eit.uni-kl.de explicit scfx_rep( int ); 15912027Sjungma@eit.uni-kl.de explicit scfx_rep( unsigned int ); 16012027Sjungma@eit.uni-kl.de explicit scfx_rep( long ); 16112027Sjungma@eit.uni-kl.de explicit scfx_rep( unsigned long ); 16212027Sjungma@eit.uni-kl.de explicit scfx_rep( double ); 16312027Sjungma@eit.uni-kl.de explicit scfx_rep( const char* ); 16412027Sjungma@eit.uni-kl.de explicit scfx_rep( int64 ); 16512027Sjungma@eit.uni-kl.de explicit scfx_rep( uint64 ); 16612027Sjungma@eit.uni-kl.de explicit scfx_rep( const sc_signed& ); 16712027Sjungma@eit.uni-kl.de explicit scfx_rep( const sc_unsigned& ); 16812027Sjungma@eit.uni-kl.de 16912027Sjungma@eit.uni-kl.de 17012027Sjungma@eit.uni-kl.de // copy constructor 17112027Sjungma@eit.uni-kl.de 17212027Sjungma@eit.uni-kl.de scfx_rep( const scfx_rep& ); 17312027Sjungma@eit.uni-kl.de 17412027Sjungma@eit.uni-kl.de 17512027Sjungma@eit.uni-kl.de // destructor 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.de ~scfx_rep(); 17812027Sjungma@eit.uni-kl.de 17912027Sjungma@eit.uni-kl.de 18012027Sjungma@eit.uni-kl.de void* operator new( std::size_t ); 18112027Sjungma@eit.uni-kl.de void operator delete( void*, std::size_t ); 18212027Sjungma@eit.uni-kl.de 18312027Sjungma@eit.uni-kl.de 18412027Sjungma@eit.uni-kl.de void from_string( const char*, int ); 18512027Sjungma@eit.uni-kl.de 18612027Sjungma@eit.uni-kl.de double to_double() const; 18712027Sjungma@eit.uni-kl.de 18812027Sjungma@eit.uni-kl.de const char* to_string( sc_numrep, 18912027Sjungma@eit.uni-kl.de int, 19012027Sjungma@eit.uni-kl.de sc_fmt, 19112027Sjungma@eit.uni-kl.de const scfx_params* = 0 ) const; 19212027Sjungma@eit.uni-kl.de 19312027Sjungma@eit.uni-kl.de 19412027Sjungma@eit.uni-kl.de // assignment operator 19512027Sjungma@eit.uni-kl.de 19612027Sjungma@eit.uni-kl.de void operator = ( const scfx_rep& ); 19712027Sjungma@eit.uni-kl.de 19812027Sjungma@eit.uni-kl.de friend void multiply( scfx_rep&, const scfx_rep&, const scfx_rep&, int ); 19912027Sjungma@eit.uni-kl.de 20012027Sjungma@eit.uni-kl.de friend scfx_rep* neg_scfx_rep( const scfx_rep& ); 20112027Sjungma@eit.uni-kl.de friend scfx_rep* mult_scfx_rep( const scfx_rep&, const scfx_rep&, int ); 20212027Sjungma@eit.uni-kl.de friend scfx_rep* div_scfx_rep( const scfx_rep&, const scfx_rep&, int ); 20312027Sjungma@eit.uni-kl.de friend scfx_rep* add_scfx_rep( const scfx_rep&, const scfx_rep&, int ); 20412027Sjungma@eit.uni-kl.de friend scfx_rep* sub_scfx_rep( const scfx_rep&, const scfx_rep&, int ); 20512027Sjungma@eit.uni-kl.de friend scfx_rep* lsh_scfx_rep( const scfx_rep&, int ); 20612027Sjungma@eit.uni-kl.de friend scfx_rep* rsh_scfx_rep( const scfx_rep&, int ); 20712027Sjungma@eit.uni-kl.de 20812027Sjungma@eit.uni-kl.de void lshift( int ); 20912027Sjungma@eit.uni-kl.de void rshift( int ); 21012027Sjungma@eit.uni-kl.de 21112027Sjungma@eit.uni-kl.de friend int cmp_scfx_rep( const scfx_rep&, const scfx_rep& ); 21212027Sjungma@eit.uni-kl.de 21312027Sjungma@eit.uni-kl.de void cast( const scfx_params&, bool&, bool& ); 21412027Sjungma@eit.uni-kl.de 21512027Sjungma@eit.uni-kl.de bool is_neg() const; 21612027Sjungma@eit.uni-kl.de bool is_zero() const; 21712027Sjungma@eit.uni-kl.de bool is_nan() const; 21812027Sjungma@eit.uni-kl.de bool is_inf() const; 21912027Sjungma@eit.uni-kl.de bool is_normal() const; 22012027Sjungma@eit.uni-kl.de 22112027Sjungma@eit.uni-kl.de void set_zero( int = 1 ); 22212027Sjungma@eit.uni-kl.de void set_nan(); 22312027Sjungma@eit.uni-kl.de void set_inf( int ); 22412027Sjungma@eit.uni-kl.de 22512027Sjungma@eit.uni-kl.de bool get_bit( int ) const; 22612027Sjungma@eit.uni-kl.de bool set( int, const scfx_params& ); 22712027Sjungma@eit.uni-kl.de bool clear( int, const scfx_params& ); 22812027Sjungma@eit.uni-kl.de 22912027Sjungma@eit.uni-kl.de bool get_slice( int, int, const scfx_params&, sc_bv_base& ) const; 23012027Sjungma@eit.uni-kl.de bool set_slice( int, int, const scfx_params&, const sc_bv_base& ); 23112027Sjungma@eit.uni-kl.de 23212027Sjungma@eit.uni-kl.de void print( ::std::ostream& ) const; 23312027Sjungma@eit.uni-kl.de void dump( ::std::ostream& ) const; 23412027Sjungma@eit.uni-kl.de 23512027Sjungma@eit.uni-kl.de void get_type( int&, int&, sc_enc& ) const; 23612027Sjungma@eit.uni-kl.de 23712027Sjungma@eit.uni-kl.de friend scfx_rep* quantization_scfx_rep( const scfx_rep&, 23812027Sjungma@eit.uni-kl.de const scfx_params&, 23912027Sjungma@eit.uni-kl.de bool& ); 24012027Sjungma@eit.uni-kl.de friend scfx_rep* overflow_scfx_rep( const scfx_rep&, 24112027Sjungma@eit.uni-kl.de const scfx_params&, 24212027Sjungma@eit.uni-kl.de bool& ); 24312027Sjungma@eit.uni-kl.de 24412027Sjungma@eit.uni-kl.de bool rounding_flag() const; 24512027Sjungma@eit.uni-kl.de 24612027Sjungma@eit.uni-kl.deprivate: 24712027Sjungma@eit.uni-kl.de 24812027Sjungma@eit.uni-kl.de friend void align( const scfx_rep&, const scfx_rep&, int&, int&, 24912027Sjungma@eit.uni-kl.de scfx_mant_ref&, scfx_mant_ref& ); 25012027Sjungma@eit.uni-kl.de friend int compare_msw( const scfx_rep&, const scfx_rep& ); 25112027Sjungma@eit.uni-kl.de friend int compare_msw_ff( const scfx_rep& lhs, const scfx_rep& rhs ); 25212027Sjungma@eit.uni-kl.de unsigned int divide_by_ten(); 25312027Sjungma@eit.uni-kl.de int find_lsw() const; 25412027Sjungma@eit.uni-kl.de int find_msw() const; 25512027Sjungma@eit.uni-kl.de void find_sw(); 25612027Sjungma@eit.uni-kl.de void multiply_by_ten(); 25712027Sjungma@eit.uni-kl.de void normalize( int ); 25812027Sjungma@eit.uni-kl.de scfx_mant* resize( int, int ) const; 25912027Sjungma@eit.uni-kl.de void set_bin( int ); 26012027Sjungma@eit.uni-kl.de void set_oct( int, int ); 26112027Sjungma@eit.uni-kl.de void set_hex( int, int ); 26212027Sjungma@eit.uni-kl.de void shift_left( int ); 26312027Sjungma@eit.uni-kl.de void shift_right( int ); 26412027Sjungma@eit.uni-kl.de 26512027Sjungma@eit.uni-kl.de const scfx_index calc_indices( int ) const; 26612027Sjungma@eit.uni-kl.de 26712027Sjungma@eit.uni-kl.de void o_extend( const scfx_index&, sc_enc ); 26812027Sjungma@eit.uni-kl.de bool o_bit_at( const scfx_index& ) const; 26912027Sjungma@eit.uni-kl.de bool o_zero_left( const scfx_index& ) const; 27012027Sjungma@eit.uni-kl.de bool o_zero_right( const scfx_index& ) const; 27112027Sjungma@eit.uni-kl.de void o_set_low( const scfx_index&, sc_enc ); 27212027Sjungma@eit.uni-kl.de void o_set_high( const scfx_index&, const scfx_index&, sc_enc, int = 1 ); 27312027Sjungma@eit.uni-kl.de void o_set( const scfx_index&, const scfx_index&, sc_enc, bool ); 27412027Sjungma@eit.uni-kl.de void o_invert( const scfx_index& ); 27512027Sjungma@eit.uni-kl.de bool q_bit( const scfx_index& ) const; 27612027Sjungma@eit.uni-kl.de void q_clear( const scfx_index& ); 27712027Sjungma@eit.uni-kl.de void q_incr( const scfx_index& ); 27812027Sjungma@eit.uni-kl.de bool q_odd( const scfx_index& ) const; 27912027Sjungma@eit.uni-kl.de bool q_zero( const scfx_index& ) const; 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.de void resize_to( int, int = 0 ); 28212027Sjungma@eit.uni-kl.de int size() const; 28312027Sjungma@eit.uni-kl.de void toggle_tc(); 28412027Sjungma@eit.uni-kl.de 28512027Sjungma@eit.uni-kl.de friend void print_dec( scfx_string&, const scfx_rep&, int, sc_fmt ); 28612027Sjungma@eit.uni-kl.de friend void print_other( scfx_string&, const scfx_rep&, sc_numrep, int, 28712027Sjungma@eit.uni-kl.de sc_fmt, const scfx_params* ); 28812027Sjungma@eit.uni-kl.de 28912027Sjungma@eit.uni-kl.de void quantization( const scfx_params&, bool& ); 29012027Sjungma@eit.uni-kl.de void overflow( const scfx_params&, bool& ); 29112027Sjungma@eit.uni-kl.de 29212027Sjungma@eit.uni-kl.de friend int compare_abs( const scfx_rep&, const scfx_rep& ); 29312027Sjungma@eit.uni-kl.de 29412027Sjungma@eit.uni-kl.de void round( int ); 29512027Sjungma@eit.uni-kl.de 29612027Sjungma@eit.uni-kl.deprivate: 29712027Sjungma@eit.uni-kl.de 29812027Sjungma@eit.uni-kl.de scfx_mant m_mant; // mantissa (bits of the value). 29912027Sjungma@eit.uni-kl.de int m_wp; // index of highest order word in value. 30012027Sjungma@eit.uni-kl.de int m_sign; // sign of value. 30112027Sjungma@eit.uni-kl.de state m_state; // value state, e.g., normal, inf, etc. 30212027Sjungma@eit.uni-kl.de int m_msw; // index of most significant non-zero word. 30312027Sjungma@eit.uni-kl.de int m_lsw; // index of least significant non-zero word. 30412027Sjungma@eit.uni-kl.de bool m_r_flag; // true if founding occurred. 30512027Sjungma@eit.uni-kl.de 30612027Sjungma@eit.uni-kl.de}; 30712027Sjungma@eit.uni-kl.de 30812027Sjungma@eit.uni-kl.de 30912027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 31012027Sjungma@eit.uni-kl.de 31112027Sjungma@eit.uni-kl.deinline 31212027Sjungma@eit.uni-kl.devoid 31312027Sjungma@eit.uni-kl.descfx_rep::set_zero( int sign ) 31412027Sjungma@eit.uni-kl.de{ 31512027Sjungma@eit.uni-kl.de m_mant.clear(); 31612027Sjungma@eit.uni-kl.de m_wp = m_msw = m_lsw = 0; 31712027Sjungma@eit.uni-kl.de m_sign = sign; 31812027Sjungma@eit.uni-kl.de m_state = normal; 31912027Sjungma@eit.uni-kl.de} 32012027Sjungma@eit.uni-kl.de 32112027Sjungma@eit.uni-kl.deinline 32212027Sjungma@eit.uni-kl.devoid 32312027Sjungma@eit.uni-kl.descfx_rep::set_nan() 32412027Sjungma@eit.uni-kl.de{ 32512027Sjungma@eit.uni-kl.de m_mant.resize_to( min_mant ); 32612027Sjungma@eit.uni-kl.de m_state = not_a_number; 32712027Sjungma@eit.uni-kl.de} 32812027Sjungma@eit.uni-kl.de 32912027Sjungma@eit.uni-kl.deinline 33012027Sjungma@eit.uni-kl.devoid 33112027Sjungma@eit.uni-kl.descfx_rep::set_inf( int sign ) 33212027Sjungma@eit.uni-kl.de{ 33312027Sjungma@eit.uni-kl.de m_mant.resize_to( min_mant ); 33412027Sjungma@eit.uni-kl.de m_state = infinity; 33512027Sjungma@eit.uni-kl.de m_sign = sign; 33612027Sjungma@eit.uni-kl.de} 33712027Sjungma@eit.uni-kl.de 33812027Sjungma@eit.uni-kl.de 33912027Sjungma@eit.uni-kl.de// constructors 34012027Sjungma@eit.uni-kl.de 34112027Sjungma@eit.uni-kl.deinline 34212027Sjungma@eit.uni-kl.descfx_rep::scfx_rep( const char* s ) 34312027Sjungma@eit.uni-kl.de: m_mant( min_mant ), m_wp( 2 ), m_sign( 1 ), m_state( normal ), 34412027Sjungma@eit.uni-kl.de m_msw(0), m_lsw(0), m_r_flag( false ) 34512027Sjungma@eit.uni-kl.de{ 34612027Sjungma@eit.uni-kl.de from_string( s, SC_DEFAULT_CTE_WL_ ); 34712027Sjungma@eit.uni-kl.de} 34812027Sjungma@eit.uni-kl.de 34912027Sjungma@eit.uni-kl.de 35012027Sjungma@eit.uni-kl.de// destructor 35112027Sjungma@eit.uni-kl.de 35212027Sjungma@eit.uni-kl.deinline 35312027Sjungma@eit.uni-kl.descfx_rep::~scfx_rep() 35412027Sjungma@eit.uni-kl.de{} 35512027Sjungma@eit.uni-kl.de 35612027Sjungma@eit.uni-kl.de 35712027Sjungma@eit.uni-kl.de// assignment operator 35812027Sjungma@eit.uni-kl.de 35912027Sjungma@eit.uni-kl.deinline 36012027Sjungma@eit.uni-kl.devoid 36112027Sjungma@eit.uni-kl.descfx_rep::operator = ( const scfx_rep& f ) 36212027Sjungma@eit.uni-kl.de{ 36312027Sjungma@eit.uni-kl.de if( &f != this ) 36412027Sjungma@eit.uni-kl.de { 36512027Sjungma@eit.uni-kl.de m_mant = f.m_mant; 36612027Sjungma@eit.uni-kl.de m_wp = f.m_wp; 36712027Sjungma@eit.uni-kl.de m_sign = f.m_sign; 36812027Sjungma@eit.uni-kl.de m_state = f.m_state; 36912027Sjungma@eit.uni-kl.de m_msw = f.m_msw; 37012027Sjungma@eit.uni-kl.de m_lsw = f.m_lsw; 37112027Sjungma@eit.uni-kl.de round( SC_DEFAULT_MAX_WL_ ); 37212027Sjungma@eit.uni-kl.de } 37312027Sjungma@eit.uni-kl.de} 37412027Sjungma@eit.uni-kl.de 37512027Sjungma@eit.uni-kl.deinline 37612027Sjungma@eit.uni-kl.descfx_rep* 37712027Sjungma@eit.uni-kl.deneg_scfx_rep( const scfx_rep& a ) 37812027Sjungma@eit.uni-kl.de{ 37912027Sjungma@eit.uni-kl.de scfx_rep& c = *new scfx_rep( a ); 38012027Sjungma@eit.uni-kl.de c.m_sign = - c.m_sign; 38112027Sjungma@eit.uni-kl.de return &c; 38212027Sjungma@eit.uni-kl.de} 38312027Sjungma@eit.uni-kl.de 38412027Sjungma@eit.uni-kl.deinline 38512027Sjungma@eit.uni-kl.descfx_rep* 38612027Sjungma@eit.uni-kl.demult_scfx_rep( const scfx_rep& a, const scfx_rep& b, int max_wl ) 38712027Sjungma@eit.uni-kl.de{ 38812027Sjungma@eit.uni-kl.de scfx_rep& c = *new scfx_rep; 38912027Sjungma@eit.uni-kl.de sc_dt::multiply( c, a, b, max_wl ); 39012027Sjungma@eit.uni-kl.de return &c; 39112027Sjungma@eit.uni-kl.de} 39212027Sjungma@eit.uni-kl.de 39312027Sjungma@eit.uni-kl.deinline 39412027Sjungma@eit.uni-kl.descfx_rep* 39512027Sjungma@eit.uni-kl.delsh_scfx_rep( const scfx_rep& a, int b ) 39612027Sjungma@eit.uni-kl.de{ 39712027Sjungma@eit.uni-kl.de scfx_rep& c = *new scfx_rep( a ); 39812027Sjungma@eit.uni-kl.de c.lshift( b ); 39912027Sjungma@eit.uni-kl.de return &c; 40012027Sjungma@eit.uni-kl.de} 40112027Sjungma@eit.uni-kl.de 40212027Sjungma@eit.uni-kl.deinline 40312027Sjungma@eit.uni-kl.descfx_rep* 40412027Sjungma@eit.uni-kl.dersh_scfx_rep( const scfx_rep& a, int b ) 40512027Sjungma@eit.uni-kl.de{ 40612027Sjungma@eit.uni-kl.de scfx_rep& c = *new scfx_rep( a ); 40712027Sjungma@eit.uni-kl.de c.rshift( b ); 40812027Sjungma@eit.uni-kl.de return &c; 40912027Sjungma@eit.uni-kl.de} 41012027Sjungma@eit.uni-kl.de 41112027Sjungma@eit.uni-kl.deinline 41212027Sjungma@eit.uni-kl.deint 41312027Sjungma@eit.uni-kl.descfx_rep::size() const 41412027Sjungma@eit.uni-kl.de{ 41512027Sjungma@eit.uni-kl.de return m_mant.size(); 41612027Sjungma@eit.uni-kl.de} 41712027Sjungma@eit.uni-kl.de 41812027Sjungma@eit.uni-kl.deinline 41912027Sjungma@eit.uni-kl.debool 42012027Sjungma@eit.uni-kl.descfx_rep::is_neg() const 42112027Sjungma@eit.uni-kl.de{ 42212027Sjungma@eit.uni-kl.de return ( m_sign == -1 ); 42312027Sjungma@eit.uni-kl.de} 42412027Sjungma@eit.uni-kl.de 42512027Sjungma@eit.uni-kl.deinline 42612027Sjungma@eit.uni-kl.debool 42712027Sjungma@eit.uni-kl.descfx_rep::is_zero() const 42812027Sjungma@eit.uni-kl.de{ 42912027Sjungma@eit.uni-kl.de if( m_state != normal ) 43012027Sjungma@eit.uni-kl.de return false; 43112027Sjungma@eit.uni-kl.de 43212027Sjungma@eit.uni-kl.de for( int i = 0; i < size(); i ++ ) 43312027Sjungma@eit.uni-kl.de { 43412027Sjungma@eit.uni-kl.de if( m_mant[i] ) 43512027Sjungma@eit.uni-kl.de return false; 43612027Sjungma@eit.uni-kl.de } 43712027Sjungma@eit.uni-kl.de 43812027Sjungma@eit.uni-kl.de return true; 43912027Sjungma@eit.uni-kl.de} 44012027Sjungma@eit.uni-kl.de 44112027Sjungma@eit.uni-kl.deinline 44212027Sjungma@eit.uni-kl.debool 44312027Sjungma@eit.uni-kl.descfx_rep::is_nan() const 44412027Sjungma@eit.uni-kl.de{ 44512027Sjungma@eit.uni-kl.de return ( m_state == not_a_number ); 44612027Sjungma@eit.uni-kl.de} 44712027Sjungma@eit.uni-kl.de 44812027Sjungma@eit.uni-kl.deinline 44912027Sjungma@eit.uni-kl.debool 45012027Sjungma@eit.uni-kl.descfx_rep::is_inf() const 45112027Sjungma@eit.uni-kl.de{ 45212027Sjungma@eit.uni-kl.de return ( m_state == infinity ); 45312027Sjungma@eit.uni-kl.de} 45412027Sjungma@eit.uni-kl.de 45512027Sjungma@eit.uni-kl.deinline 45612027Sjungma@eit.uni-kl.debool 45712027Sjungma@eit.uni-kl.descfx_rep::is_normal() const 45812027Sjungma@eit.uni-kl.de{ 45912027Sjungma@eit.uni-kl.de return ( m_state == normal ); 46012027Sjungma@eit.uni-kl.de} 46112027Sjungma@eit.uni-kl.de 46212027Sjungma@eit.uni-kl.deinline 46312027Sjungma@eit.uni-kl.descfx_rep* 46412027Sjungma@eit.uni-kl.dequantization_scfx_rep( const scfx_rep& a, 46512027Sjungma@eit.uni-kl.de const scfx_params& params, 46612027Sjungma@eit.uni-kl.de bool& q_flag ) 46712027Sjungma@eit.uni-kl.de{ 46812027Sjungma@eit.uni-kl.de scfx_rep& c = *new scfx_rep( a ); 46912027Sjungma@eit.uni-kl.de c.quantization( params, q_flag ); 47012027Sjungma@eit.uni-kl.de return &c; 47112027Sjungma@eit.uni-kl.de} 47212027Sjungma@eit.uni-kl.de 47312027Sjungma@eit.uni-kl.deinline 47412027Sjungma@eit.uni-kl.descfx_rep* 47512027Sjungma@eit.uni-kl.deoverflow_scfx_rep( const scfx_rep& a, 47612027Sjungma@eit.uni-kl.de const scfx_params& params, 47712027Sjungma@eit.uni-kl.de bool& o_flag ) 47812027Sjungma@eit.uni-kl.de{ 47912027Sjungma@eit.uni-kl.de scfx_rep& c = *new scfx_rep( a ); 48012027Sjungma@eit.uni-kl.de c.overflow( params, o_flag ); 48112027Sjungma@eit.uni-kl.de return &c; 48212027Sjungma@eit.uni-kl.de} 48312027Sjungma@eit.uni-kl.de 48412027Sjungma@eit.uni-kl.deinline 48512027Sjungma@eit.uni-kl.debool 48612027Sjungma@eit.uni-kl.descfx_rep::rounding_flag() const 48712027Sjungma@eit.uni-kl.de{ 48812027Sjungma@eit.uni-kl.de return m_r_flag; 48912027Sjungma@eit.uni-kl.de} 49012027Sjungma@eit.uni-kl.de 49112027Sjungma@eit.uni-kl.deinline 49212027Sjungma@eit.uni-kl.devoid 49312027Sjungma@eit.uni-kl.descfx_rep::resize_to( int new_size, int restore ) 49412027Sjungma@eit.uni-kl.de{ 49512027Sjungma@eit.uni-kl.de if( restore == -1 ) 49612027Sjungma@eit.uni-kl.de { 49712027Sjungma@eit.uni-kl.de int size_incr = new_size - size(); 49812027Sjungma@eit.uni-kl.de m_wp += size_incr; 49912027Sjungma@eit.uni-kl.de m_msw += size_incr; 50012027Sjungma@eit.uni-kl.de m_lsw += size_incr; 50112027Sjungma@eit.uni-kl.de } 50212027Sjungma@eit.uni-kl.de m_mant.resize_to( new_size, restore ); 50312027Sjungma@eit.uni-kl.de} 50412027Sjungma@eit.uni-kl.de 50512027Sjungma@eit.uni-kl.deinline 50612027Sjungma@eit.uni-kl.deconst scfx_index 50712027Sjungma@eit.uni-kl.descfx_rep::calc_indices( int n ) const 50812027Sjungma@eit.uni-kl.de{ 50912027Sjungma@eit.uni-kl.de int wi = n / bits_in_word + m_wp; 51012027Sjungma@eit.uni-kl.de int bi = n % bits_in_word; 51112027Sjungma@eit.uni-kl.de 51212027Sjungma@eit.uni-kl.de if( bi < 0 ) 51312027Sjungma@eit.uni-kl.de { 51412027Sjungma@eit.uni-kl.de bi += bits_in_word; 51512027Sjungma@eit.uni-kl.de -- wi; 51612027Sjungma@eit.uni-kl.de } 51712027Sjungma@eit.uni-kl.de 51812027Sjungma@eit.uni-kl.de return scfx_index( wi, bi ); 51912027Sjungma@eit.uni-kl.de} 52012027Sjungma@eit.uni-kl.de 52112027Sjungma@eit.uni-kl.deinline 52212027Sjungma@eit.uni-kl.devoid 52312027Sjungma@eit.uni-kl.descfx_rep::o_extend( const scfx_index& x, sc_enc enc ) 52412027Sjungma@eit.uni-kl.de{ 52512027Sjungma@eit.uni-kl.de int wi = x.wi(); 52612027Sjungma@eit.uni-kl.de int bi = x.bi(); 52712027Sjungma@eit.uni-kl.de 52812027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 52912027Sjungma@eit.uni-kl.de 53012027Sjungma@eit.uni-kl.de if( enc == SC_US_ || ( m_mant[wi] & ( ((word)1) << bi ) ) == 0 ) 53112027Sjungma@eit.uni-kl.de { 53212027Sjungma@eit.uni-kl.de if( bi != bits_in_word - 1 ) 53312027Sjungma@eit.uni-kl.de m_mant[wi] &= ~( ((word)-1) << ( bi + 1 ) ); 53412027Sjungma@eit.uni-kl.de for( int i = wi + 1; i < size(); ++ i ) 53512027Sjungma@eit.uni-kl.de m_mant[i] = 0; 53612027Sjungma@eit.uni-kl.de m_sign = 1; 53712027Sjungma@eit.uni-kl.de } 53812027Sjungma@eit.uni-kl.de else 53912027Sjungma@eit.uni-kl.de { 54012027Sjungma@eit.uni-kl.de if( bi != bits_in_word - 1 ) 54112027Sjungma@eit.uni-kl.de m_mant[wi] |= ( ((word)-1) << ( bi + 1 ) ); 54212027Sjungma@eit.uni-kl.de for( int i = wi + 1; i < size(); ++ i ) 54312027Sjungma@eit.uni-kl.de m_mant[i] = static_cast<word>( -1 ); 54412027Sjungma@eit.uni-kl.de m_sign = -1; 54512027Sjungma@eit.uni-kl.de } 54612027Sjungma@eit.uni-kl.de} 54712027Sjungma@eit.uni-kl.de 54812027Sjungma@eit.uni-kl.deinline 54912027Sjungma@eit.uni-kl.debool 55012027Sjungma@eit.uni-kl.descfx_rep::o_bit_at( const scfx_index& x ) const 55112027Sjungma@eit.uni-kl.de{ 55212027Sjungma@eit.uni-kl.de int wi = x.wi(); 55312027Sjungma@eit.uni-kl.de int bi = x.bi(); 55412027Sjungma@eit.uni-kl.de 55512027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 55612027Sjungma@eit.uni-kl.de 55712027Sjungma@eit.uni-kl.de return ( m_mant[wi] & ( ((word)1) << bi ) ) != 0; 55812027Sjungma@eit.uni-kl.de} 55912027Sjungma@eit.uni-kl.de 56012027Sjungma@eit.uni-kl.deinline 56112027Sjungma@eit.uni-kl.debool 56212027Sjungma@eit.uni-kl.descfx_rep::o_zero_left( const scfx_index& x ) const 56312027Sjungma@eit.uni-kl.de{ 56412027Sjungma@eit.uni-kl.de int wi = x.wi(); 56512027Sjungma@eit.uni-kl.de int bi = x.bi(); 56612027Sjungma@eit.uni-kl.de 56712027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 56812027Sjungma@eit.uni-kl.de 56912027Sjungma@eit.uni-kl.de bool zero = true; 57012027Sjungma@eit.uni-kl.de if( bi != bits_in_word - 1 ) 57112027Sjungma@eit.uni-kl.de zero = ( m_mant[wi] & ( ((word)-1) << ( bi + 1 ) ) ) == 0; 57212027Sjungma@eit.uni-kl.de for( int i = wi + 1; i < size(); ++ i ) 57312027Sjungma@eit.uni-kl.de zero = zero && m_mant[i] == 0; 57412027Sjungma@eit.uni-kl.de 57512027Sjungma@eit.uni-kl.de return zero; 57612027Sjungma@eit.uni-kl.de} 57712027Sjungma@eit.uni-kl.de 57812027Sjungma@eit.uni-kl.deinline 57912027Sjungma@eit.uni-kl.debool 58012027Sjungma@eit.uni-kl.descfx_rep::o_zero_right( const scfx_index& x ) const 58112027Sjungma@eit.uni-kl.de{ 58212027Sjungma@eit.uni-kl.de int wi = x.wi(); 58312027Sjungma@eit.uni-kl.de int bi = x.bi(); 58412027Sjungma@eit.uni-kl.de 58512027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 58612027Sjungma@eit.uni-kl.de 58712027Sjungma@eit.uni-kl.de bool zero = ( m_mant[wi] & ~( ((word)-1) << bi ) ) == 0; 58812027Sjungma@eit.uni-kl.de for( int i = wi - 1; i >= 0; -- i ) 58912027Sjungma@eit.uni-kl.de zero = zero && m_mant[i] == 0; 59012027Sjungma@eit.uni-kl.de 59112027Sjungma@eit.uni-kl.de return zero; 59212027Sjungma@eit.uni-kl.de} 59312027Sjungma@eit.uni-kl.de 59412027Sjungma@eit.uni-kl.deinline 59512027Sjungma@eit.uni-kl.devoid 59612027Sjungma@eit.uni-kl.descfx_rep::o_set_low( const scfx_index& x, sc_enc enc ) 59712027Sjungma@eit.uni-kl.de{ 59812027Sjungma@eit.uni-kl.de int wi = x.wi(); 59912027Sjungma@eit.uni-kl.de int bi = x.bi(); 60012027Sjungma@eit.uni-kl.de 60112027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 60212027Sjungma@eit.uni-kl.de 60312027Sjungma@eit.uni-kl.de m_mant.clear(); 60412027Sjungma@eit.uni-kl.de 60512027Sjungma@eit.uni-kl.de if( enc == SC_TC_ ) 60612027Sjungma@eit.uni-kl.de { 60712027Sjungma@eit.uni-kl.de m_mant[wi] |= ( ((word)1) << bi ); 60812027Sjungma@eit.uni-kl.de m_sign = -1; 60912027Sjungma@eit.uni-kl.de } 61012027Sjungma@eit.uni-kl.de else 61112027Sjungma@eit.uni-kl.de m_sign = 1; 61212027Sjungma@eit.uni-kl.de} 61312027Sjungma@eit.uni-kl.de 61412027Sjungma@eit.uni-kl.deinline 61512027Sjungma@eit.uni-kl.devoid 61612027Sjungma@eit.uni-kl.descfx_rep::o_set_high( const scfx_index& x, const scfx_index& x2, 61712027Sjungma@eit.uni-kl.de sc_enc enc, int sign ) 61812027Sjungma@eit.uni-kl.de{ 61912027Sjungma@eit.uni-kl.de int wi = x.wi(); 62012027Sjungma@eit.uni-kl.de int bi = x.bi(); 62112027Sjungma@eit.uni-kl.de int wi2 = x2.wi(); 62212027Sjungma@eit.uni-kl.de int bi2 = x2.bi(); 62312027Sjungma@eit.uni-kl.de 62412027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 62512027Sjungma@eit.uni-kl.de SC_ASSERT_( wi2 >= 0 && wi2 < size(), "word index out of range" ); 62612027Sjungma@eit.uni-kl.de 62712027Sjungma@eit.uni-kl.de int i; 62812027Sjungma@eit.uni-kl.de 62912027Sjungma@eit.uni-kl.de for( i = 0; i < size(); ++ i ) 63012027Sjungma@eit.uni-kl.de m_mant[i] = static_cast<word>( -1 ); 63112027Sjungma@eit.uni-kl.de 63212027Sjungma@eit.uni-kl.de m_mant[wi] &= ~( ((word)-1) << bi ); 63312027Sjungma@eit.uni-kl.de for( i = wi + 1; i < size(); ++ i ) 63412027Sjungma@eit.uni-kl.de m_mant[i] = 0; 63512027Sjungma@eit.uni-kl.de 63612027Sjungma@eit.uni-kl.de m_mant[wi2] &= ( ((word)-1) << bi2 ); 63712027Sjungma@eit.uni-kl.de for( i = wi2 - 1; i >= 0; -- i ) 63812027Sjungma@eit.uni-kl.de m_mant[i] = 0; 63912027Sjungma@eit.uni-kl.de 64012027Sjungma@eit.uni-kl.de if( enc == SC_TC_ ) 64112027Sjungma@eit.uni-kl.de m_sign = sign; 64212027Sjungma@eit.uni-kl.de else 64312027Sjungma@eit.uni-kl.de { 64412027Sjungma@eit.uni-kl.de m_mant[wi] |= ( ((word)1) << bi ); 64512027Sjungma@eit.uni-kl.de m_sign = 1; 64612027Sjungma@eit.uni-kl.de } 64712027Sjungma@eit.uni-kl.de} 64812027Sjungma@eit.uni-kl.de 64912027Sjungma@eit.uni-kl.deinline 65012027Sjungma@eit.uni-kl.devoid 65112027Sjungma@eit.uni-kl.descfx_rep::o_set( const scfx_index& x, const scfx_index& x3, 65212027Sjungma@eit.uni-kl.de sc_enc enc, bool under ) 65312027Sjungma@eit.uni-kl.de{ 65412027Sjungma@eit.uni-kl.de int wi = x.wi(); 65512027Sjungma@eit.uni-kl.de int bi = x.bi(); 65612027Sjungma@eit.uni-kl.de int wi3 = x3.wi(); 65712027Sjungma@eit.uni-kl.de int bi3 = x3.bi(); 65812027Sjungma@eit.uni-kl.de 65912027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 66012027Sjungma@eit.uni-kl.de SC_ASSERT_( wi3 >= 0 && wi3 < size(), "word index out of range" ); 66112027Sjungma@eit.uni-kl.de 66212027Sjungma@eit.uni-kl.de if( bi3 != bits_in_word - 1 ) 66312027Sjungma@eit.uni-kl.de { 66412027Sjungma@eit.uni-kl.de if( under ) 66512027Sjungma@eit.uni-kl.de m_mant[wi3] &= ~( ((word)-1) << ( bi3 + 1 ) ); 66612027Sjungma@eit.uni-kl.de else 66712027Sjungma@eit.uni-kl.de m_mant[wi3] |= ( ((word)-1) << ( bi3 + 1 ) ); 66812027Sjungma@eit.uni-kl.de } 66912027Sjungma@eit.uni-kl.de for( int i = wi3 + 1; i < size(); ++ i ) 67012027Sjungma@eit.uni-kl.de { 67112027Sjungma@eit.uni-kl.de if( under ) 67212027Sjungma@eit.uni-kl.de m_mant[i] = 0; 67312027Sjungma@eit.uni-kl.de else 67412027Sjungma@eit.uni-kl.de m_mant[i] = static_cast<word>( -1 ); 67512027Sjungma@eit.uni-kl.de } 67612027Sjungma@eit.uni-kl.de 67712027Sjungma@eit.uni-kl.de if( enc == SC_TC_ ) 67812027Sjungma@eit.uni-kl.de { 67912027Sjungma@eit.uni-kl.de if( under ) 68012027Sjungma@eit.uni-kl.de m_mant[wi] |= ( ((word)1) << bi ); 68112027Sjungma@eit.uni-kl.de else 68212027Sjungma@eit.uni-kl.de m_mant[wi] &= ~( ((word)1) << bi ); 68312027Sjungma@eit.uni-kl.de } 68412027Sjungma@eit.uni-kl.de} 68512027Sjungma@eit.uni-kl.de 68612027Sjungma@eit.uni-kl.deinline 68712027Sjungma@eit.uni-kl.devoid 68812027Sjungma@eit.uni-kl.descfx_rep::o_invert( const scfx_index& x2 ) 68912027Sjungma@eit.uni-kl.de{ 69012027Sjungma@eit.uni-kl.de int wi2 = x2.wi(); 69112027Sjungma@eit.uni-kl.de int bi2 = x2.bi(); 69212027Sjungma@eit.uni-kl.de 69312027Sjungma@eit.uni-kl.de m_mant[wi2] ^= ( ((word)-1) << bi2 ); 69412027Sjungma@eit.uni-kl.de for( int i = wi2 + 1; i < size(); ++ i ) 69512027Sjungma@eit.uni-kl.de m_mant[i] = ~ m_mant[i]; 69612027Sjungma@eit.uni-kl.de} 69712027Sjungma@eit.uni-kl.de 69812027Sjungma@eit.uni-kl.deinline 69912027Sjungma@eit.uni-kl.debool 70012027Sjungma@eit.uni-kl.descfx_rep::q_bit( const scfx_index& x ) const 70112027Sjungma@eit.uni-kl.de{ 70212027Sjungma@eit.uni-kl.de int wi = x.wi(); 70312027Sjungma@eit.uni-kl.de int bi = x.bi(); 70412027Sjungma@eit.uni-kl.de 70512027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 70612027Sjungma@eit.uni-kl.de 70712027Sjungma@eit.uni-kl.de if( bi != 0 ) 70812027Sjungma@eit.uni-kl.de return ( m_mant[wi] & ( ((word)1) << ( bi - 1 ) ) ) != 0; 70912027Sjungma@eit.uni-kl.de else if( wi != 0 ) 71012027Sjungma@eit.uni-kl.de return ( m_mant[wi - 1] & ( ((word)1) << ( bits_in_word - 1 ) ) ) != 0; 71112027Sjungma@eit.uni-kl.de else 71212027Sjungma@eit.uni-kl.de return false; 71312027Sjungma@eit.uni-kl.de} 71412027Sjungma@eit.uni-kl.de 71512027Sjungma@eit.uni-kl.deinline 71612027Sjungma@eit.uni-kl.devoid 71712027Sjungma@eit.uni-kl.descfx_rep::q_clear( const scfx_index& x ) 71812027Sjungma@eit.uni-kl.de{ 71912027Sjungma@eit.uni-kl.de int wi = x.wi(); 72012027Sjungma@eit.uni-kl.de int bi = x.bi(); 72112027Sjungma@eit.uni-kl.de 72212027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 72312027Sjungma@eit.uni-kl.de 72412027Sjungma@eit.uni-kl.de m_mant[wi] &= ( ((word)-1) << bi ); 72512027Sjungma@eit.uni-kl.de for( int i = wi - 1; i >= 0; -- i ) 72612027Sjungma@eit.uni-kl.de m_mant[i] = 0; 72712027Sjungma@eit.uni-kl.de} 72812027Sjungma@eit.uni-kl.de 72912027Sjungma@eit.uni-kl.deinline 73012027Sjungma@eit.uni-kl.devoid 73112027Sjungma@eit.uni-kl.descfx_rep::q_incr( const scfx_index& x ) 73212027Sjungma@eit.uni-kl.de{ 73312027Sjungma@eit.uni-kl.de int wi = x.wi(); 73412027Sjungma@eit.uni-kl.de int bi = x.bi(); 73512027Sjungma@eit.uni-kl.de 73612027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 73712027Sjungma@eit.uni-kl.de 73812027Sjungma@eit.uni-kl.de word old_val = m_mant[wi]; 73912027Sjungma@eit.uni-kl.de m_mant[wi] += ( ((word)1) << bi ); 74012027Sjungma@eit.uni-kl.de if( m_mant[wi] <= old_val ) 74112027Sjungma@eit.uni-kl.de { 74212027Sjungma@eit.uni-kl.de if( wi + 1 == size() ) 74312027Sjungma@eit.uni-kl.de resize_to( size() + 1, 1 ); 74412027Sjungma@eit.uni-kl.de 74512027Sjungma@eit.uni-kl.de for( int i = wi + 1; i < size(); ++ i ) 74612027Sjungma@eit.uni-kl.de { 74712027Sjungma@eit.uni-kl.de if( ++ m_mant[i] != 0 ) 74812027Sjungma@eit.uni-kl.de break; 74912027Sjungma@eit.uni-kl.de } 75012027Sjungma@eit.uni-kl.de } 75112027Sjungma@eit.uni-kl.de} 75212027Sjungma@eit.uni-kl.de 75312027Sjungma@eit.uni-kl.deinline 75412027Sjungma@eit.uni-kl.debool 75512027Sjungma@eit.uni-kl.descfx_rep::q_odd( const scfx_index& x ) const 75612027Sjungma@eit.uni-kl.de{ 75712027Sjungma@eit.uni-kl.de int wi = x.wi(); 75812027Sjungma@eit.uni-kl.de int bi = x.bi(); 75912027Sjungma@eit.uni-kl.de 76012027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 76112027Sjungma@eit.uni-kl.de 76212027Sjungma@eit.uni-kl.de return ( m_mant[wi] & ( ((word)1) << bi ) ) != 0; 76312027Sjungma@eit.uni-kl.de} 76412027Sjungma@eit.uni-kl.de 76512027Sjungma@eit.uni-kl.deinline 76612027Sjungma@eit.uni-kl.debool 76712027Sjungma@eit.uni-kl.descfx_rep::q_zero( const scfx_index& x ) const 76812027Sjungma@eit.uni-kl.de{ 76912027Sjungma@eit.uni-kl.de int wi = x.wi(); 77012027Sjungma@eit.uni-kl.de int bi = x.bi(); 77112027Sjungma@eit.uni-kl.de 77212027Sjungma@eit.uni-kl.de SC_ASSERT_( wi >= 0 && wi < size(), "word index out of range" ); 77312027Sjungma@eit.uni-kl.de 77412027Sjungma@eit.uni-kl.de bool zero; 77512027Sjungma@eit.uni-kl.de 77612027Sjungma@eit.uni-kl.de if( bi != 0 ) 77712027Sjungma@eit.uni-kl.de { 77812027Sjungma@eit.uni-kl.de zero = ( m_mant[wi] & ~( ((word)-1) << (bi - 1) ) ) == 0; 77912027Sjungma@eit.uni-kl.de for( int i = wi - 1; i >= 0; -- i ) 78012027Sjungma@eit.uni-kl.de zero = zero && m_mant[i] == 0; 78112027Sjungma@eit.uni-kl.de } 78212027Sjungma@eit.uni-kl.de else if( wi != 0 ) 78312027Sjungma@eit.uni-kl.de { 78412027Sjungma@eit.uni-kl.de zero = ( m_mant[wi - 1] & ~( ((word)-1) << (bits_in_word - 1) ) ) == 0; 78512027Sjungma@eit.uni-kl.de for( int i = wi - 2; i >= 0; -- i ) 78612027Sjungma@eit.uni-kl.de zero = zero && m_mant[i] == 0; 78712027Sjungma@eit.uni-kl.de } 78812027Sjungma@eit.uni-kl.de else 78912027Sjungma@eit.uni-kl.de zero = true; 79012027Sjungma@eit.uni-kl.de 79112027Sjungma@eit.uni-kl.de return zero; 79212027Sjungma@eit.uni-kl.de} 79312027Sjungma@eit.uni-kl.de 79412027Sjungma@eit.uni-kl.deinline 79512027Sjungma@eit.uni-kl.deint 79612027Sjungma@eit.uni-kl.descfx_rep::find_lsw() const 79712027Sjungma@eit.uni-kl.de{ 79812027Sjungma@eit.uni-kl.de for( int i = 0; i < size(); i ++ ) 79912027Sjungma@eit.uni-kl.de { 80012027Sjungma@eit.uni-kl.de if( m_mant[i] ) 80112027Sjungma@eit.uni-kl.de return i; 80212027Sjungma@eit.uni-kl.de } 80312027Sjungma@eit.uni-kl.de return 0; 80412027Sjungma@eit.uni-kl.de} 80512027Sjungma@eit.uni-kl.de 80612027Sjungma@eit.uni-kl.deinline 80712027Sjungma@eit.uni-kl.deint 80812027Sjungma@eit.uni-kl.descfx_rep::find_msw() const 80912027Sjungma@eit.uni-kl.de{ 81012027Sjungma@eit.uni-kl.de for( int i = size() - 1; i >= 0; i -- ) 81112027Sjungma@eit.uni-kl.de { 81212027Sjungma@eit.uni-kl.de if( m_mant[i] ) 81312027Sjungma@eit.uni-kl.de return i; 81412027Sjungma@eit.uni-kl.de } 81512027Sjungma@eit.uni-kl.de return 0; 81612027Sjungma@eit.uni-kl.de} 81712027Sjungma@eit.uni-kl.de 81812027Sjungma@eit.uni-kl.deinline 81912027Sjungma@eit.uni-kl.devoid 82012027Sjungma@eit.uni-kl.descfx_rep::find_sw() 82112027Sjungma@eit.uni-kl.de{ 82212027Sjungma@eit.uni-kl.de m_lsw = find_lsw(); 82312027Sjungma@eit.uni-kl.de m_msw = find_msw(); 82412027Sjungma@eit.uni-kl.de} 82512027Sjungma@eit.uni-kl.de 82612027Sjungma@eit.uni-kl.deinline 82712027Sjungma@eit.uni-kl.devoid 82812027Sjungma@eit.uni-kl.descfx_rep::toggle_tc() 82912027Sjungma@eit.uni-kl.de{ 83012027Sjungma@eit.uni-kl.de if( is_neg() ) 83112027Sjungma@eit.uni-kl.de { 83212027Sjungma@eit.uni-kl.de complement( m_mant, m_mant, m_mant.size() ); 83312027Sjungma@eit.uni-kl.de inc( m_mant ); 83412027Sjungma@eit.uni-kl.de } 83512027Sjungma@eit.uni-kl.de} 83612027Sjungma@eit.uni-kl.de 83712027Sjungma@eit.uni-kl.de} // namespace sc_dt 83812027Sjungma@eit.uni-kl.de 83912027Sjungma@eit.uni-kl.de 84012027Sjungma@eit.uni-kl.de#endif 84112027Sjungma@eit.uni-kl.de 84212027Sjungma@eit.uni-kl.de// Taf! 843