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_signed_bitref.h -- Proxy class that is declared in sc_signed.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_signed_bitref_r
41//
42//  Proxy class for sc_signed bit selection (r-value only).
43// ----------------------------------------------------------------------------
44
45// implicit conversion to uint64
46
47sc_signed_bitref_r::operator uint64 () const
48{
49    return m_obj_p->test( m_index );
50}
51
52bool
53sc_signed_bitref_r::operator ! () const
54{
55    return ( ! m_obj_p->test( m_index ) );
56}
57
58bool
59sc_signed_bitref_r::operator ~ () const
60{
61    return ( ! m_obj_p->test( m_index ) );
62}
63
64
65// ----------------------------------------------------------------------------
66//  CLASS : sc_signed_bitref
67//
68//  Proxy class for sc_signed bit selection (r-value and l-value).
69// ----------------------------------------------------------------------------
70
71// assignment operators
72
73const sc_signed_bitref&
74sc_signed_bitref::operator = ( const sc_signed_bitref_r& b )
75{
76    m_obj_p->set( m_index, (bool) b );
77    return *this;
78}
79
80const sc_signed_bitref&
81sc_signed_bitref::operator = ( const sc_signed_bitref& b )
82{
83    m_obj_p->set( m_index, (bool) b );
84    return *this;
85}
86
87const sc_signed_bitref&
88sc_signed_bitref::operator = ( bool b )
89{
90    m_obj_p->set( m_index, b );
91    return *this;
92}
93
94
95const sc_signed_bitref&
96sc_signed_bitref::operator &= ( bool b )
97{
98    if( ! b ) {
99	m_obj_p->clear( m_index );
100    }
101    return *this;
102}
103
104const sc_signed_bitref&
105sc_signed_bitref::operator |= ( bool b )
106{
107    if( b ) {
108	m_obj_p->set( m_index );
109    }
110    return *this;
111}
112
113const sc_signed_bitref&
114sc_signed_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_signed_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_signed_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_signed_bitref::concat_set(const sc_unsigned& src, int low_i)
138{
139    if ( low_i < src.length() )
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_signed_bitref::concat_set(uint64 src, int low_i)
146{
147	bool value = 1 & ((low_i < 64) ? (src >> low_i) : 0);
148    m_obj_p->set(low_i, value);
149}
150
151
152// other methods
153
154void
155sc_signed_bitref::scan( ::std::istream& is )
156{
157    bool b;
158    is >> b;
159    *this = b;
160}
161
162
163// End of file
164