summaryrefslogtreecommitdiff
path: root/src/systemc/ext/dt/int/sc_signed.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/ext/dt/int/sc_signed.hh')
-rw-r--r--src/systemc/ext/dt/int/sc_signed.hh2504
1 files changed, 2504 insertions, 0 deletions
diff --git a/src/systemc/ext/dt/int/sc_signed.hh b/src/systemc/ext/dt/int/sc_signed.hh
new file mode 100644
index 000000000..9d31a276d
--- /dev/null
+++ b/src/systemc/ext/dt/int/sc_signed.hh
@@ -0,0 +1,2504 @@
+/*****************************************************************************
+
+ 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__