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