112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_uint_base.h -- A sc_uint is an unsigned integer whose length is less than 2312027Sjungma@eit.uni-kl.de the machine's native integer length. We provide two 2412027Sjungma@eit.uni-kl.de implementations (i) sc_uint with length between 1 - 64, and (ii) 2512027Sjungma@eit.uni-kl.de sc_uint with length between 1 - 32. Implementation (i) is the 2612027Sjungma@eit.uni-kl.de default implementation, while implementation (ii) can be used 2712027Sjungma@eit.uni-kl.de only if compiled with -D_32BIT_. Unlike arbitrary precision, 2812027Sjungma@eit.uni-kl.de arithmetic and bitwise operations are performed using the native 2912027Sjungma@eit.uni-kl.de types (hence capped at 32/64 bits). The sc_uint integer is 3012027Sjungma@eit.uni-kl.de useful when the user does not need arbitrary precision and the 3112027Sjungma@eit.uni-kl.de performance is superior to sc_bigint/sc_biguint. 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de Original Author: Amit Rao, Synopsys, Inc. 3412027Sjungma@eit.uni-kl.de 3512027Sjungma@eit.uni-kl.de *****************************************************************************/ 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de/***************************************************************************** 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 4012027Sjungma@eit.uni-kl.de changes you are making here. 4112027Sjungma@eit.uni-kl.de 4212027Sjungma@eit.uni-kl.de Name, Affiliation, Date: Ali Dasdan, Synopsys, Inc. 4312027Sjungma@eit.uni-kl.de Description of Modification: - Resolved ambiguity with sc_(un)signed. 4412027Sjungma@eit.uni-kl.de - Merged the code for 64- and 32-bit versions 4512027Sjungma@eit.uni-kl.de via the constants in sc_nbdefs.h. 4612027Sjungma@eit.uni-kl.de - Eliminated redundant file inclusions. 4712027Sjungma@eit.uni-kl.de 4812027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 4912027Sjungma@eit.uni-kl.de Description of Modification: 5012027Sjungma@eit.uni-kl.de 5112027Sjungma@eit.uni-kl.de *****************************************************************************/ 5212027Sjungma@eit.uni-kl.de 5312027Sjungma@eit.uni-kl.de// $Log: sc_uint_base.h,v $ 5412027Sjungma@eit.uni-kl.de// Revision 1.3 2011/08/24 22:05:46 acg 5512027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 5612027Sjungma@eit.uni-kl.de// 5712027Sjungma@eit.uni-kl.de// Revision 1.2 2011/02/18 20:19:15 acg 5812027Sjungma@eit.uni-kl.de// Andy Goodrich: updating Copyright notice. 5912027Sjungma@eit.uni-kl.de// 6012027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:05 acg 6112027Sjungma@eit.uni-kl.de// SystemC 2.3 6212027Sjungma@eit.uni-kl.de// 6312027Sjungma@eit.uni-kl.de// Revision 1.4 2006/05/08 17:50:02 acg 6412027Sjungma@eit.uni-kl.de// Andy Goodrich: Added David Long's declarations for friend operators, 6512027Sjungma@eit.uni-kl.de// functions, and methods, to keep the Microsoft compiler happy. 6612027Sjungma@eit.uni-kl.de// 6712027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:49:32 acg 6812027Sjungma@eit.uni-kl.de// Added $Log command so that CVS check in comments are reproduced in the 6912027Sjungma@eit.uni-kl.de// source. 7012027Sjungma@eit.uni-kl.de// 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.de#ifndef SC_UINT_BASE_H 7312027Sjungma@eit.uni-kl.de#define SC_UINT_BASE_H 7412027Sjungma@eit.uni-kl.de 7512027Sjungma@eit.uni-kl.de 7612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_object.h" 7712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/misc/sc_value_base.h" 7812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_ids.h" 7912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_length_param.h" 8012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_nbdefs.h" 8112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_ieee.h" 8212027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_iostream.h" 8312027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_temporary.h" 8412027Sjungma@eit.uni-kl.de 8512027Sjungma@eit.uni-kl.de 8612027Sjungma@eit.uni-kl.denamespace sc_dt 8712027Sjungma@eit.uni-kl.de{ 8812027Sjungma@eit.uni-kl.de 8912027Sjungma@eit.uni-kl.declass sc_concatref; 9012027Sjungma@eit.uni-kl.de 9112027Sjungma@eit.uni-kl.de// classes defined in this module 9212027Sjungma@eit.uni-kl.declass sc_uint_bitref_r; 9312027Sjungma@eit.uni-kl.declass sc_uint_bitref; 9412027Sjungma@eit.uni-kl.declass sc_uint_subref_r; 9512027Sjungma@eit.uni-kl.declass sc_uint_subref; 9612027Sjungma@eit.uni-kl.declass sc_uint_base; 9712027Sjungma@eit.uni-kl.de 9812027Sjungma@eit.uni-kl.de// forward class declarations 9912027Sjungma@eit.uni-kl.declass sc_bv_base; 10012027Sjungma@eit.uni-kl.declass sc_lv_base; 10112027Sjungma@eit.uni-kl.declass sc_int_subref_r; 10212027Sjungma@eit.uni-kl.declass sc_signed_subref_r; 10312027Sjungma@eit.uni-kl.declass sc_unsigned_subref_r; 10412027Sjungma@eit.uni-kl.declass sc_signed; 10512027Sjungma@eit.uni-kl.declass sc_unsigned; 10612027Sjungma@eit.uni-kl.declass sc_fxval; 10712027Sjungma@eit.uni-kl.declass sc_fxval_fast; 10812027Sjungma@eit.uni-kl.declass sc_fxnum; 10912027Sjungma@eit.uni-kl.declass sc_fxnum_fast; 11012027Sjungma@eit.uni-kl.de 11112027Sjungma@eit.uni-kl.de 11212027Sjungma@eit.uni-kl.deextern const uint_type mask_int[SC_INTWIDTH][SC_INTWIDTH]; 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.de// friend operator declarations 11512027Sjungma@eit.uni-kl.de inline bool operator == ( const sc_uint_base& a, const sc_uint_base& b ); 11612027Sjungma@eit.uni-kl.de inline bool operator != ( const sc_uint_base& a, const sc_uint_base& b ); 11712027Sjungma@eit.uni-kl.de inline bool operator < ( const sc_uint_base& a, const sc_uint_base& b ); 11812027Sjungma@eit.uni-kl.de inline bool operator <= ( const sc_uint_base& a, const sc_uint_base& b ); 11912027Sjungma@eit.uni-kl.de inline bool operator > ( const sc_uint_base& a, const sc_uint_base& b ); 12012027Sjungma@eit.uni-kl.de inline bool operator >= ( const sc_uint_base& a, const sc_uint_base& b ); 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de 12312027Sjungma@eit.uni-kl.de 12412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 12512027Sjungma@eit.uni-kl.de// CLASS : sc_uint_bitref_r 12612027Sjungma@eit.uni-kl.de// 12712027Sjungma@eit.uni-kl.de// Proxy class for sc_uint bit selection (r-value only). 12812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.declass sc_uint_bitref_r : public sc_value_base 13112027Sjungma@eit.uni-kl.de{ 13212027Sjungma@eit.uni-kl.de friend class sc_uint_base; 13312027Sjungma@eit.uni-kl.de friend class sc_uint_signal; 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.de 13612027Sjungma@eit.uni-kl.de // constructors 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.depublic: 13912027Sjungma@eit.uni-kl.de sc_uint_bitref_r( const sc_uint_bitref_r& init ) : 14012027Sjungma@eit.uni-kl.de sc_value_base(init), m_index(init.m_index), m_obj_p(init.m_obj_p) 14112027Sjungma@eit.uni-kl.de {} 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.deprotected: 14412027Sjungma@eit.uni-kl.de sc_uint_bitref_r() : sc_value_base(), m_index(0), m_obj_p(0) 14512027Sjungma@eit.uni-kl.de {} 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.de // initializer for sc_core::sc_vpool: 14812027Sjungma@eit.uni-kl.de 14912027Sjungma@eit.uni-kl.de void initialize( const sc_uint_base* obj_p, int index_ ) 15012027Sjungma@eit.uni-kl.de { 15112027Sjungma@eit.uni-kl.de m_obj_p = (sc_uint_base*)obj_p; 15212027Sjungma@eit.uni-kl.de m_index = index_; 15312027Sjungma@eit.uni-kl.de } 15412027Sjungma@eit.uni-kl.de 15512027Sjungma@eit.uni-kl.depublic: 15612027Sjungma@eit.uni-kl.de 15712027Sjungma@eit.uni-kl.de // destructor 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de virtual ~sc_uint_bitref_r() 16012027Sjungma@eit.uni-kl.de {} 16112027Sjungma@eit.uni-kl.de 16212027Sjungma@eit.uni-kl.de // concatenation support 16312027Sjungma@eit.uni-kl.de 16412027Sjungma@eit.uni-kl.de virtual int concat_length(bool* xz_present_p) const 16512027Sjungma@eit.uni-kl.de { if ( xz_present_p ) *xz_present_p = false; return 1; } 16612027Sjungma@eit.uni-kl.de virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const 16712027Sjungma@eit.uni-kl.de { 16812027Sjungma@eit.uni-kl.de int bit_mask = 1 << (low_i % BITS_PER_DIGIT); 16912027Sjungma@eit.uni-kl.de int word_i = low_i / BITS_PER_DIGIT; 17012027Sjungma@eit.uni-kl.de 17112027Sjungma@eit.uni-kl.de dst_p[word_i] &= ~bit_mask; 17212027Sjungma@eit.uni-kl.de return false; 17312027Sjungma@eit.uni-kl.de } 17412027Sjungma@eit.uni-kl.de virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const 17512027Sjungma@eit.uni-kl.de { 17612027Sjungma@eit.uni-kl.de int bit_mask = 1 << (low_i % BITS_PER_DIGIT); 17712027Sjungma@eit.uni-kl.de bool result; // True is non-zero. 17812027Sjungma@eit.uni-kl.de int word_i = low_i / BITS_PER_DIGIT; 17912027Sjungma@eit.uni-kl.de 18012027Sjungma@eit.uni-kl.de if ( operator uint64() ) 18112027Sjungma@eit.uni-kl.de { 18212027Sjungma@eit.uni-kl.de dst_p[word_i] |= bit_mask; 18312027Sjungma@eit.uni-kl.de result = true; 18412027Sjungma@eit.uni-kl.de } 18512027Sjungma@eit.uni-kl.de else 18612027Sjungma@eit.uni-kl.de { 18712027Sjungma@eit.uni-kl.de dst_p[word_i] &= ~bit_mask; 18812027Sjungma@eit.uni-kl.de result = false; 18912027Sjungma@eit.uni-kl.de } 19012027Sjungma@eit.uni-kl.de return result; 19112027Sjungma@eit.uni-kl.de } 19212027Sjungma@eit.uni-kl.de virtual uint64 concat_get_uint64() const 19312027Sjungma@eit.uni-kl.de { return operator uint64(); } 19412027Sjungma@eit.uni-kl.de 19512027Sjungma@eit.uni-kl.de // capacity 19612027Sjungma@eit.uni-kl.de 19712027Sjungma@eit.uni-kl.de int length() const 19812027Sjungma@eit.uni-kl.de { return 1; } 19912027Sjungma@eit.uni-kl.de 20012027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED 20112027Sjungma@eit.uni-kl.de int bitwidth() const 20212027Sjungma@eit.uni-kl.de { return length(); } 20312027Sjungma@eit.uni-kl.de#endif 20412027Sjungma@eit.uni-kl.de 20512027Sjungma@eit.uni-kl.de 20612027Sjungma@eit.uni-kl.de // implicit conversion to uint64 20712027Sjungma@eit.uni-kl.de 20812027Sjungma@eit.uni-kl.de operator uint64 () const; 20912027Sjungma@eit.uni-kl.de bool operator ! () const; 21012027Sjungma@eit.uni-kl.de bool operator ~ () const; 21112027Sjungma@eit.uni-kl.de 21212027Sjungma@eit.uni-kl.de 21312027Sjungma@eit.uni-kl.de // explicit conversions 21412027Sjungma@eit.uni-kl.de 21512027Sjungma@eit.uni-kl.de uint64 value() const 21612027Sjungma@eit.uni-kl.de { return operator uint64 (); } 21712027Sjungma@eit.uni-kl.de 21812027Sjungma@eit.uni-kl.de bool to_bool() const 21912027Sjungma@eit.uni-kl.de { return operator uint64 (); } 22012027Sjungma@eit.uni-kl.de 22112027Sjungma@eit.uni-kl.de 22212027Sjungma@eit.uni-kl.de // other methods 22312027Sjungma@eit.uni-kl.de 22412027Sjungma@eit.uni-kl.de void print( ::std::ostream& os = ::std::cout ) const 22512027Sjungma@eit.uni-kl.de { os << to_bool(); } 22612027Sjungma@eit.uni-kl.de 22712027Sjungma@eit.uni-kl.deprotected: 22812027Sjungma@eit.uni-kl.de 22912027Sjungma@eit.uni-kl.de int m_index; 23012027Sjungma@eit.uni-kl.de sc_uint_base* m_obj_p; 23112027Sjungma@eit.uni-kl.de 23212027Sjungma@eit.uni-kl.deprivate: 23312027Sjungma@eit.uni-kl.de 23412027Sjungma@eit.uni-kl.de // disabled 23512027Sjungma@eit.uni-kl.de sc_uint_bitref_r& operator = ( const sc_uint_bitref_r& ); 23612027Sjungma@eit.uni-kl.de}; 23712027Sjungma@eit.uni-kl.de 23812027Sjungma@eit.uni-kl.de 23912027Sjungma@eit.uni-kl.de 24012027Sjungma@eit.uni-kl.deinline 24112027Sjungma@eit.uni-kl.de::std::ostream& 24212027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream&, const sc_uint_bitref_r& ); 24312027Sjungma@eit.uni-kl.de 24412027Sjungma@eit.uni-kl.de 24512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 24612027Sjungma@eit.uni-kl.de// CLASS : sc_uint_bitref 24712027Sjungma@eit.uni-kl.de// 24812027Sjungma@eit.uni-kl.de// Proxy class for sc_uint bit selection (r-value and l-value). 24912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 25012027Sjungma@eit.uni-kl.de 25112027Sjungma@eit.uni-kl.declass sc_uint_bitref 25212027Sjungma@eit.uni-kl.de : public sc_uint_bitref_r 25312027Sjungma@eit.uni-kl.de{ 25412027Sjungma@eit.uni-kl.de friend class sc_uint_base; 25512027Sjungma@eit.uni-kl.de friend class sc_core::sc_vpool<sc_uint_bitref>; 25612027Sjungma@eit.uni-kl.de 25712027Sjungma@eit.uni-kl.de 25812027Sjungma@eit.uni-kl.de // constructors 25912027Sjungma@eit.uni-kl.de 26012027Sjungma@eit.uni-kl.deprotected: 26112027Sjungma@eit.uni-kl.de sc_uint_bitref() : sc_uint_bitref_r() 26212027Sjungma@eit.uni-kl.de {} 26312027Sjungma@eit.uni-kl.depublic: 26412027Sjungma@eit.uni-kl.de sc_uint_bitref( const sc_uint_bitref& init ) : sc_uint_bitref_r(init) 26512027Sjungma@eit.uni-kl.de {} 26612027Sjungma@eit.uni-kl.de 26712027Sjungma@eit.uni-kl.depublic: 26812027Sjungma@eit.uni-kl.de 26912027Sjungma@eit.uni-kl.de // assignment operators 27012027Sjungma@eit.uni-kl.de 27112027Sjungma@eit.uni-kl.de sc_uint_bitref& operator = ( const sc_uint_bitref_r& b ); 27212027Sjungma@eit.uni-kl.de sc_uint_bitref& operator = ( const sc_uint_bitref& b ); 27312027Sjungma@eit.uni-kl.de sc_uint_bitref& operator = ( bool b ); 27412027Sjungma@eit.uni-kl.de 27512027Sjungma@eit.uni-kl.de sc_uint_bitref& operator &= ( bool b ); 27612027Sjungma@eit.uni-kl.de sc_uint_bitref& operator |= ( bool b ); 27712027Sjungma@eit.uni-kl.de sc_uint_bitref& operator ^= ( bool b ); 27812027Sjungma@eit.uni-kl.de 27912027Sjungma@eit.uni-kl.de // concatenation methods 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.de virtual void concat_set(int64 src, int low_i); 28212027Sjungma@eit.uni-kl.de virtual void concat_set(const sc_signed& src, int low_i); 28312027Sjungma@eit.uni-kl.de virtual void concat_set(const sc_unsigned& src, int low_i); 28412027Sjungma@eit.uni-kl.de virtual void concat_set(uint64 src, int low_i); 28512027Sjungma@eit.uni-kl.de 28612027Sjungma@eit.uni-kl.de // other methods 28712027Sjungma@eit.uni-kl.de 28812027Sjungma@eit.uni-kl.de void scan( ::std::istream& is = ::std::cin ); 28912027Sjungma@eit.uni-kl.de 29012027Sjungma@eit.uni-kl.deprotected: 29112027Sjungma@eit.uni-kl.de static sc_core::sc_vpool<sc_uint_bitref> m_pool; 29212027Sjungma@eit.uni-kl.de 29312027Sjungma@eit.uni-kl.de}; 29412027Sjungma@eit.uni-kl.de 29512027Sjungma@eit.uni-kl.de 29612027Sjungma@eit.uni-kl.de 29712027Sjungma@eit.uni-kl.deinline 29812027Sjungma@eit.uni-kl.de::std::istream& 29912027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream&, sc_uint_bitref& ); 30012027Sjungma@eit.uni-kl.de 30112027Sjungma@eit.uni-kl.de 30212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 30312027Sjungma@eit.uni-kl.de// CLASS : sc_uint_subref_r 30412027Sjungma@eit.uni-kl.de// 30512027Sjungma@eit.uni-kl.de// Proxy class for sc_uint part selection (r-value only). 30612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 30712027Sjungma@eit.uni-kl.de 30812027Sjungma@eit.uni-kl.declass sc_uint_subref_r : public sc_value_base 30912027Sjungma@eit.uni-kl.de{ 31012027Sjungma@eit.uni-kl.de friend class sc_uint_base; 31112027Sjungma@eit.uni-kl.de friend class sc_uint_subref; 31212027Sjungma@eit.uni-kl.de 31312027Sjungma@eit.uni-kl.de 31412027Sjungma@eit.uni-kl.de // constructors 31512027Sjungma@eit.uni-kl.de 31612027Sjungma@eit.uni-kl.depublic: 31712027Sjungma@eit.uni-kl.de sc_uint_subref_r( const sc_uint_subref_r& init ) : 31812027Sjungma@eit.uni-kl.de sc_value_base(init), m_left(init.m_left), m_obj_p(init.m_obj_p), 31912027Sjungma@eit.uni-kl.de m_right(init.m_right) 32012027Sjungma@eit.uni-kl.de {} 32112027Sjungma@eit.uni-kl.de 32212027Sjungma@eit.uni-kl.deprotected: 32312027Sjungma@eit.uni-kl.de sc_uint_subref_r() : sc_value_base(), m_left(0), m_obj_p(0), m_right(0) 32412027Sjungma@eit.uni-kl.de {} 32512027Sjungma@eit.uni-kl.de 32612027Sjungma@eit.uni-kl.de // initializer for sc_core::sc_vpool: 32712027Sjungma@eit.uni-kl.de 32812027Sjungma@eit.uni-kl.de void initialize( const sc_uint_base* obj_p, int left_i, int right_i ) 32912027Sjungma@eit.uni-kl.de { 33012027Sjungma@eit.uni-kl.de m_obj_p = (sc_uint_base*)obj_p; 33112027Sjungma@eit.uni-kl.de m_left = left_i; 33212027Sjungma@eit.uni-kl.de m_right = right_i; 33312027Sjungma@eit.uni-kl.de } 33412027Sjungma@eit.uni-kl.de 33512027Sjungma@eit.uni-kl.depublic: 33612027Sjungma@eit.uni-kl.de 33712027Sjungma@eit.uni-kl.de // destructor 33812027Sjungma@eit.uni-kl.de 33912027Sjungma@eit.uni-kl.de virtual ~sc_uint_subref_r() 34012027Sjungma@eit.uni-kl.de {} 34112027Sjungma@eit.uni-kl.de 34212027Sjungma@eit.uni-kl.de // capacity 34312027Sjungma@eit.uni-kl.de 34412027Sjungma@eit.uni-kl.de int length() const 34512027Sjungma@eit.uni-kl.de { return ( m_left - m_right + 1 ); } 34612027Sjungma@eit.uni-kl.de 34712027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED 34812027Sjungma@eit.uni-kl.de int bitwidth() const 34912027Sjungma@eit.uni-kl.de { return length(); } 35012027Sjungma@eit.uni-kl.de#endif 35112027Sjungma@eit.uni-kl.de 35212027Sjungma@eit.uni-kl.de // concatenation support 35312027Sjungma@eit.uni-kl.de 35412027Sjungma@eit.uni-kl.de virtual int concat_length(bool* xz_present_p) const 35512027Sjungma@eit.uni-kl.de { if ( xz_present_p ) *xz_present_p = false; return length(); } 35612027Sjungma@eit.uni-kl.de virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const; 35712027Sjungma@eit.uni-kl.de virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const; 35812027Sjungma@eit.uni-kl.de virtual uint64 concat_get_uint64() const 35912027Sjungma@eit.uni-kl.de { return (uint64)operator uint_type(); } 36012027Sjungma@eit.uni-kl.de 36112027Sjungma@eit.uni-kl.de 36212027Sjungma@eit.uni-kl.de // reduce methods 36312027Sjungma@eit.uni-kl.de 36412027Sjungma@eit.uni-kl.de bool and_reduce() const; 36512027Sjungma@eit.uni-kl.de 36612027Sjungma@eit.uni-kl.de bool nand_reduce() const 36712027Sjungma@eit.uni-kl.de { return ( ! and_reduce() ); } 36812027Sjungma@eit.uni-kl.de 36912027Sjungma@eit.uni-kl.de bool or_reduce() const; 37012027Sjungma@eit.uni-kl.de 37112027Sjungma@eit.uni-kl.de bool nor_reduce() const 37212027Sjungma@eit.uni-kl.de { return ( ! or_reduce() ); } 37312027Sjungma@eit.uni-kl.de 37412027Sjungma@eit.uni-kl.de bool xor_reduce() const; 37512027Sjungma@eit.uni-kl.de 37612027Sjungma@eit.uni-kl.de bool xnor_reduce() const 37712027Sjungma@eit.uni-kl.de { return ( ! xor_reduce() ); } 37812027Sjungma@eit.uni-kl.de 37912027Sjungma@eit.uni-kl.de 38012027Sjungma@eit.uni-kl.de // implicit conversion to uint_type 38112027Sjungma@eit.uni-kl.de 38212027Sjungma@eit.uni-kl.de operator uint_type() const; 38312027Sjungma@eit.uni-kl.de 38412027Sjungma@eit.uni-kl.de 38512027Sjungma@eit.uni-kl.de // explicit conversions 38612027Sjungma@eit.uni-kl.de 38712027Sjungma@eit.uni-kl.de uint_type value() const 38812027Sjungma@eit.uni-kl.de { return operator uint_type(); } 38912027Sjungma@eit.uni-kl.de 39012027Sjungma@eit.uni-kl.de 39112027Sjungma@eit.uni-kl.de int to_int() const; 39212027Sjungma@eit.uni-kl.de unsigned int to_uint() const; 39312027Sjungma@eit.uni-kl.de long to_long() const; 39412027Sjungma@eit.uni-kl.de unsigned long to_ulong() const; 39512027Sjungma@eit.uni-kl.de int64 to_int64() const; 39612027Sjungma@eit.uni-kl.de uint64 to_uint64() const; 39712027Sjungma@eit.uni-kl.de double to_double() const; 39812027Sjungma@eit.uni-kl.de 39912027Sjungma@eit.uni-kl.de 40012027Sjungma@eit.uni-kl.de // explicit conversion to character string 40112027Sjungma@eit.uni-kl.de 40212027Sjungma@eit.uni-kl.de const std::string to_string( sc_numrep numrep = SC_DEC ) const; 40312027Sjungma@eit.uni-kl.de const std::string to_string( sc_numrep numrep, bool w_prefix ) const; 40412027Sjungma@eit.uni-kl.de 40512027Sjungma@eit.uni-kl.de 40612027Sjungma@eit.uni-kl.de // other methods 40712027Sjungma@eit.uni-kl.de 40812027Sjungma@eit.uni-kl.de void print( ::std::ostream& os = ::std::cout ) const 40912027Sjungma@eit.uni-kl.de { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); } 41012027Sjungma@eit.uni-kl.de 41112027Sjungma@eit.uni-kl.deprotected: 41212027Sjungma@eit.uni-kl.de 41312027Sjungma@eit.uni-kl.de int m_left; 41412027Sjungma@eit.uni-kl.de sc_uint_base* m_obj_p; 41512027Sjungma@eit.uni-kl.de int m_right; 41612027Sjungma@eit.uni-kl.de 41712027Sjungma@eit.uni-kl.deprivate: 41812027Sjungma@eit.uni-kl.de 41912027Sjungma@eit.uni-kl.de // disabled 42012027Sjungma@eit.uni-kl.de sc_uint_subref_r& operator = ( const sc_uint_subref_r& ); 42112027Sjungma@eit.uni-kl.de}; 42212027Sjungma@eit.uni-kl.de 42312027Sjungma@eit.uni-kl.de 42412027Sjungma@eit.uni-kl.de 42512027Sjungma@eit.uni-kl.deinline 42612027Sjungma@eit.uni-kl.de::std::ostream& 42712027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream&, const sc_uint_subref_r& ); 42812027Sjungma@eit.uni-kl.de 42912027Sjungma@eit.uni-kl.de 43012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 43112027Sjungma@eit.uni-kl.de// CLASS : sc_uint_subref 43212027Sjungma@eit.uni-kl.de// 43312027Sjungma@eit.uni-kl.de// Proxy class for sc_uint part selection (r-value and l-value). 43412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 43512027Sjungma@eit.uni-kl.de 43612027Sjungma@eit.uni-kl.declass sc_uint_subref 43712027Sjungma@eit.uni-kl.de : public sc_uint_subref_r 43812027Sjungma@eit.uni-kl.de{ 43912027Sjungma@eit.uni-kl.de friend class sc_uint_base; 44012027Sjungma@eit.uni-kl.de friend class sc_core::sc_vpool<sc_uint_subref>; 44112027Sjungma@eit.uni-kl.de 44212027Sjungma@eit.uni-kl.de 44312027Sjungma@eit.uni-kl.de // constructors 44412027Sjungma@eit.uni-kl.de 44512027Sjungma@eit.uni-kl.deprotected: 44612027Sjungma@eit.uni-kl.de sc_uint_subref() : sc_uint_subref_r() 44712027Sjungma@eit.uni-kl.de {} 44812027Sjungma@eit.uni-kl.de 44912027Sjungma@eit.uni-kl.depublic: 45012027Sjungma@eit.uni-kl.de sc_uint_subref( const sc_uint_subref& init ) : sc_uint_subref_r(init) 45112027Sjungma@eit.uni-kl.de {} 45212027Sjungma@eit.uni-kl.de 45312027Sjungma@eit.uni-kl.depublic: 45412027Sjungma@eit.uni-kl.de 45512027Sjungma@eit.uni-kl.de // assignment operators 45612027Sjungma@eit.uni-kl.de 45712027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( uint_type v ); 45812027Sjungma@eit.uni-kl.de 45912027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const sc_uint_base& a ); 46012027Sjungma@eit.uni-kl.de 46112027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const sc_uint_subref_r& a ) 46212027Sjungma@eit.uni-kl.de { return operator = ( a.operator uint_type() ); } 46312027Sjungma@eit.uni-kl.de 46412027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const sc_uint_subref& a ) 46512027Sjungma@eit.uni-kl.de { return operator = ( a.operator uint_type() ); } 46612027Sjungma@eit.uni-kl.de 46712027Sjungma@eit.uni-kl.de template<class T> 46812027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const sc_generic_base<T>& a ) 46912027Sjungma@eit.uni-kl.de { return operator = ( a->to_uint64() ); } 47012027Sjungma@eit.uni-kl.de 47112027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const char* a ); 47212027Sjungma@eit.uni-kl.de 47312027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( unsigned long a ) 47412027Sjungma@eit.uni-kl.de { return operator = ( (uint_type) a ); } 47512027Sjungma@eit.uni-kl.de 47612027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( long a ) 47712027Sjungma@eit.uni-kl.de { return operator = ( (uint_type) a ); } 47812027Sjungma@eit.uni-kl.de 47912027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( unsigned int a ) 48012027Sjungma@eit.uni-kl.de { return operator = ( (uint_type) a ); } 48112027Sjungma@eit.uni-kl.de 48212027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( int a ) 48312027Sjungma@eit.uni-kl.de { return operator = ( (uint_type) a ); } 48412027Sjungma@eit.uni-kl.de 48512027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( int64 a ) 48612027Sjungma@eit.uni-kl.de { return operator = ( (uint_type) a ); } 48712027Sjungma@eit.uni-kl.de 48812027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( double a ) 48912027Sjungma@eit.uni-kl.de { return operator = ( (uint_type) a ); } 49012027Sjungma@eit.uni-kl.de 49112027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const sc_signed& ); 49212027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const sc_unsigned& ); 49312027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const sc_bv_base& ); 49412027Sjungma@eit.uni-kl.de sc_uint_subref& operator = ( const sc_lv_base& ); 49512027Sjungma@eit.uni-kl.de 49612027Sjungma@eit.uni-kl.de // concatenation methods 49712027Sjungma@eit.uni-kl.de 49812027Sjungma@eit.uni-kl.de virtual void concat_set(int64 src, int low_i); 49912027Sjungma@eit.uni-kl.de virtual void concat_set(const sc_signed& src, int low_i); 50012027Sjungma@eit.uni-kl.de virtual void concat_set(const sc_unsigned& src, int low_i); 50112027Sjungma@eit.uni-kl.de virtual void concat_set(uint64 src, int low_i); 50212027Sjungma@eit.uni-kl.de 50312027Sjungma@eit.uni-kl.de // other methods 50412027Sjungma@eit.uni-kl.de 50512027Sjungma@eit.uni-kl.de void scan( ::std::istream& is = ::std::cin ); 50612027Sjungma@eit.uni-kl.de 50712027Sjungma@eit.uni-kl.deprotected: 50812027Sjungma@eit.uni-kl.de static sc_core::sc_vpool<sc_uint_subref> m_pool; 50912027Sjungma@eit.uni-kl.de 51012027Sjungma@eit.uni-kl.de}; 51112027Sjungma@eit.uni-kl.de 51212027Sjungma@eit.uni-kl.de 51312027Sjungma@eit.uni-kl.de 51412027Sjungma@eit.uni-kl.deinline 51512027Sjungma@eit.uni-kl.de::std::istream& 51612027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream&, sc_uint_subref& ); 51712027Sjungma@eit.uni-kl.de 51812027Sjungma@eit.uni-kl.de 51912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 52012027Sjungma@eit.uni-kl.de// CLASS : sc_uint_base 52112027Sjungma@eit.uni-kl.de// 52212027Sjungma@eit.uni-kl.de// Base class for sc_uint. 52312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 52412027Sjungma@eit.uni-kl.de 52512027Sjungma@eit.uni-kl.declass sc_uint_base : public sc_value_base 52612027Sjungma@eit.uni-kl.de{ 52712027Sjungma@eit.uni-kl.de friend class sc_uint_bitref_r; 52812027Sjungma@eit.uni-kl.de friend class sc_uint_bitref; 52912027Sjungma@eit.uni-kl.de friend class sc_uint_subref_r; 53012027Sjungma@eit.uni-kl.de friend class sc_uint_subref; 53112027Sjungma@eit.uni-kl.de 53212027Sjungma@eit.uni-kl.de 53312027Sjungma@eit.uni-kl.de // support methods 53412027Sjungma@eit.uni-kl.de 53512027Sjungma@eit.uni-kl.de void invalid_length() const; 53612027Sjungma@eit.uni-kl.de void invalid_index( int i ) const; 53712027Sjungma@eit.uni-kl.de void invalid_range( int l, int r ) const; 53812027Sjungma@eit.uni-kl.de 53912027Sjungma@eit.uni-kl.de void check_length() const 54012027Sjungma@eit.uni-kl.de { if( m_len <= 0 || m_len > SC_INTWIDTH ) { invalid_length(); } } 54112027Sjungma@eit.uni-kl.de 54212027Sjungma@eit.uni-kl.de void check_index( int i ) const 54312027Sjungma@eit.uni-kl.de { if( i < 0 || i >= m_len ) { invalid_index( i ); } } 54412027Sjungma@eit.uni-kl.de 54512027Sjungma@eit.uni-kl.de void check_range( int l, int r ) const 54612027Sjungma@eit.uni-kl.de { if( r < 0 || l >= m_len || l < r ) { invalid_range( l, r ); } } 54712027Sjungma@eit.uni-kl.de 54812027Sjungma@eit.uni-kl.de void check_value() const; 54912027Sjungma@eit.uni-kl.de 55012027Sjungma@eit.uni-kl.de void extend_sign() 55112027Sjungma@eit.uni-kl.de { 55212027Sjungma@eit.uni-kl.de#ifdef DEBUG_SYSTEMC 55312027Sjungma@eit.uni-kl.de check_value(); 55412027Sjungma@eit.uni-kl.de#endif 55512027Sjungma@eit.uni-kl.de m_val &= ( ~UINT_ZERO >> m_ulen ); 55612027Sjungma@eit.uni-kl.de } 55712027Sjungma@eit.uni-kl.de 55812027Sjungma@eit.uni-kl.depublic: 55912027Sjungma@eit.uni-kl.de 56012027Sjungma@eit.uni-kl.de // constructors 56112027Sjungma@eit.uni-kl.de 56212027Sjungma@eit.uni-kl.de explicit sc_uint_base( int w = sc_length_param().len() ) 56312027Sjungma@eit.uni-kl.de : m_val( 0 ), m_len( w ), m_ulen( SC_INTWIDTH - m_len ) 56412027Sjungma@eit.uni-kl.de { check_length(); } 56512027Sjungma@eit.uni-kl.de 56612027Sjungma@eit.uni-kl.de sc_uint_base( uint_type v, int w ) 56712027Sjungma@eit.uni-kl.de : m_val( v ), m_len( w ), m_ulen( SC_INTWIDTH - m_len ) 56812027Sjungma@eit.uni-kl.de { check_length(); extend_sign(); } 56912027Sjungma@eit.uni-kl.de 57012027Sjungma@eit.uni-kl.de sc_uint_base( const sc_uint_base& a ) 57112027Sjungma@eit.uni-kl.de : sc_value_base(a), m_val(a.m_val), m_len(a.m_len), m_ulen(a.m_ulen) 57212027Sjungma@eit.uni-kl.de {} 57312027Sjungma@eit.uni-kl.de 57412027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_uint_subref_r& a ) 57512027Sjungma@eit.uni-kl.de : m_val( a ), m_len( a.length() ), m_ulen( SC_INTWIDTH - m_len ) 57612027Sjungma@eit.uni-kl.de { extend_sign(); } 57712027Sjungma@eit.uni-kl.de 57812027Sjungma@eit.uni-kl.de template<class T> 57912027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_generic_base<T>& a ) 58012027Sjungma@eit.uni-kl.de : m_val( a->to_uint64() ), m_len( a->length() ), 58112027Sjungma@eit.uni-kl.de m_ulen( SC_INTWIDTH - m_len ) 58212027Sjungma@eit.uni-kl.de { check_length(); extend_sign(); } 58312027Sjungma@eit.uni-kl.de 58412027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_bv_base& v ); 58512027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_lv_base& v ); 58612027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_int_subref_r& v ); 58712027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_signed_subref_r& v ); 58812027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_unsigned_subref_r& v ); 58912027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_signed& a ); 59012027Sjungma@eit.uni-kl.de explicit sc_uint_base( const sc_unsigned& a ); 59112027Sjungma@eit.uni-kl.de 59212027Sjungma@eit.uni-kl.de 59312027Sjungma@eit.uni-kl.de // destructor 59412027Sjungma@eit.uni-kl.de 59512027Sjungma@eit.uni-kl.de virtual ~sc_uint_base() 59612027Sjungma@eit.uni-kl.de {} 59712027Sjungma@eit.uni-kl.de 59812027Sjungma@eit.uni-kl.de 59912027Sjungma@eit.uni-kl.de // assignment operators 60012027Sjungma@eit.uni-kl.de 60112027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( uint_type v ) 60212027Sjungma@eit.uni-kl.de { m_val = v; extend_sign(); return *this; } 60312027Sjungma@eit.uni-kl.de 60412027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_uint_base& a ) 60512027Sjungma@eit.uni-kl.de { m_val = a.m_val; extend_sign(); return *this; } 60612027Sjungma@eit.uni-kl.de 60712027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_uint_subref_r& a ) 60812027Sjungma@eit.uni-kl.de { m_val = a; extend_sign(); return *this; } 60912027Sjungma@eit.uni-kl.de 61012027Sjungma@eit.uni-kl.de template<class T> 61112027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_generic_base<T>& a ) 61212027Sjungma@eit.uni-kl.de { m_val = a->to_uint64(); extend_sign(); return *this; } 61312027Sjungma@eit.uni-kl.de 61412027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_signed& a ); 61512027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_unsigned& a ); 61612027Sjungma@eit.uni-kl.de 61712027Sjungma@eit.uni-kl.de#ifdef SC_INCLUDE_FX 61812027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_fxval& a ); 61912027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_fxval_fast& a ); 62012027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_fxnum& a ); 62112027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_fxnum_fast& a ); 62212027Sjungma@eit.uni-kl.de#endif 62312027Sjungma@eit.uni-kl.de 62412027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_bv_base& a ); 62512027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const sc_lv_base& a ); 62612027Sjungma@eit.uni-kl.de 62712027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( const char* a ); 62812027Sjungma@eit.uni-kl.de 62912027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( unsigned long a ) 63012027Sjungma@eit.uni-kl.de { m_val = a; extend_sign(); return *this; } 63112027Sjungma@eit.uni-kl.de 63212027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( long a ) 63312027Sjungma@eit.uni-kl.de { m_val = a; extend_sign(); return *this; } 63412027Sjungma@eit.uni-kl.de 63512027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( unsigned int a ) 63612027Sjungma@eit.uni-kl.de { m_val = a; extend_sign(); return *this; } 63712027Sjungma@eit.uni-kl.de 63812027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( int a ) 63912027Sjungma@eit.uni-kl.de { m_val = a; extend_sign(); return *this; } 64012027Sjungma@eit.uni-kl.de 64112027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( int64 a ) 64212027Sjungma@eit.uni-kl.de { m_val = a; extend_sign(); return *this; } 64312027Sjungma@eit.uni-kl.de 64412027Sjungma@eit.uni-kl.de sc_uint_base& operator = ( double a ) 64512027Sjungma@eit.uni-kl.de { m_val = (uint_type) a; extend_sign(); return *this; } 64612027Sjungma@eit.uni-kl.de 64712027Sjungma@eit.uni-kl.de 64812027Sjungma@eit.uni-kl.de // arithmetic assignment operators 64912027Sjungma@eit.uni-kl.de 65012027Sjungma@eit.uni-kl.de sc_uint_base& operator += ( uint_type v ) 65112027Sjungma@eit.uni-kl.de { m_val += v; extend_sign(); return *this; } 65212027Sjungma@eit.uni-kl.de 65312027Sjungma@eit.uni-kl.de sc_uint_base& operator -= ( uint_type v ) 65412027Sjungma@eit.uni-kl.de { m_val -= v; extend_sign(); return *this; } 65512027Sjungma@eit.uni-kl.de 65612027Sjungma@eit.uni-kl.de sc_uint_base& operator *= ( uint_type v ) 65712027Sjungma@eit.uni-kl.de { m_val *= v; extend_sign(); return *this; } 65812027Sjungma@eit.uni-kl.de 65912027Sjungma@eit.uni-kl.de sc_uint_base& operator /= ( uint_type v ) 66012027Sjungma@eit.uni-kl.de { m_val /= v; extend_sign(); return *this; } 66112027Sjungma@eit.uni-kl.de 66212027Sjungma@eit.uni-kl.de sc_uint_base& operator %= ( uint_type v ) 66312027Sjungma@eit.uni-kl.de { m_val %= v; extend_sign(); return *this; } 66412027Sjungma@eit.uni-kl.de 66512027Sjungma@eit.uni-kl.de 66612027Sjungma@eit.uni-kl.de // bitwise assignment operators 66712027Sjungma@eit.uni-kl.de 66812027Sjungma@eit.uni-kl.de sc_uint_base& operator &= ( uint_type v ) 66912027Sjungma@eit.uni-kl.de { m_val &= v; extend_sign(); return *this; } 67012027Sjungma@eit.uni-kl.de 67112027Sjungma@eit.uni-kl.de sc_uint_base& operator |= ( uint_type v ) 67212027Sjungma@eit.uni-kl.de { m_val |= v; extend_sign(); return *this; } 67312027Sjungma@eit.uni-kl.de 67412027Sjungma@eit.uni-kl.de sc_uint_base& operator ^= ( uint_type v ) 67512027Sjungma@eit.uni-kl.de { m_val ^= v; extend_sign(); return *this; } 67612027Sjungma@eit.uni-kl.de 67712027Sjungma@eit.uni-kl.de 67812027Sjungma@eit.uni-kl.de sc_uint_base& operator <<= ( uint_type v ) 67912027Sjungma@eit.uni-kl.de { m_val <<= v; extend_sign(); return *this; } 68012027Sjungma@eit.uni-kl.de 68112027Sjungma@eit.uni-kl.de sc_uint_base& operator >>= ( uint_type v ) 68212027Sjungma@eit.uni-kl.de { m_val >>= v; /* no sign extension needed */ return *this; } 68312027Sjungma@eit.uni-kl.de 68412027Sjungma@eit.uni-kl.de 68512027Sjungma@eit.uni-kl.de // prefix and postfix increment and decrement operators 68612027Sjungma@eit.uni-kl.de 68712027Sjungma@eit.uni-kl.de sc_uint_base& operator ++ () // prefix 68812027Sjungma@eit.uni-kl.de { ++ m_val; extend_sign(); return *this; } 68912027Sjungma@eit.uni-kl.de 69012027Sjungma@eit.uni-kl.de const sc_uint_base operator ++ ( int ) // postfix 69112027Sjungma@eit.uni-kl.de { sc_uint_base tmp( *this ); ++ m_val; extend_sign(); return tmp; } 69212027Sjungma@eit.uni-kl.de 69312027Sjungma@eit.uni-kl.de sc_uint_base& operator -- () // prefix 69412027Sjungma@eit.uni-kl.de { -- m_val; extend_sign(); return *this; } 69512027Sjungma@eit.uni-kl.de 69612027Sjungma@eit.uni-kl.de const sc_uint_base operator -- ( int ) // postfix 69712027Sjungma@eit.uni-kl.de { sc_uint_base tmp( *this ); -- m_val; extend_sign(); return tmp; } 69812027Sjungma@eit.uni-kl.de 69912027Sjungma@eit.uni-kl.de 70012027Sjungma@eit.uni-kl.de // relational operators 70112027Sjungma@eit.uni-kl.de 70212027Sjungma@eit.uni-kl.de friend bool operator == ( const sc_uint_base& a, const sc_uint_base& b ) 70312027Sjungma@eit.uni-kl.de { return a.m_val == b.m_val; } 70412027Sjungma@eit.uni-kl.de 70512027Sjungma@eit.uni-kl.de friend bool operator != ( const sc_uint_base& a, const sc_uint_base& b ) 70612027Sjungma@eit.uni-kl.de { return a.m_val != b.m_val; } 70712027Sjungma@eit.uni-kl.de 70812027Sjungma@eit.uni-kl.de friend bool operator < ( const sc_uint_base& a, const sc_uint_base& b ) 70912027Sjungma@eit.uni-kl.de { return a.m_val < b.m_val; } 71012027Sjungma@eit.uni-kl.de 71112027Sjungma@eit.uni-kl.de friend bool operator <= ( const sc_uint_base& a, const sc_uint_base& b ) 71212027Sjungma@eit.uni-kl.de { return a.m_val <= b.m_val; } 71312027Sjungma@eit.uni-kl.de 71412027Sjungma@eit.uni-kl.de friend bool operator > ( const sc_uint_base& a, const sc_uint_base& b ) 71512027Sjungma@eit.uni-kl.de { return a.m_val > b.m_val; } 71612027Sjungma@eit.uni-kl.de 71712027Sjungma@eit.uni-kl.de friend bool operator >= ( const sc_uint_base& a, const sc_uint_base& b ) 71812027Sjungma@eit.uni-kl.de { return a.m_val >= b.m_val; } 71912027Sjungma@eit.uni-kl.de 72012027Sjungma@eit.uni-kl.de 72112027Sjungma@eit.uni-kl.de // bit selection 72212027Sjungma@eit.uni-kl.de 72312027Sjungma@eit.uni-kl.de sc_uint_bitref& operator [] ( int i ); 72412027Sjungma@eit.uni-kl.de const sc_uint_bitref_r& operator [] ( int i ) const; 72512027Sjungma@eit.uni-kl.de 72612027Sjungma@eit.uni-kl.de sc_uint_bitref& bit( int i ); 72712027Sjungma@eit.uni-kl.de const sc_uint_bitref_r& bit( int i ) const; 72812027Sjungma@eit.uni-kl.de 72912027Sjungma@eit.uni-kl.de 73012027Sjungma@eit.uni-kl.de // part selection 73112027Sjungma@eit.uni-kl.de 73212027Sjungma@eit.uni-kl.de sc_uint_subref& operator () ( int left, int right ); 73312027Sjungma@eit.uni-kl.de const sc_uint_subref_r& operator () ( int left, int right ) const; 73412027Sjungma@eit.uni-kl.de 73512027Sjungma@eit.uni-kl.de sc_uint_subref& range( int left, int right ); 73612027Sjungma@eit.uni-kl.de const sc_uint_subref_r& range( int left, int right ) const; 73712027Sjungma@eit.uni-kl.de 73812027Sjungma@eit.uni-kl.de 73912027Sjungma@eit.uni-kl.de // bit access, without bounds checking or sign extension 74012027Sjungma@eit.uni-kl.de 74112027Sjungma@eit.uni-kl.de bool test( int i ) const 74212027Sjungma@eit.uni-kl.de { return ( 0 != (m_val & (UINT_ONE << i)) ); } 74312027Sjungma@eit.uni-kl.de 74412027Sjungma@eit.uni-kl.de void set( int i ) 74512027Sjungma@eit.uni-kl.de { m_val |= (UINT_ONE << i); } 74612027Sjungma@eit.uni-kl.de 74712027Sjungma@eit.uni-kl.de void set( int i, bool v ) 74812027Sjungma@eit.uni-kl.de { v ? m_val |= (UINT_ONE << i) : m_val &= ~(UINT_ONE << i); } 74912027Sjungma@eit.uni-kl.de 75012027Sjungma@eit.uni-kl.de 75112027Sjungma@eit.uni-kl.de // capacity 75212027Sjungma@eit.uni-kl.de 75312027Sjungma@eit.uni-kl.de int length() const 75412027Sjungma@eit.uni-kl.de { return m_len; } 75512027Sjungma@eit.uni-kl.de 75612027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED 75712027Sjungma@eit.uni-kl.de int bitwidth() const 75812027Sjungma@eit.uni-kl.de { return length(); } 75912027Sjungma@eit.uni-kl.de#endif 76012027Sjungma@eit.uni-kl.de 76112027Sjungma@eit.uni-kl.de // concatenation support 76212027Sjungma@eit.uni-kl.de 76312027Sjungma@eit.uni-kl.de virtual int concat_length(bool* xz_present_p) const 76412027Sjungma@eit.uni-kl.de { if ( xz_present_p ) *xz_present_p = false; return length(); } 76512027Sjungma@eit.uni-kl.de virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const; 76612027Sjungma@eit.uni-kl.de virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const; 76712027Sjungma@eit.uni-kl.de virtual uint64 concat_get_uint64() const 76812027Sjungma@eit.uni-kl.de { return m_val; } 76912027Sjungma@eit.uni-kl.de virtual void concat_set(int64 src, int low_i); 77012027Sjungma@eit.uni-kl.de virtual void concat_set(const sc_signed& src, int low_i); 77112027Sjungma@eit.uni-kl.de virtual void concat_set(const sc_unsigned& src, int low_i); 77212027Sjungma@eit.uni-kl.de virtual void concat_set(uint64 src, int low_i); 77312027Sjungma@eit.uni-kl.de 77412027Sjungma@eit.uni-kl.de 77512027Sjungma@eit.uni-kl.de // reduce methods 77612027Sjungma@eit.uni-kl.de 77712027Sjungma@eit.uni-kl.de bool and_reduce() const; 77812027Sjungma@eit.uni-kl.de 77912027Sjungma@eit.uni-kl.de bool nand_reduce() const 78012027Sjungma@eit.uni-kl.de { return ( ! and_reduce() ); } 78112027Sjungma@eit.uni-kl.de 78212027Sjungma@eit.uni-kl.de bool or_reduce() const; 78312027Sjungma@eit.uni-kl.de 78412027Sjungma@eit.uni-kl.de bool nor_reduce() const 78512027Sjungma@eit.uni-kl.de { return ( ! or_reduce() ); } 78612027Sjungma@eit.uni-kl.de 78712027Sjungma@eit.uni-kl.de bool xor_reduce() const; 78812027Sjungma@eit.uni-kl.de 78912027Sjungma@eit.uni-kl.de bool xnor_reduce() const 79012027Sjungma@eit.uni-kl.de { return ( ! xor_reduce() ); } 79112027Sjungma@eit.uni-kl.de 79212027Sjungma@eit.uni-kl.de 79312027Sjungma@eit.uni-kl.de // implicit conversion to uint_type 79412027Sjungma@eit.uni-kl.de 79512027Sjungma@eit.uni-kl.de operator uint_type() const 79612027Sjungma@eit.uni-kl.de { return m_val; } 79712027Sjungma@eit.uni-kl.de 79812027Sjungma@eit.uni-kl.de 79912027Sjungma@eit.uni-kl.de // explicit conversions 80012027Sjungma@eit.uni-kl.de 80112027Sjungma@eit.uni-kl.de uint_type value() const 80212027Sjungma@eit.uni-kl.de { return operator uint_type(); } 80312027Sjungma@eit.uni-kl.de 80412027Sjungma@eit.uni-kl.de 80512027Sjungma@eit.uni-kl.de int to_int() const 80612027Sjungma@eit.uni-kl.de { return (int) m_val; } 80712027Sjungma@eit.uni-kl.de 80812027Sjungma@eit.uni-kl.de unsigned int to_uint() const 80912027Sjungma@eit.uni-kl.de { return (unsigned int) m_val; } 81012027Sjungma@eit.uni-kl.de 81112027Sjungma@eit.uni-kl.de long to_long() const 81212027Sjungma@eit.uni-kl.de { return (long) m_val; } 81312027Sjungma@eit.uni-kl.de 81412027Sjungma@eit.uni-kl.de unsigned long to_ulong() const 81512027Sjungma@eit.uni-kl.de { return (unsigned long) m_val; } 81612027Sjungma@eit.uni-kl.de 81712027Sjungma@eit.uni-kl.de int64 to_int64() const 81812027Sjungma@eit.uni-kl.de { return (int64) m_val; } 81912027Sjungma@eit.uni-kl.de 82012027Sjungma@eit.uni-kl.de uint64 to_uint64() const 82112027Sjungma@eit.uni-kl.de { return (uint64) m_val; } 82212027Sjungma@eit.uni-kl.de 82312027Sjungma@eit.uni-kl.de double to_double() const 82412027Sjungma@eit.uni-kl.de { return uint64_to_double( m_val ); } 82512027Sjungma@eit.uni-kl.de 82612027Sjungma@eit.uni-kl.de 82712027Sjungma@eit.uni-kl.de#ifndef _32BIT_ 82812027Sjungma@eit.uni-kl.de long long_low() const 82912027Sjungma@eit.uni-kl.de { return (long) (m_val & UINT64_32ONES); } 83012027Sjungma@eit.uni-kl.de 83112027Sjungma@eit.uni-kl.de long long_high() const 83212027Sjungma@eit.uni-kl.de { return (long) ((m_val >> 32) & UINT64_32ONES); } 83312027Sjungma@eit.uni-kl.de#endif 83412027Sjungma@eit.uni-kl.de 83512027Sjungma@eit.uni-kl.de // explicit conversion to character string 83612027Sjungma@eit.uni-kl.de 83712027Sjungma@eit.uni-kl.de const std::string to_string( sc_numrep numrep = SC_DEC ) const; 83812027Sjungma@eit.uni-kl.de const std::string to_string( sc_numrep numrep, bool w_prefix ) const; 83912027Sjungma@eit.uni-kl.de 84012027Sjungma@eit.uni-kl.de 84112027Sjungma@eit.uni-kl.de // other methods 84212027Sjungma@eit.uni-kl.de 84312027Sjungma@eit.uni-kl.de void print( ::std::ostream& os = ::std::cout ) const 84412027Sjungma@eit.uni-kl.de { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); } 84512027Sjungma@eit.uni-kl.de 84612027Sjungma@eit.uni-kl.de void scan( ::std::istream& is = ::std::cin ); 84712027Sjungma@eit.uni-kl.de 84812027Sjungma@eit.uni-kl.deprotected: 84912027Sjungma@eit.uni-kl.de 85012027Sjungma@eit.uni-kl.de uint_type m_val; // value 85112027Sjungma@eit.uni-kl.de int m_len; // length 85212027Sjungma@eit.uni-kl.de int m_ulen; // unused length 85312027Sjungma@eit.uni-kl.de}; 85412027Sjungma@eit.uni-kl.de 85512027Sjungma@eit.uni-kl.de 85612027Sjungma@eit.uni-kl.de 85712027Sjungma@eit.uni-kl.deinline 85812027Sjungma@eit.uni-kl.de::std::ostream& 85912027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream&, const sc_uint_base& ); 86012027Sjungma@eit.uni-kl.de 86112027Sjungma@eit.uni-kl.deinline 86212027Sjungma@eit.uni-kl.de::std::istream& 86312027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream&, sc_uint_base& ); 86412027Sjungma@eit.uni-kl.de 86512027Sjungma@eit.uni-kl.de 86612027Sjungma@eit.uni-kl.de 86712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 86812027Sjungma@eit.uni-kl.de// CLASS : sc_uint_bitref_r 86912027Sjungma@eit.uni-kl.de// 87012027Sjungma@eit.uni-kl.de// Proxy class for sc_uint bit selection (r-value only). 87112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 87212027Sjungma@eit.uni-kl.de 87312027Sjungma@eit.uni-kl.de// implicit conversion to bool 87412027Sjungma@eit.uni-kl.de 87512027Sjungma@eit.uni-kl.deinline 87612027Sjungma@eit.uni-kl.desc_uint_bitref_r::operator uint64 () const 87712027Sjungma@eit.uni-kl.de{ 87812027Sjungma@eit.uni-kl.de return m_obj_p->test( m_index ); 87912027Sjungma@eit.uni-kl.de} 88012027Sjungma@eit.uni-kl.de 88112027Sjungma@eit.uni-kl.deinline 88212027Sjungma@eit.uni-kl.debool 88312027Sjungma@eit.uni-kl.desc_uint_bitref_r::operator ! () const 88412027Sjungma@eit.uni-kl.de{ 88512027Sjungma@eit.uni-kl.de return ! m_obj_p->test( m_index ); 88612027Sjungma@eit.uni-kl.de} 88712027Sjungma@eit.uni-kl.de 88812027Sjungma@eit.uni-kl.deinline 88912027Sjungma@eit.uni-kl.debool 89012027Sjungma@eit.uni-kl.desc_uint_bitref_r::operator ~ () const 89112027Sjungma@eit.uni-kl.de{ 89212027Sjungma@eit.uni-kl.de return ! m_obj_p->test( m_index ); 89312027Sjungma@eit.uni-kl.de} 89412027Sjungma@eit.uni-kl.de 89512027Sjungma@eit.uni-kl.de 89612027Sjungma@eit.uni-kl.de 89712027Sjungma@eit.uni-kl.deinline 89812027Sjungma@eit.uni-kl.de::std::ostream& 89912027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_uint_bitref_r& a ) 90012027Sjungma@eit.uni-kl.de{ 90112027Sjungma@eit.uni-kl.de a.print( os ); 90212027Sjungma@eit.uni-kl.de return os; 90312027Sjungma@eit.uni-kl.de} 90412027Sjungma@eit.uni-kl.de 90512027Sjungma@eit.uni-kl.de 90612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 90712027Sjungma@eit.uni-kl.de// CLASS : sc_uint_bitref 90812027Sjungma@eit.uni-kl.de// 90912027Sjungma@eit.uni-kl.de// Proxy class for sc_uint bit selection (r-value and l-value). 91012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 91112027Sjungma@eit.uni-kl.de 91212027Sjungma@eit.uni-kl.de// assignment operators 91312027Sjungma@eit.uni-kl.de 91412027Sjungma@eit.uni-kl.deinline 91512027Sjungma@eit.uni-kl.desc_uint_bitref& 91612027Sjungma@eit.uni-kl.desc_uint_bitref::operator = ( const sc_uint_bitref_r& b ) 91712027Sjungma@eit.uni-kl.de{ 91812027Sjungma@eit.uni-kl.de m_obj_p->set( m_index, b.to_bool() ); 91912027Sjungma@eit.uni-kl.de return *this; 92012027Sjungma@eit.uni-kl.de} 92112027Sjungma@eit.uni-kl.de 92212027Sjungma@eit.uni-kl.deinline 92312027Sjungma@eit.uni-kl.desc_uint_bitref& 92412027Sjungma@eit.uni-kl.desc_uint_bitref::operator = ( const sc_uint_bitref& b ) 92512027Sjungma@eit.uni-kl.de{ 92612027Sjungma@eit.uni-kl.de m_obj_p->set( m_index, b.to_bool() ); 92712027Sjungma@eit.uni-kl.de return *this; 92812027Sjungma@eit.uni-kl.de} 92912027Sjungma@eit.uni-kl.de 93012027Sjungma@eit.uni-kl.deinline 93112027Sjungma@eit.uni-kl.desc_uint_bitref& 93212027Sjungma@eit.uni-kl.desc_uint_bitref::operator = ( bool b ) 93312027Sjungma@eit.uni-kl.de{ 93412027Sjungma@eit.uni-kl.de m_obj_p->set( m_index, b ); 93512027Sjungma@eit.uni-kl.de return *this; 93612027Sjungma@eit.uni-kl.de} 93712027Sjungma@eit.uni-kl.de 93812027Sjungma@eit.uni-kl.de 93912027Sjungma@eit.uni-kl.deinline 94012027Sjungma@eit.uni-kl.desc_uint_bitref& 94112027Sjungma@eit.uni-kl.desc_uint_bitref::operator &= ( bool b ) 94212027Sjungma@eit.uni-kl.de{ 94312027Sjungma@eit.uni-kl.de if( ! b ) { 94412027Sjungma@eit.uni-kl.de m_obj_p->set( m_index, b ); 94512027Sjungma@eit.uni-kl.de } 94612027Sjungma@eit.uni-kl.de return *this; 94712027Sjungma@eit.uni-kl.de} 94812027Sjungma@eit.uni-kl.de 94912027Sjungma@eit.uni-kl.deinline 95012027Sjungma@eit.uni-kl.desc_uint_bitref& 95112027Sjungma@eit.uni-kl.desc_uint_bitref::operator |= ( bool b ) 95212027Sjungma@eit.uni-kl.de{ 95312027Sjungma@eit.uni-kl.de if( b ) { 95412027Sjungma@eit.uni-kl.de m_obj_p->set( m_index, b ); 95512027Sjungma@eit.uni-kl.de } 95612027Sjungma@eit.uni-kl.de return *this; 95712027Sjungma@eit.uni-kl.de} 95812027Sjungma@eit.uni-kl.de 95912027Sjungma@eit.uni-kl.deinline 96012027Sjungma@eit.uni-kl.desc_uint_bitref& 96112027Sjungma@eit.uni-kl.desc_uint_bitref::operator ^= ( bool b ) 96212027Sjungma@eit.uni-kl.de{ 96312027Sjungma@eit.uni-kl.de if( b ) { 96412027Sjungma@eit.uni-kl.de m_obj_p->m_val ^= (UINT_ONE << m_index); 96512027Sjungma@eit.uni-kl.de } 96612027Sjungma@eit.uni-kl.de return *this; 96712027Sjungma@eit.uni-kl.de} 96812027Sjungma@eit.uni-kl.de 96912027Sjungma@eit.uni-kl.de 97012027Sjungma@eit.uni-kl.de 97112027Sjungma@eit.uni-kl.deinline 97212027Sjungma@eit.uni-kl.de::std::istream& 97312027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_uint_bitref& a ) 97412027Sjungma@eit.uni-kl.de{ 97512027Sjungma@eit.uni-kl.de a.scan( is ); 97612027Sjungma@eit.uni-kl.de return is; 97712027Sjungma@eit.uni-kl.de} 97812027Sjungma@eit.uni-kl.de 97912027Sjungma@eit.uni-kl.de 98012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 98112027Sjungma@eit.uni-kl.de// CLASS : sc_uint_subref_r 98212027Sjungma@eit.uni-kl.de// 98312027Sjungma@eit.uni-kl.de// Proxy class for sc_uint part selection (r-value only). 98412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 98512027Sjungma@eit.uni-kl.de 98612027Sjungma@eit.uni-kl.de// implicit conversion to uint_type 98712027Sjungma@eit.uni-kl.de 98812027Sjungma@eit.uni-kl.deinline 98912027Sjungma@eit.uni-kl.desc_uint_subref_r::operator uint_type() const 99012027Sjungma@eit.uni-kl.de{ 99112027Sjungma@eit.uni-kl.de uint_type val = m_obj_p->m_val; 99212027Sjungma@eit.uni-kl.de int uleft = SC_INTWIDTH - (m_left + 1); 99312027Sjungma@eit.uni-kl.de return ( (val & (~UINT_ZERO >> uleft)) >> m_right ); 99412027Sjungma@eit.uni-kl.de} 99512027Sjungma@eit.uni-kl.de 99612027Sjungma@eit.uni-kl.de 99712027Sjungma@eit.uni-kl.de// reduce methods 99812027Sjungma@eit.uni-kl.de 99912027Sjungma@eit.uni-kl.deinline 100012027Sjungma@eit.uni-kl.debool 100112027Sjungma@eit.uni-kl.desc_uint_subref_r::and_reduce() const 100212027Sjungma@eit.uni-kl.de{ 100312027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 100412027Sjungma@eit.uni-kl.de return a.and_reduce(); 100512027Sjungma@eit.uni-kl.de} 100612027Sjungma@eit.uni-kl.de 100712027Sjungma@eit.uni-kl.deinline 100812027Sjungma@eit.uni-kl.debool 100912027Sjungma@eit.uni-kl.desc_uint_subref_r::or_reduce() const 101012027Sjungma@eit.uni-kl.de{ 101112027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 101212027Sjungma@eit.uni-kl.de return a.or_reduce(); 101312027Sjungma@eit.uni-kl.de} 101412027Sjungma@eit.uni-kl.de 101512027Sjungma@eit.uni-kl.deinline 101612027Sjungma@eit.uni-kl.debool 101712027Sjungma@eit.uni-kl.desc_uint_subref_r::xor_reduce() const 101812027Sjungma@eit.uni-kl.de{ 101912027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 102012027Sjungma@eit.uni-kl.de return a.xor_reduce(); 102112027Sjungma@eit.uni-kl.de} 102212027Sjungma@eit.uni-kl.de 102312027Sjungma@eit.uni-kl.de 102412027Sjungma@eit.uni-kl.de// explicit conversions 102512027Sjungma@eit.uni-kl.de 102612027Sjungma@eit.uni-kl.deinline 102712027Sjungma@eit.uni-kl.deint 102812027Sjungma@eit.uni-kl.desc_uint_subref_r::to_int() const 102912027Sjungma@eit.uni-kl.de{ 103012027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 103112027Sjungma@eit.uni-kl.de return a.to_int(); 103212027Sjungma@eit.uni-kl.de} 103312027Sjungma@eit.uni-kl.de 103412027Sjungma@eit.uni-kl.deinline 103512027Sjungma@eit.uni-kl.deunsigned int 103612027Sjungma@eit.uni-kl.desc_uint_subref_r::to_uint() const 103712027Sjungma@eit.uni-kl.de{ 103812027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 103912027Sjungma@eit.uni-kl.de return a.to_uint(); 104012027Sjungma@eit.uni-kl.de} 104112027Sjungma@eit.uni-kl.de 104212027Sjungma@eit.uni-kl.deinline 104312027Sjungma@eit.uni-kl.delong 104412027Sjungma@eit.uni-kl.desc_uint_subref_r::to_long() const 104512027Sjungma@eit.uni-kl.de{ 104612027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 104712027Sjungma@eit.uni-kl.de return a.to_long(); 104812027Sjungma@eit.uni-kl.de} 104912027Sjungma@eit.uni-kl.de 105012027Sjungma@eit.uni-kl.deinline 105112027Sjungma@eit.uni-kl.deunsigned long 105212027Sjungma@eit.uni-kl.desc_uint_subref_r::to_ulong() const 105312027Sjungma@eit.uni-kl.de{ 105412027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 105512027Sjungma@eit.uni-kl.de return a.to_ulong(); 105612027Sjungma@eit.uni-kl.de} 105712027Sjungma@eit.uni-kl.de 105812027Sjungma@eit.uni-kl.deinline 105912027Sjungma@eit.uni-kl.deint64 106012027Sjungma@eit.uni-kl.desc_uint_subref_r::to_int64() const 106112027Sjungma@eit.uni-kl.de{ 106212027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 106312027Sjungma@eit.uni-kl.de return a.to_int64(); 106412027Sjungma@eit.uni-kl.de} 106512027Sjungma@eit.uni-kl.de 106612027Sjungma@eit.uni-kl.deinline 106712027Sjungma@eit.uni-kl.deuint64 106812027Sjungma@eit.uni-kl.desc_uint_subref_r::to_uint64() const 106912027Sjungma@eit.uni-kl.de{ 107012027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 107112027Sjungma@eit.uni-kl.de return a.to_uint64(); 107212027Sjungma@eit.uni-kl.de} 107312027Sjungma@eit.uni-kl.de 107412027Sjungma@eit.uni-kl.deinline 107512027Sjungma@eit.uni-kl.dedouble 107612027Sjungma@eit.uni-kl.desc_uint_subref_r::to_double() const 107712027Sjungma@eit.uni-kl.de{ 107812027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 107912027Sjungma@eit.uni-kl.de return a.to_double(); 108012027Sjungma@eit.uni-kl.de} 108112027Sjungma@eit.uni-kl.de 108212027Sjungma@eit.uni-kl.de 108312027Sjungma@eit.uni-kl.de// explicit conversion to character string 108412027Sjungma@eit.uni-kl.de 108512027Sjungma@eit.uni-kl.deinline 108612027Sjungma@eit.uni-kl.deconst std::string 108712027Sjungma@eit.uni-kl.desc_uint_subref_r::to_string( sc_numrep numrep ) const 108812027Sjungma@eit.uni-kl.de{ 108912027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 109012027Sjungma@eit.uni-kl.de return a.to_string( numrep ); 109112027Sjungma@eit.uni-kl.de} 109212027Sjungma@eit.uni-kl.de 109312027Sjungma@eit.uni-kl.deinline 109412027Sjungma@eit.uni-kl.deconst std::string 109512027Sjungma@eit.uni-kl.desc_uint_subref_r::to_string( sc_numrep numrep, bool w_prefix ) const 109612027Sjungma@eit.uni-kl.de{ 109712027Sjungma@eit.uni-kl.de sc_uint_base a( *this ); 109812027Sjungma@eit.uni-kl.de return a.to_string( numrep, w_prefix ); 109912027Sjungma@eit.uni-kl.de} 110012027Sjungma@eit.uni-kl.de 110112027Sjungma@eit.uni-kl.de 110212027Sjungma@eit.uni-kl.de// functional notation for the reduce methods 110312027Sjungma@eit.uni-kl.de 110412027Sjungma@eit.uni-kl.deinline 110512027Sjungma@eit.uni-kl.debool 110612027Sjungma@eit.uni-kl.deand_reduce( const sc_uint_subref_r& a ) 110712027Sjungma@eit.uni-kl.de{ 110812027Sjungma@eit.uni-kl.de return a.and_reduce(); 110912027Sjungma@eit.uni-kl.de} 111012027Sjungma@eit.uni-kl.de 111112027Sjungma@eit.uni-kl.deinline 111212027Sjungma@eit.uni-kl.debool 111312027Sjungma@eit.uni-kl.denand_reduce( const sc_uint_subref_r& a ) 111412027Sjungma@eit.uni-kl.de{ 111512027Sjungma@eit.uni-kl.de return a.nand_reduce(); 111612027Sjungma@eit.uni-kl.de} 111712027Sjungma@eit.uni-kl.de 111812027Sjungma@eit.uni-kl.deinline 111912027Sjungma@eit.uni-kl.debool 112012027Sjungma@eit.uni-kl.deor_reduce( const sc_uint_subref_r& a ) 112112027Sjungma@eit.uni-kl.de{ 112212027Sjungma@eit.uni-kl.de return a.or_reduce(); 112312027Sjungma@eit.uni-kl.de} 112412027Sjungma@eit.uni-kl.de 112512027Sjungma@eit.uni-kl.deinline 112612027Sjungma@eit.uni-kl.debool 112712027Sjungma@eit.uni-kl.denor_reduce( const sc_uint_subref_r& a ) 112812027Sjungma@eit.uni-kl.de{ 112912027Sjungma@eit.uni-kl.de return a.nor_reduce(); 113012027Sjungma@eit.uni-kl.de} 113112027Sjungma@eit.uni-kl.de 113212027Sjungma@eit.uni-kl.deinline 113312027Sjungma@eit.uni-kl.debool 113412027Sjungma@eit.uni-kl.dexor_reduce( const sc_uint_subref_r& a ) 113512027Sjungma@eit.uni-kl.de{ 113612027Sjungma@eit.uni-kl.de return a.xor_reduce(); 113712027Sjungma@eit.uni-kl.de} 113812027Sjungma@eit.uni-kl.de 113912027Sjungma@eit.uni-kl.deinline 114012027Sjungma@eit.uni-kl.debool 114112027Sjungma@eit.uni-kl.dexnor_reduce( const sc_uint_subref_r& a ) 114212027Sjungma@eit.uni-kl.de{ 114312027Sjungma@eit.uni-kl.de return a.xnor_reduce(); 114412027Sjungma@eit.uni-kl.de} 114512027Sjungma@eit.uni-kl.de 114612027Sjungma@eit.uni-kl.de 114712027Sjungma@eit.uni-kl.de 114812027Sjungma@eit.uni-kl.deinline 114912027Sjungma@eit.uni-kl.de::std::ostream& 115012027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_uint_subref_r& a ) 115112027Sjungma@eit.uni-kl.de{ 115212027Sjungma@eit.uni-kl.de a.print( os ); 115312027Sjungma@eit.uni-kl.de return os; 115412027Sjungma@eit.uni-kl.de} 115512027Sjungma@eit.uni-kl.de 115612027Sjungma@eit.uni-kl.de 115712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 115812027Sjungma@eit.uni-kl.de// CLASS : sc_uint_subref 115912027Sjungma@eit.uni-kl.de// 116012027Sjungma@eit.uni-kl.de// Proxy class for sc_uint part selection (r-value and l-value). 116112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 116212027Sjungma@eit.uni-kl.de 116312027Sjungma@eit.uni-kl.de// assignment operators 116412027Sjungma@eit.uni-kl.de 116512027Sjungma@eit.uni-kl.deinline 116612027Sjungma@eit.uni-kl.desc_uint_subref& 116712027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const sc_uint_base& a ) 116812027Sjungma@eit.uni-kl.de{ 116912027Sjungma@eit.uni-kl.de return operator = ( a.operator uint_type() ); 117012027Sjungma@eit.uni-kl.de} 117112027Sjungma@eit.uni-kl.de 117212027Sjungma@eit.uni-kl.deinline 117312027Sjungma@eit.uni-kl.desc_uint_subref& 117412027Sjungma@eit.uni-kl.desc_uint_subref::operator = ( const char* a ) 117512027Sjungma@eit.uni-kl.de{ 117612027Sjungma@eit.uni-kl.de sc_uint_base aa( length() ); 117712027Sjungma@eit.uni-kl.de return ( *this = aa = a ); 117812027Sjungma@eit.uni-kl.de} 117912027Sjungma@eit.uni-kl.de 118012027Sjungma@eit.uni-kl.de 118112027Sjungma@eit.uni-kl.de 118212027Sjungma@eit.uni-kl.deinline 118312027Sjungma@eit.uni-kl.de::std::istream& 118412027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_uint_subref& a ) 118512027Sjungma@eit.uni-kl.de{ 118612027Sjungma@eit.uni-kl.de a.scan( is ); 118712027Sjungma@eit.uni-kl.de return is; 118812027Sjungma@eit.uni-kl.de} 118912027Sjungma@eit.uni-kl.de 119012027Sjungma@eit.uni-kl.de 119112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 119212027Sjungma@eit.uni-kl.de// CLASS : sc_uint_base 119312027Sjungma@eit.uni-kl.de// 119412027Sjungma@eit.uni-kl.de// Base class for sc_uint. 119512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 119612027Sjungma@eit.uni-kl.de 119712027Sjungma@eit.uni-kl.de// bit selection 119812027Sjungma@eit.uni-kl.de 119912027Sjungma@eit.uni-kl.deinline 120012027Sjungma@eit.uni-kl.desc_uint_bitref& 120112027Sjungma@eit.uni-kl.desc_uint_base::operator [] ( int i ) 120212027Sjungma@eit.uni-kl.de{ 120312027Sjungma@eit.uni-kl.de check_index( i ); 120412027Sjungma@eit.uni-kl.de sc_uint_bitref* result_p = sc_uint_bitref::m_pool.allocate(); 120512027Sjungma@eit.uni-kl.de result_p->initialize(this, i); 120612027Sjungma@eit.uni-kl.de return *result_p; 120712027Sjungma@eit.uni-kl.de} 120812027Sjungma@eit.uni-kl.de 120912027Sjungma@eit.uni-kl.deinline 121012027Sjungma@eit.uni-kl.deconst sc_uint_bitref_r& 121112027Sjungma@eit.uni-kl.desc_uint_base::operator [] ( int i ) const 121212027Sjungma@eit.uni-kl.de{ 121312027Sjungma@eit.uni-kl.de check_index( i ); 121412027Sjungma@eit.uni-kl.de sc_uint_bitref* result_p = sc_uint_bitref::m_pool.allocate(); 121512027Sjungma@eit.uni-kl.de result_p->initialize(this, i); 121612027Sjungma@eit.uni-kl.de return *result_p; 121712027Sjungma@eit.uni-kl.de} 121812027Sjungma@eit.uni-kl.de 121912027Sjungma@eit.uni-kl.de 122012027Sjungma@eit.uni-kl.deinline 122112027Sjungma@eit.uni-kl.desc_uint_bitref& 122212027Sjungma@eit.uni-kl.desc_uint_base::bit( int i ) 122312027Sjungma@eit.uni-kl.de{ 122412027Sjungma@eit.uni-kl.de check_index( i ); 122512027Sjungma@eit.uni-kl.de sc_uint_bitref* result_p = sc_uint_bitref::m_pool.allocate(); 122612027Sjungma@eit.uni-kl.de result_p->initialize(this, i); 122712027Sjungma@eit.uni-kl.de return *result_p; 122812027Sjungma@eit.uni-kl.de} 122912027Sjungma@eit.uni-kl.de 123012027Sjungma@eit.uni-kl.deinline 123112027Sjungma@eit.uni-kl.deconst sc_uint_bitref_r& 123212027Sjungma@eit.uni-kl.desc_uint_base::bit( int i ) const 123312027Sjungma@eit.uni-kl.de{ 123412027Sjungma@eit.uni-kl.de check_index( i ); 123512027Sjungma@eit.uni-kl.de sc_uint_bitref* result_p = sc_uint_bitref::m_pool.allocate(); 123612027Sjungma@eit.uni-kl.de result_p->initialize(this, i); 123712027Sjungma@eit.uni-kl.de return *result_p; 123812027Sjungma@eit.uni-kl.de} 123912027Sjungma@eit.uni-kl.de 124012027Sjungma@eit.uni-kl.de 124112027Sjungma@eit.uni-kl.de// part selection 124212027Sjungma@eit.uni-kl.de 124312027Sjungma@eit.uni-kl.deinline 124412027Sjungma@eit.uni-kl.desc_uint_subref& 124512027Sjungma@eit.uni-kl.desc_uint_base::operator () ( int left, int right ) 124612027Sjungma@eit.uni-kl.de{ 124712027Sjungma@eit.uni-kl.de check_range( left, right ); 124812027Sjungma@eit.uni-kl.de sc_uint_subref* result_p = sc_uint_subref::m_pool.allocate(); 124912027Sjungma@eit.uni-kl.de result_p->initialize(this, left, right); 125012027Sjungma@eit.uni-kl.de return *result_p; 125112027Sjungma@eit.uni-kl.de} 125212027Sjungma@eit.uni-kl.de 125312027Sjungma@eit.uni-kl.deinline 125412027Sjungma@eit.uni-kl.deconst sc_uint_subref_r& 125512027Sjungma@eit.uni-kl.desc_uint_base::operator () ( int left, int right ) const 125612027Sjungma@eit.uni-kl.de{ 125712027Sjungma@eit.uni-kl.de check_range( left, right ); 125812027Sjungma@eit.uni-kl.de sc_uint_subref* result_p = sc_uint_subref::m_pool.allocate(); 125912027Sjungma@eit.uni-kl.de result_p->initialize(this, left, right); 126012027Sjungma@eit.uni-kl.de return *result_p; 126112027Sjungma@eit.uni-kl.de} 126212027Sjungma@eit.uni-kl.de 126312027Sjungma@eit.uni-kl.de 126412027Sjungma@eit.uni-kl.deinline 126512027Sjungma@eit.uni-kl.desc_uint_subref& 126612027Sjungma@eit.uni-kl.desc_uint_base::range( int left, int right ) 126712027Sjungma@eit.uni-kl.de{ 126812027Sjungma@eit.uni-kl.de check_range( left, right ); 126912027Sjungma@eit.uni-kl.de sc_uint_subref* result_p = sc_uint_subref::m_pool.allocate(); 127012027Sjungma@eit.uni-kl.de result_p->initialize(this, left, right); 127112027Sjungma@eit.uni-kl.de return *result_p; 127212027Sjungma@eit.uni-kl.de} 127312027Sjungma@eit.uni-kl.de 127412027Sjungma@eit.uni-kl.deinline 127512027Sjungma@eit.uni-kl.deconst sc_uint_subref_r& 127612027Sjungma@eit.uni-kl.desc_uint_base::range( int left, int right ) const 127712027Sjungma@eit.uni-kl.de{ 127812027Sjungma@eit.uni-kl.de check_range( left, right ); 127912027Sjungma@eit.uni-kl.de sc_uint_subref* result_p = sc_uint_subref::m_pool.allocate(); 128012027Sjungma@eit.uni-kl.de result_p->initialize(this, left, right); 128112027Sjungma@eit.uni-kl.de return *result_p; 128212027Sjungma@eit.uni-kl.de} 128312027Sjungma@eit.uni-kl.de 128412027Sjungma@eit.uni-kl.de 128512027Sjungma@eit.uni-kl.de// functional notation for the reduce methods 128612027Sjungma@eit.uni-kl.de 128712027Sjungma@eit.uni-kl.deinline 128812027Sjungma@eit.uni-kl.debool 128912027Sjungma@eit.uni-kl.deand_reduce( const sc_uint_base& a ) 129012027Sjungma@eit.uni-kl.de{ 129112027Sjungma@eit.uni-kl.de return a.and_reduce(); 129212027Sjungma@eit.uni-kl.de} 129312027Sjungma@eit.uni-kl.de 129412027Sjungma@eit.uni-kl.deinline 129512027Sjungma@eit.uni-kl.debool 129612027Sjungma@eit.uni-kl.denand_reduce( const sc_uint_base& a ) 129712027Sjungma@eit.uni-kl.de{ 129812027Sjungma@eit.uni-kl.de return a.nand_reduce(); 129912027Sjungma@eit.uni-kl.de} 130012027Sjungma@eit.uni-kl.de 130112027Sjungma@eit.uni-kl.deinline 130212027Sjungma@eit.uni-kl.debool 130312027Sjungma@eit.uni-kl.deor_reduce( const sc_uint_base& a ) 130412027Sjungma@eit.uni-kl.de{ 130512027Sjungma@eit.uni-kl.de return a.or_reduce(); 130612027Sjungma@eit.uni-kl.de} 130712027Sjungma@eit.uni-kl.de 130812027Sjungma@eit.uni-kl.deinline 130912027Sjungma@eit.uni-kl.debool 131012027Sjungma@eit.uni-kl.denor_reduce( const sc_uint_base& a ) 131112027Sjungma@eit.uni-kl.de{ 131212027Sjungma@eit.uni-kl.de return a.nor_reduce(); 131312027Sjungma@eit.uni-kl.de} 131412027Sjungma@eit.uni-kl.de 131512027Sjungma@eit.uni-kl.deinline 131612027Sjungma@eit.uni-kl.debool 131712027Sjungma@eit.uni-kl.dexor_reduce( const sc_uint_base& a ) 131812027Sjungma@eit.uni-kl.de{ 131912027Sjungma@eit.uni-kl.de return a.xor_reduce(); 132012027Sjungma@eit.uni-kl.de} 132112027Sjungma@eit.uni-kl.de 132212027Sjungma@eit.uni-kl.deinline 132312027Sjungma@eit.uni-kl.debool 132412027Sjungma@eit.uni-kl.dexnor_reduce( const sc_uint_base& a ) 132512027Sjungma@eit.uni-kl.de{ 132612027Sjungma@eit.uni-kl.de return a.xnor_reduce(); 132712027Sjungma@eit.uni-kl.de} 132812027Sjungma@eit.uni-kl.de 132912027Sjungma@eit.uni-kl.de 133012027Sjungma@eit.uni-kl.de 133112027Sjungma@eit.uni-kl.deinline 133212027Sjungma@eit.uni-kl.de::std::ostream& 133312027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_uint_base& a ) 133412027Sjungma@eit.uni-kl.de{ 133512027Sjungma@eit.uni-kl.de a.print( os ); 133612027Sjungma@eit.uni-kl.de return os; 133712027Sjungma@eit.uni-kl.de} 133812027Sjungma@eit.uni-kl.de 133912027Sjungma@eit.uni-kl.deinline 134012027Sjungma@eit.uni-kl.de::std::istream& 134112027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_uint_base& a ) 134212027Sjungma@eit.uni-kl.de{ 134312027Sjungma@eit.uni-kl.de a.scan( is ); 134412027Sjungma@eit.uni-kl.de return is; 134512027Sjungma@eit.uni-kl.de} 134612027Sjungma@eit.uni-kl.de 134712027Sjungma@eit.uni-kl.de} // namespace sc_dt 134812027Sjungma@eit.uni-kl.de 134912027Sjungma@eit.uni-kl.de 135012027Sjungma@eit.uni-kl.de#endif 135112027Sjungma@eit.uni-kl.de 135212027Sjungma@eit.uni-kl.de// Taf! 1353