1/*****************************************************************************
2
3  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4  more contributor license agreements.  See the NOTICE file distributed
5  with this work for additional information regarding copyright ownership.
6  Accellera licenses this file to you under the Apache License, Version 2.0
7  (the "License"); you may not use this file except in compliance with the
8  License.  You may obtain a copy of the License at
9
10    http://www.apache.org/licenses/LICENSE-2.0
11
12  Unless required by applicable law or agreed to in writing, software
13  distributed under the License is distributed on an "AS IS" BASIS,
14  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15  implied.  See the License for the specific language governing
16  permissions and limitations under the License.
17
18 *****************************************************************************/
19
20/*****************************************************************************
21
22  sc_unsigned_bitref.h -- Proxy class that is declared in sc_unsigned.h.
23
24  Original Author: Ali Dasdan, Synopsys, Inc.
25
26 *****************************************************************************/
27
28/*****************************************************************************
29
30  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
31  changes you are making here.
32
33      Name, Affiliation, Date:
34  Description of Modification:
35
36 *****************************************************************************/
37
38
39// ----------------------------------------------------------------------------
40//  CLASS : sc_unsigned_bitref_r
41//
42//  Proxy class for sc_unsigned bit selection (r-value only).
43// ----------------------------------------------------------------------------
44
45// implicit conversion to uint64
46
47sc_unsigned_bitref_r::operator uint64 () const
48{
49    return m_obj_p->test( m_index );
50}
51
52bool
53sc_unsigned_bitref_r::operator ! () const
54{
55    return ( ! m_obj_p->test( m_index ) );
56}
57
58bool
59sc_unsigned_bitref_r::operator ~ () const
60{
61    return ( ! m_obj_p->test( m_index ) );
62}
63
64
65// ----------------------------------------------------------------------------
66//  CLASS : sc_unsigned_bitref
67//
68//  Proxy class for sc_unsigned bit selection (r-value and l-value).
69// ----------------------------------------------------------------------------
70
71// assignment operators
72
73const sc_unsigned_bitref&
74sc_unsigned_bitref::operator = ( const sc_unsigned_bitref_r& b )
75{
76    m_obj_p->set( m_index, (bool) b );
77    return *this;
78}
79
80const sc_unsigned_bitref&
81sc_unsigned_bitref::operator = ( const sc_unsigned_bitref& b )
82{
83    m_obj_p->set( m_index, (bool) b );
84    return *this;
85}
86
87const sc_unsigned_bitref&
88sc_unsigned_bitref::operator = ( bool b )
89{
90    m_obj_p->set( m_index, b );
91    return *this;
92}
93
94
95const sc_unsigned_bitref&
96sc_unsigned_bitref::operator &= ( bool b )
97{
98    if( ! b ) {
99	m_obj_p->clear( m_index );
100    }
101    return *this;
102}
103
104const sc_unsigned_bitref&
105sc_unsigned_bitref::operator |= ( bool b )
106{
107    if( b ) {
108	m_obj_p->set( m_index );
109    }
110    return *this;
111}
112
113const sc_unsigned_bitref&
114sc_unsigned_bitref::operator ^= ( bool b )
115{
116    if( b ) {
117	m_obj_p->invert( m_index );
118    }
119    return *this;
120}
121
122// #### OPTIMIZE
123void sc_unsigned_bitref::concat_set(int64 src, int low_i)
124{
125	bool value = 1 & ((low_i < 64) ? (src >> low_i) : (src >> 63));
126    m_obj_p->set(low_i, value);
127}
128
129void sc_unsigned_bitref::concat_set(const sc_signed& src, int low_i)
130{
131    if ( low_i < src.length() )
132        m_obj_p->set(low_i, src.test(low_i));
133    else
134        m_obj_p->set(low_i, src<0);
135}
136
137void sc_unsigned_bitref::concat_set(const sc_unsigned& src, int low_i)
138{
139    if ( low_i < src.nbits )
140        m_obj_p->set(low_i, src.test(low_i));
141    else
142        m_obj_p->set(low_i, 0);
143}
144
145void sc_unsigned_bitref::concat_set(uint64 src, int low_i)
146{
147	bool value = ((low_i < 64) ? (src >> low_i)&1 : 0);
148    m_obj_p->set(low_i, value);
149}
150
151// other methods
152
153void
154sc_unsigned_bitref::scan( ::std::istream& is )
155{
156    bool b;
157    is >> b;
158    *this = b;
159}
160
161
162// End of file
163