112853Sgabeblack@google.com/*****************************************************************************
212853Sgabeblack@google.com
312853Sgabeblack@google.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412853Sgabeblack@google.com  more contributor license agreements.  See the NOTICE file distributed
512853Sgabeblack@google.com  with this work for additional information regarding copyright ownership.
612853Sgabeblack@google.com  Accellera licenses this file to you under the Apache License, Version 2.0
712853Sgabeblack@google.com  (the "License"); you may not use this file except in compliance with the
812853Sgabeblack@google.com  License.  You may obtain a copy of the License at
912853Sgabeblack@google.com
1012853Sgabeblack@google.com    http://www.apache.org/licenses/LICENSE-2.0
1112853Sgabeblack@google.com
1212853Sgabeblack@google.com  Unless required by applicable law or agreed to in writing, software
1312853Sgabeblack@google.com  distributed under the License is distributed on an "AS IS" BASIS,
1412853Sgabeblack@google.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512853Sgabeblack@google.com  implied.  See the License for the specific language governing
1612853Sgabeblack@google.com  permissions and limitations under the License.
1712853Sgabeblack@google.com
1812853Sgabeblack@google.com *****************************************************************************/
1912853Sgabeblack@google.com
2012853Sgabeblack@google.com/*****************************************************************************
2112853Sgabeblack@google.com
2212853Sgabeblack@google.com  sc_int_base.h -- A signed integer whose length is less than 64 bit.
2312853Sgabeblack@google.com
2412853Sgabeblack@google.com              Unlike arbitrary precision, arithmetic and bitwise operations
2512853Sgabeblack@google.com              are performed using the native types (hence capped at 64 bits).
2612853Sgabeblack@google.com              The sc_int integer is useful when the user does not need
2712853Sgabeblack@google.com              arbitrary precision and the performance is superior to
2812853Sgabeblack@google.com              sc_bigint/sc_biguint.
2912853Sgabeblack@google.com
3012853Sgabeblack@google.com  Original Author: Amit Rao, Synopsys, Inc.
3112853Sgabeblack@google.com
3212853Sgabeblack@google.com *****************************************************************************/
3312853Sgabeblack@google.com
3412853Sgabeblack@google.com/*****************************************************************************
3512853Sgabeblack@google.com
3612853Sgabeblack@google.com  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3712853Sgabeblack@google.com  changes you are making here.
3812853Sgabeblack@google.com
3912853Sgabeblack@google.com      Name, Affiliation, Date: Ali Dasdan, Synopsys, Inc.
4012853Sgabeblack@google.com  Description of Modification: - Resolved ambiguity with sc_(un)signed.
4112853Sgabeblack@google.com                               - Merged the code for 64- and 32-bit versions
4212853Sgabeblack@google.com                                 via the constants in sc_nbdefs.h.
4312853Sgabeblack@google.com                               - Eliminated redundant file inclusions.
4412853Sgabeblack@google.com
4512853Sgabeblack@google.com      Name, Affiliation, Date:
4612853Sgabeblack@google.com  Description of Modification:
4712853Sgabeblack@google.com
4812853Sgabeblack@google.com *****************************************************************************/
4912853Sgabeblack@google.com
5012853Sgabeblack@google.com// $Log: sc_int_base.h,v $
5112853Sgabeblack@google.com// Revision 1.3  2011/08/24 22:05:45  acg
5212853Sgabeblack@google.com//  Torsten Maehne: initialization changes to remove warnings.
5312853Sgabeblack@google.com//
5412853Sgabeblack@google.com// Revision 1.2  2011/02/18 20:19:15  acg
5512853Sgabeblack@google.com//  Andy Goodrich: updating Copyright notice.
5612853Sgabeblack@google.com//
5712853Sgabeblack@google.com// Revision 1.1.1.1  2006/12/15 20:20:05  acg
5812853Sgabeblack@google.com// SystemC 2.3
5912853Sgabeblack@google.com//
6012853Sgabeblack@google.com// Revision 1.4  2006/05/08 17:50:01  acg
6112853Sgabeblack@google.com//   Andy Goodrich: Added David Long's declarations for friend operators,
6212853Sgabeblack@google.com//   functions, and methods, to keep the Microsoft compiler happy.
6312853Sgabeblack@google.com//
6412853Sgabeblack@google.com// Revision 1.3  2006/01/13 18:49:31  acg
6512853Sgabeblack@google.com// Added $Log command so that CVS check in comments are reproduced in the
6612853Sgabeblack@google.com// source.
6712853Sgabeblack@google.com//
6812853Sgabeblack@google.com
6912853Sgabeblack@google.com#ifndef __SYSTEMC_EXT_DT_INT_SC_INT_BASE_HH__
7012853Sgabeblack@google.com#define __SYSTEMC_EXT_DT_INT_SC_INT_BASE_HH__
7112853Sgabeblack@google.com
7212853Sgabeblack@google.com#include <iostream>
7312853Sgabeblack@google.com
7412853Sgabeblack@google.com#include "../misc/sc_value_base.hh"
7512853Sgabeblack@google.com#include "../sc_temporary.hh"
7612853Sgabeblack@google.com#include "sc_length_param.hh"
7712853Sgabeblack@google.com#include "sc_nbdefs.hh"
7812853Sgabeblack@google.com#include "sc_uint_base.hh"
7912853Sgabeblack@google.com
8012853Sgabeblack@google.comnamespace sc_dt
8112853Sgabeblack@google.com{
8212853Sgabeblack@google.com
8312853Sgabeblack@google.comclass sc_concatref;
8412853Sgabeblack@google.com
8512853Sgabeblack@google.com// classes defined in this module
8612853Sgabeblack@google.comclass sc_int_bitref_r;
8712853Sgabeblack@google.comclass sc_int_bitref;
8812853Sgabeblack@google.comclass sc_int_subref_r;
8912853Sgabeblack@google.comclass sc_int_subref;
9012853Sgabeblack@google.comclass sc_int_base;
9112853Sgabeblack@google.comclass sc_signed_subref_r;
9212853Sgabeblack@google.comclass sc_unsigned_subref_r;
9312853Sgabeblack@google.com
9412853Sgabeblack@google.com// forward class declarations
9512853Sgabeblack@google.comclass sc_bv_base;
9612853Sgabeblack@google.comclass sc_lv_base;
9712853Sgabeblack@google.comclass sc_signed;
9812853Sgabeblack@google.comclass sc_unsigned;
9912853Sgabeblack@google.comclass sc_fxval;
10012853Sgabeblack@google.comclass sc_fxval_fast;
10112853Sgabeblack@google.comclass sc_fxnum;
10212853Sgabeblack@google.comclass sc_fxnum_fast;
10312853Sgabeblack@google.com
10412853Sgabeblack@google.com} // namespace sc_dt
10512853Sgabeblack@google.com
10612853Sgabeblack@google.com// extern template instantiations
10712853Sgabeblack@google.comnamespace sc_core
10812853Sgabeblack@google.com{
10912853Sgabeblack@google.com
11012853Sgabeblack@google.comextern template class sc_vpool<sc_dt::sc_int_bitref>;
11112853Sgabeblack@google.comextern template class sc_vpool<sc_dt::sc_int_subref>;
11212853Sgabeblack@google.com
11312853Sgabeblack@google.com} // namespace sc_core
11412853Sgabeblack@google.com
11512853Sgabeblack@google.comnamespace sc_dt
11612853Sgabeblack@google.com{
11712853Sgabeblack@google.com
11812853Sgabeblack@google.comextern const uint_type mask_int[SC_INTWIDTH][SC_INTWIDTH];
11912853Sgabeblack@google.com
12012853Sgabeblack@google.com// friend operator declarations
12112853Sgabeblack@google.com
12212853Sgabeblack@google.com// relational operators
12312853Sgabeblack@google.com
12412853Sgabeblack@google.cominline bool operator == (const sc_int_base &a, const sc_int_base &b);
12512853Sgabeblack@google.cominline bool operator != (const sc_int_base &a, const sc_int_base &b);
12612853Sgabeblack@google.cominline bool operator <  (const sc_int_base &a, const sc_int_base &b);
12712853Sgabeblack@google.cominline bool operator <= (const sc_int_base &a, const sc_int_base &b);
12812853Sgabeblack@google.cominline bool operator >  (const sc_int_base &a, const sc_int_base &b);
12912853Sgabeblack@google.cominline bool operator >= (const sc_int_base &a, const sc_int_base &b);
13012853Sgabeblack@google.com
13112853Sgabeblack@google.com
13212853Sgabeblack@google.com// ----------------------------------------------------------------------------
13312853Sgabeblack@google.com//  CLASS : sc_int_bitref_r
13412853Sgabeblack@google.com//
13512853Sgabeblack@google.com//  Proxy class for sc_int bit selection (r-value only).
13612853Sgabeblack@google.com// ----------------------------------------------------------------------------
13712853Sgabeblack@google.com
13812853Sgabeblack@google.comclass sc_int_bitref_r : public sc_value_base
13912853Sgabeblack@google.com{
14012853Sgabeblack@google.com    friend class sc_int_base;
14112853Sgabeblack@google.com
14212853Sgabeblack@google.com  protected:
14312853Sgabeblack@google.com    // constructor
14412853Sgabeblack@google.com    sc_int_bitref_r() : sc_value_base(), m_index(), m_obj_p() {}
14512853Sgabeblack@google.com
14612853Sgabeblack@google.com    // initializer for sc_core::sc_vpool:
14712853Sgabeblack@google.com    void initialize(const sc_int_base *obj_p, int index_)
14812853Sgabeblack@google.com    {
14912853Sgabeblack@google.com        m_obj_p = (sc_int_base *)obj_p;
15012853Sgabeblack@google.com        m_index = index_;
15112853Sgabeblack@google.com    }
15212853Sgabeblack@google.com
15312853Sgabeblack@google.com  public:
15412853Sgabeblack@google.com    // copy constructor
15512853Sgabeblack@google.com    sc_int_bitref_r(const sc_int_bitref_r &a) :
15612853Sgabeblack@google.com        sc_value_base(a), m_index(a.m_index), m_obj_p(a.m_obj_p)
15712853Sgabeblack@google.com    {}
15812853Sgabeblack@google.com
15912853Sgabeblack@google.com    // destructor
16012853Sgabeblack@google.com    virtual ~sc_int_bitref_r() {}
16112853Sgabeblack@google.com
16212853Sgabeblack@google.com    // capacity
16312853Sgabeblack@google.com    int length() const { return 1; }
16412853Sgabeblack@google.com
16512853Sgabeblack@google.com#ifdef SC_DT_DEPRECATED
16612853Sgabeblack@google.com    int bitwidth() const { return length(); }
16712853Sgabeblack@google.com#endif
16812853Sgabeblack@google.com
16912853Sgabeblack@google.com    // concatenation support
17012853Sgabeblack@google.com    virtual int
17112853Sgabeblack@google.com    concat_length(bool *xz_present_p) const
17212853Sgabeblack@google.com    {
17312853Sgabeblack@google.com        if (xz_present_p)
17412853Sgabeblack@google.com            *xz_present_p = false;
17512853Sgabeblack@google.com        return 1;
17612853Sgabeblack@google.com    }
17712853Sgabeblack@google.com    virtual bool
17812853Sgabeblack@google.com    concat_get_ctrl(sc_digit *dst_p, int low_i) const
17912853Sgabeblack@google.com    {
18012853Sgabeblack@google.com        int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
18112853Sgabeblack@google.com        int word_i = low_i / BITS_PER_DIGIT;
18212853Sgabeblack@google.com
18312853Sgabeblack@google.com        dst_p[word_i] &= ~bit_mask;
18412853Sgabeblack@google.com        return false;
18512853Sgabeblack@google.com    }
18612853Sgabeblack@google.com    virtual bool
18712853Sgabeblack@google.com    concat_get_data(sc_digit *dst_p, int low_i) const
18812853Sgabeblack@google.com    {
18912853Sgabeblack@google.com        bool non_zero;
19012853Sgabeblack@google.com        int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
19112853Sgabeblack@google.com        int word_i = low_i / BITS_PER_DIGIT;
19212853Sgabeblack@google.com
19312853Sgabeblack@google.com        if (operator uint64()) {
19412853Sgabeblack@google.com            dst_p[word_i] |= bit_mask;
19512853Sgabeblack@google.com            non_zero = true;
19612853Sgabeblack@google.com        } else {
19712853Sgabeblack@google.com            dst_p[word_i] &= ~bit_mask;
19812853Sgabeblack@google.com            non_zero = false;
19912853Sgabeblack@google.com        }
20012853Sgabeblack@google.com        return non_zero;
20112853Sgabeblack@google.com    }
20212853Sgabeblack@google.com    virtual uint64
20312853Sgabeblack@google.com    concat_get_uint64() const
20412853Sgabeblack@google.com    {
20512853Sgabeblack@google.com        return operator uint64();
20612853Sgabeblack@google.com    }
20712853Sgabeblack@google.com
20812853Sgabeblack@google.com
20912853Sgabeblack@google.com    // implicit conversions
21012853Sgabeblack@google.com    operator uint64 () const;
21112853Sgabeblack@google.com    bool operator ! () const;
21212853Sgabeblack@google.com    bool operator ~ () const;
21312853Sgabeblack@google.com
21412853Sgabeblack@google.com
21512853Sgabeblack@google.com    // explicit conversions
21612853Sgabeblack@google.com    uint64 value() const { return operator uint64(); }
21712853Sgabeblack@google.com
21812853Sgabeblack@google.com    bool to_bool() const { return operator uint64(); }
21912853Sgabeblack@google.com
22012853Sgabeblack@google.com
22112853Sgabeblack@google.com    // other methods
22212853Sgabeblack@google.com    void print(::std::ostream& os=::std::cout) const { os << to_bool(); }
22312853Sgabeblack@google.com
22412853Sgabeblack@google.com  protected:
22512853Sgabeblack@google.com    int m_index;
22612853Sgabeblack@google.com    sc_int_base *m_obj_p;
22712853Sgabeblack@google.com
22812853Sgabeblack@google.com  private:
22912853Sgabeblack@google.com    // Disabled
23012853Sgabeblack@google.com    sc_int_bitref_r &operator = (const sc_int_bitref_r &);
23112853Sgabeblack@google.com};
23212853Sgabeblack@google.com
23312853Sgabeblack@google.com
23412853Sgabeblack@google.cominline ::std::ostream &operator << (::std::ostream &, const sc_int_bitref_r &);
23512853Sgabeblack@google.com
23612853Sgabeblack@google.com
23712853Sgabeblack@google.com// ----------------------------------------------------------------------------
23812853Sgabeblack@google.com//  CLASS : sc_int_bitref
23912853Sgabeblack@google.com//
24012853Sgabeblack@google.com//  Proxy class for sc_int bit selection (r-value and l-value).
24112853Sgabeblack@google.com// ----------------------------------------------------------------------------
24212853Sgabeblack@google.com
24312853Sgabeblack@google.comclass sc_int_bitref : public sc_int_bitref_r
24412853Sgabeblack@google.com{
24512853Sgabeblack@google.com    friend class sc_int_base;
24612853Sgabeblack@google.com    friend class sc_core::sc_vpool<sc_int_bitref>;
24712853Sgabeblack@google.com
24812853Sgabeblack@google.com    // constructor
24912853Sgabeblack@google.com    sc_int_bitref() : sc_int_bitref_r() {}
25012853Sgabeblack@google.com
25112853Sgabeblack@google.com  public:
25212853Sgabeblack@google.com    // copy constructor
25312853Sgabeblack@google.com    sc_int_bitref(const sc_int_bitref &a) : sc_int_bitref_r(a) {}
25412853Sgabeblack@google.com
25512853Sgabeblack@google.com    // assignment operators
25612853Sgabeblack@google.com    sc_int_bitref &operator = (const sc_int_bitref_r &b);
25712853Sgabeblack@google.com    sc_int_bitref &operator = (const sc_int_bitref &b);
25812853Sgabeblack@google.com    sc_int_bitref &operator = (bool b);
25912853Sgabeblack@google.com
26012853Sgabeblack@google.com    sc_int_bitref &operator &= (bool b);
26112853Sgabeblack@google.com    sc_int_bitref &operator |= (bool b);
26212853Sgabeblack@google.com    sc_int_bitref &operator ^= (bool b);
26312853Sgabeblack@google.com
26412853Sgabeblack@google.com    // concatenation methods
26512853Sgabeblack@google.com    virtual void concat_set(int64 src, int low_i);
26612853Sgabeblack@google.com    virtual void concat_set(const sc_signed &src, int low_i);
26712853Sgabeblack@google.com    virtual void concat_set(const sc_unsigned &src, int low_i);
26812853Sgabeblack@google.com    virtual void concat_set(uint64 src, int low_i);
26912853Sgabeblack@google.com
27012853Sgabeblack@google.com    // other methods
27112853Sgabeblack@google.com    void scan(::std::istream &is=::std::cin);
27212853Sgabeblack@google.com
27312853Sgabeblack@google.com  public:
27412853Sgabeblack@google.com    static sc_core::sc_vpool<sc_int_bitref> m_pool;
27512853Sgabeblack@google.com};
27612853Sgabeblack@google.com
27712853Sgabeblack@google.com
27812853Sgabeblack@google.com
27912853Sgabeblack@google.cominline ::std::istream &operator >> (::std::istream &, sc_int_bitref &);
28012853Sgabeblack@google.com
28112853Sgabeblack@google.com
28212853Sgabeblack@google.com// ----------------------------------------------------------------------------
28312853Sgabeblack@google.com//  CLASS : sc_int_subref_r
28412853Sgabeblack@google.com//
28512853Sgabeblack@google.com//  Proxy class for sc_int part selection (r-value only).
28612853Sgabeblack@google.com// ----------------------------------------------------------------------------
28712853Sgabeblack@google.com
28812853Sgabeblack@google.comclass sc_int_subref_r : public sc_value_base
28912853Sgabeblack@google.com{
29012853Sgabeblack@google.com    friend class sc_int_base;
29112853Sgabeblack@google.com    friend class sc_int_signal;
29212853Sgabeblack@google.com    friend class sc_int_subref;
29312853Sgabeblack@google.com
29412853Sgabeblack@google.com  protected:
29512853Sgabeblack@google.com    // constructor
29612853Sgabeblack@google.com    sc_int_subref_r() : sc_value_base(), m_left(0), m_obj_p(0), m_right(0) {}
29712853Sgabeblack@google.com
29812853Sgabeblack@google.com    // initializer for sc_core::sc_vpool:
29912853Sgabeblack@google.com    void initialize( const sc_int_base *obj_p, int left_i, int right_i)
30012853Sgabeblack@google.com    {
30112853Sgabeblack@google.com        m_obj_p = (sc_int_base *)obj_p;
30212853Sgabeblack@google.com        m_left = left_i;
30312853Sgabeblack@google.com        m_right = right_i;
30412853Sgabeblack@google.com    }
30512853Sgabeblack@google.com
30612853Sgabeblack@google.com  public:
30712853Sgabeblack@google.com    // copy constructor
30812853Sgabeblack@google.com    sc_int_subref_r(const sc_int_subref_r &a) :
30912853Sgabeblack@google.com        sc_value_base(a), m_left(a.m_left), m_obj_p(a.m_obj_p),
31012853Sgabeblack@google.com        m_right(a.m_right)
31112853Sgabeblack@google.com    {}
31212853Sgabeblack@google.com
31312853Sgabeblack@google.com    // destructor
31412853Sgabeblack@google.com    virtual ~sc_int_subref_r() {}
31512853Sgabeblack@google.com
31612853Sgabeblack@google.com    // capacity
31712853Sgabeblack@google.com    int length() const { return (m_left - m_right + 1); }
31812853Sgabeblack@google.com
31912853Sgabeblack@google.com    // concatenation support
32012853Sgabeblack@google.com    virtual int
32112853Sgabeblack@google.com    concat_length(bool *xz_present_p) const
32212853Sgabeblack@google.com    {
32312853Sgabeblack@google.com        if (xz_present_p)
32412853Sgabeblack@google.com            *xz_present_p = false;
32512853Sgabeblack@google.com        return length();
32612853Sgabeblack@google.com    }
32712853Sgabeblack@google.com    virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
32812853Sgabeblack@google.com    virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
32912853Sgabeblack@google.com    virtual uint64
33012853Sgabeblack@google.com    concat_get_uint64() const
33112853Sgabeblack@google.com    {
33212853Sgabeblack@google.com        int len = length();
33312853Sgabeblack@google.com        uint64 val = operator uint_type();
33412853Sgabeblack@google.com        if (len < 64)
33512853Sgabeblack@google.com            return (uint64)(val & ~((uint_type)-1 << len));
33612853Sgabeblack@google.com        else
33712853Sgabeblack@google.com            return (uint64)val;
33812853Sgabeblack@google.com    }
33912853Sgabeblack@google.com
34012853Sgabeblack@google.com    // reduce methods
34112853Sgabeblack@google.com    bool and_reduce() const;
34212853Sgabeblack@google.com    bool nand_reduce() const { return !and_reduce(); }
34312853Sgabeblack@google.com    bool or_reduce() const;
34413159Sgabeblack@google.com    bool nor_reduce() const { return !or_reduce(); }
34512853Sgabeblack@google.com    bool xor_reduce() const;
34613159Sgabeblack@google.com    bool xnor_reduce() const { return !xor_reduce(); }
34712853Sgabeblack@google.com
34812853Sgabeblack@google.com    // implicit conversion to uint_type
34912853Sgabeblack@google.com    operator uint_type () const;
35012853Sgabeblack@google.com
35112853Sgabeblack@google.com    // explicit conversions
35212853Sgabeblack@google.com    uint_type value() const { return operator uint_type(); }
35312853Sgabeblack@google.com
35412853Sgabeblack@google.com
35512853Sgabeblack@google.com    int to_int() const;
35612853Sgabeblack@google.com    unsigned int to_uint() const;
35712853Sgabeblack@google.com    long to_long() const;
35812853Sgabeblack@google.com    unsigned long to_ulong() const;
35912853Sgabeblack@google.com    int64 to_int64() const;
36012853Sgabeblack@google.com    uint64 to_uint64() const;
36112853Sgabeblack@google.com    double to_double() const;
36212853Sgabeblack@google.com
36312853Sgabeblack@google.com    // explicit conversion to character string
36412853Sgabeblack@google.com    const std::string to_string(sc_numrep numrep=SC_DEC) const;
36512853Sgabeblack@google.com    const std::string to_string(sc_numrep numrep, bool w_prefix) const;
36612853Sgabeblack@google.com
36712853Sgabeblack@google.com    // other methods
36812853Sgabeblack@google.com    void
36912853Sgabeblack@google.com    print(::std::ostream &os=::std::cout) const
37012853Sgabeblack@google.com    {
37112853Sgabeblack@google.com        os << to_string(sc_io_base(os, SC_DEC), sc_io_show_base(os));
37212853Sgabeblack@google.com    }
37312853Sgabeblack@google.com
37412853Sgabeblack@google.com  protected:
37512853Sgabeblack@google.com    int m_left;
37612853Sgabeblack@google.com    sc_int_base *m_obj_p;
37712853Sgabeblack@google.com    int m_right;
37812853Sgabeblack@google.com
37912853Sgabeblack@google.com  private:
38012853Sgabeblack@google.com    const sc_int_subref_r &operator = (const sc_int_subref_r &);
38112853Sgabeblack@google.com};
38212853Sgabeblack@google.com
38312853Sgabeblack@google.cominline ::std::ostream &operator << (::std::ostream &, const sc_int_subref_r &);
38412853Sgabeblack@google.com
38512853Sgabeblack@google.com
38612853Sgabeblack@google.com// ----------------------------------------------------------------------------
38712853Sgabeblack@google.com//  CLASS : sc_int_subref
38812853Sgabeblack@google.com//
38912853Sgabeblack@google.com//  Proxy class for sc_int part selection (r-value and l-value).
39012853Sgabeblack@google.com// ----------------------------------------------------------------------------
39112853Sgabeblack@google.com
39212853Sgabeblack@google.comclass sc_int_subref : public sc_int_subref_r
39312853Sgabeblack@google.com{
39412853Sgabeblack@google.com    friend class sc_int_base;
39512853Sgabeblack@google.com    friend class sc_core::sc_vpool<sc_int_subref>;
39612853Sgabeblack@google.com
39712853Sgabeblack@google.com  protected:
39812853Sgabeblack@google.com    // constructor
39912853Sgabeblack@google.com    sc_int_subref() : sc_int_subref_r() {}
40012853Sgabeblack@google.com
40112853Sgabeblack@google.com  public:
40212853Sgabeblack@google.com    // copy constructor
40312853Sgabeblack@google.com    sc_int_subref(const sc_int_subref &a) : sc_int_subref_r(a) {}
40412853Sgabeblack@google.com
40512853Sgabeblack@google.com    // assignment operators
40612853Sgabeblack@google.com    sc_int_subref &operator = (int_type v);
40712853Sgabeblack@google.com    sc_int_subref &operator = (const sc_int_base &a);
40812853Sgabeblack@google.com
40912853Sgabeblack@google.com    sc_int_subref &
41012853Sgabeblack@google.com    operator = (const sc_int_subref_r &a)
41112853Sgabeblack@google.com    {
41212853Sgabeblack@google.com        return operator = (a.operator uint_type());
41312853Sgabeblack@google.com    }
41412853Sgabeblack@google.com
41512853Sgabeblack@google.com    sc_int_subref &
41612853Sgabeblack@google.com    operator = (const sc_int_subref &a)
41712853Sgabeblack@google.com    {
41812853Sgabeblack@google.com        return operator = (a.operator uint_type());
41912853Sgabeblack@google.com    }
42012853Sgabeblack@google.com
42112853Sgabeblack@google.com    template< class T >
42212853Sgabeblack@google.com    sc_int_subref &
42312853Sgabeblack@google.com    operator = (const sc_generic_base<T> &a)
42412853Sgabeblack@google.com    {
42512853Sgabeblack@google.com        return operator = (a->to_int64());
42612853Sgabeblack@google.com    }
42712853Sgabeblack@google.com
42812853Sgabeblack@google.com    sc_int_subref &operator = (const char *a);
42912853Sgabeblack@google.com
43012853Sgabeblack@google.com    sc_int_subref &
43112853Sgabeblack@google.com    operator = (unsigned long a)
43212853Sgabeblack@google.com    {
43312853Sgabeblack@google.com        return operator = ((int_type)a);
43412853Sgabeblack@google.com    }
43512853Sgabeblack@google.com
43612853Sgabeblack@google.com    sc_int_subref &
43712853Sgabeblack@google.com    operator = (long a)
43812853Sgabeblack@google.com    {
43912853Sgabeblack@google.com        return operator = ((int_type)a);
44012853Sgabeblack@google.com    }
44112853Sgabeblack@google.com
44212853Sgabeblack@google.com    sc_int_subref &
44312853Sgabeblack@google.com    operator = (unsigned int a)
44412853Sgabeblack@google.com    {
44512853Sgabeblack@google.com        return operator = ((int_type)a);
44612853Sgabeblack@google.com    }
44712853Sgabeblack@google.com
44812853Sgabeblack@google.com    sc_int_subref &
44912853Sgabeblack@google.com    operator = (int a)
45012853Sgabeblack@google.com    {
45112853Sgabeblack@google.com        return operator = ((int_type)a);
45212853Sgabeblack@google.com    }
45312853Sgabeblack@google.com
45412853Sgabeblack@google.com    sc_int_subref &
45512853Sgabeblack@google.com    operator = (uint64 a)
45612853Sgabeblack@google.com    {
45712853Sgabeblack@google.com        return operator = ((int_type)a);
45812853Sgabeblack@google.com    }
45912853Sgabeblack@google.com
46012853Sgabeblack@google.com    sc_int_subref &
46112853Sgabeblack@google.com    operator = (double a)
46212853Sgabeblack@google.com    {
46312853Sgabeblack@google.com        return operator = ((int_type)a);
46412853Sgabeblack@google.com    }
46512853Sgabeblack@google.com
46612853Sgabeblack@google.com    sc_int_subref &operator = (const sc_signed &);
46712853Sgabeblack@google.com    sc_int_subref &operator = (const sc_unsigned &);
46812853Sgabeblack@google.com    sc_int_subref &operator = (const sc_bv_base &);
46912853Sgabeblack@google.com    sc_int_subref &operator = (const sc_lv_base &);
47012853Sgabeblack@google.com
47112853Sgabeblack@google.com    // concatenation methods
47212853Sgabeblack@google.com    virtual void concat_set(int64 src, int low_i);
47312853Sgabeblack@google.com    virtual void concat_set(const sc_signed &src, int low_i);
47412853Sgabeblack@google.com    virtual void concat_set(const sc_unsigned &src, int low_i);
47512853Sgabeblack@google.com    virtual void concat_set(uint64 src, int low_i);
47612853Sgabeblack@google.com
47712853Sgabeblack@google.com    // other methods
47812853Sgabeblack@google.com    void scan(::std::istream &is=::std::cin);
47912853Sgabeblack@google.com
48012853Sgabeblack@google.com  public:
48112853Sgabeblack@google.com    static sc_core::sc_vpool<sc_int_subref> m_pool;
48212853Sgabeblack@google.com};
48312853Sgabeblack@google.com
48412853Sgabeblack@google.com
48512853Sgabeblack@google.cominline ::std::istream &operator >> (::std::istream &, sc_int_subref &);
48612853Sgabeblack@google.com
48712853Sgabeblack@google.com
48812853Sgabeblack@google.com// ----------------------------------------------------------------------------
48912853Sgabeblack@google.com//  CLASS : sc_int_base
49012853Sgabeblack@google.com//
49112853Sgabeblack@google.com//  Base class for sc_int.
49212853Sgabeblack@google.com// ----------------------------------------------------------------------------
49312853Sgabeblack@google.com
49412853Sgabeblack@google.comclass sc_int_base : public sc_value_base
49512853Sgabeblack@google.com{
49612853Sgabeblack@google.com    friend class sc_int_bitref_r;
49712853Sgabeblack@google.com    friend class sc_int_bitref;
49812853Sgabeblack@google.com    friend class sc_int_subref_r;
49912853Sgabeblack@google.com    friend class sc_int_subref;
50012853Sgabeblack@google.com
50112853Sgabeblack@google.com
50212853Sgabeblack@google.com    // support methods
50312853Sgabeblack@google.com    void invalid_length() const;
50412853Sgabeblack@google.com    void invalid_index(int i) const;
50512853Sgabeblack@google.com    void invalid_range(int l, int r) const;
50612853Sgabeblack@google.com
50712853Sgabeblack@google.com    void
50812853Sgabeblack@google.com    check_length() const
50912853Sgabeblack@google.com    {
51012853Sgabeblack@google.com        if (m_len <= 0 || m_len > SC_INTWIDTH) {
51112853Sgabeblack@google.com            invalid_length();
51212853Sgabeblack@google.com        }
51312853Sgabeblack@google.com    }
51412853Sgabeblack@google.com
51512853Sgabeblack@google.com    void
51612853Sgabeblack@google.com    check_index(int i) const
51712853Sgabeblack@google.com    {
51812853Sgabeblack@google.com        if (i < 0 || i >= m_len) {
51912853Sgabeblack@google.com            invalid_index(i);
52012853Sgabeblack@google.com        }
52112853Sgabeblack@google.com    }
52212853Sgabeblack@google.com
52312853Sgabeblack@google.com    void
52412853Sgabeblack@google.com    check_range(int l, int r) const
52512853Sgabeblack@google.com    {
52612853Sgabeblack@google.com        if (r < 0 || l >= m_len || l < r) {
52712853Sgabeblack@google.com            invalid_range(l, r);
52812853Sgabeblack@google.com        }
52912853Sgabeblack@google.com    }
53012853Sgabeblack@google.com
53112853Sgabeblack@google.com    void check_value() const;
53212853Sgabeblack@google.com
53312853Sgabeblack@google.com    void
53412853Sgabeblack@google.com    extend_sign()
53512853Sgabeblack@google.com    {
53612853Sgabeblack@google.com#ifdef DEBUG_SYSTEMC
53712853Sgabeblack@google.com        check_value();
53812853Sgabeblack@google.com#endif
53912853Sgabeblack@google.com        m_val = (m_val << m_ulen >> m_ulen);
54012853Sgabeblack@google.com    }
54112853Sgabeblack@google.com
54212853Sgabeblack@google.compublic:
54312853Sgabeblack@google.com
54412853Sgabeblack@google.com    // constructors
54512853Sgabeblack@google.com    explicit sc_int_base(int w=sc_length_param().len()) :
54612853Sgabeblack@google.com            m_val(0), m_len(w), m_ulen(SC_INTWIDTH - m_len)
54712853Sgabeblack@google.com    {
54812853Sgabeblack@google.com        check_length();
54912853Sgabeblack@google.com    }
55012853Sgabeblack@google.com
55112853Sgabeblack@google.com    sc_int_base(int_type v, int w) :
55212853Sgabeblack@google.com        m_val(v), m_len(w), m_ulen(SC_INTWIDTH - m_len)
55312853Sgabeblack@google.com    {
55412853Sgabeblack@google.com        check_length();
55512853Sgabeblack@google.com        extend_sign();
55612853Sgabeblack@google.com    }
55712853Sgabeblack@google.com
55812853Sgabeblack@google.com    sc_int_base(const sc_int_base &a) :
55912853Sgabeblack@google.com            sc_value_base(a), m_val(a.m_val), m_len(a.m_len), m_ulen(a.m_ulen)
56012853Sgabeblack@google.com    {}
56112853Sgabeblack@google.com
56212853Sgabeblack@google.com    explicit sc_int_base(const sc_int_subref_r &a) :
56312853Sgabeblack@google.com        m_val(a), m_len(a.length()), m_ulen(SC_INTWIDTH - m_len)
56412853Sgabeblack@google.com    {
56512853Sgabeblack@google.com        extend_sign();
56612853Sgabeblack@google.com    }
56712853Sgabeblack@google.com
56812853Sgabeblack@google.com    template< class T >
56912853Sgabeblack@google.com    explicit sc_int_base(const sc_generic_base<T> &a) :
57012853Sgabeblack@google.com        m_val(a->to_int64()), m_len(a->length()), m_ulen(SC_INTWIDTH - m_len)
57112853Sgabeblack@google.com    {
57212853Sgabeblack@google.com        check_length();
57312853Sgabeblack@google.com        extend_sign();
57412853Sgabeblack@google.com    }
57512853Sgabeblack@google.com
57612853Sgabeblack@google.com    explicit sc_int_base(const sc_signed &a);
57712853Sgabeblack@google.com    explicit sc_int_base(const sc_unsigned &a);
57812853Sgabeblack@google.com    explicit sc_int_base(const sc_bv_base &v);
57912853Sgabeblack@google.com    explicit sc_int_base(const sc_lv_base &v);
58012853Sgabeblack@google.com    explicit sc_int_base(const sc_uint_subref_r &v);
58112853Sgabeblack@google.com    explicit sc_int_base(const sc_signed_subref_r &v);
58212853Sgabeblack@google.com    explicit sc_int_base(const sc_unsigned_subref_r &v);
58312853Sgabeblack@google.com
58412853Sgabeblack@google.com
58512853Sgabeblack@google.com    // destructor
58612853Sgabeblack@google.com    virtual ~sc_int_base() {}
58712853Sgabeblack@google.com
58812853Sgabeblack@google.com    // assignment operators
58912853Sgabeblack@google.com    sc_int_base &
59012853Sgabeblack@google.com    operator = (int_type v)
59112853Sgabeblack@google.com    {
59212853Sgabeblack@google.com        m_val = v;
59312853Sgabeblack@google.com        extend_sign();
59412853Sgabeblack@google.com        return *this;
59512853Sgabeblack@google.com    }
59612853Sgabeblack@google.com
59712853Sgabeblack@google.com    sc_int_base &
59812853Sgabeblack@google.com    operator = (const sc_int_base &a)
59912853Sgabeblack@google.com    {
60012853Sgabeblack@google.com        m_val = a.m_val;
60112853Sgabeblack@google.com        extend_sign();
60212853Sgabeblack@google.com        return *this;
60312853Sgabeblack@google.com    }
60412853Sgabeblack@google.com
60512853Sgabeblack@google.com    sc_int_base &
60612853Sgabeblack@google.com    operator = (const sc_int_subref_r &a)
60712853Sgabeblack@google.com    {
60812853Sgabeblack@google.com        m_val = a;
60912853Sgabeblack@google.com        extend_sign();
61012853Sgabeblack@google.com        return *this;
61112853Sgabeblack@google.com    }
61212853Sgabeblack@google.com
61312853Sgabeblack@google.com    template<class T>
61412853Sgabeblack@google.com    sc_int_base &
61512853Sgabeblack@google.com    operator = (const sc_generic_base<T> &a)
61612853Sgabeblack@google.com    {
61712853Sgabeblack@google.com        m_val = a->to_int64();
61812853Sgabeblack@google.com        extend_sign();
61912853Sgabeblack@google.com        return *this;
62012853Sgabeblack@google.com    }
62112853Sgabeblack@google.com
62212853Sgabeblack@google.com    sc_int_base &operator = (const sc_signed &a);
62312853Sgabeblack@google.com    sc_int_base &operator = (const sc_unsigned &a);
62412853Sgabeblack@google.com
62512853Sgabeblack@google.com    sc_int_base &operator = (const sc_fxval &a);
62612853Sgabeblack@google.com    sc_int_base &operator = (const sc_fxval_fast &a);
62712853Sgabeblack@google.com    sc_int_base &operator = (const sc_fxnum &a);
62812853Sgabeblack@google.com    sc_int_base &operator = (const sc_fxnum_fast &a);
62912853Sgabeblack@google.com
63012853Sgabeblack@google.com    sc_int_base &operator = (const sc_bv_base &a);
63112853Sgabeblack@google.com    sc_int_base &operator = (const sc_lv_base &a);
63212853Sgabeblack@google.com
63312853Sgabeblack@google.com    sc_int_base &operator = (const char *a);
63412853Sgabeblack@google.com
63512853Sgabeblack@google.com    sc_int_base &
63612853Sgabeblack@google.com    operator = (unsigned long a)
63712853Sgabeblack@google.com    {
63812853Sgabeblack@google.com        m_val = a;
63912853Sgabeblack@google.com        extend_sign();
64012853Sgabeblack@google.com        return *this;
64112853Sgabeblack@google.com    }
64212853Sgabeblack@google.com
64312853Sgabeblack@google.com    sc_int_base &
64412853Sgabeblack@google.com    operator = (long a)
64512853Sgabeblack@google.com    {
64612853Sgabeblack@google.com        m_val = a;
64712853Sgabeblack@google.com        extend_sign();
64812853Sgabeblack@google.com        return *this;
64912853Sgabeblack@google.com    }
65012853Sgabeblack@google.com
65112853Sgabeblack@google.com    sc_int_base &
65212853Sgabeblack@google.com    operator = (unsigned int a)
65312853Sgabeblack@google.com    {
65412853Sgabeblack@google.com        m_val = a;
65512853Sgabeblack@google.com        extend_sign();
65612853Sgabeblack@google.com        return *this;
65712853Sgabeblack@google.com    }
65812853Sgabeblack@google.com
65912853Sgabeblack@google.com    sc_int_base &
66012853Sgabeblack@google.com    operator = (int a)
66112853Sgabeblack@google.com    {
66212853Sgabeblack@google.com        m_val = a;
66312853Sgabeblack@google.com        extend_sign();
66412853Sgabeblack@google.com        return *this;
66512853Sgabeblack@google.com    }
66612853Sgabeblack@google.com
66712853Sgabeblack@google.com    sc_int_base &
66812853Sgabeblack@google.com    operator = (uint64 a)
66912853Sgabeblack@google.com    {
67012853Sgabeblack@google.com        m_val = a;
67112853Sgabeblack@google.com        extend_sign();
67212853Sgabeblack@google.com        return *this;
67312853Sgabeblack@google.com    }
67412853Sgabeblack@google.com
67512853Sgabeblack@google.com    sc_int_base &
67612853Sgabeblack@google.com    operator = (double a)
67712853Sgabeblack@google.com    {
67812853Sgabeblack@google.com        m_val = (int_type)a;
67912853Sgabeblack@google.com        extend_sign();
68012853Sgabeblack@google.com        return *this;
68112853Sgabeblack@google.com    }
68212853Sgabeblack@google.com
68312853Sgabeblack@google.com    // arithmetic assignment operators
68412853Sgabeblack@google.com    sc_int_base &
68512853Sgabeblack@google.com    operator += (int_type v)
68612853Sgabeblack@google.com    {
68712853Sgabeblack@google.com        m_val += v;
68812853Sgabeblack@google.com        extend_sign();
68912853Sgabeblack@google.com        return *this;
69012853Sgabeblack@google.com    }
69112853Sgabeblack@google.com
69212853Sgabeblack@google.com    sc_int_base &
69312853Sgabeblack@google.com    operator -= (int_type v)
69412853Sgabeblack@google.com    {
69512853Sgabeblack@google.com        m_val -= v;
69612853Sgabeblack@google.com        extend_sign();
69712853Sgabeblack@google.com        return *this;
69812853Sgabeblack@google.com    }
69912853Sgabeblack@google.com
70012853Sgabeblack@google.com    sc_int_base &
70112853Sgabeblack@google.com    operator *= (int_type v)
70212853Sgabeblack@google.com    {
70312853Sgabeblack@google.com        m_val *= v;
70412853Sgabeblack@google.com        extend_sign();
70512853Sgabeblack@google.com        return *this;
70612853Sgabeblack@google.com    }
70712853Sgabeblack@google.com
70812853Sgabeblack@google.com    sc_int_base &
70912853Sgabeblack@google.com    operator /= (int_type v)
71012853Sgabeblack@google.com    {
71112853Sgabeblack@google.com        m_val /= v;
71212853Sgabeblack@google.com        extend_sign();
71312853Sgabeblack@google.com        return *this;
71412853Sgabeblack@google.com    }
71512853Sgabeblack@google.com
71612853Sgabeblack@google.com    sc_int_base &
71712853Sgabeblack@google.com    operator %= (int_type v)
71812853Sgabeblack@google.com    {
71912853Sgabeblack@google.com        m_val %= v;
72012853Sgabeblack@google.com        extend_sign();
72112853Sgabeblack@google.com        return *this;
72212853Sgabeblack@google.com    }
72312853Sgabeblack@google.com
72412853Sgabeblack@google.com
72512853Sgabeblack@google.com    // bitwise assignment operators
72612853Sgabeblack@google.com    sc_int_base &
72712853Sgabeblack@google.com    operator &= (int_type v)
72812853Sgabeblack@google.com    {
72912853Sgabeblack@google.com        m_val &= v;
73012853Sgabeblack@google.com        extend_sign();
73112853Sgabeblack@google.com        return *this;
73212853Sgabeblack@google.com    }
73312853Sgabeblack@google.com
73412853Sgabeblack@google.com    sc_int_base &
73512853Sgabeblack@google.com    operator |= (int_type v)
73612853Sgabeblack@google.com    {
73712853Sgabeblack@google.com        m_val |= v;
73812853Sgabeblack@google.com        extend_sign();
73912853Sgabeblack@google.com        return *this;
74012853Sgabeblack@google.com    }
74112853Sgabeblack@google.com
74212853Sgabeblack@google.com    sc_int_base &
74312853Sgabeblack@google.com    operator ^= (int_type v)
74412853Sgabeblack@google.com    {
74512853Sgabeblack@google.com        m_val ^= v;
74612853Sgabeblack@google.com        extend_sign();
74712853Sgabeblack@google.com        return *this;
74812853Sgabeblack@google.com    }
74912853Sgabeblack@google.com
75012853Sgabeblack@google.com
75112853Sgabeblack@google.com    sc_int_base &
75212853Sgabeblack@google.com    operator <<= (int_type v)
75312853Sgabeblack@google.com    {
75412853Sgabeblack@google.com        m_val <<= v;
75512853Sgabeblack@google.com        extend_sign();
75612853Sgabeblack@google.com        return *this;
75712853Sgabeblack@google.com    }
75812853Sgabeblack@google.com
75912853Sgabeblack@google.com    sc_int_base &
76012853Sgabeblack@google.com    operator >>= (int_type v)
76112853Sgabeblack@google.com    {
76212853Sgabeblack@google.com        m_val >>= v;
76312853Sgabeblack@google.com        /* no sign extension needed */
76412853Sgabeblack@google.com        return *this;
76512853Sgabeblack@google.com    }
76612853Sgabeblack@google.com
76712853Sgabeblack@google.com
76812853Sgabeblack@google.com    // prefix and postfix increment and decrement operators
76912853Sgabeblack@google.com    sc_int_base &
77012853Sgabeblack@google.com    operator ++ () // prefix
77112853Sgabeblack@google.com    {
77212853Sgabeblack@google.com        ++m_val;
77312853Sgabeblack@google.com        extend_sign();
77412853Sgabeblack@google.com        return *this;
77512853Sgabeblack@google.com    }
77612853Sgabeblack@google.com
77712853Sgabeblack@google.com    const sc_int_base
77812853Sgabeblack@google.com    operator ++ (int) // postfix
77912853Sgabeblack@google.com    {
78012853Sgabeblack@google.com        sc_int_base tmp(*this);
78112853Sgabeblack@google.com        ++m_val;
78212853Sgabeblack@google.com        extend_sign();
78312853Sgabeblack@google.com        return tmp;
78412853Sgabeblack@google.com    }
78512853Sgabeblack@google.com
78612853Sgabeblack@google.com    sc_int_base &
78712853Sgabeblack@google.com    operator -- () // prefix
78812853Sgabeblack@google.com    {
78912853Sgabeblack@google.com        --m_val;
79012853Sgabeblack@google.com        extend_sign();
79112853Sgabeblack@google.com        return *this;
79212853Sgabeblack@google.com    }
79312853Sgabeblack@google.com
79412853Sgabeblack@google.com    const sc_int_base
79512853Sgabeblack@google.com    operator -- ( int ) // postfix
79612853Sgabeblack@google.com    {
79712853Sgabeblack@google.com        sc_int_base tmp(*this);
79812853Sgabeblack@google.com        --m_val;
79912853Sgabeblack@google.com        extend_sign();
80012853Sgabeblack@google.com        return tmp;
80112853Sgabeblack@google.com    }
80212853Sgabeblack@google.com
80312853Sgabeblack@google.com
80412853Sgabeblack@google.com    // relational operators
80512853Sgabeblack@google.com    friend bool
80612853Sgabeblack@google.com    operator == (const sc_int_base &a, const sc_int_base &b)
80712853Sgabeblack@google.com    {
80812853Sgabeblack@google.com        return a.m_val == b.m_val;
80912853Sgabeblack@google.com    }
81012853Sgabeblack@google.com
81112853Sgabeblack@google.com    friend bool
81212853Sgabeblack@google.com    operator != (const sc_int_base &a, const sc_int_base &b)
81312853Sgabeblack@google.com    {
81412853Sgabeblack@google.com        return a.m_val != b.m_val;
81512853Sgabeblack@google.com    }
81612853Sgabeblack@google.com
81712853Sgabeblack@google.com    friend bool
81812853Sgabeblack@google.com    operator < (const sc_int_base &a, const sc_int_base &b)
81912853Sgabeblack@google.com    {
82012853Sgabeblack@google.com        return a.m_val < b.m_val;
82112853Sgabeblack@google.com    }
82212853Sgabeblack@google.com
82312853Sgabeblack@google.com    friend bool
82412853Sgabeblack@google.com    operator <= (const sc_int_base &a, const sc_int_base &b)
82512853Sgabeblack@google.com    {
82612853Sgabeblack@google.com        return a.m_val <= b.m_val;
82712853Sgabeblack@google.com    }
82812853Sgabeblack@google.com
82912853Sgabeblack@google.com    friend bool
83012853Sgabeblack@google.com    operator > (const sc_int_base &a, const sc_int_base &b)
83112853Sgabeblack@google.com    {
83212853Sgabeblack@google.com        return a.m_val > b.m_val;
83312853Sgabeblack@google.com    }
83412853Sgabeblack@google.com
83512853Sgabeblack@google.com    friend bool
83612853Sgabeblack@google.com    operator >= (const sc_int_base &a, const sc_int_base &b)
83712853Sgabeblack@google.com    {
83812853Sgabeblack@google.com        return a.m_val >= b.m_val;
83912853Sgabeblack@google.com    }
84012853Sgabeblack@google.com
84112853Sgabeblack@google.com
84212853Sgabeblack@google.com    // bit selection
84312853Sgabeblack@google.com    sc_int_bitref &operator [] (int i);
84412853Sgabeblack@google.com    const sc_int_bitref_r &operator [] (int i) const;
84512853Sgabeblack@google.com
84612853Sgabeblack@google.com    sc_int_bitref &bit(int i);
84712853Sgabeblack@google.com    const sc_int_bitref_r &bit(int i) const;
84812853Sgabeblack@google.com
84912853Sgabeblack@google.com
85012853Sgabeblack@google.com    // part selection
85112853Sgabeblack@google.com    sc_int_subref &operator () (int left, int right);
85212853Sgabeblack@google.com    const sc_int_subref_r &operator () (int left, int right) const;
85312853Sgabeblack@google.com
85412853Sgabeblack@google.com    sc_int_subref &range(int left, int right);
85512853Sgabeblack@google.com    const sc_int_subref_r &range(int left, int right) const;
85612853Sgabeblack@google.com
85712853Sgabeblack@google.com
85812853Sgabeblack@google.com    // bit access, without bounds checking or sign extension
85912853Sgabeblack@google.com    bool test(int i) const { return (0 != (m_val & (UINT_ONE << i))); }
86012853Sgabeblack@google.com
86112853Sgabeblack@google.com    void set(int i) { m_val |= (UINT_ONE << i); }
86212853Sgabeblack@google.com
86312853Sgabeblack@google.com    void
86412853Sgabeblack@google.com    set(int i, bool v)
86512853Sgabeblack@google.com    {
86612853Sgabeblack@google.com        v ? m_val |= (UINT_ONE << i) : m_val &= ~(UINT_ONE << i);
86712853Sgabeblack@google.com    }
86812853Sgabeblack@google.com
86912853Sgabeblack@google.com    // capacity
87012853Sgabeblack@google.com    int length() const { return m_len; }
87112853Sgabeblack@google.com
87212853Sgabeblack@google.com    // concatenation support
87312853Sgabeblack@google.com    virtual int
87412853Sgabeblack@google.com    concat_length(bool* xz_present_p) const
87512853Sgabeblack@google.com    {
87612853Sgabeblack@google.com        if (xz_present_p)
87712853Sgabeblack@google.com            *xz_present_p = false;
87812853Sgabeblack@google.com        return length();
87912853Sgabeblack@google.com    }
88012853Sgabeblack@google.com    virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
88112853Sgabeblack@google.com    virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
88212853Sgabeblack@google.com    virtual uint64
88312853Sgabeblack@google.com    concat_get_uint64() const
88412853Sgabeblack@google.com    {
88512853Sgabeblack@google.com        if (m_len < 64)
88612853Sgabeblack@google.com            return (uint64)(m_val & ~((uint_type) - 1 << m_len));
88712853Sgabeblack@google.com        else
88812853Sgabeblack@google.com            return (uint64)m_val;
88912853Sgabeblack@google.com    }
89012853Sgabeblack@google.com    virtual void concat_set(int64 src, int low_i);
89112853Sgabeblack@google.com    virtual void concat_set(const sc_signed &src, int low_i);
89212853Sgabeblack@google.com    virtual void concat_set(const sc_unsigned &src, int low_i);
89312853Sgabeblack@google.com    virtual void concat_set(uint64 src, int low_i);
89412853Sgabeblack@google.com
89512853Sgabeblack@google.com
89612853Sgabeblack@google.com    // reduce methods
89712853Sgabeblack@google.com    bool and_reduce() const;
89812853Sgabeblack@google.com    bool nand_reduce() const { return !and_reduce(); }
89912853Sgabeblack@google.com    bool or_reduce() const;
90012853Sgabeblack@google.com    bool nor_reduce() const { return !or_reduce(); }
90112853Sgabeblack@google.com    bool xor_reduce() const;
90212853Sgabeblack@google.com    bool xnor_reduce() const { return !xor_reduce(); }
90312853Sgabeblack@google.com
90412853Sgabeblack@google.com
90512853Sgabeblack@google.com    // implicit conversion to int_type
90612853Sgabeblack@google.com    operator int_type() const { return m_val; }
90712853Sgabeblack@google.com
90812853Sgabeblack@google.com
90912853Sgabeblack@google.com    // explicit conversions
91012853Sgabeblack@google.com    int_type value() const { return operator int_type(); }
91112853Sgabeblack@google.com    int to_int() const { return (int)m_val; }
91212853Sgabeblack@google.com    unsigned int to_uint() const { return (unsigned int)m_val; }
91312853Sgabeblack@google.com    long to_long() const { return (long)m_val; }
91412853Sgabeblack@google.com    unsigned long to_ulong() const { return (unsigned long)m_val; }
91512853Sgabeblack@google.com    int64 to_int64() const { return (int64)m_val; }
91612853Sgabeblack@google.com    uint64 to_uint64() const { return (uint64)m_val; }
91712853Sgabeblack@google.com    double to_double() const { return (double)m_val; }
91812853Sgabeblack@google.com    long long_low() const { return (long)(m_val & UINT64_32ONES); }
91912853Sgabeblack@google.com    long long_high() const { return (long)((m_val >> 32) & UINT64_32ONES); }
92012853Sgabeblack@google.com
92112853Sgabeblack@google.com
92212853Sgabeblack@google.com    // explicit conversion to character string
92312853Sgabeblack@google.com    const std::string to_string(sc_numrep numrep=SC_DEC) const;
92412853Sgabeblack@google.com    const std::string to_string(sc_numrep numrep, bool w_prefix) const;
92512853Sgabeblack@google.com
92612853Sgabeblack@google.com
92712853Sgabeblack@google.com    // other methods
92812853Sgabeblack@google.com    void
92912853Sgabeblack@google.com    print(::std::ostream &os=::std::cout) const
93012853Sgabeblack@google.com    {
93112853Sgabeblack@google.com        os << to_string(sc_io_base(os, SC_DEC), sc_io_show_base(os));
93212853Sgabeblack@google.com    }
93312853Sgabeblack@google.com
93412853Sgabeblack@google.com    void scan(::std::istream &is=::std::cin);
93512853Sgabeblack@google.com
93612853Sgabeblack@google.com  protected:
93712853Sgabeblack@google.com    int_type m_val; // value
93812853Sgabeblack@google.com    int m_len; // length
93912853Sgabeblack@google.com    int m_ulen; // unused length
94012853Sgabeblack@google.com};
94112853Sgabeblack@google.com
94212853Sgabeblack@google.cominline ::std::ostream &operator << (::std::ostream &, const sc_int_base &);
94312853Sgabeblack@google.cominline ::std::istream &operator >> (::std::istream &, sc_int_base &);
94412853Sgabeblack@google.com
94512853Sgabeblack@google.com
94612853Sgabeblack@google.com// ----------------------------------------------------------------------------
94712853Sgabeblack@google.com//  CLASS : sc_int_bitref_r
94812853Sgabeblack@google.com//
94912853Sgabeblack@google.com//  Proxy class for sc_int bit selection (r-value only).
95012853Sgabeblack@google.com// ----------------------------------------------------------------------------
95112853Sgabeblack@google.com
95212853Sgabeblack@google.com// implicit conversion to uint64
95312853Sgabeblack@google.com
95412853Sgabeblack@google.cominline sc_int_bitref_r::operator uint64 () const
95512853Sgabeblack@google.com{
95612853Sgabeblack@google.com    return m_obj_p->test(m_index);
95712853Sgabeblack@google.com}
95812853Sgabeblack@google.com
95912853Sgabeblack@google.cominline bool
96012853Sgabeblack@google.comsc_int_bitref_r::operator ! () const
96112853Sgabeblack@google.com{
96212853Sgabeblack@google.com    return ! m_obj_p->test(m_index);
96312853Sgabeblack@google.com}
96412853Sgabeblack@google.com
96512853Sgabeblack@google.cominline bool
96612853Sgabeblack@google.comsc_int_bitref_r::operator ~ () const
96712853Sgabeblack@google.com{
96812853Sgabeblack@google.com    return !m_obj_p->test(m_index);
96912853Sgabeblack@google.com}
97012853Sgabeblack@google.com
97112853Sgabeblack@google.com
97212853Sgabeblack@google.cominline ::std::ostream &
97312853Sgabeblack@google.comoperator << (::std::ostream &os, const sc_int_bitref_r &a)
97412853Sgabeblack@google.com{
97512853Sgabeblack@google.com    a.print(os);
97612853Sgabeblack@google.com    return os;
97712853Sgabeblack@google.com}
97812853Sgabeblack@google.com
97912853Sgabeblack@google.com
98012853Sgabeblack@google.com// ----------------------------------------------------------------------------
98112853Sgabeblack@google.com//  CLASS : sc_int_bitref
98212853Sgabeblack@google.com//
98312853Sgabeblack@google.com//  Proxy class for sc_int bit selection (r-value and l-value).
98412853Sgabeblack@google.com// ----------------------------------------------------------------------------
98512853Sgabeblack@google.com
98612853Sgabeblack@google.com// assignment operators
98712853Sgabeblack@google.com
98812853Sgabeblack@google.cominline sc_int_bitref &
98912853Sgabeblack@google.comsc_int_bitref::operator = (const sc_int_bitref_r &b)
99012853Sgabeblack@google.com{
99112853Sgabeblack@google.com    m_obj_p->set(m_index, (bool)b);
99212853Sgabeblack@google.com    m_obj_p->extend_sign();
99312853Sgabeblack@google.com    return *this;
99412853Sgabeblack@google.com}
99512853Sgabeblack@google.com
99612853Sgabeblack@google.cominline sc_int_bitref &
99712853Sgabeblack@google.comsc_int_bitref::operator = (const sc_int_bitref &b)
99812853Sgabeblack@google.com{
99912853Sgabeblack@google.com    m_obj_p->set(m_index, (bool)b);
100012853Sgabeblack@google.com    m_obj_p->extend_sign();
100112853Sgabeblack@google.com    return *this;
100212853Sgabeblack@google.com}
100312853Sgabeblack@google.com
100412853Sgabeblack@google.cominline sc_int_bitref &
100512853Sgabeblack@google.comsc_int_bitref::operator = (bool b)
100612853Sgabeblack@google.com{
100712853Sgabeblack@google.com    m_obj_p->set(m_index, b);
100812853Sgabeblack@google.com    m_obj_p->extend_sign();
100912853Sgabeblack@google.com    return *this;
101012853Sgabeblack@google.com}
101112853Sgabeblack@google.com
101212853Sgabeblack@google.com
101312853Sgabeblack@google.cominline sc_int_bitref &
101412853Sgabeblack@google.comsc_int_bitref::operator &= (bool b)
101512853Sgabeblack@google.com{
101612853Sgabeblack@google.com    if (!b) {
101712853Sgabeblack@google.com        m_obj_p->set(m_index, b);
101812853Sgabeblack@google.com        m_obj_p->extend_sign();
101912853Sgabeblack@google.com    }
102012853Sgabeblack@google.com    return *this;
102112853Sgabeblack@google.com}
102212853Sgabeblack@google.com
102312853Sgabeblack@google.cominline sc_int_bitref &
102412853Sgabeblack@google.comsc_int_bitref::operator |= (bool b)
102512853Sgabeblack@google.com{
102612853Sgabeblack@google.com    if (b) {
102712853Sgabeblack@google.com        m_obj_p->set(m_index, b);
102812853Sgabeblack@google.com        m_obj_p->extend_sign();
102912853Sgabeblack@google.com    }
103012853Sgabeblack@google.com    return *this;
103112853Sgabeblack@google.com}
103212853Sgabeblack@google.com
103312853Sgabeblack@google.cominline sc_int_bitref &
103412853Sgabeblack@google.comsc_int_bitref::operator ^= (bool b)
103512853Sgabeblack@google.com{
103612853Sgabeblack@google.com    if (b) {
103712853Sgabeblack@google.com        m_obj_p->m_val ^= (UINT_ONE << m_index);
103812853Sgabeblack@google.com        m_obj_p->extend_sign();
103912853Sgabeblack@google.com    }
104012853Sgabeblack@google.com    return *this;
104112853Sgabeblack@google.com}
104212853Sgabeblack@google.com
104312853Sgabeblack@google.com
104412853Sgabeblack@google.com
104512853Sgabeblack@google.cominline ::std::istream &
104612853Sgabeblack@google.comoperator >> (::std::istream &is, sc_int_bitref &a)
104712853Sgabeblack@google.com{
104812853Sgabeblack@google.com    a.scan(is);
104912853Sgabeblack@google.com    return is;
105012853Sgabeblack@google.com}
105112853Sgabeblack@google.com
105212853Sgabeblack@google.com
105312853Sgabeblack@google.com// ----------------------------------------------------------------------------
105412853Sgabeblack@google.com//  CLASS : sc_int_subref_r
105512853Sgabeblack@google.com//
105612853Sgabeblack@google.com//  Proxy class for sc_int part selection (r-value only).
105712853Sgabeblack@google.com// ----------------------------------------------------------------------------
105812853Sgabeblack@google.com
105912853Sgabeblack@google.com// implicit conversion to int_type
106012853Sgabeblack@google.com
106112853Sgabeblack@google.cominline sc_int_subref_r::operator uint_type() const
106212853Sgabeblack@google.com{
106312853Sgabeblack@google.com    uint_type /*int_type*/ val = m_obj_p->m_val;
106412853Sgabeblack@google.com    int uleft = SC_INTWIDTH - (m_left + 1);
106512853Sgabeblack@google.com    int uright = uleft + m_right;
106612853Sgabeblack@google.com    return (val << uleft >> uright);
106712853Sgabeblack@google.com}
106812853Sgabeblack@google.com
106912853Sgabeblack@google.com
107012853Sgabeblack@google.com// reduce methods
107112853Sgabeblack@google.com
107212853Sgabeblack@google.cominline bool
107312853Sgabeblack@google.comsc_int_subref_r::and_reduce() const
107412853Sgabeblack@google.com{
107512853Sgabeblack@google.com    sc_int_base a(*this);
107612853Sgabeblack@google.com    return a.and_reduce();
107712853Sgabeblack@google.com}
107812853Sgabeblack@google.com
107912853Sgabeblack@google.cominline bool
108012853Sgabeblack@google.comsc_int_subref_r::or_reduce() const
108112853Sgabeblack@google.com{
108212853Sgabeblack@google.com    sc_int_base a(*this);
108312853Sgabeblack@google.com    return a.or_reduce();
108412853Sgabeblack@google.com}
108512853Sgabeblack@google.com
108612853Sgabeblack@google.cominline bool
108712853Sgabeblack@google.comsc_int_subref_r::xor_reduce() const
108812853Sgabeblack@google.com{
108912853Sgabeblack@google.com    sc_int_base a(*this);
109012853Sgabeblack@google.com    return a.xor_reduce();
109112853Sgabeblack@google.com}
109212853Sgabeblack@google.com
109312853Sgabeblack@google.com
109412853Sgabeblack@google.com// explicit conversions
109512853Sgabeblack@google.com
109612853Sgabeblack@google.cominline int
109712853Sgabeblack@google.comsc_int_subref_r::to_int() const
109812853Sgabeblack@google.com{
109912853Sgabeblack@google.com    int result = static_cast<int>(operator uint_type());
110012853Sgabeblack@google.com    return result;
110112853Sgabeblack@google.com}
110212853Sgabeblack@google.com
110312853Sgabeblack@google.cominline unsigned int
110412853Sgabeblack@google.comsc_int_subref_r::to_uint() const
110512853Sgabeblack@google.com{
110612853Sgabeblack@google.com    unsigned int result = static_cast<unsigned int>(operator uint_type());
110712853Sgabeblack@google.com    return result;
110812853Sgabeblack@google.com}
110912853Sgabeblack@google.com
111012853Sgabeblack@google.cominline long
111112853Sgabeblack@google.comsc_int_subref_r::to_long() const
111212853Sgabeblack@google.com{
111312853Sgabeblack@google.com    long result = static_cast<long>(operator uint_type());
111412853Sgabeblack@google.com    return result;
111512853Sgabeblack@google.com}
111612853Sgabeblack@google.com
111712853Sgabeblack@google.cominline unsigned long
111812853Sgabeblack@google.comsc_int_subref_r::to_ulong() const
111912853Sgabeblack@google.com{
112012853Sgabeblack@google.com    unsigned long result = static_cast<unsigned long>(operator uint_type());
112112853Sgabeblack@google.com    return result;
112212853Sgabeblack@google.com}
112312853Sgabeblack@google.com
112412853Sgabeblack@google.cominline int64
112512853Sgabeblack@google.comsc_int_subref_r::to_int64() const
112612853Sgabeblack@google.com{
112712853Sgabeblack@google.com    int64 result = operator uint_type();
112812853Sgabeblack@google.com    return result;
112912853Sgabeblack@google.com}
113012853Sgabeblack@google.com
113112853Sgabeblack@google.cominline uint64
113212853Sgabeblack@google.comsc_int_subref_r::to_uint64() const
113312853Sgabeblack@google.com{
113412853Sgabeblack@google.com    uint64 result = operator uint_type();
113512853Sgabeblack@google.com    return result;
113612853Sgabeblack@google.com}
113712853Sgabeblack@google.com
113812853Sgabeblack@google.cominline double
113912853Sgabeblack@google.comsc_int_subref_r::to_double() const
114012853Sgabeblack@google.com{
114112853Sgabeblack@google.com    double result = static_cast<double>(operator uint_type());
114212853Sgabeblack@google.com    return result;
114312853Sgabeblack@google.com}
114412853Sgabeblack@google.com
114512853Sgabeblack@google.com
114612853Sgabeblack@google.com// explicit conversion to character string
114712853Sgabeblack@google.com
114812853Sgabeblack@google.cominline const std::string
114912853Sgabeblack@google.comsc_int_subref_r::to_string(sc_numrep numrep) const
115012853Sgabeblack@google.com{
115112853Sgabeblack@google.com    sc_uint_base a(length());
115212853Sgabeblack@google.com    a = operator uint_type();
115312853Sgabeblack@google.com    return a.to_string(numrep);
115412853Sgabeblack@google.com}
115512853Sgabeblack@google.com
115612853Sgabeblack@google.cominline const std::string
115712853Sgabeblack@google.comsc_int_subref_r::to_string(sc_numrep numrep, bool w_prefix) const
115812853Sgabeblack@google.com{
115912853Sgabeblack@google.com    sc_uint_base a(length());
116012853Sgabeblack@google.com    a = operator uint_type();
116112853Sgabeblack@google.com    return a.to_string(numrep, w_prefix);
116212853Sgabeblack@google.com}
116312853Sgabeblack@google.com
116412853Sgabeblack@google.com
116512853Sgabeblack@google.com// functional notation for the reduce methods
116612853Sgabeblack@google.com
116712853Sgabeblack@google.cominline bool
116812853Sgabeblack@google.comand_reduce(const sc_int_subref_r &a)
116912853Sgabeblack@google.com{
117012853Sgabeblack@google.com    return a.and_reduce();
117112853Sgabeblack@google.com}
117212853Sgabeblack@google.com
117312853Sgabeblack@google.cominline bool
117412853Sgabeblack@google.comnand_reduce(const sc_int_subref_r &a)
117512853Sgabeblack@google.com{
117612853Sgabeblack@google.com    return a.nand_reduce();
117712853Sgabeblack@google.com}
117812853Sgabeblack@google.com
117912853Sgabeblack@google.cominline bool
118012853Sgabeblack@google.comor_reduce(const sc_int_subref_r &a)
118112853Sgabeblack@google.com{
118212853Sgabeblack@google.com    return a.or_reduce();
118312853Sgabeblack@google.com}
118412853Sgabeblack@google.com
118512853Sgabeblack@google.cominline bool
118612853Sgabeblack@google.comnor_reduce(const sc_int_subref_r &a)
118712853Sgabeblack@google.com{
118812853Sgabeblack@google.com    return a.nor_reduce();
118912853Sgabeblack@google.com}
119012853Sgabeblack@google.com
119112853Sgabeblack@google.cominline bool
119212853Sgabeblack@google.comxor_reduce(const sc_int_subref_r &a)
119312853Sgabeblack@google.com{
119412853Sgabeblack@google.com    return a.xor_reduce();
119512853Sgabeblack@google.com}
119612853Sgabeblack@google.com
119712853Sgabeblack@google.cominline bool
119812853Sgabeblack@google.comxnor_reduce(const sc_int_subref_r &a)
119912853Sgabeblack@google.com{
120012853Sgabeblack@google.com    return a.xnor_reduce();
120112853Sgabeblack@google.com}
120212853Sgabeblack@google.com
120312853Sgabeblack@google.com
120412853Sgabeblack@google.com
120512853Sgabeblack@google.cominline ::std::ostream &
120612853Sgabeblack@google.comoperator << (::std::ostream &os, const sc_int_subref_r &a)
120712853Sgabeblack@google.com{
120812853Sgabeblack@google.com    a.print(os);
120912853Sgabeblack@google.com    return os;
121012853Sgabeblack@google.com}
121112853Sgabeblack@google.com
121212853Sgabeblack@google.com
121312853Sgabeblack@google.com// ----------------------------------------------------------------------------
121412853Sgabeblack@google.com//  CLASS : sc_int_subref
121512853Sgabeblack@google.com//
121612853Sgabeblack@google.com//  Proxy class for sc_int part selection (r-value and l-value).
121712853Sgabeblack@google.com// ----------------------------------------------------------------------------
121812853Sgabeblack@google.com
121912853Sgabeblack@google.com// assignment operators
122012853Sgabeblack@google.com
122112853Sgabeblack@google.cominline sc_int_subref &
122212853Sgabeblack@google.comsc_int_subref::operator = (const sc_int_base &a)
122312853Sgabeblack@google.com{
122412853Sgabeblack@google.com    return operator = (a.operator int_type());
122512853Sgabeblack@google.com}
122612853Sgabeblack@google.com
122712853Sgabeblack@google.cominline sc_int_subref &
122812853Sgabeblack@google.comsc_int_subref::operator = (const char *a)
122912853Sgabeblack@google.com{
123012853Sgabeblack@google.com    sc_int_base aa(length());
123112853Sgabeblack@google.com    return (*this = aa = a);
123212853Sgabeblack@google.com}
123312853Sgabeblack@google.com
123412853Sgabeblack@google.com
123512853Sgabeblack@google.com
123612853Sgabeblack@google.cominline ::std::istream &
123712853Sgabeblack@google.comoperator >> (::std::istream &is, sc_int_subref &a)
123812853Sgabeblack@google.com{
123912853Sgabeblack@google.com    a.scan(is);
124012853Sgabeblack@google.com    return is;
124112853Sgabeblack@google.com}
124212853Sgabeblack@google.com
124312853Sgabeblack@google.com
124412853Sgabeblack@google.com// ----------------------------------------------------------------------------
124512853Sgabeblack@google.com//  CLASS : sc_int_base
124612853Sgabeblack@google.com//
124712853Sgabeblack@google.com//  Base class for sc_int.
124812853Sgabeblack@google.com// ----------------------------------------------------------------------------
124912853Sgabeblack@google.com
125012853Sgabeblack@google.com// bit selection
125112853Sgabeblack@google.com
125212853Sgabeblack@google.cominline sc_int_bitref &
125312853Sgabeblack@google.comsc_int_base::operator [] (int i)
125412853Sgabeblack@google.com{
125512853Sgabeblack@google.com    check_index(i);
125612853Sgabeblack@google.com    sc_int_bitref *result_p = sc_int_bitref::m_pool.allocate();
125712853Sgabeblack@google.com    result_p->initialize(this, i);
125812853Sgabeblack@google.com    return *result_p;
125912853Sgabeblack@google.com}
126012853Sgabeblack@google.com
126112853Sgabeblack@google.cominline const sc_int_bitref_r &
126212853Sgabeblack@google.comsc_int_base::operator [] (int i) const
126312853Sgabeblack@google.com{
126412853Sgabeblack@google.com    check_index(i);
126512853Sgabeblack@google.com    sc_int_bitref *result_p = sc_int_bitref::m_pool.allocate();
126612853Sgabeblack@google.com    result_p->initialize(this, i);
126712853Sgabeblack@google.com    return *result_p;
126812853Sgabeblack@google.com}
126912853Sgabeblack@google.com
127012853Sgabeblack@google.com
127112853Sgabeblack@google.cominline sc_int_bitref &
127212853Sgabeblack@google.comsc_int_base::bit(int i)
127312853Sgabeblack@google.com{
127412853Sgabeblack@google.com    check_index(i);
127512853Sgabeblack@google.com    sc_int_bitref *result_p = sc_int_bitref::m_pool.allocate();
127612853Sgabeblack@google.com    result_p->initialize(this, i);
127712853Sgabeblack@google.com    return *result_p;
127812853Sgabeblack@google.com}
127912853Sgabeblack@google.com
128012853Sgabeblack@google.cominline const sc_int_bitref_r &
128112853Sgabeblack@google.comsc_int_base::bit(int i) const
128212853Sgabeblack@google.com{
128312853Sgabeblack@google.com    check_index(i);
128412853Sgabeblack@google.com    sc_int_bitref *result_p = sc_int_bitref::m_pool.allocate();
128512853Sgabeblack@google.com    result_p->initialize(this, i);
128612853Sgabeblack@google.com    return *result_p;
128712853Sgabeblack@google.com}
128812853Sgabeblack@google.com
128912853Sgabeblack@google.com
129012853Sgabeblack@google.com// part selection
129112853Sgabeblack@google.com
129212853Sgabeblack@google.cominline sc_int_subref &
129312853Sgabeblack@google.comsc_int_base::operator () (int left, int right)
129412853Sgabeblack@google.com{
129512853Sgabeblack@google.com    check_range(left, right);
129612853Sgabeblack@google.com    sc_int_subref *result_p = sc_int_subref::m_pool.allocate();
129712853Sgabeblack@google.com    result_p->initialize(this, left, right);
129812853Sgabeblack@google.com    return *result_p;
129912853Sgabeblack@google.com}
130012853Sgabeblack@google.com
130112853Sgabeblack@google.cominline const sc_int_subref_r &
130212853Sgabeblack@google.comsc_int_base::operator () (int left, int right) const
130312853Sgabeblack@google.com{
130412853Sgabeblack@google.com    check_range(left, right);
130512853Sgabeblack@google.com    sc_int_subref *result_p = sc_int_subref::m_pool.allocate();
130612853Sgabeblack@google.com    result_p->initialize(this, left, right);
130712853Sgabeblack@google.com    return *result_p;
130812853Sgabeblack@google.com}
130912853Sgabeblack@google.com
131012853Sgabeblack@google.com
131112853Sgabeblack@google.cominline sc_int_subref &
131212853Sgabeblack@google.comsc_int_base::range(int left, int right)
131312853Sgabeblack@google.com{
131412853Sgabeblack@google.com    check_range(left, right);
131512853Sgabeblack@google.com    sc_int_subref *result_p = sc_int_subref::m_pool.allocate();
131612853Sgabeblack@google.com    result_p->initialize(this, left, right);
131712853Sgabeblack@google.com    return *result_p;
131812853Sgabeblack@google.com}
131912853Sgabeblack@google.com
132012853Sgabeblack@google.cominline const sc_int_subref_r &
132112853Sgabeblack@google.comsc_int_base::range(int left, int right) const
132212853Sgabeblack@google.com{
132312853Sgabeblack@google.com    check_range(left, right);
132412853Sgabeblack@google.com    sc_int_subref *result_p = sc_int_subref::m_pool.allocate();
132512853Sgabeblack@google.com    result_p->initialize(this, left, right);
132612853Sgabeblack@google.com    return *result_p;
132712853Sgabeblack@google.com}
132812853Sgabeblack@google.com
132912853Sgabeblack@google.com
133012853Sgabeblack@google.com// functional notation for the reduce methods
133112853Sgabeblack@google.com
133212853Sgabeblack@google.cominline bool
133312853Sgabeblack@google.comand_reduce(const sc_int_base &a)
133412853Sgabeblack@google.com{
133512853Sgabeblack@google.com    return a.and_reduce();
133612853Sgabeblack@google.com}
133712853Sgabeblack@google.com
133812853Sgabeblack@google.cominline bool
133912853Sgabeblack@google.comnand_reduce(const sc_int_base &a)
134012853Sgabeblack@google.com{
134112853Sgabeblack@google.com    return a.nand_reduce();
134212853Sgabeblack@google.com}
134312853Sgabeblack@google.com
134412853Sgabeblack@google.cominline bool
134512853Sgabeblack@google.comor_reduce(const sc_int_base &a)
134612853Sgabeblack@google.com{
134712853Sgabeblack@google.com    return a.or_reduce();
134812853Sgabeblack@google.com}
134912853Sgabeblack@google.com
135012853Sgabeblack@google.cominline bool
135112853Sgabeblack@google.comnor_reduce(const sc_int_base &a)
135212853Sgabeblack@google.com{
135312853Sgabeblack@google.com    return a.nor_reduce();
135412853Sgabeblack@google.com}
135512853Sgabeblack@google.com
135612853Sgabeblack@google.cominline bool
135712853Sgabeblack@google.comxor_reduce(const sc_int_base &a)
135812853Sgabeblack@google.com{
135912853Sgabeblack@google.com    return a.xor_reduce();
136012853Sgabeblack@google.com}
136112853Sgabeblack@google.com
136212853Sgabeblack@google.cominline bool
136312853Sgabeblack@google.comxnor_reduce(const sc_int_base &a)
136412853Sgabeblack@google.com{
136512853Sgabeblack@google.com    return a.xnor_reduce();
136612853Sgabeblack@google.com}
136712853Sgabeblack@google.com
136812853Sgabeblack@google.com
136912853Sgabeblack@google.com
137012853Sgabeblack@google.cominline ::std::ostream &
137112853Sgabeblack@google.comoperator << (::std::ostream &os, const sc_int_base &a)
137212853Sgabeblack@google.com{
137312853Sgabeblack@google.com    a.print(os);
137412853Sgabeblack@google.com    return os;
137512853Sgabeblack@google.com}
137612853Sgabeblack@google.com
137712853Sgabeblack@google.cominline ::std::istream &
137812853Sgabeblack@google.comoperator >> (::std::istream &is, sc_int_base &a)
137912853Sgabeblack@google.com{
138012853Sgabeblack@google.com    a.scan(is);
138112853Sgabeblack@google.com    return is;
138212853Sgabeblack@google.com}
138312853Sgabeblack@google.com
138412853Sgabeblack@google.com} // namespace sc_dt
138512853Sgabeblack@google.com
138612853Sgabeblack@google.com#endif // __SYSTEMC_EXT_DT_INT_SC_INT_BASE_HH__
1387