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_proxy.h -- Proxy base class for vector data types. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de This class is created for several purposes: 2512027Sjungma@eit.uni-kl.de 1) hiding operators from the global namespace that would be 2612027Sjungma@eit.uni-kl.de otherwise found by Koenig lookup 2712027Sjungma@eit.uni-kl.de 2) avoiding repeating the same operations in every class 2812027Sjungma@eit.uni-kl.de including proxies that could also be achieved by common 2912027Sjungma@eit.uni-kl.de base class, but this method allows 3012027Sjungma@eit.uni-kl.de 3) improve performance by using non-virtual functions 3112027Sjungma@eit.uni-kl.de 3212027Sjungma@eit.uni-kl.de Original Author: Gene Bushuyev, Synopsys, Inc. 3312027Sjungma@eit.uni-kl.de 3412027Sjungma@eit.uni-kl.de *****************************************************************************/ 3512027Sjungma@eit.uni-kl.de 3612027Sjungma@eit.uni-kl.de/***************************************************************************** 3712027Sjungma@eit.uni-kl.de 3812027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3912027Sjungma@eit.uni-kl.de changes you are making here. 4012027Sjungma@eit.uni-kl.de 4112027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 4212027Sjungma@eit.uni-kl.de Description of Modification: 4312027Sjungma@eit.uni-kl.de 4412027Sjungma@eit.uni-kl.de *****************************************************************************/ 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.de// $Log: sc_proxy.h,v $ 4712027Sjungma@eit.uni-kl.de// Revision 1.3 2010/12/07 20:09:07 acg 4812027Sjungma@eit.uni-kl.de// Andy Goodrich: Fix for returning enough data 4912027Sjungma@eit.uni-kl.de// 5012027Sjungma@eit.uni-kl.de// Revision 1.2 2009/02/28 00:26:14 acg 5112027Sjungma@eit.uni-kl.de// Andy Goodrich: bug fixes. 5212027Sjungma@eit.uni-kl.de// 5312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:31:36 acg 5412027Sjungma@eit.uni-kl.de// SystemC 2.2 5512027Sjungma@eit.uni-kl.de// 5612027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:53:53 acg 5712027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in 5812027Sjungma@eit.uni-kl.de// the source. 5912027Sjungma@eit.uni-kl.de// 6012027Sjungma@eit.uni-kl.de 6112027Sjungma@eit.uni-kl.de#ifndef SC_PROXY_H 6212027Sjungma@eit.uni-kl.de#define SC_PROXY_H 6312027Sjungma@eit.uni-kl.de 6412027Sjungma@eit.uni-kl.de 6512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cmnhdr.h" 6612027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_iostream.h" 6712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h" 6812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h" 6912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_base.h" 7012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h" 7112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit.h" 7212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit_ids.h" 7312027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_logic.h" 7412027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_macros.h" 7512027Sjungma@eit.uni-kl.de 7612027Sjungma@eit.uni-kl.de 7712027Sjungma@eit.uni-kl.denamespace sc_dt 7812027Sjungma@eit.uni-kl.de{ 7912027Sjungma@eit.uni-kl.de 8012027Sjungma@eit.uni-kl.de// classes defined in this module 8112027Sjungma@eit.uni-kl.detemplate <class X> class sc_proxy; 8212027Sjungma@eit.uni-kl.de 8312027Sjungma@eit.uni-kl.de// forward class declarations 8412027Sjungma@eit.uni-kl.declass sc_bv_base; 8512027Sjungma@eit.uni-kl.declass sc_lv_base; 8612027Sjungma@eit.uni-kl.detemplate <class X> class sc_bitref_r; 8712027Sjungma@eit.uni-kl.detemplate <class X> class sc_bitref; 8812027Sjungma@eit.uni-kl.detemplate <class X> class sc_subref_r; 8912027Sjungma@eit.uni-kl.detemplate <class X> class sc_subref; 9012027Sjungma@eit.uni-kl.detemplate <class X, class Y> class sc_concref_r; 9112027Sjungma@eit.uni-kl.detemplate <class X, class Y> class sc_concref; 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.de 9412027Sjungma@eit.uni-kl.deconst int SC_DIGIT_SIZE = BITS_PER_BYTE * sizeof( sc_digit ); 9512027Sjungma@eit.uni-kl.de 9612027Sjungma@eit.uni-kl.deconst sc_digit SC_DIGIT_ZERO = (sc_digit)0; 9712027Sjungma@eit.uni-kl.deconst sc_digit SC_DIGIT_ONE = (sc_digit)1; 9812027Sjungma@eit.uni-kl.deconst sc_digit SC_DIGIT_TWO = (sc_digit)2; 9912027Sjungma@eit.uni-kl.de 10012027Sjungma@eit.uni-kl.de 10112027Sjungma@eit.uni-kl.de// assignment functions; forward declarations 10212027Sjungma@eit.uni-kl.de 10312027Sjungma@eit.uni-kl.detemplate <class X, class Y> 10412027Sjungma@eit.uni-kl.deinline 10512027Sjungma@eit.uni-kl.devoid 10612027Sjungma@eit.uni-kl.deassign_p_( sc_proxy<X>& px, const sc_proxy<Y>& py ); 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.de// Vector types that are not derived from sc_proxy must have a length() 10912027Sjungma@eit.uni-kl.de// function and an operator []. 11012027Sjungma@eit.uni-kl.de 11112027Sjungma@eit.uni-kl.detemplate <class X, class T> 11212027Sjungma@eit.uni-kl.deinline 11312027Sjungma@eit.uni-kl.devoid 11412027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const T& a ); 11512027Sjungma@eit.uni-kl.de 11612027Sjungma@eit.uni-kl.de 11712027Sjungma@eit.uni-kl.de// other functions; forward declarations 11812027Sjungma@eit.uni-kl.de 11912027Sjungma@eit.uni-kl.deconst std::string convert_to_bin( const char* s ); 12012027Sjungma@eit.uni-kl.deconst std::string convert_to_fmt( const std::string& s, sc_numrep numrep, bool ); 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 12312027Sjungma@eit.uni-kl.de// CLASS TEMPLATE : sc_proxy_traits 12412027Sjungma@eit.uni-kl.de// 12512027Sjungma@eit.uni-kl.de// Template traits helper to select the correct bit/value/vector_types for 12612027Sjungma@eit.uni-kl.de// sc_proxy-based vector classes. 12712027Sjungma@eit.uni-kl.de// 12812027Sjungma@eit.uni-kl.de// All types derived from/based on a bit-vector contain typedef to a plain bool, 12912027Sjungma@eit.uni-kl.de// all others point to the sc_logic_value_t/sc_logic/sc_lv_base types. 13012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 13112027Sjungma@eit.uni-kl.de 13212027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits; 13312027Sjungma@eit.uni-kl.de 13412027Sjungma@eit.uni-kl.detemplate<> struct sc_proxy_traits<sc_bv_base> 13512027Sjungma@eit.uni-kl.de{ 13612027Sjungma@eit.uni-kl.de typedef sc_proxy_traits<sc_bv_base> traits_type; 13712027Sjungma@eit.uni-kl.de typedef bool value_type; 13812027Sjungma@eit.uni-kl.de typedef bool bit_type; 13912027Sjungma@eit.uni-kl.de typedef sc_bv_base vector_type; 14012027Sjungma@eit.uni-kl.de typedef traits_type type; 14112027Sjungma@eit.uni-kl.de}; 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.detemplate<> struct sc_proxy_traits<sc_lv_base> 14412027Sjungma@eit.uni-kl.de{ 14512027Sjungma@eit.uni-kl.de typedef sc_proxy_traits<sc_lv_base> traits_type; 14612027Sjungma@eit.uni-kl.de typedef sc_logic_value_t value_type; 14712027Sjungma@eit.uni-kl.de typedef sc_logic bit_type; 14812027Sjungma@eit.uni-kl.de typedef sc_lv_base vector_type; 14912027Sjungma@eit.uni-kl.de typedef traits_type type; 15012027Sjungma@eit.uni-kl.de}; 15112027Sjungma@eit.uni-kl.de 15212027Sjungma@eit.uni-kl.de 15312027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_bitref_r<X> > 15412027Sjungma@eit.uni-kl.de : sc_proxy_traits<X> {}; 15512027Sjungma@eit.uni-kl.de 15612027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_bitref<X> > 15712027Sjungma@eit.uni-kl.de : sc_proxy_traits<X> {}; 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de 16012027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_subref_r<X> > 16112027Sjungma@eit.uni-kl.de : sc_proxy_traits<X> {}; 16212027Sjungma@eit.uni-kl.de 16312027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_subref<X> > 16412027Sjungma@eit.uni-kl.de : sc_proxy_traits<X> {}; 16512027Sjungma@eit.uni-kl.de 16612027Sjungma@eit.uni-kl.de 16712027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_proxy_traits<sc_proxy<X> > 16812027Sjungma@eit.uni-kl.de : sc_proxy_traits<X> {}; 16912027Sjungma@eit.uni-kl.de 17012027Sjungma@eit.uni-kl.de 17112027Sjungma@eit.uni-kl.detemplate< typename X, typename Y > struct sc_mixed_proxy_traits_helper 17212027Sjungma@eit.uni-kl.de : sc_proxy_traits<sc_lv_base> {}; // logic vector by default 17312027Sjungma@eit.uni-kl.de 17412027Sjungma@eit.uni-kl.detemplate<typename X> struct sc_mixed_proxy_traits_helper<X,X> 17512027Sjungma@eit.uni-kl.de : X {}; 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.de 17812027Sjungma@eit.uni-kl.detemplate<typename X, typename Y> struct sc_proxy_traits< sc_concref_r<X,Y> > 17912027Sjungma@eit.uni-kl.de : sc_mixed_proxy_traits_helper< typename X::traits_type::type 18012027Sjungma@eit.uni-kl.de , typename Y::traits_type::type > 18112027Sjungma@eit.uni-kl.de{}; 18212027Sjungma@eit.uni-kl.de 18312027Sjungma@eit.uni-kl.detemplate<typename X, typename Y> struct sc_proxy_traits<sc_concref<X,Y> > 18412027Sjungma@eit.uni-kl.de : sc_mixed_proxy_traits_helper< typename X::traits_type::type 18512027Sjungma@eit.uni-kl.de , typename Y::traits_type::type > 18612027Sjungma@eit.uni-kl.de{}; 18712027Sjungma@eit.uni-kl.de 18812027Sjungma@eit.uni-kl.de 18912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 19012027Sjungma@eit.uni-kl.de// CLASS TEMPLATE : sc_proxy 19112027Sjungma@eit.uni-kl.de// 19212027Sjungma@eit.uni-kl.de// Base class template for bit/logic vector classes. 19312027Sjungma@eit.uni-kl.de// (Barton/Nackmann implementation) 19412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 19512027Sjungma@eit.uni-kl.de 19612027Sjungma@eit.uni-kl.detemplate <class X> 19712027Sjungma@eit.uni-kl.declass sc_proxy // #### : public sc_value_base 19812027Sjungma@eit.uni-kl.de{ 19912027Sjungma@eit.uni-kl.depublic: 20012027Sjungma@eit.uni-kl.de typedef typename sc_proxy_traits<X>::type traits_type; 20112027Sjungma@eit.uni-kl.de typedef typename traits_type::bit_type bit_type; 20212027Sjungma@eit.uni-kl.de 20312027Sjungma@eit.uni-kl.de // virtual destructor 20412027Sjungma@eit.uni-kl.de 20512027Sjungma@eit.uni-kl.de virtual ~sc_proxy() {} 20612027Sjungma@eit.uni-kl.de 20712027Sjungma@eit.uni-kl.de 20812027Sjungma@eit.uni-kl.de // casts 20912027Sjungma@eit.uni-kl.de 21012027Sjungma@eit.uni-kl.de X& back_cast() 21112027Sjungma@eit.uni-kl.de { return SCAST<X&>( *this ); } 21212027Sjungma@eit.uni-kl.de 21312027Sjungma@eit.uni-kl.de const X& back_cast() const 21412027Sjungma@eit.uni-kl.de { return SCAST<const X&>( *this ); } 21512027Sjungma@eit.uni-kl.de 21612027Sjungma@eit.uni-kl.de 21712027Sjungma@eit.uni-kl.de // assignment operators 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.de template <class Y> 22012027Sjungma@eit.uni-kl.de X& assign_( const sc_proxy<Y>& a ) 22112027Sjungma@eit.uni-kl.de { assign_p_( *this, a ); return back_cast(); } 22212027Sjungma@eit.uni-kl.de 22312027Sjungma@eit.uni-kl.de X& assign_( const char* a ); 22412027Sjungma@eit.uni-kl.de X& assign_( const bool* a ); 22512027Sjungma@eit.uni-kl.de X& assign_( const sc_logic* a ); 22612027Sjungma@eit.uni-kl.de 22712027Sjungma@eit.uni-kl.de X& assign_( const sc_unsigned& a ) 22812027Sjungma@eit.uni-kl.de { assign_v_( *this, a ); return back_cast(); } 22912027Sjungma@eit.uni-kl.de 23012027Sjungma@eit.uni-kl.de X& assign_( const sc_signed& a ) 23112027Sjungma@eit.uni-kl.de { assign_v_( *this, a ); return back_cast(); } 23212027Sjungma@eit.uni-kl.de 23312027Sjungma@eit.uni-kl.de X& assign_( const sc_uint_base& a ) 23412027Sjungma@eit.uni-kl.de { return assign_( (uint64) a ); } 23512027Sjungma@eit.uni-kl.de 23612027Sjungma@eit.uni-kl.de X& assign_( const sc_int_base& a ) 23712027Sjungma@eit.uni-kl.de { return assign_( (int64) a ); } 23812027Sjungma@eit.uni-kl.de 23912027Sjungma@eit.uni-kl.de X& assign_( unsigned int a ); 24012027Sjungma@eit.uni-kl.de X& assign_( int a ); 24112027Sjungma@eit.uni-kl.de 24212027Sjungma@eit.uni-kl.de X& assign_( unsigned long a ); 24312027Sjungma@eit.uni-kl.de 24412027Sjungma@eit.uni-kl.de X& assign_( long a ); 24512027Sjungma@eit.uni-kl.de 24612027Sjungma@eit.uni-kl.de X& assign_( uint64 a ); 24712027Sjungma@eit.uni-kl.de X& assign_( int64 a ); 24812027Sjungma@eit.uni-kl.de 24912027Sjungma@eit.uni-kl.de 25012027Sjungma@eit.uni-kl.de // bitwise operators and functions 25112027Sjungma@eit.uni-kl.de 25212027Sjungma@eit.uni-kl.de // bitwise complement 25312027Sjungma@eit.uni-kl.de 25412027Sjungma@eit.uni-kl.de X& b_not(); 25512027Sjungma@eit.uni-kl.de 25612027Sjungma@eit.uni-kl.de const sc_lv_base operator ~ () const; 25712027Sjungma@eit.uni-kl.de 25812027Sjungma@eit.uni-kl.de 25912027Sjungma@eit.uni-kl.de // bitwise and 26012027Sjungma@eit.uni-kl.de 26112027Sjungma@eit.uni-kl.de X& operator &= ( const char* b ); 26212027Sjungma@eit.uni-kl.de X& operator &= ( const bool* b ); 26312027Sjungma@eit.uni-kl.de X& operator &= ( const sc_logic* b ); 26412027Sjungma@eit.uni-kl.de X& operator &= ( const sc_unsigned& b ); 26512027Sjungma@eit.uni-kl.de X& operator &= ( const sc_signed& b ); 26612027Sjungma@eit.uni-kl.de 26712027Sjungma@eit.uni-kl.de X& operator &= ( const sc_uint_base& b ) 26812027Sjungma@eit.uni-kl.de { return operator &= ( (uint64) b ); } 26912027Sjungma@eit.uni-kl.de 27012027Sjungma@eit.uni-kl.de X& operator &= ( const sc_int_base& b ) 27112027Sjungma@eit.uni-kl.de { return operator &= ( (int64) b ); } 27212027Sjungma@eit.uni-kl.de 27312027Sjungma@eit.uni-kl.de X& operator &= ( unsigned long b ); 27412027Sjungma@eit.uni-kl.de X& operator &= ( long b ); 27512027Sjungma@eit.uni-kl.de 27612027Sjungma@eit.uni-kl.de X& operator &= ( unsigned int b ) 27712027Sjungma@eit.uni-kl.de { return operator &= ( (unsigned long) b ); } 27812027Sjungma@eit.uni-kl.de 27912027Sjungma@eit.uni-kl.de X& operator &= ( int b ) 28012027Sjungma@eit.uni-kl.de { return operator &= ( (long) b ); } 28112027Sjungma@eit.uni-kl.de 28212027Sjungma@eit.uni-kl.de X& operator &= ( uint64 b ); 28312027Sjungma@eit.uni-kl.de X& operator &= ( int64 b ); 28412027Sjungma@eit.uni-kl.de 28512027Sjungma@eit.uni-kl.de 28612027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( const char* b ) const; 28712027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( const bool* b ) const; 28812027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( const sc_logic* b ) const; 28912027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( const sc_unsigned& b ) const; 29012027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( const sc_signed& b ) const; 29112027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( const sc_uint_base& b ) const; 29212027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( const sc_int_base& b ) const; 29312027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( unsigned long b ) const; 29412027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( long b ) const; 29512027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( unsigned int b ) const; 29612027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( int b ) const; 29712027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( uint64 b ) const; 29812027Sjungma@eit.uni-kl.de const sc_lv_base operator & ( int64 b ) const; 29912027Sjungma@eit.uni-kl.de 30012027Sjungma@eit.uni-kl.de 30112027Sjungma@eit.uni-kl.de // bitwise or 30212027Sjungma@eit.uni-kl.de 30312027Sjungma@eit.uni-kl.de X& operator |= ( const char* b ); 30412027Sjungma@eit.uni-kl.de X& operator |= ( const bool* b ); 30512027Sjungma@eit.uni-kl.de X& operator |= ( const sc_logic* b ); 30612027Sjungma@eit.uni-kl.de X& operator |= ( const sc_unsigned& b ); 30712027Sjungma@eit.uni-kl.de X& operator |= ( const sc_signed& b ); 30812027Sjungma@eit.uni-kl.de 30912027Sjungma@eit.uni-kl.de X& operator |= ( const sc_uint_base& b ) 31012027Sjungma@eit.uni-kl.de { return operator |= ( (uint64) b ); } 31112027Sjungma@eit.uni-kl.de 31212027Sjungma@eit.uni-kl.de X& operator |= ( const sc_int_base& b ) 31312027Sjungma@eit.uni-kl.de { return operator |= ( (int64) b ); } 31412027Sjungma@eit.uni-kl.de 31512027Sjungma@eit.uni-kl.de X& operator |= ( unsigned long b ); 31612027Sjungma@eit.uni-kl.de X& operator |= ( long b ); 31712027Sjungma@eit.uni-kl.de 31812027Sjungma@eit.uni-kl.de X& operator |= ( unsigned int b ) 31912027Sjungma@eit.uni-kl.de { return operator |= ( (unsigned long) b ); } 32012027Sjungma@eit.uni-kl.de 32112027Sjungma@eit.uni-kl.de X& operator |= ( int b ) 32212027Sjungma@eit.uni-kl.de { return operator |= ( (long) b ); } 32312027Sjungma@eit.uni-kl.de 32412027Sjungma@eit.uni-kl.de X& operator |= ( uint64 b ); 32512027Sjungma@eit.uni-kl.de X& operator |= ( int64 b ); 32612027Sjungma@eit.uni-kl.de 32712027Sjungma@eit.uni-kl.de 32812027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( const char* b ) const; 32912027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( const bool* b ) const; 33012027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( const sc_logic* b ) const; 33112027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( const sc_unsigned& b ) const; 33212027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( const sc_signed& b ) const; 33312027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( const sc_uint_base& b ) const; 33412027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( const sc_int_base& b ) const; 33512027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( unsigned long b ) const; 33612027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( long b ) const; 33712027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( unsigned int b ) const; 33812027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( int b ) const; 33912027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( uint64 b ) const; 34012027Sjungma@eit.uni-kl.de const sc_lv_base operator | ( int64 b ) const; 34112027Sjungma@eit.uni-kl.de 34212027Sjungma@eit.uni-kl.de 34312027Sjungma@eit.uni-kl.de // bitwise xor 34412027Sjungma@eit.uni-kl.de 34512027Sjungma@eit.uni-kl.de X& operator ^= ( const char* b ); 34612027Sjungma@eit.uni-kl.de X& operator ^= ( const bool* b ); 34712027Sjungma@eit.uni-kl.de X& operator ^= ( const sc_logic* b ); 34812027Sjungma@eit.uni-kl.de X& operator ^= ( const sc_unsigned& b ); 34912027Sjungma@eit.uni-kl.de X& operator ^= ( const sc_signed& b ); 35012027Sjungma@eit.uni-kl.de 35112027Sjungma@eit.uni-kl.de X& operator ^= ( const sc_uint_base& b ) 35212027Sjungma@eit.uni-kl.de { return operator ^= ( (uint64) b ); } 35312027Sjungma@eit.uni-kl.de 35412027Sjungma@eit.uni-kl.de X& operator ^= ( const sc_int_base& b ) 35512027Sjungma@eit.uni-kl.de { return operator ^= ( (int64) b ); } 35612027Sjungma@eit.uni-kl.de 35712027Sjungma@eit.uni-kl.de X& operator ^= ( unsigned long b ); 35812027Sjungma@eit.uni-kl.de X& operator ^= ( long b ); 35912027Sjungma@eit.uni-kl.de 36012027Sjungma@eit.uni-kl.de X& operator ^= ( unsigned int b ) 36112027Sjungma@eit.uni-kl.de { return operator ^= ( (unsigned long) b ); } 36212027Sjungma@eit.uni-kl.de 36312027Sjungma@eit.uni-kl.de X& operator ^= ( int b ) 36412027Sjungma@eit.uni-kl.de { return operator ^= ( (long) b ); } 36512027Sjungma@eit.uni-kl.de 36612027Sjungma@eit.uni-kl.de X& operator ^= ( uint64 b ); 36712027Sjungma@eit.uni-kl.de X& operator ^= ( int64 b ); 36812027Sjungma@eit.uni-kl.de 36912027Sjungma@eit.uni-kl.de 37012027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( const char* b ) const; 37112027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( const bool* b ) const; 37212027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( const sc_logic* b ) const; 37312027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( const sc_unsigned& b ) const; 37412027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( const sc_signed& b ) const; 37512027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( const sc_uint_base& b ) const; 37612027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( const sc_int_base& b ) const; 37712027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( unsigned long b ) const; 37812027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( long b ) const; 37912027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( unsigned int b ) const; 38012027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( int b ) const; 38112027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( uint64 b ) const; 38212027Sjungma@eit.uni-kl.de const sc_lv_base operator ^ ( int64 b ) const; 38312027Sjungma@eit.uni-kl.de 38412027Sjungma@eit.uni-kl.de 38512027Sjungma@eit.uni-kl.de // bitwise left shift 38612027Sjungma@eit.uni-kl.de 38712027Sjungma@eit.uni-kl.de X& operator <<= ( int n ); 38812027Sjungma@eit.uni-kl.de 38912027Sjungma@eit.uni-kl.de const sc_lv_base operator << ( int n ) const; 39012027Sjungma@eit.uni-kl.de 39112027Sjungma@eit.uni-kl.de 39212027Sjungma@eit.uni-kl.de // bitwise right shift 39312027Sjungma@eit.uni-kl.de 39412027Sjungma@eit.uni-kl.de X& operator >>= ( int n ); 39512027Sjungma@eit.uni-kl.de 39612027Sjungma@eit.uni-kl.de const sc_lv_base operator >> ( int n ) const; 39712027Sjungma@eit.uni-kl.de 39812027Sjungma@eit.uni-kl.de 39912027Sjungma@eit.uni-kl.de // bitwise left rotate 40012027Sjungma@eit.uni-kl.de 40112027Sjungma@eit.uni-kl.de X& lrotate( int n ); 40212027Sjungma@eit.uni-kl.de 40312027Sjungma@eit.uni-kl.de 40412027Sjungma@eit.uni-kl.de // bitwise right rotate 40512027Sjungma@eit.uni-kl.de 40612027Sjungma@eit.uni-kl.de X& rrotate( int n ); 40712027Sjungma@eit.uni-kl.de 40812027Sjungma@eit.uni-kl.de 40912027Sjungma@eit.uni-kl.de // bitwise reverse 41012027Sjungma@eit.uni-kl.de 41112027Sjungma@eit.uni-kl.de X& reverse(); 41212027Sjungma@eit.uni-kl.de 41312027Sjungma@eit.uni-kl.de 41412027Sjungma@eit.uni-kl.de // bit selection 41512027Sjungma@eit.uni-kl.de 41612027Sjungma@eit.uni-kl.de sc_bitref<X> operator [] ( int i ) 41712027Sjungma@eit.uni-kl.de { return sc_bitref<X>( back_cast(), i ); } 41812027Sjungma@eit.uni-kl.de 41912027Sjungma@eit.uni-kl.de sc_bitref_r<X> operator [] ( int i ) const 42012027Sjungma@eit.uni-kl.de { return sc_bitref_r<X>( back_cast(), i ); } 42112027Sjungma@eit.uni-kl.de 42212027Sjungma@eit.uni-kl.de sc_bitref<X> bit( int i ) 42312027Sjungma@eit.uni-kl.de { return sc_bitref<X>( back_cast(), i ); } 42412027Sjungma@eit.uni-kl.de 42512027Sjungma@eit.uni-kl.de sc_bitref_r<X> bit( int i ) const 42612027Sjungma@eit.uni-kl.de { return sc_bitref_r<X>( back_cast(), i ); } 42712027Sjungma@eit.uni-kl.de 42812027Sjungma@eit.uni-kl.de 42912027Sjungma@eit.uni-kl.de // part selection 43012027Sjungma@eit.uni-kl.de 43112027Sjungma@eit.uni-kl.de sc_subref<X> operator () ( int hi, int lo ) 43212027Sjungma@eit.uni-kl.de { return sc_subref<X>( back_cast(), hi, lo ); } 43312027Sjungma@eit.uni-kl.de 43412027Sjungma@eit.uni-kl.de sc_subref_r<X> operator () ( int hi, int lo ) const 43512027Sjungma@eit.uni-kl.de { return sc_subref_r<X>( back_cast(), hi, lo ); } 43612027Sjungma@eit.uni-kl.de 43712027Sjungma@eit.uni-kl.de sc_subref<X> range( int hi, int lo ) 43812027Sjungma@eit.uni-kl.de { return sc_subref<X>( back_cast(), hi, lo ); } 43912027Sjungma@eit.uni-kl.de 44012027Sjungma@eit.uni-kl.de sc_subref_r<X> range( int hi, int lo ) const 44112027Sjungma@eit.uni-kl.de { return sc_subref_r<X>( back_cast(), hi, lo ); } 44212027Sjungma@eit.uni-kl.de 44312027Sjungma@eit.uni-kl.de 44412027Sjungma@eit.uni-kl.de // reduce functions 44512027Sjungma@eit.uni-kl.de 44612027Sjungma@eit.uni-kl.de sc_logic_value_t and_reduce() const; 44712027Sjungma@eit.uni-kl.de 44812027Sjungma@eit.uni-kl.de sc_logic_value_t nand_reduce() const 44912027Sjungma@eit.uni-kl.de { return sc_logic::not_table[and_reduce()]; } 45012027Sjungma@eit.uni-kl.de 45112027Sjungma@eit.uni-kl.de sc_logic_value_t or_reduce() const; 45212027Sjungma@eit.uni-kl.de 45312027Sjungma@eit.uni-kl.de sc_logic_value_t nor_reduce() const 45412027Sjungma@eit.uni-kl.de { return sc_logic::not_table[or_reduce()]; } 45512027Sjungma@eit.uni-kl.de 45612027Sjungma@eit.uni-kl.de sc_logic_value_t xor_reduce() const; 45712027Sjungma@eit.uni-kl.de 45812027Sjungma@eit.uni-kl.de sc_logic_value_t xnor_reduce() const 45912027Sjungma@eit.uni-kl.de { return sc_logic::not_table[xor_reduce()]; } 46012027Sjungma@eit.uni-kl.de 46112027Sjungma@eit.uni-kl.de 46212027Sjungma@eit.uni-kl.de // relational operators 46312027Sjungma@eit.uni-kl.de 46412027Sjungma@eit.uni-kl.de bool operator == ( const char* b ) const; 46512027Sjungma@eit.uni-kl.de bool operator == ( const bool* b ) const; 46612027Sjungma@eit.uni-kl.de bool operator == ( const sc_logic* b ) const; 46712027Sjungma@eit.uni-kl.de bool operator == ( const sc_unsigned& b ) const; 46812027Sjungma@eit.uni-kl.de bool operator == ( const sc_signed& b ) const; 46912027Sjungma@eit.uni-kl.de bool operator == ( const sc_uint_base& b ) const; 47012027Sjungma@eit.uni-kl.de bool operator == ( const sc_int_base& b ) const; 47112027Sjungma@eit.uni-kl.de bool operator == ( unsigned long b ) const; 47212027Sjungma@eit.uni-kl.de bool operator == ( long b ) const; 47312027Sjungma@eit.uni-kl.de bool operator == ( unsigned int b ) const; 47412027Sjungma@eit.uni-kl.de bool operator == ( int b ) const; 47512027Sjungma@eit.uni-kl.de bool operator == ( uint64 b ) const; 47612027Sjungma@eit.uni-kl.de bool operator == ( int64 b ) const; 47712027Sjungma@eit.uni-kl.de 47812027Sjungma@eit.uni-kl.de 47912027Sjungma@eit.uni-kl.de // explicit conversions to character string 48012027Sjungma@eit.uni-kl.de 48112027Sjungma@eit.uni-kl.de const std::string to_string() const; 48212027Sjungma@eit.uni-kl.de const std::string to_string( sc_numrep ) const; 48312027Sjungma@eit.uni-kl.de const std::string to_string( sc_numrep, bool ) const; 48412027Sjungma@eit.uni-kl.de 48512027Sjungma@eit.uni-kl.de 48612027Sjungma@eit.uni-kl.de // explicit conversions 48712027Sjungma@eit.uni-kl.de 48812027Sjungma@eit.uni-kl.de inline int64 to_int64() const 48912027Sjungma@eit.uni-kl.de { return to_anything_signed(); } 49012027Sjungma@eit.uni-kl.de inline uint64 to_uint64() const; 49112027Sjungma@eit.uni-kl.de int to_int() const 49212027Sjungma@eit.uni-kl.de { return (int)to_anything_signed(); } 49312027Sjungma@eit.uni-kl.de 49412027Sjungma@eit.uni-kl.de unsigned int to_uint() const 49512027Sjungma@eit.uni-kl.de { return (unsigned int)to_anything_unsigned(); } 49612027Sjungma@eit.uni-kl.de 49712027Sjungma@eit.uni-kl.de long to_long() const 49812027Sjungma@eit.uni-kl.de { return (long)to_anything_signed(); } 49912027Sjungma@eit.uni-kl.de 50012027Sjungma@eit.uni-kl.de unsigned long to_ulong() const 50112027Sjungma@eit.uni-kl.de { return (unsigned long)to_anything_unsigned(); } 50212027Sjungma@eit.uni-kl.de 50312027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED 50412027Sjungma@eit.uni-kl.de 50512027Sjungma@eit.uni-kl.de int to_signed() const 50612027Sjungma@eit.uni-kl.de { return to_int(); } 50712027Sjungma@eit.uni-kl.de 50812027Sjungma@eit.uni-kl.de sc_digit to_unsigned() const 50912027Sjungma@eit.uni-kl.de { return to_uint(); } 51012027Sjungma@eit.uni-kl.de 51112027Sjungma@eit.uni-kl.de#endif 51212027Sjungma@eit.uni-kl.de 51312027Sjungma@eit.uni-kl.de 51412027Sjungma@eit.uni-kl.de // other methods 51512027Sjungma@eit.uni-kl.de 51612027Sjungma@eit.uni-kl.de void print( ::std::ostream& os = ::std::cout ) const 51712027Sjungma@eit.uni-kl.de { 51812027Sjungma@eit.uni-kl.de // the test below will force printing in binary if decimal is 51912027Sjungma@eit.uni-kl.de // specified. 52012027Sjungma@eit.uni-kl.de if ( sc_io_base(os, SC_DEC) == SC_DEC ) 52112027Sjungma@eit.uni-kl.de os << to_string(); 52212027Sjungma@eit.uni-kl.de else 52312027Sjungma@eit.uni-kl.de os << to_string(sc_io_base(os,SC_BIN),sc_io_show_base(os)); 52412027Sjungma@eit.uni-kl.de } 52512027Sjungma@eit.uni-kl.de 52612027Sjungma@eit.uni-kl.de void scan( ::std::istream& is = ::std::cin ); 52712027Sjungma@eit.uni-kl.de 52812027Sjungma@eit.uni-kl.deprotected: 52912027Sjungma@eit.uni-kl.de 53012027Sjungma@eit.uni-kl.de void check_bounds( int n ) const; // check if bit n accessible 53112027Sjungma@eit.uni-kl.de void check_wbounds( int n ) const; // check if word n accessible 53212027Sjungma@eit.uni-kl.de 53312027Sjungma@eit.uni-kl.de sc_digit to_anything_unsigned() const; 53412027Sjungma@eit.uni-kl.de int64 to_anything_signed() const; 53512027Sjungma@eit.uni-kl.de}; 53612027Sjungma@eit.uni-kl.de 53712027Sjungma@eit.uni-kl.de 53812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 53912027Sjungma@eit.uni-kl.de 54012027Sjungma@eit.uni-kl.de// bitwise operators and functions 54112027Sjungma@eit.uni-kl.de 54212027Sjungma@eit.uni-kl.de// bitwise and 54312027Sjungma@eit.uni-kl.de 54412027Sjungma@eit.uni-kl.detemplate <class X, class Y> 54512027Sjungma@eit.uni-kl.deinline 54612027Sjungma@eit.uni-kl.deX& 54712027Sjungma@eit.uni-kl.deoperator &= ( sc_proxy<X>& px, const sc_proxy<Y>& py ); 54812027Sjungma@eit.uni-kl.de 54912027Sjungma@eit.uni-kl.de 55012027Sjungma@eit.uni-kl.detemplate <class X, class Y> 55112027Sjungma@eit.uni-kl.deinline 55212027Sjungma@eit.uni-kl.deconst sc_lv_base 55312027Sjungma@eit.uni-kl.deoperator & ( const sc_proxy<X>& px, const sc_proxy<Y>& py ); 55412027Sjungma@eit.uni-kl.de 55512027Sjungma@eit.uni-kl.de 55612027Sjungma@eit.uni-kl.de#define DECL_BITWISE_AND_OP_T(tp) \ 55712027Sjungma@eit.uni-kl.detemplate <class X> \ 55812027Sjungma@eit.uni-kl.deinline \ 55912027Sjungma@eit.uni-kl.deconst sc_lv_base \ 56012027Sjungma@eit.uni-kl.deoperator & ( tp b, const sc_proxy<X>& px ); 56112027Sjungma@eit.uni-kl.de 56212027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const char*) 56312027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const bool*) 56412027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_logic*) 56512027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_unsigned&) 56612027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_signed&) 56712027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_uint_base&) 56812027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(const sc_int_base&) 56912027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(unsigned long) 57012027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(long) 57112027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(unsigned int) 57212027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(int) 57312027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(uint64) 57412027Sjungma@eit.uni-kl.deDECL_BITWISE_AND_OP_T(int64) 57512027Sjungma@eit.uni-kl.de 57612027Sjungma@eit.uni-kl.de#undef DECL_BITWISE_AND_OP_T 57712027Sjungma@eit.uni-kl.de 57812027Sjungma@eit.uni-kl.de 57912027Sjungma@eit.uni-kl.de// bitwise or 58012027Sjungma@eit.uni-kl.de 58112027Sjungma@eit.uni-kl.detemplate <class X, class Y> 58212027Sjungma@eit.uni-kl.deinline 58312027Sjungma@eit.uni-kl.deX& 58412027Sjungma@eit.uni-kl.deoperator |= ( sc_proxy<X>& px, const sc_proxy<Y>& py ); 58512027Sjungma@eit.uni-kl.de 58612027Sjungma@eit.uni-kl.de 58712027Sjungma@eit.uni-kl.detemplate <class X, class Y> 58812027Sjungma@eit.uni-kl.deinline 58912027Sjungma@eit.uni-kl.deconst sc_lv_base 59012027Sjungma@eit.uni-kl.deoperator | ( const sc_proxy<X>& px, const sc_proxy<Y>& py ); 59112027Sjungma@eit.uni-kl.de 59212027Sjungma@eit.uni-kl.de 59312027Sjungma@eit.uni-kl.de#define DECL_BITWISE_OR_OP_T(tp) \ 59412027Sjungma@eit.uni-kl.detemplate <class X> \ 59512027Sjungma@eit.uni-kl.deinline \ 59612027Sjungma@eit.uni-kl.deconst sc_lv_base \ 59712027Sjungma@eit.uni-kl.deoperator | ( tp a, const sc_proxy<X>& px ); 59812027Sjungma@eit.uni-kl.de 59912027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const char*) 60012027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const bool*) 60112027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_logic*) 60212027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_unsigned&) 60312027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_signed&) 60412027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_uint_base&) 60512027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(const sc_int_base&) 60612027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(unsigned long) 60712027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(long) 60812027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(unsigned int) 60912027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(int) 61012027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(uint64) 61112027Sjungma@eit.uni-kl.deDECL_BITWISE_OR_OP_T(int64) 61212027Sjungma@eit.uni-kl.de 61312027Sjungma@eit.uni-kl.de#undef DECL_BITWISE_OR_OP_T 61412027Sjungma@eit.uni-kl.de 61512027Sjungma@eit.uni-kl.de 61612027Sjungma@eit.uni-kl.de// bitwise xor 61712027Sjungma@eit.uni-kl.de 61812027Sjungma@eit.uni-kl.detemplate <class X, class Y> 61912027Sjungma@eit.uni-kl.deinline 62012027Sjungma@eit.uni-kl.deX& 62112027Sjungma@eit.uni-kl.deoperator ^= ( sc_proxy<X>& px, const sc_proxy<Y>& py ); 62212027Sjungma@eit.uni-kl.de 62312027Sjungma@eit.uni-kl.de 62412027Sjungma@eit.uni-kl.detemplate <class X, class Y> 62512027Sjungma@eit.uni-kl.deinline 62612027Sjungma@eit.uni-kl.deconst sc_lv_base 62712027Sjungma@eit.uni-kl.deoperator ^ ( const sc_proxy<X>& px, const sc_proxy<Y>& py ); 62812027Sjungma@eit.uni-kl.de 62912027Sjungma@eit.uni-kl.de 63012027Sjungma@eit.uni-kl.de#define DECL_BITWISE_XOR_OP_T(tp) \ 63112027Sjungma@eit.uni-kl.detemplate <class X> \ 63212027Sjungma@eit.uni-kl.deinline \ 63312027Sjungma@eit.uni-kl.deconst sc_lv_base \ 63412027Sjungma@eit.uni-kl.deoperator ^ ( tp a, const sc_proxy<X>& px ); 63512027Sjungma@eit.uni-kl.de 63612027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const char*) 63712027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const bool*) 63812027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_logic*) 63912027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_unsigned&) 64012027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_signed&) 64112027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_uint_base&) 64212027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(const sc_int_base&) 64312027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(unsigned long) 64412027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(long) 64512027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(unsigned int) 64612027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(int) 64712027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(uint64) 64812027Sjungma@eit.uni-kl.deDECL_BITWISE_XOR_OP_T(int64) 64912027Sjungma@eit.uni-kl.de 65012027Sjungma@eit.uni-kl.de#undef DECL_BITWISE_XOR_OP_T 65112027Sjungma@eit.uni-kl.de 65212027Sjungma@eit.uni-kl.de 65312027Sjungma@eit.uni-kl.de// relational operators 65412027Sjungma@eit.uni-kl.de 65512027Sjungma@eit.uni-kl.detemplate <class X, class Y> 65612027Sjungma@eit.uni-kl.deinline 65712027Sjungma@eit.uni-kl.debool 65812027Sjungma@eit.uni-kl.deoperator == ( const sc_proxy<X>& px, const sc_proxy<Y>& py ); 65912027Sjungma@eit.uni-kl.de 66012027Sjungma@eit.uni-kl.detemplate <class X, class Y> 66112027Sjungma@eit.uni-kl.deinline 66212027Sjungma@eit.uni-kl.debool 66312027Sjungma@eit.uni-kl.deoperator != ( const sc_proxy<X>& px, const sc_proxy<Y>& py ); 66412027Sjungma@eit.uni-kl.de 66512027Sjungma@eit.uni-kl.de 66612027Sjungma@eit.uni-kl.de#define DECL_REL_OP_T(tp) \ 66712027Sjungma@eit.uni-kl.detemplate <class X> \ 66812027Sjungma@eit.uni-kl.deinline \ 66912027Sjungma@eit.uni-kl.debool \ 67012027Sjungma@eit.uni-kl.deoperator == ( tp b, const sc_proxy<X>& px ); \ 67112027Sjungma@eit.uni-kl.de \ 67212027Sjungma@eit.uni-kl.detemplate <class X> \ 67312027Sjungma@eit.uni-kl.deinline \ 67412027Sjungma@eit.uni-kl.debool \ 67512027Sjungma@eit.uni-kl.deoperator != ( const sc_proxy<X>& px, tp b ); \ 67612027Sjungma@eit.uni-kl.de \ 67712027Sjungma@eit.uni-kl.detemplate <class X> \ 67812027Sjungma@eit.uni-kl.deinline \ 67912027Sjungma@eit.uni-kl.debool \ 68012027Sjungma@eit.uni-kl.deoperator != ( tp b, const sc_proxy<X>& px ); 68112027Sjungma@eit.uni-kl.de 68212027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const char*) 68312027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const bool*) 68412027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_logic*) 68512027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_unsigned&) 68612027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_signed&) 68712027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_uint_base&) 68812027Sjungma@eit.uni-kl.deDECL_REL_OP_T(const sc_int_base&) 68912027Sjungma@eit.uni-kl.deDECL_REL_OP_T(unsigned long) 69012027Sjungma@eit.uni-kl.deDECL_REL_OP_T(long) 69112027Sjungma@eit.uni-kl.deDECL_REL_OP_T(unsigned int) 69212027Sjungma@eit.uni-kl.deDECL_REL_OP_T(int) 69312027Sjungma@eit.uni-kl.deDECL_REL_OP_T(uint64) 69412027Sjungma@eit.uni-kl.deDECL_REL_OP_T(int64) 69512027Sjungma@eit.uni-kl.de 69612027Sjungma@eit.uni-kl.de#undef DECL_REL_OP_T 69712027Sjungma@eit.uni-kl.de 69812027Sjungma@eit.uni-kl.de 69912027Sjungma@eit.uni-kl.de// l-value concatenation 70012027Sjungma@eit.uni-kl.de 70112027Sjungma@eit.uni-kl.de// Due to the fact that temporary objects cannot be passed to non-const 70212027Sjungma@eit.uni-kl.de// references, we have to enumerate, use call by value, and use dynamic 70312027Sjungma@eit.uni-kl.de// memory allocation (and deallocation). 70412027Sjungma@eit.uni-kl.de 70512027Sjungma@eit.uni-kl.de 70612027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 70712027Sjungma@eit.uni-kl.de 70812027Sjungma@eit.uni-kl.detemplate <class X> 70912027Sjungma@eit.uni-kl.deinline 71012027Sjungma@eit.uni-kl.devoid 71112027Sjungma@eit.uni-kl.deget_words_( const X& x, int wi, sc_digit& x_dw, sc_digit& x_cw ) 71212027Sjungma@eit.uni-kl.de{ 71312027Sjungma@eit.uni-kl.de x_dw = x.get_word( wi ); 71412027Sjungma@eit.uni-kl.de x_cw = x.get_cword( wi ); 71512027Sjungma@eit.uni-kl.de} 71612027Sjungma@eit.uni-kl.de 71712027Sjungma@eit.uni-kl.detemplate <class X> 71812027Sjungma@eit.uni-kl.deinline 71912027Sjungma@eit.uni-kl.devoid 72012027Sjungma@eit.uni-kl.deset_words_( X& x, int wi, sc_digit x_dw, sc_digit x_cw ) 72112027Sjungma@eit.uni-kl.de{ 72212027Sjungma@eit.uni-kl.de x.set_word( wi, x_dw ); 72312027Sjungma@eit.uni-kl.de x.set_cword( wi, x_cw ); 72412027Sjungma@eit.uni-kl.de} 72512027Sjungma@eit.uni-kl.de 72612027Sjungma@eit.uni-kl.detemplate <class X> 72712027Sjungma@eit.uni-kl.deinline 72812027Sjungma@eit.uni-kl.devoid 72912027Sjungma@eit.uni-kl.deextend_sign_w_( X& x, int wi, bool sign ) 73012027Sjungma@eit.uni-kl.de{ 73112027Sjungma@eit.uni-kl.de int sz = x.size(); 73212027Sjungma@eit.uni-kl.de unsigned int sgn = (sign ? ~SC_DIGIT_ZERO : SC_DIGIT_ZERO); 73312027Sjungma@eit.uni-kl.de for( int i = wi; i < sz; ++ i ) { 73412027Sjungma@eit.uni-kl.de set_words_( x, i, sgn, SC_DIGIT_ZERO ); 73512027Sjungma@eit.uni-kl.de } 73612027Sjungma@eit.uni-kl.de} 73712027Sjungma@eit.uni-kl.de 73812027Sjungma@eit.uni-kl.de 73912027Sjungma@eit.uni-kl.de// assignment functions 74012027Sjungma@eit.uni-kl.de 74112027Sjungma@eit.uni-kl.detemplate <class X, class Y> 74212027Sjungma@eit.uni-kl.deinline 74312027Sjungma@eit.uni-kl.devoid 74412027Sjungma@eit.uni-kl.deassign_p_( sc_proxy<X>& px, const sc_proxy<Y>& py ) 74512027Sjungma@eit.uni-kl.de{ 74612027Sjungma@eit.uni-kl.de if( (void*) &px != (void*) &py ) { 74712027Sjungma@eit.uni-kl.de X& x = px.back_cast(); 74812027Sjungma@eit.uni-kl.de const Y& y = py.back_cast(); 74912027Sjungma@eit.uni-kl.de int sz = x.size(); 75012027Sjungma@eit.uni-kl.de int min_sz = sc_min( sz, y.size() ); 75112027Sjungma@eit.uni-kl.de int i = 0; 75212027Sjungma@eit.uni-kl.de for( ; i < min_sz; ++ i ) { 75312027Sjungma@eit.uni-kl.de set_words_( x, i, y.get_word( i ), y.get_cword( i ) ); 75412027Sjungma@eit.uni-kl.de } 75512027Sjungma@eit.uni-kl.de // extend with zeros 75612027Sjungma@eit.uni-kl.de extend_sign_w_( x, i, false ); 75712027Sjungma@eit.uni-kl.de x.clean_tail(); 75812027Sjungma@eit.uni-kl.de } 75912027Sjungma@eit.uni-kl.de} 76012027Sjungma@eit.uni-kl.de 76112027Sjungma@eit.uni-kl.de// Vector types that are not derived from sc_proxy, sc_int_base, 76212027Sjungma@eit.uni-kl.de// sc_uint_base, sc_signed, or sc_unsigned, must have a length() 76312027Sjungma@eit.uni-kl.de// function and an operator []. The vector argument type must support 76412027Sjungma@eit.uni-kl.de// accessing bits that are beyond the msb. The vector argument type 76512027Sjungma@eit.uni-kl.de// decides what to do there (e.g. sign extension or zero padding). 76612027Sjungma@eit.uni-kl.de 76712027Sjungma@eit.uni-kl.detemplate <class X, class T> 76812027Sjungma@eit.uni-kl.deinline 76912027Sjungma@eit.uni-kl.devoid 77012027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const T& a ) 77112027Sjungma@eit.uni-kl.de{ 77212027Sjungma@eit.uni-kl.de X& x = px.back_cast(); 77312027Sjungma@eit.uni-kl.de int i; 77412027Sjungma@eit.uni-kl.de int len_x = x.length(); 77512027Sjungma@eit.uni-kl.de int len_a = a.length(); 77612027Sjungma@eit.uni-kl.de if ( len_a > len_x ) len_a = len_x; 77712027Sjungma@eit.uni-kl.de for( i = 0 ; i < len_a; ++ i ) { 77812027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( (bool) a[i] ) ); 77912027Sjungma@eit.uni-kl.de } 78012027Sjungma@eit.uni-kl.de for( ; i < len_x; ++ i ) { 78112027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( false ) ); 78212027Sjungma@eit.uni-kl.de } 78312027Sjungma@eit.uni-kl.de} 78412027Sjungma@eit.uni-kl.de 78512027Sjungma@eit.uni-kl.detemplate <class X> 78612027Sjungma@eit.uni-kl.deinline 78712027Sjungma@eit.uni-kl.devoid 78812027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const sc_int_base& a ) 78912027Sjungma@eit.uni-kl.de{ 79012027Sjungma@eit.uni-kl.de X& x = px.back_cast(); 79112027Sjungma@eit.uni-kl.de int i; 79212027Sjungma@eit.uni-kl.de bool sign = a < 0; 79312027Sjungma@eit.uni-kl.de int len_x = x.length(); 79412027Sjungma@eit.uni-kl.de int len_a = a.length(); 79512027Sjungma@eit.uni-kl.de if ( len_a > len_x ) len_a = len_x; 79612027Sjungma@eit.uni-kl.de for( i = 0 ; i < len_a; ++ i ) { 79712027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( (bool) a[i] ) ); 79812027Sjungma@eit.uni-kl.de } 79912027Sjungma@eit.uni-kl.de for( ; i < len_x; ++ i ) { 80012027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( sign ) ); 80112027Sjungma@eit.uni-kl.de } 80212027Sjungma@eit.uni-kl.de} 80312027Sjungma@eit.uni-kl.de 80412027Sjungma@eit.uni-kl.detemplate <class X> 80512027Sjungma@eit.uni-kl.deinline 80612027Sjungma@eit.uni-kl.devoid 80712027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const sc_signed& a ) 80812027Sjungma@eit.uni-kl.de{ 80912027Sjungma@eit.uni-kl.de X& x = px.back_cast(); 81012027Sjungma@eit.uni-kl.de int i; 81112027Sjungma@eit.uni-kl.de bool sign = a < 0; 81212027Sjungma@eit.uni-kl.de int len_x = x.length(); 81312027Sjungma@eit.uni-kl.de int len_a = a.length(); 81412027Sjungma@eit.uni-kl.de if ( len_a > len_x ) len_a = len_x; 81512027Sjungma@eit.uni-kl.de for( i = 0 ; i < len_a; ++ i ) { 81612027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( (bool) a[i] ) ); 81712027Sjungma@eit.uni-kl.de } 81812027Sjungma@eit.uni-kl.de for( ; i < len_x; ++ i ) { 81912027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( sign ) ); 82012027Sjungma@eit.uni-kl.de } 82112027Sjungma@eit.uni-kl.de} 82212027Sjungma@eit.uni-kl.de 82312027Sjungma@eit.uni-kl.detemplate <class X> 82412027Sjungma@eit.uni-kl.deinline 82512027Sjungma@eit.uni-kl.devoid 82612027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const sc_uint_base& a ) 82712027Sjungma@eit.uni-kl.de{ 82812027Sjungma@eit.uni-kl.de X& x = px.back_cast(); 82912027Sjungma@eit.uni-kl.de int i; 83012027Sjungma@eit.uni-kl.de int len_x = x.length(); 83112027Sjungma@eit.uni-kl.de int len_a = a.length(); 83212027Sjungma@eit.uni-kl.de if ( len_a > len_x ) len_a = len_x; 83312027Sjungma@eit.uni-kl.de for( i = 0 ; i < len_a; ++ i ) { 83412027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( (bool) a[i] ) ); 83512027Sjungma@eit.uni-kl.de } 83612027Sjungma@eit.uni-kl.de for( ; i < len_x; ++ i ) { 83712027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( false ) ); 83812027Sjungma@eit.uni-kl.de } 83912027Sjungma@eit.uni-kl.de} 84012027Sjungma@eit.uni-kl.de 84112027Sjungma@eit.uni-kl.detemplate <class X> 84212027Sjungma@eit.uni-kl.deinline 84312027Sjungma@eit.uni-kl.devoid 84412027Sjungma@eit.uni-kl.deassign_v_( sc_proxy<X>& px, const sc_unsigned& a ) 84512027Sjungma@eit.uni-kl.de{ 84612027Sjungma@eit.uni-kl.de X& x = px.back_cast(); 84712027Sjungma@eit.uni-kl.de int i; 84812027Sjungma@eit.uni-kl.de int len_x = x.length(); 84912027Sjungma@eit.uni-kl.de int len_a = a.length(); 85012027Sjungma@eit.uni-kl.de if ( len_a > len_x ) len_a = len_x; 85112027Sjungma@eit.uni-kl.de for( i = 0 ; i < len_a; ++ i ) { 85212027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( (bool) a[i] ) ); 85312027Sjungma@eit.uni-kl.de } 85412027Sjungma@eit.uni-kl.de for( ; i < len_x; ++ i ) { 85512027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( false ) ); 85612027Sjungma@eit.uni-kl.de } 85712027Sjungma@eit.uni-kl.de} 85812027Sjungma@eit.uni-kl.de 85912027Sjungma@eit.uni-kl.de 86012027Sjungma@eit.uni-kl.de// assignment operators 86112027Sjungma@eit.uni-kl.de 86212027Sjungma@eit.uni-kl.detemplate <class X> 86312027Sjungma@eit.uni-kl.deinline 86412027Sjungma@eit.uni-kl.deX& 86512027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( const char* a ) 86612027Sjungma@eit.uni-kl.de{ 86712027Sjungma@eit.uni-kl.de X& x = back_cast(); 86812027Sjungma@eit.uni-kl.de std::string s = convert_to_bin( a ); 86912027Sjungma@eit.uni-kl.de int len = x.length(); 87012027Sjungma@eit.uni-kl.de int s_len = s.length() - 1; 87112027Sjungma@eit.uni-kl.de int min_len = sc_min( len, s_len ); 87212027Sjungma@eit.uni-kl.de int i = 0; 87312027Sjungma@eit.uni-kl.de for( ; i < min_len; ++ i ) { 87412027Sjungma@eit.uni-kl.de char c = s[s_len - i - 1]; 87512027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic::char_to_logic[(int)c] ); 87612027Sjungma@eit.uni-kl.de } 87712027Sjungma@eit.uni-kl.de // if formatted, fill the rest with sign(s), otherwise fill with zeros 87812027Sjungma@eit.uni-kl.de sc_logic_value_t fill = (s[s_len] == 'F' ? sc_logic_value_t( s[0] - '0' ) 87912027Sjungma@eit.uni-kl.de : sc_logic_value_t( 0 )); 88012027Sjungma@eit.uni-kl.de for( ; i < len; ++ i ) { 88112027Sjungma@eit.uni-kl.de x.set_bit( i, fill ); 88212027Sjungma@eit.uni-kl.de } 88312027Sjungma@eit.uni-kl.de return x; 88412027Sjungma@eit.uni-kl.de} 88512027Sjungma@eit.uni-kl.de 88612027Sjungma@eit.uni-kl.detemplate <class X> 88712027Sjungma@eit.uni-kl.deinline 88812027Sjungma@eit.uni-kl.deX& 88912027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( const bool* a ) 89012027Sjungma@eit.uni-kl.de{ 89112027Sjungma@eit.uni-kl.de // the length of 'a' must be larger than or equal to the length of 'this' 89212027Sjungma@eit.uni-kl.de X& x = back_cast(); 89312027Sjungma@eit.uni-kl.de int len = x.length(); 89412027Sjungma@eit.uni-kl.de for( int i = 0; i < len; ++ i ) { 89512027Sjungma@eit.uni-kl.de x.set_bit( i, sc_logic_value_t( a[i] ) ); 89612027Sjungma@eit.uni-kl.de } 89712027Sjungma@eit.uni-kl.de return x; 89812027Sjungma@eit.uni-kl.de} 89912027Sjungma@eit.uni-kl.de 90012027Sjungma@eit.uni-kl.detemplate <class X> 90112027Sjungma@eit.uni-kl.deinline 90212027Sjungma@eit.uni-kl.deX& 90312027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( const sc_logic* a ) 90412027Sjungma@eit.uni-kl.de{ 90512027Sjungma@eit.uni-kl.de // the length of 'a' must be larger than or equal to the length of 'this' 90612027Sjungma@eit.uni-kl.de X& x = back_cast(); 90712027Sjungma@eit.uni-kl.de int len = x.length(); 90812027Sjungma@eit.uni-kl.de for( int i = 0; i < len; ++ i ) { 90912027Sjungma@eit.uni-kl.de x.set_bit( i, a[i].value() ); 91012027Sjungma@eit.uni-kl.de } 91112027Sjungma@eit.uni-kl.de return x; 91212027Sjungma@eit.uni-kl.de} 91312027Sjungma@eit.uni-kl.de 91412027Sjungma@eit.uni-kl.detemplate <class X> 91512027Sjungma@eit.uni-kl.deinline 91612027Sjungma@eit.uni-kl.deX& 91712027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( unsigned int a ) 91812027Sjungma@eit.uni-kl.de{ 91912027Sjungma@eit.uni-kl.de X& x = back_cast(); 92012027Sjungma@eit.uni-kl.de set_words_( x, 0, (sc_digit)a, SC_DIGIT_ZERO ); 92112027Sjungma@eit.uni-kl.de // extend with zeros 92212027Sjungma@eit.uni-kl.de extend_sign_w_( x, 1, false ); 92312027Sjungma@eit.uni-kl.de x.clean_tail(); 92412027Sjungma@eit.uni-kl.de return x; 92512027Sjungma@eit.uni-kl.de} 92612027Sjungma@eit.uni-kl.de 92712027Sjungma@eit.uni-kl.detemplate <class X> 92812027Sjungma@eit.uni-kl.deinline 92912027Sjungma@eit.uni-kl.deX& 93012027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( int a ) 93112027Sjungma@eit.uni-kl.de{ 93212027Sjungma@eit.uni-kl.de X& x = back_cast(); 93312027Sjungma@eit.uni-kl.de set_words_( x, 0, (sc_digit) a, SC_DIGIT_ZERO ); 93412027Sjungma@eit.uni-kl.de // extend with sign(a) 93512027Sjungma@eit.uni-kl.de extend_sign_w_( x, 1, (a < 0) ); 93612027Sjungma@eit.uni-kl.de x.clean_tail(); 93712027Sjungma@eit.uni-kl.de return x; 93812027Sjungma@eit.uni-kl.de} 93912027Sjungma@eit.uni-kl.de 94012027Sjungma@eit.uni-kl.de#if defined(SC_LONG_64) 94112027Sjungma@eit.uni-kl.de template <class X> 94212027Sjungma@eit.uni-kl.de inline 94312027Sjungma@eit.uni-kl.de X& 94412027Sjungma@eit.uni-kl.de sc_proxy<X>::assign_( unsigned long a ) 94512027Sjungma@eit.uni-kl.de { 94612027Sjungma@eit.uni-kl.de X& x = back_cast(); 94712027Sjungma@eit.uni-kl.de set_words_( x, 0, ((sc_digit) a & ~SC_DIGIT_ZERO), SC_DIGIT_ZERO ); 94812027Sjungma@eit.uni-kl.de if( x.size() > 1 ) { 94912027Sjungma@eit.uni-kl.de set_words_( x, 1, 95012027Sjungma@eit.uni-kl.de ((sc_digit) (a >> SC_DIGIT_SIZE) & ~SC_DIGIT_ZERO), 95112027Sjungma@eit.uni-kl.de SC_DIGIT_ZERO ); 95212027Sjungma@eit.uni-kl.de // extend with zeros 95312027Sjungma@eit.uni-kl.de extend_sign_w_( x, 2, false ); 95412027Sjungma@eit.uni-kl.de } 95512027Sjungma@eit.uni-kl.de x.clean_tail(); 95612027Sjungma@eit.uni-kl.de return x; 95712027Sjungma@eit.uni-kl.de } 95812027Sjungma@eit.uni-kl.de 95912027Sjungma@eit.uni-kl.de template <class X> 96012027Sjungma@eit.uni-kl.de inline 96112027Sjungma@eit.uni-kl.de X& 96212027Sjungma@eit.uni-kl.de sc_proxy<X>::assign_( long a ) 96312027Sjungma@eit.uni-kl.de { 96412027Sjungma@eit.uni-kl.de X& x = back_cast(); 96512027Sjungma@eit.uni-kl.de set_words_( x, 0, ((sc_digit) a & ~SC_DIGIT_ZERO), SC_DIGIT_ZERO ); 96612027Sjungma@eit.uni-kl.de if( x.size() > 1 ) { 96712027Sjungma@eit.uni-kl.de set_words_( x, 1, 96812027Sjungma@eit.uni-kl.de ((sc_digit) ((uint64) a >> SC_DIGIT_SIZE) & ~SC_DIGIT_ZERO), 96912027Sjungma@eit.uni-kl.de SC_DIGIT_ZERO ); 97012027Sjungma@eit.uni-kl.de // extend with sign(a) 97112027Sjungma@eit.uni-kl.de extend_sign_w_( x, 2, (a < 0) ); 97212027Sjungma@eit.uni-kl.de } 97312027Sjungma@eit.uni-kl.de x.clean_tail(); 97412027Sjungma@eit.uni-kl.de return x; 97512027Sjungma@eit.uni-kl.de } 97612027Sjungma@eit.uni-kl.de 97712027Sjungma@eit.uni-kl.de#else 97812027Sjungma@eit.uni-kl.de template <class X> 97912027Sjungma@eit.uni-kl.de inline 98012027Sjungma@eit.uni-kl.de X& 98112027Sjungma@eit.uni-kl.de sc_proxy<X>::assign_( unsigned long a ) 98212027Sjungma@eit.uni-kl.de { 98312027Sjungma@eit.uni-kl.de X& x = back_cast(); 98412027Sjungma@eit.uni-kl.de set_words_( x, 0, (sc_digit)a, SC_DIGIT_ZERO ); 98512027Sjungma@eit.uni-kl.de // extend with zeros 98612027Sjungma@eit.uni-kl.de extend_sign_w_( x, 1, false ); 98712027Sjungma@eit.uni-kl.de x.clean_tail(); 98812027Sjungma@eit.uni-kl.de return x; 98912027Sjungma@eit.uni-kl.de } 99012027Sjungma@eit.uni-kl.de 99112027Sjungma@eit.uni-kl.de template <class X> 99212027Sjungma@eit.uni-kl.de inline 99312027Sjungma@eit.uni-kl.de X& 99412027Sjungma@eit.uni-kl.de sc_proxy<X>::assign_( long a ) 99512027Sjungma@eit.uni-kl.de { 99612027Sjungma@eit.uni-kl.de X& x = back_cast(); 99712027Sjungma@eit.uni-kl.de set_words_( x, 0, (sc_digit) a, SC_DIGIT_ZERO ); 99812027Sjungma@eit.uni-kl.de // extend with sign(a) 99912027Sjungma@eit.uni-kl.de extend_sign_w_( x, 1, (a < 0) ); 100012027Sjungma@eit.uni-kl.de x.clean_tail(); 100112027Sjungma@eit.uni-kl.de return x; 100212027Sjungma@eit.uni-kl.de } 100312027Sjungma@eit.uni-kl.de#endif 100412027Sjungma@eit.uni-kl.detemplate <class X> 100512027Sjungma@eit.uni-kl.deinline 100612027Sjungma@eit.uni-kl.deX& 100712027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( uint64 a ) 100812027Sjungma@eit.uni-kl.de{ 100912027Sjungma@eit.uni-kl.de X& x = back_cast(); 101012027Sjungma@eit.uni-kl.de set_words_( x, 0, ((sc_digit) a & ~SC_DIGIT_ZERO), SC_DIGIT_ZERO ); 101112027Sjungma@eit.uni-kl.de if( x.size() > 1 ) { 101212027Sjungma@eit.uni-kl.de set_words_( x, 1, 101312027Sjungma@eit.uni-kl.de ((sc_digit) (a >> SC_DIGIT_SIZE) & ~SC_DIGIT_ZERO), 101412027Sjungma@eit.uni-kl.de SC_DIGIT_ZERO ); 101512027Sjungma@eit.uni-kl.de // extend with zeros 101612027Sjungma@eit.uni-kl.de extend_sign_w_( x, 2, false ); 101712027Sjungma@eit.uni-kl.de } 101812027Sjungma@eit.uni-kl.de x.clean_tail(); 101912027Sjungma@eit.uni-kl.de return x; 102012027Sjungma@eit.uni-kl.de} 102112027Sjungma@eit.uni-kl.de 102212027Sjungma@eit.uni-kl.detemplate <class X> 102312027Sjungma@eit.uni-kl.deinline 102412027Sjungma@eit.uni-kl.deX& 102512027Sjungma@eit.uni-kl.desc_proxy<X>::assign_( int64 a ) 102612027Sjungma@eit.uni-kl.de{ 102712027Sjungma@eit.uni-kl.de X& x = back_cast(); 102812027Sjungma@eit.uni-kl.de set_words_( x, 0, ((sc_digit) a & ~SC_DIGIT_ZERO), SC_DIGIT_ZERO ); 102912027Sjungma@eit.uni-kl.de if( x.size() > 1 ) { 103012027Sjungma@eit.uni-kl.de set_words_( x, 1, 103112027Sjungma@eit.uni-kl.de ((sc_digit) ((uint64) a >> SC_DIGIT_SIZE) & ~SC_DIGIT_ZERO), 103212027Sjungma@eit.uni-kl.de SC_DIGIT_ZERO ); 103312027Sjungma@eit.uni-kl.de // extend with sign(a) 103412027Sjungma@eit.uni-kl.de extend_sign_w_( x, 2, (a < 0) ); 103512027Sjungma@eit.uni-kl.de } 103612027Sjungma@eit.uni-kl.de x.clean_tail(); 103712027Sjungma@eit.uni-kl.de return x; 103812027Sjungma@eit.uni-kl.de} 103912027Sjungma@eit.uni-kl.de 104012027Sjungma@eit.uni-kl.de 104112027Sjungma@eit.uni-kl.de// bitwise operators and functions 104212027Sjungma@eit.uni-kl.de 104312027Sjungma@eit.uni-kl.de// bitwise complement 104412027Sjungma@eit.uni-kl.de 104512027Sjungma@eit.uni-kl.detemplate <class X> 104612027Sjungma@eit.uni-kl.deinline 104712027Sjungma@eit.uni-kl.deX& 104812027Sjungma@eit.uni-kl.desc_proxy<X>::b_not() 104912027Sjungma@eit.uni-kl.de{ 105012027Sjungma@eit.uni-kl.de X& x = back_cast(); 105112027Sjungma@eit.uni-kl.de int sz = x.size(); 105212027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 105312027Sjungma@eit.uni-kl.de sc_digit x_dw, x_cw; 105412027Sjungma@eit.uni-kl.de get_words_( x, i, x_dw, x_cw ); 105512027Sjungma@eit.uni-kl.de x.set_word( i, x_cw | ~x_dw ); 105612027Sjungma@eit.uni-kl.de } 105712027Sjungma@eit.uni-kl.de x.clean_tail(); 105812027Sjungma@eit.uni-kl.de return x; 105912027Sjungma@eit.uni-kl.de} 106012027Sjungma@eit.uni-kl.de 106112027Sjungma@eit.uni-kl.de 106212027Sjungma@eit.uni-kl.de// bitwise and 106312027Sjungma@eit.uni-kl.de 106412027Sjungma@eit.uni-kl.detemplate <class X, class Y> 106512027Sjungma@eit.uni-kl.deinline 106612027Sjungma@eit.uni-kl.deX& 106712027Sjungma@eit.uni-kl.deb_and_assign_( sc_proxy<X>& px, const sc_proxy<Y>& py ) 106812027Sjungma@eit.uni-kl.de{ 106912027Sjungma@eit.uni-kl.de X& x = px.back_cast(); 107012027Sjungma@eit.uni-kl.de const Y& y = py.back_cast(); 107112027Sjungma@eit.uni-kl.de assert( x.length() == y.length() ); 107212027Sjungma@eit.uni-kl.de int sz = x.size(); 107312027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 107412027Sjungma@eit.uni-kl.de sc_digit x_dw, x_cw, y_dw, y_cw; 107512027Sjungma@eit.uni-kl.de get_words_( x, i, x_dw, x_cw ); 107612027Sjungma@eit.uni-kl.de get_words_( y, i, y_dw, y_cw ); 107712027Sjungma@eit.uni-kl.de sc_digit cw = (x_dw & y_cw) | (x_cw & y_dw) | (x_cw & y_cw); 107812027Sjungma@eit.uni-kl.de sc_digit dw = cw | (x_dw & y_dw); 107912027Sjungma@eit.uni-kl.de set_words_( x, i, dw, cw ); 108012027Sjungma@eit.uni-kl.de } 108112027Sjungma@eit.uni-kl.de // tail cleaning not needed 108212027Sjungma@eit.uni-kl.de return x; 108312027Sjungma@eit.uni-kl.de} 108412027Sjungma@eit.uni-kl.de 108512027Sjungma@eit.uni-kl.de 108612027Sjungma@eit.uni-kl.de// bitwise or 108712027Sjungma@eit.uni-kl.de 108812027Sjungma@eit.uni-kl.detemplate <class X, class Y> 108912027Sjungma@eit.uni-kl.deinline 109012027Sjungma@eit.uni-kl.deX& 109112027Sjungma@eit.uni-kl.deb_or_assign_( sc_proxy<X>& px, const sc_proxy<Y>& py ) 109212027Sjungma@eit.uni-kl.de{ 109312027Sjungma@eit.uni-kl.de X& x = px.back_cast(); 109412027Sjungma@eit.uni-kl.de const Y& y = py.back_cast(); 109512027Sjungma@eit.uni-kl.de assert( x.length() == y.length() ); 109612027Sjungma@eit.uni-kl.de int sz = x.size(); 109712027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 109812027Sjungma@eit.uni-kl.de sc_digit x_dw, x_cw, y_dw, y_cw; 109912027Sjungma@eit.uni-kl.de get_words_( x, i, x_dw, x_cw ); 110012027Sjungma@eit.uni-kl.de get_words_( y, i, y_dw, y_cw ); 110112027Sjungma@eit.uni-kl.de sc_digit cw = (x_cw & y_cw) | (x_cw & ~y_dw) | (~x_dw & y_cw); 110212027Sjungma@eit.uni-kl.de sc_digit dw = cw | x_dw | y_dw; 110312027Sjungma@eit.uni-kl.de set_words_( x, i, dw, cw ); 110412027Sjungma@eit.uni-kl.de } 110512027Sjungma@eit.uni-kl.de // tail cleaning not needed 110612027Sjungma@eit.uni-kl.de return x; 110712027Sjungma@eit.uni-kl.de} 110812027Sjungma@eit.uni-kl.de 110912027Sjungma@eit.uni-kl.de 111012027Sjungma@eit.uni-kl.de// bitwise xor 111112027Sjungma@eit.uni-kl.de 111212027Sjungma@eit.uni-kl.detemplate <class X, class Y> 111312027Sjungma@eit.uni-kl.deinline 111412027Sjungma@eit.uni-kl.deX& 111512027Sjungma@eit.uni-kl.deb_xor_assign_( sc_proxy<X>& a, const sc_proxy<Y>& b ) 111612027Sjungma@eit.uni-kl.de{ 111712027Sjungma@eit.uni-kl.de X& x = a.back_cast(); 111812027Sjungma@eit.uni-kl.de const Y& y = b.back_cast(); 111912027Sjungma@eit.uni-kl.de assert( x.length() == y.length() ); 112012027Sjungma@eit.uni-kl.de int sz = x.size(); 112112027Sjungma@eit.uni-kl.de for( int i = 0; i < sz; ++ i ) { 112212027Sjungma@eit.uni-kl.de sc_digit x_dw, x_cw, y_dw, y_cw; 112312027Sjungma@eit.uni-kl.de get_words_( x, i, x_dw, x_cw ); 112412027Sjungma@eit.uni-kl.de get_words_( y, i, y_dw, y_cw ); 112512027Sjungma@eit.uni-kl.de sc_digit cw = x_cw | y_cw; 112612027Sjungma@eit.uni-kl.de sc_digit dw = cw | (x_dw ^ y_dw); 112712027Sjungma@eit.uni-kl.de set_words_( x, i, dw, cw ); 112812027Sjungma@eit.uni-kl.de } 112912027Sjungma@eit.uni-kl.de // tail cleaning not needed 113012027Sjungma@eit.uni-kl.de return x; 113112027Sjungma@eit.uni-kl.de} 113212027Sjungma@eit.uni-kl.de 113312027Sjungma@eit.uni-kl.de 113412027Sjungma@eit.uni-kl.de// bitwise left shift 113512027Sjungma@eit.uni-kl.de 113612027Sjungma@eit.uni-kl.detemplate <class X> 113712027Sjungma@eit.uni-kl.deinline 113812027Sjungma@eit.uni-kl.deX& 113912027Sjungma@eit.uni-kl.desc_proxy<X>::operator <<= ( int n ) 114012027Sjungma@eit.uni-kl.de{ 114112027Sjungma@eit.uni-kl.de X& x = back_cast(); 114212027Sjungma@eit.uni-kl.de if( n < 0 ) { 114312027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 114412027Sjungma@eit.uni-kl.de std::sprintf( msg, 114512027Sjungma@eit.uni-kl.de "left shift operation is only allowed with positive " 114612027Sjungma@eit.uni-kl.de "shift values, shift value = %d", n ); 114712027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 114812027Sjungma@eit.uni-kl.de } 114912027Sjungma@eit.uni-kl.de if( n >= x.length() ) { 115012027Sjungma@eit.uni-kl.de extend_sign_w_( x, 0, false ); 115112027Sjungma@eit.uni-kl.de // no tail cleaning needed 115212027Sjungma@eit.uni-kl.de return x; 115312027Sjungma@eit.uni-kl.de } 115412027Sjungma@eit.uni-kl.de int sz = x.size(); 115512027Sjungma@eit.uni-kl.de int wn = n / SC_DIGIT_SIZE; 115612027Sjungma@eit.uni-kl.de int bn = n % SC_DIGIT_SIZE; 115712027Sjungma@eit.uni-kl.de if( wn != 0 ) { 115812027Sjungma@eit.uni-kl.de // shift words 115912027Sjungma@eit.uni-kl.de int i = sz - 1; 116012027Sjungma@eit.uni-kl.de for( ; i >= wn; -- i ) { 116112027Sjungma@eit.uni-kl.de set_words_( x, i, x.get_word( i - wn ), x.get_cword( i - wn ) ); 116212027Sjungma@eit.uni-kl.de } 116312027Sjungma@eit.uni-kl.de for( ; i >= 0; -- i ) { 116412027Sjungma@eit.uni-kl.de set_words_( x, i, SC_DIGIT_ZERO, SC_DIGIT_ZERO ); 116512027Sjungma@eit.uni-kl.de } 116612027Sjungma@eit.uni-kl.de } 116712027Sjungma@eit.uni-kl.de if( bn != 0 ) { 116812027Sjungma@eit.uni-kl.de // shift bits 116912027Sjungma@eit.uni-kl.de for( int i = sz - 1; i >= 1; -- i ) { 117012027Sjungma@eit.uni-kl.de sc_digit x_dw, x_cw; 117112027Sjungma@eit.uni-kl.de get_words_( x, i, x_dw, x_cw ); 117212027Sjungma@eit.uni-kl.de x_dw <<= bn; 117312027Sjungma@eit.uni-kl.de x_dw |= x.get_word( i - 1 ) >> (SC_DIGIT_SIZE - bn); 117412027Sjungma@eit.uni-kl.de x_cw <<= bn; 117512027Sjungma@eit.uni-kl.de x_cw |= x.get_cword( i - 1 ) >> (SC_DIGIT_SIZE - bn); 117612027Sjungma@eit.uni-kl.de set_words_( x, i, x_dw, x_cw ); 117712027Sjungma@eit.uni-kl.de } 117812027Sjungma@eit.uni-kl.de sc_digit x_dw, x_cw; 117912027Sjungma@eit.uni-kl.de get_words_( x, 0, x_dw, x_cw ); 118012027Sjungma@eit.uni-kl.de x_dw <<= bn; 118112027Sjungma@eit.uni-kl.de x_cw <<= bn; 118212027Sjungma@eit.uni-kl.de set_words_( x, 0, x_dw, x_cw ); 118312027Sjungma@eit.uni-kl.de } 118412027Sjungma@eit.uni-kl.de x.clean_tail(); 118512027Sjungma@eit.uni-kl.de return x; 118612027Sjungma@eit.uni-kl.de} 118712027Sjungma@eit.uni-kl.de 118812027Sjungma@eit.uni-kl.de 118912027Sjungma@eit.uni-kl.de// bitwise right shift 119012027Sjungma@eit.uni-kl.de 119112027Sjungma@eit.uni-kl.de 119212027Sjungma@eit.uni-kl.detemplate <class X> 119312027Sjungma@eit.uni-kl.deinline 119412027Sjungma@eit.uni-kl.deX& 119512027Sjungma@eit.uni-kl.desc_proxy<X>::operator >>= ( int n ) 119612027Sjungma@eit.uni-kl.de{ 119712027Sjungma@eit.uni-kl.de X& x = back_cast(); 119812027Sjungma@eit.uni-kl.de if( n < 0 ) { 119912027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 120012027Sjungma@eit.uni-kl.de std::sprintf( msg, 120112027Sjungma@eit.uni-kl.de "right shift operation is only allowed with positive " 120212027Sjungma@eit.uni-kl.de "shift values, shift value = %d", n ); 120312027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, msg ); 120412027Sjungma@eit.uni-kl.de } 120512027Sjungma@eit.uni-kl.de if( n >= x.length() ) { 120612027Sjungma@eit.uni-kl.de extend_sign_w_( x, 0, false ); 120712027Sjungma@eit.uni-kl.de // no tail cleaning needed 120812027Sjungma@eit.uni-kl.de return x; 120912027Sjungma@eit.uni-kl.de } 121012027Sjungma@eit.uni-kl.de int sz = x.size(); 121112027Sjungma@eit.uni-kl.de int wn = n / SC_DIGIT_SIZE; 121212027Sjungma@eit.uni-kl.de int bn = n % SC_DIGIT_SIZE; 121312027Sjungma@eit.uni-kl.de if( wn != 0 ) { 121412027Sjungma@eit.uni-kl.de // shift words 121512027Sjungma@eit.uni-kl.de int i = 0; 121612027Sjungma@eit.uni-kl.de for( ; i < (sz - wn); ++ i ) { 121712027Sjungma@eit.uni-kl.de set_words_( x, i, x.get_word( i + wn ), x.get_cword( i + wn ) ); 121812027Sjungma@eit.uni-kl.de } 121912027Sjungma@eit.uni-kl.de for( ; i < sz; ++ i ) { 122012027Sjungma@eit.uni-kl.de set_words_( x, i, SC_DIGIT_ZERO, SC_DIGIT_ZERO ); 122112027Sjungma@eit.uni-kl.de } 122212027Sjungma@eit.uni-kl.de } 122312027Sjungma@eit.uni-kl.de if( bn != 0 ) { 122412027Sjungma@eit.uni-kl.de // shift bits 122512027Sjungma@eit.uni-kl.de for( int i = 0; i < (sz - 1); ++ i ) { 122612027Sjungma@eit.uni-kl.de sc_digit x_dw, x_cw; 122712027Sjungma@eit.uni-kl.de get_words_( x, i, x_dw, x_cw ); 122812027Sjungma@eit.uni-kl.de x_dw >>= bn; 122912027Sjungma@eit.uni-kl.de x_dw |= x.get_word( i + 1 ) << (SC_DIGIT_SIZE - bn); 123012027Sjungma@eit.uni-kl.de x_cw >>= bn; 123112027Sjungma@eit.uni-kl.de x_cw |= x.get_cword( i + 1 ) << (SC_DIGIT_SIZE - bn); 123212027Sjungma@eit.uni-kl.de set_words_( x, i, x_dw, x_cw ); 123312027Sjungma@eit.uni-kl.de } 123412027Sjungma@eit.uni-kl.de sc_digit x_dw, x_cw; 123512027Sjungma@eit.uni-kl.de get_words_( x, sz - 1, x_dw, x_cw ); 123612027Sjungma@eit.uni-kl.de x_dw >>= bn; 123712027Sjungma@eit.uni-kl.de x_cw >>= bn; 123812027Sjungma@eit.uni-kl.de set_words_( x, sz - 1, x_dw, x_cw ); 123912027Sjungma@eit.uni-kl.de } 124012027Sjungma@eit.uni-kl.de x.clean_tail(); 124112027Sjungma@eit.uni-kl.de return x; 124212027Sjungma@eit.uni-kl.de} 124312027Sjungma@eit.uni-kl.de 124412027Sjungma@eit.uni-kl.de 124512027Sjungma@eit.uni-kl.de// bitwise left rotate 124612027Sjungma@eit.uni-kl.de 124712027Sjungma@eit.uni-kl.detemplate <class X> 124812027Sjungma@eit.uni-kl.deinline 124912027Sjungma@eit.uni-kl.deconst sc_lv_base 125012027Sjungma@eit.uni-kl.delrotate( const sc_proxy<X>& x, int n ); 125112027Sjungma@eit.uni-kl.de 125212027Sjungma@eit.uni-kl.de 125312027Sjungma@eit.uni-kl.de// bitwise right rotate 125412027Sjungma@eit.uni-kl.de 125512027Sjungma@eit.uni-kl.detemplate <class X> 125612027Sjungma@eit.uni-kl.deinline 125712027Sjungma@eit.uni-kl.deconst sc_lv_base 125812027Sjungma@eit.uni-kl.derrotate( const sc_proxy<X>& x, int n ); 125912027Sjungma@eit.uni-kl.de 126012027Sjungma@eit.uni-kl.de 126112027Sjungma@eit.uni-kl.de// bitwise reverse 126212027Sjungma@eit.uni-kl.de 126312027Sjungma@eit.uni-kl.detemplate <class X> 126412027Sjungma@eit.uni-kl.deinline 126512027Sjungma@eit.uni-kl.deX& 126612027Sjungma@eit.uni-kl.desc_proxy<X>::reverse() 126712027Sjungma@eit.uni-kl.de{ 126812027Sjungma@eit.uni-kl.de X& x = back_cast(); 126912027Sjungma@eit.uni-kl.de int len = x.length(); 127012027Sjungma@eit.uni-kl.de int half_len = len / 2; 127112027Sjungma@eit.uni-kl.de for( int i = 0, j = len - 1; i < half_len; ++ i, --j ) { 127212027Sjungma@eit.uni-kl.de sc_logic_value_t t = x.get_bit( i ); 127312027Sjungma@eit.uni-kl.de x.set_bit( i, x.get_bit( j ) ); 127412027Sjungma@eit.uni-kl.de x.set_bit( j, t ); 127512027Sjungma@eit.uni-kl.de } 127612027Sjungma@eit.uni-kl.de return x; 127712027Sjungma@eit.uni-kl.de} 127812027Sjungma@eit.uni-kl.de 127912027Sjungma@eit.uni-kl.detemplate <class X> 128012027Sjungma@eit.uni-kl.deinline 128112027Sjungma@eit.uni-kl.deconst sc_lv_base 128212027Sjungma@eit.uni-kl.dereverse( const sc_proxy<X>& a ); 128312027Sjungma@eit.uni-kl.de 128412027Sjungma@eit.uni-kl.de 128512027Sjungma@eit.uni-kl.de// reduce functions 128612027Sjungma@eit.uni-kl.de 128712027Sjungma@eit.uni-kl.detemplate <class X> 128812027Sjungma@eit.uni-kl.deinline 128912027Sjungma@eit.uni-kl.desc_logic_value_t 129012027Sjungma@eit.uni-kl.desc_proxy<X>::and_reduce() const 129112027Sjungma@eit.uni-kl.de{ 129212027Sjungma@eit.uni-kl.de const X& x = back_cast(); 129312027Sjungma@eit.uni-kl.de sc_logic_value_t result = sc_logic_value_t( 1 ); 129412027Sjungma@eit.uni-kl.de int len = x.length(); 129512027Sjungma@eit.uni-kl.de for( int i = 0; i < len; ++ i ) { 129612027Sjungma@eit.uni-kl.de result = sc_logic::and_table[result][x.get_bit( i )]; 129712027Sjungma@eit.uni-kl.de } 129812027Sjungma@eit.uni-kl.de return result; 129912027Sjungma@eit.uni-kl.de} 130012027Sjungma@eit.uni-kl.de 130112027Sjungma@eit.uni-kl.detemplate <class X> 130212027Sjungma@eit.uni-kl.deinline 130312027Sjungma@eit.uni-kl.desc_logic_value_t 130412027Sjungma@eit.uni-kl.desc_proxy<X>::or_reduce() const 130512027Sjungma@eit.uni-kl.de{ 130612027Sjungma@eit.uni-kl.de const X& x = back_cast(); 130712027Sjungma@eit.uni-kl.de sc_logic_value_t result = sc_logic_value_t( 0 ); 130812027Sjungma@eit.uni-kl.de int len = x.length(); 130912027Sjungma@eit.uni-kl.de for( int i = 0; i < len; ++ i ) { 131012027Sjungma@eit.uni-kl.de result = sc_logic::or_table[result][x.get_bit( i )]; 131112027Sjungma@eit.uni-kl.de } 131212027Sjungma@eit.uni-kl.de return result; 131312027Sjungma@eit.uni-kl.de} 131412027Sjungma@eit.uni-kl.de 131512027Sjungma@eit.uni-kl.detemplate <class X> 131612027Sjungma@eit.uni-kl.deinline 131712027Sjungma@eit.uni-kl.desc_logic_value_t 131812027Sjungma@eit.uni-kl.desc_proxy<X>::xor_reduce() const 131912027Sjungma@eit.uni-kl.de{ 132012027Sjungma@eit.uni-kl.de const X& x = back_cast(); 132112027Sjungma@eit.uni-kl.de sc_logic_value_t result = sc_logic_value_t( 0 ); 132212027Sjungma@eit.uni-kl.de int len = x.length(); 132312027Sjungma@eit.uni-kl.de for( int i = 0; i < len; ++ i ) { 132412027Sjungma@eit.uni-kl.de result = sc_logic::xor_table[result][x.get_bit( i )]; 132512027Sjungma@eit.uni-kl.de } 132612027Sjungma@eit.uni-kl.de return result; 132712027Sjungma@eit.uni-kl.de} 132812027Sjungma@eit.uni-kl.de 132912027Sjungma@eit.uni-kl.de 133012027Sjungma@eit.uni-kl.de// relational operators 133112027Sjungma@eit.uni-kl.de 133212027Sjungma@eit.uni-kl.detemplate <class X, class Y> 133312027Sjungma@eit.uni-kl.deinline 133412027Sjungma@eit.uni-kl.debool 133512027Sjungma@eit.uni-kl.deoperator != ( const sc_proxy<X>& px, const sc_proxy<Y>& py ) 133612027Sjungma@eit.uni-kl.de{ 133712027Sjungma@eit.uni-kl.de return !( px == py ); 133812027Sjungma@eit.uni-kl.de} 133912027Sjungma@eit.uni-kl.de 134012027Sjungma@eit.uni-kl.de 134112027Sjungma@eit.uni-kl.de#define DEFN_REL_OP_T(tp) \ 134212027Sjungma@eit.uni-kl.detemplate <class X> \ 134312027Sjungma@eit.uni-kl.deinline \ 134412027Sjungma@eit.uni-kl.debool \ 134512027Sjungma@eit.uni-kl.deoperator == ( tp b, const sc_proxy<X>& px ) \ 134612027Sjungma@eit.uni-kl.de{ \ 134712027Sjungma@eit.uni-kl.de return ( px == b ); \ 134812027Sjungma@eit.uni-kl.de} \ 134912027Sjungma@eit.uni-kl.de \ 135012027Sjungma@eit.uni-kl.detemplate <class X> \ 135112027Sjungma@eit.uni-kl.deinline \ 135212027Sjungma@eit.uni-kl.debool \ 135312027Sjungma@eit.uni-kl.deoperator != ( const sc_proxy<X>& px, tp b ) \ 135412027Sjungma@eit.uni-kl.de{ \ 135512027Sjungma@eit.uni-kl.de return !( px == b ); \ 135612027Sjungma@eit.uni-kl.de} \ 135712027Sjungma@eit.uni-kl.de \ 135812027Sjungma@eit.uni-kl.detemplate <class X> \ 135912027Sjungma@eit.uni-kl.deinline \ 136012027Sjungma@eit.uni-kl.debool \ 136112027Sjungma@eit.uni-kl.deoperator != ( tp b, const sc_proxy<X>& px ) \ 136212027Sjungma@eit.uni-kl.de{ \ 136312027Sjungma@eit.uni-kl.de return !( px == b ); \ 136412027Sjungma@eit.uni-kl.de} 136512027Sjungma@eit.uni-kl.de 136612027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const char*) 136712027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const bool*) 136812027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_logic*) 136912027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_unsigned&) 137012027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_signed&) 137112027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_uint_base&) 137212027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(const sc_int_base&) 137312027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(unsigned long) 137412027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(long) 137512027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(unsigned int) 137612027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(int) 137712027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(uint64) 137812027Sjungma@eit.uni-kl.deDEFN_REL_OP_T(int64) 137912027Sjungma@eit.uni-kl.de 138012027Sjungma@eit.uni-kl.de#undef DEFN_REL_OP_T 138112027Sjungma@eit.uni-kl.de 138212027Sjungma@eit.uni-kl.de 138312027Sjungma@eit.uni-kl.de// explicit conversions to character string 138412027Sjungma@eit.uni-kl.de 138512027Sjungma@eit.uni-kl.detemplate <class X> 138612027Sjungma@eit.uni-kl.deinline 138712027Sjungma@eit.uni-kl.deconst std::string 138812027Sjungma@eit.uni-kl.desc_proxy<X>::to_string() const 138912027Sjungma@eit.uni-kl.de{ 139012027Sjungma@eit.uni-kl.de const X& x = back_cast(); 139112027Sjungma@eit.uni-kl.de int len = x.length(); 139212027Sjungma@eit.uni-kl.de std::string s; // ( len + 1 ); 139312027Sjungma@eit.uni-kl.de for( int i = 0; i < len; ++ i ) { 139412027Sjungma@eit.uni-kl.de s += sc_logic::logic_to_char[x.get_bit( len - i - 1 )]; 139512027Sjungma@eit.uni-kl.de } 139612027Sjungma@eit.uni-kl.de return s; 139712027Sjungma@eit.uni-kl.de} 139812027Sjungma@eit.uni-kl.de 139912027Sjungma@eit.uni-kl.detemplate <class X> 140012027Sjungma@eit.uni-kl.deinline 140112027Sjungma@eit.uni-kl.deconst std::string 140212027Sjungma@eit.uni-kl.desc_proxy<X>::to_string( sc_numrep numrep ) const 140312027Sjungma@eit.uni-kl.de{ 140412027Sjungma@eit.uni-kl.de return convert_to_fmt( to_string(), numrep, true ); 140512027Sjungma@eit.uni-kl.de} 140612027Sjungma@eit.uni-kl.de 140712027Sjungma@eit.uni-kl.detemplate <class X> 140812027Sjungma@eit.uni-kl.deinline 140912027Sjungma@eit.uni-kl.deconst std::string 141012027Sjungma@eit.uni-kl.desc_proxy<X>::to_string( sc_numrep numrep, bool w_prefix ) const 141112027Sjungma@eit.uni-kl.de{ 141212027Sjungma@eit.uni-kl.de return convert_to_fmt( to_string(), numrep, w_prefix ); 141312027Sjungma@eit.uni-kl.de} 141412027Sjungma@eit.uni-kl.de 141512027Sjungma@eit.uni-kl.de 141612027Sjungma@eit.uni-kl.de// other methods 141712027Sjungma@eit.uni-kl.de 141812027Sjungma@eit.uni-kl.detemplate <class X> 141912027Sjungma@eit.uni-kl.deinline 142012027Sjungma@eit.uni-kl.devoid 142112027Sjungma@eit.uni-kl.desc_proxy<X>::scan( ::std::istream& is ) 142212027Sjungma@eit.uni-kl.de{ 142312027Sjungma@eit.uni-kl.de std::string s; 142412027Sjungma@eit.uni-kl.de is >> s; 142512027Sjungma@eit.uni-kl.de back_cast() = s.c_str(); 142612027Sjungma@eit.uni-kl.de} 142712027Sjungma@eit.uni-kl.de 142812027Sjungma@eit.uni-kl.de 142912027Sjungma@eit.uni-kl.detemplate <class X> 143012027Sjungma@eit.uni-kl.deinline 143112027Sjungma@eit.uni-kl.devoid 143212027Sjungma@eit.uni-kl.desc_proxy<X>::check_bounds( int n ) const // check if bit n accessible 143312027Sjungma@eit.uni-kl.de{ 143412027Sjungma@eit.uni-kl.de if( n < 0 || n >= back_cast().length() ) { 143512027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 143612027Sjungma@eit.uni-kl.de } 143712027Sjungma@eit.uni-kl.de} 143812027Sjungma@eit.uni-kl.de 143912027Sjungma@eit.uni-kl.detemplate <class X> 144012027Sjungma@eit.uni-kl.deinline 144112027Sjungma@eit.uni-kl.devoid 144212027Sjungma@eit.uni-kl.desc_proxy<X>::check_wbounds( int n ) const // check if word n accessible 144312027Sjungma@eit.uni-kl.de{ 144412027Sjungma@eit.uni-kl.de if( n < 0 || n >= back_cast().size() ) { 144512027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 144612027Sjungma@eit.uni-kl.de } 144712027Sjungma@eit.uni-kl.de} 144812027Sjungma@eit.uni-kl.de 144912027Sjungma@eit.uni-kl.de 145012027Sjungma@eit.uni-kl.detemplate <class X> 145112027Sjungma@eit.uni-kl.deinline 145212027Sjungma@eit.uni-kl.desc_digit 145312027Sjungma@eit.uni-kl.desc_proxy<X>::to_anything_unsigned() const 145412027Sjungma@eit.uni-kl.de{ 145512027Sjungma@eit.uni-kl.de // only 0 word is returned 145612027Sjungma@eit.uni-kl.de // can't convert logic values other than 0 and 1 145712027Sjungma@eit.uni-kl.de const X& x = back_cast(); 145812027Sjungma@eit.uni-kl.de int len = x.length(); 145912027Sjungma@eit.uni-kl.de if( x.get_cword( 0 ) != SC_DIGIT_ZERO ) { 146012027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 ); 146112027Sjungma@eit.uni-kl.de } 146212027Sjungma@eit.uni-kl.de sc_digit w = x.get_word( 0 ); 146312027Sjungma@eit.uni-kl.de if( len >= SC_DIGIT_SIZE ) { 146412027Sjungma@eit.uni-kl.de return w; 146512027Sjungma@eit.uni-kl.de } 146612027Sjungma@eit.uni-kl.de return ( w & (~SC_DIGIT_ZERO >> (SC_DIGIT_SIZE - len)) ); 146712027Sjungma@eit.uni-kl.de} 146812027Sjungma@eit.uni-kl.de 146912027Sjungma@eit.uni-kl.detemplate <class X> 147012027Sjungma@eit.uni-kl.deinline 147112027Sjungma@eit.uni-kl.deuint64 147212027Sjungma@eit.uni-kl.desc_proxy<X>::to_uint64() const 147312027Sjungma@eit.uni-kl.de{ 147412027Sjungma@eit.uni-kl.de // words 1 and 0 returned. 147512027Sjungma@eit.uni-kl.de // can't convert logic values other than 0 and 1 147612027Sjungma@eit.uni-kl.de const X& x = back_cast(); 147712027Sjungma@eit.uni-kl.de int len = x.length(); 147812027Sjungma@eit.uni-kl.de if( x.get_cword( 0 ) != SC_DIGIT_ZERO ) { 147912027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 ); 148012027Sjungma@eit.uni-kl.de } 148112027Sjungma@eit.uni-kl.de uint64 w = x.get_word( 0 ); 148212027Sjungma@eit.uni-kl.de if( len > SC_DIGIT_SIZE ) 148312027Sjungma@eit.uni-kl.de { 148412027Sjungma@eit.uni-kl.de if( x.get_cword( 1 ) != SC_DIGIT_ZERO ) { 148512027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 ); 148612027Sjungma@eit.uni-kl.de } 148712027Sjungma@eit.uni-kl.de uint64 w1 = x.get_word( 1 ); 148812027Sjungma@eit.uni-kl.de w = w | (w1 << SC_DIGIT_SIZE); 148912027Sjungma@eit.uni-kl.de return w; 149012027Sjungma@eit.uni-kl.de } 149112027Sjungma@eit.uni-kl.de else if( len == SC_DIGIT_SIZE ) 149212027Sjungma@eit.uni-kl.de { 149312027Sjungma@eit.uni-kl.de return w; 149412027Sjungma@eit.uni-kl.de } 149512027Sjungma@eit.uni-kl.de else 149612027Sjungma@eit.uni-kl.de { 149712027Sjungma@eit.uni-kl.de return ( w & (~SC_DIGIT_ZERO >> (SC_DIGIT_SIZE - len)) ); 149812027Sjungma@eit.uni-kl.de } 149912027Sjungma@eit.uni-kl.de} 150012027Sjungma@eit.uni-kl.de 150112027Sjungma@eit.uni-kl.detemplate <class X> 150212027Sjungma@eit.uni-kl.deinline 150312027Sjungma@eit.uni-kl.deint64 150412027Sjungma@eit.uni-kl.desc_proxy<X>::to_anything_signed() const 150512027Sjungma@eit.uni-kl.de{ 150612027Sjungma@eit.uni-kl.de const X& x = back_cast(); 150712027Sjungma@eit.uni-kl.de int len = x.length(); 150812027Sjungma@eit.uni-kl.de int64 w = 0; 150912027Sjungma@eit.uni-kl.de 151012027Sjungma@eit.uni-kl.de if( len > SC_DIGIT_SIZE ) 151112027Sjungma@eit.uni-kl.de { 151212027Sjungma@eit.uni-kl.de if( x.get_cword( 1 ) != SC_DIGIT_ZERO ) 151312027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 ); 151412027Sjungma@eit.uni-kl.de w = x.get_word(1); 151512027Sjungma@eit.uni-kl.de } 151612027Sjungma@eit.uni-kl.de if( x.get_cword( 0 ) != SC_DIGIT_ZERO ) 151712027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, 0 ); 151812027Sjungma@eit.uni-kl.de w = (w << SC_DIGIT_SIZE) | x.get_word( 0 ); 151912027Sjungma@eit.uni-kl.de if( len >= 64 ) { 152012027Sjungma@eit.uni-kl.de return w; 152112027Sjungma@eit.uni-kl.de } 152212027Sjungma@eit.uni-kl.de 152312027Sjungma@eit.uni-kl.de uint64 zero = 0; 152412027Sjungma@eit.uni-kl.de sc_logic_value_t sgn = x.get_bit( len - 1 ); 152512027Sjungma@eit.uni-kl.de if( sgn == 0 ) { 152612027Sjungma@eit.uni-kl.de return (int64)( w & (~zero >> (64 - len)) ); 152712027Sjungma@eit.uni-kl.de } else { 152812027Sjungma@eit.uni-kl.de return (int64)( w | (~zero << len) ); 152912027Sjungma@eit.uni-kl.de } 153012027Sjungma@eit.uni-kl.de} 153112027Sjungma@eit.uni-kl.de 153212027Sjungma@eit.uni-kl.de 153312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 153412027Sjungma@eit.uni-kl.de 153512027Sjungma@eit.uni-kl.de// functional notation for the reduce methods 153612027Sjungma@eit.uni-kl.de 153712027Sjungma@eit.uni-kl.detemplate <class X> 153812027Sjungma@eit.uni-kl.deinline 153912027Sjungma@eit.uni-kl.desc_logic_value_t 154012027Sjungma@eit.uni-kl.deand_reduce( const sc_proxy<X>& a ) 154112027Sjungma@eit.uni-kl.de{ 154212027Sjungma@eit.uni-kl.de return a.and_reduce(); 154312027Sjungma@eit.uni-kl.de} 154412027Sjungma@eit.uni-kl.de 154512027Sjungma@eit.uni-kl.detemplate <class X> 154612027Sjungma@eit.uni-kl.deinline 154712027Sjungma@eit.uni-kl.desc_logic_value_t 154812027Sjungma@eit.uni-kl.denand_reduce( const sc_proxy<X>& a ) 154912027Sjungma@eit.uni-kl.de{ 155012027Sjungma@eit.uni-kl.de return a.nand_reduce(); 155112027Sjungma@eit.uni-kl.de} 155212027Sjungma@eit.uni-kl.de 155312027Sjungma@eit.uni-kl.detemplate <class X> 155412027Sjungma@eit.uni-kl.deinline 155512027Sjungma@eit.uni-kl.desc_logic_value_t 155612027Sjungma@eit.uni-kl.deor_reduce( const sc_proxy<X>& a ) 155712027Sjungma@eit.uni-kl.de{ 155812027Sjungma@eit.uni-kl.de return a.or_reduce(); 155912027Sjungma@eit.uni-kl.de} 156012027Sjungma@eit.uni-kl.de 156112027Sjungma@eit.uni-kl.detemplate <class X> 156212027Sjungma@eit.uni-kl.deinline 156312027Sjungma@eit.uni-kl.desc_logic_value_t 156412027Sjungma@eit.uni-kl.denor_reduce( const sc_proxy<X>& a ) 156512027Sjungma@eit.uni-kl.de{ 156612027Sjungma@eit.uni-kl.de return a.nor_reduce(); 156712027Sjungma@eit.uni-kl.de} 156812027Sjungma@eit.uni-kl.de 156912027Sjungma@eit.uni-kl.detemplate <class X> 157012027Sjungma@eit.uni-kl.deinline 157112027Sjungma@eit.uni-kl.desc_logic_value_t 157212027Sjungma@eit.uni-kl.dexor_reduce( const sc_proxy<X>& a ) 157312027Sjungma@eit.uni-kl.de{ 157412027Sjungma@eit.uni-kl.de return a.xor_reduce(); 157512027Sjungma@eit.uni-kl.de} 157612027Sjungma@eit.uni-kl.de 157712027Sjungma@eit.uni-kl.detemplate <class X> 157812027Sjungma@eit.uni-kl.deinline 157912027Sjungma@eit.uni-kl.desc_logic_value_t 158012027Sjungma@eit.uni-kl.dexnor_reduce( const sc_proxy<X>& a ) 158112027Sjungma@eit.uni-kl.de{ 158212027Sjungma@eit.uni-kl.de return a.xnor_reduce(); 158312027Sjungma@eit.uni-kl.de} 158412027Sjungma@eit.uni-kl.de 158512027Sjungma@eit.uni-kl.de 158612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 158712027Sjungma@eit.uni-kl.de 158812027Sjungma@eit.uni-kl.detemplate <class X> 158912027Sjungma@eit.uni-kl.deinline 159012027Sjungma@eit.uni-kl.de::std::ostream& 159112027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_proxy<X>& a ) 159212027Sjungma@eit.uni-kl.de{ 159312027Sjungma@eit.uni-kl.de a.print( os ); 159412027Sjungma@eit.uni-kl.de return os; 159512027Sjungma@eit.uni-kl.de} 159612027Sjungma@eit.uni-kl.de 159712027Sjungma@eit.uni-kl.detemplate <class X> 159812027Sjungma@eit.uni-kl.deinline 159912027Sjungma@eit.uni-kl.de::std::istream& 160012027Sjungma@eit.uni-kl.deoperator >> ( ::std::istream& is, sc_proxy<X>& a ) 160112027Sjungma@eit.uni-kl.de{ 160212027Sjungma@eit.uni-kl.de a.scan( is ); 160312027Sjungma@eit.uni-kl.de return is; 160412027Sjungma@eit.uni-kl.de} 160512027Sjungma@eit.uni-kl.de 160612027Sjungma@eit.uni-kl.de} // namespace sc_dt 160712027Sjungma@eit.uni-kl.de 160812027Sjungma@eit.uni-kl.de 160912027Sjungma@eit.uni-kl.de#endif 1610