blob: 9d31a276d1453356f0bea5c2c49b1bf72a5585e9 [file] [log] [blame]
/*****************************************************************************
Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
more contributor license agreements. See the NOTICE file distributed
with this work for additional information regarding copyright ownership.
Accellera licenses this file to you under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing
permissions and limitations under the License.
*****************************************************************************/
/*****************************************************************************
sc_signed.h -- Arbitrary precision signed arithmetic.
This file includes the definitions of sc_signed_bitref,
sc_signed_subref, and sc_signed classes. The first two classes are
proxy classes to reference one bit and a range of bits of a
sc_signed number, respectively.
An sc_signed number has the sign-magnitude representation
internally. However, its interface guarantees a 2's-complement
representation. The sign-magnitude representation is chosen
because of its efficiency: The sc_signed and sc_unsigned types are
optimized for arithmetic rather than bitwise operations. For
arithmetic operations, the sign-magnitude representation performs
better.
The implementations of sc_signed and sc_unsigned classes are
almost identical: Most of the member and friend functions are
defined in sc_nbcommon.cpp and sc_nbfriends.cpp so that they can
be shared by both of these classes. These functions are chosed by
defining a few macros before including them such as IF_SC_SIGNED
and CLASS_TYPE. Our implementation choices are mostly dictated by
performance considerations in that we tried to provide the most
efficient sc_signed and sc_unsigned types without compromising
their interface.
For the behavior of operators, we have two semantics: the old and
new. The most important difference between these two semantics is
that the old semantics is closer to C/C++ semantics in that the
result type of a binary operator on unsigned and signed arguments
is unsigned; the new semantics, on the other hand, requires the
result type be signed. The new semantics is required by the VSIA
C/C++ data types standard. We have implemented the new semantics.
Original Author: Ali Dasdan, Synopsys, Inc.
*****************************************************************************/
/*****************************************************************************
MODIFICATION LOG - modifiers, enter your name, affiliation, date and
changes you are making here.
Name, Affiliation, Date:
Description of Modification:
*****************************************************************************/
// $Log: sc_signed.h,v $
// Revision 1.3 2011/08/24 22:05:46 acg
// Torsten Maehne: initialization changes to remove warnings.
//
// Revision 1.2 2011/02/18 20:19:15 acg
// Andy Goodrich: updating Copyright notice.
//
// Revision 1.1.1.1 2006/12/15 20:20:05 acg
// SystemC 2.3
//
// Revision 1.5 2006/05/08 17:50:01 acg
// Andy Goodrich: Added David Long's declarations for friend operators,
// functions, and methods, to keep the Microsoft compiler happy.
//
// Revision 1.4 2006/03/13 20:25:27 acg
// Andy Goodrich: Addition of function declarations, e.g., xor_signed_friend()
// to keep gcc 4.x happy.
//
// Revision 1.3 2006/01/13 18:49:32 acg
// Added $Log command so that CVS check in comments are reproduced in the
// source.
//
#ifndef __SYSTEMC_EXT_DT_INT_SC_SIGNED_HH__
#define __SYSTEMC_EXT_DT_INT_SC_SIGNED_HH__
#include <iostream>
#include "../misc/sc_value_base.hh"
#include "../sc_temporary.hh"
#include "sc_length_param.hh"
#include "sc_nbdefs.hh"
#include "sc_nbexterns.hh"
#include "sc_nbutils.hh"
#include "sc_unsigned.hh"
namespace sc_dt
{
// classes defined in this module
class sc_signed_bitref_r;
class sc_signed_bitref;
class sc_signed_subref_r;
class sc_signed_subref;
class sc_concatref;
class sc_signed;
// forward class declarations
class sc_bv_base;
class sc_lv_base;
class sc_int_base;
class sc_uint_base;
class sc_int_subref_r;
class sc_uint_subref_r;
class sc_signed;
class sc_unsigned;
class sc_unsigned_subref_r;
class sc_fxval;
class sc_fxval_fast;
class sc_fxnum;
class sc_fxnum_fast;
} // namespace sc_dt
// extern template instantiations
namespace sc_core
{
extern template class sc_vpool<sc_dt::sc_signed_bitref>;
extern template class sc_vpool<sc_dt::sc_signed_subref>;
} // namespace sc_core
namespace sc_dt
{
// Helper function declarations
sc_signed add_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
sc_signed sub_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
sc_signed mul_signed_friend(
small_type s, int unb, int und, const sc_digit *ud,
int vnb, int vnd, const sc_digit *vd);
sc_signed div_signed_friend(
small_type s, int unb, int und, const sc_digit *ud,
int vnb, int vnd, const sc_digit *vd);
sc_signed mod_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
int vnb, int vnd, const sc_digit *vd);
sc_signed and_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
sc_signed or_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
sc_signed xor_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
/*
* friend operator declarations
*/
// ARITHMETIC OPERATORS:
// ADDition operators:
sc_signed operator + (const sc_unsigned &u, const sc_signed &v);
sc_signed operator + (const sc_signed &u, const sc_unsigned &v);
sc_signed operator + (const sc_unsigned &u, int64 v);
sc_signed operator + (const sc_unsigned &u, long v);
inline sc_signed operator + (const sc_unsigned &u, int v);
sc_signed operator + (int64 u, const sc_unsigned &v);
sc_signed operator + (long u, const sc_unsigned &v);
inline sc_signed operator + (int u, const sc_unsigned &v);
sc_signed operator + (const sc_signed &u, const sc_signed &v);
sc_signed operator + (const sc_signed &u, int64 v);
sc_signed operator + (const sc_signed &u, uint64 v);
sc_signed operator + (const sc_signed &u, long v);
sc_signed operator + (const sc_signed &u, unsigned long v);
inline sc_signed operator + (const sc_signed &u, int v);
inline sc_signed operator + (const sc_signed &u, unsigned int v);
sc_signed operator + (int64 u, const sc_signed &v);
sc_signed operator + (uint64 u, const sc_signed &v);
sc_signed operator + (long u, const sc_signed &v);
sc_signed operator + (unsigned long u, const sc_signed &v);
inline sc_signed operator + (int u, const sc_signed &v);
inline sc_signed operator + (unsigned int u, const sc_signed &v);
sc_signed operator + (const sc_unsigned &u, const sc_int_base &v);
sc_signed operator + (const sc_int_base &u, const sc_unsigned &v);
sc_signed operator + (const sc_signed &u, const sc_int_base &v);
sc_signed operator + (const sc_signed &u, const sc_uint_base &v);
sc_signed operator + (const sc_int_base &u, const sc_signed &v);
sc_signed operator + (const sc_uint_base &u, const sc_signed &v);
// SUBtraction operators:
sc_signed operator - (const sc_unsigned &u, const sc_signed &v);
sc_signed operator - (const sc_signed &u, const sc_unsigned &v);
sc_signed operator - (const sc_unsigned &u, const sc_unsigned &v);
sc_signed operator - (const sc_unsigned &u, int64 v);
sc_signed operator - (const sc_unsigned &u, uint64 v);
sc_signed operator - (const sc_unsigned &u, long v);
sc_signed operator - (const sc_unsigned &u, unsigned long v);
inline sc_signed operator - (const sc_unsigned &u, int v);
inline sc_signed operator - (const sc_unsigned &u, unsigned int v);
sc_signed operator - (int64 u, const sc_unsigned &v);
sc_signed operator - (uint64 u, const sc_unsigned &v);
sc_signed operator - (long u, const sc_unsigned &v);
sc_signed operator - (unsigned long u, const sc_unsigned &v);
inline sc_signed operator - (int u, const sc_unsigned &v);
inline sc_signed operator - (unsigned int u, const sc_unsigned &v);
sc_signed operator - (const sc_signed &u, const sc_signed &v);
sc_signed operator - (const sc_signed &u, int64 v);
sc_signed operator - (const sc_signed &u, uint64 v);
sc_signed operator - (const sc_signed &u, long v);
sc_signed operator - (const sc_signed &u, unsigned long v);
inline sc_signed operator - (const sc_signed &u, int v);
inline sc_signed operator - (const sc_signed &u, unsigned int v);
sc_signed operator - (int64 u, const sc_signed &v);
sc_signed operator - (uint64 u, const sc_signed &v);
sc_signed operator - (long u, const sc_signed &v);
sc_signed operator - (unsigned long u, const sc_signed &v);
inline sc_signed operator - (int u, const sc_signed &v);
inline sc_signed operator - (unsigned int u, const sc_signed &v);
sc_signed operator - (const sc_unsigned &u, const sc_int_base &v);
sc_signed operator - (const sc_unsigned &u, const sc_uint_base &v);
sc_signed operator - (const sc_int_base &u, const sc_unsigned &v);
sc_signed operator - (const sc_uint_base &u, const sc_unsigned &v);
sc_signed operator - (const sc_signed &u, const sc_int_base &v);
sc_signed operator - (const sc_signed &u, const sc_uint_base &v);
sc_signed operator - (const sc_int_base &u, const sc_signed &v);
sc_signed operator - (const sc_uint_base &u, const sc_signed &v);
// MULtiplication operators:
sc_signed operator * (const sc_unsigned &u, const sc_signed &v);
sc_signed operator * (const sc_signed &u, const sc_unsigned &v);
sc_signed operator * (const sc_unsigned &u, int64 v);
sc_signed operator * (const sc_unsigned &u, long v);
inline sc_signed operator * (const sc_unsigned &u, int v);
sc_signed operator * (int64 u, const sc_unsigned &v);
sc_signed operator * (long u, const sc_unsigned &v);
inline sc_signed operator * (int u, const sc_unsigned &v);
sc_signed operator * (const sc_signed &u, const sc_signed &v);
sc_signed operator * (const sc_signed &u, int64 v);
sc_signed operator * (const sc_signed &u, uint64 v);
sc_signed operator * (const sc_signed &u, long v);
sc_signed operator * (const sc_signed &u, unsigned long v);
inline sc_signed operator * (const sc_signed &u, int v);
inline sc_signed operator * (const sc_signed &u, unsigned int v);
sc_signed operator * (int64 u, const sc_signed &v);
sc_signed operator * (uint64 u, const sc_signed &v);
sc_signed operator * (long u, const sc_signed &v);
sc_signed operator * (unsigned long u, const sc_signed &v);
inline sc_signed operator * (int u, const sc_signed &v);
inline sc_signed operator * (unsigned int u, const sc_signed &v);
sc_signed operator * (const sc_unsigned &u, const sc_int_base &v);
sc_signed operator * (const sc_int_base &u, const sc_unsigned &v);
sc_signed operator * (const sc_signed &u, const sc_int_base &v);
sc_signed operator * (const sc_signed &u, const sc_uint_base &v);
sc_signed operator * (const sc_int_base &u, const sc_signed &v);
sc_signed operator * (const sc_uint_base &u, const sc_signed &v);
// DIVision operators:
sc_signed operator / (const sc_unsigned &u, const sc_signed &v);
sc_signed operator / (const sc_signed &u, const sc_unsigned &v);
sc_signed operator / (const sc_unsigned &u, int64 v);
sc_signed operator / (const sc_unsigned &u, long v);
inline sc_signed operator / (const sc_unsigned &u, int v);
sc_signed operator / (int64 u, const sc_unsigned &v);
sc_signed operator / (long u, const sc_unsigned &v);
inline sc_signed operator / (int u, const sc_unsigned &v);
sc_signed operator / (const sc_signed &u, const sc_signed &v);
sc_signed operator / (const sc_signed &u, int64 v);
sc_signed operator / (const sc_signed &u, uint64 v);
sc_signed operator / (const sc_signed &u, long v);
sc_signed operator / (const sc_signed &u, unsigned long v);
inline sc_signed operator / (const sc_signed &u, int v);
inline sc_signed operator / (const sc_signed &u, unsigned int v);
sc_signed operator / (int64 u, const sc_signed &v);
sc_signed operator / (uint64 u, const sc_signed &v);
sc_signed operator / (long u, const sc_signed &v);
sc_signed operator / (unsigned long u, const sc_signed &v);
inline sc_signed operator / (int u, const sc_signed &v);
inline sc_signed operator / (unsigned int u, const sc_signed &v);
sc_signed operator / (const sc_unsigned &u, const sc_int_base &v);
sc_signed operator / (const sc_int_base &u, const sc_unsigned &v);
sc_signed operator / (const sc_signed &u, const sc_int_base &v);
sc_signed operator / (const sc_signed &u, const sc_uint_base &v);
sc_signed operator / (const sc_int_base &u, const sc_signed &v);
sc_signed operator / (const sc_uint_base &u, const sc_signed &v);
// MODulo operators:
sc_signed operator % (const sc_unsigned &u, const sc_signed &v);
sc_signed operator % (const sc_signed &u, const sc_unsigned &v);
sc_signed operator % (const sc_unsigned &u, int64 v);
sc_signed operator % (const sc_unsigned &u, long v);
inline sc_signed operator % (const sc_unsigned &u, int v);
sc_signed operator % (int64 u, const sc_unsigned &v);
sc_signed operator % (long u, const sc_unsigned &v);
inline sc_signed operator % (int u, const sc_unsigned &v);
sc_signed operator % (const sc_signed &u, const sc_signed &v);
sc_signed operator % (const sc_signed &u, int64 v);
sc_signed operator % (const sc_signed &u, uint64 v);
sc_signed operator % (const sc_signed &u, long v);
sc_signed operator % (const sc_signed &u, unsigned long v);
inline sc_signed operator % (const sc_signed &u, int v);
inline sc_signed operator % (const sc_signed &u, unsigned int v);
sc_signed operator % (int64 u, const sc_signed &v);
sc_signed operator % (uint64 u, const sc_signed &v);
sc_signed operator % (long u, const sc_signed &v);
sc_signed operator % (unsigned long u, const sc_signed &v);
inline sc_signed operator % (int u, const sc_signed &v);
inline sc_signed operator % (unsigned int u, const sc_signed &v);
sc_signed operator % (const sc_unsigned &u, const sc_int_base &v);
sc_signed operator % (const sc_int_base &u, const sc_unsigned &v);
sc_signed operator % (const sc_signed &u, const sc_int_base &v);
sc_signed operator % (const sc_signed &u, const sc_uint_base &v);
sc_signed operator % (const sc_int_base &u, const sc_signed &v);
sc_signed operator % (const sc_uint_base &u, const sc_signed &v);
// BITWISE OPERATORS:
// Bitwise AND operators:
sc_signed operator & (const sc_unsigned &u, const sc_signed &v);
sc_signed operator & (const sc_signed &u, const sc_unsigned &v);
sc_signed operator & (const sc_unsigned &u, int64 v);
sc_signed operator & (const sc_unsigned &u, long v);
inline sc_signed operator & (const sc_unsigned &u, int v);
sc_signed operator & (int64 u, const sc_unsigned &v);
sc_signed operator & (long u, const sc_unsigned &v);
inline sc_signed operator & (int u, const sc_unsigned &v);
sc_signed operator & (const sc_signed &u, const sc_signed &v);
sc_signed operator & (const sc_signed &u, int64 v);
sc_signed operator & (const sc_signed &u, uint64 v);
sc_signed operator & (const sc_signed &u, long v);
sc_signed operator & (const sc_signed &u, unsigned long v);
inline sc_signed operator & (const sc_signed &u, int v);
inline sc_signed operator & (const sc_signed &u, unsigned int v);
sc_signed operator & (int64 u, const sc_signed &v);
sc_signed operator & (uint64 u, const sc_signed &v);
sc_signed operator & (long u, const sc_signed &v);
sc_signed operator & (unsigned long u, const sc_signed &v);
inline sc_signed operator & (int u, const sc_signed &v);
inline sc_signed operator & (unsigned int u, const sc_signed &v);
sc_signed operator & (const sc_unsigned &u, const sc_int_base &v);
sc_signed operator & (const sc_int_base &u, const sc_unsigned &v);
sc_signed operator & (const sc_signed &u, const sc_int_base &v);
sc_signed operator & (const sc_signed &u, const sc_uint_base &v);
sc_signed operator & (const sc_int_base &u, const sc_signed &v);
sc_signed operator & (const sc_uint_base &u, const sc_signed &v);
// Bitwise OR operators:
sc_signed operator | (const sc_unsigned &u, const sc_signed &v);
sc_signed operator | (const sc_signed &u, const sc_unsigned &v);
sc_signed operator | (const sc_unsigned &u, int64 v);
sc_signed operator | (const sc_unsigned &u, long v);
inline sc_signed operator | (const sc_unsigned &u, int v);
sc_signed operator | (int64 u, const sc_unsigned &v);
sc_signed operator | (long u, const sc_unsigned &v);
inline sc_signed operator | (int u, const sc_unsigned &v);
sc_signed operator | (const sc_signed &u, const sc_signed &v);
sc_signed operator | (const sc_signed &u, int64 v);
sc_signed operator | (const sc_signed &u, uint64 v);
sc_signed operator | (const sc_signed &u, long v);
sc_signed operator | (const sc_signed &u, unsigned long v);
inline sc_signed operator | (const sc_signed &u, int v);
inline sc_signed operator | (const sc_signed &u, unsigned int v);
sc_signed operator | (int64 u, const sc_signed &v);
sc_signed operator | (uint64 u, const sc_signed &v);
sc_signed operator | (long u, const sc_signed &v);
sc_signed operator | (unsigned long u, const sc_signed &v);
inline sc_signed operator | (int u, const sc_signed &v);
inline sc_signed operator | (unsigned int u, const sc_signed &v);
sc_signed operator | (const sc_unsigned &u, const sc_int_base &v);
sc_signed operator | (const sc_int_base &u, const sc_unsigned &v);
sc_signed operator | (const sc_signed &u, const sc_int_base &v);
sc_signed operator | (const sc_signed &u, const sc_uint_base &v);
sc_signed operator | (const sc_int_base &u, const sc_signed &v);
sc_signed operator | (const sc_uint_base &u, const sc_signed &v);
// Bitwise XOR operators:
sc_signed operator ^ (const sc_unsigned &u, const sc_signed &v);
sc_signed operator ^ (const sc_signed &u, const sc_unsigned &v);
sc_signed operator ^ (const sc_unsigned &u, int64 v);
sc_signed operator ^ (const sc_unsigned &u, long v);
inline sc_signed operator ^ (const sc_unsigned &u, int v);
sc_signed operator ^ (int64 u, const sc_unsigned &v);
sc_signed operator ^ (long u, const sc_unsigned &v);
inline sc_signed operator ^ (int u, const sc_unsigned &v);
sc_signed operator ^ (const sc_signed &u, const sc_signed &v);
sc_signed operator ^ (const sc_signed &u, int64 v);
sc_signed operator ^ (const sc_signed &u, uint64 v);
sc_signed operator ^ (const sc_signed &u, long v);
sc_signed operator ^ (const sc_signed &u, unsigned long v);
inline sc_signed operator ^ (const sc_signed &u, int v);
inline sc_signed operator ^ (const sc_signed &u, unsigned int v);
sc_signed operator ^ (int64 u, const sc_signed &v);
sc_signed operator ^ (uint64 u, const sc_signed &v);
sc_signed operator ^ (long u, const sc_signed &v);
sc_signed operator ^ (unsigned long u, const sc_signed &v);
inline sc_signed operator ^ (int u, const sc_signed &v);
inline sc_signed operator ^ (unsigned int u, const sc_signed &v);
sc_signed operator ^ (const sc_unsigned &u, const sc_int_base &v);
sc_signed operator ^ (const sc_int_base &u, const sc_unsigned &v);
sc_signed operator ^ (const sc_signed &u, const sc_int_base &v);
sc_signed operator ^ (const sc_signed &u, const sc_uint_base &v);
sc_signed operator ^ (const sc_int_base &u, const sc_signed &v);
sc_signed operator ^ (const sc_uint_base &u, const sc_signed &v);
// SHIFT OPERATORS:
// LEFT SHIFT operators:
sc_unsigned operator << (const sc_unsigned &u, const sc_signed &v);
sc_signed operator << (const sc_signed &u, const sc_unsigned &v);
sc_signed operator << (const sc_signed &u, const sc_signed &v);
sc_signed operator << (const sc_signed &u, int64 v);
sc_signed operator << (const sc_signed &u, uint64 v);
sc_signed operator << (const sc_signed &u, long v);
sc_signed operator << (const sc_signed &u, unsigned long v);
inline sc_signed operator << (const sc_signed &u, int v);
inline sc_signed operator << (const sc_signed &u, unsigned int v);
sc_signed operator << (const sc_signed &u, const sc_int_base &v);
sc_signed operator << (const sc_signed &u, const sc_uint_base &v);
// RIGHT SHIFT operators:
sc_unsigned operator >> (const sc_unsigned &u, const sc_signed &v);
sc_signed operator >> (const sc_signed &u, const sc_unsigned &v);
sc_signed operator >> (const sc_signed &u, const sc_signed &v);
sc_signed operator >> (const sc_signed &u, int64 v);
sc_signed operator >> (const sc_signed &u, uint64 v);
sc_signed operator >> (const sc_signed &u, long v);
sc_signed operator >> (const sc_signed &u, unsigned long v);
inline sc_signed operator >> (const sc_signed &u, int v);
inline sc_signed operator >> (const sc_signed &u, unsigned int v);
sc_signed operator >> (const sc_signed &u, const sc_int_base &v);
sc_signed operator >> (const sc_signed &u, const sc_uint_base &v);
// Unary arithmetic operators
sc_signed operator + (const sc_signed &u);
sc_signed operator - (const sc_signed &u);
sc_signed operator - (const sc_unsigned &u);
// LOGICAL OPERATORS:
// Logical EQUAL operators:
bool operator == (const sc_unsigned &u, const sc_signed &v);
bool operator == (const sc_signed &u, const sc_unsigned &v);
bool operator == (const sc_signed &u, const sc_signed &v);
bool operator == (const sc_signed &u, int64 v);
bool operator == (const sc_signed &u, uint64 v);
bool operator == (const sc_signed &u, long v);
bool operator == (const sc_signed &u, unsigned long v);
inline bool operator == (const sc_signed &u, int v);
inline bool operator == (const sc_signed &u, unsigned int v);
bool operator == (int64 u, const sc_signed &v);
bool operator == (uint64 u, const sc_signed &v);
bool operator == (long u, const sc_signed &v);
bool operator == (unsigned long u, const sc_signed &v);
inline bool operator == (int u, const sc_signed &v);
inline bool operator == (unsigned int u, const sc_signed &v);
bool operator == (const sc_signed &u, const sc_int_base &v);
bool operator == (const sc_signed &u, const sc_uint_base &v);
bool operator == (const sc_int_base &u, const sc_signed &v);
bool operator == (const sc_uint_base &u, const sc_signed &v);
// Logical NOT_EQUAL operators:
bool operator != (const sc_unsigned &u, const sc_signed &v);
bool operator != (const sc_signed &u, const sc_unsigned &v);
bool operator != (const sc_signed &u, const sc_signed &v);
bool operator != (const sc_signed &u, int64 v);
bool operator != (const sc_signed &u, uint64 v);
bool operator != (const sc_signed &u, long v);
bool operator != (const sc_signed &u, unsigned long v);
inline bool operator != (const sc_signed &u, int v);
inline bool operator != (const sc_signed &u, unsigned int v);
bool operator != (int64 u, const sc_signed &v);
bool operator != (uint64 u, const sc_signed &v);
bool operator != (long u, const sc_signed &v);
bool operator != (unsigned long u, const sc_signed &v);
inline bool operator != (int u, const sc_signed &v);
inline bool operator != (unsigned int u, const sc_signed &v);
bool operator != (const sc_signed &u, const sc_int_base &v);
bool operator != (const sc_signed &u, const sc_uint_base &v);
bool operator != (const sc_int_base &u, const sc_signed &v);
bool operator != (const sc_uint_base &u, const sc_signed &v);
// Logical LESS_THAN operators:
bool operator < (const sc_unsigned &u, const sc_signed &v);
bool operator < (const sc_signed &u, const sc_unsigned &v);
bool operator < (const sc_signed &u, const sc_signed &v);
bool operator < (const sc_signed &u, int64 v);
bool operator < (const sc_signed &u, uint64 v);
bool operator < (const sc_signed &u, long v);
bool operator < (const sc_signed &u, unsigned long v);
inline bool operator < (const sc_signed &u, int v);
inline bool operator < (const sc_signed &u, unsigned int v);
bool operator < (int64 u, const sc_signed &v);
bool operator < (uint64 u, const sc_signed &v);
bool operator < (long u, const sc_signed &v);
bool operator < (unsigned long u, const sc_signed &v);
inline bool operator < (int u, const sc_signed &v);
inline bool operator < (unsigned int u, const sc_signed &v);
bool operator < (const sc_signed &u, const sc_int_base &v);
bool operator < (const sc_signed &u, const sc_uint_base &v);
bool operator < (const sc_int_base &u, const sc_signed &v);
bool operator < (const sc_uint_base &u, const sc_signed &v);
// Logical LESS_THAN_AND_EQUAL operators:
bool operator <= (const sc_unsigned &u, const sc_signed &v);
bool operator <= (const sc_signed &u, const sc_unsigned &v);
bool operator <= (const sc_signed &u, const sc_signed &v);
bool operator <= (const sc_signed &u, int64 v);
bool operator <= (const sc_signed &u, uint64 v);
bool operator <= (const sc_signed &u, long v);
bool operator <= (const sc_signed &u, unsigned long v);
inline bool operator <= (const sc_signed &u, int v);
inline bool operator <= (const sc_signed &u, unsigned int v);
bool operator <= (int64 u, const sc_signed &v);
bool operator <= (uint64 u, const sc_signed &v);
bool operator <= (long u, const sc_signed &v);
bool operator <= (unsigned long u, const sc_signed &v);
inline bool operator <= (int u, const sc_signed &v);
inline bool operator <= (unsigned int u, const sc_signed &v);
bool operator <= (const sc_signed &u, const sc_int_base &v);
bool operator <= (const sc_signed &u, const sc_uint_base &v);
bool operator <= (const sc_int_base &u, const sc_signed &v);
bool operator <= (const sc_uint_base &u, const sc_signed &v);
// Logical GREATER_THAN operators:
bool operator > (const sc_unsigned &u, const sc_signed &v);
bool operator > (const sc_signed &u, const sc_unsigned &v);
bool operator > (const sc_signed &u, const sc_signed &v);
bool operator > (const sc_signed &u, int64 v);
bool operator > (const sc_signed &u, uint64 v);
bool operator > (const sc_signed &u, long v);
bool operator > (const sc_signed &u, unsigned long v);
inline bool operator > (const sc_signed &u, int v);
inline bool operator > (const sc_signed &u, unsigned int v);
bool operator > (int64 u, const sc_signed &v);
bool operator > (uint64 u, const sc_signed &v);
bool operator > (long u, const sc_signed &v);
bool operator > (unsigned long u, const sc_signed &v);
inline bool operator > (int u, const sc_signed &v);
inline bool operator > (unsigned int u, const sc_signed &v);
bool operator > (const sc_signed &u, const sc_int_base &v);
bool operator > (const sc_signed &u, const sc_uint_base &v);
bool operator > (const sc_int_base &u, const sc_signed &v);
bool operator > (const sc_uint_base &u, const sc_signed &v);
// Logical GREATER_THAN_AND_EQUAL operators:
bool operator >= (const sc_unsigned &u, const sc_signed &v);
bool operator >= (const sc_signed &u, const sc_unsigned &v);
bool operator >= (const sc_signed &u, const sc_signed &v);
bool operator >= (const sc_signed &u, int64 v);
bool operator >= (const sc_signed &u, uint64 v);
bool operator >= (const sc_signed &u, long v);
bool operator >= (const sc_signed &u, unsigned long v);
inline bool operator >= (const sc_signed &u, int v);
inline bool operator >= (const sc_signed &u, unsigned int v);
bool operator >= (int64 u, const sc_signed &v);
bool operator >= (uint64 u, const sc_signed &v);
bool operator >= (long u, const sc_signed &v);
bool operator >= (unsigned long u, const sc_signed &v);
inline bool operator >= (int u, const sc_signed &v);
inline bool operator >= (unsigned int u, const sc_signed &v);
bool operator >= (const sc_signed &u, const sc_int_base &v);
bool operator >= (const sc_signed &u, const sc_uint_base &v);
bool operator >= (const sc_int_base &u, const sc_signed &v);
bool operator >= (const sc_uint_base &u, const sc_signed &v);
// Bitwise NOT operator (unary).
sc_signed operator ~ (const sc_signed &u);
// ----------------------------------------------------------------------------
// CLASS : sc_signed_bitref_r
//
// Proxy class for sc_signed bit selection (r-value only).
// ----------------------------------------------------------------------------
class sc_signed_bitref_r : public sc_value_base
{
friend class sc_signed;
protected:
// constructor
sc_signed_bitref_r() : sc_value_base(), m_index(0), m_obj_p(0) {}
void
initialize(const sc_signed* obj_p, int index_)
{
m_index = index_;
m_obj_p = const_cast<sc_signed*>(obj_p);
}
public:
// destructor
virtual ~sc_signed_bitref_r() {}
// copy constructor
sc_signed_bitref_r(const sc_signed_bitref_r &a) :
sc_value_base(a), m_index(a.m_index), m_obj_p(a.m_obj_p)
{}
// capacity
int length() const { return 1; }
// implicit conversion to bool
operator uint64 () const;
bool operator ! () const;
bool operator ~ () const;
// explicit conversions
bool value() const { return operator uint64(); }
bool to_bool() const { return operator uint64(); }
// concatenation support
virtual int
concat_length(bool* xz_present_p) const
{
if (xz_present_p)
*xz_present_p = false;
return 1;
}
virtual uint64
concat_get_uint64() const
{
return (uint64)operator uint64();
}
virtual bool
concat_get_ctrl(sc_digit *dst_p, int low_i) const
{
int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
int word_i = low_i / BITS_PER_DIGIT;
dst_p[word_i] &= ~bit_mask;
return false;
}
virtual bool
concat_get_data( sc_digit* dst_p, int low_i ) const
{
int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
bool result; // True if non-zero.
int word_i = low_i / BITS_PER_DIGIT;
if (operator uint64()) {
dst_p[word_i] |= bit_mask;
result = true;
} else {
dst_p[word_i] &= ~bit_mask;
result = false;
}
return result;
}
// other methods
void print(::std::ostream &os=::std::cout) const { os << to_bool(); }
protected:
int m_index; // Bit to be selected.
sc_signed *m_obj_p; // Target of this bit selection.
private:
// Disabled
const sc_signed_bitref_r &operator = (const sc_signed_bitref_r &);
};
inline ::std::ostream &operator << (
::std::ostream &, const sc_signed_bitref_r &);
// ----------------------------------------------------------------------------
// CLASS : sc_signed_bitref
//
// Proxy class for sc_signed bit selection (r-value and l-value).
// ----------------------------------------------------------------------------
class sc_signed_bitref : public sc_signed_bitref_r
{
friend class sc_signed;
friend class sc_core::sc_vpool<sc_signed_bitref>;
protected:
// constructor
sc_signed_bitref() : sc_signed_bitref_r() {}
public:
// copy constructor
sc_signed_bitref(const sc_signed_bitref &a) : sc_signed_bitref_r(a) {}
// assignment operators
const sc_signed_bitref &operator = (const sc_signed_bitref_r &);
const sc_signed_bitref &operator = (const sc_signed_bitref &);
const sc_signed_bitref &operator = (bool);
const sc_signed_bitref &operator &= (bool);
const sc_signed_bitref &operator |= (bool);
const sc_signed_bitref &operator ^= (bool);
// concatenation methods
virtual void concat_set(int64 src, int low_i);
virtual void concat_set(const sc_signed &src, int low_i);
virtual void concat_set(const sc_unsigned &src, int low_i);
virtual void concat_set(uint64 src, int low_i);
// other methods
void scan(::std::istream &is=::std::cin);
protected:
static sc_core::sc_vpool<sc_signed_bitref> m_pool;
};
inline ::std::istream &operator >> (::std::istream &, sc_signed_bitref &);
// ----------------------------------------------------------------------------
// CLASS : sc_signed_subref_r
//
// Proxy class for sc_signed part selection (r-value only).
// ----------------------------------------------------------------------------
class sc_signed_subref_r : public sc_value_base
{
friend class sc_signed;
friend class sc_signed_signal;
friend class sc_unsigned;
protected:
// constructor
sc_signed_subref_r() : sc_value_base(), m_left(0), m_obj_p(0), m_right(0)
{}
void
initialize(const sc_signed *obj_p, int left_, int right_)
{
m_obj_p = (const_cast<sc_signed*>(obj_p));
m_left = left_;
m_right = right_;
}
public:
// destructor
virtual ~sc_signed_subref_r() {}
// copy constructor
sc_signed_subref_r(const sc_signed_subref_r &a) :
sc_value_base(a), m_left(a.m_left), m_obj_p(a.m_obj_p),
m_right(a.m_right)
{}
// capacity
int
length() const
{
return m_left >= m_right ? (m_left-m_right + 1) : (m_right-m_left + 1);
}
// implicit conversion to sc_unsigned
operator sc_unsigned () const;
// explicit conversions
int to_int() const;
unsigned int to_uint() const;
long to_long() const;
unsigned long to_ulong() const;
int64 to_int64() const;
uint64 to_uint64() const;
double to_double() const;
// explicit conversion to character string
const std::string to_string(sc_numrep numrep=SC_DEC) const;
const std::string to_string(sc_numrep numrep, bool w_prefix) const;
// concatenation support
virtual int
concat_length(bool* xz_present_p) const
{
if (xz_present_p)
*xz_present_p = false;
return m_left - m_right + 1;
}
virtual uint64 concat_get_uint64() const;
virtual bool concat_get_ctrl(sc_digit *dst_p, int low_i) const;
virtual bool concat_get_data(sc_digit *dst_p, int low_i) const;
// reduce methods
bool and_reduce() const;
bool nand_reduce() const;
bool or_reduce() const;
bool nor_reduce() const;
bool xor_reduce() const ;
bool xnor_reduce() const;
// other methods
void
print(::std::ostream &os=::std::cout) const
{
os << to_string(sc_io_base(os, SC_DEC), sc_io_show_base(os));
}
protected:
int m_left; // Left-most bit in this part selection.
sc_signed *m_obj_p; // Target of this part selection.
int m_right; // Right-most bit in this part selection.
private:
const sc_signed_subref_r &operator = (const sc_signed_subref_r &);
};
inline ::std::ostream &operator << (
::std::ostream &, const sc_signed_subref_r &);
// ----------------------------------------------------------------------------
// CLASS : sc_signed_subref
//
// Proxy class for sc_signed part selection (r-value and l-value).
// ----------------------------------------------------------------------------
class sc_signed_subref : public sc_signed_subref_r
{
friend class sc_signed;
friend class sc_core::sc_vpool<sc_signed_subref>;
// constructor
sc_signed_subref() : sc_signed_subref_r() {}
public:
// copy constructor
sc_signed_subref(const sc_signed_subref &a) : sc_signed_subref_r(a) {}
// assignment operators
const sc_signed_subref &operator = (const sc_signed_subref_r &a);
const sc_signed_subref &operator = (const sc_signed_subref &a);
const sc_signed_subref &operator = (const sc_signed &a);
const sc_signed_subref &operator = (const sc_unsigned_subref_r &a);
const sc_signed_subref &operator = (const sc_unsigned &a);
template< class T >
const sc_signed_subref &
operator = (const sc_generic_base<T> &a)
{
sc_unsigned temp(length());
a->to_sc_unsigned(temp);
return operator = (temp);
}
const sc_signed_subref &operator = (const char *a);
const sc_signed_subref &operator = (unsigned long a);
const sc_signed_subref &operator = (long a);
const sc_signed_subref &
operator = (unsigned int a)
{
return operator = ((unsigned long)a);
}
const sc_signed_subref &
operator = (int a)
{
return operator = ((long)a);
}
const sc_signed_subref &operator = (uint64 a);
const sc_signed_subref &operator = (int64 a);
const sc_signed_subref &operator = (double a);
const sc_signed_subref &operator = (const sc_int_base &a);
const sc_signed_subref &operator = (const sc_uint_base &a);
// concatenation methods
virtual void concat_set(int64 src, int low_i);
virtual void concat_set(const sc_signed &src, int low_i);
virtual void concat_set(const sc_unsigned &src, int low_i);
virtual void concat_set(uint64 src, int low_i);
// other methods
void scan(::std::istream &is=::std::cin);
protected:
static sc_core::sc_vpool<sc_signed_subref> m_pool;
};
inline ::std::istream &operator >> (::std::istream &, sc_signed_subref &);
// ----------------------------------------------------------------------------
// CLASS : sc_signed
//
// Arbitrary precision signed number.
// ----------------------------------------------------------------------------
class sc_signed : public sc_value_base
{
friend class sc_concatref;
friend class sc_signed_bitref_r;
friend class sc_signed_bitref;
friend class sc_signed_subref_r;
friend class sc_signed_subref;
friend class sc_unsigned;
friend class sc_unsigned_subref;
// Needed for types using sc_signed.
typedef bool elemtype;
void invalid_init(const char *type_name, int nb) const;
public:
// constructors
explicit sc_signed(int nb=sc_length_param().len());
sc_signed(const sc_signed &v);
sc_signed(const sc_unsigned &v);
template<class T>
explicit sc_signed(const sc_generic_base<T> &v);
explicit sc_signed(const sc_bv_base &v);
explicit sc_signed(const sc_lv_base &v);
explicit sc_signed(const sc_int_subref_r &v);
explicit sc_signed(const sc_uint_subref_r &v);
explicit sc_signed(const sc_signed_subref_r &v);
explicit sc_signed(const sc_unsigned_subref_r &v);
// assignment operators
const sc_signed &operator = (const sc_signed &v);
const sc_signed &operator = (const sc_signed_subref_r &a);
template< class T >
const sc_signed &
operator = (const sc_generic_base<T> &a)
{
a->to_sc_signed(*this);
return *this;
}
const sc_signed &operator = (const sc_unsigned &v);
const sc_signed &operator = (const sc_unsigned_subref_r &a);
const sc_signed &operator = (const char *v);
const sc_signed &operator = (int64 v);
const sc_signed &operator = (uint64 v);
const sc_signed &operator = (long v);
const sc_signed &operator = (unsigned long v);
const sc_signed &operator = (int v) { return operator=((long)v); }
const sc_signed &
operator = (unsigned int v)
{
return operator=((unsigned long)v);
}
const sc_signed &operator = (double v);
const sc_signed &operator = (const sc_int_base & v);
const sc_signed &operator = (const sc_uint_base & v);
const sc_signed &operator = (const sc_bv_base &);
const sc_signed &operator = (const sc_lv_base &);
const sc_signed &operator = (const sc_fxval &);
const sc_signed &operator = (const sc_fxval_fast &);
const sc_signed &operator = (const sc_fxnum &);
const sc_signed &operator = (const sc_fxnum_fast &);
// destructor
virtual ~sc_signed()
{
#ifndef SC_MAX_NBITS
delete [] digit;
#endif
}
// Concatenation support:
sc_digit* get_raw() const { return digit; }
virtual int
concat_length(bool* xz_present_p) const
{
if (xz_present_p)
*xz_present_p = false;
return nbits;
}
virtual bool concat_get_ctrl(sc_digit *dst_p, int low_i) const;
virtual bool concat_get_data(sc_digit *dst_p, int low_i) const;
virtual uint64 concat_get_uint64() const;
virtual void concat_set(int64 src, int low_i);
virtual void concat_set(const sc_signed &src, int low_i);
virtual void concat_set(const sc_unsigned &src, int low_i);
virtual void concat_set(uint64 src, int low_i);
// Increment operators.
sc_signed &operator ++ ();
const sc_signed operator ++ (int);
// Decrement operators.
sc_signed &operator -- ();
const sc_signed operator -- (int);
// bit selection
inline void
check_index(int i) const
{
if (i < 0 || i >= nbits)
invalid_index(i);
}
void invalid_index(int i) const;
sc_signed_bitref &
operator [] (int i)
{
check_index(i);
sc_signed_bitref *result_p = sc_signed_bitref::m_pool.allocate();
result_p->initialize(this, i);
return *result_p;
}
const sc_signed_bitref_r &
operator [] (int i) const
{
check_index(i);
sc_signed_bitref *result_p = sc_signed_bitref::m_pool.allocate();
result_p->initialize(this, i);
return *result_p;
}
sc_signed_bitref &
bit(int i)
{
check_index(i);
sc_signed_bitref *result_p = sc_signed_bitref::m_pool.allocate();
result_p->initialize(this, i);
return *result_p;
}
const sc_signed_bitref_r &
bit(int i) const
{
check_index(i);
sc_signed_bitref *result_p = sc_signed_bitref::m_pool.allocate();
result_p->initialize(this, i);
return *result_p;
}
// part selection
// Subref operators. Help access the range of bits from the ith to
// jth. These indices have arbitrary precedence with respect to each
// other, i.e., we can have i <= j or i > j. Note the equivalence
// between range(i, j) and operator(i, j). Also note that
// operator(i, i) returns a signed number that corresponds to the
// bit operator[i], so these two forms are not the same.
inline void
check_range(int l, int r) const
{
if (l < r)
{
if (l < 0 || r >= nbits)
invalid_range(l, r);
} else {
if (r < 0 || l >= nbits)
invalid_range(l, r);
}
}
void invalid_range(int l, int r) const;
sc_signed_subref &
range(int i, int j)
{
check_range(i, j);
sc_signed_subref *result_p = sc_signed_subref::m_pool.allocate();
result_p->initialize(this, i, j);
return *result_p;
}
const sc_signed_subref_r &
range(int i, int j) const
{
check_range(i, j);
sc_signed_subref *result_p = sc_signed_subref::m_pool.allocate();
result_p->initialize(this, i, j);
return *result_p;
}
sc_signed_subref &
operator () (int i, int j)
{
check_range(i, j);
sc_signed_subref *result_p = sc_signed_subref::m_pool.allocate();
result_p->initialize(this, i, j);
return *result_p;
}
const sc_signed_subref_r &
operator () (int i, int j) const
{
check_range(i, j);
sc_signed_subref *result_p = sc_signed_subref::m_pool.allocate();
result_p->initialize(this, i, j);
return *result_p;
}
// explicit conversions
int to_int() const;
unsigned int to_uint() const;
long to_long() const;
unsigned long to_ulong() const;
int64 to_int64() const;
uint64 to_uint64() const;
double to_double() const;
// explicit conversion to character string
const std::string to_string(sc_numrep numrep=SC_DEC) const;
const std::string to_string(sc_numrep numrep, bool w_prefix) const;
// Print functions. dump prints the internals of the class.
void
print(::std::ostream &os=::std::cout) const
{
os << to_string(sc_io_base(os, SC_DEC), sc_io_show_base(os));
}
void scan(::std::istream &is=::std::cin);
void dump(::std::ostream &os=::std::cout) const;
// Functions to find various properties.
int length() const { return nbits; } // Bit width.
bool iszero() const; // Is the number zero?
bool sign() const; // Sign.
// reduce methods
bool and_reduce() const;
bool nand_reduce() const { return !and_reduce(); }
bool or_reduce() const;
bool nor_reduce() const { return !or_reduce(); }
bool xor_reduce() const;
bool xnor_reduce() const { return !xor_reduce(); }
// Functions to access individual bits.
bool test(int i) const; // Is the ith bit 0 or 1?
void set(int i); // Set the ith bit to 1.
void clear(int i); // Set the ith bit to 0.
void
set(int i, bool v) // Set the ith bit to v.
{
if (v)
set(i);
else
clear(i);
}
void
invert(int i) // Negate the ith bit.
{
if (test(i))
clear(i);
else set(i);
}
// Make the number equal to its mirror image.
void reverse();
// Get/set a packed bit representation of the number.
void get_packed_rep(sc_digit *buf) const;
void set_packed_rep(sc_digit *buf);
/*
The comparison of the old and new semantics are as follows:
Let s = sc_signed,
u = sc_unsigned,
un = { uint64, unsigned long, unsigned int },
sn = { int64, long, int, char* }, and
OP = { +, -, *, /, % }.
Old semantics: New semantics:
u OP u -> u u OP u -> u
s OP u -> u s OP u -> s
u OP s -> u u OP s -> s
s OP s -> s s OP s -> s
u OP un = un OP u -> u u OP un = un OP u -> u
u OP sn = sn OP u -> u u OP sn = sn OP u -> s
s OP un = un OP s -> s s OP un = un OP s -> s
s OP sn = sn OP s -> s s OP sn = sn OP s -> s
In the new semantics, the result is u if both operands are u; the
result is s otherwise. The only exception is subtraction. The result
of a subtraction is always s.
The old semantics is like C/C++ semantics on integer types; the
new semantics is due to the VSIA C/C++ data types standard.
*/
// ARITHMETIC OPERATORS:
// ADDition operators:
friend sc_signed operator + (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator + (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator + (const sc_unsigned &u, int64 v);
friend sc_signed operator + (const sc_unsigned &u, long v);
friend sc_signed
operator + (const sc_unsigned &u, int v)
{
return operator + (u, (long)v);
}
friend sc_signed operator + (int64 u, const sc_unsigned &v);
friend sc_signed operator + (long u, const sc_unsigned &v);
friend sc_signed
operator + (int u, const sc_unsigned &v)
{
return operator + ((long)u, v);
}
friend sc_signed operator + (const sc_signed &u, const sc_signed &v);
friend sc_signed operator + (const sc_signed &u, int64 v);
friend sc_signed operator + (const sc_signed &u, uint64 v);
friend sc_signed operator + (const sc_signed &u, long v);
friend sc_signed operator + (const sc_signed &u, unsigned long v);
friend sc_signed
operator + (const sc_signed &u, int v)
{
return operator + (u, (long)v);
}
friend sc_signed
operator + (const sc_signed &u, unsigned int v)
{
return operator + (u, (unsigned long)v);
}
friend sc_signed operator + (int64 u, const sc_signed &v);
friend sc_signed operator + (uint64 u, const sc_signed &v);
friend sc_signed operator + (long u, const sc_signed &v);
friend sc_signed operator + (unsigned long u, const sc_signed &v);
friend sc_signed
operator + (int u, const sc_signed &v)
{
return operator + ((long)u, v);
}
friend sc_signed
operator + (unsigned int u, const sc_signed &v)
{
return operator + ((unsigned long)u, v);
}
const sc_signed &operator += (const sc_signed &v);
const sc_signed &operator += (const sc_unsigned &v);
const sc_signed &operator += (int64 v);
const sc_signed &operator += (uint64 v);
const sc_signed &operator += (long v);
const sc_signed &operator += (unsigned long v);
const sc_signed &
operator += (int v)
{
return operator += ((long)v);
}
const sc_signed &
operator += (unsigned int v)
{
return operator += ((unsigned long)v);
}
friend sc_signed operator + (const sc_unsigned &u, const sc_int_base &v);
friend sc_signed operator + (const sc_int_base &u, const sc_unsigned &v);
friend sc_signed operator + (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator + (const sc_signed &u, const sc_uint_base &v);
friend sc_signed operator + (const sc_int_base &u, const sc_signed &v);
friend sc_signed operator + (const sc_uint_base &u, const sc_signed &v);
const sc_signed & operator += (const sc_int_base &v);
const sc_signed & operator += (const sc_uint_base &v);
// SUBtraction operators:
friend sc_signed operator - (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator - (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator - (const sc_unsigned &u, const sc_unsigned &v);
friend sc_signed operator - (const sc_unsigned &u, int64 v);
friend sc_signed operator - (const sc_unsigned &u, uint64 v);
friend sc_signed operator - (const sc_unsigned &u, long v);
friend sc_signed operator - (const sc_unsigned &u, unsigned long v);
friend sc_signed
operator - (const sc_unsigned &u, int v)
{
return operator - (u, (long)v);
}
friend sc_signed
operator - (const sc_unsigned &u, unsigned int v)
{
return operator - (u, (unsigned long)v);
}
friend sc_signed operator - (int64 u, const sc_unsigned &v);
friend sc_signed operator - (uint64 u, const sc_unsigned &v);
friend sc_signed operator - (long u, const sc_unsigned &v);
friend sc_signed operator - (unsigned long u, const sc_unsigned &v);
friend sc_signed
operator - (int u, const sc_unsigned &v)
{
return operator - ((long)u, v);
}
friend sc_signed
operator - (unsigned int u, const sc_unsigned &v)
{
return operator - ((unsigned long)u, v);
}
friend sc_signed operator - (const sc_signed &u, const sc_signed &v);
friend sc_signed operator - (const sc_signed &u, int64 v);
friend sc_signed operator - (const sc_signed &u, uint64 v);
friend sc_signed operator - (const sc_signed &u, long v);
friend sc_signed operator - (const sc_signed &u, unsigned long v);
friend sc_signed
operator - (const sc_signed &u, int v)
{
return operator - (u, (long) v);
}
friend sc_signed
operator - (const sc_signed &u, unsigned int v)
{
return operator - (u, (unsigned long)v);
}
friend sc_signed operator - (int64 u, const sc_signed &v);
friend sc_signed operator - (uint64 u, const sc_signed &v);
friend sc_signed operator - (long u, const sc_signed &v);
friend sc_signed operator - (unsigned long u, const sc_signed &v);
friend sc_signed
operator - (int u, const sc_signed &v)
{
return operator - ((long)u, v);
}
friend sc_signed
operator - (unsigned int u, const sc_signed &v)
{
return operator - ((unsigned long)u, v);
}
const sc_signed &operator -= (const sc_signed &v);
const sc_signed &operator -= (const sc_unsigned &v);
const sc_signed &operator -= (int64 v);
const sc_signed &operator -= (uint64 v);
const sc_signed &operator -= (long v);
const sc_signed &operator -= (unsigned long v);
const sc_signed &
operator -= (int v)
{
return operator -= ((long)v);
}
const sc_signed &
operator -= (unsigned int v)
{
return operator -= ((unsigned long)v);
}
friend sc_signed operator - (const sc_unsigned &u, const sc_int_base &v);
friend sc_signed operator - (const sc_unsigned &u, const sc_uint_base &v);
friend sc_signed operator - (const sc_int_base &u, const sc_unsigned &v);
friend sc_signed operator - (const sc_uint_base &u, const sc_unsigned &v);
friend sc_signed operator - (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator - (const sc_signed &u, const sc_uint_base &v);
friend sc_signed operator - (const sc_int_base &u, const sc_signed &v);
friend sc_signed operator - (const sc_uint_base &u, const sc_signed &v);
const sc_signed &operator -= (const sc_int_base &v);
const sc_signed &operator -= (const sc_uint_base &v);
// MULtiplication operators:
friend sc_signed operator * (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator * (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator * (const sc_unsigned &u, int64 v);
friend sc_signed operator * (const sc_unsigned &u, long v);
friend sc_signed
operator * (const sc_unsigned &u, int v)
{
return operator * (u, (long)v);
}
friend sc_signed operator * (int64 u, const sc_unsigned &v);
friend sc_signed operator * (long u, const sc_unsigned &v);
friend sc_signed
operator * (int u, const sc_unsigned &v)
{
return operator * ((long)u, v);
}
friend sc_signed operator * (const sc_signed &u, const sc_signed &v);
friend sc_signed operator * (const sc_signed &u, int64 v);
friend sc_signed operator * (const sc_signed &u, uint64 v);
friend sc_signed operator * (const sc_signed &u, long v);
friend sc_signed operator * (const sc_signed &u, unsigned long v);
friend sc_signed
operator * (const sc_signed &u, int v)
{
return operator * (u, (long)v);
}
friend sc_signed
operator * (const sc_signed &u, unsigned int v)
{
return operator * (u, (unsigned long)v);
}
friend sc_signed operator * (int64 u, const sc_signed &v);
friend sc_signed operator * (uint64 u, const sc_signed &v);
friend sc_signed operator * (long u, const sc_signed &v);
friend sc_signed operator * (unsigned long u, const sc_signed &v);
friend sc_signed
operator * (int u, const sc_signed &v)
{
return operator * ((long)u, v);
}
friend sc_signed
operator * (unsigned int u, const sc_signed &v)
{
return operator * ((unsigned long)u, v);
}
const sc_signed &operator *= (const sc_signed &v);
const sc_signed &operator *= (const sc_unsigned &v);
const sc_signed &operator *= (int64 v);
const sc_signed &operator *= (uint64 v);
const sc_signed &operator *= (long v);
const sc_signed &operator *= (unsigned long v);
const sc_signed &
operator *= (int v)
{
return operator *= ((long)v);
}
const sc_signed &
operator *= (unsigned int v)
{
return operator *= ((unsigned long)v);
}
friend sc_signed operator * (const sc_unsigned &u, const sc_int_base &v);
friend sc_signed operator * (const sc_int_base &u, const sc_unsigned &v);
friend sc_signed operator * (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator * (const sc_signed &u, const sc_uint_base &v);
friend sc_signed operator * (const sc_int_base &u, const sc_signed &v);
friend sc_signed operator * (const sc_uint_base &u, const sc_signed &v);
const sc_signed &operator *= (const sc_int_base &v);
const sc_signed &operator *= (const sc_uint_base &v);
// DIVision operators:
friend sc_signed operator / (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator / (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator / (const sc_unsigned &u, int64 v);
friend sc_signed operator / (const sc_unsigned &u, long v);
friend sc_signed
operator / (const sc_unsigned &u, int v)
{
return operator / (u, (long)v);
}
friend sc_signed operator / (int64 u, const sc_unsigned &v);
friend sc_signed operator / (long u, const sc_unsigned &v);
friend sc_signed
operator / (int u, const sc_unsigned &v)
{
return operator / ((long)u, v);
}
friend sc_signed operator / (const sc_signed &u, const sc_signed &v);
friend sc_signed operator / (const sc_signed &u, int64 v);
friend sc_signed operator / (const sc_signed &u, uint64 v);
friend sc_signed operator / (const sc_signed &u, long v);
friend sc_signed operator / (const sc_signed &u, unsigned long v);
friend sc_signed
operator / (const sc_signed &u, int v)
{
return operator / (u, (long)v);
}
friend sc_signed
operator / (const sc_signed &u, unsigned int v)
{
return operator / (u, (unsigned long)v);
}
friend sc_signed operator / (int64 u, const sc_signed &v);
friend sc_signed operator / (uint64 u, const sc_signed &v);
friend sc_signed operator / (long u, const sc_signed &v);
friend sc_signed operator / (unsigned long u, const sc_signed &v);
friend sc_signed
operator / (int u, const sc_signed &v)
{
return operator / ((long)u, v);
}
friend sc_signed
operator / (unsigned int u, const sc_signed &v)
{
return operator / ((unsigned long)u, v);
}
const sc_signed &operator /= (const sc_signed &v);
const sc_signed &operator /= (const sc_unsigned &v);
const sc_signed &operator /= (int64 v);
const sc_signed &operator /= (uint64 v);
const sc_signed &operator /= (long v);
const sc_signed &operator /= (unsigned long v);
const sc_signed &
operator /= (int v)
{
return operator /= ((long)v);
}
const sc_signed &
operator /= (unsigned int v)
{
return operator /= ((unsigned long)v);
}
friend sc_signed operator / (const sc_unsigned &u, const sc_int_base &v);
friend sc_signed operator / (const sc_int_base &u, const sc_unsigned &v);
friend sc_signed operator / (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator / (const sc_signed &u, const sc_uint_base &v);
friend sc_signed operator / (const sc_int_base &u, const sc_signed &v);
friend sc_signed operator / (const sc_uint_base &u, const sc_signed &v);
const sc_signed &operator /= (const sc_int_base &v);
const sc_signed &operator /= (const sc_uint_base &v);
// MODulo operators:
friend sc_signed operator % (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator % (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator % (const sc_unsigned &u, int64 v);
friend sc_signed operator % (const sc_unsigned &u, long v);
friend sc_signed
operator % (const sc_unsigned &u, int v)
{
return operator % (u, (long)v);
}
friend sc_signed operator % (int64 u, const sc_unsigned &v);
friend sc_signed operator % (long u, const sc_unsigned &v);
friend sc_signed
operator % (int u, const sc_unsigned &v)
{
return operator % ((long)u, v);
}
friend sc_signed operator % (const sc_signed &u, const sc_signed &v);
friend sc_signed operator % (const sc_signed &u, int64 v);
friend sc_signed operator % (const sc_signed &u, uint64 v);
friend sc_signed operator % (const sc_signed &u, long v);
friend sc_signed operator % (const sc_signed &u, unsigned long v);
friend sc_signed
operator % (const sc_signed &u, int v)
{
return operator % (u, (long)v);
}
friend sc_signed
operator % (const sc_signed &u, unsigned int v)
{
return operator % (u, (unsigned long)v);
}
friend sc_signed operator % (int64 u, const sc_signed &v);
friend sc_signed operator % (uint64 u, const sc_signed &v);
friend sc_signed operator % (long u, const sc_signed &v);
friend sc_signed operator % (unsigned long u, const sc_signed &v);
friend sc_signed
operator % (int u, const sc_signed &v)
{
return operator % ((long)u, v);
}
friend sc_signed
operator % (unsigned int u, const sc_signed &v)
{
return operator % ((unsigned long) u, v);
}
const sc_signed &operator %= (const sc_signed &v);
const sc_signed &operator %= (const sc_unsigned &v);
const sc_signed &operator %= (int64 v);
const sc_signed &operator %= (uint64 v);
const sc_signed &operator %= (long v);
const sc_signed &operator %= (unsigned long v);
const sc_signed &
operator %= (int v)
{
return operator %= ((long)v);
}
const sc_signed &
operator %= (unsigned int v)
{
return operator %= ((unsigned long)v);
}
friend sc_signed operator % (const sc_unsigned &u, const sc_int_base &v);
friend sc_signed operator % (const sc_int_base &u, const sc_unsigned &v);
friend sc_signed operator % (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator % (const sc_signed &u, const sc_uint_base &v);
friend sc_signed operator % (const sc_int_base &u, const sc_signed &v);
friend sc_signed operator % (const sc_uint_base &u, const sc_signed &v);
const sc_signed &operator %= (const sc_int_base &v);
const sc_signed &operator %= (const sc_uint_base &v);
// BITWISE OPERATORS:
// Bitwise AND operators:
friend sc_signed operator & (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator & (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator & (const sc_unsigned &u, int64 v);
friend sc_signed operator & (const sc_unsigned &u, long v);
friend sc_signed
operator &(const sc_unsigned &u, int v)
{
return operator & (u, (long)v);
}
friend sc_signed operator & (int64 u, const sc_unsigned &v);
friend sc_signed operator & (long u, const sc_unsigned &v);
friend sc_signed
operator & (int u, const sc_unsigned &v)
{
return operator & ((long) u, v);
}
friend sc_signed operator & (const sc_signed &u, const sc_signed &v);
friend sc_signed operator & (const sc_signed &u, int64 v);
friend sc_signed operator & (const sc_signed &u, uint64 v);
friend sc_signed operator & (const sc_signed &u, long v);
friend sc_signed operator & (const sc_signed &u, unsigned long v);
friend sc_signed
operator & (const sc_signed &u, int v)
{
return operator & (u, (long)v);
}
friend sc_signed
operator & (const sc_signed &u, unsigned int v)
{
return operator & (u, (unsigned long)v);
}
friend sc_signed operator & (int64 u, const sc_signed &v);
friend sc_signed operator & (uint64 u, const sc_signed &v);
friend sc_signed operator & (long u, const sc_signed &v);
friend sc_signed operator & (unsigned long u, const sc_signed &v);
friend sc_signed operator & (int u, const sc_signed &v)
{ return operator&((long) u, v); }
friend sc_signed operator & (unsigned int u, const sc_signed &v)
{ return operator&((unsigned long) u, v); }
const sc_signed &operator &= (const sc_signed &v);
const sc_signed &operator &= (const sc_unsigned &v);
const sc_signed &operator &= (int64 v);
const sc_signed &operator &= (uint64 v);
const sc_signed &operator &= (long v);
const sc_signed &operator &= (unsigned long v);
const sc_signed &
operator &= (int v)
{
return operator &= ((long) v);
}
const sc_signed &
operator &= (unsigned int v)
{
return operator &= ((unsigned long) v);
}
friend sc_signed operator & (const sc_unsigned &u, const sc_int_base &v);
friend sc_signed operator & (const sc_int_base &u, const sc_unsigned &v);
friend sc_signed operator & (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator & (const sc_signed &u, const sc_uint_base &v);
friend sc_signed operator & (const sc_int_base &u, const sc_signed &v);
friend sc_signed operator & (const sc_uint_base &u, const sc_signed &v);
const sc_signed &operator &= (const sc_int_base &v);
const sc_signed &operator &= (const sc_uint_base &v);
// Bitwise OR operators:
friend sc_signed operator | (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator | (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator | (const sc_unsigned &u, int64 v);
friend sc_signed operator | (const sc_unsigned &u, long v);
friend sc_signed
operator | (const sc_unsigned &u, int v)
{
return operator | (u, (long)v);
}
friend sc_signed operator | (int64 u, const sc_unsigned &v);
friend sc_signed operator | (long u, const sc_unsigned &v);
friend sc_signed
operator | (int u, const sc_unsigned &v)
{
return operator | ((long)u, v);
}
friend sc_signed operator | (const sc_signed &u, const sc_signed &v);
friend sc_signed operator | (const sc_signed &u, int64 v);
friend sc_signed operator | (const sc_signed &u, uint64 v);
friend sc_signed operator | (const sc_signed &u, long v);
friend sc_signed operator | (const sc_signed &u, unsigned long v);
friend sc_signed
operator | (const sc_signed &u, int v)
{
return operator | (u, (long)v);
}
friend sc_signed
operator | (const sc_signed &u, unsigned int v)
{
return operator | (u, (unsigned long)v);
}
friend sc_signed operator | (int64 u, const sc_signed &v);
friend sc_signed operator | (uint64 u, const sc_signed &v);
friend sc_signed operator | (long u, const sc_signed &v);
friend sc_signed operator | (unsigned long u, const sc_signed &v);
friend sc_signed
operator | (int u, const sc_signed &v)
{
return operator | ((long) u, v);
}
friend sc_signed
operator | (unsigned int u, const sc_signed &v)
{
return operator | ((unsigned long)u, v);
}
const sc_signed &operator |= (const sc_signed &v);
const sc_signed &operator |= (const sc_unsigned &v);
const sc_signed &operator |= (int64 v);
const sc_signed &operator |= (uint64 v);
const sc_signed &operator |= (long v);
const sc_signed &operator |= (unsigned long v);
const sc_signed &
operator |= (int v)
{
return operator |= ((long)v);
}
const sc_signed &
operator |= (unsigned int v)
{
return operator |= ((unsigned long)v);
}
friend sc_signed operator | (const sc_unsigned &u, const sc_int_base &v);
friend sc_signed operator | (const sc_int_base &u, const sc_unsigned &v);
friend sc_signed operator | (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator | (const sc_signed &u, const sc_uint_base &v);
friend sc_signed operator | (const sc_int_base &u, const sc_signed &v);
friend sc_signed operator | (const sc_uint_base &u, const sc_signed &v);
const sc_signed &operator |= (const sc_int_base &v);
const sc_signed &operator |= (const sc_uint_base &v);
// Bitwise XOR operators:
friend sc_signed operator ^ (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator ^ (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator ^ (const sc_unsigned &u, int64 v);
friend sc_signed operator ^ (const sc_unsigned &u, long v);
friend sc_signed
operator ^ (const sc_unsigned &u, int v)
{
return operator ^ (u, (long)v);
}
friend sc_signed operator ^ (int64 u, const sc_unsigned &v);
friend sc_signed operator ^ (long u, const sc_unsigned &v);
friend sc_signed
operator ^ (int u, const sc_unsigned &v)
{
return operator ^ ((long)u, v);
}
friend sc_signed operator ^ (const sc_signed &u, const sc_signed &v);
friend sc_signed operator ^ (const sc_signed &u, int64 v);
friend sc_signed operator ^ (const sc_signed &u, uint64 v);
friend sc_signed operator ^ (const sc_signed &u, long v);
friend sc_signed operator ^ (const sc_signed &u, unsigned long v);
friend sc_signed
operator ^ (const sc_signed &u, int v)
{
return operator ^ (u, (long)v);
}
friend sc_signed
operator ^ (const sc_signed &u, unsigned int v)
{
return operator ^ (u, (unsigned long)v);
}
friend sc_signed operator ^ (int64 u, const sc_signed &v);
friend sc_signed operator ^ (uint64 u, const sc_signed &v);
friend sc_signed operator ^ (long u, const sc_signed &v);
friend sc_signed operator ^ (unsigned long u, const sc_signed &v);
friend sc_signed
operator ^ (int u, const sc_signed &v)
{
return operator ^ ((long)u, v);
}
friend sc_signed
operator ^ (unsigned int u, const sc_signed &v)
{
return operator ^ ((unsigned long)u, v);
}
const sc_signed &operator ^= (const sc_signed &v);
const sc_signed &operator ^= (const sc_unsigned &v);
const sc_signed &operator ^= (int64 v);
const sc_signed &operator ^= (uint64 v);
const sc_signed &operator ^= (long v);
const sc_signed &operator ^= (unsigned long v);
const sc_signed &
operator ^= (int v)
{
return operator ^= ((long)v);
}
const sc_signed &
operator ^= (unsigned int v)
{
return operator ^= ((unsigned long)v);
}
friend sc_signed operator ^ (const sc_unsigned &u, const sc_int_base &v);
friend sc_signed operator ^ (const sc_int_base &u, const sc_unsigned &v);
friend sc_signed operator ^ (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator ^ (const sc_signed &u, const sc_uint_base &v);
friend sc_signed operator ^ (const sc_int_base &u, const sc_signed &v);
friend sc_signed operator ^ (const sc_uint_base &u, const sc_signed &v);
const sc_signed &operator ^= (const sc_int_base &v);
const sc_signed &operator ^= (const sc_uint_base &v);
// SHIFT OPERATORS:
// LEFT SHIFT operators:
friend sc_unsigned operator << (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator << (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator << (const sc_signed &u, const sc_signed &v);
friend sc_signed operator << (const sc_signed &u, int64 v);
friend sc_signed operator << (const sc_signed &u, uint64 v);
friend sc_signed operator << (const sc_signed &u, long v);
friend sc_signed operator << (const sc_signed &u, unsigned long v);
friend sc_signed
operator << (const sc_signed &u, int v)
{
return operator << (u, (long)v);
}
friend sc_signed
operator << (const sc_signed &u, unsigned int v)
{
return operator << (u, (unsigned long)v);
}
const sc_signed &operator <<= (const sc_signed &v);
const sc_signed &operator <<= (const sc_unsigned &v);
const sc_signed &operator <<= (int64 v);
const sc_signed &operator <<= (uint64 v);
const sc_signed &operator <<= (long v);
const sc_signed &operator <<= (unsigned long v);
const sc_signed &
operator <<= (int v)
{
return operator <<= ((long)v);
}
const sc_signed &
operator <<= (unsigned int v)
{
return operator <<= ((unsigned long)v);
}
friend sc_signed operator << (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator << (const sc_signed &u, const sc_uint_base &v);
const sc_signed &operator <<= (const sc_int_base &v);
const sc_signed &operator <<= (const sc_uint_base &v);
// RIGHT SHIFT operators:
friend sc_unsigned operator >> (const sc_unsigned &u, const sc_signed &v);
friend sc_signed operator >> (const sc_signed &u, const sc_unsigned &v);
friend sc_signed operator >> (const sc_signed &u, const sc_signed &v);
friend sc_signed operator >> (const sc_signed &u, int64 v);
friend sc_signed operator >> (const sc_signed &u, uint64 v);
friend sc_signed operator >> (const sc_signed &u, long v);
friend sc_signed operator >> (const sc_signed &u, unsigned long v);
friend sc_signed
operator >> (const sc_signed &u, int v)
{
return operator >> (u, (long)v);
}
friend sc_signed
operator >> (const sc_signed &u, unsigned int v)
{
return operator >> (u, (unsigned long) v);
}
const sc_signed &operator >>= (const sc_signed &v);
const sc_signed &operator >>= (const sc_unsigned &v);
const sc_signed &operator >>= (int64 v);
const sc_signed &operator >>= (uint64 v);
const sc_signed &operator >>= (long v);
const sc_signed &operator >>= (unsigned long v);
const sc_signed &
operator >>= (int v)
{
return operator >>= ((long)v);
}
const sc_signed &
operator >>= (unsigned int v)
{
return operator >>= ((unsigned long)v);
}
friend sc_signed operator >> (const sc_signed &u, const sc_int_base &v);
friend sc_signed operator >> (const sc_signed &u, const sc_uint_base &v);
const sc_signed &operator >>= (const sc_int_base &v);
const sc_signed &operator >>= (const sc_uint_base &v);
// Unary arithmetic operators
friend sc_signed operator + (const sc_signed &u);
friend sc_signed operator - (const sc_signed &u);
friend sc_signed operator - (const sc_unsigned &u);
// LOGICAL OPERATORS:
// Logical EQUAL operators:
friend bool operator == (const sc_unsigned &u, const sc_signed &v);
friend bool operator == (const sc_signed &u, const sc_unsigned &v);
friend bool operator == (const sc_signed &u, const sc_signed &v);
friend bool operator == (const sc_signed &u, int64 v);
friend bool operator == (const sc_signed &u, uint64 v);
friend bool operator == (const sc_signed &u, long v);
friend bool operator == (const sc_signed &u, unsigned long v);
friend bool
operator == (const sc_signed &u, int v)
{
return operator == (u, (long)v);
}
friend bool
operator == (const sc_signed &u, unsigned int v)
{
return operator == (u, (unsigned long)v);
}
friend bool operator == (int64 u, const sc_signed &v);
friend bool operator == (uint64 u, const sc_signed &v);
friend bool operator == (long u, const sc_signed &v);
friend bool operator == (unsigned long u, const sc_signed &v);
friend bool
operator == (int u, const sc_signed &v)
{
return operator == ((long)u, v);
}
friend bool
operator == (unsigned int u, const sc_signed &v)
{
return operator == ((unsigned long)u, v);
}
friend bool operator == (const sc_signed &u, const sc_int_base &v);
friend bool operator == (const sc_signed &u, const sc_uint_base &v);
friend bool operator == (const sc_int_base &u, const sc_signed &v);
friend bool operator == (const sc_uint_base &u, const sc_signed &v);
// Logical NOT_EQUAL operators:
friend bool operator != (const sc_unsigned &u, const sc_signed &v);
friend bool operator != (const sc_signed &u, const sc_unsigned &v);
friend bool operator != (const sc_signed &u, const sc_signed &v);
friend bool operator != (const sc_signed &u, int64 v);
friend bool operator != (const sc_signed &u, uint64 v);
friend bool operator != (const sc_signed &u, long v);
friend bool operator != (const sc_signed &u, unsigned long v);
friend bool
operator != (const sc_signed &u, int v)
{
return operator != (u, (long)v);
}
friend bool
operator != (const sc_signed &u, unsigned int v)
{
return operator != (u, (unsigned long)v);
}
friend bool operator != (int64 u, const sc_signed &v);
friend bool operator != (uint64 u, const sc_signed &v);
friend bool operator != (long u, const sc_signed &v);
friend bool operator != (unsigned long u, const sc_signed &v);
friend bool
operator != (int u, const sc_signed &v)
{
return operator != ((long)u, v);
}
friend bool
operator != (unsigned int u, const sc_signed &v)
{
return operator != ((unsigned long)u, v);
}
friend bool operator != (const sc_signed &u, const sc_int_base &v);
friend bool operator != (const sc_signed &u, const sc_uint_base &v);
friend bool operator != (const sc_int_base &u, const sc_signed &v);
friend bool operator != (const sc_uint_base &u, const sc_signed &v);
// Logical LESS_THAN operators:
friend bool operator < (const sc_unsigned &u, const sc_signed &v);
friend bool operator < (const sc_signed &u, const sc_unsigned &v);
friend bool operator < (const sc_signed &u, const sc_signed &v);
friend bool operator < (const sc_signed &u, int64 v);
friend bool operator < (const sc_signed &u, uint64 v);
friend bool operator < (const sc_signed &u, long v);
friend bool operator < (const sc_signed &u, unsigned long v);
friend bool operator < (const sc_signed &u, int v)
{ return operator<(u, (long) v); }
friend bool operator < (const sc_signed &u, unsigned int v)
{ return operator<(u, (unsigned long) v); }
friend bool operator < (int64 u, const sc_signed &v);
friend bool operator < (uint64 u, const sc_signed &v);
friend bool operator < (long u, const sc_signed &v);
friend bool operator < (unsigned long u, const sc_signed &v);
friend bool
operator < (int u, const sc_signed &v)
{
return operator < ((long)u, v);
}
friend bool
operator < (unsigned int u, const sc_signed &v)
{
return operator < ((unsigned long)u, v);
}
friend bool operator < (const sc_signed &u, const sc_int_base &v);
friend bool operator < (const sc_signed &u, const sc_uint_base &v);
friend bool operator < (const sc_int_base &u, const sc_signed &v);
friend bool operator < (const sc_uint_base &u, const sc_signed &v);
// Logical LESS_THAN_AND_EQUAL operators:
friend bool operator <= (const sc_unsigned &u, const sc_signed &v);
friend bool operator <= (const sc_signed &u, const sc_unsigned &v);
friend bool operator <= (const sc_signed &u, const sc_signed &v);
friend bool operator <= (const sc_signed &u, int64 v);
friend bool operator <= (const sc_signed &u, uint64 v);
friend bool operator <= (const sc_signed &u, long v);
friend bool operator <= (const sc_signed &u, unsigned long v);
friend bool
operator <= (const sc_signed &u, int v)
{
return operator <= (u, (long)v);
}
friend bool
operator <= (const sc_signed &u, unsigned int v)
{
return operator <= (u, (unsigned long)v);
}
friend bool operator <= (int64 u, const sc_signed &v);
friend bool operator <= (uint64 u, const sc_signed &v);
friend bool operator <= (long u, const sc_signed &v);
friend bool operator <= (unsigned long u, const sc_signed &v);
friend bool
operator <= (int u, const sc_signed &v)
{
return operator <= ((long)u, v);
}
friend bool
operator <= (unsigned int u, const sc_signed &v)
{
return operator <= ((unsigned long)u, v);
}
friend bool operator <= (const sc_signed &u, const sc_int_base &v);
friend bool operator <= (const sc_signed &u, const sc_uint_base &v);
friend bool operator <= (const sc_int_base &u, const sc_signed &v);
friend bool operator <= (const sc_uint_base &u, const sc_signed &v);
// Logical GREATER_THAN operators:
friend bool operator > (const sc_unsigned &u, const sc_signed &v);
friend bool operator > (const sc_signed &u, const sc_unsigned &v);
friend bool operator > (const sc_signed &u, const sc_signed &v);
friend bool operator > (const sc_signed &u, int64 v);
friend bool operator > (const sc_signed &u, uint64 v);
friend bool operator > (const sc_signed &u, long v);
friend bool operator > (const sc_signed &u, unsigned long v);
friend bool
operator > (const sc_signed &u, int v)
{
return operator > (u, (long)v);
}
friend bool
operator > (const sc_signed &u, unsigned int v)
{
return operator > (u, (unsigned long)v);
}
friend bool operator > (int64 u, const sc_signed &v);
friend bool operator > (uint64 u, const sc_signed &v);
friend bool operator > (long u, const sc_signed &v);
friend bool operator > (unsigned long u, const sc_signed &v);
friend bool
operator > (int u, const sc_signed &v)
{
return operator > ((long)u, v);
}
friend bool
operator > (unsigned int u, const sc_signed &v)
{
return operator > ((unsigned long)u, v);
}
friend bool operator > (const sc_signed &u, const sc_int_base &v);
friend bool operator > (const sc_signed &u, const sc_uint_base &v);
friend bool operator > (const sc_int_base &u, const sc_signed &v);
friend bool operator > (const sc_uint_base &u, const sc_signed &v);
// Logical GREATER_THAN_AND_EQUAL operators:
friend bool operator >= (const sc_unsigned &u, const sc_signed &v);
friend bool operator >= (const sc_signed &u, const sc_unsigned &v);
friend bool operator >= (const sc_signed &u, const sc_signed &v);
friend bool operator >= (const sc_signed &u, int64 v);
friend bool operator >= (const sc_signed &u, uint64 v);
friend bool operator >= (const sc_signed &u, long v);
friend bool operator >= (const sc_signed &u, unsigned long v);
friend bool
operator >= (const sc_signed &u, int v)
{
return operator >= (u, (long)v);
}
friend bool
operator >= (const sc_signed &u, unsigned int v)
{
return operator >= (u, (unsigned long)v);
}
friend bool operator >= (int64 u, const sc_signed &v);
friend bool operator >= (uint64 u, const sc_signed &v);
friend bool operator >= (long u, const sc_signed &v);
friend bool operator >= (unsigned long u, const sc_signed &v);
friend bool
operator >= (int u, const sc_signed &v)
{
return operator >= ((long)u, v);
}
friend bool
operator >= (unsigned int u, const sc_signed &v)
{
return operator >= ((unsigned long)u, v);
}
friend bool operator >= (const sc_signed &u, const sc_int_base &v);
friend bool operator >= (const sc_signed &u, const sc_uint_base &v);
friend bool operator >= (const sc_int_base &u, const sc_signed &v);
friend bool operator >= (const sc_uint_base &u, const sc_signed &v);
// Bitwise NOT operator (unary).
friend sc_signed operator ~ (const sc_signed &u);
// Helper functions.
friend sc_signed add_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
friend sc_signed sub_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
friend sc_signed mul_signed_friend(
small_type s, int unb, int und, const sc_digit *ud,
int vnb, int vnd, const sc_digit *vd);
friend sc_signed div_signed_friend(
small_type s, int unb, int und, const sc_digit *ud,
int vnb, int vnd, const sc_digit *vd);
friend sc_signed mod_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
int vnb, int vnd, const sc_digit *vd);
friend sc_signed and_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
friend sc_signed or_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
friend sc_signed xor_signed_friend(
small_type us, int unb, int und, const sc_digit *ud,
small_type vs, int vnb, int vnd, const sc_digit *vd);
private:
small_type sgn; // Shortened as s.
int nbits; // Shortened as nb.
int ndigits; // Shortened as nd.
#ifdef SC_MAX_NBITS
sc_digit digit[DIV_CEIL(SC_MAX_NBITS)]; // Shortened as d.
#else
sc_digit *digit; // Shortened as d.
#endif
/*
* Private constructors:
*/
// Create a copy of v with sign s.
sc_signed(const sc_signed &v, small_type s);
sc_signed(const sc_unsigned &v, small_type s);
// Create a signed number with the given attributes.
sc_signed(small_type s, int nb, int nd, sc_digit *d, bool alloc=true);
// Create an unsigned number using the bits u[l..r].
sc_signed(const sc_signed *u, int l, int r);
sc_signed(const sc_unsigned *u, int l, int r);
// Private member functions. The called functions are inline functions.
small_type default_sign() const { return SC_NOSIGN; }
int num_bits(int nb) const { return nb; }
bool check_if_outside(int bit_num) const;
void
copy_digits(int nb, int nd, const sc_digit *d)
{
copy_digits_signed(sgn, nbits, ndigits, digit, nb, nd, d);
}
void makezero() { sgn = make_zero(ndigits, digit); }
// Conversion functions between 2's complement (2C) and
// sign-magnitude (SM):
void
convert_2C_to_SM()
{
sgn = convert_signed_2C_to_SM(nbits, ndigits, digit);
}
void
convert_SM_to_2C_to_SM()
{
sgn = convert_signed_SM_to_2C_to_SM(sgn, nbits, ndigits, digit);
}
void
convert_SM_to_2C()
{
convert_signed_SM_to_2C(sgn, ndigits, digit);
}
};
inline ::std::ostream &operator << (::std::ostream &, const sc_signed &);
inline ::std::istream &operator >> (::std::istream &, sc_signed &);
inline ::std::ostream &
operator << (::std::ostream &os, const sc_signed_bitref_r &a)
{
a.print(os);
return os;
}
inline ::std::istream &
operator >> (::std::istream &is, sc_signed_bitref &a)
{
a.scan(is);
return is;
}
// ----------------------------------------------------------------------------
// CLASS : sc_signed_subref_r
//
// Proxy class for sc_signed part selection (r-value only).
// ----------------------------------------------------------------------------
// reduce methods
inline bool
sc_signed_subref_r::and_reduce() const
{
const sc_signed *target_p = m_obj_p;
for (int i = m_right; i <= m_left; i++)
if (!target_p->test(i))
return false;
return true;
}
inline bool
sc_signed_subref_r::nand_reduce() const
{
return !and_reduce();
}
inline bool
sc_signed_subref_r::or_reduce() const
{
const sc_signed *target_p = m_obj_p;
for (int i = m_right; i <= m_left; i++)
if (target_p->test(i))
return true;
return false;
}
inline bool
sc_signed_subref_r::nor_reduce() const
{
return !or_reduce();
}
inline bool
sc_signed_subref_r::xor_reduce() const
{
int odd;
const sc_signed *target_p = m_obj_p;
odd = 0;
for (int i = m_right; i <= m_left; i++)
if (target_p->test(i)) odd = ~odd;
return odd ? true : false;
}
inline bool
sc_signed_subref_r::xnor_reduce() const
{
return !xor_reduce();
}
inline ::std::ostream &
operator << (::std::ostream &os, const sc_signed_subref_r &a)
{
a.print(os);
return os;
}
// ----------------------------------------------------------------------------
// CLASS : sc_signed_subref
//
// Proxy class for sc_signed part selection (r-value and l-value).
// ----------------------------------------------------------------------------
// assignment operators
inline const sc_signed_subref &
sc_signed_subref::operator = (const char *a)
{
sc_signed aa(length());
return (*this = aa = a);
}
inline ::std::istream &
operator >> (::std::istream &is, sc_signed_subref &a)
{
a.scan(is);
return is;
}
// ----------------------------------------------------------------------------
// CLASS : sc_signed
//
// Arbitrary precision signed number.
// ----------------------------------------------------------------------------
template<class T>
sc_signed::sc_signed(const sc_generic_base<T> &v)
{
int nb = v->length();
sgn = default_sign();
if (nb > 0) {
nbits = num_bits(nb);
} else {
invalid_init("sc_generic_base<T>", nb);
sc_core::sc_abort(); // can't recover from here
}
ndigits = DIV_CEIL(nbits);
# ifdef SC_MAX_NBITS
test_bound(nb);
# else
digit = new sc_digit[ndigits];
# endif
makezero();
v->to_sc_signed(*this);
}
inline ::std::ostream &
operator << (::std::ostream &os, const sc_signed &a)
{
a.print(os);
return os;
}
inline ::std::istream &
operator >> (::std::istream &is, sc_signed &a)
{
a.scan(is);
return is;
}
} // namespace sc_dt
#endif // __SYSTEMC_EXT_DT_INT_SC_SIGNED_HH__