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