sc_int_base.hh revision 12853
112853Sgabeblack@google.com/***************************************************************************** 212853Sgabeblack@google.com 312853Sgabeblack@google.com Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412853Sgabeblack@google.com more contributor license agreements. See the NOTICE file distributed 512853Sgabeblack@google.com with this work for additional information regarding copyright ownership. 612853Sgabeblack@google.com Accellera licenses this file to you under the Apache License, Version 2.0 712853Sgabeblack@google.com (the "License"); you may not use this file except in compliance with the 812853Sgabeblack@google.com License. You may obtain a copy of the License at 912853Sgabeblack@google.com 1012853Sgabeblack@google.com http://www.apache.org/licenses/LICENSE-2.0 1112853Sgabeblack@google.com 1212853Sgabeblack@google.com Unless required by applicable law or agreed to in writing, software 1312853Sgabeblack@google.com distributed under the License is distributed on an "AS IS" BASIS, 1412853Sgabeblack@google.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512853Sgabeblack@google.com implied. See the License for the specific language governing 1612853Sgabeblack@google.com permissions and limitations under the License. 1712853Sgabeblack@google.com 1812853Sgabeblack@google.com *****************************************************************************/ 1912853Sgabeblack@google.com 2012853Sgabeblack@google.com/***************************************************************************** 2112853Sgabeblack@google.com 2212853Sgabeblack@google.com sc_int_base.h -- A signed integer whose length is less than 64 bit. 2312853Sgabeblack@google.com 2412853Sgabeblack@google.com Unlike arbitrary precision, arithmetic and bitwise operations 2512853Sgabeblack@google.com are performed using the native types (hence capped at 64 bits). 2612853Sgabeblack@google.com The sc_int integer is useful when the user does not need 2712853Sgabeblack@google.com arbitrary precision and the performance is superior to 2812853Sgabeblack@google.com sc_bigint/sc_biguint. 2912853Sgabeblack@google.com 3012853Sgabeblack@google.com Original Author: Amit Rao, Synopsys, Inc. 3112853Sgabeblack@google.com 3212853Sgabeblack@google.com *****************************************************************************/ 3312853Sgabeblack@google.com 3412853Sgabeblack@google.com/***************************************************************************** 3512853Sgabeblack@google.com 3612853Sgabeblack@google.com MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3712853Sgabeblack@google.com changes you are making here. 3812853Sgabeblack@google.com 3912853Sgabeblack@google.com Name, Affiliation, Date: Ali Dasdan, Synopsys, Inc. 4012853Sgabeblack@google.com Description of Modification: - Resolved ambiguity with sc_(un)signed. 4112853Sgabeblack@google.com - Merged the code for 64- and 32-bit versions 4212853Sgabeblack@google.com via the constants in sc_nbdefs.h. 4312853Sgabeblack@google.com - Eliminated redundant file inclusions. 4412853Sgabeblack@google.com 4512853Sgabeblack@google.com Name, Affiliation, Date: 4612853Sgabeblack@google.com Description of Modification: 4712853Sgabeblack@google.com 4812853Sgabeblack@google.com *****************************************************************************/ 4912853Sgabeblack@google.com 5012853Sgabeblack@google.com// $Log: sc_int_base.h,v $ 5112853Sgabeblack@google.com// Revision 1.3 2011/08/24 22:05:45 acg 5212853Sgabeblack@google.com// Torsten Maehne: initialization changes to remove warnings. 5312853Sgabeblack@google.com// 5412853Sgabeblack@google.com// Revision 1.2 2011/02/18 20:19:15 acg 5512853Sgabeblack@google.com// Andy Goodrich: updating Copyright notice. 5612853Sgabeblack@google.com// 5712853Sgabeblack@google.com// Revision 1.1.1.1 2006/12/15 20:20:05 acg 5812853Sgabeblack@google.com// SystemC 2.3 5912853Sgabeblack@google.com// 6012853Sgabeblack@google.com// Revision 1.4 2006/05/08 17:50:01 acg 6112853Sgabeblack@google.com// Andy Goodrich: Added David Long's declarations for friend operators, 6212853Sgabeblack@google.com// functions, and methods, to keep the Microsoft compiler happy. 6312853Sgabeblack@google.com// 6412853Sgabeblack@google.com// Revision 1.3 2006/01/13 18:49:31 acg 6512853Sgabeblack@google.com// Added $Log command so that CVS check in comments are reproduced in the 6612853Sgabeblack@google.com// source. 6712853Sgabeblack@google.com// 6812853Sgabeblack@google.com 6912853Sgabeblack@google.com#ifndef __SYSTEMC_EXT_DT_INT_SC_INT_BASE_HH__ 7012853Sgabeblack@google.com#define __SYSTEMC_EXT_DT_INT_SC_INT_BASE_HH__ 7112853Sgabeblack@google.com 7212853Sgabeblack@google.com#include <iostream> 7312853Sgabeblack@google.com 7412853Sgabeblack@google.com#include "../misc/sc_value_base.hh" 7512853Sgabeblack@google.com#include "../sc_temporary.hh" 7612853Sgabeblack@google.com#include "sc_length_param.hh" 7712853Sgabeblack@google.com#include "sc_nbdefs.hh" 7812853Sgabeblack@google.com#include "sc_uint_base.hh" 7912853Sgabeblack@google.com 8012853Sgabeblack@google.comnamespace sc_dt 8112853Sgabeblack@google.com{ 8212853Sgabeblack@google.com 8312853Sgabeblack@google.comclass sc_concatref; 8412853Sgabeblack@google.com 8512853Sgabeblack@google.com// classes defined in this module 8612853Sgabeblack@google.comclass sc_int_bitref_r; 8712853Sgabeblack@google.comclass sc_int_bitref; 8812853Sgabeblack@google.comclass sc_int_subref_r; 8912853Sgabeblack@google.comclass sc_int_subref; 9012853Sgabeblack@google.comclass sc_int_base; 9112853Sgabeblack@google.comclass sc_signed_subref_r; 9212853Sgabeblack@google.comclass sc_unsigned_subref_r; 9312853Sgabeblack@google.com 9412853Sgabeblack@google.com// forward class declarations 9512853Sgabeblack@google.comclass sc_bv_base; 9612853Sgabeblack@google.comclass sc_lv_base; 9712853Sgabeblack@google.comclass sc_signed; 9812853Sgabeblack@google.comclass sc_unsigned; 9912853Sgabeblack@google.comclass sc_fxval; 10012853Sgabeblack@google.comclass sc_fxval_fast; 10112853Sgabeblack@google.comclass sc_fxnum; 10212853Sgabeblack@google.comclass sc_fxnum_fast; 10312853Sgabeblack@google.com 10412853Sgabeblack@google.com} // namespace sc_dt 10512853Sgabeblack@google.com 10612853Sgabeblack@google.com// extern template instantiations 10712853Sgabeblack@google.comnamespace sc_core 10812853Sgabeblack@google.com{ 10912853Sgabeblack@google.com 11012853Sgabeblack@google.comextern template class sc_vpool<sc_dt::sc_int_bitref>; 11112853Sgabeblack@google.comextern template class sc_vpool<sc_dt::sc_int_subref>; 11212853Sgabeblack@google.com 11312853Sgabeblack@google.com} // namespace sc_core 11412853Sgabeblack@google.com 11512853Sgabeblack@google.comnamespace sc_dt 11612853Sgabeblack@google.com{ 11712853Sgabeblack@google.com 11812853Sgabeblack@google.comextern const uint_type mask_int[SC_INTWIDTH][SC_INTWIDTH]; 11912853Sgabeblack@google.com 12012853Sgabeblack@google.com// friend operator declarations 12112853Sgabeblack@google.com 12212853Sgabeblack@google.com// relational operators 12312853Sgabeblack@google.com 12412853Sgabeblack@google.cominline bool operator == (const sc_int_base &a, const sc_int_base &b); 12512853Sgabeblack@google.cominline bool operator != (const sc_int_base &a, const sc_int_base &b); 12612853Sgabeblack@google.cominline bool operator < (const sc_int_base &a, const sc_int_base &b); 12712853Sgabeblack@google.cominline bool operator <= (const sc_int_base &a, const sc_int_base &b); 12812853Sgabeblack@google.cominline bool operator > (const sc_int_base &a, const sc_int_base &b); 12912853Sgabeblack@google.cominline bool operator >= (const sc_int_base &a, const sc_int_base &b); 13012853Sgabeblack@google.com 13112853Sgabeblack@google.com 13212853Sgabeblack@google.com// ---------------------------------------------------------------------------- 13312853Sgabeblack@google.com// CLASS : sc_int_bitref_r 13412853Sgabeblack@google.com// 13512853Sgabeblack@google.com// Proxy class for sc_int bit selection (r-value only). 13612853Sgabeblack@google.com// ---------------------------------------------------------------------------- 13712853Sgabeblack@google.com 13812853Sgabeblack@google.comclass sc_int_bitref_r : public sc_value_base 13912853Sgabeblack@google.com{ 14012853Sgabeblack@google.com friend class sc_int_base; 14112853Sgabeblack@google.com 14212853Sgabeblack@google.com protected: 14312853Sgabeblack@google.com // constructor 14412853Sgabeblack@google.com sc_int_bitref_r() : sc_value_base(), m_index(), m_obj_p() {} 14512853Sgabeblack@google.com 14612853Sgabeblack@google.com // initializer for sc_core::sc_vpool: 14712853Sgabeblack@google.com void initialize(const sc_int_base *obj_p, int index_) 14812853Sgabeblack@google.com { 14912853Sgabeblack@google.com m_obj_p = (sc_int_base *)obj_p; 15012853Sgabeblack@google.com m_index = index_; 15112853Sgabeblack@google.com } 15212853Sgabeblack@google.com 15312853Sgabeblack@google.com public: 15412853Sgabeblack@google.com // copy constructor 15512853Sgabeblack@google.com sc_int_bitref_r(const sc_int_bitref_r &a) : 15612853Sgabeblack@google.com sc_value_base(a), m_index(a.m_index), m_obj_p(a.m_obj_p) 15712853Sgabeblack@google.com {} 15812853Sgabeblack@google.com 15912853Sgabeblack@google.com // destructor 16012853Sgabeblack@google.com virtual ~sc_int_bitref_r() {} 16112853Sgabeblack@google.com 16212853Sgabeblack@google.com // capacity 16312853Sgabeblack@google.com int length() const { return 1; } 16412853Sgabeblack@google.com 16512853Sgabeblack@google.com#ifdef SC_DT_DEPRECATED 16612853Sgabeblack@google.com int bitwidth() const { return length(); } 16712853Sgabeblack@google.com#endif 16812853Sgabeblack@google.com 16912853Sgabeblack@google.com // concatenation support 17012853Sgabeblack@google.com virtual int 17112853Sgabeblack@google.com concat_length(bool *xz_present_p) const 17212853Sgabeblack@google.com { 17312853Sgabeblack@google.com if (xz_present_p) 17412853Sgabeblack@google.com *xz_present_p = false; 17512853Sgabeblack@google.com return 1; 17612853Sgabeblack@google.com } 17712853Sgabeblack@google.com virtual bool 17812853Sgabeblack@google.com concat_get_ctrl(sc_digit *dst_p, int low_i) const 17912853Sgabeblack@google.com { 18012853Sgabeblack@google.com int bit_mask = 1 << (low_i % BITS_PER_DIGIT); 18112853Sgabeblack@google.com int word_i = low_i / BITS_PER_DIGIT; 18212853Sgabeblack@google.com 18312853Sgabeblack@google.com dst_p[word_i] &= ~bit_mask; 18412853Sgabeblack@google.com return false; 18512853Sgabeblack@google.com } 18612853Sgabeblack@google.com virtual bool 18712853Sgabeblack@google.com concat_get_data(sc_digit *dst_p, int low_i) const 18812853Sgabeblack@google.com { 18912853Sgabeblack@google.com bool non_zero; 19012853Sgabeblack@google.com int bit_mask = 1 << (low_i % BITS_PER_DIGIT); 19112853Sgabeblack@google.com int word_i = low_i / BITS_PER_DIGIT; 19212853Sgabeblack@google.com 19312853Sgabeblack@google.com if (operator uint64()) { 19412853Sgabeblack@google.com dst_p[word_i] |= bit_mask; 19512853Sgabeblack@google.com non_zero = true; 19612853Sgabeblack@google.com } else { 19712853Sgabeblack@google.com dst_p[word_i] &= ~bit_mask; 19812853Sgabeblack@google.com non_zero = false; 19912853Sgabeblack@google.com } 20012853Sgabeblack@google.com return non_zero; 20112853Sgabeblack@google.com } 20212853Sgabeblack@google.com virtual uint64 20312853Sgabeblack@google.com concat_get_uint64() const 20412853Sgabeblack@google.com { 20512853Sgabeblack@google.com return operator uint64(); 20612853Sgabeblack@google.com } 20712853Sgabeblack@google.com 20812853Sgabeblack@google.com 20912853Sgabeblack@google.com // implicit conversions 21012853Sgabeblack@google.com operator uint64 () const; 21112853Sgabeblack@google.com bool operator ! () const; 21212853Sgabeblack@google.com bool operator ~ () const; 21312853Sgabeblack@google.com 21412853Sgabeblack@google.com 21512853Sgabeblack@google.com // explicit conversions 21612853Sgabeblack@google.com uint64 value() const { return operator uint64(); } 21712853Sgabeblack@google.com 21812853Sgabeblack@google.com bool to_bool() const { return operator uint64(); } 21912853Sgabeblack@google.com 22012853Sgabeblack@google.com 22112853Sgabeblack@google.com // other methods 22212853Sgabeblack@google.com void print(::std::ostream& os=::std::cout) const { os << to_bool(); } 22312853Sgabeblack@google.com 22412853Sgabeblack@google.com protected: 22512853Sgabeblack@google.com int m_index; 22612853Sgabeblack@google.com sc_int_base *m_obj_p; 22712853Sgabeblack@google.com 22812853Sgabeblack@google.com private: 22912853Sgabeblack@google.com // Disabled 23012853Sgabeblack@google.com sc_int_bitref_r &operator = (const sc_int_bitref_r &); 23112853Sgabeblack@google.com}; 23212853Sgabeblack@google.com 23312853Sgabeblack@google.com 23412853Sgabeblack@google.cominline ::std::ostream &operator << (::std::ostream &, const sc_int_bitref_r &); 23512853Sgabeblack@google.com 23612853Sgabeblack@google.com 23712853Sgabeblack@google.com// ---------------------------------------------------------------------------- 23812853Sgabeblack@google.com// CLASS : sc_int_bitref 23912853Sgabeblack@google.com// 24012853Sgabeblack@google.com// Proxy class for sc_int bit selection (r-value and l-value). 24112853Sgabeblack@google.com// ---------------------------------------------------------------------------- 24212853Sgabeblack@google.com 24312853Sgabeblack@google.comclass sc_int_bitref : public sc_int_bitref_r 24412853Sgabeblack@google.com{ 24512853Sgabeblack@google.com friend class sc_int_base; 24612853Sgabeblack@google.com friend class sc_core::sc_vpool<sc_int_bitref>; 24712853Sgabeblack@google.com 24812853Sgabeblack@google.com // constructor 24912853Sgabeblack@google.com sc_int_bitref() : sc_int_bitref_r() {} 25012853Sgabeblack@google.com 25112853Sgabeblack@google.com public: 25212853Sgabeblack@google.com // copy constructor 25312853Sgabeblack@google.com sc_int_bitref(const sc_int_bitref &a) : sc_int_bitref_r(a) {} 25412853Sgabeblack@google.com 25512853Sgabeblack@google.com // assignment operators 25612853Sgabeblack@google.com sc_int_bitref &operator = (const sc_int_bitref_r &b); 25712853Sgabeblack@google.com sc_int_bitref &operator = (const sc_int_bitref &b); 25812853Sgabeblack@google.com sc_int_bitref &operator = (bool b); 25912853Sgabeblack@google.com 26012853Sgabeblack@google.com sc_int_bitref &operator &= (bool b); 26112853Sgabeblack@google.com sc_int_bitref &operator |= (bool b); 26212853Sgabeblack@google.com sc_int_bitref &operator ^= (bool b); 26312853Sgabeblack@google.com 26412853Sgabeblack@google.com // concatenation methods 26512853Sgabeblack@google.com virtual void concat_set(int64 src, int low_i); 26612853Sgabeblack@google.com virtual void concat_set(const sc_signed &src, int low_i); 26712853Sgabeblack@google.com virtual void concat_set(const sc_unsigned &src, int low_i); 26812853Sgabeblack@google.com virtual void concat_set(uint64 src, int low_i); 26912853Sgabeblack@google.com 27012853Sgabeblack@google.com // other methods 27112853Sgabeblack@google.com void scan(::std::istream &is=::std::cin); 27212853Sgabeblack@google.com 27312853Sgabeblack@google.com public: 27412853Sgabeblack@google.com static sc_core::sc_vpool<sc_int_bitref> m_pool; 27512853Sgabeblack@google.com}; 27612853Sgabeblack@google.com 27712853Sgabeblack@google.com 27812853Sgabeblack@google.com 27912853Sgabeblack@google.cominline ::std::istream &operator >> (::std::istream &, sc_int_bitref &); 28012853Sgabeblack@google.com 28112853Sgabeblack@google.com 28212853Sgabeblack@google.com// ---------------------------------------------------------------------------- 28312853Sgabeblack@google.com// CLASS : sc_int_subref_r 28412853Sgabeblack@google.com// 28512853Sgabeblack@google.com// Proxy class for sc_int part selection (r-value only). 28612853Sgabeblack@google.com// ---------------------------------------------------------------------------- 28712853Sgabeblack@google.com 28812853Sgabeblack@google.comclass sc_int_subref_r : public sc_value_base 28912853Sgabeblack@google.com{ 29012853Sgabeblack@google.com friend class sc_int_base; 29112853Sgabeblack@google.com friend class sc_int_signal; 29212853Sgabeblack@google.com friend class sc_int_subref; 29312853Sgabeblack@google.com 29412853Sgabeblack@google.com protected: 29512853Sgabeblack@google.com // constructor 29612853Sgabeblack@google.com sc_int_subref_r() : sc_value_base(), m_left(0), m_obj_p(0), m_right(0) {} 29712853Sgabeblack@google.com 29812853Sgabeblack@google.com // initializer for sc_core::sc_vpool: 29912853Sgabeblack@google.com void initialize( const sc_int_base *obj_p, int left_i, int right_i) 30012853Sgabeblack@google.com { 30112853Sgabeblack@google.com m_obj_p = (sc_int_base *)obj_p; 30212853Sgabeblack@google.com m_left = left_i; 30312853Sgabeblack@google.com m_right = right_i; 30412853Sgabeblack@google.com } 30512853Sgabeblack@google.com 30612853Sgabeblack@google.com public: 30712853Sgabeblack@google.com // copy constructor 30812853Sgabeblack@google.com sc_int_subref_r(const sc_int_subref_r &a) : 30912853Sgabeblack@google.com sc_value_base(a), m_left(a.m_left), m_obj_p(a.m_obj_p), 31012853Sgabeblack@google.com m_right(a.m_right) 31112853Sgabeblack@google.com {} 31212853Sgabeblack@google.com 31312853Sgabeblack@google.com // destructor 31412853Sgabeblack@google.com virtual ~sc_int_subref_r() {} 31512853Sgabeblack@google.com 31612853Sgabeblack@google.com // capacity 31712853Sgabeblack@google.com int length() const { return (m_left - m_right + 1); } 31812853Sgabeblack@google.com 31912853Sgabeblack@google.com // concatenation support 32012853Sgabeblack@google.com virtual int 32112853Sgabeblack@google.com concat_length(bool *xz_present_p) const 32212853Sgabeblack@google.com { 32312853Sgabeblack@google.com if (xz_present_p) 32412853Sgabeblack@google.com *xz_present_p = false; 32512853Sgabeblack@google.com return length(); 32612853Sgabeblack@google.com } 32712853Sgabeblack@google.com virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const; 32812853Sgabeblack@google.com virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const; 32912853Sgabeblack@google.com virtual uint64 33012853Sgabeblack@google.com concat_get_uint64() const 33112853Sgabeblack@google.com { 33212853Sgabeblack@google.com int len = length(); 33312853Sgabeblack@google.com uint64 val = operator uint_type(); 33412853Sgabeblack@google.com if (len < 64) 33512853Sgabeblack@google.com return (uint64)(val & ~((uint_type)-1 << len)); 33612853Sgabeblack@google.com else 33712853Sgabeblack@google.com return (uint64)val; 33812853Sgabeblack@google.com } 33912853Sgabeblack@google.com 34012853Sgabeblack@google.com // reduce methods 34112853Sgabeblack@google.com bool and_reduce() const; 34212853Sgabeblack@google.com bool nand_reduce() const { return !and_reduce(); } 34312853Sgabeblack@google.com bool or_reduce() const; 34412853Sgabeblack@google.com bool nor_reduce() const { return or_reduce(); } 34512853Sgabeblack@google.com bool xor_reduce() const; 34612853Sgabeblack@google.com bool xnor_reduce() const { return xor_reduce(); } 34712853Sgabeblack@google.com 34812853Sgabeblack@google.com // implicit conversion to uint_type 34912853Sgabeblack@google.com operator uint_type () const; 35012853Sgabeblack@google.com 35112853Sgabeblack@google.com // explicit conversions 35212853Sgabeblack@google.com uint_type value() const { return operator uint_type(); } 35312853Sgabeblack@google.com 35412853Sgabeblack@google.com 35512853Sgabeblack@google.com int to_int() const; 35612853Sgabeblack@google.com unsigned int to_uint() const; 35712853Sgabeblack@google.com long to_long() const; 35812853Sgabeblack@google.com unsigned long to_ulong() const; 35912853Sgabeblack@google.com int64 to_int64() const; 36012853Sgabeblack@google.com uint64 to_uint64() const; 36112853Sgabeblack@google.com double to_double() const; 36212853Sgabeblack@google.com 36312853Sgabeblack@google.com // explicit conversion to character string 36412853Sgabeblack@google.com const std::string to_string(sc_numrep numrep=SC_DEC) const; 36512853Sgabeblack@google.com const std::string to_string(sc_numrep numrep, bool w_prefix) const; 36612853Sgabeblack@google.com 36712853Sgabeblack@google.com // other methods 36812853Sgabeblack@google.com void 36912853Sgabeblack@google.com print(::std::ostream &os=::std::cout) const 37012853Sgabeblack@google.com { 37112853Sgabeblack@google.com os << to_string(sc_io_base(os, SC_DEC), sc_io_show_base(os)); 37212853Sgabeblack@google.com } 37312853Sgabeblack@google.com 37412853Sgabeblack@google.com protected: 37512853Sgabeblack@google.com int m_left; 37612853Sgabeblack@google.com sc_int_base *m_obj_p; 37712853Sgabeblack@google.com int m_right; 37812853Sgabeblack@google.com 37912853Sgabeblack@google.com private: 38012853Sgabeblack@google.com const sc_int_subref_r &operator = (const sc_int_subref_r &); 38112853Sgabeblack@google.com}; 38212853Sgabeblack@google.com 38312853Sgabeblack@google.cominline ::std::ostream &operator << (::std::ostream &, const sc_int_subref_r &); 38412853Sgabeblack@google.com 38512853Sgabeblack@google.com 38612853Sgabeblack@google.com// ---------------------------------------------------------------------------- 38712853Sgabeblack@google.com// CLASS : sc_int_subref 38812853Sgabeblack@google.com// 38912853Sgabeblack@google.com// Proxy class for sc_int part selection (r-value and l-value). 39012853Sgabeblack@google.com// ---------------------------------------------------------------------------- 39112853Sgabeblack@google.com 39212853Sgabeblack@google.comclass sc_int_subref : public sc_int_subref_r 39312853Sgabeblack@google.com{ 39412853Sgabeblack@google.com friend class sc_int_base; 39512853Sgabeblack@google.com friend class sc_core::sc_vpool<sc_int_subref>; 39612853Sgabeblack@google.com 39712853Sgabeblack@google.com protected: 39812853Sgabeblack@google.com // constructor 39912853Sgabeblack@google.com sc_int_subref() : sc_int_subref_r() {} 40012853Sgabeblack@google.com 40112853Sgabeblack@google.com public: 40212853Sgabeblack@google.com // copy constructor 40312853Sgabeblack@google.com sc_int_subref(const sc_int_subref &a) : sc_int_subref_r(a) {} 40412853Sgabeblack@google.com 40512853Sgabeblack@google.com // assignment operators 40612853Sgabeblack@google.com sc_int_subref &operator = (int_type v); 40712853Sgabeblack@google.com sc_int_subref &operator = (const sc_int_base &a); 40812853Sgabeblack@google.com 40912853Sgabeblack@google.com sc_int_subref & 41012853Sgabeblack@google.com operator = (const sc_int_subref_r &a) 41112853Sgabeblack@google.com { 41212853Sgabeblack@google.com return operator = (a.operator uint_type()); 41312853Sgabeblack@google.com } 41412853Sgabeblack@google.com 41512853Sgabeblack@google.com sc_int_subref & 41612853Sgabeblack@google.com operator = (const sc_int_subref &a) 41712853Sgabeblack@google.com { 41812853Sgabeblack@google.com return operator = (a.operator uint_type()); 41912853Sgabeblack@google.com } 42012853Sgabeblack@google.com 42112853Sgabeblack@google.com template< class T > 42212853Sgabeblack@google.com sc_int_subref & 42312853Sgabeblack@google.com operator = (const sc_generic_base<T> &a) 42412853Sgabeblack@google.com { 42512853Sgabeblack@google.com return operator = (a->to_int64()); 42612853Sgabeblack@google.com } 42712853Sgabeblack@google.com 42812853Sgabeblack@google.com sc_int_subref &operator = (const char *a); 42912853Sgabeblack@google.com 43012853Sgabeblack@google.com sc_int_subref & 43112853Sgabeblack@google.com operator = (unsigned long a) 43212853Sgabeblack@google.com { 43312853Sgabeblack@google.com return operator = ((int_type)a); 43412853Sgabeblack@google.com } 43512853Sgabeblack@google.com 43612853Sgabeblack@google.com sc_int_subref & 43712853Sgabeblack@google.com operator = (long a) 43812853Sgabeblack@google.com { 43912853Sgabeblack@google.com return operator = ((int_type)a); 44012853Sgabeblack@google.com } 44112853Sgabeblack@google.com 44212853Sgabeblack@google.com sc_int_subref & 44312853Sgabeblack@google.com operator = (unsigned int a) 44412853Sgabeblack@google.com { 44512853Sgabeblack@google.com return operator = ((int_type)a); 44612853Sgabeblack@google.com } 44712853Sgabeblack@google.com 44812853Sgabeblack@google.com sc_int_subref & 44912853Sgabeblack@google.com operator = (int a) 45012853Sgabeblack@google.com { 45112853Sgabeblack@google.com return operator = ((int_type)a); 45212853Sgabeblack@google.com } 45312853Sgabeblack@google.com 45412853Sgabeblack@google.com sc_int_subref & 45512853Sgabeblack@google.com operator = (uint64 a) 45612853Sgabeblack@google.com { 45712853Sgabeblack@google.com return operator = ((int_type)a); 45812853Sgabeblack@google.com } 45912853Sgabeblack@google.com 46012853Sgabeblack@google.com sc_int_subref & 46112853Sgabeblack@google.com operator = (double a) 46212853Sgabeblack@google.com { 46312853Sgabeblack@google.com return operator = ((int_type)a); 46412853Sgabeblack@google.com } 46512853Sgabeblack@google.com 46612853Sgabeblack@google.com sc_int_subref &operator = (const sc_signed &); 46712853Sgabeblack@google.com sc_int_subref &operator = (const sc_unsigned &); 46812853Sgabeblack@google.com sc_int_subref &operator = (const sc_bv_base &); 46912853Sgabeblack@google.com sc_int_subref &operator = (const sc_lv_base &); 47012853Sgabeblack@google.com 47112853Sgabeblack@google.com // concatenation methods 47212853Sgabeblack@google.com virtual void concat_set(int64 src, int low_i); 47312853Sgabeblack@google.com virtual void concat_set(const sc_signed &src, int low_i); 47412853Sgabeblack@google.com virtual void concat_set(const sc_unsigned &src, int low_i); 47512853Sgabeblack@google.com virtual void concat_set(uint64 src, int low_i); 47612853Sgabeblack@google.com 47712853Sgabeblack@google.com // other methods 47812853Sgabeblack@google.com void scan(::std::istream &is=::std::cin); 47912853Sgabeblack@google.com 48012853Sgabeblack@google.com public: 48112853Sgabeblack@google.com static sc_core::sc_vpool<sc_int_subref> m_pool; 48212853Sgabeblack@google.com}; 48312853Sgabeblack@google.com 48412853Sgabeblack@google.com 48512853Sgabeblack@google.cominline ::std::istream &operator >> (::std::istream &, sc_int_subref &); 48612853Sgabeblack@google.com 48712853Sgabeblack@google.com 48812853Sgabeblack@google.com// ---------------------------------------------------------------------------- 48912853Sgabeblack@google.com// CLASS : sc_int_base 49012853Sgabeblack@google.com// 49112853Sgabeblack@google.com// Base class for sc_int. 49212853Sgabeblack@google.com// ---------------------------------------------------------------------------- 49312853Sgabeblack@google.com 49412853Sgabeblack@google.comclass sc_int_base : public sc_value_base 49512853Sgabeblack@google.com{ 49612853Sgabeblack@google.com friend class sc_int_bitref_r; 49712853Sgabeblack@google.com friend class sc_int_bitref; 49812853Sgabeblack@google.com friend class sc_int_subref_r; 49912853Sgabeblack@google.com friend class sc_int_subref; 50012853Sgabeblack@google.com 50112853Sgabeblack@google.com 50212853Sgabeblack@google.com // support methods 50312853Sgabeblack@google.com void invalid_length() const; 50412853Sgabeblack@google.com void invalid_index(int i) const; 50512853Sgabeblack@google.com void invalid_range(int l, int r) const; 50612853Sgabeblack@google.com 50712853Sgabeblack@google.com void 50812853Sgabeblack@google.com check_length() const 50912853Sgabeblack@google.com { 51012853Sgabeblack@google.com if (m_len <= 0 || m_len > SC_INTWIDTH) { 51112853Sgabeblack@google.com invalid_length(); 51212853Sgabeblack@google.com } 51312853Sgabeblack@google.com } 51412853Sgabeblack@google.com 51512853Sgabeblack@google.com void 51612853Sgabeblack@google.com check_index(int i) const 51712853Sgabeblack@google.com { 51812853Sgabeblack@google.com if (i < 0 || i >= m_len) { 51912853Sgabeblack@google.com invalid_index(i); 52012853Sgabeblack@google.com } 52112853Sgabeblack@google.com } 52212853Sgabeblack@google.com 52312853Sgabeblack@google.com void 52412853Sgabeblack@google.com check_range(int l, int r) const 52512853Sgabeblack@google.com { 52612853Sgabeblack@google.com if (r < 0 || l >= m_len || l < r) { 52712853Sgabeblack@google.com invalid_range(l, r); 52812853Sgabeblack@google.com } 52912853Sgabeblack@google.com } 53012853Sgabeblack@google.com 53112853Sgabeblack@google.com void check_value() const; 53212853Sgabeblack@google.com 53312853Sgabeblack@google.com void 53412853Sgabeblack@google.com extend_sign() 53512853Sgabeblack@google.com { 53612853Sgabeblack@google.com#ifdef DEBUG_SYSTEMC 53712853Sgabeblack@google.com check_value(); 53812853Sgabeblack@google.com#endif 53912853Sgabeblack@google.com m_val = (m_val << m_ulen >> m_ulen); 54012853Sgabeblack@google.com } 54112853Sgabeblack@google.com 54212853Sgabeblack@google.compublic: 54312853Sgabeblack@google.com 54412853Sgabeblack@google.com // constructors 54512853Sgabeblack@google.com explicit sc_int_base(int w=sc_length_param().len()) : 54612853Sgabeblack@google.com m_val(0), m_len(w), m_ulen(SC_INTWIDTH - m_len) 54712853Sgabeblack@google.com { 54812853Sgabeblack@google.com check_length(); 54912853Sgabeblack@google.com } 55012853Sgabeblack@google.com 55112853Sgabeblack@google.com sc_int_base(int_type v, int w) : 55212853Sgabeblack@google.com m_val(v), m_len(w), m_ulen(SC_INTWIDTH - m_len) 55312853Sgabeblack@google.com { 55412853Sgabeblack@google.com check_length(); 55512853Sgabeblack@google.com extend_sign(); 55612853Sgabeblack@google.com } 55712853Sgabeblack@google.com 55812853Sgabeblack@google.com sc_int_base(const sc_int_base &a) : 55912853Sgabeblack@google.com sc_value_base(a), m_val(a.m_val), m_len(a.m_len), m_ulen(a.m_ulen) 56012853Sgabeblack@google.com {} 56112853Sgabeblack@google.com 56212853Sgabeblack@google.com explicit sc_int_base(const sc_int_subref_r &a) : 56312853Sgabeblack@google.com m_val(a), m_len(a.length()), m_ulen(SC_INTWIDTH - m_len) 56412853Sgabeblack@google.com { 56512853Sgabeblack@google.com extend_sign(); 56612853Sgabeblack@google.com } 56712853Sgabeblack@google.com 56812853Sgabeblack@google.com template< class T > 56912853Sgabeblack@google.com explicit sc_int_base(const sc_generic_base<T> &a) : 57012853Sgabeblack@google.com m_val(a->to_int64()), m_len(a->length()), m_ulen(SC_INTWIDTH - m_len) 57112853Sgabeblack@google.com { 57212853Sgabeblack@google.com check_length(); 57312853Sgabeblack@google.com extend_sign(); 57412853Sgabeblack@google.com } 57512853Sgabeblack@google.com 57612853Sgabeblack@google.com explicit sc_int_base(const sc_signed &a); 57712853Sgabeblack@google.com explicit sc_int_base(const sc_unsigned &a); 57812853Sgabeblack@google.com explicit sc_int_base(const sc_bv_base &v); 57912853Sgabeblack@google.com explicit sc_int_base(const sc_lv_base &v); 58012853Sgabeblack@google.com explicit sc_int_base(const sc_uint_subref_r &v); 58112853Sgabeblack@google.com explicit sc_int_base(const sc_signed_subref_r &v); 58212853Sgabeblack@google.com explicit sc_int_base(const sc_unsigned_subref_r &v); 58312853Sgabeblack@google.com 58412853Sgabeblack@google.com 58512853Sgabeblack@google.com // destructor 58612853Sgabeblack@google.com virtual ~sc_int_base() {} 58712853Sgabeblack@google.com 58812853Sgabeblack@google.com // assignment operators 58912853Sgabeblack@google.com sc_int_base & 59012853Sgabeblack@google.com operator = (int_type v) 59112853Sgabeblack@google.com { 59212853Sgabeblack@google.com m_val = v; 59312853Sgabeblack@google.com extend_sign(); 59412853Sgabeblack@google.com return *this; 59512853Sgabeblack@google.com } 59612853Sgabeblack@google.com 59712853Sgabeblack@google.com sc_int_base & 59812853Sgabeblack@google.com operator = (const sc_int_base &a) 59912853Sgabeblack@google.com { 60012853Sgabeblack@google.com m_val = a.m_val; 60112853Sgabeblack@google.com extend_sign(); 60212853Sgabeblack@google.com return *this; 60312853Sgabeblack@google.com } 60412853Sgabeblack@google.com 60512853Sgabeblack@google.com sc_int_base & 60612853Sgabeblack@google.com operator = (const sc_int_subref_r &a) 60712853Sgabeblack@google.com { 60812853Sgabeblack@google.com m_val = a; 60912853Sgabeblack@google.com extend_sign(); 61012853Sgabeblack@google.com return *this; 61112853Sgabeblack@google.com } 61212853Sgabeblack@google.com 61312853Sgabeblack@google.com template<class T> 61412853Sgabeblack@google.com sc_int_base & 61512853Sgabeblack@google.com operator = (const sc_generic_base<T> &a) 61612853Sgabeblack@google.com { 61712853Sgabeblack@google.com m_val = a->to_int64(); 61812853Sgabeblack@google.com extend_sign(); 61912853Sgabeblack@google.com return *this; 62012853Sgabeblack@google.com } 62112853Sgabeblack@google.com 62212853Sgabeblack@google.com sc_int_base &operator = (const sc_signed &a); 62312853Sgabeblack@google.com sc_int_base &operator = (const sc_unsigned &a); 62412853Sgabeblack@google.com 62512853Sgabeblack@google.com sc_int_base &operator = (const sc_fxval &a); 62612853Sgabeblack@google.com sc_int_base &operator = (const sc_fxval_fast &a); 62712853Sgabeblack@google.com sc_int_base &operator = (const sc_fxnum &a); 62812853Sgabeblack@google.com sc_int_base &operator = (const sc_fxnum_fast &a); 62912853Sgabeblack@google.com 63012853Sgabeblack@google.com sc_int_base &operator = (const sc_bv_base &a); 63112853Sgabeblack@google.com sc_int_base &operator = (const sc_lv_base &a); 63212853Sgabeblack@google.com 63312853Sgabeblack@google.com sc_int_base &operator = (const char *a); 63412853Sgabeblack@google.com 63512853Sgabeblack@google.com sc_int_base & 63612853Sgabeblack@google.com operator = (unsigned long a) 63712853Sgabeblack@google.com { 63812853Sgabeblack@google.com m_val = a; 63912853Sgabeblack@google.com extend_sign(); 64012853Sgabeblack@google.com return *this; 64112853Sgabeblack@google.com } 64212853Sgabeblack@google.com 64312853Sgabeblack@google.com sc_int_base & 64412853Sgabeblack@google.com operator = (long a) 64512853Sgabeblack@google.com { 64612853Sgabeblack@google.com m_val = a; 64712853Sgabeblack@google.com extend_sign(); 64812853Sgabeblack@google.com return *this; 64912853Sgabeblack@google.com } 65012853Sgabeblack@google.com 65112853Sgabeblack@google.com sc_int_base & 65212853Sgabeblack@google.com operator = (unsigned int a) 65312853Sgabeblack@google.com { 65412853Sgabeblack@google.com m_val = a; 65512853Sgabeblack@google.com extend_sign(); 65612853Sgabeblack@google.com return *this; 65712853Sgabeblack@google.com } 65812853Sgabeblack@google.com 65912853Sgabeblack@google.com sc_int_base & 66012853Sgabeblack@google.com operator = (int a) 66112853Sgabeblack@google.com { 66212853Sgabeblack@google.com m_val = a; 66312853Sgabeblack@google.com extend_sign(); 66412853Sgabeblack@google.com return *this; 66512853Sgabeblack@google.com } 66612853Sgabeblack@google.com 66712853Sgabeblack@google.com sc_int_base & 66812853Sgabeblack@google.com operator = (uint64 a) 66912853Sgabeblack@google.com { 67012853Sgabeblack@google.com m_val = a; 67112853Sgabeblack@google.com extend_sign(); 67212853Sgabeblack@google.com return *this; 67312853Sgabeblack@google.com } 67412853Sgabeblack@google.com 67512853Sgabeblack@google.com sc_int_base & 67612853Sgabeblack@google.com operator = (double a) 67712853Sgabeblack@google.com { 67812853Sgabeblack@google.com m_val = (int_type)a; 67912853Sgabeblack@google.com extend_sign(); 68012853Sgabeblack@google.com return *this; 68112853Sgabeblack@google.com } 68212853Sgabeblack@google.com 68312853Sgabeblack@google.com // arithmetic assignment operators 68412853Sgabeblack@google.com sc_int_base & 68512853Sgabeblack@google.com operator += (int_type v) 68612853Sgabeblack@google.com { 68712853Sgabeblack@google.com m_val += v; 68812853Sgabeblack@google.com extend_sign(); 68912853Sgabeblack@google.com return *this; 69012853Sgabeblack@google.com } 69112853Sgabeblack@google.com 69212853Sgabeblack@google.com sc_int_base & 69312853Sgabeblack@google.com operator -= (int_type v) 69412853Sgabeblack@google.com { 69512853Sgabeblack@google.com m_val -= v; 69612853Sgabeblack@google.com extend_sign(); 69712853Sgabeblack@google.com return *this; 69812853Sgabeblack@google.com } 69912853Sgabeblack@google.com 70012853Sgabeblack@google.com sc_int_base & 70112853Sgabeblack@google.com operator *= (int_type v) 70212853Sgabeblack@google.com { 70312853Sgabeblack@google.com m_val *= v; 70412853Sgabeblack@google.com extend_sign(); 70512853Sgabeblack@google.com return *this; 70612853Sgabeblack@google.com } 70712853Sgabeblack@google.com 70812853Sgabeblack@google.com sc_int_base & 70912853Sgabeblack@google.com operator /= (int_type v) 71012853Sgabeblack@google.com { 71112853Sgabeblack@google.com m_val /= v; 71212853Sgabeblack@google.com extend_sign(); 71312853Sgabeblack@google.com return *this; 71412853Sgabeblack@google.com } 71512853Sgabeblack@google.com 71612853Sgabeblack@google.com sc_int_base & 71712853Sgabeblack@google.com operator %= (int_type v) 71812853Sgabeblack@google.com { 71912853Sgabeblack@google.com m_val %= v; 72012853Sgabeblack@google.com extend_sign(); 72112853Sgabeblack@google.com return *this; 72212853Sgabeblack@google.com } 72312853Sgabeblack@google.com 72412853Sgabeblack@google.com 72512853Sgabeblack@google.com // bitwise assignment operators 72612853Sgabeblack@google.com sc_int_base & 72712853Sgabeblack@google.com operator &= (int_type v) 72812853Sgabeblack@google.com { 72912853Sgabeblack@google.com m_val &= v; 73012853Sgabeblack@google.com extend_sign(); 73112853Sgabeblack@google.com return *this; 73212853Sgabeblack@google.com } 73312853Sgabeblack@google.com 73412853Sgabeblack@google.com sc_int_base & 73512853Sgabeblack@google.com operator |= (int_type v) 73612853Sgabeblack@google.com { 73712853Sgabeblack@google.com m_val |= v; 73812853Sgabeblack@google.com extend_sign(); 73912853Sgabeblack@google.com return *this; 74012853Sgabeblack@google.com } 74112853Sgabeblack@google.com 74212853Sgabeblack@google.com sc_int_base & 74312853Sgabeblack@google.com operator ^= (int_type v) 74412853Sgabeblack@google.com { 74512853Sgabeblack@google.com m_val ^= v; 74612853Sgabeblack@google.com extend_sign(); 74712853Sgabeblack@google.com return *this; 74812853Sgabeblack@google.com } 74912853Sgabeblack@google.com 75012853Sgabeblack@google.com 75112853Sgabeblack@google.com sc_int_base & 75212853Sgabeblack@google.com operator <<= (int_type v) 75312853Sgabeblack@google.com { 75412853Sgabeblack@google.com m_val <<= v; 75512853Sgabeblack@google.com extend_sign(); 75612853Sgabeblack@google.com return *this; 75712853Sgabeblack@google.com } 75812853Sgabeblack@google.com 75912853Sgabeblack@google.com sc_int_base & 76012853Sgabeblack@google.com operator >>= (int_type v) 76112853Sgabeblack@google.com { 76212853Sgabeblack@google.com m_val >>= v; 76312853Sgabeblack@google.com /* no sign extension needed */ 76412853Sgabeblack@google.com return *this; 76512853Sgabeblack@google.com } 76612853Sgabeblack@google.com 76712853Sgabeblack@google.com 76812853Sgabeblack@google.com // prefix and postfix increment and decrement operators 76912853Sgabeblack@google.com sc_int_base & 77012853Sgabeblack@google.com operator ++ () // prefix 77112853Sgabeblack@google.com { 77212853Sgabeblack@google.com ++m_val; 77312853Sgabeblack@google.com extend_sign(); 77412853Sgabeblack@google.com return *this; 77512853Sgabeblack@google.com } 77612853Sgabeblack@google.com 77712853Sgabeblack@google.com const sc_int_base 77812853Sgabeblack@google.com operator ++ (int) // postfix 77912853Sgabeblack@google.com { 78012853Sgabeblack@google.com sc_int_base tmp(*this); 78112853Sgabeblack@google.com ++m_val; 78212853Sgabeblack@google.com extend_sign(); 78312853Sgabeblack@google.com return tmp; 78412853Sgabeblack@google.com } 78512853Sgabeblack@google.com 78612853Sgabeblack@google.com sc_int_base & 78712853Sgabeblack@google.com operator -- () // prefix 78812853Sgabeblack@google.com { 78912853Sgabeblack@google.com --m_val; 79012853Sgabeblack@google.com extend_sign(); 79112853Sgabeblack@google.com return *this; 79212853Sgabeblack@google.com } 79312853Sgabeblack@google.com 79412853Sgabeblack@google.com const sc_int_base 79512853Sgabeblack@google.com operator -- ( int ) // postfix 79612853Sgabeblack@google.com { 79712853Sgabeblack@google.com sc_int_base tmp(*this); 79812853Sgabeblack@google.com --m_val; 79912853Sgabeblack@google.com extend_sign(); 80012853Sgabeblack@google.com return tmp; 80112853Sgabeblack@google.com } 80212853Sgabeblack@google.com 80312853Sgabeblack@google.com 80412853Sgabeblack@google.com // relational operators 80512853Sgabeblack@google.com friend bool 80612853Sgabeblack@google.com operator == (const sc_int_base &a, const sc_int_base &b) 80712853Sgabeblack@google.com { 80812853Sgabeblack@google.com return a.m_val == b.m_val; 80912853Sgabeblack@google.com } 81012853Sgabeblack@google.com 81112853Sgabeblack@google.com friend bool 81212853Sgabeblack@google.com operator != (const sc_int_base &a, const sc_int_base &b) 81312853Sgabeblack@google.com { 81412853Sgabeblack@google.com return a.m_val != b.m_val; 81512853Sgabeblack@google.com } 81612853Sgabeblack@google.com 81712853Sgabeblack@google.com friend bool 81812853Sgabeblack@google.com operator < (const sc_int_base &a, const sc_int_base &b) 81912853Sgabeblack@google.com { 82012853Sgabeblack@google.com return a.m_val < b.m_val; 82112853Sgabeblack@google.com } 82212853Sgabeblack@google.com 82312853Sgabeblack@google.com friend bool 82412853Sgabeblack@google.com operator <= (const sc_int_base &a, const sc_int_base &b) 82512853Sgabeblack@google.com { 82612853Sgabeblack@google.com return a.m_val <= b.m_val; 82712853Sgabeblack@google.com } 82812853Sgabeblack@google.com 82912853Sgabeblack@google.com friend bool 83012853Sgabeblack@google.com operator > (const sc_int_base &a, const sc_int_base &b) 83112853Sgabeblack@google.com { 83212853Sgabeblack@google.com return a.m_val > b.m_val; 83312853Sgabeblack@google.com } 83412853Sgabeblack@google.com 83512853Sgabeblack@google.com friend bool 83612853Sgabeblack@google.com operator >= (const sc_int_base &a, const sc_int_base &b) 83712853Sgabeblack@google.com { 83812853Sgabeblack@google.com return a.m_val >= b.m_val; 83912853Sgabeblack@google.com } 84012853Sgabeblack@google.com 84112853Sgabeblack@google.com 84212853Sgabeblack@google.com // bit selection 84312853Sgabeblack@google.com sc_int_bitref &operator [] (int i); 84412853Sgabeblack@google.com const sc_int_bitref_r &operator [] (int i) const; 84512853Sgabeblack@google.com 84612853Sgabeblack@google.com sc_int_bitref &bit(int i); 84712853Sgabeblack@google.com const sc_int_bitref_r &bit(int i) const; 84812853Sgabeblack@google.com 84912853Sgabeblack@google.com 85012853Sgabeblack@google.com // part selection 85112853Sgabeblack@google.com sc_int_subref &operator () (int left, int right); 85212853Sgabeblack@google.com const sc_int_subref_r &operator () (int left, int right) const; 85312853Sgabeblack@google.com 85412853Sgabeblack@google.com sc_int_subref &range(int left, int right); 85512853Sgabeblack@google.com const sc_int_subref_r &range(int left, int right) const; 85612853Sgabeblack@google.com 85712853Sgabeblack@google.com 85812853Sgabeblack@google.com // bit access, without bounds checking or sign extension 85912853Sgabeblack@google.com bool test(int i) const { return (0 != (m_val & (UINT_ONE << i))); } 86012853Sgabeblack@google.com 86112853Sgabeblack@google.com void set(int i) { m_val |= (UINT_ONE << i); } 86212853Sgabeblack@google.com 86312853Sgabeblack@google.com void 86412853Sgabeblack@google.com set(int i, bool v) 86512853Sgabeblack@google.com { 86612853Sgabeblack@google.com v ? m_val |= (UINT_ONE << i) : m_val &= ~(UINT_ONE << i); 86712853Sgabeblack@google.com } 86812853Sgabeblack@google.com 86912853Sgabeblack@google.com // capacity 87012853Sgabeblack@google.com int length() const { return m_len; } 87112853Sgabeblack@google.com 87212853Sgabeblack@google.com // concatenation support 87312853Sgabeblack@google.com virtual int 87412853Sgabeblack@google.com concat_length(bool* xz_present_p) const 87512853Sgabeblack@google.com { 87612853Sgabeblack@google.com if (xz_present_p) 87712853Sgabeblack@google.com *xz_present_p = false; 87812853Sgabeblack@google.com return length(); 87912853Sgabeblack@google.com } 88012853Sgabeblack@google.com virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const; 88112853Sgabeblack@google.com virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const; 88212853Sgabeblack@google.com virtual uint64 88312853Sgabeblack@google.com concat_get_uint64() const 88412853Sgabeblack@google.com { 88512853Sgabeblack@google.com if (m_len < 64) 88612853Sgabeblack@google.com return (uint64)(m_val & ~((uint_type) - 1 << m_len)); 88712853Sgabeblack@google.com else 88812853Sgabeblack@google.com return (uint64)m_val; 88912853Sgabeblack@google.com } 89012853Sgabeblack@google.com virtual void concat_set(int64 src, int low_i); 89112853Sgabeblack@google.com virtual void concat_set(const sc_signed &src, int low_i); 89212853Sgabeblack@google.com virtual void concat_set(const sc_unsigned &src, int low_i); 89312853Sgabeblack@google.com virtual void concat_set(uint64 src, int low_i); 89412853Sgabeblack@google.com 89512853Sgabeblack@google.com 89612853Sgabeblack@google.com // reduce methods 89712853Sgabeblack@google.com bool and_reduce() const; 89812853Sgabeblack@google.com bool nand_reduce() const { return !and_reduce(); } 89912853Sgabeblack@google.com bool or_reduce() const; 90012853Sgabeblack@google.com bool nor_reduce() const { return !or_reduce(); } 90112853Sgabeblack@google.com bool xor_reduce() const; 90212853Sgabeblack@google.com bool xnor_reduce() const { return !xor_reduce(); } 90312853Sgabeblack@google.com 90412853Sgabeblack@google.com 90512853Sgabeblack@google.com // implicit conversion to int_type 90612853Sgabeblack@google.com operator int_type() const { return m_val; } 90712853Sgabeblack@google.com 90812853Sgabeblack@google.com 90912853Sgabeblack@google.com // explicit conversions 91012853Sgabeblack@google.com int_type value() const { return operator int_type(); } 91112853Sgabeblack@google.com int to_int() const { return (int)m_val; } 91212853Sgabeblack@google.com unsigned int to_uint() const { return (unsigned int)m_val; } 91312853Sgabeblack@google.com long to_long() const { return (long)m_val; } 91412853Sgabeblack@google.com unsigned long to_ulong() const { return (unsigned long)m_val; } 91512853Sgabeblack@google.com int64 to_int64() const { return (int64)m_val; } 91612853Sgabeblack@google.com uint64 to_uint64() const { return (uint64)m_val; } 91712853Sgabeblack@google.com double to_double() const { return (double)m_val; } 91812853Sgabeblack@google.com long long_low() const { return (long)(m_val & UINT64_32ONES); } 91912853Sgabeblack@google.com long long_high() const { return (long)((m_val >> 32) & UINT64_32ONES); } 92012853Sgabeblack@google.com 92112853Sgabeblack@google.com 92212853Sgabeblack@google.com // explicit conversion to character string 92312853Sgabeblack@google.com const std::string to_string(sc_numrep numrep=SC_DEC) const; 92412853Sgabeblack@google.com const std::string to_string(sc_numrep numrep, bool w_prefix) const; 92512853Sgabeblack@google.com 92612853Sgabeblack@google.com 92712853Sgabeblack@google.com // other methods 92812853Sgabeblack@google.com void 92912853Sgabeblack@google.com print(::std::ostream &os=::std::cout) const 93012853Sgabeblack@google.com { 93112853Sgabeblack@google.com os << to_string(sc_io_base(os, SC_DEC), sc_io_show_base(os)); 93212853Sgabeblack@google.com } 93312853Sgabeblack@google.com 93412853Sgabeblack@google.com void scan(::std::istream &is=::std::cin); 93512853Sgabeblack@google.com 93612853Sgabeblack@google.com protected: 93712853Sgabeblack@google.com int_type m_val; // value 93812853Sgabeblack@google.com int m_len; // length 93912853Sgabeblack@google.com int m_ulen; // unused length 94012853Sgabeblack@google.com}; 94112853Sgabeblack@google.com 94212853Sgabeblack@google.cominline ::std::ostream &operator << (::std::ostream &, const sc_int_base &); 94312853Sgabeblack@google.cominline ::std::istream &operator >> (::std::istream &, sc_int_base &); 94412853Sgabeblack@google.com 94512853Sgabeblack@google.com 94612853Sgabeblack@google.com// ---------------------------------------------------------------------------- 94712853Sgabeblack@google.com// CLASS : sc_int_bitref_r 94812853Sgabeblack@google.com// 94912853Sgabeblack@google.com// Proxy class for sc_int bit selection (r-value only). 95012853Sgabeblack@google.com// ---------------------------------------------------------------------------- 95112853Sgabeblack@google.com 95212853Sgabeblack@google.com// implicit conversion to uint64 95312853Sgabeblack@google.com 95412853Sgabeblack@google.cominline sc_int_bitref_r::operator uint64 () const 95512853Sgabeblack@google.com{ 95612853Sgabeblack@google.com return m_obj_p->test(m_index); 95712853Sgabeblack@google.com} 95812853Sgabeblack@google.com 95912853Sgabeblack@google.cominline bool 96012853Sgabeblack@google.comsc_int_bitref_r::operator ! () const 96112853Sgabeblack@google.com{ 96212853Sgabeblack@google.com return ! m_obj_p->test(m_index); 96312853Sgabeblack@google.com} 96412853Sgabeblack@google.com 96512853Sgabeblack@google.cominline bool 96612853Sgabeblack@google.comsc_int_bitref_r::operator ~ () const 96712853Sgabeblack@google.com{ 96812853Sgabeblack@google.com return !m_obj_p->test(m_index); 96912853Sgabeblack@google.com} 97012853Sgabeblack@google.com 97112853Sgabeblack@google.com 97212853Sgabeblack@google.cominline ::std::ostream & 97312853Sgabeblack@google.comoperator << (::std::ostream &os, const sc_int_bitref_r &a) 97412853Sgabeblack@google.com{ 97512853Sgabeblack@google.com a.print(os); 97612853Sgabeblack@google.com return os; 97712853Sgabeblack@google.com} 97812853Sgabeblack@google.com 97912853Sgabeblack@google.com 98012853Sgabeblack@google.com// ---------------------------------------------------------------------------- 98112853Sgabeblack@google.com// CLASS : sc_int_bitref 98212853Sgabeblack@google.com// 98312853Sgabeblack@google.com// Proxy class for sc_int bit selection (r-value and l-value). 98412853Sgabeblack@google.com// ---------------------------------------------------------------------------- 98512853Sgabeblack@google.com 98612853Sgabeblack@google.com// assignment operators 98712853Sgabeblack@google.com 98812853Sgabeblack@google.cominline sc_int_bitref & 98912853Sgabeblack@google.comsc_int_bitref::operator = (const sc_int_bitref_r &b) 99012853Sgabeblack@google.com{ 99112853Sgabeblack@google.com m_obj_p->set(m_index, (bool)b); 99212853Sgabeblack@google.com m_obj_p->extend_sign(); 99312853Sgabeblack@google.com return *this; 99412853Sgabeblack@google.com} 99512853Sgabeblack@google.com 99612853Sgabeblack@google.cominline sc_int_bitref & 99712853Sgabeblack@google.comsc_int_bitref::operator = (const sc_int_bitref &b) 99812853Sgabeblack@google.com{ 99912853Sgabeblack@google.com m_obj_p->set(m_index, (bool)b); 100012853Sgabeblack@google.com m_obj_p->extend_sign(); 100112853Sgabeblack@google.com return *this; 100212853Sgabeblack@google.com} 100312853Sgabeblack@google.com 100412853Sgabeblack@google.cominline sc_int_bitref & 100512853Sgabeblack@google.comsc_int_bitref::operator = (bool b) 100612853Sgabeblack@google.com{ 100712853Sgabeblack@google.com m_obj_p->set(m_index, b); 100812853Sgabeblack@google.com m_obj_p->extend_sign(); 100912853Sgabeblack@google.com return *this; 101012853Sgabeblack@google.com} 101112853Sgabeblack@google.com 101212853Sgabeblack@google.com 101312853Sgabeblack@google.cominline sc_int_bitref & 101412853Sgabeblack@google.comsc_int_bitref::operator &= (bool b) 101512853Sgabeblack@google.com{ 101612853Sgabeblack@google.com if (!b) { 101712853Sgabeblack@google.com m_obj_p->set(m_index, b); 101812853Sgabeblack@google.com m_obj_p->extend_sign(); 101912853Sgabeblack@google.com } 102012853Sgabeblack@google.com return *this; 102112853Sgabeblack@google.com} 102212853Sgabeblack@google.com 102312853Sgabeblack@google.cominline sc_int_bitref & 102412853Sgabeblack@google.comsc_int_bitref::operator |= (bool b) 102512853Sgabeblack@google.com{ 102612853Sgabeblack@google.com if (b) { 102712853Sgabeblack@google.com m_obj_p->set(m_index, b); 102812853Sgabeblack@google.com m_obj_p->extend_sign(); 102912853Sgabeblack@google.com } 103012853Sgabeblack@google.com return *this; 103112853Sgabeblack@google.com} 103212853Sgabeblack@google.com 103312853Sgabeblack@google.cominline sc_int_bitref & 103412853Sgabeblack@google.comsc_int_bitref::operator ^= (bool b) 103512853Sgabeblack@google.com{ 103612853Sgabeblack@google.com if (b) { 103712853Sgabeblack@google.com m_obj_p->m_val ^= (UINT_ONE << m_index); 103812853Sgabeblack@google.com m_obj_p->extend_sign(); 103912853Sgabeblack@google.com } 104012853Sgabeblack@google.com return *this; 104112853Sgabeblack@google.com} 104212853Sgabeblack@google.com 104312853Sgabeblack@google.com 104412853Sgabeblack@google.com 104512853Sgabeblack@google.cominline ::std::istream & 104612853Sgabeblack@google.comoperator >> (::std::istream &is, sc_int_bitref &a) 104712853Sgabeblack@google.com{ 104812853Sgabeblack@google.com a.scan(is); 104912853Sgabeblack@google.com return is; 105012853Sgabeblack@google.com} 105112853Sgabeblack@google.com 105212853Sgabeblack@google.com 105312853Sgabeblack@google.com// ---------------------------------------------------------------------------- 105412853Sgabeblack@google.com// CLASS : sc_int_subref_r 105512853Sgabeblack@google.com// 105612853Sgabeblack@google.com// Proxy class for sc_int part selection (r-value only). 105712853Sgabeblack@google.com// ---------------------------------------------------------------------------- 105812853Sgabeblack@google.com 105912853Sgabeblack@google.com// implicit conversion to int_type 106012853Sgabeblack@google.com 106112853Sgabeblack@google.cominline sc_int_subref_r::operator uint_type() const 106212853Sgabeblack@google.com{ 106312853Sgabeblack@google.com uint_type /*int_type*/ val = m_obj_p->m_val; 106412853Sgabeblack@google.com int uleft = SC_INTWIDTH - (m_left + 1); 106512853Sgabeblack@google.com int uright = uleft + m_right; 106612853Sgabeblack@google.com return (val << uleft >> uright); 106712853Sgabeblack@google.com} 106812853Sgabeblack@google.com 106912853Sgabeblack@google.com 107012853Sgabeblack@google.com// reduce methods 107112853Sgabeblack@google.com 107212853Sgabeblack@google.cominline bool 107312853Sgabeblack@google.comsc_int_subref_r::and_reduce() const 107412853Sgabeblack@google.com{ 107512853Sgabeblack@google.com sc_int_base a(*this); 107612853Sgabeblack@google.com return a.and_reduce(); 107712853Sgabeblack@google.com} 107812853Sgabeblack@google.com 107912853Sgabeblack@google.cominline bool 108012853Sgabeblack@google.comsc_int_subref_r::or_reduce() const 108112853Sgabeblack@google.com{ 108212853Sgabeblack@google.com sc_int_base a(*this); 108312853Sgabeblack@google.com return a.or_reduce(); 108412853Sgabeblack@google.com} 108512853Sgabeblack@google.com 108612853Sgabeblack@google.cominline bool 108712853Sgabeblack@google.comsc_int_subref_r::xor_reduce() const 108812853Sgabeblack@google.com{ 108912853Sgabeblack@google.com sc_int_base a(*this); 109012853Sgabeblack@google.com return a.xor_reduce(); 109112853Sgabeblack@google.com} 109212853Sgabeblack@google.com 109312853Sgabeblack@google.com 109412853Sgabeblack@google.com// explicit conversions 109512853Sgabeblack@google.com 109612853Sgabeblack@google.cominline int 109712853Sgabeblack@google.comsc_int_subref_r::to_int() const 109812853Sgabeblack@google.com{ 109912853Sgabeblack@google.com int result = static_cast<int>(operator uint_type()); 110012853Sgabeblack@google.com return result; 110112853Sgabeblack@google.com} 110212853Sgabeblack@google.com 110312853Sgabeblack@google.cominline unsigned int 110412853Sgabeblack@google.comsc_int_subref_r::to_uint() const 110512853Sgabeblack@google.com{ 110612853Sgabeblack@google.com unsigned int result = static_cast<unsigned int>(operator uint_type()); 110712853Sgabeblack@google.com return result; 110812853Sgabeblack@google.com} 110912853Sgabeblack@google.com 111012853Sgabeblack@google.cominline long 111112853Sgabeblack@google.comsc_int_subref_r::to_long() const 111212853Sgabeblack@google.com{ 111312853Sgabeblack@google.com long result = static_cast<long>(operator uint_type()); 111412853Sgabeblack@google.com return result; 111512853Sgabeblack@google.com} 111612853Sgabeblack@google.com 111712853Sgabeblack@google.cominline unsigned long 111812853Sgabeblack@google.comsc_int_subref_r::to_ulong() const 111912853Sgabeblack@google.com{ 112012853Sgabeblack@google.com unsigned long result = static_cast<unsigned long>(operator uint_type()); 112112853Sgabeblack@google.com return result; 112212853Sgabeblack@google.com} 112312853Sgabeblack@google.com 112412853Sgabeblack@google.cominline int64 112512853Sgabeblack@google.comsc_int_subref_r::to_int64() const 112612853Sgabeblack@google.com{ 112712853Sgabeblack@google.com int64 result = operator uint_type(); 112812853Sgabeblack@google.com return result; 112912853Sgabeblack@google.com} 113012853Sgabeblack@google.com 113112853Sgabeblack@google.cominline uint64 113212853Sgabeblack@google.comsc_int_subref_r::to_uint64() const 113312853Sgabeblack@google.com{ 113412853Sgabeblack@google.com uint64 result = operator uint_type(); 113512853Sgabeblack@google.com return result; 113612853Sgabeblack@google.com} 113712853Sgabeblack@google.com 113812853Sgabeblack@google.cominline double 113912853Sgabeblack@google.comsc_int_subref_r::to_double() const 114012853Sgabeblack@google.com{ 114112853Sgabeblack@google.com double result = static_cast<double>(operator uint_type()); 114212853Sgabeblack@google.com return result; 114312853Sgabeblack@google.com} 114412853Sgabeblack@google.com 114512853Sgabeblack@google.com 114612853Sgabeblack@google.com// explicit conversion to character string 114712853Sgabeblack@google.com 114812853Sgabeblack@google.cominline const std::string 114912853Sgabeblack@google.comsc_int_subref_r::to_string(sc_numrep numrep) const 115012853Sgabeblack@google.com{ 115112853Sgabeblack@google.com sc_uint_base a(length()); 115212853Sgabeblack@google.com a = operator uint_type(); 115312853Sgabeblack@google.com return a.to_string(numrep); 115412853Sgabeblack@google.com} 115512853Sgabeblack@google.com 115612853Sgabeblack@google.cominline const std::string 115712853Sgabeblack@google.comsc_int_subref_r::to_string(sc_numrep numrep, bool w_prefix) const 115812853Sgabeblack@google.com{ 115912853Sgabeblack@google.com sc_uint_base a(length()); 116012853Sgabeblack@google.com a = operator uint_type(); 116112853Sgabeblack@google.com return a.to_string(numrep, w_prefix); 116212853Sgabeblack@google.com} 116312853Sgabeblack@google.com 116412853Sgabeblack@google.com 116512853Sgabeblack@google.com// functional notation for the reduce methods 116612853Sgabeblack@google.com 116712853Sgabeblack@google.cominline bool 116812853Sgabeblack@google.comand_reduce(const sc_int_subref_r &a) 116912853Sgabeblack@google.com{ 117012853Sgabeblack@google.com return a.and_reduce(); 117112853Sgabeblack@google.com} 117212853Sgabeblack@google.com 117312853Sgabeblack@google.cominline bool 117412853Sgabeblack@google.comnand_reduce(const sc_int_subref_r &a) 117512853Sgabeblack@google.com{ 117612853Sgabeblack@google.com return a.nand_reduce(); 117712853Sgabeblack@google.com} 117812853Sgabeblack@google.com 117912853Sgabeblack@google.cominline bool 118012853Sgabeblack@google.comor_reduce(const sc_int_subref_r &a) 118112853Sgabeblack@google.com{ 118212853Sgabeblack@google.com return a.or_reduce(); 118312853Sgabeblack@google.com} 118412853Sgabeblack@google.com 118512853Sgabeblack@google.cominline bool 118612853Sgabeblack@google.comnor_reduce(const sc_int_subref_r &a) 118712853Sgabeblack@google.com{ 118812853Sgabeblack@google.com return a.nor_reduce(); 118912853Sgabeblack@google.com} 119012853Sgabeblack@google.com 119112853Sgabeblack@google.cominline bool 119212853Sgabeblack@google.comxor_reduce(const sc_int_subref_r &a) 119312853Sgabeblack@google.com{ 119412853Sgabeblack@google.com return a.xor_reduce(); 119512853Sgabeblack@google.com} 119612853Sgabeblack@google.com 119712853Sgabeblack@google.cominline bool 119812853Sgabeblack@google.comxnor_reduce(const sc_int_subref_r &a) 119912853Sgabeblack@google.com{ 120012853Sgabeblack@google.com return a.xnor_reduce(); 120112853Sgabeblack@google.com} 120212853Sgabeblack@google.com 120312853Sgabeblack@google.com 120412853Sgabeblack@google.com 120512853Sgabeblack@google.cominline ::std::ostream & 120612853Sgabeblack@google.comoperator << (::std::ostream &os, const sc_int_subref_r &a) 120712853Sgabeblack@google.com{ 120812853Sgabeblack@google.com a.print(os); 120912853Sgabeblack@google.com return os; 121012853Sgabeblack@google.com} 121112853Sgabeblack@google.com 121212853Sgabeblack@google.com 121312853Sgabeblack@google.com// ---------------------------------------------------------------------------- 121412853Sgabeblack@google.com// CLASS : sc_int_subref 121512853Sgabeblack@google.com// 121612853Sgabeblack@google.com// Proxy class for sc_int part selection (r-value and l-value). 121712853Sgabeblack@google.com// ---------------------------------------------------------------------------- 121812853Sgabeblack@google.com 121912853Sgabeblack@google.com// assignment operators 122012853Sgabeblack@google.com 122112853Sgabeblack@google.cominline sc_int_subref & 122212853Sgabeblack@google.comsc_int_subref::operator = (const sc_int_base &a) 122312853Sgabeblack@google.com{ 122412853Sgabeblack@google.com return operator = (a.operator int_type()); 122512853Sgabeblack@google.com} 122612853Sgabeblack@google.com 122712853Sgabeblack@google.cominline sc_int_subref & 122812853Sgabeblack@google.comsc_int_subref::operator = (const char *a) 122912853Sgabeblack@google.com{ 123012853Sgabeblack@google.com sc_int_base aa(length()); 123112853Sgabeblack@google.com return (*this = aa = a); 123212853Sgabeblack@google.com} 123312853Sgabeblack@google.com 123412853Sgabeblack@google.com 123512853Sgabeblack@google.com 123612853Sgabeblack@google.cominline ::std::istream & 123712853Sgabeblack@google.comoperator >> (::std::istream &is, sc_int_subref &a) 123812853Sgabeblack@google.com{ 123912853Sgabeblack@google.com a.scan(is); 124012853Sgabeblack@google.com return is; 124112853Sgabeblack@google.com} 124212853Sgabeblack@google.com 124312853Sgabeblack@google.com 124412853Sgabeblack@google.com// ---------------------------------------------------------------------------- 124512853Sgabeblack@google.com// CLASS : sc_int_base 124612853Sgabeblack@google.com// 124712853Sgabeblack@google.com// Base class for sc_int. 124812853Sgabeblack@google.com// ---------------------------------------------------------------------------- 124912853Sgabeblack@google.com 125012853Sgabeblack@google.com// bit selection 125112853Sgabeblack@google.com 125212853Sgabeblack@google.cominline sc_int_bitref & 125312853Sgabeblack@google.comsc_int_base::operator [] (int i) 125412853Sgabeblack@google.com{ 125512853Sgabeblack@google.com check_index(i); 125612853Sgabeblack@google.com sc_int_bitref *result_p = sc_int_bitref::m_pool.allocate(); 125712853Sgabeblack@google.com result_p->initialize(this, i); 125812853Sgabeblack@google.com return *result_p; 125912853Sgabeblack@google.com} 126012853Sgabeblack@google.com 126112853Sgabeblack@google.cominline const sc_int_bitref_r & 126212853Sgabeblack@google.comsc_int_base::operator [] (int i) const 126312853Sgabeblack@google.com{ 126412853Sgabeblack@google.com check_index(i); 126512853Sgabeblack@google.com sc_int_bitref *result_p = sc_int_bitref::m_pool.allocate(); 126612853Sgabeblack@google.com result_p->initialize(this, i); 126712853Sgabeblack@google.com return *result_p; 126812853Sgabeblack@google.com} 126912853Sgabeblack@google.com 127012853Sgabeblack@google.com 127112853Sgabeblack@google.cominline sc_int_bitref & 127212853Sgabeblack@google.comsc_int_base::bit(int i) 127312853Sgabeblack@google.com{ 127412853Sgabeblack@google.com check_index(i); 127512853Sgabeblack@google.com sc_int_bitref *result_p = sc_int_bitref::m_pool.allocate(); 127612853Sgabeblack@google.com result_p->initialize(this, i); 127712853Sgabeblack@google.com return *result_p; 127812853Sgabeblack@google.com} 127912853Sgabeblack@google.com 128012853Sgabeblack@google.cominline const sc_int_bitref_r & 128112853Sgabeblack@google.comsc_int_base::bit(int i) const 128212853Sgabeblack@google.com{ 128312853Sgabeblack@google.com check_index(i); 128412853Sgabeblack@google.com sc_int_bitref *result_p = sc_int_bitref::m_pool.allocate(); 128512853Sgabeblack@google.com result_p->initialize(this, i); 128612853Sgabeblack@google.com return *result_p; 128712853Sgabeblack@google.com} 128812853Sgabeblack@google.com 128912853Sgabeblack@google.com 129012853Sgabeblack@google.com// part selection 129112853Sgabeblack@google.com 129212853Sgabeblack@google.cominline sc_int_subref & 129312853Sgabeblack@google.comsc_int_base::operator () (int left, int right) 129412853Sgabeblack@google.com{ 129512853Sgabeblack@google.com check_range(left, right); 129612853Sgabeblack@google.com sc_int_subref *result_p = sc_int_subref::m_pool.allocate(); 129712853Sgabeblack@google.com result_p->initialize(this, left, right); 129812853Sgabeblack@google.com return *result_p; 129912853Sgabeblack@google.com} 130012853Sgabeblack@google.com 130112853Sgabeblack@google.cominline const sc_int_subref_r & 130212853Sgabeblack@google.comsc_int_base::operator () (int left, int right) const 130312853Sgabeblack@google.com{ 130412853Sgabeblack@google.com check_range(left, right); 130512853Sgabeblack@google.com sc_int_subref *result_p = sc_int_subref::m_pool.allocate(); 130612853Sgabeblack@google.com result_p->initialize(this, left, right); 130712853Sgabeblack@google.com return *result_p; 130812853Sgabeblack@google.com} 130912853Sgabeblack@google.com 131012853Sgabeblack@google.com 131112853Sgabeblack@google.cominline sc_int_subref & 131212853Sgabeblack@google.comsc_int_base::range(int left, int right) 131312853Sgabeblack@google.com{ 131412853Sgabeblack@google.com check_range(left, right); 131512853Sgabeblack@google.com sc_int_subref *result_p = sc_int_subref::m_pool.allocate(); 131612853Sgabeblack@google.com result_p->initialize(this, left, right); 131712853Sgabeblack@google.com return *result_p; 131812853Sgabeblack@google.com} 131912853Sgabeblack@google.com 132012853Sgabeblack@google.cominline const sc_int_subref_r & 132112853Sgabeblack@google.comsc_int_base::range(int left, int right) const 132212853Sgabeblack@google.com{ 132312853Sgabeblack@google.com check_range(left, right); 132412853Sgabeblack@google.com sc_int_subref *result_p = sc_int_subref::m_pool.allocate(); 132512853Sgabeblack@google.com result_p->initialize(this, left, right); 132612853Sgabeblack@google.com return *result_p; 132712853Sgabeblack@google.com} 132812853Sgabeblack@google.com 132912853Sgabeblack@google.com 133012853Sgabeblack@google.com// functional notation for the reduce methods 133112853Sgabeblack@google.com 133212853Sgabeblack@google.cominline bool 133312853Sgabeblack@google.comand_reduce(const sc_int_base &a) 133412853Sgabeblack@google.com{ 133512853Sgabeblack@google.com return a.and_reduce(); 133612853Sgabeblack@google.com} 133712853Sgabeblack@google.com 133812853Sgabeblack@google.cominline bool 133912853Sgabeblack@google.comnand_reduce(const sc_int_base &a) 134012853Sgabeblack@google.com{ 134112853Sgabeblack@google.com return a.nand_reduce(); 134212853Sgabeblack@google.com} 134312853Sgabeblack@google.com 134412853Sgabeblack@google.cominline bool 134512853Sgabeblack@google.comor_reduce(const sc_int_base &a) 134612853Sgabeblack@google.com{ 134712853Sgabeblack@google.com return a.or_reduce(); 134812853Sgabeblack@google.com} 134912853Sgabeblack@google.com 135012853Sgabeblack@google.cominline bool 135112853Sgabeblack@google.comnor_reduce(const sc_int_base &a) 135212853Sgabeblack@google.com{ 135312853Sgabeblack@google.com return a.nor_reduce(); 135412853Sgabeblack@google.com} 135512853Sgabeblack@google.com 135612853Sgabeblack@google.cominline bool 135712853Sgabeblack@google.comxor_reduce(const sc_int_base &a) 135812853Sgabeblack@google.com{ 135912853Sgabeblack@google.com return a.xor_reduce(); 136012853Sgabeblack@google.com} 136112853Sgabeblack@google.com 136212853Sgabeblack@google.cominline bool 136312853Sgabeblack@google.comxnor_reduce(const sc_int_base &a) 136412853Sgabeblack@google.com{ 136512853Sgabeblack@google.com return a.xnor_reduce(); 136612853Sgabeblack@google.com} 136712853Sgabeblack@google.com 136812853Sgabeblack@google.com 136912853Sgabeblack@google.com 137012853Sgabeblack@google.cominline ::std::ostream & 137112853Sgabeblack@google.comoperator << (::std::ostream &os, const sc_int_base &a) 137212853Sgabeblack@google.com{ 137312853Sgabeblack@google.com a.print(os); 137412853Sgabeblack@google.com return os; 137512853Sgabeblack@google.com} 137612853Sgabeblack@google.com 137712853Sgabeblack@google.cominline ::std::istream & 137812853Sgabeblack@google.comoperator >> (::std::istream &is, sc_int_base &a) 137912853Sgabeblack@google.com{ 138012853Sgabeblack@google.com a.scan(is); 138112853Sgabeblack@google.com return is; 138212853Sgabeblack@google.com} 138312853Sgabeblack@google.com 138412853Sgabeblack@google.com} // namespace sc_dt 138512853Sgabeblack@google.com 138612853Sgabeblack@google.com#endif // __SYSTEMC_EXT_DT_INT_SC_INT_BASE_HH__ 1387