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_bv_base.h -- Arbitrary size bit vector class. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Gene Bushuyev, Synopsys, Inc. 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de *****************************************************************************/ 2712027Sjungma@eit.uni-kl.de 2812027Sjungma@eit.uni-kl.de/***************************************************************************** 2912027Sjungma@eit.uni-kl.de 3012027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3112027Sjungma@eit.uni-kl.de changes you are making here. 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 3412027Sjungma@eit.uni-kl.de Description of Modification: 3512027Sjungma@eit.uni-kl.de 3612027Sjungma@eit.uni-kl.de *****************************************************************************/ 3712027Sjungma@eit.uni-kl.de 3812027Sjungma@eit.uni-kl.de// $Log: sc_bv_base.h,v $ 3912027Sjungma@eit.uni-kl.de// Revision 1.3 2011/08/26 22:32:00 acg 4012027Sjungma@eit.uni-kl.de// Torsten Maehne: added parentheses to make opearator ordering more obvious. 4112027Sjungma@eit.uni-kl.de// 4212027Sjungma@eit.uni-kl.de// Revision 1.2 2011/08/15 16:43:24 acg 4312027Sjungma@eit.uni-kl.de// Torsten Maehne: changes to remove unused argument warnings. 4412027Sjungma@eit.uni-kl.de// 4512027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:04 acg 4612027Sjungma@eit.uni-kl.de// SystemC 2.3 4712027Sjungma@eit.uni-kl.de// 4812027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:53:53 acg 4912027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in 5012027Sjungma@eit.uni-kl.de// the source. 5112027Sjungma@eit.uni-kl.de// 5212027Sjungma@eit.uni-kl.de 5312027Sjungma@eit.uni-kl.de#ifndef SC_BV_BASE_H 5412027Sjungma@eit.uni-kl.de#define SC_BV_BASE_H 5512027Sjungma@eit.uni-kl.de 5612027Sjungma@eit.uni-kl.de 5712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit_ids.h" 5812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit_proxies.h" 5912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_proxy.h" 6012027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_length_param.h" 6112027Sjungma@eit.uni-kl.de 6212027Sjungma@eit.uni-kl.de 6312027Sjungma@eit.uni-kl.denamespace sc_dt 6412027Sjungma@eit.uni-kl.de{ 6512027Sjungma@eit.uni-kl.de 6612027Sjungma@eit.uni-kl.de// classes defined in this module 6712027Sjungma@eit.uni-kl.declass sc_bv_base; 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.de 7012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 7112027Sjungma@eit.uni-kl.de// CLASS : sc_bv_base 7212027Sjungma@eit.uni-kl.de// 7312027Sjungma@eit.uni-kl.de// Arbitrary size bit vector base class. 7412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 7512027Sjungma@eit.uni-kl.de 7612027Sjungma@eit.uni-kl.declass sc_bv_base 7712027Sjungma@eit.uni-kl.de : public sc_proxy<sc_bv_base> 7812027Sjungma@eit.uni-kl.de{ 7912027Sjungma@eit.uni-kl.de friend class sc_lv_base; 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.de 8212027Sjungma@eit.uni-kl.de void init( int length_, bool init_value = false ); 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.de void assign_from_string( const std::string& ); 8512027Sjungma@eit.uni-kl.de 8612027Sjungma@eit.uni-kl.depublic: 8712027Sjungma@eit.uni-kl.de 8812027Sjungma@eit.uni-kl.de // typedefs 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.de typedef sc_proxy<sc_bv_base> base_type; 9112027Sjungma@eit.uni-kl.de 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.de // constructors 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.de explicit sc_bv_base( int length_ = sc_length_param().len() ) 9612027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 9712027Sjungma@eit.uni-kl.de { init( length_ ); } 9812027Sjungma@eit.uni-kl.de 9912027Sjungma@eit.uni-kl.de explicit sc_bv_base( bool a, 10012027Sjungma@eit.uni-kl.de int length_ = sc_length_param().len() ) 10112027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 10212027Sjungma@eit.uni-kl.de { init( length_, a ); } 10312027Sjungma@eit.uni-kl.de 10412027Sjungma@eit.uni-kl.de sc_bv_base( const char* a ); 10512027Sjungma@eit.uni-kl.de 10612027Sjungma@eit.uni-kl.de sc_bv_base( const char* a, int length_ ); 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.de template <class X> 10912027Sjungma@eit.uni-kl.de sc_bv_base( const sc_proxy<X>& a ) 11012027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 11112027Sjungma@eit.uni-kl.de { init( a.back_cast().length() ); base_type::assign_( a ); } 11212027Sjungma@eit.uni-kl.de 11312027Sjungma@eit.uni-kl.de sc_bv_base( const sc_bv_base& a ); 11412027Sjungma@eit.uni-kl.de 11512027Sjungma@eit.uni-kl.de#ifdef SC_DT_DEPRECATED 11612027Sjungma@eit.uni-kl.de 11712027Sjungma@eit.uni-kl.de explicit sc_bv_base( const sc_unsigned& a ) 11812027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 11912027Sjungma@eit.uni-kl.de { init( a.length() ); base_type::assign_( a ); } 12012027Sjungma@eit.uni-kl.de 12112027Sjungma@eit.uni-kl.de explicit sc_bv_base( const sc_signed& a ) 12212027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 12312027Sjungma@eit.uni-kl.de { init( a.length() ); base_type::assign_( a ); } 12412027Sjungma@eit.uni-kl.de 12512027Sjungma@eit.uni-kl.de explicit sc_bv_base( const sc_uint_base& a) 12612027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 12712027Sjungma@eit.uni-kl.de { init( a.length() ); base_type::assign_( a ); } 12812027Sjungma@eit.uni-kl.de 12912027Sjungma@eit.uni-kl.de explicit sc_bv_base( const sc_int_base& a) 13012027Sjungma@eit.uni-kl.de : m_len( 0 ), m_size( 0 ), m_data( 0 ) 13112027Sjungma@eit.uni-kl.de { init( a.length() ); base_type::assign_( a ); } 13212027Sjungma@eit.uni-kl.de 13312027Sjungma@eit.uni-kl.de#endif 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.de 13612027Sjungma@eit.uni-kl.de // destructor 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.de virtual ~sc_bv_base() 13912027Sjungma@eit.uni-kl.de { delete [] m_data; } 14012027Sjungma@eit.uni-kl.de 14112027Sjungma@eit.uni-kl.de 14212027Sjungma@eit.uni-kl.de // assignment operators 14312027Sjungma@eit.uni-kl.de 14412027Sjungma@eit.uni-kl.de template <class X> 14512027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const sc_proxy<X>& a ) 14612027Sjungma@eit.uni-kl.de { assign_p_( *this, a ); return *this; } 14712027Sjungma@eit.uni-kl.de 14812027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const sc_bv_base& a ) 14912027Sjungma@eit.uni-kl.de { assign_p_( *this, a ); return *this; } 15012027Sjungma@eit.uni-kl.de 15112027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const char* a ); 15212027Sjungma@eit.uni-kl.de 15312027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const bool* a ) 15412027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 15512027Sjungma@eit.uni-kl.de 15612027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const sc_logic* a ) 15712027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const sc_unsigned& a ) 16012027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 16112027Sjungma@eit.uni-kl.de 16212027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const sc_signed& a ) 16312027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 16412027Sjungma@eit.uni-kl.de 16512027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const sc_uint_base& a ) 16612027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 16712027Sjungma@eit.uni-kl.de 16812027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( const sc_int_base& a ) 16912027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 17012027Sjungma@eit.uni-kl.de 17112027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( unsigned long a ) 17212027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 17312027Sjungma@eit.uni-kl.de 17412027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( long a ) 17512027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( unsigned int a ) 17812027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 17912027Sjungma@eit.uni-kl.de 18012027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( int a ) 18112027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 18212027Sjungma@eit.uni-kl.de 18312027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( uint64 a ) 18412027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 18512027Sjungma@eit.uni-kl.de 18612027Sjungma@eit.uni-kl.de sc_bv_base& operator = ( int64 a ) 18712027Sjungma@eit.uni-kl.de { base_type::assign_( a ); return *this; } 18812027Sjungma@eit.uni-kl.de 18912027Sjungma@eit.uni-kl.de 19012027Sjungma@eit.uni-kl.de#if 0 19112027Sjungma@eit.uni-kl.de 19212027Sjungma@eit.uni-kl.de // bitwise complement 19312027Sjungma@eit.uni-kl.de 19412027Sjungma@eit.uni-kl.de sc_bv_base& b_not(); 19512027Sjungma@eit.uni-kl.de 19612027Sjungma@eit.uni-kl.de const sc_bv_base operator ~ () const 19712027Sjungma@eit.uni-kl.de { sc_bv_base a( *this ); return a.b_not(); } 19812027Sjungma@eit.uni-kl.de 19912027Sjungma@eit.uni-kl.de 20012027Sjungma@eit.uni-kl.de // bitwise left shift 20112027Sjungma@eit.uni-kl.de 20212027Sjungma@eit.uni-kl.de sc_bv_base& operator <<= ( int n ); 20312027Sjungma@eit.uni-kl.de 20412027Sjungma@eit.uni-kl.de const sc_bv_base operator << ( int n ) const 20512027Sjungma@eit.uni-kl.de { sc_bv_base a( *this ); return ( a <<= n ); } 20612027Sjungma@eit.uni-kl.de 20712027Sjungma@eit.uni-kl.de 20812027Sjungma@eit.uni-kl.de // bitwise right shift 20912027Sjungma@eit.uni-kl.de 21012027Sjungma@eit.uni-kl.de sc_bv_base& operator >>= ( int n ); 21112027Sjungma@eit.uni-kl.de 21212027Sjungma@eit.uni-kl.de const sc_bv_base operator >> ( int n ) const 21312027Sjungma@eit.uni-kl.de { sc_bv_base a( *this ); return ( a >>= n ); } 21412027Sjungma@eit.uni-kl.de 21512027Sjungma@eit.uni-kl.de 21612027Sjungma@eit.uni-kl.de // bitwise left rotate 21712027Sjungma@eit.uni-kl.de 21812027Sjungma@eit.uni-kl.de sc_bv_base& lrotate( int n ); 21912027Sjungma@eit.uni-kl.de 22012027Sjungma@eit.uni-kl.de 22112027Sjungma@eit.uni-kl.de // bitwise right rotate 22212027Sjungma@eit.uni-kl.de 22312027Sjungma@eit.uni-kl.de sc_bv_base& rrotate( int n ); 22412027Sjungma@eit.uni-kl.de 22512027Sjungma@eit.uni-kl.de#endif 22612027Sjungma@eit.uni-kl.de 22712027Sjungma@eit.uni-kl.de 22812027Sjungma@eit.uni-kl.de // common methods 22912027Sjungma@eit.uni-kl.de 23012027Sjungma@eit.uni-kl.de int length() const 23112027Sjungma@eit.uni-kl.de { return m_len; } 23212027Sjungma@eit.uni-kl.de 23312027Sjungma@eit.uni-kl.de int size() const 23412027Sjungma@eit.uni-kl.de { return m_size; } 23512027Sjungma@eit.uni-kl.de 23612027Sjungma@eit.uni-kl.de sc_logic_value_t get_bit( int i ) const; 23712027Sjungma@eit.uni-kl.de void set_bit( int i, sc_logic_value_t value ); 23812027Sjungma@eit.uni-kl.de 23912027Sjungma@eit.uni-kl.de sc_digit get_word( int i ) const 24012027Sjungma@eit.uni-kl.de { return m_data[i]; } 24112027Sjungma@eit.uni-kl.de 24212027Sjungma@eit.uni-kl.de void set_word( int i, sc_digit w ) 24312027Sjungma@eit.uni-kl.de { m_data[i] = w; } 24412027Sjungma@eit.uni-kl.de 24512027Sjungma@eit.uni-kl.de sc_digit get_cword( int /*i*/ ) const 24612027Sjungma@eit.uni-kl.de { return SC_DIGIT_ZERO; } 24712027Sjungma@eit.uni-kl.de 24812027Sjungma@eit.uni-kl.de void set_cword( int i, sc_digit w ); 24912027Sjungma@eit.uni-kl.de 25012027Sjungma@eit.uni-kl.de void clean_tail(); 25112027Sjungma@eit.uni-kl.de 25212027Sjungma@eit.uni-kl.de 25312027Sjungma@eit.uni-kl.de // other methods 25412027Sjungma@eit.uni-kl.de 25512027Sjungma@eit.uni-kl.de bool is_01() const 25612027Sjungma@eit.uni-kl.de { return true; } 25712027Sjungma@eit.uni-kl.de 25812027Sjungma@eit.uni-kl.deprotected: 25912027Sjungma@eit.uni-kl.de 26012027Sjungma@eit.uni-kl.de int m_len; // length in bits 26112027Sjungma@eit.uni-kl.de int m_size; // size of data array 26212027Sjungma@eit.uni-kl.de sc_digit* m_data; // data array 26312027Sjungma@eit.uni-kl.de}; 26412027Sjungma@eit.uni-kl.de 26512027Sjungma@eit.uni-kl.de 26612027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 26712027Sjungma@eit.uni-kl.de 26812027Sjungma@eit.uni-kl.de#if 0 26912027Sjungma@eit.uni-kl.de 27012027Sjungma@eit.uni-kl.de// bitwise left rotate 27112027Sjungma@eit.uni-kl.de 27212027Sjungma@eit.uni-kl.deinline 27312027Sjungma@eit.uni-kl.deconst sc_bv_base 27412027Sjungma@eit.uni-kl.delrotate( const sc_bv_base& x, int n ) 27512027Sjungma@eit.uni-kl.de{ 27612027Sjungma@eit.uni-kl.de sc_bv_base a( x ); 27712027Sjungma@eit.uni-kl.de return a.lrotate( n ); 27812027Sjungma@eit.uni-kl.de} 27912027Sjungma@eit.uni-kl.de 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.de// bitwise right rotate 28212027Sjungma@eit.uni-kl.de 28312027Sjungma@eit.uni-kl.deinline 28412027Sjungma@eit.uni-kl.deconst sc_bv_base 28512027Sjungma@eit.uni-kl.derrotate( const sc_bv_base& x, int n ) 28612027Sjungma@eit.uni-kl.de{ 28712027Sjungma@eit.uni-kl.de sc_bv_base a( x ); 28812027Sjungma@eit.uni-kl.de return a.rrotate( n ); 28912027Sjungma@eit.uni-kl.de} 29012027Sjungma@eit.uni-kl.de 29112027Sjungma@eit.uni-kl.de#endif 29212027Sjungma@eit.uni-kl.de 29312027Sjungma@eit.uni-kl.de 29412027Sjungma@eit.uni-kl.de// common methods 29512027Sjungma@eit.uni-kl.de 29612027Sjungma@eit.uni-kl.deinline 29712027Sjungma@eit.uni-kl.desc_logic_value_t 29812027Sjungma@eit.uni-kl.desc_bv_base::get_bit( int i ) const 29912027Sjungma@eit.uni-kl.de{ 30012027Sjungma@eit.uni-kl.de int wi = i / SC_DIGIT_SIZE; 30112027Sjungma@eit.uni-kl.de int bi = i % SC_DIGIT_SIZE; 30212027Sjungma@eit.uni-kl.de return sc_logic_value_t( (m_data[wi] >> bi) & SC_DIGIT_ONE ); 30312027Sjungma@eit.uni-kl.de} 30412027Sjungma@eit.uni-kl.de 30512027Sjungma@eit.uni-kl.deinline 30612027Sjungma@eit.uni-kl.devoid 30712027Sjungma@eit.uni-kl.desc_bv_base::set_bit( int i, sc_logic_value_t value ) 30812027Sjungma@eit.uni-kl.de{ 30912027Sjungma@eit.uni-kl.de int wi = i / SC_DIGIT_SIZE; 31012027Sjungma@eit.uni-kl.de int bi = i % SC_DIGIT_SIZE; 31112027Sjungma@eit.uni-kl.de sc_digit mask = SC_DIGIT_ONE << bi; 31212027Sjungma@eit.uni-kl.de m_data[wi] |= mask; // set bit to 1 31312027Sjungma@eit.uni-kl.de m_data[wi] &= value << bi | ~mask; 31412027Sjungma@eit.uni-kl.de} 31512027Sjungma@eit.uni-kl.de 31612027Sjungma@eit.uni-kl.de 31712027Sjungma@eit.uni-kl.deinline 31812027Sjungma@eit.uni-kl.devoid 31912027Sjungma@eit.uni-kl.desc_bv_base::set_cword( int /*i*/, sc_digit w ) 32012027Sjungma@eit.uni-kl.de{ 32112027Sjungma@eit.uni-kl.de if( w ) { 32212027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( sc_core::SC_ID_SC_BV_CANNOT_CONTAIN_X_AND_Z_, 0 ); 32312027Sjungma@eit.uni-kl.de } 32412027Sjungma@eit.uni-kl.de} 32512027Sjungma@eit.uni-kl.de 32612027Sjungma@eit.uni-kl.de 32712027Sjungma@eit.uni-kl.deinline 32812027Sjungma@eit.uni-kl.devoid 32912027Sjungma@eit.uni-kl.desc_bv_base::clean_tail() 33012027Sjungma@eit.uni-kl.de{ 33112027Sjungma@eit.uni-kl.de int wi = m_size - 1; 33212027Sjungma@eit.uni-kl.de int bi = m_len % SC_DIGIT_SIZE; 33312027Sjungma@eit.uni-kl.de if ( bi != 0 ) m_data[wi] &= ~SC_DIGIT_ZERO >> (SC_DIGIT_SIZE - bi); 33412027Sjungma@eit.uni-kl.de} 33512027Sjungma@eit.uni-kl.de 33612027Sjungma@eit.uni-kl.de} // namespace sc_dt 33712027Sjungma@eit.uni-kl.de 33812027Sjungma@eit.uni-kl.de 33912027Sjungma@eit.uni-kl.de#endif 340