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_nbdefs.h -- Top level header file for arbitrary precision signed/unsigned 2312027Sjungma@eit.uni-kl.de arithmetic. This file defines all the constants needed. 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_nbdefs.h,v $ 4012027Sjungma@eit.uni-kl.de// Revision 1.7 2011/02/18 20:19:15 acg 4112027Sjungma@eit.uni-kl.de// Andy Goodrich: updating Copyright notice. 4212027Sjungma@eit.uni-kl.de// 4312027Sjungma@eit.uni-kl.de// Revision 1.6 2011/02/18 20:09:34 acg 4412027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: added alternative #define for Windows to guard. 4512027Sjungma@eit.uni-kl.de// 4612027Sjungma@eit.uni-kl.de// Revision 1.5 2011/01/20 16:52:20 acg 4712027Sjungma@eit.uni-kl.de// Andy Goodrich: changes for IEEE 1666 2011. 4812027Sjungma@eit.uni-kl.de// 4912027Sjungma@eit.uni-kl.de// Revision 1.4 2010/02/08 18:35:55 acg 5012027Sjungma@eit.uni-kl.de// Andy Goodrich: Philipp Hartmann's changes for Solaris and Linux 64. 5112027Sjungma@eit.uni-kl.de// 5212027Sjungma@eit.uni-kl.de// Revision 1.2 2009/05/22 16:06:29 acg 5312027Sjungma@eit.uni-kl.de// Andy Goodrich: process control updates. 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_NBDEFS_H 6412027Sjungma@eit.uni-kl.de#define SC_NBDEFS_H 6512027Sjungma@eit.uni-kl.de 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cmnhdr.h" 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.de#include <climits> 7012027Sjungma@eit.uni-kl.de 7112027Sjungma@eit.uni-kl.de#if defined(__sun) || defined(__sun__) 7212027Sjungma@eit.uni-kl.de# include <inttypes.h> 7312027Sjungma@eit.uni-kl.de#elif !defined(WIN32) && !defined(_WIN32) 7412027Sjungma@eit.uni-kl.de# include <stdint.h> 7512027Sjungma@eit.uni-kl.de#endif 7612027Sjungma@eit.uni-kl.de 7712027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_iostream.h" 7812027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_constants.h" // For SC_MAX_NBITS 7912027Sjungma@eit.uni-kl.de 8012027Sjungma@eit.uni-kl.de// Activate support mixed operands for concatenation via the comma operator 8112027Sjungma@eit.uni-kl.de#define SC_DT_MIXED_COMMA_OPERATORS 8212027Sjungma@eit.uni-kl.de 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.denamespace sc_dt 8512027Sjungma@eit.uni-kl.de{ 8612027Sjungma@eit.uni-kl.de 8712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 8812027Sjungma@eit.uni-kl.de// ENUM : sc_numrep 8912027Sjungma@eit.uni-kl.de// 9012027Sjungma@eit.uni-kl.de// Enumeration of number representations for character string conversion. 9112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.deenum sc_numrep 9412027Sjungma@eit.uni-kl.de{ 9512027Sjungma@eit.uni-kl.de SC_NOBASE = 0, 9612027Sjungma@eit.uni-kl.de SC_BIN = 2, 9712027Sjungma@eit.uni-kl.de SC_OCT = 8, 9812027Sjungma@eit.uni-kl.de SC_DEC = 10, 9912027Sjungma@eit.uni-kl.de SC_HEX = 16, 10012027Sjungma@eit.uni-kl.de SC_BIN_US, 10112027Sjungma@eit.uni-kl.de SC_BIN_SM, 10212027Sjungma@eit.uni-kl.de SC_OCT_US, 10312027Sjungma@eit.uni-kl.de SC_OCT_SM, 10412027Sjungma@eit.uni-kl.de SC_HEX_US, 10512027Sjungma@eit.uni-kl.de SC_HEX_SM, 10612027Sjungma@eit.uni-kl.de SC_CSD 10712027Sjungma@eit.uni-kl.de}; 10812027Sjungma@eit.uni-kl.de 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de// Sign of a number: 11112027Sjungma@eit.uni-kl.de#define SC_NEG -1 // Negative number 11212027Sjungma@eit.uni-kl.de#define SC_ZERO 0 // Zero 11312027Sjungma@eit.uni-kl.de#define SC_POS 1 // Positive number 11412027Sjungma@eit.uni-kl.de#define SC_NOSIGN 2 // Uninitialized sc_signed number 11512027Sjungma@eit.uni-kl.de 11612027Sjungma@eit.uni-kl.detypedef unsigned char uchar; 11712027Sjungma@eit.uni-kl.de 11812027Sjungma@eit.uni-kl.de// A small_type number is at least a char. Defining an int is probably 11912027Sjungma@eit.uni-kl.de// better for alignment. 12012027Sjungma@eit.uni-kl.detypedef int small_type; 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de// Attributes of a byte. 12312027Sjungma@eit.uni-kl.de#define BITS_PER_BYTE 8 12412027Sjungma@eit.uni-kl.de#define BYTE_RADIX 256 12512027Sjungma@eit.uni-kl.de#define BYTE_MASK 255 12612027Sjungma@eit.uni-kl.de 12712027Sjungma@eit.uni-kl.de// LOG2_BITS_PER_BYTE = log2(BITS_PER_BYTE), assuming that 12812027Sjungma@eit.uni-kl.de// BITS_PER_BYTE is a power of 2. 12912027Sjungma@eit.uni-kl.de#define LOG2_BITS_PER_BYTE 3 13012027Sjungma@eit.uni-kl.de 13112027Sjungma@eit.uni-kl.de// Attributes of the unsigned long. These definitions are used mainly in 13212027Sjungma@eit.uni-kl.de// the functions that are aware of the internal representation of 13312027Sjungma@eit.uni-kl.de// digits, e.g., get/set_packed_rep(). 13412027Sjungma@eit.uni-kl.de#define BYTES_PER_DIGIT_TYPE 4 13512027Sjungma@eit.uni-kl.de#define BITS_PER_DIGIT_TYPE 32 13612027Sjungma@eit.uni-kl.de 13712027Sjungma@eit.uni-kl.de// Attributes of a digit, i.e., unsigned long less the overflow bits. 13812027Sjungma@eit.uni-kl.de#define BYTES_PER_DIGIT 4 13912027Sjungma@eit.uni-kl.de#define BITS_PER_DIGIT 30 14012027Sjungma@eit.uni-kl.de#define DIGIT_RADIX (1ul << BITS_PER_DIGIT) 14112027Sjungma@eit.uni-kl.de#define DIGIT_MASK (DIGIT_RADIX - 1) 14212027Sjungma@eit.uni-kl.de// Make sure that BYTES_PER_DIGIT = ceil(BITS_PER_DIGIT / BITS_PER_BYTE). 14312027Sjungma@eit.uni-kl.de 14412027Sjungma@eit.uni-kl.de// Similar attributes for the half of a digit. Note that 14512027Sjungma@eit.uni-kl.de// HALF_DIGIT_RADIX is equal to the square root of DIGIT_RADIX. These 14612027Sjungma@eit.uni-kl.de// definitions are used mainly in the multiplication routines. 14712027Sjungma@eit.uni-kl.de#define BITS_PER_HALF_DIGIT (BITS_PER_DIGIT / 2) 14812027Sjungma@eit.uni-kl.de#define HALF_DIGIT_RADIX (1ul << BITS_PER_HALF_DIGIT) 14912027Sjungma@eit.uni-kl.de#define HALF_DIGIT_MASK (HALF_DIGIT_RADIX - 1) 15012027Sjungma@eit.uni-kl.de 15112027Sjungma@eit.uni-kl.de// DIV_CEIL2(x, y) = ceil(x / y). x and y are positive numbers. 15212027Sjungma@eit.uni-kl.de#define DIV_CEIL2(x, y) (((x) - 1) / (y) + 1) 15312027Sjungma@eit.uni-kl.de 15412027Sjungma@eit.uni-kl.de// DIV_CEIL(x) = ceil(x / BITS_PER_DIGIT) = the number of digits to 15512027Sjungma@eit.uni-kl.de// store x bits. x is a positive number. 15612027Sjungma@eit.uni-kl.de#define DIV_CEIL(x) DIV_CEIL2(x, BITS_PER_DIGIT) 15712027Sjungma@eit.uni-kl.de 15812027Sjungma@eit.uni-kl.de#ifdef SC_MAX_NBITS 15912027Sjungma@eit.uni-kl.deextern const int MAX_NDIGITS; 16012027Sjungma@eit.uni-kl.de// Consider a number with x bits another with y bits. The maximum 16112027Sjungma@eit.uni-kl.de// number of bits happens when we multiply them. The result will have 16212027Sjungma@eit.uni-kl.de// (x + y) bits. Assume that x + y <= SC_MAX_NBITS. Then, DIV_CEIL(x) + 16312027Sjungma@eit.uni-kl.de// DIV_CEIL(y) <= DIV_CEIL(SC_MAX_NBITS) + 2. This is the reason for +2 16412027Sjungma@eit.uni-kl.de// above. With this change, MAX_NDIGITS must be enough to hold the 16512027Sjungma@eit.uni-kl.de// result of any operation. 16612027Sjungma@eit.uni-kl.de#endif 16712027Sjungma@eit.uni-kl.de 16812027Sjungma@eit.uni-kl.de// Support for "digit" vectors used to hold the values of sc_signed, 16912027Sjungma@eit.uni-kl.de// sc_unsigned, sc_bv_base, and sc_lv_base data types. This type is also used 17012027Sjungma@eit.uni-kl.de// in the concatenation support. An sc_digit is currently an unsigned 32-bit 17112027Sjungma@eit.uni-kl.de// quantity. The typedef used is an unsigned int, rather than an unsigned long, 17212027Sjungma@eit.uni-kl.de// since the unsigned long data type varies in size between 32-bit and 64-bit 17312027Sjungma@eit.uni-kl.de// machines. 17412027Sjungma@eit.uni-kl.de 17512027Sjungma@eit.uni-kl.detypedef unsigned int sc_digit; // 32-bit unsigned integer 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.de// Support for the long long type. This type is not in the standard 17812027Sjungma@eit.uni-kl.de// but is usually supported by compilers. 17912027Sjungma@eit.uni-kl.de#ifndef _WIN32 18012027Sjungma@eit.uni-kl.de# if defined(__x86_64__) 18112027Sjungma@eit.uni-kl.de typedef long long int64; 18212027Sjungma@eit.uni-kl.de typedef unsigned long long uint64; 18312027Sjungma@eit.uni-kl.de# else 18412027Sjungma@eit.uni-kl.de typedef int64_t int64; 18512027Sjungma@eit.uni-kl.de typedef uint64_t uint64; 18612027Sjungma@eit.uni-kl.de# endif 18712027Sjungma@eit.uni-kl.de extern const uint64 UINT64_ZERO; 18812027Sjungma@eit.uni-kl.de extern const uint64 UINT64_ONE; 18912027Sjungma@eit.uni-kl.de extern const uint64 UINT64_32ONES; 19012027Sjungma@eit.uni-kl.de#else 19112027Sjungma@eit.uni-kl.de typedef __int64 int64; 19212027Sjungma@eit.uni-kl.de typedef unsigned __int64 uint64; 19312027Sjungma@eit.uni-kl.de extern const uint64 UINT64_ZERO; 19412027Sjungma@eit.uni-kl.de extern const uint64 UINT64_ONE; 19512027Sjungma@eit.uni-kl.de extern const uint64 UINT64_32ONES; 19612027Sjungma@eit.uni-kl.de#endif 19712027Sjungma@eit.uni-kl.de 19812027Sjungma@eit.uni-kl.de 19912027Sjungma@eit.uni-kl.de// Bits per ... 20012027Sjungma@eit.uni-kl.de// will be deleted in the future. Use numeric_limits instead 20112027Sjungma@eit.uni-kl.de#define BITS_PER_CHAR 8 20212027Sjungma@eit.uni-kl.de#define BITS_PER_INT (sizeof(int) * BITS_PER_CHAR) 20312027Sjungma@eit.uni-kl.de#define BITS_PER_LONG (sizeof(long) * BITS_PER_CHAR) 20412027Sjungma@eit.uni-kl.de#define BITS_PER_INT64 (sizeof(::sc_dt::int64) * BITS_PER_CHAR) 20512027Sjungma@eit.uni-kl.de#define BITS_PER_UINT (sizeof(unsigned int) * BITS_PER_CHAR) 20612027Sjungma@eit.uni-kl.de#define BITS_PER_ULONG (sizeof(unsigned long) * BITS_PER_CHAR) 20712027Sjungma@eit.uni-kl.de#define BITS_PER_UINT64 (sizeof(::sc_dt::uint64) * BITS_PER_CHAR) 20812027Sjungma@eit.uni-kl.de 20912027Sjungma@eit.uni-kl.de// Digits per ... 21012027Sjungma@eit.uni-kl.de#define DIGITS_PER_CHAR 1 21112027Sjungma@eit.uni-kl.de#define DIGITS_PER_INT ((BITS_PER_INT+29)/30) 21212027Sjungma@eit.uni-kl.de#define DIGITS_PER_LONG ((BITS_PER_LONG+29)/30) 21312027Sjungma@eit.uni-kl.de#define DIGITS_PER_INT64 ((BITS_PER_INT64+29)/30) 21412027Sjungma@eit.uni-kl.de#define DIGITS_PER_UINT ((BITS_PER_UINT+29)/30) 21512027Sjungma@eit.uni-kl.de#define DIGITS_PER_ULONG ((BITS_PER_ULONG+29)/30) 21612027Sjungma@eit.uni-kl.de#define DIGITS_PER_UINT64 ((BITS_PER_UINT64+29)/30) 21712027Sjungma@eit.uni-kl.de 21812027Sjungma@eit.uni-kl.de// Above, BITS_PER_X is mainly used for sc_signed, and BITS_PER_UX is 21912027Sjungma@eit.uni-kl.de// mainly used for sc_unsigned. 22012027Sjungma@eit.uni-kl.de 22112027Sjungma@eit.uni-kl.de#if defined( _WIN32 ) || defined( __HP_aCC ) 22212027Sjungma@eit.uni-kl.detypedef unsigned long fmtflags; 22312027Sjungma@eit.uni-kl.de#else 22412027Sjungma@eit.uni-kl.detypedef ::std::ios::fmtflags fmtflags; 22512027Sjungma@eit.uni-kl.de#endif 22612027Sjungma@eit.uni-kl.de 22712027Sjungma@eit.uni-kl.deextern const small_type NB_DEFAULT_BASE ; 22812027Sjungma@eit.uni-kl.de 22912027Sjungma@eit.uni-kl.de// For sc_int code: 23012027Sjungma@eit.uni-kl.de#define LLWIDTH BITS_PER_INT64 23112027Sjungma@eit.uni-kl.de#define INTWIDTH BITS_PER_INT 23212027Sjungma@eit.uni-kl.de 23312027Sjungma@eit.uni-kl.de#ifndef _32BIT_ 23412027Sjungma@eit.uni-kl.de 23512027Sjungma@eit.uni-kl.detypedef int64 int_type; 23612027Sjungma@eit.uni-kl.detypedef uint64 uint_type; 23712027Sjungma@eit.uni-kl.de#define SC_INTWIDTH 64 23812027Sjungma@eit.uni-kl.deextern const uint64 UINT_ZERO; 23912027Sjungma@eit.uni-kl.deextern const uint64 UINT_ONE; 24012027Sjungma@eit.uni-kl.de 24112027Sjungma@eit.uni-kl.de#else 24212027Sjungma@eit.uni-kl.de 24312027Sjungma@eit.uni-kl.detypedef int int_type; 24412027Sjungma@eit.uni-kl.detypedef unsigned int uint_type; 24512027Sjungma@eit.uni-kl.de#define SC_INTWIDTH 32 24612027Sjungma@eit.uni-kl.deextern const unsigned int UINT_ZERO; 24712027Sjungma@eit.uni-kl.deextern const unsigned int UINT_ONE; 24812027Sjungma@eit.uni-kl.de 24912027Sjungma@eit.uni-kl.de#endif 25012027Sjungma@eit.uni-kl.de 25112027Sjungma@eit.uni-kl.de 25212027Sjungma@eit.uni-kl.de#if defined(_MSC_VER) && ( _MSC_VER < 1300 ) 25312027Sjungma@eit.uni-kl.de // VC++6 bug 25412027Sjungma@eit.uni-kl.de ::std::ostream& operator << ( ::std::ostream&, int64 ); 25512027Sjungma@eit.uni-kl.de ::std::ostream& operator << ( ::std::ostream&, uint64 ); 25612027Sjungma@eit.uni-kl.de#endif 25712027Sjungma@eit.uni-kl.de 25812027Sjungma@eit.uni-kl.de} // namespace sc_dt 25912027Sjungma@eit.uni-kl.de 26012027Sjungma@eit.uni-kl.de 26112027Sjungma@eit.uni-kl.de#if defined(_MSC_VER) && ( _MSC_VER < 1300 ) 26212027Sjungma@eit.uni-kl.de 26312027Sjungma@eit.uni-kl.de inline 26412027Sjungma@eit.uni-kl.de ::std::ostream& 26512027Sjungma@eit.uni-kl.de operator << ( ::std::ostream& os, sc_dt::int64 a ) 26612027Sjungma@eit.uni-kl.de { 26712027Sjungma@eit.uni-kl.de sc_dt::operator << ( os, a ); 26812027Sjungma@eit.uni-kl.de return os; 26912027Sjungma@eit.uni-kl.de } 27012027Sjungma@eit.uni-kl.de 27112027Sjungma@eit.uni-kl.de inline 27212027Sjungma@eit.uni-kl.de ::std::ostream& 27312027Sjungma@eit.uni-kl.de operator << ( ::std::ostream& os, sc_dt::uint64 a ) 27412027Sjungma@eit.uni-kl.de { 27512027Sjungma@eit.uni-kl.de sc_dt::operator << ( os, a ); 27612027Sjungma@eit.uni-kl.de return os; 27712027Sjungma@eit.uni-kl.de } 27812027Sjungma@eit.uni-kl.de 27912027Sjungma@eit.uni-kl.de#endif 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.de 28212027Sjungma@eit.uni-kl.de#endif 283