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