sc_nbutils.h revision 12027
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