| /***************************************************************************** | |
| Licensed to Accellera Systems Initiative Inc. (Accellera) under one or | |
| more contributor license agreements. See the NOTICE file distributed | |
| with this work for additional information regarding copyright ownership. | |
| Accellera licenses this file to you under the Apache License, Version 2.0 | |
| (the "License"); you may not use this file except in compliance with the | |
| License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | |
| implied. See the License for the specific language governing | |
| permissions and limitations under the License. | |
| *****************************************************************************/ | |
| /***************************************************************************** | |
| sc_unsigned_bitref.h -- Proxy class that is declared in sc_unsigned.h. | |
| Original Author: Ali Dasdan, Synopsys, Inc. | |
| *****************************************************************************/ | |
| /***************************************************************************** | |
| MODIFICATION LOG - modifiers, enter your name, affiliation, date and | |
| changes you are making here. | |
| Name, Affiliation, Date: | |
| Description of Modification: | |
| *****************************************************************************/ | |
| // ---------------------------------------------------------------------------- | |
| // CLASS : sc_unsigned_bitref_r | |
| // | |
| // Proxy class for sc_unsigned bit selection (r-value only). | |
| // ---------------------------------------------------------------------------- | |
| // implicit conversion to uint64 | |
| sc_unsigned_bitref_r::operator uint64 () const | |
| { | |
| return m_obj_p->test(m_index); | |
| } | |
| bool | |
| sc_unsigned_bitref_r::operator ! () const | |
| { | |
| return (!m_obj_p->test(m_index)); | |
| } | |
| bool | |
| sc_unsigned_bitref_r::operator ~ () const | |
| { | |
| return (!m_obj_p->test(m_index)); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // CLASS : sc_unsigned_bitref | |
| // | |
| // Proxy class for sc_unsigned bit selection (r-value and l-value). | |
| // ---------------------------------------------------------------------------- | |
| // assignment operators | |
| const sc_unsigned_bitref & | |
| sc_unsigned_bitref::operator = (const sc_unsigned_bitref_r &b) | |
| { | |
| m_obj_p->set(m_index, (bool)b); | |
| return *this; | |
| } | |
| const sc_unsigned_bitref & | |
| sc_unsigned_bitref::operator = (const sc_unsigned_bitref &b) | |
| { | |
| m_obj_p->set(m_index, (bool)b); | |
| return *this; | |
| } | |
| const sc_unsigned_bitref & | |
| sc_unsigned_bitref::operator = (bool b) | |
| { | |
| m_obj_p->set(m_index, b); | |
| return *this; | |
| } | |
| const sc_unsigned_bitref & | |
| sc_unsigned_bitref::operator &= (bool b) | |
| { | |
| if (!b) { | |
| m_obj_p->clear(m_index); | |
| } | |
| return *this; | |
| } | |
| const sc_unsigned_bitref & | |
| sc_unsigned_bitref::operator |= (bool b) | |
| { | |
| if (b) { | |
| m_obj_p->set(m_index); | |
| } | |
| return *this; | |
| } | |
| const sc_unsigned_bitref & | |
| sc_unsigned_bitref::operator ^= (bool b) | |
| { | |
| if (b) { | |
| m_obj_p->invert(m_index); | |
| } | |
| return *this; | |
| } | |
| // #### OPTIMIZE | |
| void | |
| sc_unsigned_bitref::concat_set(int64 src, int low_i) | |
| { | |
| bool value = 1 & ((low_i < 64) ? (src >> low_i) : (src >> 63)); | |
| m_obj_p->set(low_i, value); | |
| } | |
| void | |
| sc_unsigned_bitref::concat_set(const sc_signed &src, int low_i) | |
| { | |
| if (low_i < src.length()) | |
| m_obj_p->set(low_i, src.test(low_i)); | |
| else | |
| m_obj_p->set(low_i, src < 0); | |
| } | |
| void | |
| sc_unsigned_bitref::concat_set(const sc_unsigned &src, int low_i) | |
| { | |
| if (low_i < src.nbits) | |
| m_obj_p->set(low_i, src.test(low_i)); | |
| else | |
| m_obj_p->set(low_i, 0); | |
| } | |
| void | |
| sc_unsigned_bitref::concat_set(uint64 src, int low_i) | |
| { | |
| bool value = ((low_i < 64) ? (src >> low_i) & 1 : 0); | |
| m_obj_p->set(low_i, value); | |
| } | |
| // other methods | |
| void | |
| sc_unsigned_bitref::scan(::std::istream &is) | |
| { | |
| bool b; | |
| is >> b; | |
| *this = b; | |
| } |