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_nbutils.h -- External and friend functions for both sc_signed and
2312027Sjungma@eit.uni-kl.de                  sc_unsigned classes.
2412027Sjungma@eit.uni-kl.de
2512027Sjungma@eit.uni-kl.de  Original Author: Ali Dasdan, 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: sc_nbutils.h,v $
4012027Sjungma@eit.uni-kl.de// Revision 1.6  2011/09/08 16:12:15  acg
4112027Sjungma@eit.uni-kl.de//  Philipp A. Hartmann: fix issue with Sun machines wrt real math libraries.
4212027Sjungma@eit.uni-kl.de//
4312027Sjungma@eit.uni-kl.de// Revision 1.5  2011/08/26 23:00:01  acg
4412027Sjungma@eit.uni-kl.de//  Torsten Maehne: remove use of ieeefp.h.
4512027Sjungma@eit.uni-kl.de//
4612027Sjungma@eit.uni-kl.de// Revision 1.4  2011/08/15 16:43:24  acg
4712027Sjungma@eit.uni-kl.de//  Torsten Maehne: changes to remove unused argument warnings.
4812027Sjungma@eit.uni-kl.de//
4912027Sjungma@eit.uni-kl.de// Revision 1.3  2011/02/18 20:19:15  acg
5012027Sjungma@eit.uni-kl.de//  Andy Goodrich: updating Copyright notice.
5112027Sjungma@eit.uni-kl.de//
5212027Sjungma@eit.uni-kl.de// Revision 1.2  2010/09/06 16:35:48  acg
5312027Sjungma@eit.uni-kl.de//  Andy Goodrich: changed i386 to __i386__ in ifdef's.
5412027Sjungma@eit.uni-kl.de//
5512027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
5612027Sjungma@eit.uni-kl.de// SystemC 2.3
5712027Sjungma@eit.uni-kl.de//
5812027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:49:32  acg
5912027Sjungma@eit.uni-kl.de// Added $Log command so that CVS check in comments are reproduced in the
6012027Sjungma@eit.uni-kl.de// source.
6112027Sjungma@eit.uni-kl.de//
6212027Sjungma@eit.uni-kl.de
6312027Sjungma@eit.uni-kl.de#ifndef SC_NBUTILS_H
6412027Sjungma@eit.uni-kl.de#define SC_NBUTILS_H
6512027Sjungma@eit.uni-kl.de
6612027Sjungma@eit.uni-kl.de#include <cmath>
6712027Sjungma@eit.uni-kl.de#include <limits>
6812027Sjungma@eit.uni-kl.de
6912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit_ids.h"
7012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_ids.h"
7112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_nbdefs.h"
7212027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_report.h"
7312027Sjungma@eit.uni-kl.de
7412027Sjungma@eit.uni-kl.de
7512027Sjungma@eit.uni-kl.denamespace sc_dt
7612027Sjungma@eit.uni-kl.de{
7712027Sjungma@eit.uni-kl.de
7812027Sjungma@eit.uni-kl.de//-----------------------------------------------------------------------------
7912027Sjungma@eit.uni-kl.de//"sc_io_base"
8012027Sjungma@eit.uni-kl.de//
8112027Sjungma@eit.uni-kl.de// This inline function returns the type of an i/o stream's base as a SystemC
8212027Sjungma@eit.uni-kl.de// base designator.
8312027Sjungma@eit.uni-kl.de//   stream_object = reference to the i/o stream whose base is to be returned.
8412027Sjungma@eit.uni-kl.de//
8512027Sjungma@eit.uni-kl.de//"sc_io_show_base"
8612027Sjungma@eit.uni-kl.de//
8712027Sjungma@eit.uni-kl.de// This inline function returns true if the base should be shown when a SystemC
8812027Sjungma@eit.uni-kl.de// value is displayed via the supplied stream operator.
8912027Sjungma@eit.uni-kl.de//   stream_object = reference to the i/o stream to return showbase value for.
9012027Sjungma@eit.uni-kl.de//-----------------------------------------------------------------------------
9112027Sjungma@eit.uni-kl.de#if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC)
9212027Sjungma@eit.uni-kl.de    inline sc_numrep
9312027Sjungma@eit.uni-kl.de    sc_io_base( systemc_ostream& os, sc_numrep def_base )
9412027Sjungma@eit.uni-kl.de    {
9512027Sjungma@eit.uni-kl.de        std::ios::fmtflags flags = os.flags() & std::ios::basefield;
9612027Sjungma@eit.uni-kl.de        if ( flags & ::std::ios::dec ) return  SC_DEC;
9712027Sjungma@eit.uni-kl.de        if ( flags & ::std::ios::hex ) return  SC_HEX;
9812027Sjungma@eit.uni-kl.de        if ( flags & ::std::ios::oct ) return  SC_OCT;
9912027Sjungma@eit.uni-kl.de        return def_base;
10012027Sjungma@eit.uni-kl.de    }
10112027Sjungma@eit.uni-kl.de
10212027Sjungma@eit.uni-kl.de    inline bool
10312027Sjungma@eit.uni-kl.de    sc_io_show_base( systemc_ostream& os )
10412027Sjungma@eit.uni-kl.de    {
10512027Sjungma@eit.uni-kl.de        return (os.flags() & ::std::ios::showbase) != 0 ;
10612027Sjungma@eit.uni-kl.de    }
10712027Sjungma@eit.uni-kl.de#else   // Other
10812027Sjungma@eit.uni-kl.de    inline sc_numrep
10912027Sjungma@eit.uni-kl.de    sc_io_base( systemc_ostream& /*unused*/, sc_numrep /*unused*/ )
11012027Sjungma@eit.uni-kl.de    {
11112027Sjungma@eit.uni-kl.de        return SC_DEC;
11212027Sjungma@eit.uni-kl.de    }
11312027Sjungma@eit.uni-kl.de    inline bool
11412027Sjungma@eit.uni-kl.de    sc_io_show_base( systemc_ostream& /*unused*/ )
11512027Sjungma@eit.uni-kl.de    {
11612027Sjungma@eit.uni-kl.de        return false;
11712027Sjungma@eit.uni-kl.de    }
11812027Sjungma@eit.uni-kl.de#endif
11912027Sjungma@eit.uni-kl.de
12012027Sjungma@eit.uni-kl.deconst std::string to_string( sc_numrep );
12112027Sjungma@eit.uni-kl.de
12212027Sjungma@eit.uni-kl.deinline
12312027Sjungma@eit.uni-kl.desystemc_ostream&
12412027Sjungma@eit.uni-kl.deoperator << ( systemc_ostream& os, sc_numrep numrep )
12512027Sjungma@eit.uni-kl.de{
12612027Sjungma@eit.uni-kl.de    os << to_string( numrep );
12712027Sjungma@eit.uni-kl.de    return os;
12812027Sjungma@eit.uni-kl.de}
12912027Sjungma@eit.uni-kl.de
13012027Sjungma@eit.uni-kl.de// only used within vec_from_str (non-standard, deprecated)
13112027Sjungma@eit.uni-kl.deinline void
13212027Sjungma@eit.uni-kl.deis_valid_base(sc_numrep base)
13312027Sjungma@eit.uni-kl.de{
13412027Sjungma@eit.uni-kl.de  switch (base) {
13512027Sjungma@eit.uni-kl.de    case SC_NOBASE: case SC_BIN:
13612027Sjungma@eit.uni-kl.de    case SC_OCT: case SC_DEC:
13712027Sjungma@eit.uni-kl.de    case SC_HEX:
13812027Sjungma@eit.uni-kl.de        break;
13912027Sjungma@eit.uni-kl.de    case SC_BIN_US: case SC_BIN_SM:
14012027Sjungma@eit.uni-kl.de    case SC_OCT_US: case SC_OCT_SM:
14112027Sjungma@eit.uni-kl.de    case SC_HEX_US: case SC_HEX_SM:
14212027Sjungma@eit.uni-kl.de    case SC_CSD:
14312027Sjungma@eit.uni-kl.de      SC_REPORT_ERROR( sc_core::SC_ID_NOT_IMPLEMENTED_,
14412027Sjungma@eit.uni-kl.de		       "is_valid_base( sc_numrep base ) : "
14512027Sjungma@eit.uni-kl.de		       "bases SC_CSD, or ending in _US and _SM are not supported" );
14612027Sjungma@eit.uni-kl.de      break;
14712027Sjungma@eit.uni-kl.de    default:
14812027Sjungma@eit.uni-kl.de      char msg[BUFSIZ];
14912027Sjungma@eit.uni-kl.de      std::sprintf( msg, "is_valid_base( sc_numrep base ) : "
15012027Sjungma@eit.uni-kl.de	       "base = %s is not valid",
15112027Sjungma@eit.uni-kl.de	       to_string( base ).c_str() );
15212027Sjungma@eit.uni-kl.de      SC_REPORT_ERROR( sc_core::SC_ID_VALUE_NOT_VALID_, msg );
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
15812027Sjungma@eit.uni-kl.de// One transition of the FSM to find base and sign of a number.
15912027Sjungma@eit.uni-kl.deextern
16012027Sjungma@eit.uni-kl.desmall_type
16112027Sjungma@eit.uni-kl.defsm_move(char c, small_type &b, small_type &s, small_type &state);
16212027Sjungma@eit.uni-kl.de
16312027Sjungma@eit.uni-kl.de// Parse a character string into its equivalent binary bits.
16412027Sjungma@eit.uni-kl.deextern
16512027Sjungma@eit.uni-kl.devoid parse_binary_bits(
16612027Sjungma@eit.uni-kl.de    const char* src_p, int dst_n, sc_digit* data_p, sc_digit* ctrl_p=0
16712027Sjungma@eit.uni-kl.de);
16812027Sjungma@eit.uni-kl.de
16912027Sjungma@eit.uni-kl.de
17012027Sjungma@eit.uni-kl.de// Parse a character string into its equivalent hexadecimal bits.
17112027Sjungma@eit.uni-kl.deextern
17212027Sjungma@eit.uni-kl.devoid parse_hex_bits(
17312027Sjungma@eit.uni-kl.de    const char* src_p, int dst_n, sc_digit* data_p, sc_digit* ctrl_p=0
17412027Sjungma@eit.uni-kl.de);
17512027Sjungma@eit.uni-kl.de
17612027Sjungma@eit.uni-kl.de
17712027Sjungma@eit.uni-kl.de// Find the base and sign of a number in v.
17812027Sjungma@eit.uni-kl.deextern
17912027Sjungma@eit.uni-kl.deconst char *
18012027Sjungma@eit.uni-kl.deget_base_and_sign(const char *v, small_type &base, small_type &sign);
18112027Sjungma@eit.uni-kl.de
18212027Sjungma@eit.uni-kl.de// Create a number out of v in base.
18312027Sjungma@eit.uni-kl.deextern
18412027Sjungma@eit.uni-kl.desmall_type
18512027Sjungma@eit.uni-kl.devec_from_str(int unb, int und, sc_digit *u,
18612027Sjungma@eit.uni-kl.de             const char *v, sc_numrep base = SC_NOBASE) ;
18712027Sjungma@eit.uni-kl.de
18812027Sjungma@eit.uni-kl.de
18912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
19012027Sjungma@eit.uni-kl.de//  Naming convention for the vec_ functions below:
19112027Sjungma@eit.uni-kl.de//    vec_OP(u, v, w)  : computes w = u OP v.
19212027Sjungma@eit.uni-kl.de//    vec_OP_on(u, v)  : computes u = u OP v if u has more digits than v.
19312027Sjungma@eit.uni-kl.de//    vec_OP_on2(u, v) : computes u = u OP v if u has fewer digits than v.
19412027Sjungma@eit.uni-kl.de//    _large           : parameters are vectors.
19512027Sjungma@eit.uni-kl.de//    _small           : one of the parameters is a single digit.
19612027Sjungma@eit.uni-kl.de//    Xlen             : the number of digits in X.
19712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
19812027Sjungma@eit.uni-kl.de
19912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
20012027Sjungma@eit.uni-kl.de//  Functions for vector addition: w = u + v or u += v.
20112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
20212027Sjungma@eit.uni-kl.de
20312027Sjungma@eit.uni-kl.deextern
20412027Sjungma@eit.uni-kl.devoid
20512027Sjungma@eit.uni-kl.devec_add(int ulen, const sc_digit *u,
20612027Sjungma@eit.uni-kl.de        int vlen, const sc_digit *v, sc_digit *w);
20712027Sjungma@eit.uni-kl.de
20812027Sjungma@eit.uni-kl.deextern
20912027Sjungma@eit.uni-kl.devoid
21012027Sjungma@eit.uni-kl.devec_add_on(int ulen, sc_digit *u,
21112027Sjungma@eit.uni-kl.de           int vlen, const sc_digit *v);
21212027Sjungma@eit.uni-kl.de
21312027Sjungma@eit.uni-kl.deextern
21412027Sjungma@eit.uni-kl.devoid
21512027Sjungma@eit.uni-kl.devec_add_on2(int ulen, sc_digit *u,
21612027Sjungma@eit.uni-kl.de            int vlen, const sc_digit *v);
21712027Sjungma@eit.uni-kl.de
21812027Sjungma@eit.uni-kl.deextern
21912027Sjungma@eit.uni-kl.devoid
22012027Sjungma@eit.uni-kl.devec_add_small(int ulen, const sc_digit *u,
22112027Sjungma@eit.uni-kl.de              sc_digit v, sc_digit *w);
22212027Sjungma@eit.uni-kl.de
22312027Sjungma@eit.uni-kl.deextern
22412027Sjungma@eit.uni-kl.devoid
22512027Sjungma@eit.uni-kl.devec_add_small_on(int ulen, sc_digit *u, sc_digit v);
22612027Sjungma@eit.uni-kl.de
22712027Sjungma@eit.uni-kl.de
22812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
22912027Sjungma@eit.uni-kl.de//  Functions for vector subtraction: w = u - v, u -= v, or u = v - u.
23012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
23112027Sjungma@eit.uni-kl.de
23212027Sjungma@eit.uni-kl.deextern
23312027Sjungma@eit.uni-kl.devoid
23412027Sjungma@eit.uni-kl.devec_sub(int ulen, const sc_digit *u,
23512027Sjungma@eit.uni-kl.de        int vlen, const sc_digit *v, sc_digit *w);
23612027Sjungma@eit.uni-kl.de
23712027Sjungma@eit.uni-kl.deextern
23812027Sjungma@eit.uni-kl.devoid
23912027Sjungma@eit.uni-kl.devec_sub_on(int ulen, sc_digit *u,
24012027Sjungma@eit.uni-kl.de           int vlen, const sc_digit *v);
24112027Sjungma@eit.uni-kl.de
24212027Sjungma@eit.uni-kl.deextern
24312027Sjungma@eit.uni-kl.devoid
24412027Sjungma@eit.uni-kl.devec_sub_on2(int ulen, sc_digit *u,
24512027Sjungma@eit.uni-kl.de            int vlen, const sc_digit *v);
24612027Sjungma@eit.uni-kl.de
24712027Sjungma@eit.uni-kl.deextern
24812027Sjungma@eit.uni-kl.devoid
24912027Sjungma@eit.uni-kl.devec_sub_small(int ulen, const sc_digit *u,
25012027Sjungma@eit.uni-kl.de              sc_digit v, sc_digit *w);
25112027Sjungma@eit.uni-kl.de
25212027Sjungma@eit.uni-kl.deextern
25312027Sjungma@eit.uni-kl.devoid
25412027Sjungma@eit.uni-kl.devec_sub_small_on(int ulen, sc_digit *u, sc_digit v);
25512027Sjungma@eit.uni-kl.de
25612027Sjungma@eit.uni-kl.de
25712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
25812027Sjungma@eit.uni-kl.de//  Functions for vector multiplication: w = u * v or u *= v.
25912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.deextern
26212027Sjungma@eit.uni-kl.devoid
26312027Sjungma@eit.uni-kl.devec_mul(int ulen, const sc_digit *u,
26412027Sjungma@eit.uni-kl.de        int vlen, const sc_digit *v, sc_digit *w);
26512027Sjungma@eit.uni-kl.de
26612027Sjungma@eit.uni-kl.deextern
26712027Sjungma@eit.uni-kl.devoid
26812027Sjungma@eit.uni-kl.devec_mul_small(int ulen, const sc_digit *u,
26912027Sjungma@eit.uni-kl.de              sc_digit v, sc_digit *w);
27012027Sjungma@eit.uni-kl.de
27112027Sjungma@eit.uni-kl.deextern
27212027Sjungma@eit.uni-kl.devoid
27312027Sjungma@eit.uni-kl.devec_mul_small_on(int ulen, sc_digit *u, sc_digit v);
27412027Sjungma@eit.uni-kl.de
27512027Sjungma@eit.uni-kl.de
27612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
27712027Sjungma@eit.uni-kl.de//  Functions for vector division: w = u / v.
27812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
27912027Sjungma@eit.uni-kl.de
28012027Sjungma@eit.uni-kl.deextern
28112027Sjungma@eit.uni-kl.devoid
28212027Sjungma@eit.uni-kl.devec_div_large(int ulen, const sc_digit *u,
28312027Sjungma@eit.uni-kl.de              int vlen, const sc_digit *v, sc_digit *w);
28412027Sjungma@eit.uni-kl.de
28512027Sjungma@eit.uni-kl.deextern
28612027Sjungma@eit.uni-kl.devoid
28712027Sjungma@eit.uni-kl.devec_div_small(int ulen, const sc_digit *u,
28812027Sjungma@eit.uni-kl.de              sc_digit v, sc_digit *w);
28912027Sjungma@eit.uni-kl.de
29012027Sjungma@eit.uni-kl.de
29112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
29212027Sjungma@eit.uni-kl.de//  Functions for vector remainder: w = u % v or u %= v.
29312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
29412027Sjungma@eit.uni-kl.de
29512027Sjungma@eit.uni-kl.deextern
29612027Sjungma@eit.uni-kl.devoid
29712027Sjungma@eit.uni-kl.devec_rem_large(int ulen, const sc_digit *u,
29812027Sjungma@eit.uni-kl.de              int vlen, const sc_digit *v, sc_digit *w);
29912027Sjungma@eit.uni-kl.de
30012027Sjungma@eit.uni-kl.deextern
30112027Sjungma@eit.uni-kl.desc_digit
30212027Sjungma@eit.uni-kl.devec_rem_small(int ulen, const sc_digit *u, sc_digit v);
30312027Sjungma@eit.uni-kl.de
30412027Sjungma@eit.uni-kl.deextern
30512027Sjungma@eit.uni-kl.desc_digit
30612027Sjungma@eit.uni-kl.devec_rem_on_small(int ulen, sc_digit *u, sc_digit v);
30712027Sjungma@eit.uni-kl.de
30812027Sjungma@eit.uni-kl.de
30912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
31012027Sjungma@eit.uni-kl.de//  Functions to convert between vectors of char and sc_digit.
31112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
31212027Sjungma@eit.uni-kl.de
31312027Sjungma@eit.uni-kl.deextern
31412027Sjungma@eit.uni-kl.deint
31512027Sjungma@eit.uni-kl.devec_to_char(int ulen, const sc_digit *u,
31612027Sjungma@eit.uni-kl.de            int vlen, uchar *v);
31712027Sjungma@eit.uni-kl.de
31812027Sjungma@eit.uni-kl.deextern
31912027Sjungma@eit.uni-kl.devoid
32012027Sjungma@eit.uni-kl.devec_from_char(int ulen, const uchar *u,
32112027Sjungma@eit.uni-kl.de              int vlen, sc_digit *v);
32212027Sjungma@eit.uni-kl.de
32312027Sjungma@eit.uni-kl.de
32412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
32512027Sjungma@eit.uni-kl.de//  Functions to shift left or right, or to create a mirror image of vectors.
32612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
32712027Sjungma@eit.uni-kl.de
32812027Sjungma@eit.uni-kl.deextern
32912027Sjungma@eit.uni-kl.devoid
33012027Sjungma@eit.uni-kl.devec_shift_left(int ulen, sc_digit *u, int nsl);
33112027Sjungma@eit.uni-kl.de
33212027Sjungma@eit.uni-kl.deextern
33312027Sjungma@eit.uni-kl.devoid
33412027Sjungma@eit.uni-kl.devec_shift_right(int vlen, sc_digit *u, int nsr, sc_digit fill = 0);
33512027Sjungma@eit.uni-kl.de
33612027Sjungma@eit.uni-kl.deextern
33712027Sjungma@eit.uni-kl.devoid
33812027Sjungma@eit.uni-kl.devec_reverse(int unb, int und, sc_digit *ud,
33912027Sjungma@eit.uni-kl.de            int l, int r = 0);
34012027Sjungma@eit.uni-kl.de
34112027Sjungma@eit.uni-kl.de
34212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
34312027Sjungma@eit.uni-kl.de//  Various utility functions.
34412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
34512027Sjungma@eit.uni-kl.de
34612027Sjungma@eit.uni-kl.de// Return the low half part of d.
34712027Sjungma@eit.uni-kl.deinline
34812027Sjungma@eit.uni-kl.desc_digit
34912027Sjungma@eit.uni-kl.delow_half(sc_digit d)
35012027Sjungma@eit.uni-kl.de{
35112027Sjungma@eit.uni-kl.de  return (d & HALF_DIGIT_MASK);
35212027Sjungma@eit.uni-kl.de}
35312027Sjungma@eit.uni-kl.de
35412027Sjungma@eit.uni-kl.de// Return the high half part of d. The high part of the digit may have
35512027Sjungma@eit.uni-kl.de// more bits than BITS_PER_HALF_DIGIT due to, e.g., overflow in the
35612027Sjungma@eit.uni-kl.de// multiplication. Hence, in other functions that use high_half(),
35712027Sjungma@eit.uni-kl.de// make sure that the result contains BITS_PER_HALF_DIGIT if
35812027Sjungma@eit.uni-kl.de// necessary. This is done by high_half_masked().
35912027Sjungma@eit.uni-kl.deinline
36012027Sjungma@eit.uni-kl.desc_digit
36112027Sjungma@eit.uni-kl.dehigh_half(sc_digit d)
36212027Sjungma@eit.uni-kl.de{
36312027Sjungma@eit.uni-kl.de  return (d >> BITS_PER_HALF_DIGIT);
36412027Sjungma@eit.uni-kl.de}
36512027Sjungma@eit.uni-kl.de
36612027Sjungma@eit.uni-kl.deinline
36712027Sjungma@eit.uni-kl.desc_digit
36812027Sjungma@eit.uni-kl.dehigh_half_masked(sc_digit d)
36912027Sjungma@eit.uni-kl.de{
37012027Sjungma@eit.uni-kl.de  return (high_half(d) & HALF_DIGIT_MASK);
37112027Sjungma@eit.uni-kl.de}
37212027Sjungma@eit.uni-kl.de
37312027Sjungma@eit.uni-kl.de// Concatenate the high part h and low part l. Assumes that h and l
37412027Sjungma@eit.uni-kl.de// are less than or equal to HALF_DIGIT_MASK;
37512027Sjungma@eit.uni-kl.deinline
37612027Sjungma@eit.uni-kl.desc_digit
37712027Sjungma@eit.uni-kl.deconcat(sc_digit h, sc_digit l)
37812027Sjungma@eit.uni-kl.de{
37912027Sjungma@eit.uni-kl.de  return ((h << BITS_PER_HALF_DIGIT) | l);
38012027Sjungma@eit.uni-kl.de}
38112027Sjungma@eit.uni-kl.de
38212027Sjungma@eit.uni-kl.de// Create a number with n 1's.
38312027Sjungma@eit.uni-kl.deinline
38412027Sjungma@eit.uni-kl.desc_digit
38512027Sjungma@eit.uni-kl.deone_and_ones(int n)
38612027Sjungma@eit.uni-kl.de{
38712027Sjungma@eit.uni-kl.de  return (((sc_digit) 1 << n) - 1);
38812027Sjungma@eit.uni-kl.de}
38912027Sjungma@eit.uni-kl.de
39012027Sjungma@eit.uni-kl.de// Create a number with one 1 and n 0's.
39112027Sjungma@eit.uni-kl.deinline
39212027Sjungma@eit.uni-kl.desc_digit
39312027Sjungma@eit.uni-kl.deone_and_zeros(int n)
39412027Sjungma@eit.uni-kl.de{
39512027Sjungma@eit.uni-kl.de  return ((sc_digit) 1 << n);
39612027Sjungma@eit.uni-kl.de}
39712027Sjungma@eit.uni-kl.de
39812027Sjungma@eit.uni-kl.de
39912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
40012027Sjungma@eit.uni-kl.de
40112027Sjungma@eit.uni-kl.de// Find the digit that bit i is in.
40212027Sjungma@eit.uni-kl.deinline
40312027Sjungma@eit.uni-kl.deint
40412027Sjungma@eit.uni-kl.dedigit_ord(int i)
40512027Sjungma@eit.uni-kl.de{
40612027Sjungma@eit.uni-kl.de  return (i / BITS_PER_DIGIT);
40712027Sjungma@eit.uni-kl.de}
40812027Sjungma@eit.uni-kl.de
40912027Sjungma@eit.uni-kl.de// Find the bit in digit_ord(i) that bit i corressponds to.
41012027Sjungma@eit.uni-kl.deinline
41112027Sjungma@eit.uni-kl.deint
41212027Sjungma@eit.uni-kl.debit_ord(int i)
41312027Sjungma@eit.uni-kl.de{
41412027Sjungma@eit.uni-kl.de  return (i % BITS_PER_DIGIT);
41512027Sjungma@eit.uni-kl.de}
41612027Sjungma@eit.uni-kl.de
41712027Sjungma@eit.uni-kl.de
41812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
41912027Sjungma@eit.uni-kl.de//  Functions to compare, zero, complement vector(s).
42012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
42112027Sjungma@eit.uni-kl.de
42212027Sjungma@eit.uni-kl.de// Compare u and v and return r
42312027Sjungma@eit.uni-kl.de//  r = 0 if u == v
42412027Sjungma@eit.uni-kl.de//  r < 0 if u < v
42512027Sjungma@eit.uni-kl.de//  r > 0 if u > v
42612027Sjungma@eit.uni-kl.de// - Assume that all the leading zero digits are already skipped.
42712027Sjungma@eit.uni-kl.de// - ulen and/or vlen can be zero.
42812027Sjungma@eit.uni-kl.de// - Every digit is less than or equal to DIGIT_MASK;
42912027Sjungma@eit.uni-kl.deinline
43012027Sjungma@eit.uni-kl.deint
43112027Sjungma@eit.uni-kl.devec_cmp(int ulen, const sc_digit *u,
43212027Sjungma@eit.uni-kl.de        int vlen, const sc_digit *v)
43312027Sjungma@eit.uni-kl.de{
43412027Sjungma@eit.uni-kl.de
43512027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
43612027Sjungma@eit.uni-kl.de  // assert((ulen <= 0) || (u != NULL));
43712027Sjungma@eit.uni-kl.de  // assert((vlen <= 0) || (v != NULL));
43812027Sjungma@eit.uni-kl.de
43912027Sjungma@eit.uni-kl.de  // ulen and vlen can be equal to 0 because vec_cmp can be called
44012027Sjungma@eit.uni-kl.de  // after vec_skip_leading_zeros.
44112027Sjungma@eit.uni-kl.de  assert((ulen >= 0) && (u != NULL));
44212027Sjungma@eit.uni-kl.de  assert((vlen >= 0) && (v != NULL));
44312027Sjungma@eit.uni-kl.de  // If ulen > 0, then the leading digit of u must be non-zero.
44412027Sjungma@eit.uni-kl.de  assert((ulen <= 0) || (u[ulen - 1] != 0));
44512027Sjungma@eit.uni-kl.de  assert((vlen <= 0) || (v[vlen - 1] != 0));
44612027Sjungma@eit.uni-kl.de#endif
44712027Sjungma@eit.uni-kl.de
44812027Sjungma@eit.uni-kl.de  if (ulen != vlen)
44912027Sjungma@eit.uni-kl.de    return (ulen - vlen);
45012027Sjungma@eit.uni-kl.de
45112027Sjungma@eit.uni-kl.de  // ulen == vlen >= 1
45212027Sjungma@eit.uni-kl.de  while ((--ulen >= 0) && (u[ulen] == v[ulen]))
45312027Sjungma@eit.uni-kl.de    ;
45412027Sjungma@eit.uni-kl.de
45512027Sjungma@eit.uni-kl.de  if (ulen < 0)
45612027Sjungma@eit.uni-kl.de    return 0;
45712027Sjungma@eit.uni-kl.de
45812027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
45912027Sjungma@eit.uni-kl.de  // Test to see if the result is wrong due to the presence of
46012027Sjungma@eit.uni-kl.de  // overflow bits.
46112027Sjungma@eit.uni-kl.de  assert((u[ulen] & DIGIT_MASK) != (v[ulen] & DIGIT_MASK));
46212027Sjungma@eit.uni-kl.de#endif
46312027Sjungma@eit.uni-kl.de
46412027Sjungma@eit.uni-kl.de  return (int) (u[ulen] - v[ulen]);
46512027Sjungma@eit.uni-kl.de
46612027Sjungma@eit.uni-kl.de}
46712027Sjungma@eit.uni-kl.de
46812027Sjungma@eit.uni-kl.de// Find the index of the first non-zero digit.
46912027Sjungma@eit.uni-kl.de// - ulen (before) = the number of digits in u.
47012027Sjungma@eit.uni-kl.de// - the returned value = the index of the first non-zero digit.
47112027Sjungma@eit.uni-kl.de// A negative value of -1 indicates that every digit in u is zero.
47212027Sjungma@eit.uni-kl.deinline
47312027Sjungma@eit.uni-kl.deint
47412027Sjungma@eit.uni-kl.devec_find_first_nonzero(int ulen, const sc_digit *u)
47512027Sjungma@eit.uni-kl.de{
47612027Sjungma@eit.uni-kl.de
47712027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
47812027Sjungma@eit.uni-kl.de  // assert((ulen <= 0) || (u != NULL));
47912027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
48012027Sjungma@eit.uni-kl.de#endif
48112027Sjungma@eit.uni-kl.de
48212027Sjungma@eit.uni-kl.de  while ((--ulen >= 0) && (! u[ulen]))
48312027Sjungma@eit.uni-kl.de    ;
48412027Sjungma@eit.uni-kl.de
48512027Sjungma@eit.uni-kl.de  return ulen;
48612027Sjungma@eit.uni-kl.de
48712027Sjungma@eit.uni-kl.de}
48812027Sjungma@eit.uni-kl.de
48912027Sjungma@eit.uni-kl.de// Skip all the leading zero digits.
49012027Sjungma@eit.uni-kl.de// - ulen (before) = the number of digits in u.
49112027Sjungma@eit.uni-kl.de// - the returned value = the number of non-zero digits in u.
49212027Sjungma@eit.uni-kl.de// - the returned value is non-negative.
49312027Sjungma@eit.uni-kl.deinline
49412027Sjungma@eit.uni-kl.deint
49512027Sjungma@eit.uni-kl.devec_skip_leading_zeros(int ulen, const sc_digit *u)
49612027Sjungma@eit.uni-kl.de{
49712027Sjungma@eit.uni-kl.de
49812027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
49912027Sjungma@eit.uni-kl.de  // assert((ulen <= 0) || (u != NULL));
50012027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
50112027Sjungma@eit.uni-kl.de#endif
50212027Sjungma@eit.uni-kl.de
50312027Sjungma@eit.uni-kl.de  return (1 + vec_find_first_nonzero(ulen, u));
50412027Sjungma@eit.uni-kl.de
50512027Sjungma@eit.uni-kl.de}
50612027Sjungma@eit.uni-kl.de
50712027Sjungma@eit.uni-kl.de// Compare u and v and return r
50812027Sjungma@eit.uni-kl.de//  r = 0 if u == v
50912027Sjungma@eit.uni-kl.de//  r < 0 if u < v
51012027Sjungma@eit.uni-kl.de//  r > 0 if u > v
51112027Sjungma@eit.uni-kl.deinline
51212027Sjungma@eit.uni-kl.deint
51312027Sjungma@eit.uni-kl.devec_skip_and_cmp(int ulen, const sc_digit *u,
51412027Sjungma@eit.uni-kl.de                 int vlen, const sc_digit *v)
51512027Sjungma@eit.uni-kl.de{
51612027Sjungma@eit.uni-kl.de
51712027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
51812027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
51912027Sjungma@eit.uni-kl.de  assert((vlen > 0) && (v != NULL));
52012027Sjungma@eit.uni-kl.de#endif
52112027Sjungma@eit.uni-kl.de
52212027Sjungma@eit.uni-kl.de  ulen = vec_skip_leading_zeros(ulen, u);
52312027Sjungma@eit.uni-kl.de  vlen = vec_skip_leading_zeros(vlen, v);
52412027Sjungma@eit.uni-kl.de  // ulen and/or vlen can be equal to zero here.
52512027Sjungma@eit.uni-kl.de  return vec_cmp(ulen, u, vlen, v);
52612027Sjungma@eit.uni-kl.de
52712027Sjungma@eit.uni-kl.de}
52812027Sjungma@eit.uni-kl.de
52912027Sjungma@eit.uni-kl.de// Set u[i] = 0 where i = from ... (ulen - 1).
53012027Sjungma@eit.uni-kl.deinline
53112027Sjungma@eit.uni-kl.devoid
53212027Sjungma@eit.uni-kl.devec_zero(int from, int ulen, sc_digit *u)
53312027Sjungma@eit.uni-kl.de{
53412027Sjungma@eit.uni-kl.de
53512027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
53612027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
53712027Sjungma@eit.uni-kl.de#endif
53812027Sjungma@eit.uni-kl.de
53912027Sjungma@eit.uni-kl.de  for(int i = from; i < ulen; i++)
54012027Sjungma@eit.uni-kl.de    u[i] = 0;
54112027Sjungma@eit.uni-kl.de
54212027Sjungma@eit.uni-kl.de}
54312027Sjungma@eit.uni-kl.de
54412027Sjungma@eit.uni-kl.de// Set u[i] = 0 where i = 0 .. (ulen - 1).
54512027Sjungma@eit.uni-kl.deinline
54612027Sjungma@eit.uni-kl.devoid
54712027Sjungma@eit.uni-kl.devec_zero(int ulen, sc_digit *u)
54812027Sjungma@eit.uni-kl.de{
54912027Sjungma@eit.uni-kl.de  vec_zero(0, ulen, u);
55012027Sjungma@eit.uni-kl.de}
55112027Sjungma@eit.uni-kl.de
55212027Sjungma@eit.uni-kl.de// Copy n digits from v to u.
55312027Sjungma@eit.uni-kl.deinline
55412027Sjungma@eit.uni-kl.devoid
55512027Sjungma@eit.uni-kl.devec_copy(int n, sc_digit *u, const sc_digit *v)
55612027Sjungma@eit.uni-kl.de{
55712027Sjungma@eit.uni-kl.de
55812027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
55912027Sjungma@eit.uni-kl.de  assert((n > 0) && (u != NULL) && (v != NULL));
56012027Sjungma@eit.uni-kl.de#endif
56112027Sjungma@eit.uni-kl.de
56212027Sjungma@eit.uni-kl.de  for (int i = 0; i < n; ++i)
56312027Sjungma@eit.uni-kl.de    u[i] = v[i];
56412027Sjungma@eit.uni-kl.de}
56512027Sjungma@eit.uni-kl.de
56612027Sjungma@eit.uni-kl.de// Copy v to u, where ulen >= vlen, and zero the rest of the digits in u.
56712027Sjungma@eit.uni-kl.deinline
56812027Sjungma@eit.uni-kl.devoid
56912027Sjungma@eit.uni-kl.devec_copy_and_zero(int ulen, sc_digit *u,
57012027Sjungma@eit.uni-kl.de                  int vlen, const sc_digit *v)
57112027Sjungma@eit.uni-kl.de{
57212027Sjungma@eit.uni-kl.de
57312027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
57412027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
57512027Sjungma@eit.uni-kl.de  assert((vlen > 0) && (v != NULL));
57612027Sjungma@eit.uni-kl.de  assert(ulen >= vlen);
57712027Sjungma@eit.uni-kl.de#endif
57812027Sjungma@eit.uni-kl.de
57912027Sjungma@eit.uni-kl.de  vec_copy(vlen, u, v);
58012027Sjungma@eit.uni-kl.de  vec_zero(vlen, ulen, u);
58112027Sjungma@eit.uni-kl.de
58212027Sjungma@eit.uni-kl.de}
58312027Sjungma@eit.uni-kl.de
58412027Sjungma@eit.uni-kl.de// 2's-complement the digits in u.
58512027Sjungma@eit.uni-kl.deinline
58612027Sjungma@eit.uni-kl.devoid
58712027Sjungma@eit.uni-kl.devec_complement(int ulen, sc_digit *u)
58812027Sjungma@eit.uni-kl.de{
58912027Sjungma@eit.uni-kl.de
59012027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
59112027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
59212027Sjungma@eit.uni-kl.de#endif
59312027Sjungma@eit.uni-kl.de
59412027Sjungma@eit.uni-kl.de  sc_digit carry = 1;
59512027Sjungma@eit.uni-kl.de
59612027Sjungma@eit.uni-kl.de  for (int i = 0; i < ulen; ++i) {
59712027Sjungma@eit.uni-kl.de    carry += (~u[i] & DIGIT_MASK);
59812027Sjungma@eit.uni-kl.de    u[i] = carry & DIGIT_MASK;
59912027Sjungma@eit.uni-kl.de    carry >>= BITS_PER_DIGIT;
60012027Sjungma@eit.uni-kl.de  }
60112027Sjungma@eit.uni-kl.de
60212027Sjungma@eit.uni-kl.de}
60312027Sjungma@eit.uni-kl.de
60412027Sjungma@eit.uni-kl.de
60512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
60612027Sjungma@eit.uni-kl.de//  Functions to handle built-in types or signs.
60712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
60812027Sjungma@eit.uni-kl.de
60912027Sjungma@eit.uni-kl.de// u = v
61012027Sjungma@eit.uni-kl.de// - v is an unsigned long or uint64, and positive integer.
61112027Sjungma@eit.uni-kl.detemplate< class Type >
61212027Sjungma@eit.uni-kl.deinline
61312027Sjungma@eit.uni-kl.devoid
61412027Sjungma@eit.uni-kl.defrom_uint(int ulen, sc_digit *u, Type v)
61512027Sjungma@eit.uni-kl.de{
61612027Sjungma@eit.uni-kl.de
61712027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
61812027Sjungma@eit.uni-kl.de  // assert((ulen <= 0) || (u != NULL));
61912027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
62012027Sjungma@eit.uni-kl.de  assert(v >= 0);
62112027Sjungma@eit.uni-kl.de#endif
62212027Sjungma@eit.uni-kl.de
62312027Sjungma@eit.uni-kl.de  int i = 0;
62412027Sjungma@eit.uni-kl.de
62512027Sjungma@eit.uni-kl.de  while (v && (i < ulen)) {
62612027Sjungma@eit.uni-kl.de#ifndef _WIN32
62712027Sjungma@eit.uni-kl.de    u[i++] = static_cast<sc_digit>( v & DIGIT_MASK );
62812027Sjungma@eit.uni-kl.de#else
62912027Sjungma@eit.uni-kl.de    u[i++] = ((sc_digit) v) & DIGIT_MASK;
63012027Sjungma@eit.uni-kl.de#endif
63112027Sjungma@eit.uni-kl.de    v >>= BITS_PER_DIGIT;
63212027Sjungma@eit.uni-kl.de  }
63312027Sjungma@eit.uni-kl.de
63412027Sjungma@eit.uni-kl.de  vec_zero(i, ulen, u);
63512027Sjungma@eit.uni-kl.de
63612027Sjungma@eit.uni-kl.de}
63712027Sjungma@eit.uni-kl.de
63812027Sjungma@eit.uni-kl.de
63912027Sjungma@eit.uni-kl.de// Get u's sign and return its absolute value.
64012027Sjungma@eit.uni-kl.de// u can be long, unsigned long, int64, or uint64.
64112027Sjungma@eit.uni-kl.detemplate< class Type >
64212027Sjungma@eit.uni-kl.deinline
64312027Sjungma@eit.uni-kl.desmall_type
64412027Sjungma@eit.uni-kl.deget_sign(Type &u)
64512027Sjungma@eit.uni-kl.de{
64612027Sjungma@eit.uni-kl.de  if (u > 0)
64712027Sjungma@eit.uni-kl.de    return SC_POS;
64812027Sjungma@eit.uni-kl.de
64912027Sjungma@eit.uni-kl.de  if (u == 0)
65012027Sjungma@eit.uni-kl.de    return SC_ZERO;
65112027Sjungma@eit.uni-kl.de
65212027Sjungma@eit.uni-kl.de  // no positive number representable for minimum value,
65312027Sjungma@eit.uni-kl.de  // leave as is to avoid Undefined Behaviour
65412027Sjungma@eit.uni-kl.de  if( SC_LIKELY_( u > (std::numeric_limits<Type>::min)() ) )
65512027Sjungma@eit.uni-kl.de    u = -u;
65612027Sjungma@eit.uni-kl.de
65712027Sjungma@eit.uni-kl.de  return SC_NEG;
65812027Sjungma@eit.uni-kl.de}
65912027Sjungma@eit.uni-kl.de
66012027Sjungma@eit.uni-kl.de
66112027Sjungma@eit.uni-kl.de// Return us * vs:
66212027Sjungma@eit.uni-kl.de// - Return SC_ZERO if either sign is SC_ZERO.
66312027Sjungma@eit.uni-kl.de// - Return SC_POS if us == vs
66412027Sjungma@eit.uni-kl.de// - Return SC_NEG if us != vs.
66512027Sjungma@eit.uni-kl.deinline
66612027Sjungma@eit.uni-kl.desmall_type
66712027Sjungma@eit.uni-kl.demul_signs(small_type us, small_type vs)
66812027Sjungma@eit.uni-kl.de{
66912027Sjungma@eit.uni-kl.de  if ((us == SC_ZERO) || (vs == SC_ZERO))
67012027Sjungma@eit.uni-kl.de    return SC_ZERO;
67112027Sjungma@eit.uni-kl.de
67212027Sjungma@eit.uni-kl.de  if (us == vs)
67312027Sjungma@eit.uni-kl.de    return SC_POS;
67412027Sjungma@eit.uni-kl.de
67512027Sjungma@eit.uni-kl.de  return SC_NEG;
67612027Sjungma@eit.uni-kl.de}
67712027Sjungma@eit.uni-kl.de
67812027Sjungma@eit.uni-kl.de
67912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
68012027Sjungma@eit.uni-kl.de//  Functions to test for errors and print out error messages.
68112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
68212027Sjungma@eit.uni-kl.de
68312027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS
68412027Sjungma@eit.uni-kl.de
68512027Sjungma@eit.uni-kl.deinline
68612027Sjungma@eit.uni-kl.devoid
68712027Sjungma@eit.uni-kl.detest_bound(int nb)
68812027Sjungma@eit.uni-kl.de{
68912027Sjungma@eit.uni-kl.de  if (nb > SC_MAX_NBITS) {
69012027Sjungma@eit.uni-kl.de      char msg[BUFSIZ];
69112027Sjungma@eit.uni-kl.de      std::sprintf( msg, "test_bound( int nb ) : "
69212027Sjungma@eit.uni-kl.de	       "nb = %d > SC_MAX_NBITS = %d is not valid",
69312027Sjungma@eit.uni-kl.de	       nb, SC_MAX_NBITS );
69412027Sjungma@eit.uni-kl.de      SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg );
69512027Sjungma@eit.uni-kl.de  }
69612027Sjungma@eit.uni-kl.de}
69712027Sjungma@eit.uni-kl.de
69812027Sjungma@eit.uni-kl.de#endif
69912027Sjungma@eit.uni-kl.de
70012027Sjungma@eit.uni-kl.detemplate< class Type >
70112027Sjungma@eit.uni-kl.deinline
70212027Sjungma@eit.uni-kl.devoid
70312027Sjungma@eit.uni-kl.dediv_by_zero(Type s)
70412027Sjungma@eit.uni-kl.de{
70512027Sjungma@eit.uni-kl.de  if (s == 0) {
70612027Sjungma@eit.uni-kl.de      SC_REPORT_ERROR( sc_core::SC_ID_OPERATION_FAILED_,
70712027Sjungma@eit.uni-kl.de		       "div_by_zero<Type>( Type ) : division by zero" );
70812027Sjungma@eit.uni-kl.de  }
70912027Sjungma@eit.uni-kl.de}
71012027Sjungma@eit.uni-kl.de
71112027Sjungma@eit.uni-kl.de
71212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
71312027Sjungma@eit.uni-kl.de//  Functions to check if a given vector is zero or make one.
71412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
71512027Sjungma@eit.uni-kl.de
71612027Sjungma@eit.uni-kl.de// If u[i] is zero for every i = 0,..., ulen - 1, return SC_ZERO,
71712027Sjungma@eit.uni-kl.de// else return s.
71812027Sjungma@eit.uni-kl.deinline
71912027Sjungma@eit.uni-kl.desmall_type
72012027Sjungma@eit.uni-kl.decheck_for_zero(small_type s, int ulen, const sc_digit *u)
72112027Sjungma@eit.uni-kl.de{
72212027Sjungma@eit.uni-kl.de
72312027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
72412027Sjungma@eit.uni-kl.de  // assert(ulen >= 0);
72512027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
72612027Sjungma@eit.uni-kl.de#endif
72712027Sjungma@eit.uni-kl.de
72812027Sjungma@eit.uni-kl.de  if (vec_find_first_nonzero(ulen, u) < 0)
72912027Sjungma@eit.uni-kl.de    return SC_ZERO;
73012027Sjungma@eit.uni-kl.de
73112027Sjungma@eit.uni-kl.de  return s;
73212027Sjungma@eit.uni-kl.de
73312027Sjungma@eit.uni-kl.de}
73412027Sjungma@eit.uni-kl.de
73512027Sjungma@eit.uni-kl.de// If u[i] is zero for every i = 0,..., ulen - 1, return true,
73612027Sjungma@eit.uni-kl.de// else return false.
73712027Sjungma@eit.uni-kl.deinline
73812027Sjungma@eit.uni-kl.debool
73912027Sjungma@eit.uni-kl.decheck_for_zero(int ulen, const sc_digit *u)
74012027Sjungma@eit.uni-kl.de{
74112027Sjungma@eit.uni-kl.de
74212027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
74312027Sjungma@eit.uni-kl.de  // assert(ulen >= 0);
74412027Sjungma@eit.uni-kl.de  assert((ulen > 0) && (u != NULL));
74512027Sjungma@eit.uni-kl.de#endif
74612027Sjungma@eit.uni-kl.de
74712027Sjungma@eit.uni-kl.de  if (vec_find_first_nonzero(ulen, u) < 0)
74812027Sjungma@eit.uni-kl.de    return true;
74912027Sjungma@eit.uni-kl.de
75012027Sjungma@eit.uni-kl.de  return false;
75112027Sjungma@eit.uni-kl.de
75212027Sjungma@eit.uni-kl.de}
75312027Sjungma@eit.uni-kl.de
75412027Sjungma@eit.uni-kl.deinline
75512027Sjungma@eit.uni-kl.desmall_type
75612027Sjungma@eit.uni-kl.demake_zero(int nd, sc_digit *d)
75712027Sjungma@eit.uni-kl.de{
75812027Sjungma@eit.uni-kl.de  vec_zero(nd, d);
75912027Sjungma@eit.uni-kl.de  return SC_ZERO;
76012027Sjungma@eit.uni-kl.de}
76112027Sjungma@eit.uni-kl.de
76212027Sjungma@eit.uni-kl.de
76312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
76412027Sjungma@eit.uni-kl.de//  Functions for both signed and unsigned numbers to convert sign-magnitude
76512027Sjungma@eit.uni-kl.de//  (SM) and 2's complement (2C) representations.
76612027Sjungma@eit.uni-kl.de//  added = 1 => for signed.
76712027Sjungma@eit.uni-kl.de//  added = 0 => for unsigned.
76812027Sjungma@eit.uni-kl.de//  IF_SC_SIGNED can be used as 'added'.
76912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
77012027Sjungma@eit.uni-kl.de
77112027Sjungma@eit.uni-kl.de// Trim the extra leading bits of a signed or unsigned number.
77212027Sjungma@eit.uni-kl.deinline
77312027Sjungma@eit.uni-kl.devoid
77412027Sjungma@eit.uni-kl.detrim(small_type added, int nb, int nd, sc_digit *d)
77512027Sjungma@eit.uni-kl.de{
77612027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
77712027Sjungma@eit.uni-kl.de  assert((nb > 0) && (nd > 0) && (d != NULL));
77812027Sjungma@eit.uni-kl.de#endif
77912027Sjungma@eit.uni-kl.de
78012027Sjungma@eit.uni-kl.de  d[nd - 1] &= one_and_ones(bit_ord(nb - 1) + added);
78112027Sjungma@eit.uni-kl.de}
78212027Sjungma@eit.uni-kl.de
78312027Sjungma@eit.uni-kl.de// Convert an (un)signed number from sign-magnitude representation to
78412027Sjungma@eit.uni-kl.de// 2's complement representation and trim the extra bits.
78512027Sjungma@eit.uni-kl.deinline
78612027Sjungma@eit.uni-kl.devoid
78712027Sjungma@eit.uni-kl.deconvert_SM_to_2C_trimmed(small_type added,
78812027Sjungma@eit.uni-kl.de                         small_type s, int nb, int nd, sc_digit *d)
78912027Sjungma@eit.uni-kl.de{
79012027Sjungma@eit.uni-kl.de  if (s == SC_NEG) {
79112027Sjungma@eit.uni-kl.de    vec_complement(nd, d);
79212027Sjungma@eit.uni-kl.de    trim(added, nb, nd, d);
79312027Sjungma@eit.uni-kl.de  }
79412027Sjungma@eit.uni-kl.de}
79512027Sjungma@eit.uni-kl.de
79612027Sjungma@eit.uni-kl.de// Convert an (un)signed number from sign-magnitude representation to
79712027Sjungma@eit.uni-kl.de// 2's complement representation but do not trim the extra bits.
79812027Sjungma@eit.uni-kl.deinline
79912027Sjungma@eit.uni-kl.devoid
80012027Sjungma@eit.uni-kl.deconvert_SM_to_2C(small_type s, int nd, sc_digit *d)
80112027Sjungma@eit.uni-kl.de{
80212027Sjungma@eit.uni-kl.de  if (s == SC_NEG)
80312027Sjungma@eit.uni-kl.de    vec_complement(nd, d);
80412027Sjungma@eit.uni-kl.de}
80512027Sjungma@eit.uni-kl.de
80612027Sjungma@eit.uni-kl.de
80712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
80812027Sjungma@eit.uni-kl.de//  Functions to convert between sign-magnitude (SM) and 2's complement
80912027Sjungma@eit.uni-kl.de//  (2C) representations of signed numbers.
81012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
81112027Sjungma@eit.uni-kl.de
81212027Sjungma@eit.uni-kl.de// Trim the extra leading bits off a signed number.
81312027Sjungma@eit.uni-kl.deinline
81412027Sjungma@eit.uni-kl.devoid
81512027Sjungma@eit.uni-kl.detrim_signed(int nb, int nd, sc_digit *d)
81612027Sjungma@eit.uni-kl.de{
81712027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
81812027Sjungma@eit.uni-kl.de  assert((nb > 0) && (nd > 0) && (d != NULL));
81912027Sjungma@eit.uni-kl.de#endif
82012027Sjungma@eit.uni-kl.de
82112027Sjungma@eit.uni-kl.de  d[nd - 1] &= one_and_ones(bit_ord(nb - 1) + 1);
82212027Sjungma@eit.uni-kl.de}
82312027Sjungma@eit.uni-kl.de
82412027Sjungma@eit.uni-kl.de// Convert a signed number from 2's complement representation to
82512027Sjungma@eit.uni-kl.de// sign-magnitude representation, and return its sign. nd is d's
82612027Sjungma@eit.uni-kl.de// actual size, without zeros eliminated.
82712027Sjungma@eit.uni-kl.deinline
82812027Sjungma@eit.uni-kl.desmall_type
82912027Sjungma@eit.uni-kl.deconvert_signed_2C_to_SM(int nb, int nd, sc_digit *d)
83012027Sjungma@eit.uni-kl.de{
83112027Sjungma@eit.uni-kl.de
83212027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
83312027Sjungma@eit.uni-kl.de  assert((nb > 0) && (nd > 0) && (d != NULL));
83412027Sjungma@eit.uni-kl.de#endif
83512027Sjungma@eit.uni-kl.de
83612027Sjungma@eit.uni-kl.de  small_type s;
83712027Sjungma@eit.uni-kl.de
83812027Sjungma@eit.uni-kl.de  int xnb = bit_ord(nb - 1) + 1;
83912027Sjungma@eit.uni-kl.de
84012027Sjungma@eit.uni-kl.de  // Test the sign bit.
84112027Sjungma@eit.uni-kl.de  if (d[nd - 1] & one_and_zeros(xnb - 1)) {
84212027Sjungma@eit.uni-kl.de    s = SC_NEG;
84312027Sjungma@eit.uni-kl.de    vec_complement(nd, d);
84412027Sjungma@eit.uni-kl.de  }
84512027Sjungma@eit.uni-kl.de  else
84612027Sjungma@eit.uni-kl.de    s = SC_POS;
84712027Sjungma@eit.uni-kl.de
84812027Sjungma@eit.uni-kl.de  // Trim the last digit.
84912027Sjungma@eit.uni-kl.de  d[nd - 1] &= one_and_ones(xnb);
85012027Sjungma@eit.uni-kl.de
85112027Sjungma@eit.uni-kl.de  // Check if the new number is zero.
85212027Sjungma@eit.uni-kl.de  if (s == SC_POS)
85312027Sjungma@eit.uni-kl.de    return check_for_zero(s, nd, d);
85412027Sjungma@eit.uni-kl.de
85512027Sjungma@eit.uni-kl.de  return s;
85612027Sjungma@eit.uni-kl.de
85712027Sjungma@eit.uni-kl.de}
85812027Sjungma@eit.uni-kl.de
85912027Sjungma@eit.uni-kl.de// Convert a signed number from sign-magnitude representation to 2's
86012027Sjungma@eit.uni-kl.de// complement representation, get its sign, convert back to
86112027Sjungma@eit.uni-kl.de// sign-magnitude representation, and return its sign. nd is d's
86212027Sjungma@eit.uni-kl.de// actual size, without zeros eliminated.
86312027Sjungma@eit.uni-kl.deinline
86412027Sjungma@eit.uni-kl.desmall_type
86512027Sjungma@eit.uni-kl.deconvert_signed_SM_to_2C_to_SM(small_type s, int nb, int nd, sc_digit *d)
86612027Sjungma@eit.uni-kl.de{
86712027Sjungma@eit.uni-kl.de  convert_SM_to_2C(s, nd, d);
86812027Sjungma@eit.uni-kl.de  return convert_signed_2C_to_SM(nb, nd, d);
86912027Sjungma@eit.uni-kl.de}
87012027Sjungma@eit.uni-kl.de
87112027Sjungma@eit.uni-kl.de// Convert a signed number from sign-magnitude representation to 2's
87212027Sjungma@eit.uni-kl.de// complement representation and trim the extra bits.
87312027Sjungma@eit.uni-kl.deinline
87412027Sjungma@eit.uni-kl.devoid
87512027Sjungma@eit.uni-kl.deconvert_signed_SM_to_2C_trimmed(small_type s, int nb, int nd, sc_digit *d)
87612027Sjungma@eit.uni-kl.de{
87712027Sjungma@eit.uni-kl.de  convert_SM_to_2C_trimmed(1, s, nb, nd, d);
87812027Sjungma@eit.uni-kl.de}
87912027Sjungma@eit.uni-kl.de
88012027Sjungma@eit.uni-kl.de// Convert a signed number from sign-magnitude representation to 2's
88112027Sjungma@eit.uni-kl.de// complement representation but do not trim the extra bits.
88212027Sjungma@eit.uni-kl.deinline
88312027Sjungma@eit.uni-kl.devoid
88412027Sjungma@eit.uni-kl.deconvert_signed_SM_to_2C(small_type s, int nd, sc_digit *d)
88512027Sjungma@eit.uni-kl.de{
88612027Sjungma@eit.uni-kl.de  convert_SM_to_2C(s, nd, d);
88712027Sjungma@eit.uni-kl.de}
88812027Sjungma@eit.uni-kl.de
88912027Sjungma@eit.uni-kl.de
89012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
89112027Sjungma@eit.uni-kl.de//  Functions to convert between sign-magnitude (SM) and 2's complement
89212027Sjungma@eit.uni-kl.de//  (2C) representations of unsigned numbers.
89312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
89412027Sjungma@eit.uni-kl.de
89512027Sjungma@eit.uni-kl.de// Trim the extra leading bits off an unsigned number.
89612027Sjungma@eit.uni-kl.deinline
89712027Sjungma@eit.uni-kl.devoid
89812027Sjungma@eit.uni-kl.detrim_unsigned(int nb, int nd, sc_digit *d)
89912027Sjungma@eit.uni-kl.de{
90012027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
90112027Sjungma@eit.uni-kl.de  assert((nb > 0) && (nd > 0) && (d != NULL));
90212027Sjungma@eit.uni-kl.de#endif
90312027Sjungma@eit.uni-kl.de
90412027Sjungma@eit.uni-kl.de  d[nd - 1] &= one_and_ones(bit_ord(nb - 1));
90512027Sjungma@eit.uni-kl.de}
90612027Sjungma@eit.uni-kl.de
90712027Sjungma@eit.uni-kl.de// Convert an unsigned number from 2's complement representation to
90812027Sjungma@eit.uni-kl.de// sign-magnitude representation, and return its sign. nd is d's
90912027Sjungma@eit.uni-kl.de// actual size, without zeros eliminated.
91012027Sjungma@eit.uni-kl.deinline
91112027Sjungma@eit.uni-kl.desmall_type
91212027Sjungma@eit.uni-kl.deconvert_unsigned_2C_to_SM(int nb, int nd, sc_digit *d)
91312027Sjungma@eit.uni-kl.de{
91412027Sjungma@eit.uni-kl.de  trim_unsigned(nb, nd, d);
91512027Sjungma@eit.uni-kl.de  return check_for_zero(SC_POS, nd, d);
91612027Sjungma@eit.uni-kl.de}
91712027Sjungma@eit.uni-kl.de
91812027Sjungma@eit.uni-kl.de// Convert an unsigned number from sign-magnitude representation to
91912027Sjungma@eit.uni-kl.de// 2's complement representation, get its sign, convert back to
92012027Sjungma@eit.uni-kl.de// sign-magnitude representation, and return its sign. nd is d's
92112027Sjungma@eit.uni-kl.de// actual size, without zeros eliminated.
92212027Sjungma@eit.uni-kl.deinline
92312027Sjungma@eit.uni-kl.desmall_type
92412027Sjungma@eit.uni-kl.deconvert_unsigned_SM_to_2C_to_SM(small_type s, int nb, int nd, sc_digit *d)
92512027Sjungma@eit.uni-kl.de{
92612027Sjungma@eit.uni-kl.de  convert_SM_to_2C(s, nd, d);
92712027Sjungma@eit.uni-kl.de  return convert_unsigned_2C_to_SM(nb, nd, d);
92812027Sjungma@eit.uni-kl.de}
92912027Sjungma@eit.uni-kl.de
93012027Sjungma@eit.uni-kl.de// Convert an unsigned number from sign-magnitude representation to
93112027Sjungma@eit.uni-kl.de// 2's complement representation and trim the extra bits.
93212027Sjungma@eit.uni-kl.deinline
93312027Sjungma@eit.uni-kl.devoid
93412027Sjungma@eit.uni-kl.deconvert_unsigned_SM_to_2C_trimmed(small_type s, int nb, int nd, sc_digit *d)
93512027Sjungma@eit.uni-kl.de{
93612027Sjungma@eit.uni-kl.de  convert_SM_to_2C_trimmed(0, s, nb, nd, d);
93712027Sjungma@eit.uni-kl.de}
93812027Sjungma@eit.uni-kl.de
93912027Sjungma@eit.uni-kl.de// Convert an unsigned number from sign-magnitude representation to
94012027Sjungma@eit.uni-kl.de// 2's complement representation but do not trim the extra bits.
94112027Sjungma@eit.uni-kl.deinline
94212027Sjungma@eit.uni-kl.devoid
94312027Sjungma@eit.uni-kl.deconvert_unsigned_SM_to_2C(small_type s, int nd, sc_digit *d)
94412027Sjungma@eit.uni-kl.de{
94512027Sjungma@eit.uni-kl.de  convert_SM_to_2C(s, nd, d);
94612027Sjungma@eit.uni-kl.de}
94712027Sjungma@eit.uni-kl.de
94812027Sjungma@eit.uni-kl.de
94912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
95012027Sjungma@eit.uni-kl.de//  Functions to copy one (un)signed number to another.
95112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
95212027Sjungma@eit.uni-kl.de
95312027Sjungma@eit.uni-kl.de// Copy v to u.
95412027Sjungma@eit.uni-kl.deinline
95512027Sjungma@eit.uni-kl.devoid
95612027Sjungma@eit.uni-kl.decopy_digits_signed(small_type &us,
95712027Sjungma@eit.uni-kl.de                   int unb, int und, sc_digit *ud,
95812027Sjungma@eit.uni-kl.de                   int vnb, int vnd, const sc_digit *vd)
95912027Sjungma@eit.uni-kl.de{
96012027Sjungma@eit.uni-kl.de
96112027Sjungma@eit.uni-kl.de  if (und <= vnd) {
96212027Sjungma@eit.uni-kl.de
96312027Sjungma@eit.uni-kl.de    vec_copy(und, ud, vd);
96412027Sjungma@eit.uni-kl.de
96512027Sjungma@eit.uni-kl.de    if (unb <= vnb)
96612027Sjungma@eit.uni-kl.de      us = convert_signed_SM_to_2C_to_SM(us, unb, und, ud);
96712027Sjungma@eit.uni-kl.de
96812027Sjungma@eit.uni-kl.de  }
96912027Sjungma@eit.uni-kl.de  else // und > vnd
97012027Sjungma@eit.uni-kl.de    vec_copy_and_zero(und, ud, vnd, vd);
97112027Sjungma@eit.uni-kl.de
97212027Sjungma@eit.uni-kl.de}
97312027Sjungma@eit.uni-kl.de
97412027Sjungma@eit.uni-kl.de// Copy v to u.
97512027Sjungma@eit.uni-kl.deinline
97612027Sjungma@eit.uni-kl.devoid
97712027Sjungma@eit.uni-kl.decopy_digits_unsigned(small_type &us,
97812027Sjungma@eit.uni-kl.de                     int unb, int und, sc_digit *ud,
97912027Sjungma@eit.uni-kl.de                     int /* vnb */, int vnd, const sc_digit *vd)
98012027Sjungma@eit.uni-kl.de{
98112027Sjungma@eit.uni-kl.de
98212027Sjungma@eit.uni-kl.de  if (und <= vnd)
98312027Sjungma@eit.uni-kl.de    vec_copy(und, ud, vd);
98412027Sjungma@eit.uni-kl.de
98512027Sjungma@eit.uni-kl.de  else // und > vnd
98612027Sjungma@eit.uni-kl.de    vec_copy_and_zero(und, ud, vnd, vd);
98712027Sjungma@eit.uni-kl.de
98812027Sjungma@eit.uni-kl.de  us = convert_unsigned_SM_to_2C_to_SM(us, unb, und, ud);
98912027Sjungma@eit.uni-kl.de
99012027Sjungma@eit.uni-kl.de}
99112027Sjungma@eit.uni-kl.de
99212027Sjungma@eit.uni-kl.de
99312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
99412027Sjungma@eit.uni-kl.de//  Faster set(i, v), without bound checking.
99512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
99612027Sjungma@eit.uni-kl.de
99712027Sjungma@eit.uni-kl.de// A version of set(i, v) without bound checking.
99812027Sjungma@eit.uni-kl.deinline
99912027Sjungma@eit.uni-kl.devoid
100012027Sjungma@eit.uni-kl.desafe_set(int i, bool v, sc_digit *d)
100112027Sjungma@eit.uni-kl.de{
100212027Sjungma@eit.uni-kl.de
100312027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC
100412027Sjungma@eit.uni-kl.de  assert((i >= 0) && (d != NULL));
100512027Sjungma@eit.uni-kl.de#endif
100612027Sjungma@eit.uni-kl.de
100712027Sjungma@eit.uni-kl.de  int bit_num = bit_ord(i);
100812027Sjungma@eit.uni-kl.de  int digit_num = digit_ord(i);
100912027Sjungma@eit.uni-kl.de
101012027Sjungma@eit.uni-kl.de  if (v)
101112027Sjungma@eit.uni-kl.de    d[digit_num] |= one_and_zeros(bit_num);
101212027Sjungma@eit.uni-kl.de  else
101312027Sjungma@eit.uni-kl.de    d[digit_num] &= ~(one_and_zeros(bit_num));
101412027Sjungma@eit.uni-kl.de
101512027Sjungma@eit.uni-kl.de}
101612027Sjungma@eit.uni-kl.de
101712027Sjungma@eit.uni-kl.de
101812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
101912027Sjungma@eit.uni-kl.de//  Function to check if a double number is bad (NaN or infinite).
102012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
102112027Sjungma@eit.uni-kl.de
102212027Sjungma@eit.uni-kl.deinline
102312027Sjungma@eit.uni-kl.debool
102412027Sjungma@eit.uni-kl.deis_nan( double v )
102512027Sjungma@eit.uni-kl.de{
102612027Sjungma@eit.uni-kl.de    return std::numeric_limits<double>::has_quiet_NaN && (v != v);
102712027Sjungma@eit.uni-kl.de}
102812027Sjungma@eit.uni-kl.de
102912027Sjungma@eit.uni-kl.deinline
103012027Sjungma@eit.uni-kl.debool
103112027Sjungma@eit.uni-kl.deis_inf( double v )
103212027Sjungma@eit.uni-kl.de{
103312027Sjungma@eit.uni-kl.de    return v ==  std::numeric_limits<double>::infinity()
103412027Sjungma@eit.uni-kl.de        || v == -std::numeric_limits<double>::infinity();
103512027Sjungma@eit.uni-kl.de}
103612027Sjungma@eit.uni-kl.de
103712027Sjungma@eit.uni-kl.deinline
103812027Sjungma@eit.uni-kl.devoid
103912027Sjungma@eit.uni-kl.deis_bad_double(double v)
104012027Sjungma@eit.uni-kl.de{
104112027Sjungma@eit.uni-kl.de// Windows throws exception.
104212027Sjungma@eit.uni-kl.de    if( is_nan(v) || is_inf(v) )
104312027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( sc_core::SC_ID_VALUE_NOT_VALID_,
104412027Sjungma@eit.uni-kl.de		         "is_bad_double( double v ) : "
104512027Sjungma@eit.uni-kl.de		         "v is not finite - NaN or Inf" );
104612027Sjungma@eit.uni-kl.de}
104712027Sjungma@eit.uni-kl.de
104812027Sjungma@eit.uni-kl.de} // namespace sc_dt
104912027Sjungma@eit.uni-kl.de
105012027Sjungma@eit.uni-kl.de
105112027Sjungma@eit.uni-kl.de#endif
1052