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_biguint.h -- Template version of sc_unsigned. This class
23                  enables compile-time bit widths for sc_unsigned numbers.
24
25  Original Author: Ali Dasdan, Synopsys, Inc.
26
27 *****************************************************************************/
28
29/*****************************************************************************
30
31  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
32  changes you are making here.
33
34      Name, Affiliation, Date: Gene Bushayev, Synopsys, Inc.
35  Description of Modification: - Interface between sc_bigint and sc_bv/sc_lv.
36
37      Name, Affiliation, Date:
38  Description of Modification:
39
40 *****************************************************************************/
41
42// $Log: sc_biguint.h,v $
43// Revision 1.2  2011/02/18 20:19:14  acg
44//  Andy Goodrich: updating Copyright notice.
45//
46// Revision 1.1.1.1  2006/12/15 20:20:05  acg
47// SystemC 2.3
48//
49// Revision 1.3  2006/01/13 18:49:31  acg
50// Added $Log command so that CVS check in comments are reproduced in the
51// source.
52//
53
54#ifndef __SYSTEMC_EXT_DT_INT_SC_BIGUINT_HH__
55#define __SYSTEMC_EXT_DT_INT_SC_BIGUINT_HH__
56
57#include "sc_signed.hh"
58#include "sc_unsigned.hh"
59
60namespace sc_dt
61{
62
63// classes defined in this module
64template <int W>
65class sc_biguint;
66
67// forward class declarations
68class sc_bv_base;
69class sc_lv_base;
70class sc_fxval;
71class sc_fxval_fast;
72class sc_fxnum;
73class sc_fxnum_fast;
74
75
76// ----------------------------------------------------------------------------
77//  CLASS TEMPLATE : sc_biguint<W>
78//
79//  Arbitrary size unsigned integer type.
80// ----------------------------------------------------------------------------
81
82#ifdef SC_MAX_NBITS
83template<int W=SC_MAX_NBITS>
84#else
85template<int W>
86#endif
87class sc_biguint : public sc_unsigned
88{
89  public:
90    // constructors
91    sc_biguint() : sc_unsigned(W) {}
92    sc_biguint(const sc_biguint<W> &v) : sc_unsigned(W) { *this = v; }
93    sc_biguint(const sc_unsigned &v) : sc_unsigned(W) { *this = v; }
94    sc_biguint(const sc_unsigned_subref &v) : sc_unsigned(W) { *this = v; }
95
96    template<class T>
97    sc_biguint(const sc_generic_base<T> &a) : sc_unsigned(W)
98    {
99        a->to_sc_unsigned(*this);
100    }
101
102    sc_biguint(const sc_signed &v) : sc_unsigned(W) { *this = v; }
103    sc_biguint(const sc_signed_subref &v) : sc_unsigned(W) { *this = v; }
104    sc_biguint(const char* v) : sc_unsigned(W) { *this = v; }
105    sc_biguint(int64 v) : sc_unsigned(W) { *this = v; }
106    sc_biguint(uint64 v) : sc_unsigned(W) { *this = v; }
107    sc_biguint(long v) : sc_unsigned(W) { *this = v; }
108    sc_biguint(unsigned long v) : sc_unsigned(W) { *this = v; }
109    sc_biguint(int v) : sc_unsigned(W) { *this = v; }
110    sc_biguint(unsigned int v) : sc_unsigned(W) { *this = v; }
111    sc_biguint(double v) : sc_unsigned(W) { *this = v; }
112    sc_biguint(const sc_bv_base &v) : sc_unsigned(W) { *this = v; }
113    sc_biguint(const sc_lv_base &v) : sc_unsigned(W) { *this = v; }
114
115    explicit sc_biguint(const sc_fxval &v) : sc_unsigned(W) { *this = v; }
116    explicit sc_biguint(const sc_fxval_fast &v) : sc_unsigned(W) { *this = v; }
117    explicit sc_biguint(const sc_fxnum &v) : sc_unsigned(W) { *this = v; }
118    explicit sc_biguint(const sc_fxnum_fast &v) : sc_unsigned(W) { *this = v; }
119
120#ifndef SC_MAX_NBITS
121    // destructor
122    ~sc_biguint() {}
123#endif
124
125    // assignment operators
126    sc_biguint<W> &
127    operator = (const sc_biguint<W> &v)
128    {
129        sc_unsigned::operator = (v);
130        return *this;
131    }
132
133    sc_biguint<W> &
134    operator = (const sc_unsigned &v)
135    {
136        sc_unsigned::operator = (v);
137        return *this;
138    }
139
140    sc_biguint<W> &
141    operator = (const sc_unsigned_subref &v)
142    {
143        sc_unsigned::operator = (v);
144        return *this;
145    }
146
147    template< class T >
148    sc_biguint<W> &
149    operator = (const sc_generic_base<T> &a)
150    { a->to_sc_unsigned(*this);
151        return *this;
152    }
153
154    sc_biguint<W> &
155    operator = (const sc_signed &v)
156    {
157        sc_unsigned::operator = (v);
158        return *this;
159    }
160
161    sc_biguint<W> &
162    operator = (const sc_signed_subref &v)
163    {
164        sc_unsigned::operator = (v);
165        return *this;
166    }
167
168    sc_biguint<W> &
169    operator = (const char* v)
170    {
171        sc_unsigned::operator = (v);
172        return *this;
173    }
174
175    sc_biguint<W> &
176    operator = (int64 v)
177    {
178        sc_unsigned::operator = (v);
179        return *this;
180    }
181
182    sc_biguint<W> &
183    operator = (uint64 v)
184    {
185        sc_unsigned::operator = (v);
186        return *this;
187    }
188
189    sc_biguint<W> &
190    operator = (long v)
191    {
192        sc_unsigned::operator = (v);
193        return *this;
194    }
195
196    sc_biguint<W> &
197    operator = (unsigned long v)
198    {
199        sc_unsigned::operator = (v);
200        return *this;
201    }
202
203    sc_biguint<W> &
204    operator = (int v)
205    {
206        sc_unsigned::operator = (v);
207        return *this;
208    }
209
210    sc_biguint<W> &
211    operator = (unsigned int v)
212    {
213        sc_unsigned::operator = (v);
214        return *this;
215    }
216
217    sc_biguint<W> &
218    operator = (double v)
219    {
220        sc_unsigned::operator = (v);
221        return *this;
222    }
223
224
225    sc_biguint<W> &
226    operator = (const sc_bv_base &v)
227    {
228        sc_unsigned::operator = (v);
229        return *this;
230    }
231
232    sc_biguint<W> &
233    operator = (const sc_lv_base &v)
234    {
235        sc_unsigned::operator = (v);
236        return *this;
237    }
238
239    sc_biguint<W> &
240    operator = (const sc_int_base &v)
241    {
242        sc_unsigned::operator = (v);
243        return *this;
244    }
245
246    sc_biguint<W> &
247    operator = (const sc_uint_base &v)
248    {
249        sc_unsigned::operator = (v);
250        return *this;
251    }
252
253    sc_biguint<W> &
254    operator = (const sc_fxval &v)
255    {
256        sc_unsigned::operator = (v);
257        return *this;
258    }
259
260    sc_biguint<W> &
261    operator = (const sc_fxval_fast &v)
262    {
263        sc_unsigned::operator = (v);
264        return *this;
265    }
266
267    sc_biguint<W> &
268    operator = (const sc_fxnum &v)
269    {
270        sc_unsigned::operator = (v);
271        return *this;
272    }
273
274    sc_biguint<W> &
275    operator = (const sc_fxnum_fast &v)
276    {
277        sc_unsigned::operator = (v);
278        return *this;
279    }
280};
281
282} // namespace sc_dt
283
284#endif // __SYSTEMC_EXT_DT_INT_SC_BIGUINT_HH__
285