Deleted Added
sdiff udiff text old ( 13160:1e959d3afc64 ) new ( 13322:7391057615bd )
full compact
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.cpp -- Arbitrary precision signed arithmetic.
23
24 This file includes the definitions of sc_unsigned_bitref,
25 sc_unsigned_subref, and sc_unsigned classes. The first two classes
26 are proxy classes to reference one bit and a range of bits of a
27 sc_unsigned number, respectively. This file also includes
28 sc_nbcommon.cpp and sc_nbfriends.cpp, which contain the
29 definitions shared by sc_unsigned.
30
31 Original Author: Ali Dasdan, Synopsys, Inc.
32
33 *****************************************************************************/
34
35/*****************************************************************************
36
37 MODIFICATION LOG - modifiers, enter your name, affiliation, date and
38 changes you are making here.
39
40 Name, Affiliation, Date:
41 Description of Modification:
42
43 *****************************************************************************/
44
45
46// $Log: sc_unsigned.cpp,v $
47// Revision 1.7 2011/02/18 20:19:15 acg
48// Andy Goodrich: updating Copyright notice.
49//
50// Revision 1.6 2008/12/10 20:38:45 acg
51// Andy Goodrich: fixed conversion of double values to the digits vector.
52// The bits above the radix were not being masked off.
53//
54// Revision 1.5 2008/06/19 17:47:57 acg
55// Andy Goodrich: fixes for bugs. See 2.2.1 RELEASENOTES.
56//
57// Revision 1.4 2008/06/19 16:57:57 acg
58// Andy Goodrich: added case for negative unsigned values to the support in
59// concate_get_data().
60//
61// Revision 1.3 2007/11/04 21:27:00 acg
62// Andy Goodrich: changes to make sure the proper value is returned from
63// concat_get_data().
64//
65// Revision 1.2 2007/02/22 21:35:05 acg
66// Andy Goodrich: cleaned up comments in concat_get_ctrl and concat_get_data.
67//
68// Revision 1.1.1.1 2006/12/15 20:20:05 acg
69// SystemC 2.3
70//
71// Revision 1.4 2006/08/29 23:36:54 acg
72// Andy Goodrich: fixed and_reduce and optimized or_reduce.
73//
74// Revision 1.3 2006/01/13 18:49:32 acg
75// Added $Log command so that CVS check in comments are reproduced in the
76// source.
77//
78
79#include <cctype>
80#include <cmath>
81#include <sstream>
82
83#include "systemc/ext/dt/bit/sc_bv_base.hh"
84#include "systemc/ext/dt/bit/sc_lv_base.hh"
85#include "systemc/ext/dt/fx/sc_ufix.hh"
86#include "systemc/ext/dt/fx/scfx_other_defs.hh"
87#include "systemc/ext/dt/int/sc_int_base.hh"
88#include "systemc/ext/dt/int/sc_signed.hh"
89#include "systemc/ext/dt/int/sc_uint_base.hh"
90#include "systemc/ext/dt/int/sc_unsigned.hh"
91#include "systemc/ext/dt/misc/sc_concatref.hh"
92
93// explicit template instantiations
94namespace sc_core
95{
96
97template class sc_vpool<sc_dt::sc_unsigned_bitref>;
98template class sc_vpool<sc_dt::sc_unsigned_subref>;
99template class sc_vpool<sc_dt::sc_unsigned>;
100
101} // namespace sc_core
102
103namespace sc_dt
104{
105
106// Pool of temporary instances:
107// The sc_unsigned pool is used by the concatenation support.
108// The bit and part reference pools allow references to be returned.
109
110sc_core::sc_vpool<sc_unsigned> sc_unsigned::m_pool(8);
111sc_core::sc_vpool<sc_unsigned_bitref> sc_unsigned_bitref::m_pool(9);
112sc_core::sc_vpool<sc_unsigned_subref> sc_unsigned_subref::m_pool(9);
113
114
115void
116sc_unsigned::invalid_init(const char *type_name, int nb) const
117{
118 std::stringstream msg;
119 msg << "sc_unsigned("<< type_name << ") : nb = " << nb << " is not valid";
120 SC_REPORT_ERROR("initialization failed", msg.str().c_str());
121}
122
123
124// ----------------------------------------------------------------------------
125// SECTION: Public members - Invalid selections.
126// ----------------------------------------------------------------------------
127
128void
129sc_unsigned::invalid_index(int i) const
130{
131 std::stringstream msg;
132 msg << "sc_biguint bit selection: index = " << i << " violates "
133 "0 <= index <= " << (nbits-2);
134 SC_REPORT_ERROR("(E5) out of bounds", msg.str().c_str());
135 sc_core::sc_abort(); // can't recover from here
136}
137
138void
139sc_unsigned::invalid_range(int l, int r) const
140{
141 std::stringstream msg;
142 msg << "sc_biguint part selection: left = " <<
143 l << ", right = " << r << " \n"
144 " violates either (" << (nbits - 2) << " >= left >= 0) or "
145 "(" << (nbits-2) << " >= right >= 0)";
146 SC_REPORT_ERROR("(E5) out of bounds", msg.str().c_str());
147 sc_core::sc_abort(); // can't recover from here
148}
149
150// ----------------------------------------------------------------------------
151// SECTION: Public members - Concatenation support.
152// ----------------------------------------------------------------------------
153
154// Most public members are included from sc_nbcommon.inc. However, some
155// concatenation support appears here to optimize between the signed and
156// unsigned cases.
157
158
159
160// Insert this object's value at the specified place in a vector of big style
161// values.
162
163bool
164sc_unsigned::concat_get_ctrl(sc_digit *dst_p, int low_i) const
165{
166 int dst_i; // Index to next word to set in dst_p.
167 int end_i; // Index of high order word to set.
168 int left_shift; // Amount to shift value left.
169 sc_digit mask; // Mask for partial word sets.
170
171
172 // CALCULATE METRICS FOR DATA MOVEMENT:
173 dst_i = low_i / BITS_PER_DIGIT;
174 end_i = (low_i + nbits - 2) / BITS_PER_DIGIT;
175 left_shift = low_i % BITS_PER_DIGIT;
176
177 // MOVE FIRST WORD (IT MAY BE PARTIAL) AND THEN ANY OTHERS:
178 //
179 // We may "clobber" upper bits, but they will be written at some point
180 // anyway.
181
182 mask = ~(~0U << left_shift);
183 dst_p[dst_i] = (dst_p[dst_i] & ~mask);
184 dst_i++;
185
186 for (; dst_i <= end_i; dst_i++)
187 dst_p[dst_i] = 0;
188
189 return false;
190}
191
192bool
193sc_unsigned::concat_get_data(sc_digit *dst_p, int low_i) const
194{
195 sc_digit carry; // Carry for negating value.
196 int dst_i; // Index to next word to set in dst_p.
197 int end_i; // Index of high order word to set.
198 int high_i; // Index w/in word of high order bit.
199 int left_shift; // Amount to shift value left.
200 sc_digit left_word; // High word component for set.
201 sc_digit mask; // Mask for partial word sets.
202 bool result; // True if inserting non-zero data.
203 int right_shift; // Amount to shift value right.
204 sc_digit right_word; // Low word component for set.
205 int real_bits; // nbits - 1.
206 int src_i; // Index to next word to get from digit.
207
208 // CALCULATE METRICS FOR DATA MOVEMENT:
209 real_bits = nbits - 1; // Remove that extra sign bit.
210 dst_i = low_i / BITS_PER_DIGIT;
211 high_i = low_i + real_bits - 1;
212 end_i = high_i / BITS_PER_DIGIT;
213 left_shift = low_i % BITS_PER_DIGIT;
214
215 switch (sgn) {
216 // POSITIVE SOURCE VALUE:
217 case SC_POS:
218 result = true;
219
220 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
221 if (dst_i == end_i) {
222 mask = ~(~0U << left_shift);
223 dst_p[dst_i] = ((dst_p[dst_i] & mask) |
224 (digit[0] << left_shift)) & DIGIT_MASK;
225
226 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
227 } else if (left_shift == 0) {
228 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
229 dst_p[dst_i] = digit[src_i];
230 }
231 high_i = high_i % BITS_PER_DIGIT;
232 mask = ~(~1U << high_i) & DIGIT_MASK;
233 dst_p[dst_i] = digit[src_i] & mask;
234
235 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
236 } else {
237 high_i = high_i % BITS_PER_DIGIT;
238 right_shift = BITS_PER_DIGIT - left_shift;
239 mask = ~(~0U << left_shift);
240 right_word = digit[0];
241 dst_p[dst_i] = (dst_p[dst_i] & mask) |
242 ((right_word << left_shift) & DIGIT_MASK);
243 for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
244 left_word = digit[src_i];
245 dst_p[dst_i] = ((left_word << left_shift) & DIGIT_MASK) |
246 (right_word >> right_shift);
247 right_word = left_word;
248 }
249 left_word = (src_i < ndigits) ? digit[src_i] : 0;
250 mask = ~(~1U << high_i) & DIGIT_MASK;
251 dst_p[dst_i] = ((left_word << left_shift) |
252 (right_word >> right_shift)) & mask;
253 }
254 break;
255
256 // SOURCE VALUE IS NEGATIVE:
257 case SC_NEG:
258 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
259 result = true;
260 if (dst_i == end_i) {
261 mask = ~(~0U << nbits);
262 right_word = ((digit[0] ^ DIGIT_MASK) + 1) & mask;
263 mask = ~(~0U << left_shift);
264 dst_p[dst_i] = ((dst_p[dst_i] & mask) |
265 (right_word << left_shift)) & DIGIT_MASK;
266
267 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
268
269 } else if (left_shift == 0) {
270 carry = 1;
271 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
272 right_word = (digit[src_i] ^ DIGIT_MASK) + carry;
273 dst_p[dst_i] = right_word & DIGIT_MASK;
274 carry = right_word >> BITS_PER_DIGIT;
275 }
276 high_i = high_i % BITS_PER_DIGIT;
277 mask = (~(~1U << high_i)) & DIGIT_MASK;
278 right_word = (src_i < ndigits) ?
279 (digit[src_i] ^ DIGIT_MASK) + carry : DIGIT_MASK + carry;
280 dst_p[dst_i] = right_word & mask;
281
282 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
283 } else {
284 high_i = high_i % BITS_PER_DIGIT;
285 right_shift = BITS_PER_DIGIT - left_shift;
286 mask = ~(~0U << left_shift);
287 carry = 1;
288 right_word = (digit[0] ^ DIGIT_MASK) + carry;
289 dst_p[dst_i] = (dst_p[dst_i] & mask) |
290 ((right_word << left_shift) & DIGIT_MASK);
291 carry = right_word >> BITS_PER_DIGIT;
292 right_word &= DIGIT_MASK;
293 for (src_i = 1, dst_i++; dst_i < end_i; dst_i++, src_i++) {
294 left_word = (digit[src_i] ^ DIGIT_MASK) + carry;
295 dst_p[dst_i] = ((left_word << left_shift)&DIGIT_MASK) |
296 (right_word >> right_shift);
297 carry = left_word >> BITS_PER_DIGIT;
298 right_word = left_word & DIGIT_MASK;
299 }
300 left_word = (src_i < ndigits) ?
301 (digit[src_i] ^ DIGIT_MASK) + carry : carry;
302 mask = ~(~1U << high_i) & DIGIT_MASK;
303 dst_p[dst_i] = ((left_word << left_shift) |
304 (right_word >> right_shift)) & mask;
305 }
306 break;
307 // VALUE IS ZERO:
308 default:
309 result = false;
310 // ALL DATA TO BE MOVED IS IN A SINGLE WORD:
311 if (dst_i == end_i) {
312 mask = ~(~0U << real_bits) << left_shift;
313 dst_p[dst_i] = dst_p[dst_i] & ~mask;
314
315 // DATA IS IN MORE THAN ONE WORD, BUT IS WORD ALIGNED:
316
317 } else if (left_shift == 0) {
318 for (src_i = 0; dst_i < end_i; dst_i++, src_i++) {
319 dst_p[dst_i] = 0;
320 }
321 dst_p[dst_i] = 0;
322
323 // DATA IS IN MORE THAN ONE WORD, AND NOT WORD ALIGNED:
324 } else {
325 mask = ~(~0U << left_shift);
326 dst_p[dst_i] = (dst_p[dst_i] & mask);
327 for (dst_i++; dst_i <= end_i; dst_i++) {
328 dst_p[dst_i] = 0;
329 }
330 }
331 break;
332 }
333 return result;
334}
335
336// Return this object instance's bits as a uint64 without sign extension.
337uint64
338sc_unsigned::concat_get_uint64() const
339{
340 uint64 result;
341
342 switch (sgn) {
343 case SC_POS:
344 result = 0;
345 if (ndigits > 2)
346 result = digit[2];
347 if (ndigits > 1)
348 result = (result << BITS_PER_DIGIT) | digit[1];
349 result = (result << BITS_PER_DIGIT) | digit[0];
350 break;
351 default:
352 result = 0;
353 break;
354 }
355 return result;
356}
357
358// #### OPTIMIZE
359void
360sc_unsigned::concat_set(int64 src, int low_i)
361{
362 *this = (low_i < 64) ? src >> low_i : src >> 63;
363}
364
365void
366sc_unsigned::concat_set(const sc_signed &src, int low_i)
367{
368 if (low_i < src.length())
369 *this = src >> low_i;
370 else
371 *this = (src < 0) ? (int_type)-1 : 0;
372}
373
374void
375sc_unsigned::concat_set(const sc_unsigned &src, int low_i)
376{
377 if (low_i < src.length())
378 *this = src >> low_i;
379 else
380 *this = 0;
381}
382
383void
384sc_unsigned::concat_set(uint64 src, int low_i)
385{
386 *this = (low_i < 64) ? src >> low_i : 0;
387}
388
389
390// ----------------------------------------------------------------------------
391// SECTION: Public members - Reduction methods.
392// ----------------------------------------------------------------------------
393
394bool
395sc_unsigned::and_reduce() const
396{
397 int i; // Digit examining.
398
399 if (sgn == SC_ZERO)
400 return false;
401 for (i = 0; i < ndigits - 1; i++)
402 if ((digit[i] & DIGIT_MASK) != DIGIT_MASK)
403 return false;
404 if ((digit[i] & ~(~0U << ((nbits - 1) % BITS_PER_DIGIT))) ==
405 static_cast<sc_digit>(~(~0U << ((nbits - 1) % BITS_PER_DIGIT)))) {
406 return true;
407 }
408 return false;
409}
410
411bool
412sc_unsigned::or_reduce() const
413{
414 return (sgn == SC_ZERO) ? false : true;
415}
416
417bool
418sc_unsigned::xor_reduce() const
419{
420 int i; // Digit examining.
421 int odd; // Flag for odd number of digits.
422
423 odd = 0;
424 for (i = 0; i < nbits - 1; i++)
425 if (test(i))
426 odd = ~odd;
427 return odd ? true : false;
428}
429
430
431// ----------------------------------------------------------------------------
432// SECTION: Public members - Assignment operators.
433// ----------------------------------------------------------------------------
434
435// assignment operators
436const sc_unsigned &
437sc_unsigned::operator = (const char *a)
438{
439 if (a == 0) {
440 SC_REPORT_ERROR("conversion failed",
441 "character string is zero");
442 } else if (*a == 0) {
443 SC_REPORT_ERROR("conversion failed",
444 "character string is empty");
445 } else try {
446 int len = length();
447 sc_ufix aa(a, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
448 return this->operator = (aa);
449 } catch(const sc_core::sc_report &) {
450 std::stringstream msg;
451 msg << "character string '" << a << "' is not valid";
452 SC_REPORT_ERROR("conversion failed", msg.str().c_str());
453 }
454 return *this;
455}
456
457const sc_unsigned &
458sc_unsigned::operator = (int64 v)
459{
460 sgn = get_sign(v);
461 if (sgn == SC_ZERO) {
462 vec_zero(ndigits, digit);
463 } else {
464 from_uint(ndigits, digit, (uint64) v);
465 convert_SM_to_2C_to_SM();
466 }
467 return *this;
468}
469
470const sc_unsigned &
471sc_unsigned::operator = (uint64 v)
472{
473 if (v == 0) {
474 sgn = SC_ZERO;
475 vec_zero(ndigits, digit);
476 } else {
477 sgn = SC_POS;
478 from_uint(ndigits, digit, v);
479 convert_SM_to_2C_to_SM();
480 }
481 return *this;
482}
483
484const sc_unsigned &
485sc_unsigned::operator = (long v)
486{
487 sgn = get_sign(v);
488 if (sgn == SC_ZERO) {
489 vec_zero(ndigits, digit);
490 } else {
491 from_uint(ndigits, digit, (unsigned long)v);
492 convert_SM_to_2C_to_SM();
493 }
494 return *this;
495}
496
497const sc_unsigned &
498sc_unsigned::operator = (unsigned long v)
499{
500 if (v == 0) {
501 sgn = SC_ZERO;
502 vec_zero(ndigits, digit);
503 } else {
504 sgn = SC_POS;
505 from_uint(ndigits, digit, v);
506 convert_SM_to_2C_to_SM();
507 }
508 return *this;
509}
510
511const sc_unsigned &
512sc_unsigned::operator = (double v)
513{
514 is_bad_double(v);
515 sgn = SC_POS;
516 int i = 0;
517 while (std::floor(v) && (i < ndigits)) {
518 digit[i++] = ((sc_digit)std::floor(remainder(v, DIGIT_RADIX))) &
519 DIGIT_MASK;
520 v /= DIGIT_RADIX;
521 }
522 vec_zero(i, ndigits, digit);
523 convert_SM_to_2C_to_SM();
524 return *this;
525}
526
527
528// ----------------------------------------------------------------------------
529
530const sc_unsigned &
531sc_unsigned::operator = (const sc_bv_base &v)
532{
533 int minlen = sc_min(nbits, v.length());
534 int i = 0;
535 for (; i < minlen; ++i) {
536 safe_set(i, v.get_bit(i), digit);
537 }
538 for (; i < nbits; ++i) {
539 safe_set(i, 0, digit); // zero-extend
540 }
541 convert_2C_to_SM();
542 return *this;
543}
544
545const sc_unsigned &
546sc_unsigned::operator = (const sc_lv_base &v)
547{
548 int minlen = sc_min(nbits, v.length());
549 int i = 0;
550 for (; i < minlen; ++i) {
551 safe_set(i, sc_logic(v.get_bit(i)).to_bool(), digit);
552 }
553 for (; i < nbits; ++i) {
554 safe_set(i, 0, digit); // zero-extend
555 }
556 convert_2C_to_SM();
557 return *this;
558}
559
560
561// explicit conversion to character string
562const std::string
563sc_unsigned::to_string(sc_numrep numrep) const
564{
565 int len = length();
566 sc_ufix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
567 return aa.to_string(numrep);
568}
569
570const std::string
571sc_unsigned::to_string(sc_numrep numrep, bool w_prefix) const
572{
573 int len = length();
574 sc_ufix aa(*this, len, len, SC_TRN, SC_WRAP, 0, SC_ON);
575 return aa.to_string(numrep, w_prefix);
576}
577
578
579// ----------------------------------------------------------------------------
580// SECTION: Interfacing with sc_int_base
581// ----------------------------------------------------------------------------
582
583const sc_unsigned &
584sc_unsigned::operator = (const sc_int_base &v)
585{
586 return operator = ((int64)v);
587}
588
589const sc_unsigned &
590sc_unsigned::operator += (const sc_int_base &v)
591{
592 return operator += ((int64)v);
593}
594
595const sc_unsigned &
596sc_unsigned::operator -= (const sc_int_base &v)
597{
598 return operator -= ((int64)v);
599}
600
601const sc_unsigned &
602sc_unsigned::operator *= (const sc_int_base &v)
603{
604 return operator *= ((int64)v);
605}
606
607const sc_unsigned &
608sc_unsigned::operator /= (const sc_int_base &v)
609{
610 return operator /= ((int64)v);
611}
612
613const sc_unsigned &
614sc_unsigned::operator %= (const sc_int_base &v)
615{
616 return operator %= ((int64)v);
617}
618
619const sc_unsigned &
620sc_unsigned::operator &= (const sc_int_base &v)
621{
622 return operator &= ((int64)v);
623}
624
625const sc_unsigned &
626sc_unsigned::operator |= (const sc_int_base &v)
627{
628 return operator |= ((int64)v);
629}
630
631const sc_unsigned &
632sc_unsigned::operator ^= (const sc_int_base &v)
633{
634 return operator ^= ((int64)v);
635}
636
637sc_unsigned
638operator << (const sc_unsigned &u, const sc_int_base &v)
639{
640 return operator << (u, (int64)v);
641}
642const sc_unsigned &
643sc_unsigned::operator <<= (const sc_int_base &v)
644{
645 return operator <<= ((int64)v);
646}
647
648sc_unsigned
649operator >> (const sc_unsigned& u, const sc_int_base& v)
650{
651 return operator >> (u, (int64)v);
652}
653const sc_unsigned &
654sc_unsigned::operator >>= (const sc_int_base& v)
655{
656 return operator >>= ((int64)v);
657}
658
659bool
660operator == (const sc_unsigned &u, const sc_int_base &v)
661{
662 return operator == (u, (int64)v);
663}
664bool
665operator == (const sc_int_base &u, const sc_unsigned &v)
666{
667 return operator == ((int64)u, v);
668}
669
670bool
671operator != (const sc_unsigned &u, const sc_int_base &v)
672{
673 return operator != (u, (int64)v);
674}
675bool
676operator != (const sc_int_base &u, const sc_unsigned &v)
677{
678 return operator != ((int64)u, v);
679}
680
681bool
682operator < (const sc_unsigned &u, const sc_int_base &v)
683{
684 return operator < (u, (int64)v);
685}
686bool
687operator < (const sc_int_base &u, const sc_unsigned &v)
688{
689 return operator < ((int64)u, v);
690}
691
692bool
693operator <= (const sc_unsigned &u, const sc_int_base &v)
694{
695 return operator <= (u, (int64)v);
696}
697bool
698operator <= (const sc_int_base &u, const sc_unsigned &v)
699{
700 return operator <= ((int64)u, v);
701}
702
703bool
704operator > (const sc_unsigned &u, const sc_int_base &v)
705{
706 return operator > (u, (int64)v);
707}
708bool
709operator > (const sc_int_base &u, const sc_unsigned &v)
710{
711 return operator > ((int64)u, v);
712}
713
714bool
715operator >= (const sc_unsigned &u, const sc_int_base &v)
716{
717 return operator >= (u, (int64)v);
718}
719bool
720operator >= (const sc_int_base &u, const sc_unsigned &v)
721{
722 return operator >= ((int64)u, v);
723}
724
725
726// ----------------------------------------------------------------------------
727// SECTION: Interfacing with sc_uint_base
728// ----------------------------------------------------------------------------
729
730const sc_unsigned &
731sc_unsigned::operator = (const sc_uint_base &v)
732{
733 return operator = ((uint64)v);
734}
735
736sc_unsigned
737operator + (const sc_unsigned &u, const sc_uint_base &v)
738{
739 return operator + (u, (uint64)v);
740}
741sc_unsigned
742operator + (const sc_uint_base &u, const sc_unsigned &v)
743{
744 return operator + ((uint64)u, v);
745}
746const sc_unsigned &
747sc_unsigned::operator += (const sc_uint_base &v)
748{
749 return operator += ((uint64)v);
750}
751
752const sc_unsigned &
753sc_unsigned::operator -= (const sc_uint_base &v)
754{
755 return operator -= ((uint64)v);
756}
757
758sc_unsigned
759operator * (const sc_unsigned &u, const sc_uint_base &v)
760{
761 return operator * (u, (uint64)v);
762}
763sc_unsigned
764operator * (const sc_uint_base &u, const sc_unsigned &v)
765{
766 return operator * ((uint64)u, v);
767}
768const sc_unsigned &
769sc_unsigned::operator *= (const sc_uint_base &v)
770{
771 return operator *= ((uint64)v);
772}
773
774sc_unsigned
775operator / (const sc_unsigned &u, const sc_uint_base &v)
776{
777 return operator / (u, (uint64)v);
778}
779sc_unsigned
780operator / (const sc_uint_base &u, const sc_unsigned &v)
781{
782 return operator / ((uint64)u, v);
783}
784const sc_unsigned &
785sc_unsigned::operator /= (const sc_uint_base &v)
786{
787 return operator /= ((uint64)v);
788}
789
790sc_unsigned
791operator % (const sc_unsigned &u, const sc_uint_base &v)
792{
793 return operator % (u, (uint64)v);
794}
795sc_unsigned
796operator % (const sc_uint_base &u, const sc_unsigned &v)
797{
798 return operator % ((uint64)u, v);
799}
800const sc_unsigned &
801sc_unsigned::operator %= (const sc_uint_base &v)
802{
803 return operator %= ((uint64)v);
804}
805
806sc_unsigned
807operator & (const sc_unsigned &u, const sc_uint_base &v)
808{
809 return operator & (u, (uint64)v);
810}
811sc_unsigned
812operator & (const sc_uint_base &u, const sc_unsigned &v)
813{
814 return operator & ((uint64)u, v);
815}
816const sc_unsigned &
817sc_unsigned::operator &= (const sc_uint_base &v)
818{
819 return operator &= ((uint64)v);
820}
821
822sc_unsigned
823operator | (const sc_unsigned &u, const sc_uint_base &v)
824{
825 return operator | (u, (uint64)v);
826}
827sc_unsigned
828operator | (const sc_uint_base &u, const sc_unsigned &v)
829{
830 return operator | ((uint64)u, v);
831}
832const sc_unsigned &
833sc_unsigned::operator |= (const sc_uint_base &v)
834{
835 return operator |= ((uint64)v);
836}
837
838sc_unsigned
839operator ^ (const sc_unsigned &u, const sc_uint_base &v)
840{
841 return operator ^ (u, (uint64)v);
842}
843sc_unsigned
844operator ^ (const sc_uint_base &u, const sc_unsigned &v)
845{
846 return operator ^ ((uint64)u, v);
847}
848const sc_unsigned &
849sc_unsigned::operator ^= (const sc_uint_base &v)
850{
851 return operator ^= ((uint64)v);
852}
853
854sc_unsigned
855operator << (const sc_unsigned &u, const sc_uint_base &v)
856{
857 return operator << (u, (uint64)v);
858}
859const sc_unsigned &
860sc_unsigned::operator <<= (const sc_uint_base &v)
861{
862 return operator <<= ((uint64)v);
863}
864
865sc_unsigned
866operator >> (const sc_unsigned &u, const sc_uint_base &v)
867{
868 return operator >> (u, (uint64)v);
869}
870const sc_unsigned &
871sc_unsigned::operator >>= (const sc_uint_base &v)
872{
873 return operator >>= ((uint64)v);
874}
875
876bool
877operator == (const sc_unsigned &u, const sc_uint_base &v)
878{
879 return operator == (u, (uint64)v);
880}
881bool
882operator == (const sc_uint_base &u, const sc_unsigned &v)
883{
884 return operator == ((uint64)u, v);
885}
886
887bool
888operator != (const sc_unsigned &u, const sc_uint_base &v)
889{
890 return operator != (u, (uint64)v);
891}
892bool
893operator != (const sc_uint_base &u, const sc_unsigned &v)
894{
895 return operator != ((uint64)u, v);
896}
897
898bool
899operator < (const sc_unsigned &u, const sc_uint_base &v)
900{
901 return operator < (u, (uint64)v);
902}
903bool
904operator < (const sc_uint_base &u, const sc_unsigned &v)
905{
906 return operator < ((uint64)u, v);
907}
908
909bool
910operator <= (const sc_unsigned &u, const sc_uint_base &v)
911{
912 return operator <= (u, (uint64)v);
913}
914bool
915operator <= (const sc_uint_base &u, const sc_unsigned &v)
916{
917 return operator <= ((uint64)u, v);
918}
919
920bool
921operator > (const sc_unsigned &u, const sc_uint_base &v)
922{
923 return operator > (u, (uint64)v);
924}
925bool
926operator > (const sc_uint_base &u, const sc_unsigned &v)
927{
928 return operator > ((uint64)u, v);
929}
930
931bool
932operator >= (const sc_unsigned &u, const sc_uint_base &v)
933{
934 return operator >= (u, (uint64)v);
935}
936bool
937operator >= (const sc_uint_base &u, const sc_unsigned &v)
938{
939 return operator >= ((uint64)u, v);
940}
941
942
943// ----------------------------------------------------------------------------
944// SECTION: Input and output operators
945// ----------------------------------------------------------------------------
946
947// The operators in this section are included from sc_nbcommon.cpp.
948
949
950// ----------------------------------------------------------------------------
951// SECTION: Operator macros.
952// ----------------------------------------------------------------------------
953
954#define CONVERT_LONG(u) \
955small_type u ## s = get_sign(u); \
956sc_digit u ## d[DIGITS_PER_ULONG]; \
957from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
958
959#define CONVERT_LONG_2(u) \
960sc_digit u ## d[DIGITS_PER_ULONG]; \
961from_uint(DIGITS_PER_ULONG, u ## d, (unsigned long) u);
962
963#define CONVERT_INT(u) \
964small_type u ## s = get_sign(u); \
965sc_digit u ## d[DIGITS_PER_UINT]; \
966from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
967
968#define CONVERT_INT_2(u) \
969sc_digit u ## d[DIGITS_PER_UINT]; \
970from_uint(DIGITS_PER_UINT, u ## d, (unsigned int) u);
971
972#define CONVERT_INT64(u) \
973small_type u ## s = get_sign(u); \
974sc_digit u ## d[DIGITS_PER_UINT64]; \
975from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
976
977#define CONVERT_INT64_2(u) \
978sc_digit u ## d[DIGITS_PER_UINT64]; \
979from_uint(DIGITS_PER_UINT64, u ## d, (uint64) u);
980
981
982// ----------------------------------------------------------------------------
983// SECTION: PLUS operators: +, +=, ++
984// ----------------------------------------------------------------------------
985
986// Cases to consider when computing u + v:
987// 1. 0 + v = v
988// 2. u + 0 = u
989// 3. if sgn(u) == sgn(v)
990// 3.1 u + v = +(u + v) = sgn(u) * (u + v)
991// 3.2 (-u) + (-v) = -(u + v) = sgn(u) * (u + v)
992// 4. if sgn(u) != sgn(v)
993// 4.1 u + (-v) = u - v = sgn(u) * (u - v)
994// 4.2 (-u) + v = -(u - v) ==> sgn(u) * (u - v)
995//
996// Specialization of above cases for computing ++u or u++:
997// 1. 0 + 1 = 1
998// 3. u + 1 = u + 1 = sgn(u) * (u + 1)
999// 4. (-u) + 1 = -(u - 1) = sgn(u) * (u - 1)
1000
1001sc_unsigned
1002operator + (const sc_unsigned &u, const sc_unsigned &v)
1003{
1004 if (u.sgn == SC_ZERO) // case 1
1005 return sc_unsigned(v);
1006
1007 if (v.sgn == SC_ZERO) // case 2
1008 return sc_unsigned(u);
1009
1010 // cases 3 and 4
1011 return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1012 v.sgn, v.nbits, v.ndigits, v.digit);
1013}
1014
1015
1016sc_unsigned
1017operator + (const sc_unsigned &u, uint64 v)
1018{
1019 if (v == 0) // case 2
1020 return sc_unsigned(u);
1021
1022 CONVERT_INT64(v);
1023
1024 if (u.sgn == SC_ZERO) // case 1
1025 return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1026
1027 // cases 3 and 4
1028 return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1029 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1030}
1031
1032
1033sc_unsigned
1034operator + (uint64 u, const sc_unsigned &v)
1035{
1036 if (u == 0) // case 1
1037 return sc_unsigned(v);
1038
1039 CONVERT_INT64(u);
1040
1041 if (v.sgn == SC_ZERO) // case 2
1042 return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1043
1044 // cases 3 and 4
1045 return add_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1046 v.sgn, v.nbits, v.ndigits, v.digit);
1047}
1048
1049
1050sc_unsigned
1051operator + (const sc_unsigned &u, unsigned long v)
1052{
1053 if (v == 0) // case 2
1054 return sc_unsigned(u);
1055
1056 CONVERT_LONG(v);
1057
1058 if (u.sgn == SC_ZERO) // case 1
1059 return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1060
1061 // cases 3 and 4
1062 return add_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1063 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1064}
1065
1066
1067sc_unsigned
1068operator + (unsigned long u, const sc_unsigned &v)
1069{
1070 if (u == 0) // case 1
1071 return sc_unsigned(v);
1072
1073 CONVERT_LONG(u);
1074
1075 if (v.sgn == SC_ZERO) // case 2
1076 return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1077
1078 // cases 3 and 4
1079 return add_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1080 v.sgn, v.nbits, v.ndigits, v.digit);
1081}
1082
1083// The rest of the operators in this section are included from
1084// sc_nbcommon.cpp.
1085
1086
1087// ----------------------------------------------------------------------------
1088// SECTION: MINUS operators: -, -=, --
1089// ----------------------------------------------------------------------------
1090
1091// Cases to consider when computing u + v:
1092// 1. u - 0 = u
1093// 2. 0 - v = -v
1094// 3. if sgn(u) != sgn(v)
1095// 3.1 u - (-v) = u + v = sgn(u) * (u + v)
1096// 3.2 (-u) - v = -(u + v) ==> sgn(u) * (u + v)
1097// 4. if sgn(u) == sgn(v)
1098// 4.1 u - v = +(u - v) = sgn(u) * (u - v)
1099// 4.2 (-u) - (-v) = -(u - v) = sgn(u) * (u - v)
1100//
1101// Specialization of above cases for computing --u or u--:
1102// 1. 0 - 1 = -1
1103// 3. (-u) - 1 = -(u + 1) = sgn(u) * (u + 1)
1104// 4. u - 1 = u - 1 = sgn(u) * (u - 1)
1105
1106// The operators in this section are included from sc_nbcommon.cpp.
1107
1108
1109// ----------------------------------------------------------------------------
1110// SECTION: MULTIPLICATION operators: *, *=
1111// ----------------------------------------------------------------------------
1112
1113// Cases to consider when computing u * v:
1114// 1. u * 0 = 0 * v = 0
1115// 2. 1 * v = v and -1 * v = -v
1116// 3. u * 1 = u and u * -1 = -u
1117// 4. u * v = u * v
1118
1119sc_unsigned
1120operator * (const sc_unsigned &u, const sc_unsigned &v)
1121{
1122 small_type s = mul_signs(u.sgn, v.sgn);
1123
1124 if (s == SC_ZERO) // case 1
1125 return sc_unsigned();
1126
1127 // cases 2-4
1128 return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
1129 v.nbits, v.ndigits, v.digit);
1130}
1131
1132
1133sc_unsigned
1134operator * (const sc_unsigned &u, uint64 v)
1135{
1136 small_type s = mul_signs(u.sgn, get_sign(v));
1137
1138 if (s == SC_ZERO) // case 1
1139 return sc_unsigned();
1140
1141 CONVERT_INT64_2(v);
1142
1143 // cases 2-4
1144 return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
1145 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1146}
1147
1148
1149sc_unsigned
1150operator * (uint64 u, const sc_unsigned &v)
1151{
1152 small_type s = mul_signs(v.sgn, get_sign(u));
1153
1154 if (s == SC_ZERO) // case 1
1155 return sc_unsigned();
1156
1157 CONVERT_INT64_2(u);
1158
1159 // cases 2-4
1160 return mul_unsigned_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1161 v.nbits, v.ndigits, v.digit);
1162}
1163
1164
1165sc_unsigned
1166operator * (const sc_unsigned &u, unsigned long v)
1167{
1168 small_type s = mul_signs(u.sgn, get_sign(v));
1169
1170 if (s == SC_ZERO) // case 1
1171 return sc_unsigned();
1172
1173 CONVERT_LONG_2(v);
1174
1175 // else cases 2-4
1176 return mul_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
1177 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1178}
1179
1180sc_unsigned
1181operator * (unsigned long u, const sc_unsigned &v)
1182{
1183 small_type s = mul_signs(v.sgn, get_sign(u));
1184
1185 if (s == SC_ZERO) // case 1
1186 return sc_unsigned();
1187
1188 CONVERT_LONG_2(u);
1189
1190 // cases 2-4
1191 return mul_unsigned_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1192 v.nbits, v.ndigits, v.digit);
1193}
1194
1195// The rest of the operators in this section are included from
1196// sc_nbcommon.cpp.
1197
1198
1199// ----------------------------------------------------------------------------
1200// SECTION: DIVISION operators: /, /=
1201// ----------------------------------------------------------------------------
1202
1203// Cases to consider when finding the quotient q = floor(u/v):
1204// Note that u = q * v + r for r < q.
1205// 1. 0 / 0 or u / 0 => error
1206// 2. 0 / v => 0 = 0 * v + 0
1207// 3. u / v & &u = v => u = 1 * u + 0 - u or v can be 1 or -1
1208// 4. u / v & &u < v => u = 0 * v + u - u can be 1 or -1
1209// 5. u / v & &u > v => u = q * v + r - v can be 1 or -1
1210
1211sc_unsigned
1212operator / (const sc_unsigned &u, const sc_unsigned &v)
1213{
1214 small_type s = mul_signs(u.sgn, v.sgn);
1215
1216 if (s == SC_ZERO) {
1217 div_by_zero(v.sgn); // case 1
1218 return sc_unsigned(); // case 2
1219 }
1220
1221 // other cases
1222 return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
1223 v.nbits, v.ndigits, v.digit);
1224}
1225
1226
1227sc_unsigned
1228operator / (const sc_unsigned &u, uint64 v)
1229{
1230 small_type s = mul_signs(u.sgn, get_sign(v));
1231
1232 if (s == SC_ZERO) {
1233 div_by_zero(v); // case 1
1234 return sc_unsigned(); // case 2
1235 }
1236
1237 CONVERT_INT64_2(v);
1238
1239 // other cases
1240 return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
1241 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1242}
1243
1244
1245sc_unsigned
1246operator / (uint64 u, const sc_unsigned &v)
1247{
1248 small_type s = mul_signs(v.sgn, get_sign(u));
1249
1250 if (s == SC_ZERO) {
1251 div_by_zero(v.sgn); // case 1
1252 return sc_unsigned(); // case 2
1253
1254 }
1255
1256 CONVERT_INT64_2(u);
1257
1258 // other cases
1259 return div_unsigned_friend(s, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1260 v.nbits, v.ndigits, v.digit);
1261}
1262
1263
1264sc_unsigned
1265operator / (const sc_unsigned &u, unsigned long v)
1266{
1267 small_type s = mul_signs(u.sgn, get_sign(v));
1268
1269 if (s == SC_ZERO) {
1270 div_by_zero(v); // case 1
1271 return sc_unsigned(); // case 2
1272 }
1273
1274 CONVERT_LONG_2(v);
1275
1276 // other cases
1277 return div_unsigned_friend(s, u.nbits, u.ndigits, u.digit,
1278 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1279}
1280
1281
1282sc_unsigned
1283operator / (unsigned long u, const sc_unsigned &v)
1284{
1285 small_type s = mul_signs(v.sgn, get_sign(u));
1286
1287 if (s == SC_ZERO) {
1288 div_by_zero(v.sgn); // case 1
1289 return sc_unsigned(); // case 2
1290
1291 }
1292
1293 CONVERT_LONG_2(u);
1294
1295 // other cases
1296 return div_unsigned_friend(s, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1297 v.nbits, v.ndigits, v.digit);
1298}
1299
1300// The rest of the operators in this section are included from
1301// sc_nbcommon.cpp.
1302
1303
1304// ----------------------------------------------------------------------------
1305// SECTION: MOD operators: %, %=.
1306// ----------------------------------------------------------------------------
1307
1308// Cases to consider when finding the remainder r = u % v:
1309// Note that u = q * v + r for r < q.
1310// 1. 0 % 0 or u % 0 => error
1311// 2. 0 % v => 0 = 0 * v + 0
1312// 3. u % v & &u = v => u = 1 * u + 0 - u or v can be 1 or -1
1313// 4. u % v & &u < v => u = 0 * v + u - u can be 1 or -1
1314// 5. u % v & &u > v => u = q * v + r - v can be 1 or -1
1315
1316sc_unsigned
1317operator % (const sc_unsigned &u, const sc_unsigned &v)
1318{
1319 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) {
1320 div_by_zero(v.sgn); // case 1
1321 return sc_unsigned(); // case 2
1322 }
1323
1324 // other cases
1325 return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1326 v.nbits, v.ndigits, v.digit);
1327}
1328
1329
1330sc_unsigned
1331operator % (const sc_unsigned &u, uint64 v)
1332{
1333 if ((u.sgn == SC_ZERO) || (v == 0)) {
1334 div_by_zero(v); // case 1
1335 return sc_unsigned(); // case 2
1336 }
1337
1338 CONVERT_INT64_2(v);
1339
1340 // other cases
1341 return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1342 BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1343
1344}
1345
1346
1347sc_unsigned
1348operator % (uint64 u, const sc_unsigned &v)
1349{
1350 if ((u == 0) || (v.sgn == SC_ZERO)) {
1351 div_by_zero(v.sgn); // case 1
1352 return sc_unsigned(); // case 2
1353 }
1354
1355 CONVERT_INT64(u);
1356
1357 // other cases
1358 return mod_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1359 v.nbits, v.ndigits, v.digit);
1360}
1361
1362
1363sc_unsigned
1364operator % (const sc_unsigned &u, unsigned long v)
1365{
1366 if ((u.sgn == SC_ZERO) || (v == 0)) {
1367 div_by_zero(v); // case 1
1368 return sc_unsigned(); // case 2
1369 }
1370
1371 CONVERT_LONG_2(v);
1372
1373 // other cases
1374 return mod_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1375 BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1376}
1377
1378
1379sc_unsigned
1380operator % (unsigned long u, const sc_unsigned &v)
1381{
1382 if ((u == 0) || (v.sgn == SC_ZERO)) {
1383 div_by_zero(v.sgn); // case 1
1384 return sc_unsigned(); // case 2
1385 }
1386
1387 CONVERT_LONG(u);
1388
1389 // other cases
1390 return mod_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1391 v.nbits, v.ndigits, v.digit);
1392}
1393
1394// The rest of the operators in this section are included from
1395// sc_nbcommon.cpp.
1396
1397
1398// ----------------------------------------------------------------------------
1399// SECTION: Bitwise AND operators: &, &=
1400// ----------------------------------------------------------------------------
1401
1402// Cases to consider when computing u &v:
1403// 1. u & 0 = 0 &v = 0
1404// 2. u &v => sgn = +
1405// 3. (-u) & (-v) => sgn = -
1406// 4. u & (-v) => sgn = +
1407// 5. (-u) &v => sgn = +
1408
1409sc_unsigned
1410operator & (const sc_unsigned &u, const sc_unsigned &v)
1411{
1412 if ((u.sgn == SC_ZERO) || (v.sgn == SC_ZERO)) // case 1
1413 return sc_unsigned();
1414
1415 // other cases
1416 return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1417 v.sgn, v.nbits, v.ndigits, v.digit);
1418}
1419
1420
1421sc_unsigned
1422operator & (const sc_unsigned &u, uint64 v)
1423{
1424 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
1425 return sc_unsigned();
1426
1427 CONVERT_INT64(v);
1428
1429 // other cases
1430 return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1431 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1432}
1433
1434
1435sc_unsigned
1436operator & (uint64 u, const sc_unsigned &v)
1437{
1438 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
1439 return sc_unsigned();
1440
1441 CONVERT_INT64(u);
1442
1443 // other cases
1444 return and_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1445 v.sgn, v.nbits, v.ndigits, v.digit);
1446}
1447
1448
1449sc_unsigned
1450operator & (const sc_unsigned &u, unsigned long v)
1451{
1452 if ((u.sgn == SC_ZERO) || (v == 0)) // case 1
1453 return sc_unsigned();
1454
1455 CONVERT_LONG(v);
1456
1457 // other cases
1458 return and_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1459 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1460}
1461
1462
1463sc_unsigned
1464operator & (unsigned long u, const sc_unsigned &v)
1465{
1466 if ((u == 0) || (v.sgn == SC_ZERO)) // case 1
1467 return sc_unsigned();
1468
1469 CONVERT_LONG(u);
1470
1471 // other cases
1472 return and_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1473 v.sgn, v.nbits, v.ndigits, v.digit);
1474}
1475
1476// The rest of the operators in this section are included from
1477// sc_nbcommon.cpp.
1478
1479
1480// ----------------------------------------------------------------------------
1481// SECTION: Bitwise OR operators: |, |=
1482// ----------------------------------------------------------------------------
1483
1484// Cases to consider when computing u | v:
1485// 1. u | 0 = u
1486// 2. 0 | v = v
1487// 3. u | v => sgn = +
1488// 4. (-u) | (-v) => sgn = -
1489// 5. u | (-v) => sgn = -
1490// 6. (-u) | v => sgn = -
1491
1492sc_unsigned
1493operator | (const sc_unsigned &u, const sc_unsigned &v)
1494{
1495 if (v.sgn == SC_ZERO) // case 1
1496 return sc_unsigned(u);
1497
1498 if (u.sgn == SC_ZERO) // case 2
1499 return sc_unsigned(v);
1500
1501 // other cases
1502 return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1503 v.sgn, v.nbits, v.ndigits, v.digit);
1504}
1505
1506
1507sc_unsigned
1508operator | (const sc_unsigned &u, uint64 v)
1509{
1510 if (v == 0) // case 1
1511 return sc_unsigned(u);
1512
1513 CONVERT_INT64(v);
1514
1515 if (u.sgn == SC_ZERO) // case 2
1516 return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1517
1518 // other cases
1519 return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1520 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1521}
1522
1523
1524sc_unsigned
1525operator | (uint64 u, const sc_unsigned &v)
1526{
1527 if (u == 0)
1528 return sc_unsigned(v);
1529
1530 CONVERT_INT64(u);
1531
1532 if (v.sgn == SC_ZERO)
1533 return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1534
1535 // other cases
1536 return or_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1537 v.sgn, v.nbits, v.ndigits, v.digit);
1538}
1539
1540
1541sc_unsigned
1542operator | (const sc_unsigned &u, unsigned long v)
1543{
1544 if (v == 0) // case 1
1545 return sc_unsigned(u);
1546
1547 CONVERT_LONG(v);
1548
1549 if (u.sgn == SC_ZERO) // case 2
1550 return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1551
1552 // other cases
1553 return or_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1554 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1555}
1556
1557
1558sc_unsigned
1559operator | (unsigned long u, const sc_unsigned &v)
1560{
1561 if (u == 0)
1562 return sc_unsigned(v);
1563
1564 CONVERT_LONG(u);
1565
1566 if (v.sgn == SC_ZERO)
1567 return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1568
1569 // other cases
1570 return or_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1571 v.sgn, v.nbits, v.ndigits, v.digit);
1572}
1573
1574// The rest of the operators in this section are included from
1575// sc_nbcommon.cpp.
1576
1577
1578// ----------------------------------------------------------------------------
1579// SECTION: Bitwise XOR operators: ^, ^=
1580// ----------------------------------------------------------------------------
1581
1582// Cases to consider when computing u ^ v:
1583// Note that u ^ v = (~u &v) | (u & ~v).
1584// 1. u ^ 0 = u
1585// 2. 0 ^ v = v
1586// 3. u ^ v => sgn = +
1587// 4. (-u) ^ (-v) => sgn = -
1588// 5. u ^ (-v) => sgn = -
1589// 6. (-u) ^ v => sgn = +
1590
1591sc_unsigned
1592operator ^ (const sc_unsigned &u, const sc_unsigned &v)
1593{
1594 if (v.sgn == SC_ZERO) // case 1
1595 return sc_unsigned(u);
1596
1597 if (u.sgn == SC_ZERO) // case 2
1598 return sc_unsigned(v);
1599
1600 // other cases
1601 return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1602 v.sgn, v.nbits, v.ndigits, v.digit);
1603}
1604
1605
1606sc_unsigned
1607operator ^ (const sc_unsigned &u, uint64 v)
1608{
1609 if (v == 0) // case 1
1610 return sc_unsigned(u);
1611
1612 CONVERT_INT64(v);
1613
1614 if (u.sgn == SC_ZERO) // case 2
1615 return sc_unsigned(vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd, false);
1616
1617 // other cases
1618 return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1619 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd);
1620}
1621
1622sc_unsigned
1623operator ^ (uint64 u, const sc_unsigned &v)
1624{
1625 if (u == 0)
1626 return sc_unsigned(v);
1627
1628 CONVERT_INT64(u);
1629
1630 if (v.sgn == SC_ZERO)
1631 return sc_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud, false);
1632
1633 // other cases
1634 return xor_unsigned_friend(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1635 v.sgn, v.nbits, v.ndigits, v.digit);
1636}
1637
1638
1639sc_unsigned
1640operator ^ (const sc_unsigned &u, unsigned long v)
1641{
1642 if (v == 0) // case 1
1643 return sc_unsigned(u);
1644
1645 CONVERT_LONG(v);
1646
1647 if (u.sgn == SC_ZERO) // case 2
1648 return sc_unsigned(vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd, false);
1649
1650 // other cases
1651 return xor_unsigned_friend(u.sgn, u.nbits, u.ndigits, u.digit,
1652 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd);
1653}
1654
1655sc_unsigned
1656operator ^ (unsigned long u, const sc_unsigned &v)
1657{
1658 if (u == 0)
1659 return sc_unsigned(v);
1660
1661 CONVERT_LONG(u);
1662
1663 if (v.sgn == SC_ZERO)
1664 return sc_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud, false);
1665
1666 // other cases
1667 return xor_unsigned_friend(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1668 v.sgn, v.nbits, v.ndigits, v.digit);
1669}
1670
1671// The rest of the operators in this section are included from
1672// sc_nbcommon.cpp.
1673
1674
1675// ----------------------------------------------------------------------------
1676// SECTION: Bitwise NOT operator: ~
1677// ----------------------------------------------------------------------------
1678
1679// Operators in this section are included from sc_nbcommon.cpp.
1680
1681
1682// ----------------------------------------------------------------------------
1683// SECTION: LEFT SHIFT operators: <<, <<=
1684// ----------------------------------------------------------------------------
1685
1686sc_unsigned
1687operator << (const sc_unsigned &u, const sc_signed &v)
1688{
1689 if ((v.sgn == SC_ZERO) || (v.sgn == SC_NEG))
1690 return sc_unsigned(u);
1691
1692 return operator << (u, v.to_ulong());
1693}
1694
1695// The rest of the operators in this section are included from
1696// sc_nbcommon.cpp.
1697
1698
1699// ----------------------------------------------------------------------------
1700// SECTION: RIGHT SHIFT operators: >>, >>=
1701// ----------------------------------------------------------------------------
1702
1703sc_unsigned
1704operator >> (const sc_unsigned &u, const sc_signed &v)
1705{
1706
1707 if ((v.sgn == SC_ZERO) || (v.sgn == SC_NEG))
1708 return sc_unsigned(u);
1709
1710 return operator >> (u, v.to_long());
1711
1712}
1713
1714// The rest of the operators in this section are included from
1715// sc_nbcommon.cpp.
1716
1717
1718// ----------------------------------------------------------------------------
1719// SECTION: Unary arithmetic operators.
1720// ----------------------------------------------------------------------------
1721
1722sc_unsigned
1723operator + (const sc_unsigned &u)
1724{
1725 return sc_unsigned(u);
1726}
1727
1728
1729// ----------------------------------------------------------------------------
1730// SECTION: EQUAL operator: ==
1731// ----------------------------------------------------------------------------
1732
1733bool
1734operator == (const sc_unsigned &u, const sc_unsigned &v)
1735{
1736 if (&u == &v)
1737 return true;
1738 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1739 v.sgn, v.nbits, v.ndigits, v.digit) != 0) {
1740 return false;
1741 }
1742 return true;
1743}
1744
1745
1746bool
1747operator == (const sc_unsigned &u, const sc_signed &v)
1748{
1749 if (v.sgn == SC_NEG)
1750 return false;
1751 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1752 v.sgn, v.nbits, v.ndigits, v.digit, 0, 1) != 0) {
1753 return false;
1754 }
1755 return true;
1756}
1757
1758
1759bool
1760operator == (const sc_signed &u, const sc_unsigned &v)
1761{
1762 if (u.sgn == SC_NEG)
1763 return false;
1764 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1765 v.sgn, v.nbits, v.ndigits, v.digit, 1, 0) != 0) {
1766 return false;
1767 }
1768 return true;
1769}
1770
1771
1772bool
1773operator == (const sc_unsigned &u, int64 v)
1774{
1775 if (v < 0)
1776 return false;
1777 CONVERT_INT64(v);
1778 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1779 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) != 0) {
1780 return false;
1781 }
1782 return true;
1783}
1784
1785
1786bool
1787operator == (int64 u, const sc_unsigned &v)
1788{
1789 if (u < 0)
1790 return false;
1791 CONVERT_INT64(u);
1792 if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1793 v.sgn, v.nbits, v.ndigits, v.digit) != 0) {
1794 return false;
1795 }
1796 return true;
1797}
1798
1799
1800bool
1801operator == (const sc_unsigned &u, uint64 v)
1802{
1803 CONVERT_INT64(v);
1804 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1805 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) != 0)
1806 return false;
1807 return true;
1808}
1809
1810
1811bool
1812operator == (uint64 u, const sc_unsigned &v)
1813{
1814 CONVERT_INT64(u);
1815 if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1816 v.sgn, v.nbits, v.ndigits, v.digit) != 0)
1817 return false;
1818 return true;
1819}
1820
1821
1822bool
1823operator == (const sc_unsigned &u, long v)
1824{
1825 if (v < 0)
1826 return false;
1827 CONVERT_LONG(v);
1828 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1829 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) != 0)
1830 return false;
1831 return true;
1832}
1833
1834
1835bool
1836operator == (long u, const sc_unsigned &v)
1837{
1838 if (u < 0)
1839 return false;
1840 CONVERT_LONG(u);
1841 if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1842 v.sgn, v.nbits, v.ndigits, v.digit) != 0)
1843 return false;
1844 return true;
1845}
1846
1847
1848bool
1849operator == (const sc_unsigned &u, unsigned long v)
1850{
1851 CONVERT_LONG(v);
1852 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1853 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) != 0)
1854 return false;
1855 return true;
1856}
1857
1858
1859bool
1860operator == (unsigned long u, const sc_unsigned &v)
1861{
1862 CONVERT_LONG(u);
1863 if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
1864 v.sgn, v.nbits, v.ndigits, v.digit) != 0)
1865 return false;
1866 return true;
1867}
1868
1869
1870// ----------------------------------------------------------------------------
1871// SECTION: NOT_EQUAL operator: !=
1872// ----------------------------------------------------------------------------
1873
1874bool
1875operator != (const sc_unsigned &u, const sc_signed &v)
1876{
1877 return (!operator == (u, v));
1878}
1879
1880
1881bool
1882operator != (const sc_signed &u, const sc_unsigned &v)
1883{
1884 return (!operator == (u, v));
1885}
1886
1887// The rest of the operators in this section are included from sc_nbcommon.cpp.
1888
1889
1890// ----------------------------------------------------------------------------
1891// SECTION: LESS THAN operator: <
1892// ----------------------------------------------------------------------------
1893
1894bool
1895operator < (const sc_unsigned &u, const sc_unsigned &v)
1896{
1897 if (&u == &v)
1898 return false;
1899 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1900 v.sgn, v.nbits, v.ndigits, v.digit) < 0) {
1901 return true;
1902 }
1903 return false;
1904}
1905
1906
1907bool
1908operator < (const sc_unsigned &u, const sc_signed &v)
1909{
1910 if (v.sgn == SC_NEG)
1911 return false;
1912 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1913 v.sgn, v.nbits, v.ndigits, v.digit, 0, 1) < 0) {
1914 return true;
1915 }
1916 return false;
1917}
1918
1919
1920bool
1921operator < (const sc_signed &u, const sc_unsigned &v)
1922{
1923 if (u.sgn == SC_NEG)
1924 return true;
1925 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1926 v.sgn, v.nbits, v.ndigits, v.digit, 1, 0) < 0) {
1927 return true;
1928 }
1929 return false;
1930}
1931
1932
1933bool
1934operator < (const sc_unsigned &u, int64 v)
1935{
1936 if (v < 0)
1937 return false;
1938 CONVERT_INT64(v);
1939 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1940 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) < 0) {
1941 return true;
1942 }
1943 return false;
1944}
1945
1946
1947bool
1948operator < (int64 u, const sc_unsigned &v)
1949{
1950 if (u < 0)
1951 return true;
1952 CONVERT_INT64(u);
1953 if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1954 v.sgn, v.nbits, v.ndigits, v.digit) < 0) {
1955 return true;
1956 }
1957 return false;
1958}
1959
1960
1961bool
1962operator < (const sc_unsigned &u, uint64 v)
1963{
1964 CONVERT_INT64(v);
1965 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1966 vs, BITS_PER_UINT64, DIGITS_PER_UINT64, vd) < 0) {
1967 return true;
1968 }
1969 return false;
1970}
1971
1972
1973bool
1974operator < (uint64 u, const sc_unsigned &v)
1975{
1976 CONVERT_INT64(u);
1977 if (compare_unsigned(us, BITS_PER_UINT64, DIGITS_PER_UINT64, ud,
1978 v.sgn, v.nbits, v.ndigits, v.digit) < 0){
1979 return true;
1980 }
1981 return false;
1982}
1983
1984
1985bool
1986operator < (const sc_unsigned &u, long v)
1987{
1988 if (v < 0)
1989 return false;
1990 CONVERT_LONG(v);
1991 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
1992 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) < 0) {
1993 return true;
1994 }
1995 return false;
1996}
1997
1998
1999bool
2000operator < (long u, const sc_unsigned &v)
2001{
2002 if (u < 0)
2003 return true;
2004 CONVERT_LONG(u);
2005 if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2006 v.sgn, v.nbits, v.ndigits, v.digit) < 0) {
2007 return true;
2008 }
2009 return false;
2010}
2011
2012
2013bool
2014operator < (const sc_unsigned &u, unsigned long v)
2015{
2016 CONVERT_LONG(v);
2017 if (compare_unsigned(u.sgn, u.nbits, u.ndigits, u.digit,
2018 vs, BITS_PER_ULONG, DIGITS_PER_ULONG, vd) < 0) {
2019 return true;
2020 }
2021 return false;
2022}
2023
2024
2025bool
2026operator < (unsigned long u, const sc_unsigned &v)
2027{
2028 CONVERT_LONG(u);
2029 if (compare_unsigned(us, BITS_PER_ULONG, DIGITS_PER_ULONG, ud,
2030 v.sgn, v.nbits, v.ndigits, v.digit) < 0) {
2031 return true;
2032 }
2033 return false;
2034}
2035
2036
2037// ----------------------------------------------------------------------------
2038// SECTION: LESS THAN or EQUAL operator: <=
2039// ----------------------------------------------------------------------------
2040
2041bool
2042operator <= (const sc_unsigned &u, const sc_signed &v)
2043{
2044 return (operator < (u, v) || operator == (u, v));
2045}
2046
2047
2048bool
2049operator <= (const sc_signed &u, const sc_unsigned &v)
2050{
2051 return (operator < (u, v) || operator == (u, v));
2052}
2053
2054// The rest of the operators in this section are included from sc_nbcommon.cpp.
2055
2056
2057// ----------------------------------------------------------------------------
2058// SECTION: GREATER THAN operator: >
2059// ----------------------------------------------------------------------------
2060
2061bool
2062operator > (const sc_unsigned &u, const sc_signed &v)
2063{
2064 return (!(operator <= (u, v)));
2065}
2066
2067
2068bool
2069operator > (const sc_signed &u, const sc_unsigned &v)
2070{
2071 return (!(operator <= (u, v)));
2072}
2073
2074// The rest of the operators in this section are included from sc_nbcommon.cpp.
2075
2076
2077// ----------------------------------------------------------------------------
2078// SECTION: GREATER THAN or EQUAL operator: >=
2079// ----------------------------------------------------------------------------
2080
2081bool
2082operator >= (const sc_unsigned &u, const sc_signed &v)
2083{
2084 return (!(operator < (u, v)));
2085}
2086
2087
2088bool
2089operator >= (const sc_signed &u, const sc_unsigned &v)
2090{
2091 return (!(operator < (u, v)));
2092}
2093
2094// The rest of the operators in this section are included from sc_nbcommon.cpp.
2095
2096
2097// ----------------------------------------------------------------------------
2098// SECTION: Friends
2099// ----------------------------------------------------------------------------
2100
2101// Compare u and v as unsigned and return r
2102// r = 0 if u == v
2103// r < 0 if u < v
2104// r > 0 if u > v
2105
2106int
2107compare_unsigned(small_type us, int unb, int und, const sc_digit *ud,
2108 small_type vs, int vnb, int vnd, const sc_digit *vd,
2109 small_type if_u_signed, small_type if_v_signed)
2110{
2111 if (us == vs) {
2112 if (us == SC_ZERO) {
2113 return 0;
2114 } else {
2115 int cmp_res = vec_skip_and_cmp(und, ud, vnd, vd);
2116 if (us == SC_POS)
2117 return cmp_res;
2118 else
2119 return -cmp_res;
2120 }
2121 } else {
2122 if (us == SC_ZERO)
2123 return -vs;
2124 if (vs == SC_ZERO)
2125 return us;
2126
2127 int cmp_res;
2128 int nd = (us == SC_NEG ? und : vnd);
2129
2130#ifdef SC_MAX_NBITS
2131 sc_digit d[MAX_NDIGITS];
2132#else
2133 sc_digit *d = new sc_digit[nd];
2134#endif
2135
2136 if (us == SC_NEG) {
2137 vec_copy(nd, d, ud);
2138 vec_complement(nd, d);
2139 trim(if_u_signed, unb, nd, d);
2140 cmp_res = vec_skip_and_cmp(nd, d, vnd, vd);
2141 } else {
2142 vec_copy(nd, d, vd);
2143 vec_complement(nd, d);
2144 trim(if_v_signed, vnb, nd, d);
2145 cmp_res = vec_skip_and_cmp(und, ud, nd, d);
2146 }
2147
2148#ifndef SC_MAX_NBITS
2149 delete [] d;
2150#endif
2151
2152 return cmp_res;
2153 }
2154}
2155
2156
2157// ----------------------------------------------------------------------------
2158// SECTION: Public members - Other utils.
2159// ----------------------------------------------------------------------------
2160
2161bool
2162sc_unsigned::iszero() const
2163{
2164 if (sgn == SC_ZERO) {
2165 return true;
2166 } else if (sgn == SC_NEG) {
2167 // A negative unsigned number can be zero, e.g., -16 in 4 bits, so
2168 // check that.
2169
2170#ifdef SC_MAX_NBITS
2171 sc_digit d[MAX_NDIGITS];
2172#else
2173 sc_digit *d = new sc_digit[ndigits];
2174#endif
2175
2176 vec_copy(ndigits, d, digit);
2177 vec_complement(ndigits, d);
2178 trim_unsigned(nbits, ndigits, d);
2179
2180 bool res = check_for_zero(ndigits, d);
2181
2182#ifndef SC_MAX_NBITS
2183 delete [] d;
2184#endif
2185
2186 return res;
2187 } else {
2188 return false;
2189 }
2190}
2191
2192// The rest of the utils in this section are included from sc_nbcommon.cpp.
2193
2194
2195// ----------------------------------------------------------------------------
2196// SECTION: Private members.
2197// ----------------------------------------------------------------------------
2198
2199// The private members in this section are included from
2200// sc_nbcommon.cpp.
2201
2202#define CLASS_TYPE sc_unsigned
2203#define CLASS_TYPE_STR "sc_unsigned"
2204
2205#define ADD_HELPER add_unsigned_friend
2206#define SUB_HELPER sub_unsigned_friend
2207#define MUL_HELPER mul_unsigned_friend
2208#define DIV_HELPER div_unsigned_friend
2209#define MOD_HELPER mod_unsigned_friend
2210#define AND_HELPER and_unsigned_friend
2211#define OR_HELPER or_unsigned_friend
2212#define XOR_HELPER xor_unsigned_friend
2213
2214#include "sc_nbfriends.inc"
2215
2216#undef SC_SIGNED
2217#define SC_UNSIGNED
2218#define IF_SC_SIGNED 0 // 0 = sc_unsigned
2219#define CLASS_TYPE_SUBREF sc_unsigned_subref_r
2220#define OTHER_CLASS_TYPE sc_signed
2221#define OTHER_CLASS_TYPE_SUBREF sc_signed_subref_r
2222
2223#define MUL_ON_HELPER mul_on_help_unsigned
2224#define DIV_ON_HELPER div_on_help_unsigned
2225#define MOD_ON_HELPER mod_on_help_unsigned
2226
2227#include "sc_nbcommon.inc"
2228
2229#undef MOD_ON_HELPER
2230#undef DIV_ON_HELPER
2231#undef MUL_ON_HELPER
2232
2233#undef OTHER_CLASS_TYPE_SUBREF
2234#undef OTHER_CLASS_TYPE
2235#undef CLASS_TYPE_SUBREF
2236#undef IF_SC_SIGNED
2237#undef SC_UNSIGNED
2238
2239#undef XOR_HELPER
2240#undef OR_HELPER
2241#undef AND_HELPER
2242#undef MOD_HELPER
2243#undef DIV_HELPER
2244#undef MUL_HELPER
2245#undef SUB_HELPER
2246#undef ADD_HELPER
2247
2248#undef CLASS_TYPE
2249#undef CLASS_TYPE_STR
2250
2251#include "sc_unsigned_bitref.inc"
2252#include "sc_unsigned_subref.inc"
2253
2254#undef CONVERT_LONG
2255#undef CONVERT_LONG_2
2256#undef CONVERT_INT64
2257#undef CONVERT_INT64_2
2258
2259} // namespace sc_dt