sc_unsigned.h

来自「基于4个mips核的noc设计」· C头文件 代码 · 共 1,850 行 · 第 1/5 页

H
1,850
字号
/*****************************************************************************  The following code is derived, directly or indirectly, from the SystemC  source code Copyright (c) 1996-2002 by all Contributors.  All Rights reserved.  The contents of this file are subject to the restrictions and limitations  set forth in the SystemC Open Source License Version 2.3 (the "License");  You may not use this file except in compliance with such restrictions and  limitations. You may obtain instructions on how to receive a copy of the  License at http://www.systemc.org/. Software distributed by Contributors  under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF  ANY KIND, either express or implied. See the License for the specific  language governing rights and limitations under the License. *****************************************************************************//*****************************************************************************  sc_unsigned.h -- Arbitrary precision unsigned arithmetic.     This file includes the definitions of sc_unsigned_bitref,    sc_unsigned_subref, and sc_unsigned classes. The first two classes    are proxy classes to reference one bit and a range of bits of a    sc_unsigned 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.    It is also important to note that an sc_unsigned number with n    bits is equivalent to an sc_signed non-negative number with n + 1    bits.    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: *****************************************************************************/#ifndef SC_UNSIGNED_H#define SC_UNSIGNED_H#include "systemc/utils/sc_iostream.h"#include "systemc/datatypes/int/sc_length_param.h"#include "systemc/datatypes/int/sc_nbdefs.h"#include "systemc/datatypes/int/sc_nbutils.h"#include "systemc/datatypes/int/sc_nbexterns.h"namespace sc_dt{// classes defined in this moduleclass sc_unsigned_bitref_r;class sc_unsigned_bitref;class sc_unsigned_subref_r;class sc_unsigned_subref;template <class T1, class T2>    class sc_unsigned_concref_r; // NOT YET IMPLEMENTEDtemplate <class T1, class T2>    class sc_unsigned_concref;   // NOT YET IMPLEMENTEDclass sc_unsigned;// forward class declarationsclass sc_bv_base;class sc_lv_base;class sc_int_base;class sc_uint_base;class sc_signed;class sc_signed_subref_r;template <class T1, class T2>    class sc_signed_concref_r; // NOT YET IMPLEMENTEDclass sc_fxval;class sc_fxval_fast;class sc_fxnum;class sc_fxnum_fast;#define NOT_YET_IMPLEMENTED                                                   \    SC_REPORT_ERROR( SC_ID_NOT_IMPLEMENTED_,                                  \                     "sc_unsigned/sc_biguint concatenation" )// ----------------------------------------------------------------------------//  CLASS : sc_unsigned_bitref_r////  Proxy class for sc_unsigned bit selection (r-value only).// ----------------------------------------------------------------------------class sc_unsigned_bitref_r{    friend class sc_unsigned;protected:    // constructor    sc_unsigned_bitref_r( const sc_unsigned& obj_, int index_ )	: m_obj( CCAST<sc_unsigned&>( obj_ ) ), m_index( index_ )	{}public:    // copy constructor    sc_unsigned_bitref_r( const sc_unsigned_bitref_r& a )	: m_obj( a.m_obj ), m_index( a.m_index )	{}    // cloning    sc_unsigned_bitref_r* clone() const	{ return new sc_unsigned_bitref_r( *this ); }    // capacity    int length() const	{ return 1; }    // implicit conversion to bool    operator bool () const;    bool operator ! () const;    bool operator ~ () const;    // explicit conversions    bool value() const	{ return operator bool(); }    bool to_bool() const	{ return operator bool(); }    // other methods    void print( ostream& os = cout ) const	{ os << to_bool(); }protected:    sc_unsigned& m_obj;    int          m_index;private:    // disabled    sc_unsigned_bitref_r();    sc_unsigned_bitref_r& operator = ( const sc_unsigned_bitref_r& );};// r-value concatenation operators and functionstemplate <class T1, class T2>inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_concref_r<T1,T2> >operator , ( sc_unsigned_bitref_r, sc_unsigned_concref_r<T1,T2> );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_bitref_r>operator , ( sc_unsigned_bitref_r, sc_unsigned_bitref_r );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_subref_r>operator , ( sc_unsigned_bitref_r, sc_unsigned_subref_r );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>operator , ( sc_unsigned_bitref_r, const sc_unsigned& );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>operator , ( sc_unsigned_bitref_r, bool );inlinesc_unsigned_concref_r<sc_unsigned,sc_unsigned_bitref_r>operator , ( bool, sc_unsigned_bitref_r );template <class T1, class T2>inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_concref_r<T1,T2> >concat( sc_unsigned_bitref_r, sc_unsigned_concref_r<T1,T2> );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_bitref_r>concat( sc_unsigned_bitref_r, sc_unsigned_bitref_r );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_subref_r>concat( sc_unsigned_bitref_r, sc_unsigned_subref_r );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>concat( sc_unsigned_bitref_r, const sc_unsigned& );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>concat( sc_unsigned_bitref_r, bool );inlinesc_unsigned_concref_r<sc_unsigned,sc_unsigned_bitref_r>concat( bool, sc_unsigned_bitref_r );#ifdef SC_DT_MIXED_COMMA_OPERATORStemplate <class T1, class T2>inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_concref_r<T1,T2> >operator , ( sc_unsigned_bitref_r, sc_unsigned_concref<T1,T2> );template <class T1, class T2>inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_concref_r<T1,T2> >operator , ( sc_unsigned_bitref, sc_unsigned_concref_r<T1,T2> );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_bitref_r>operator , ( sc_unsigned_bitref_r, sc_unsigned_bitref );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_bitref_r>operator , ( sc_unsigned_bitref, sc_unsigned_bitref_r );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_subref_r>operator , ( sc_unsigned_bitref_r, sc_unsigned_subref );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_subref_r>operator , ( sc_unsigned_bitref, sc_unsigned_subref_r );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>operator , ( sc_unsigned_bitref_r, sc_unsigned& );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>operator , ( sc_unsigned_bitref, const sc_unsigned& );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>operator , ( sc_unsigned_bitref, bool );inlinesc_unsigned_concref_r<sc_unsigned,sc_unsigned_bitref_r>operator , ( bool, sc_unsigned_bitref );template <class T1, class T2>inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_concref_r<T1,T2> >concat( sc_unsigned_bitref_r, sc_unsigned_concref<T1,T2> );template <class T1, class T2>inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_concref_r<T1,T2> >concat( sc_unsigned_bitref, sc_unsigned_concref_r<T1,T2> );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_bitref_r>concat( sc_unsigned_bitref_r, sc_unsigned_bitref );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_bitref_r>concat( sc_unsigned_bitref, sc_unsigned_bitref_r );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_subref_r>concat( sc_unsigned_bitref_r, sc_unsigned_subref );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned_subref_r>concat( sc_unsigned_bitref, sc_unsigned_subref_r );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>concat( sc_unsigned_bitref_r, sc_unsigned& );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>concat( sc_unsigned_bitref, const sc_unsigned& );inlinesc_unsigned_concref_r<sc_unsigned_bitref_r,sc_unsigned>concat( sc_unsigned_bitref, bool );inlinesc_unsigned_concref_r<sc_unsigned,sc_unsigned_bitref_r>concat( bool, sc_unsigned_bitref );#endifinlineostream&operator << ( ostream&, const sc_unsigned_bitref_r& );// ----------------------------------------------------------------------------//  CLASS : sc_unsigned_bitref////  Proxy class for sc_unsigned bit selection (r-value and l-value).// ----------------------------------------------------------------------------class sc_unsigned_bitref    : public sc_unsigned_bitref_r{    friend class sc_unsigned;    // constructor    sc_unsigned_bitref( sc_unsigned& obj_, int index_ )	: sc_unsigned_bitref_r( obj_, index_ )	{}public:    // copy constructor    sc_unsigned_bitref( const sc_unsigned_bitref& a )	: sc_unsigned_bitref_r( a )	{}    // cloning    sc_unsigned_bitref* clone() const	{ return new sc_unsigned_bitref( *this ); }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?