00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "sysc/datatypes/bit/sc_bit_ids.h"
00047 #include "sysc/datatypes/bit/sc_lv_base.h"
00048
00049
00050 namespace sc_dt
00051 {
00052
00053
00054
00055
00056
00057
00058
00059 static const sc_digit data_array[] =
00060 { SC_DIGIT_ZERO, ~SC_DIGIT_ZERO, SC_DIGIT_ZERO, ~SC_DIGIT_ZERO };
00061
00062 static const sc_digit ctrl_array[] =
00063 { SC_DIGIT_ZERO, SC_DIGIT_ZERO, ~SC_DIGIT_ZERO, ~SC_DIGIT_ZERO };
00064
00065
00066 void
00067 sc_lv_base::init( int length_, const sc_logic& init_value )
00068 {
00069
00070 if( length_ <= 0 ) {
00071 SC_REPORT_ERROR( sc_core::SC_ID_ZERO_LENGTH_, 0 );
00072 }
00073
00074 m_len = length_;
00075 m_size = (m_len - 1) / SC_DIGIT_SIZE + 1;
00076 m_data = new sc_digit[m_size * 2];
00077 m_ctrl = m_data + m_size;
00078
00079 sc_digit dw = data_array[init_value.value()];
00080 sc_digit cw = ctrl_array[init_value.value()];
00081 int sz = m_size;
00082 for( int i = 0; i < sz; ++ i ) {
00083 m_data[i] = dw;
00084 m_ctrl[i] = cw;
00085 }
00086 clean_tail();
00087 }
00088
00089
00090 void
00091 sc_lv_base::assign_from_string( const std::string& s )
00092 {
00093
00094 int len = m_len;
00095 int s_len = s.length() - 1;
00096 int min_len = sc_min( len, s_len );
00097 int i = 0;
00098 for( ; i < min_len; ++ i ) {
00099 char c = s[s_len - i - 1];
00100 set_bit( i, sc_logic::char_to_logic[(int)c] );
00101 }
00102
00103 sc_logic_value_t fill = (s[s_len] == 'F' ? sc_logic_value_t( s[0] - '0' )
00104 : sc_logic_value_t( 0 ));
00105 for( ; i < len; ++ i ) {
00106 set_bit( i, fill );
00107 }
00108 }
00109
00110
00111
00112
00113 sc_lv_base::sc_lv_base( const char* a )
00114 : m_len( 0 ), m_size( 0 ), m_data( 0 ), m_ctrl( 0 )
00115 {
00116 std::string s = convert_to_bin( a );
00117 init( s.length() - 1 );
00118 assign_from_string( s );
00119 }
00120
00121 sc_lv_base::sc_lv_base( const char* a, int length_ )
00122 : m_len( 0 ), m_size( 0 ), m_data( 0 ), m_ctrl( 0 )
00123 {
00124 init( length_ );
00125 assign_from_string( convert_to_bin( a ) );
00126 }
00127
00128 sc_lv_base::sc_lv_base( const sc_lv_base& a )
00129 : m_len( a.m_len ),
00130 m_size( a.m_size ),
00131 m_data( new sc_digit[m_size * 2] ),
00132 m_ctrl( m_data + m_size )
00133 {
00134
00135 int sz = m_size;
00136 for( int i = 0; i < sz; ++ i ) {
00137 m_data[i] = a.m_data[i];
00138 m_ctrl[i] = a.m_ctrl[i];
00139 }
00140 }
00141
00142
00143
00144
00145 sc_lv_base&
00146 sc_lv_base::operator = ( const char* a )
00147 {
00148 assign_from_string( convert_to_bin( a ) );
00149 return *this;
00150 }
00151
00152
00153
00154
00155 bool
00156 sc_lv_base::is_01() const
00157 {
00158 int sz = m_size;
00159 for( int i = 0; i < sz; ++ i ) {
00160 if( m_ctrl[i] != 0 ) {
00161 return false;
00162 }
00163 }
00164 return true;
00165 }
00166
00167 }