SystemC  2.3.2
Accellera SystemC proof-of-concept library
sc_unsigned.h
Go to the documentation of this file.
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.h -- Arbitrary precision unsigned arithmetic.
23 */
67 /*****************************************************************************
68 
69  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
70  changes you are making here.
71 
72  Name, Affiliation, Date:
73  Description of Modification:
74 
75  *****************************************************************************/
76 
77 // $Log: sc_unsigned.h,v $
78 // Revision 1.4 2011/08/24 22:05:46 acg
79 // Torsten Maehne: initialization changes to remove warnings.
80 //
81 // Revision 1.3 2011/02/18 20:19:15 acg
82 // Andy Goodrich: updating Copyright notice.
83 //
84 // Revision 1.2 2009/02/28 00:26:26 acg
85 // Andy Goodrich: bug fixes.
86 //
87 // Revision 1.1.1.1 2006/12/15 20:20:05 acg
88 // SystemC 2.3
89 //
90 // Revision 1.5 2006/05/08 17:50:02 acg
91 // Andy Goodrich: Added David Long's declarations for friend operators,
92 // functions, and methods, to keep the Microsoft compiler happy.
93 //
94 // Revision 1.4 2006/03/13 20:25:27 acg
95 // Andy Goodrich: Addition of function declarations, e.g., xor_signed_friend()
96 // to keep gcc 4.x happy.
97 //
98 // Revision 1.3 2006/01/13 18:49:32 acg
99 // Added $Log command so that CVS check in comments are reproduced in the
100 // source.
101 //
102 
103 #ifndef SC_UNSIGNED_H
104 #define SC_UNSIGNED_H
105 
106 
107 #include "sysc/kernel/sc_object.h"
109 #include "sysc/utils/sc_temporary.h"
114 #include "sysc/utils/sc_temporary.h"
115 
116 
117 namespace sc_dt
118 {
119 
120 // classes defined in this module
121 class sc_unsigned_bitref_r;
122 class sc_unsigned_bitref;
123 class sc_unsigned_subref_r;
124 class sc_unsigned_subref;
125 class sc_concatref;
126 class sc_unsigned;
127 
128 // forward class declarations
129 class sc_bv_base;
130 class sc_lv_base;
131 class sc_int_base;
132 class sc_uint_base;
133 class sc_int_subref_r;
134 class sc_uint_subref_r;
135 class sc_signed;
136 class sc_signed_subref_r;
137 class sc_fxval;
138 class sc_fxval_fast;
139 class sc_fxnum;
140 class sc_fxnum_fast;
141 
142 } // namespace sc_dt
143 
144 // extern template instantiations
145 namespace sc_core {
146 SC_API_TEMPLATE_DECL_ sc_vpool<sc_dt::sc_unsigned_bitref>;
147 SC_API_TEMPLATE_DECL_ sc_vpool<sc_dt::sc_unsigned_subref>;
148 SC_API_TEMPLATE_DECL_ sc_vpool<sc_dt::sc_unsigned>;
149 } // namespace sc_core
150 
151 namespace sc_dt {
152 
153 // Helper function declarions
155  int unb,
156  int und,
157  const sc_digit *ud,
158  small_type vs,
159  int vnb,
160  int vnd,
161  const sc_digit *vd,
162  small_type if_u_signed=0,
163  small_type if_v_signed=0);
164 
165 sc_unsigned add_unsigned_friend(small_type us,
166  int unb,
167  int und,
168  const sc_digit *ud,
169  small_type vs,
170  int vnb,
171  int vnd,
172  const sc_digit *vd);
173 
174 sc_unsigned sub_unsigned_friend(small_type us,
175  int unb,
176  int und,
177  const sc_digit *ud,
178  small_type vs,
179  int vnb,
180  int vnd,
181  const sc_digit *vd);
182 
183 sc_unsigned mul_unsigned_friend(small_type s,
184  int unb,
185  int und,
186  const sc_digit *ud,
187  int vnb,
188  int vnd,
189  const sc_digit *vd);
190 
191 sc_unsigned div_unsigned_friend(small_type s,
192  int unb,
193  int und,
194  const sc_digit *ud,
195  int vnb,
196  int vnd,
197  const sc_digit *vd);
198 
199 sc_unsigned mod_unsigned_friend(small_type us,
200  int unb,
201  int und,
202  const sc_digit *ud,
203  int vnb,
204  int vnd,
205  const sc_digit *vd);
206 
207 sc_unsigned and_unsigned_friend(small_type us,
208  int unb,
209  int und,
210  const sc_digit *ud,
211  small_type vs,
212  int vnb,
213  int vnd,
214  const sc_digit *vd);
215 
216 
217 sc_unsigned or_unsigned_friend(small_type us,
218  int unb,
219  int und,
220  const sc_digit *ud,
221  small_type vs,
222  int vnb,
223  int vnd,
224  const sc_digit *vd);
225 
226 sc_unsigned xor_unsigned_friend(small_type us,
227  int unb,
228  int und,
229  const sc_digit *ud,
230  small_type vs,
231  int vnb,
232  int vnd,
233  const sc_digit *vd);
234 
235 // friend operator declarations
236  // ARITHMETIC OPERATORS:
237 
238  // ADDition operators:
239 
240  SC_API sc_signed operator + (const sc_unsigned& u, const sc_signed& v);
241  SC_API sc_signed operator + (const sc_signed& u, const sc_unsigned& v);
242 
243  SC_API sc_unsigned operator + (const sc_unsigned& u, const sc_unsigned& v);
244  SC_API sc_signed operator + (const sc_unsigned& u, int64 v);
245  SC_API sc_unsigned operator + (const sc_unsigned& u, uint64 v);
246  SC_API sc_signed operator + (const sc_unsigned& u, long v);
247  SC_API sc_unsigned operator + (const sc_unsigned& u, unsigned long v);
248  SC_API sc_signed operator + (const sc_unsigned& u, int v);
249  inline sc_unsigned operator + (const sc_unsigned& u, unsigned int v);
250 
251  SC_API sc_signed operator + (int64 u, const sc_unsigned& v);
252  SC_API sc_unsigned operator + (uint64 u, const sc_unsigned& v);
253  SC_API sc_signed operator + (long u, const sc_unsigned& v);
254  SC_API sc_unsigned operator + (unsigned long u, const sc_unsigned& v);
255  SC_API sc_signed operator + (int u, const sc_unsigned& v);
256  inline sc_unsigned operator + (unsigned int u, const sc_unsigned& v);
257 
258  SC_API sc_unsigned operator + (const sc_unsigned& u, const sc_uint_base& v);
259  SC_API sc_signed operator + (const sc_unsigned& u, const sc_int_base& v);
260  SC_API sc_unsigned operator + (const sc_uint_base& u, const sc_unsigned& v);
261  SC_API sc_signed operator + (const sc_int_base& u, const sc_unsigned& v);
262 
263  // SUBtraction operators:
264 
265  SC_API sc_signed operator - (const sc_unsigned& u, const sc_signed& v);
266  SC_API sc_signed operator - (const sc_signed& u, const sc_unsigned& v);
267 
268  SC_API sc_signed operator - (const sc_unsigned& u, const sc_unsigned& v);
269  SC_API sc_signed operator - (const sc_unsigned& u, int64 v);
270  SC_API sc_signed operator - (const sc_unsigned& u, uint64 v);
271  SC_API sc_signed operator - (const sc_unsigned& u, long v);
272  SC_API sc_signed operator - (const sc_unsigned& u, unsigned long v);
273  SC_API sc_signed operator - (const sc_unsigned& u, int v);
274  SC_API sc_signed operator - (const sc_unsigned& u, unsigned int v);
275 
276  SC_API sc_signed operator - (int64 u, const sc_unsigned& v);
277  SC_API sc_signed operator - (uint64 u, const sc_unsigned& v);
278  SC_API sc_signed operator - (long u, const sc_unsigned& v);
279  SC_API sc_signed operator - (unsigned long u, const sc_unsigned& v);
280  SC_API sc_signed operator - (int u, const sc_unsigned& v);
281  SC_API sc_signed operator - (unsigned int u, const sc_unsigned& v);
282 
283  SC_API sc_signed operator - (const sc_unsigned& u, const sc_uint_base& v);
284  SC_API sc_signed operator - (const sc_unsigned& u, const sc_int_base& v);
285  SC_API sc_signed operator - (const sc_uint_base& u, const sc_unsigned& v);
286  SC_API sc_signed operator - (const sc_int_base& u, const sc_unsigned& v);
287 
288  // MULtiplication operators:
289 
290  SC_API sc_signed operator * (const sc_unsigned& u, const sc_signed& v);
291  SC_API sc_signed operator * (const sc_signed& u, const sc_unsigned& v);
292 
293  SC_API sc_unsigned operator * (const sc_unsigned& u, const sc_unsigned& v);
294  SC_API sc_signed operator * (const sc_unsigned& u, int64 v);
295  SC_API sc_unsigned operator * (const sc_unsigned& u, uint64 v);
296  SC_API sc_signed operator * (const sc_unsigned& u, long v);
297  SC_API sc_unsigned operator * (const sc_unsigned& u, unsigned long v);
298  SC_API sc_signed operator * (const sc_unsigned& u, int v);
299  inline sc_unsigned operator * (const sc_unsigned& u, unsigned int v);
300 
301  SC_API sc_signed operator * (int64 u, const sc_unsigned& v);
302  SC_API sc_unsigned operator * (uint64 u, const sc_unsigned& v);
303  SC_API sc_signed operator * (long u, const sc_unsigned& v);
304  SC_API sc_unsigned operator * (unsigned long u, const sc_unsigned& v);
305  SC_API sc_signed operator * (int u, const sc_unsigned& v);
306  inline sc_unsigned operator * (unsigned int u, const sc_unsigned& v);
307 
308  SC_API sc_unsigned operator * (const sc_unsigned& u, const sc_uint_base& v);
309  SC_API sc_signed operator * (const sc_unsigned& u, const sc_int_base& v);
310  SC_API sc_unsigned operator * (const sc_uint_base& u, const sc_unsigned& v);
311  SC_API sc_signed operator * (const sc_int_base& u, const sc_unsigned& v);
312 
313  // DIVision operators:
314 
315  SC_API sc_signed operator / (const sc_unsigned& u, const sc_signed& v);
316  SC_API sc_signed operator / (const sc_signed& u, const sc_unsigned& v);
317 
318  SC_API sc_unsigned operator / (const sc_unsigned& u, const sc_unsigned& v);
319  SC_API sc_signed operator / (const sc_unsigned& u, int64 v);
320  SC_API sc_unsigned operator / (const sc_unsigned& u, uint64 v);
321  SC_API sc_signed operator / (const sc_unsigned& u, long v);
322  SC_API sc_unsigned operator / (const sc_unsigned& u, unsigned long v);
323  SC_API sc_signed operator / (const sc_unsigned& u, int v);
324  inline sc_unsigned operator / (const sc_unsigned& u, unsigned int v);
325 
326  SC_API sc_signed operator / (int64 u, const sc_unsigned& v);
327  SC_API sc_unsigned operator / (uint64 u, const sc_unsigned& v);
328  SC_API sc_signed operator / (long u, const sc_unsigned& v);
329  SC_API sc_unsigned operator / (unsigned long u, const sc_unsigned& v);
330  SC_API sc_signed operator / (int u, const sc_unsigned& v);
331  inline sc_unsigned operator / (unsigned int u, const sc_unsigned& v);
332 
333  SC_API sc_unsigned operator / (const sc_unsigned& u, const sc_uint_base& v);
334  SC_API sc_signed operator / (const sc_unsigned& u, const sc_int_base& v);
335  SC_API sc_unsigned operator / (const sc_uint_base& u, const sc_unsigned& v);
336  SC_API sc_signed operator / (const sc_int_base& u, const sc_unsigned& v);
337 
338  // MODulo operators:
339 
340  SC_API sc_signed operator % (const sc_unsigned& u, const sc_signed& v);
341  SC_API sc_signed operator % (const sc_signed& u, const sc_unsigned& v);
342 
343  SC_API sc_unsigned operator % (const sc_unsigned& u, const sc_unsigned& v);
344  SC_API sc_signed operator % (const sc_unsigned& u, int64 v);
345  SC_API sc_unsigned operator % (const sc_unsigned& u, uint64 v);
346  SC_API sc_signed operator % (const sc_unsigned& u, long v);
347  SC_API sc_unsigned operator % (const sc_unsigned& u, unsigned long v);
348  SC_API sc_signed operator % (const sc_unsigned& u, int v);
349  inline sc_unsigned operator % (const sc_unsigned& u, unsigned int v);
350 
351  SC_API sc_signed operator % (int64 u, const sc_unsigned& v);
352  SC_API sc_unsigned operator % (uint64 u, const sc_unsigned& v);
353  SC_API sc_signed operator % (long u, const sc_unsigned& v);
354  SC_API sc_unsigned operator % (unsigned long u, const sc_unsigned& v);
355  SC_API sc_signed operator % (int u, const sc_unsigned& v);
356  inline sc_unsigned operator % (unsigned int u, const sc_unsigned& v);
357 
358  SC_API sc_unsigned operator % (const sc_unsigned& u, const sc_uint_base& v);
359  SC_API sc_signed operator % (const sc_unsigned& u, const sc_int_base& v);
360  SC_API sc_unsigned operator % (const sc_uint_base& u, const sc_unsigned& v);
361  SC_API sc_signed operator % (const sc_int_base& u, const sc_unsigned& v);
362 
363  // BITWISE OPERATORS:
364 
365  // Bitwise AND operators:
366 
367  SC_API sc_signed operator & (const sc_unsigned& u, const sc_signed& v);
368  SC_API sc_signed operator & (const sc_signed& u, const sc_unsigned& v);
369 
370  SC_API sc_unsigned operator & (const sc_unsigned& u, const sc_unsigned& v);
371  SC_API sc_signed operator & (const sc_unsigned& u, int64 v);
372  SC_API sc_unsigned operator & (const sc_unsigned& u, uint64 v);
373  SC_API sc_signed operator & (const sc_unsigned& u, long v);
374  SC_API sc_unsigned operator & (const sc_unsigned& u, unsigned long v);
375  SC_API sc_signed operator & (const sc_unsigned& u, int v);
376  inline sc_unsigned operator & (const sc_unsigned& u, unsigned int v);
377 
378  SC_API sc_signed operator & (int64 u, const sc_unsigned& v);
379  SC_API sc_unsigned operator & (uint64 u, const sc_unsigned& v);
380  SC_API sc_signed operator & (long u, const sc_unsigned& v);
381  SC_API sc_unsigned operator & (unsigned long u, const sc_unsigned& v);
382  SC_API sc_signed operator & (int u, const sc_unsigned& v);
383  inline sc_unsigned operator & (unsigned int u, const sc_unsigned& v);
384 
385  SC_API sc_unsigned operator & (const sc_unsigned& u, const sc_uint_base& v);
386  SC_API sc_signed operator & (const sc_unsigned& u, const sc_int_base& v);
387  SC_API sc_unsigned operator & (const sc_uint_base& u, const sc_unsigned& v);
388  SC_API sc_signed operator & (const sc_int_base& u, const sc_unsigned& v);
389 
390  // Bitwise OR operators:
391 
392  SC_API sc_signed operator | (const sc_unsigned& u, const sc_signed& v);
393  SC_API sc_signed operator | (const sc_signed& u, const sc_unsigned& v);
394 
395  SC_API sc_unsigned operator | (const sc_unsigned& u, const sc_unsigned& v);
396  SC_API sc_signed operator | (const sc_unsigned& u, int64 v);
397  SC_API sc_unsigned operator | (const sc_unsigned& u, uint64 v);
398  SC_API sc_signed operator | (const sc_unsigned& u, long v);
399  SC_API sc_unsigned operator | (const sc_unsigned& u, unsigned long v);
400  SC_API sc_signed operator | (const sc_unsigned& u, int v);
401  inline sc_unsigned operator | (const sc_unsigned& u, unsigned int v);
402 
403  SC_API sc_signed operator | (int64 u, const sc_unsigned& v);
404  SC_API sc_unsigned operator | (uint64 u, const sc_unsigned& v);
405  SC_API sc_signed operator | (long u, const sc_unsigned& v);
406  SC_API sc_unsigned operator | (unsigned long u, const sc_unsigned& v);
407  SC_API sc_signed operator | (int u, const sc_unsigned& v);
408  inline sc_unsigned operator | (unsigned int u, const sc_unsigned& v);
409 
410  SC_API sc_unsigned operator | (const sc_unsigned& u, const sc_uint_base& v);
411  SC_API sc_signed operator | (const sc_unsigned& u, const sc_int_base& v);
412  SC_API sc_unsigned operator | (const sc_uint_base& u, const sc_unsigned& v);
413  SC_API sc_signed operator | (const sc_int_base& u, const sc_unsigned& v);
414 
415  // Bitwise XOR operators:
416 
417  SC_API sc_signed operator ^ (const sc_unsigned& u, const sc_signed& v);
418  SC_API sc_signed operator ^ (const sc_signed& u, const sc_unsigned& v);
419 
420  SC_API sc_unsigned operator ^ (const sc_unsigned& u, const sc_unsigned& v);
421  SC_API sc_signed operator ^ (const sc_unsigned& u, int64 v);
422  SC_API sc_unsigned operator ^ (const sc_unsigned& u, uint64 v);
423  SC_API sc_signed operator ^ (const sc_unsigned& u, long v);
424  SC_API sc_unsigned operator ^ (const sc_unsigned& u, unsigned long v);
425  SC_API sc_signed operator ^ (const sc_unsigned& u, int v);
426  inline sc_unsigned operator ^ (const sc_unsigned& u, unsigned int v);
427 
428  SC_API sc_signed operator ^ (int64 u, const sc_unsigned& v);
429  SC_API sc_unsigned operator ^ (uint64 u, const sc_unsigned& v);
430  SC_API sc_signed operator ^ (long u, const sc_unsigned& v);
431  SC_API sc_unsigned operator ^ (unsigned long u, const sc_unsigned& v);
432  SC_API sc_signed operator ^ (int u, const sc_unsigned& v);
433  inline sc_unsigned operator ^ (unsigned int u, const sc_unsigned& v);
434 
435  SC_API sc_unsigned operator ^ (const sc_unsigned& u, const sc_uint_base& v);
436  SC_API sc_signed operator ^ (const sc_unsigned& u, const sc_int_base& v);
437  SC_API sc_unsigned operator ^ (const sc_uint_base& u, const sc_unsigned& v);
438  SC_API sc_signed operator ^ (const sc_int_base& u, const sc_unsigned& v);
439 
440  // SHIFT OPERATORS:
441 
442  // LEFT SHIFT operators:
443 
444  SC_API sc_unsigned operator << (const sc_unsigned& u, const sc_signed& v);
445  SC_API sc_signed operator << (const sc_signed& u, const sc_unsigned& v);
446 
447  SC_API sc_unsigned operator << (const sc_unsigned& u, const sc_unsigned& v);
448  SC_API sc_unsigned operator << (const sc_unsigned& u, int64 v);
449  SC_API sc_unsigned operator << (const sc_unsigned& u, uint64 v);
450  SC_API sc_unsigned operator << (const sc_unsigned& u, long v);
451  SC_API sc_unsigned operator << (const sc_unsigned& u, unsigned long v);
452  inline sc_unsigned operator << (const sc_unsigned& u, int v);
453  inline sc_unsigned operator << (const sc_unsigned& u, unsigned int v);
454 
455  SC_API sc_unsigned operator << (const sc_unsigned& u, const sc_uint_base& v);
456  SC_API sc_unsigned operator << (const sc_unsigned& u, const sc_int_base& v);
457 
458  // RIGHT SHIFT operators:
459 
460  SC_API sc_unsigned operator >> (const sc_unsigned& u, const sc_signed& v);
461  SC_API sc_signed operator >> (const sc_signed& u, const sc_unsigned& v);
462 
463  SC_API sc_unsigned operator >> (const sc_unsigned& u, const sc_unsigned& v);
464  SC_API sc_unsigned operator >> (const sc_unsigned& u, int64 v);
465  SC_API sc_unsigned operator >> (const sc_unsigned& u, uint64 v);
466  SC_API sc_unsigned operator >> (const sc_unsigned& u, long v);
467  SC_API sc_unsigned operator >> (const sc_unsigned& u, unsigned long v);
468  inline sc_unsigned operator >> (const sc_unsigned& u, int v);
469  inline sc_unsigned operator >> (const sc_unsigned& u, unsigned int v);
470 
471  SC_API sc_unsigned operator >> ( const sc_unsigned& , const sc_uint_base& );
472  SC_API sc_unsigned operator >> ( const sc_unsigned&, const sc_int_base& );
473 
474  // Unary arithmetic operators
475  SC_API sc_unsigned operator + (const sc_unsigned& u);
476  SC_API sc_signed operator - (const sc_unsigned& u);
477 
478  // LOGICAL OPERATORS:
479 
480  // Logical EQUAL operators:
481 
482  SC_API bool operator == (const sc_unsigned& u, const sc_signed& v);
483  SC_API bool operator == (const sc_signed& u, const sc_unsigned& v);
484 
485  SC_API bool operator == (const sc_unsigned& u, const sc_unsigned& v);
486  SC_API bool operator == (const sc_unsigned& u, int64 v);
487  SC_API bool operator == (const sc_unsigned& u, uint64 v);
488  SC_API bool operator == (const sc_unsigned& u, long v);
489  SC_API bool operator == (const sc_unsigned& u, unsigned long v);
490  inline bool operator == (const sc_unsigned& u, int v);
491  inline bool operator == (const sc_unsigned& u, unsigned int v);
492 
493  SC_API bool operator == (int64 u, const sc_unsigned& v);
494  SC_API bool operator == (uint64 u, const sc_unsigned& v);
495  SC_API bool operator == (long u, const sc_unsigned& v);
496  SC_API bool operator == (unsigned long u, const sc_unsigned& v);
497  inline bool operator == (int u, const sc_unsigned& v);
498  inline bool operator == (unsigned int u, const sc_unsigned& v) ;
499 
500  SC_API bool operator == (const sc_unsigned& u, const sc_uint_base& v);
501  SC_API bool operator == (const sc_unsigned& u, const sc_int_base& v);
502  SC_API bool operator == (const sc_uint_base& u, const sc_unsigned& v);
503  SC_API bool operator == (const sc_int_base& u, const sc_unsigned& v);
504 
505  // Logical NOT_EQUAL operators:
506 
507  SC_API bool operator != (const sc_unsigned& u, const sc_signed& v);
508  SC_API bool operator != (const sc_signed& u, const sc_unsigned& v);
509 
510  SC_API bool operator != (const sc_unsigned& u, const sc_unsigned& v);
511  SC_API bool operator != (const sc_unsigned& u, int64 v);
512  SC_API bool operator != (const sc_unsigned& u, uint64 v);
513  SC_API bool operator != (const sc_unsigned& u, long v);
514  SC_API bool operator != (const sc_unsigned& u, unsigned long v);
515  inline bool operator != (const sc_unsigned& u, int v);
516  inline bool operator != (const sc_unsigned& u, unsigned int v);
517 
518  SC_API bool operator != (int64 u, const sc_unsigned& v);
519  SC_API bool operator != (uint64 u, const sc_unsigned& v);
520  SC_API bool operator != (long u, const sc_unsigned& v);
521  SC_API bool operator != (unsigned long u, const sc_unsigned& v);
522  inline bool operator != (int u, const sc_unsigned& v);
523  inline bool operator != (unsigned int u, const sc_unsigned& v);
524 
525  SC_API bool operator != (const sc_unsigned& u, const sc_uint_base& v);
526  SC_API bool operator != (const sc_unsigned& u, const sc_int_base& v);
527  SC_API bool operator != (const sc_uint_base& u, const sc_unsigned& v);
528  SC_API bool operator != (const sc_int_base& u, const sc_unsigned& v);
529 
530  // Logical LESS_THAN operators:
531 
532  SC_API bool operator < (const sc_unsigned& u, const sc_signed& v);
533  SC_API bool operator < (const sc_signed& u, const sc_unsigned& v);
534 
535  SC_API bool operator < (const sc_unsigned& u, const sc_unsigned& v);
536  SC_API bool operator < (const sc_unsigned& u, int64 v);
537  SC_API bool operator < (const sc_unsigned& u, uint64 v);
538  SC_API bool operator < (const sc_unsigned& u, long v);
539  SC_API bool operator < (const sc_unsigned& u, unsigned long v);
540  inline bool operator < (const sc_unsigned& u, int v);
541  inline bool operator < (const sc_unsigned& u, unsigned int v);
542 
543  SC_API bool operator < (int64 u, const sc_unsigned& v);
544  SC_API bool operator < (uint64 u, const sc_unsigned& v);
545  SC_API bool operator < (long u, const sc_unsigned& v);
546  SC_API bool operator < (unsigned long u, const sc_unsigned& v);
547  inline bool operator < (int u, const sc_unsigned& v);
548  inline bool operator < (unsigned int u, const sc_unsigned& v);
549 
550  SC_API bool operator < (const sc_unsigned& u, const sc_uint_base& v);
551  SC_API bool operator < (const sc_unsigned& u, const sc_int_base& v);
552  SC_API bool operator < (const sc_uint_base& u, const sc_unsigned& v);
553  SC_API bool operator < (const sc_int_base& u, const sc_unsigned& v);
554 
555  // Logical LESS_THAN_AND_EQUAL operators:
556 
557  SC_API bool operator <= (const sc_unsigned& u, const sc_signed& v);
558  SC_API bool operator <= (const sc_signed& u, const sc_unsigned& v);
559 
560  SC_API bool operator <= (const sc_unsigned& u, const sc_unsigned& v);
561  SC_API bool operator <= (const sc_unsigned& u, int64 v);
562  SC_API bool operator <= (const sc_unsigned& u, uint64 v);
563  SC_API bool operator <= (const sc_unsigned& u, long v);
564  SC_API bool operator <= (const sc_unsigned& u, unsigned long v);
565  inline bool operator <= (const sc_unsigned& u, int v);
566  inline bool operator <= (const sc_unsigned& u, unsigned int v);
567 
568  SC_API bool operator <= (int64 u, const sc_unsigned& v);
569  SC_API bool operator <= (uint64 u, const sc_unsigned& v);
570  SC_API bool operator <= (long u, const sc_unsigned& v);
571  SC_API bool operator <= (unsigned long u, const sc_unsigned& v);
572  inline bool operator <= (int u, const sc_unsigned& v);
573  inline bool operator <= (unsigned int u, const sc_unsigned& v);
574 
575  SC_API bool operator <= (const sc_unsigned& u, const sc_uint_base& v);
576  SC_API bool operator <= (const sc_unsigned& u, const sc_int_base& v);
577  SC_API bool operator <= (const sc_uint_base& u, const sc_unsigned& v);
578  SC_API bool operator <= (const sc_int_base& u, const sc_unsigned& v);
579 
580  // Logical GREATER_THAN operators:
581 
582  SC_API bool operator > (const sc_unsigned& u, const sc_signed& v);
583  SC_API bool operator > (const sc_signed& u, const sc_unsigned& v);
584 
585  SC_API bool operator > (const sc_unsigned& u, const sc_unsigned& v);
586  SC_API bool operator > (const sc_unsigned& u, int64 v);
587  SC_API bool operator > (const sc_unsigned& u, uint64 v);
588  SC_API bool operator > (const sc_unsigned& u, long v);
589  SC_API bool operator > (const sc_unsigned& u, unsigned long v);
590  inline bool operator > (const sc_unsigned& u, int v);
591  inline bool operator > (const sc_unsigned& u, unsigned int v);
592 
593  SC_API bool operator > (int64 u, const sc_unsigned& v);
594  SC_API bool operator > (uint64 u, const sc_unsigned& v);
595  SC_API bool operator > (long u, const sc_unsigned& v);
596  SC_API bool operator > (unsigned long u, const sc_unsigned& v);
597  inline bool operator > (int u, const sc_unsigned& v);
598  inline bool operator > (unsigned int u, const sc_unsigned& v);
599 
600  SC_API bool operator > (const sc_unsigned& u, const sc_uint_base& v);
601  SC_API bool operator > (const sc_unsigned& u, const sc_int_base& v);
602  SC_API bool operator > (const sc_uint_base& u, const sc_unsigned& v);
603  SC_API bool operator > (const sc_int_base& u, const sc_unsigned& v);
604 
605  // Logical GREATER_THAN_AND_EQUAL operators:
606 
607  SC_API bool operator >= (const sc_unsigned& u, const sc_signed& v);
608  SC_API bool operator >= (const sc_signed& u, const sc_unsigned& v);
609 
610  SC_API bool operator >= (const sc_unsigned& u, const sc_unsigned& v);
611  SC_API bool operator >= (const sc_unsigned& u, int64 v);
612  SC_API bool operator >= (const sc_unsigned& u, uint64 v);
613  SC_API bool operator >= (const sc_unsigned& u, long v);
614  SC_API bool operator >= (const sc_unsigned& u, unsigned long v);
615  inline bool operator >= (const sc_unsigned& u, int v);
616  inline bool operator >= (const sc_unsigned& u, unsigned int v);
617 
618  SC_API bool operator >= (int64 u, const sc_unsigned& v);
619  SC_API bool operator >= (uint64 u, const sc_unsigned& v);
620  SC_API bool operator >= (long u, const sc_unsigned& v);
621  SC_API bool operator >= (unsigned long u, const sc_unsigned& v);
622  inline bool operator >= (int u, const sc_unsigned& v);
623  inline bool operator >= (unsigned int u, const sc_unsigned& v);
624 
625  SC_API bool operator >= (const sc_unsigned& u, const sc_uint_base& v);
626  SC_API bool operator >= (const sc_unsigned& u, const sc_int_base& v);
627  SC_API bool operator >= (const sc_uint_base& u, const sc_unsigned& v);
628  SC_API bool operator >= (const sc_int_base& u, const sc_unsigned& v);
629 
630  // Bitwise NOT operator (unary).
631  SC_API sc_unsigned operator ~ (const sc_unsigned& u);
632 
640 {
641  friend class sc_unsigned;
642 
643 protected:
644 
645  // construction and initialization:
646 
647  sc_unsigned_bitref_r() : sc_value_base(), m_index(0), m_obj_p(0)
648  {}
649 
650  void initialize( const sc_unsigned* obj_p, int index_ )
651  {
652  m_obj_p = const_cast<sc_unsigned*>( obj_p );
653  m_index = index_;
654  }
655 
656 public:
657 
658  // destructor
659 
661  {}
662 
663  // copy constructor
664 
666  : sc_value_base(a), m_index( a.m_index ), m_obj_p( a.m_obj_p )
667  {}
668 
669  // capacity
670 
671  int length() const
672  { return 1; }
673 
674 
675  // implicit conversion to bool
676 
677  operator uint64 () const;
678  bool operator ! () const;
679  bool operator ~ () const;
680 
681 
682  // explicit conversions
683 
684  uint64 value() const
685  { return operator uint64(); }
686 
687  bool to_bool() const
688  { return operator uint64(); }
689 
690 
691  // concatenation support
692 
693  virtual int concat_length(bool* xz_present_p) const
694  { if ( xz_present_p ) *xz_present_p = false; return 1; }
695  virtual uint64 concat_get_uint64() const
696  { return (uint64)operator uint64(); }
697  virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const
698  {
699  int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
700  int word_i = low_i / BITS_PER_DIGIT;
701  dst_p[word_i] &= ~bit_mask;
702  return false;
703  }
704  virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const
705  {
706  int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
707  bool result; // True if non-zero.
708  int word_i = low_i / BITS_PER_DIGIT;
709  if ( operator uint64() )
710  {
711  dst_p[word_i] |= bit_mask;
712  result = true;
713  }
714  else
715  {
716  dst_p[word_i] &= ~bit_mask;
717  result = false;
718  }
719  return result;
720  }
721 
722  // other methods
723 
724  void print( ::std::ostream& os = ::std::cout ) const
725  { os << to_bool(); }
726 
727 protected:
728 
729  int m_index;
731 
732 private:
733 
734  // disabled
735  const sc_unsigned_bitref_r& operator = ( const sc_unsigned_bitref_r& );
736 };
737 
738 
739 
740 inline
741 ::std::ostream&
742 operator << ( ::std::ostream&, const sc_unsigned_bitref_r& );
743 
744 
752  : public sc_unsigned_bitref_r
753 {
754  friend class sc_unsigned;
756 
757 
758 protected: // construction
759 
761  {}
762 
763 public:
764 
765  // copy constructor
766 
768  : sc_unsigned_bitref_r( a )
769  {}
770 
771 
772  // assignment operators
773 
774  const sc_unsigned_bitref& operator = ( const sc_unsigned_bitref_r& );
775  const sc_unsigned_bitref& operator = ( const sc_unsigned_bitref& );
776  const sc_unsigned_bitref& operator = ( bool );
777 
778  const sc_unsigned_bitref& operator &= ( bool );
779  const sc_unsigned_bitref& operator |= ( bool );
780  const sc_unsigned_bitref& operator ^= ( bool );
781 
782  // concatenation methods
783 
784  virtual void concat_set(int64 src, int low_i);
785  virtual void concat_set(const sc_signed& src, int low_i);
786  virtual void concat_set(const sc_unsigned& src, int low_i);
787  virtual void concat_set(uint64 src, int low_i);
788 
789 
790  // other methods
791 
792  void scan( ::std::istream& is = ::std::cin );
793 
794 protected:
796 };
797 
798 
799 
800 inline
801 ::std::istream&
802 operator >> ( ::std::istream&, sc_unsigned_bitref& );
803 
804 
812 {
813  friend class sc_signed;
814  friend class sc_unsigned;
815  friend class sc_unsigned_signal;
816 
817 protected:
818 
819  // constructor
820 
821  sc_unsigned_subref_r() : sc_value_base(), m_left(0), m_obj_p(0), m_right(0)
822  {}
823 
824  void initialize( const sc_unsigned* obj_p, int left_, int right_ )
825  {
826  m_obj_p = const_cast<sc_unsigned*>( obj_p );
827  m_left = left_;
828  m_right = right_;
829  }
830 
831 public:
832 
833  // destructor
834 
836  {}
837 
838 
839  // copy constructor
840 
842  : sc_value_base(a), m_left( a.m_left ), m_obj_p( a.m_obj_p ),
843  m_right( a.m_right )
844  {}
845 
846 
847  // capacity
848 
849  int length() const
850  { return m_left >= m_right ? (m_left-m_right+1) : (m_right-m_left+1 ); }
851 
852 
853  // implicit conversion to sc_unsigned
854 
855  operator sc_unsigned () const;
856 
857 
858  // explicit conversions
859 
860  int to_int() const;
861  unsigned int to_uint() const;
862  long to_long() const;
863  unsigned long to_ulong() const;
864  int64 to_int64() const;
865  uint64 to_uint64() const;
866  double to_double() const;
867 
868 
869  // explicit conversion to character string
870 
871  const std::string to_string( sc_numrep numrep = SC_DEC ) const;
872  const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
873 
874 
875  // concatenation support
876 
877  virtual int concat_length(bool* xz_present_p) const
878  {
879  if ( xz_present_p ) *xz_present_p = false;
880  return m_left - m_right + 1;
881  }
882  virtual uint64 concat_get_uint64() const;
883  virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
884  virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
885 
886  // reduce methods
887 
888  bool and_reduce() const;
889  bool nand_reduce() const;
890  bool or_reduce() const;
891  bool nor_reduce() const;
892  bool xor_reduce() const ;
893  bool xnor_reduce() const;
894 
895  // other methods
896 
897  void print( ::std::ostream& os = ::std::cout ) const
898  { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
899 
900 protected:
901 
902  int m_left; // Left-most bit in this part selection.
903  sc_unsigned* m_obj_p; // Target of this part selection.
904  int m_right; // Right-most bit in this part selection.
905 
906 private:
907 
908  // disabled
909  const sc_unsigned_subref_r& operator = ( const sc_unsigned_subref_r& );
910 };
911 
912 
913 
914 inline
915 ::std::ostream&
916 operator << ( ::std::ostream&, const sc_unsigned_subref_r& );
917 
918 
926  : public sc_unsigned_subref_r
927 {
928  friend class sc_unsigned;
930 
931 
932  // constructor
933 
934 protected:
936  {}
937 
938 public:
939 
940  // copy constructor
941 
943  : sc_unsigned_subref_r( a )
944  {}
945 
946  // assignment operators
947 
948  const sc_unsigned_subref& operator = ( const sc_unsigned_subref_r& a );
949  const sc_unsigned_subref& operator = ( const sc_unsigned_subref& a );
950  const sc_unsigned_subref& operator = ( const sc_unsigned& a );
951 
952  template<class T>
953  const sc_unsigned_subref& operator = ( const sc_generic_base<T>& a );
954  const sc_unsigned_subref& operator = ( const sc_signed_subref_r& a );
955  const sc_unsigned_subref& operator = ( const sc_signed& a );
956 
957  const sc_unsigned_subref& operator = ( const char* a );
958  const sc_unsigned_subref& operator = ( unsigned long a );
959  const sc_unsigned_subref& operator = ( long a );
960 
961  const sc_unsigned_subref& operator = ( unsigned int a )
962  { return operator = ( (unsigned long) a ); }
963 
964  const sc_unsigned_subref& operator = ( int a )
965  { return operator = ( (long) a ); }
966 
967  const sc_unsigned_subref& operator = ( uint64 a );
968  const sc_unsigned_subref& operator = ( int64 a );
969  const sc_unsigned_subref& operator = ( double a );
970  const sc_unsigned_subref& operator = ( const sc_int_base& a );
971  const sc_unsigned_subref& operator = ( const sc_uint_base& a );
972 
973  // concatenation methods
974 
975  virtual void concat_set(int64 src, int low_i);
976  virtual void concat_set(const sc_signed& src, int low_i);
977  virtual void concat_set(const sc_unsigned& src, int low_i);
978  virtual void concat_set(uint64 src, int low_i);
979 
980  // other methods
981 
982  void scan( ::std::istream& is = ::std::cin );
983 
984 protected:
986 };
987 
988 
989 
990 inline
991 ::std::istream&
992 operator >> ( ::std::istream&, sc_unsigned_subref& );
993 
994 
1002 {
1003  friend class sc_concatref;
1004  friend class sc_unsigned_bitref_r;
1005  friend class sc_unsigned_bitref;
1006  friend class sc_unsigned_subref_r;
1007  friend class sc_unsigned_subref;
1008  friend class sc_signed;
1009  friend class sc_signed_subref;
1010  friend class sc_signed_subref_r;
1011 
1012  // Needed for types using sc_unsigned.
1013  typedef bool elemtype;
1014 
1015  void invalid_init( const char* type_name, int nb ) const;
1016 
1017 public:
1018 
1019  // constructors
1020 
1021  explicit sc_unsigned( int nb = sc_length_param().len() );
1022  sc_unsigned( const sc_unsigned& v );
1023  sc_unsigned( const sc_signed& v );
1024  template<class T>
1025  explicit sc_unsigned( const sc_generic_base<T>& v );
1026  explicit sc_unsigned( const sc_bv_base& v );
1027  explicit sc_unsigned( const sc_lv_base& v );
1028  explicit sc_unsigned( const sc_int_subref_r& v );
1029  explicit sc_unsigned( const sc_uint_subref_r& v );
1030  explicit sc_unsigned( const sc_signed_subref_r& v );
1031  explicit sc_unsigned( const sc_unsigned_subref_r& v );
1032 
1033 
1034 
1035  // assignment operators
1036 
1037  const sc_unsigned& operator = (const sc_unsigned& v);
1038  const sc_unsigned& operator = (const sc_unsigned_subref_r& a );
1039 
1040  template<class T>
1041  const sc_unsigned& operator = ( const sc_generic_base<T>& a )
1042  { a->to_sc_unsigned(*this); return *this; }
1043 
1044  const sc_unsigned& operator = (const sc_signed& v);
1045  const sc_unsigned& operator = (const sc_signed_subref_r& a );
1046 
1047  const sc_unsigned& operator = ( const char* v);
1048  const sc_unsigned& operator = ( int64 v);
1049  const sc_unsigned& operator = ( uint64 v);
1050  const sc_unsigned& operator = ( long v);
1051  const sc_unsigned& operator = ( unsigned long v);
1052 
1053  const sc_unsigned& operator = ( int v)
1054  { return operator=((long) v); }
1055 
1056  const sc_unsigned& operator = ( unsigned int v)
1057  { return operator=((unsigned long) v); }
1058 
1059  const sc_unsigned& operator = ( double v);
1060  const sc_unsigned& operator = ( const sc_int_base& v);
1061  const sc_unsigned& operator = ( const sc_uint_base& v);
1062 
1063  const sc_unsigned& operator = ( const sc_bv_base& );
1064  const sc_unsigned& operator = ( const sc_lv_base& );
1065 
1066 #ifdef SC_INCLUDE_FX
1067  const sc_unsigned& operator = ( const sc_fxval& );
1068  const sc_unsigned& operator = ( const sc_fxval_fast& );
1069  const sc_unsigned& operator = ( const sc_fxnum& );
1070  const sc_unsigned& operator = ( const sc_fxnum_fast& );
1071 #endif
1072 
1073 
1074  // destructor
1075 
1076  virtual ~sc_unsigned()
1077  {
1078 # ifndef SC_MAX_NBITS
1079  delete [] digit;
1080 # endif
1081  }
1082 
1083  // Concatenation support:
1084 
1085  sc_digit* get_raw() const { return digit; }
1086  virtual int concat_length(bool* xz_present_p) const
1087  { if ( xz_present_p ) *xz_present_p = false; return nbits-1; }
1088  virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
1089  virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
1090  virtual uint64 concat_get_uint64() const;
1091  virtual void concat_set(int64 src, int low_i);
1092  virtual void concat_set(const sc_signed& src, int low_i);
1093  virtual void concat_set(const sc_unsigned& src, int low_i);
1094  virtual void concat_set(uint64 src, int low_i);
1095 
1096  // Increment operators.
1097 
1098  sc_unsigned& operator ++ ();
1099  const sc_unsigned operator ++ (int);
1100 
1101  // Decrement operators.
1102 
1103  sc_unsigned& operator -- ();
1104  const sc_unsigned operator -- (int);
1105 
1106 
1107  // bit selection
1108 
1109  inline void check_index( int i ) const
1110  { if ( (i < 0) || (i >= nbits-1) ) invalid_index(i); }
1111 
1112  void invalid_index( int i ) const;
1113 
1114  sc_unsigned_bitref& operator [] ( int i )
1115  {
1116  check_index(i);
1117  sc_unsigned_bitref* result_p =
1118  sc_unsigned_bitref::m_pool.allocate();
1119  result_p->initialize( this, i );
1120  return *result_p;
1121  }
1122 
1123  const sc_unsigned_bitref_r& operator [] ( int i ) const
1124  {
1125  check_index(i);
1126  sc_unsigned_bitref* result_p =
1127  sc_unsigned_bitref::m_pool.allocate();
1128  result_p->initialize( this, i );
1129  return *result_p;
1130  }
1131 
1133  {
1134  check_index(i);
1135  sc_unsigned_bitref* result_p =
1136  sc_unsigned_bitref::m_pool.allocate();
1137  result_p->initialize( this, i );
1138  return *result_p;
1139  }
1140 
1141  const sc_unsigned_bitref_r& bit( int i ) const
1142  {
1143  check_index(i);
1144  sc_unsigned_bitref* result_p =
1145  sc_unsigned_bitref::m_pool.allocate();
1146  result_p->initialize( this, i );
1147  return *result_p;
1148  }
1149 
1150 
1151  // part selection
1152 
1153  // Subref operators. Help access the range of bits from the ith to
1154  // jth. These indices have arbitrary precedence with respect to each
1155  // other, i.e., we can have i <= j or i > j. Note the equivalence
1156  // between range(i, j) and operator (i, j). Also note that
1157  // operator (i, i) returns an unsigned number that corresponds to the
1158  // bit operator [i], so these two forms are not the same.
1159 
1160  inline void check_range( int l, int r ) const
1161  {
1162  if ( l < r )
1163  {
1164  if ( (l < 0) || (r >= nbits-1) ) invalid_range(l,r);
1165  }
1166  else
1167  {
1168  if ( (r < 0) || (l >= nbits-1) ) invalid_range(l,r);
1169  }
1170  }
1171 
1172  void invalid_range( int l, int r ) const;
1173 
1174  sc_unsigned_subref& range( int i, int j )
1175  {
1176  check_range(i,j);
1177  sc_unsigned_subref* result_p =
1178  sc_unsigned_subref::m_pool.allocate();
1179  result_p->initialize( this, i, j );
1180  return *result_p;
1181  }
1182 
1183  const sc_unsigned_subref_r& range( int i, int j ) const
1184  {
1185  check_range(i,j);
1186  sc_unsigned_subref* result_p =
1187  sc_unsigned_subref::m_pool.allocate();
1188  result_p->initialize( this, i, j );
1189  return *result_p;
1190  }
1191 
1192  sc_unsigned_subref& operator () ( int i, int j )
1193  {
1194  check_range(i,j);
1195  sc_unsigned_subref* result_p =
1196  sc_unsigned_subref::m_pool.allocate();
1197  result_p->initialize( this, i, j );
1198  return *result_p;
1199  }
1200 
1201  const sc_unsigned_subref_r& operator () ( int i, int j ) const
1202  {
1203  check_range(i,j);
1204  sc_unsigned_subref* result_p =
1205  sc_unsigned_subref::m_pool.allocate();
1206  result_p->initialize( this, i, j );
1207  return *result_p;
1208  }
1209 
1210  // explicit conversions
1211 
1212  int to_int() const;
1213  unsigned int to_uint() const;
1214  long to_long() const;
1215  unsigned long to_ulong() const;
1216  int64 to_int64() const;
1217  uint64 to_uint64() const;
1218  double to_double() const;
1219 
1220 #ifdef SC_DT_DEPRECATED
1221  int to_signed() const
1222  { return to_int(); }
1223 
1224  unsigned int to_unsigned() const
1225  { return to_uint(); }
1226 #endif
1227 
1228  // explicit conversion to character string
1229 
1230  const std::string to_string( sc_numrep numrep = SC_DEC ) const;
1231  const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
1232 
1233  // Print functions. dump prints the internals of the class.
1234 
1235  void print( ::std::ostream& os = ::std::cout ) const
1236  { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
1237 
1238  void scan( ::std::istream& is = ::std::cin );
1239 
1240  void dump( ::std::ostream& os = ::std::cout ) const;
1241 
1242 
1243  // Functions to find various properties.
1244  int length() const { return nbits - 1; } // Bit width.
1245  bool iszero() const; // Is the number zero?
1246  bool sign() const { return 0; } // Sign.
1247 
1248  // reduce methods
1249 
1250  bool and_reduce() const;
1251 
1252  bool nand_reduce() const
1253  { return ( ! and_reduce() ); }
1254 
1255  bool or_reduce() const;
1256 
1257  bool nor_reduce() const
1258  { return ( ! or_reduce() ); }
1259 
1260  bool xor_reduce() const;
1261 
1262  bool xnor_reduce() const
1263  { return ( ! xor_reduce() ); }
1264 
1265 
1266  // Functions to access individual bits.
1267  bool test(int i) const; // Is the ith bit 0 or 1?
1268  void set(int i); // Set the ith bit to 1.
1269  void clear(int i); // Set the ith bit to 0.
1270  void set(int i, bool v) // Set the ith bit to v.
1271  { if (v) set(i); else clear(i); }
1272  void invert(int i) // Negate the ith bit.
1273  { if (test(i)) clear(i); else set(i); }
1274 
1275  // Make the number equal to its mirror image.
1276  void reverse();
1277 
1278  // Get/set a packed bit representation of the number.
1279  void get_packed_rep(sc_digit *buf) const;
1280  void set_packed_rep(sc_digit *buf);
1281 
1282  /*
1283  The comparison of the old and new semantics are as follows:
1284 
1285  Let s = sc_signed,
1286  u = sc_unsigned,
1287  un = { uint64, unsigned long, unsigned int },
1288  sn = { int64, long, int, char* }, and
1289  OP = { +, -, *, /, % }.
1290 
1291  Old semantics: New semantics:
1292  u OP u -> u u OP u -> u
1293  s OP u -> u s OP u -> s
1294  u OP s -> u u OP s -> s
1295  s OP s -> s s OP s -> s
1296 
1297  u OP un = un OP u -> u u OP un = un OP u -> u
1298  u OP sn = sn OP u -> u u OP sn = sn OP u -> s
1299 
1300  s OP un = un OP s -> s s OP un = un OP s -> s
1301  s OP sn = sn OP s -> s s OP sn = sn OP s -> s
1302 
1303  In the new semantics, the result is u if both operands are u; the
1304  result is s otherwise. The only exception is subtraction. The result
1305  of a subtraction is always s.
1306 
1307  The old semantics is like C/C++ semantics on integer types; the
1308  new semantics is due to the VSIA C/C++ data types standard.
1309  */
1310 
1311  // ARITHMETIC OPERATORS:
1312 
1313  // ADDition operators:
1314 
1315  friend SC_API sc_signed operator + (const sc_unsigned& u, const sc_signed& v);
1316  friend SC_API sc_signed operator + (const sc_signed& u, const sc_unsigned& v);
1317 
1318  friend SC_API sc_unsigned operator + (const sc_unsigned& u, const sc_unsigned& v);
1319  friend SC_API sc_signed operator + (const sc_unsigned& u, int64 v);
1320  friend SC_API sc_unsigned operator + (const sc_unsigned& u, uint64 v);
1321  friend SC_API sc_signed operator + (const sc_unsigned& u, long v);
1322  friend SC_API sc_unsigned operator + (const sc_unsigned& u, unsigned long v);
1323  friend SC_API sc_signed operator + (const sc_unsigned& u, int v);
1324  friend sc_unsigned operator + (const sc_unsigned& u, unsigned int v)
1325  { return operator+(u, (unsigned long) v); }
1326 
1327  friend SC_API sc_signed operator + (int64 u, const sc_unsigned& v);
1328  friend SC_API sc_unsigned operator + (uint64 u, const sc_unsigned& v);
1329  friend SC_API sc_signed operator + (long u, const sc_unsigned& v);
1330  friend SC_API sc_unsigned operator + (unsigned long u, const sc_unsigned& v);
1331  friend SC_API sc_signed operator + (int u, const sc_unsigned& v);
1332  friend sc_unsigned operator + (unsigned int u, const sc_unsigned& v)
1333  { return operator+((unsigned long) u, v); }
1334 
1335  const sc_unsigned& operator += (const sc_signed& v);
1336  const sc_unsigned& operator += (const sc_unsigned& v);
1337  const sc_unsigned& operator += (int64 v);
1338  const sc_unsigned& operator += (uint64 v);
1339  const sc_unsigned& operator += (long v);
1340  const sc_unsigned& operator += (unsigned long v);
1341  const sc_unsigned& operator += (int v)
1342  { return operator+=((long) v); }
1343  const sc_unsigned& operator += (unsigned int v)
1344  { return operator+=((unsigned long) v); }
1345 
1346  friend SC_API sc_unsigned operator + (const sc_unsigned& u, const sc_uint_base& v);
1347  friend SC_API sc_signed operator + (const sc_unsigned& u, const sc_int_base& v);
1348  friend SC_API sc_unsigned operator + (const sc_uint_base& u, const sc_unsigned& v);
1349  friend SC_API sc_signed operator + (const sc_int_base& u, const sc_unsigned& v);
1350  const sc_unsigned& operator += (const sc_int_base& v);
1351  const sc_unsigned& operator += (const sc_uint_base& v);
1352 
1353  // SUBtraction operators:
1354 
1355  friend SC_API sc_signed operator - (const sc_unsigned& u, const sc_signed& v);
1356  friend SC_API sc_signed operator - (const sc_signed& u, const sc_unsigned& v);
1357 
1358  friend SC_API sc_signed operator - (const sc_unsigned& u, const sc_unsigned& v);
1359  friend SC_API sc_signed operator - (const sc_unsigned& u, int64 v);
1360  friend SC_API sc_signed operator - (const sc_unsigned& u, uint64 v);
1361  friend SC_API sc_signed operator - (const sc_unsigned& u, long v);
1362  friend SC_API sc_signed operator - (const sc_unsigned& u, unsigned long v);
1363  friend SC_API sc_signed operator - (const sc_unsigned& u, int v);
1364  friend SC_API sc_signed operator - (const sc_unsigned& u, unsigned int v);
1365 
1366  friend SC_API sc_signed operator - (int64 u, const sc_unsigned& v);
1367  friend SC_API sc_signed operator - (uint64 u, const sc_unsigned& v);
1368  friend SC_API sc_signed operator - (long u, const sc_unsigned& v);
1369  friend SC_API sc_signed operator - (unsigned long u, const sc_unsigned& v);
1370  friend SC_API sc_signed operator - (int u, const sc_unsigned& v);
1371  friend SC_API sc_signed operator - (unsigned int u, const sc_unsigned& v);
1372 
1373  const sc_unsigned& operator -= (const sc_signed& v);
1374  const sc_unsigned& operator -= (const sc_unsigned& v);
1375  const sc_unsigned& operator -= (int64 v);
1376  const sc_unsigned& operator -= (uint64 v);
1377  const sc_unsigned& operator -= (long v);
1378  const sc_unsigned& operator -= (unsigned long v);
1379  const sc_unsigned& operator -= (int v)
1380  { return operator-=((long) v); }
1381  const sc_unsigned& operator -= (unsigned int v)
1382  { return operator-=((unsigned long) v); }
1383 
1384  friend SC_API sc_signed operator - (const sc_unsigned& u, const sc_uint_base& v);
1385  friend SC_API sc_signed operator - (const sc_unsigned& u, const sc_int_base& v);
1386  friend SC_API sc_signed operator - (const sc_uint_base& u, const sc_unsigned& v);
1387  friend SC_API sc_signed operator - (const sc_int_base& u, const sc_unsigned& v);
1388  const sc_unsigned& operator -= (const sc_int_base& v);
1389  const sc_unsigned& operator -= (const sc_uint_base& v);
1390 
1391  // MULtiplication operators:
1392 
1393  friend SC_API sc_signed operator * (const sc_unsigned& u, const sc_signed& v);
1394  friend SC_API sc_signed operator * (const sc_signed& u, const sc_unsigned& v);
1395 
1396  friend SC_API sc_unsigned operator * (const sc_unsigned& u, const sc_unsigned& v);
1397  friend SC_API sc_signed operator * (const sc_unsigned& u, int64 v);
1398  friend SC_API sc_unsigned operator * (const sc_unsigned& u, uint64 v);
1399  friend SC_API sc_signed operator * (const sc_unsigned& u, long v);
1400  friend SC_API sc_unsigned operator * (const sc_unsigned& u, unsigned long v);
1401  friend SC_API sc_signed operator * (const sc_unsigned& u, int v);
1402  friend sc_unsigned operator * (const sc_unsigned& u, unsigned int v)
1403  { return operator*(u, (unsigned long) v); }
1404 
1405  friend SC_API sc_signed operator * (int64 u, const sc_unsigned& v);
1406  friend SC_API sc_unsigned operator * (uint64 u, const sc_unsigned& v);
1407  friend SC_API sc_signed operator * (long u, const sc_unsigned& v);
1408  friend SC_API sc_unsigned operator * (unsigned long u, const sc_unsigned& v);
1409  friend SC_API sc_signed operator * (int u, const sc_unsigned& v);
1410  friend sc_unsigned operator * (unsigned int u, const sc_unsigned& v)
1411  { return operator*((unsigned long) u, v); }
1412 
1413  const sc_unsigned& operator *= (const sc_signed& v);
1414  const sc_unsigned& operator *= (const sc_unsigned& v);
1415  const sc_unsigned& operator *= (int64 v);
1416  const sc_unsigned& operator *= (uint64 v);
1417  const sc_unsigned& operator *= (long v);
1418  const sc_unsigned& operator *= (unsigned long v);
1419  const sc_unsigned& operator *= (int v)
1420  { return operator*=((long) v); }
1421  const sc_unsigned& operator *= (unsigned int v)
1422  { return operator*=((unsigned long) v); }
1423 
1424  friend SC_API sc_unsigned operator * (const sc_unsigned& u, const sc_uint_base& v);
1425  friend SC_API sc_signed operator * (const sc_unsigned& u, const sc_int_base& v);
1426  friend SC_API sc_unsigned operator * (const sc_uint_base& u, const sc_unsigned& v);
1427  friend SC_API sc_signed operator * (const sc_int_base& u, const sc_unsigned& v);
1428  const sc_unsigned& operator *= (const sc_int_base& v);
1429  const sc_unsigned& operator *= (const sc_uint_base& v);
1430 
1431  // DIVision operators:
1432 
1433  friend SC_API sc_signed operator / (const sc_unsigned& u, const sc_signed& v);
1434  friend SC_API sc_signed operator / (const sc_signed& u, const sc_unsigned& v);
1435 
1436  friend SC_API sc_unsigned operator / (const sc_unsigned& u, const sc_unsigned& v);
1437  friend SC_API sc_signed operator / (const sc_unsigned& u, int64 v);
1438  friend SC_API sc_unsigned operator / (const sc_unsigned& u, uint64 v);
1439  friend SC_API sc_signed operator / (const sc_unsigned& u, long v);
1440  friend SC_API sc_unsigned operator / (const sc_unsigned& u, unsigned long v);
1441  friend SC_API sc_signed operator / (const sc_unsigned& u, int v);
1442  friend sc_unsigned operator / (const sc_unsigned& u, unsigned int v)
1443  { return operator/(u, (unsigned long) v); }
1444 
1445  friend SC_API sc_signed operator / (int64 u, const sc_unsigned& v);
1446  friend SC_API sc_unsigned operator / (uint64 u, const sc_unsigned& v);
1447  friend SC_API sc_signed operator / (long u, const sc_unsigned& v);
1448  friend SC_API sc_unsigned operator / (unsigned long u, const sc_unsigned& v);
1449  friend SC_API sc_signed operator / (int u, const sc_unsigned& v);
1450  friend sc_unsigned operator / (unsigned int u, const sc_unsigned& v)
1451  { return operator/((unsigned long) u, v); }
1452 
1453  const sc_unsigned& operator /= (const sc_signed& v);
1454  const sc_unsigned& operator /= (const sc_unsigned& v);
1455  const sc_unsigned& operator /= (int64 v);
1456  const sc_unsigned& operator /= (uint64 v);
1457  const sc_unsigned& operator /= (long v);
1458  const sc_unsigned& operator /= (unsigned long v);
1459  const sc_unsigned& operator /= (int v)
1460  { return operator/=((long) v); }
1461  const sc_unsigned& operator /= (unsigned int v)
1462  { return operator/=((unsigned long) v); }
1463 
1464  friend SC_API sc_unsigned operator / (const sc_unsigned& u, const sc_uint_base& v);
1465  friend SC_API sc_signed operator / (const sc_unsigned& u, const sc_int_base& v);
1466  friend SC_API sc_unsigned operator / (const sc_uint_base& u, const sc_unsigned& v);
1467  friend SC_API sc_signed operator / (const sc_int_base& u, const sc_unsigned& v);
1468  const sc_unsigned& operator /= (const sc_int_base& v);
1469  const sc_unsigned& operator /= (const sc_uint_base& v);
1470 
1471  // MODulo operators:
1472 
1473  friend SC_API sc_signed operator % (const sc_unsigned& u, const sc_signed& v);
1474  friend SC_API sc_signed operator % (const sc_signed& u, const sc_unsigned& v);
1475 
1476  friend SC_API sc_unsigned operator % (const sc_unsigned& u, const sc_unsigned& v);
1477  friend SC_API sc_signed operator % (const sc_unsigned& u, int64 v);
1478  friend SC_API sc_unsigned operator % (const sc_unsigned& u, uint64 v);
1479  friend SC_API sc_signed operator % (const sc_unsigned& u, long v);
1480  friend SC_API sc_unsigned operator % (const sc_unsigned& u, unsigned long v);
1481  friend SC_API sc_signed operator % (const sc_unsigned& u, int v);
1482  friend sc_unsigned operator % (const sc_unsigned& u, unsigned int v)
1483  { return operator%(u, (unsigned long) v); }
1484 
1485  friend SC_API sc_signed operator % (int64 u, const sc_unsigned& v);
1486  friend SC_API sc_unsigned operator % (uint64 u, const sc_unsigned& v);
1487  friend SC_API sc_signed operator % (long u, const sc_unsigned& v);
1488  friend SC_API sc_unsigned operator % (unsigned long u, const sc_unsigned& v);
1489  friend SC_API sc_signed operator % (int u, const sc_unsigned& v);
1490  friend sc_unsigned operator % (unsigned int u, const sc_unsigned& v)
1491  { return operator%((unsigned long) u, v); }
1492 
1493  const sc_unsigned& operator %= (const sc_signed& v);
1494  const sc_unsigned& operator %= (const sc_unsigned& v);
1495  const sc_unsigned& operator %= (int64 v);
1496  const sc_unsigned& operator %= (uint64 v);
1497  const sc_unsigned& operator %= (long v);
1498  const sc_unsigned& operator %= (unsigned long v);
1499  const sc_unsigned& operator %= (int v)
1500  { return operator%=((long) v); }
1501  const sc_unsigned& operator %= (unsigned int v)
1502  { return operator%=((unsigned long) v); }
1503 
1504  friend SC_API sc_unsigned operator % (const sc_unsigned& u, const sc_uint_base& v);
1505  friend SC_API sc_signed operator % (const sc_unsigned& u, const sc_int_base& v);
1506  friend SC_API sc_unsigned operator % (const sc_uint_base& u, const sc_unsigned& v);
1507  friend SC_API sc_signed operator % (const sc_int_base& u, const sc_unsigned& v);
1508  const sc_unsigned& operator %= (const sc_int_base& v);
1509  const sc_unsigned& operator %= (const sc_uint_base& v);
1510 
1511  // BITWISE OPERATORS:
1512 
1513  // Bitwise AND operators:
1514 
1515  friend SC_API sc_signed operator & (const sc_unsigned& u, const sc_signed& v);
1516  friend SC_API sc_signed operator & (const sc_signed& u, const sc_unsigned& v);
1517 
1518  friend SC_API sc_unsigned operator & (const sc_unsigned& u, const sc_unsigned& v);
1519  friend SC_API sc_signed operator & (const sc_unsigned& u, int64 v);
1520  friend SC_API sc_unsigned operator & (const sc_unsigned& u, uint64 v);
1521  friend SC_API sc_signed operator & (const sc_unsigned& u, long v);
1522  friend SC_API sc_unsigned operator & (const sc_unsigned& u, unsigned long v);
1523  friend SC_API sc_signed operator & (const sc_unsigned& u, int v);
1524  friend sc_unsigned operator & (const sc_unsigned& u, unsigned int v)
1525  { return operator&(u, (unsigned long) v); }
1526 
1527  friend SC_API sc_signed operator & (int64 u, const sc_unsigned& v);
1528  friend SC_API sc_unsigned operator & (uint64 u, const sc_unsigned& v);
1529  friend SC_API sc_signed operator & (long u, const sc_unsigned& v);
1530  friend SC_API sc_unsigned operator & (unsigned long u, const sc_unsigned& v);
1531  friend SC_API sc_signed operator & (int u, const sc_unsigned& v);
1532  friend sc_unsigned operator & (unsigned int u, const sc_unsigned& v)
1533  { return operator&((unsigned long) u, v); }
1534 
1535  const sc_unsigned& operator &= (const sc_signed& v);
1536  const sc_unsigned& operator &= (const sc_unsigned& v);
1537  const sc_unsigned& operator &= (int64 v);
1538  const sc_unsigned& operator &= (uint64 v);
1539  const sc_unsigned& operator &= (long v);
1540  const sc_unsigned& operator &= (unsigned long v);
1542  { return operator&=((long) v); }
1543  const sc_unsigned& operator &= (unsigned int v)
1544  { return operator&=((unsigned long) v); }
1545 
1546  friend SC_API sc_unsigned operator & (const sc_unsigned& u, const sc_uint_base& v);
1547  friend SC_API sc_signed operator & (const sc_unsigned& u, const sc_int_base& v);
1548  friend SC_API sc_unsigned operator & (const sc_uint_base& u, const sc_unsigned& v);
1549  friend SC_API sc_signed operator & (const sc_int_base& u, const sc_unsigned& v);
1550  const sc_unsigned& operator &= (const sc_int_base& v);
1551  const sc_unsigned& operator &= (const sc_uint_base& v);
1552 
1553  // Bitwise OR operators:
1554 
1555  friend SC_API sc_signed operator | (const sc_unsigned& u, const sc_signed& v);
1556  friend SC_API sc_signed operator | (const sc_signed& u, const sc_unsigned& v);
1557 
1558  friend SC_API sc_unsigned operator | (const sc_unsigned& u, const sc_unsigned& v);
1559  friend SC_API sc_signed operator | (const sc_unsigned& u, int64 v);
1560  friend SC_API sc_unsigned operator | (const sc_unsigned& u, uint64 v);
1561  friend SC_API sc_signed operator | (const sc_unsigned& u, long v);
1562  friend SC_API sc_unsigned operator | (const sc_unsigned& u, unsigned long v);
1563  friend SC_API sc_signed operator | (const sc_unsigned& u, int v);
1564  friend sc_unsigned operator | (const sc_unsigned& u, unsigned int v)
1565  { return operator|(u, (unsigned long) v); }
1566 
1567  friend SC_API sc_signed operator | (int64 u, const sc_unsigned& v);
1568  friend SC_API sc_unsigned operator | (uint64 u, const sc_unsigned& v);
1569  friend SC_API sc_signed operator | (long u, const sc_unsigned& v);
1570  friend SC_API sc_unsigned operator | (unsigned long u, const sc_unsigned& v);
1571  friend SC_API sc_signed operator | (int u, const sc_unsigned& v);
1572  friend sc_unsigned operator | (unsigned int u, const sc_unsigned& v)
1573  { return operator|((unsigned long) u, v); }
1574 
1575  const sc_unsigned& operator |= (const sc_signed& v);
1576  const sc_unsigned& operator |= (const sc_unsigned& v);
1577  const sc_unsigned& operator |= (int64 v);
1578  const sc_unsigned& operator |= (uint64 v);
1579  const sc_unsigned& operator |= (long v);
1580  const sc_unsigned& operator |= (unsigned long v);
1582  { return operator|=((long) v); }
1583  const sc_unsigned& operator |= (unsigned int v)
1584  { return operator|=((unsigned long) v); }
1585 
1586  friend SC_API sc_unsigned operator | (const sc_unsigned& u, const sc_uint_base& v);
1587  friend SC_API sc_signed operator | (const sc_unsigned& u, const sc_int_base& v);
1588  friend SC_API sc_unsigned operator | (const sc_uint_base& u, const sc_unsigned& v);
1589  friend SC_API sc_signed operator | (const sc_int_base& u, const sc_unsigned& v);
1590  const sc_unsigned& operator |= (const sc_int_base& v);
1591  const sc_unsigned& operator |= (const sc_uint_base& v);
1592 
1593  // Bitwise XOR operators:
1594 
1595  friend SC_API sc_signed operator ^ (const sc_unsigned& u, const sc_signed& v);
1596  friend SC_API sc_signed operator ^ (const sc_signed& u, const sc_unsigned& v);
1597 
1598  friend SC_API sc_unsigned operator ^ (const sc_unsigned& u, const sc_unsigned& v);
1599  friend SC_API sc_signed operator ^ (const sc_unsigned& u, int64 v);
1600  friend SC_API sc_unsigned operator ^ (const sc_unsigned& u, uint64 v);
1601  friend SC_API sc_signed operator ^ (const sc_unsigned& u, long v);
1602  friend SC_API sc_unsigned operator ^ (const sc_unsigned& u, unsigned long v);
1603  friend SC_API sc_signed operator ^ (const sc_unsigned& u, int v);
1604  friend sc_unsigned operator ^ (const sc_unsigned& u, unsigned int v)
1605  { return operator^(u, (unsigned long) v); }
1606 
1607  friend SC_API sc_signed operator ^ (int64 u, const sc_unsigned& v);
1608  friend SC_API sc_unsigned operator ^ (uint64 u, const sc_unsigned& v);
1609  friend SC_API sc_signed operator ^ (long u, const sc_unsigned& v);
1610  friend SC_API sc_unsigned operator ^ (unsigned long u, const sc_unsigned& v);
1611  friend SC_API sc_signed operator ^ (int u, const sc_unsigned& v);
1612  friend sc_unsigned operator ^ (unsigned int u, const sc_unsigned& v)
1613  { return operator^((unsigned long) u, v); }
1614 
1615  const sc_unsigned& operator ^= (const sc_signed& v);
1616  const sc_unsigned& operator ^= (const sc_unsigned& v);
1617  const sc_unsigned& operator ^= (int64 v);
1618  const sc_unsigned& operator ^= (uint64 v);
1619  const sc_unsigned& operator ^= (long v);
1620  const sc_unsigned& operator ^= (unsigned long v);
1622  { return operator^=((long) v); }
1623  const sc_unsigned& operator ^= (unsigned int v)
1624  { return operator^=((unsigned long) v); }
1625 
1626  friend SC_API sc_unsigned operator ^ (const sc_unsigned& u, const sc_uint_base& v);
1627  friend SC_API sc_signed operator ^ (const sc_unsigned& u, const sc_int_base& v);
1628  friend SC_API sc_unsigned operator ^ (const sc_uint_base& u, const sc_unsigned& v);
1629  friend SC_API sc_signed operator ^ (const sc_int_base& u, const sc_unsigned& v);
1630  const sc_unsigned& operator ^= (const sc_int_base& v);
1631  const sc_unsigned& operator ^= (const sc_uint_base& v);
1632 
1633  // SHIFT OPERATORS:
1634 
1635  // LEFT SHIFT operators:
1636 
1637  friend SC_API sc_unsigned operator << (const sc_unsigned& u, const sc_signed& v);
1638  friend SC_API sc_signed operator << (const sc_signed& u, const sc_unsigned& v);
1639 
1640  friend SC_API sc_unsigned operator << (const sc_unsigned& u, const sc_unsigned& v);
1641  friend SC_API sc_unsigned operator << (const sc_unsigned& u, int64 v);
1642  friend SC_API sc_unsigned operator << (const sc_unsigned& u, uint64 v);
1643  friend SC_API sc_unsigned operator << (const sc_unsigned& u, long v);
1644  friend SC_API sc_unsigned operator << (const sc_unsigned& u, unsigned long v);
1645  friend sc_unsigned operator << (const sc_unsigned& u, int v)
1646  { return operator<<(u, (long) v); }
1647  friend sc_unsigned operator << (const sc_unsigned& u, unsigned int v)
1648  { return operator<<(u, (unsigned long) v); }
1649 
1650  const sc_unsigned& operator <<= (const sc_signed& v);
1651  const sc_unsigned& operator <<= (const sc_unsigned& v);
1652  const sc_unsigned& operator <<= (int64 v);
1653  const sc_unsigned& operator <<= (uint64 v);
1654  const sc_unsigned& operator <<= (long v);
1655  const sc_unsigned& operator <<= (unsigned long v);
1656  const sc_unsigned& operator <<= (int v)
1657  { return operator<<=((long) v); }
1658  const sc_unsigned& operator <<= (unsigned int v)
1659  { return operator<<=((unsigned long) v); }
1660 
1661  friend SC_API sc_unsigned operator << (const sc_unsigned& u, const sc_uint_base& v);
1662  friend SC_API sc_unsigned operator << (const sc_unsigned& u, const sc_int_base& v);
1663  const sc_unsigned& operator <<= (const sc_int_base& v);
1664  const sc_unsigned& operator <<= (const sc_uint_base& v);
1665 
1666  // RIGHT SHIFT operators:
1667 
1668  friend SC_API sc_unsigned operator >> (const sc_unsigned& u, const sc_signed& v);
1669  friend SC_API sc_signed operator >> (const sc_signed& u, const sc_unsigned& v);
1670 
1671  friend SC_API sc_unsigned operator >> (const sc_unsigned& u, const sc_unsigned& v);
1672  friend SC_API sc_unsigned operator >> (const sc_unsigned& u, int64 v);
1673  friend SC_API sc_unsigned operator >> (const sc_unsigned& u, uint64 v);
1674  friend SC_API sc_unsigned operator >> (const sc_unsigned& u, long v);
1675  friend SC_API sc_unsigned operator >> (const sc_unsigned& u, unsigned long v);
1676  friend sc_unsigned operator >> (const sc_unsigned& u, int v)
1677  { return operator>>(u, (long) v); }
1678  friend sc_unsigned operator >> (const sc_unsigned& u, unsigned int v)
1679  { return operator>>(u, (unsigned long) v); }
1680 
1681  const sc_unsigned& operator >>= (const sc_signed& v);
1682  const sc_unsigned& operator >>= (const sc_unsigned& v);
1683  const sc_unsigned& operator >>= (int64 v);
1684  const sc_unsigned& operator >>= (uint64 v);
1685  const sc_unsigned& operator >>= (long v);
1686  const sc_unsigned& operator >>= (unsigned long v);
1687  const sc_unsigned& operator >>= (int v)
1688  { return operator>>=((long) v); }
1689  const sc_unsigned& operator >>= (unsigned int v)
1690  { return operator>>=((unsigned long) v); }
1691 
1692  friend SC_API sc_unsigned operator >> ( const sc_unsigned& , const sc_uint_base& );
1693  friend SC_API sc_unsigned operator >> ( const sc_unsigned&, const sc_int_base& );
1694  const sc_unsigned& operator >>= (const sc_int_base& v);
1695  const sc_unsigned& operator >>= (const sc_uint_base& v);
1696 
1697  // Unary arithmetic operators
1698  friend SC_API sc_unsigned operator + (const sc_unsigned& u);
1699  friend SC_API sc_signed operator - (const sc_unsigned& u);
1700 
1701  // LOGICAL OPERATORS:
1702 
1703  // Logical EQUAL operators:
1704 
1705  friend SC_API bool operator == (const sc_unsigned& u, const sc_signed& v);
1706  friend SC_API bool operator == (const sc_signed& u, const sc_unsigned& v);
1707 
1708  friend SC_API bool operator == (const sc_unsigned& u, const sc_unsigned& v);
1709  friend SC_API bool operator == (const sc_unsigned& u, int64 v);
1710  friend SC_API bool operator == (const sc_unsigned& u, uint64 v);
1711  friend SC_API bool operator == (const sc_unsigned& u, long v);
1712  friend SC_API bool operator == (const sc_unsigned& u, unsigned long v);
1713  friend bool operator == (const sc_unsigned& u, int v)
1714  { return operator==(u, (long) v); }
1715  friend bool operator == (const sc_unsigned& u, unsigned int v)
1716  { return operator==(u, (unsigned long) v); }
1717 
1718  friend SC_API bool operator == (int64 u, const sc_unsigned& v);
1719  friend SC_API bool operator == (uint64 u, const sc_unsigned& v);
1720  friend SC_API bool operator == (long u, const sc_unsigned& v);
1721  friend SC_API bool operator == (unsigned long u, const sc_unsigned& v);
1722  friend bool operator == (int u, const sc_unsigned& v)
1723  { return operator==((long) u, v); }
1724  friend bool operator == (unsigned int u, const sc_unsigned& v)
1725  { return operator==((unsigned long) u, v); }
1726 
1727  friend SC_API bool operator == (const sc_unsigned& u, const sc_uint_base& v);
1728  friend SC_API bool operator == (const sc_unsigned& u, const sc_int_base& v);
1729  friend SC_API bool operator == (const sc_uint_base& u, const sc_unsigned& v);
1730  friend SC_API bool operator == (const sc_int_base& u, const sc_unsigned& v);
1731 
1732  // Logical NOT_EQUAL operators:
1733 
1734  friend SC_API bool operator != (const sc_unsigned& u, const sc_signed& v);
1735  friend SC_API bool operator != (const sc_signed& u, const sc_unsigned& v);
1736 
1737  friend SC_API bool operator != (const sc_unsigned& u, const sc_unsigned& v);
1738  friend SC_API bool operator != (const sc_unsigned& u, int64 v);
1739  friend SC_API bool operator != (const sc_unsigned& u, uint64 v);
1740  friend SC_API bool operator != (const sc_unsigned& u, long v);
1741  friend SC_API bool operator != (const sc_unsigned& u, unsigned long v);
1742  friend bool operator != (const sc_unsigned& u, int v)
1743  { return operator!=(u, (long) v); }
1744  friend bool operator != (const sc_unsigned& u, unsigned int v)
1745  { return operator!=(u, (unsigned long) v); }
1746 
1747  friend SC_API bool operator != (int64 u, const sc_unsigned& v);
1748  friend SC_API bool operator != (uint64 u, const sc_unsigned& v);
1749  friend SC_API bool operator != (long u, const sc_unsigned& v);
1750  friend SC_API bool operator != (unsigned long u, const sc_unsigned& v);
1751  friend bool operator != (int u, const sc_unsigned& v)
1752  { return operator!=((long) u, v); }
1753  friend bool operator != (unsigned int u, const sc_unsigned& v)
1754  { return operator!=((unsigned long) u, v); }
1755 
1756  friend SC_API bool operator != (const sc_unsigned& u, const sc_uint_base& v);
1757  friend SC_API bool operator != (const sc_unsigned& u, const sc_int_base& v);
1758  friend SC_API bool operator != (const sc_uint_base& u, const sc_unsigned& v);
1759  friend SC_API bool operator != (const sc_int_base& u, const sc_unsigned& v);
1760 
1761  // Logical LESS_THAN operators:
1762 
1763  friend SC_API bool operator < (const sc_unsigned& u, const sc_signed& v);
1764  friend SC_API bool operator < (const sc_signed& u, const sc_unsigned& v);
1765 
1766  friend SC_API bool operator < (const sc_unsigned& u, const sc_unsigned& v);
1767  friend SC_API bool operator < (const sc_unsigned& u, int64 v);
1768  friend SC_API bool operator < (const sc_unsigned& u, uint64 v);
1769  friend SC_API bool operator < (const sc_unsigned& u, long v);
1770  friend SC_API bool operator < (const sc_unsigned& u, unsigned long v);
1771  friend bool operator < (const sc_unsigned& u, int v)
1772  { return operator<(u, (long) v); }
1773  friend bool operator < (const sc_unsigned& u, unsigned int v)
1774  { return operator<(u, (unsigned long) v); }
1775 
1776  friend SC_API bool operator < (int64 u, const sc_unsigned& v);
1777  friend SC_API bool operator < (uint64 u, const sc_unsigned& v);
1778  friend SC_API bool operator < (long u, const sc_unsigned& v);
1779  friend SC_API bool operator < (unsigned long u, const sc_unsigned& v);
1780  friend bool operator < (int u, const sc_unsigned& v)
1781  { return operator<((long) u, v); }
1782  friend bool operator < (unsigned int u, const sc_unsigned& v)
1783  { return operator<((unsigned long) u, v); }
1784 
1785  friend SC_API bool operator < (const sc_unsigned& u, const sc_uint_base& v);
1786  friend SC_API bool operator < (const sc_unsigned& u, const sc_int_base& v);
1787  friend SC_API bool operator < (const sc_uint_base& u, const sc_unsigned& v);
1788  friend SC_API bool operator < (const sc_int_base& u, const sc_unsigned& v);
1789 
1790  // Logical LESS_THAN_AND_EQUAL operators:
1791 
1792  friend SC_API bool operator <= (const sc_unsigned& u, const sc_signed& v);
1793  friend SC_API bool operator <= (const sc_signed& u, const sc_unsigned& v);
1794 
1795  friend SC_API bool operator <= (const sc_unsigned& u, const sc_unsigned& v);
1796  friend SC_API bool operator <= (const sc_unsigned& u, int64 v);
1797  friend SC_API bool operator <= (const sc_unsigned& u, uint64 v);
1798  friend SC_API bool operator <= (const sc_unsigned& u, long v);
1799  friend SC_API bool operator <= (const sc_unsigned& u, unsigned long v);
1800  friend bool operator <= (const sc_unsigned& u, int v)
1801  { return operator<=(u, (long) v); }
1802  friend bool operator <= (const sc_unsigned& u, unsigned int v)
1803  { return operator<=(u, (unsigned long) v); }
1804 
1805  friend SC_API bool operator <= (int64 u, const sc_unsigned& v);
1806  friend SC_API bool operator <= (uint64 u, const sc_unsigned& v);
1807  friend SC_API bool operator <= (long u, const sc_unsigned& v);
1808  friend SC_API bool operator <= (unsigned long u, const sc_unsigned& v);
1809  friend bool operator <= (int u, const sc_unsigned& v)
1810  { return operator<=((long) u, v); }
1811  friend bool operator <= (unsigned int u, const sc_unsigned& v)
1812  { return operator<=((unsigned long) u, v); }
1813 
1814  friend SC_API bool operator <= (const sc_unsigned& u, const sc_uint_base& v);
1815  friend SC_API bool operator <= (const sc_unsigned& u, const sc_int_base& v);
1816  friend SC_API bool operator <= (const sc_uint_base& u, const sc_unsigned& v);
1817  friend SC_API bool operator <= (const sc_int_base& u, const sc_unsigned& v);
1818 
1819  // Logical GREATER_THAN operators:
1820 
1821  friend SC_API bool operator > (const sc_unsigned& u, const sc_signed& v);
1822  friend SC_API bool operator > (const sc_signed& u, const sc_unsigned& v);
1823 
1824  friend SC_API bool operator > (const sc_unsigned& u, const sc_unsigned& v);
1825  friend SC_API bool operator > (const sc_unsigned& u, int64 v);
1826  friend SC_API bool operator > (const sc_unsigned& u, uint64 v);
1827  friend SC_API bool operator > (const sc_unsigned& u, long v);
1828  friend SC_API bool operator > (const sc_unsigned& u, unsigned long v);
1829  friend bool operator > (const sc_unsigned& u, int v)
1830  { return operator>(u, (long) v); }
1831  friend bool operator > (const sc_unsigned& u, unsigned int v)
1832  { return operator>(u, (unsigned long) v); }
1833 
1834  friend SC_API bool operator > (int64 u, const sc_unsigned& v);
1835  friend SC_API bool operator > (uint64 u, const sc_unsigned& v);
1836  friend SC_API bool operator > (long u, const sc_unsigned& v);
1837  friend SC_API bool operator > (unsigned long u, const sc_unsigned& v);
1838  friend bool operator > (int u, const sc_unsigned& v)
1839  { return operator>((long) u, v); }
1840  friend bool operator > (unsigned int u, const sc_unsigned& v)
1841  { return operator>((unsigned long) u, v); }
1842 
1843  friend SC_API bool operator > (const sc_unsigned& u, const sc_uint_base& v);
1844  friend SC_API bool operator > (const sc_unsigned& u, const sc_int_base& v);
1845  friend SC_API bool operator > (const sc_uint_base& u, const sc_unsigned& v);
1846  friend SC_API bool operator > (const sc_int_base& u, const sc_unsigned& v);
1847 
1848  // Logical GREATER_THAN_AND_EQUAL operators:
1849 
1850  friend SC_API bool operator >= (const sc_unsigned& u, const sc_signed& v);
1851  friend SC_API bool operator >= (const sc_signed& u, const sc_unsigned& v);
1852 
1853  friend SC_API bool operator >= (const sc_unsigned& u, const sc_unsigned& v);
1854  friend SC_API bool operator >= (const sc_unsigned& u, int64 v);
1855  friend SC_API bool operator >= (const sc_unsigned& u, uint64 v);
1856  friend SC_API bool operator >= (const sc_unsigned& u, long v);
1857  friend SC_API bool operator >= (const sc_unsigned& u, unsigned long v);
1858  friend bool operator >= (const sc_unsigned& u, int v)
1859  { return operator>=(u, (long) v); }
1860  friend bool operator >= (const sc_unsigned& u, unsigned int v)
1861  { return operator>=(u, (unsigned long) v); }
1862 
1863  friend SC_API bool operator >= (int64 u, const sc_unsigned& v);
1864  friend SC_API bool operator >= (uint64 u, const sc_unsigned& v);
1865  friend SC_API bool operator >= (long u, const sc_unsigned& v);
1866  friend SC_API bool operator >= (unsigned long u, const sc_unsigned& v);
1867  friend bool operator >= (int u, const sc_unsigned& v)
1868  { return operator>=((long) u, v); }
1869  friend bool operator >= (unsigned int u, const sc_unsigned& v)
1870  { return operator>=((unsigned long) u, v); }
1871 
1872  friend SC_API bool operator >= (const sc_unsigned& u, const sc_uint_base& v);
1873  friend SC_API bool operator >= (const sc_unsigned& u, const sc_int_base& v);
1874  friend SC_API bool operator >= (const sc_uint_base& u, const sc_unsigned& v);
1875  friend SC_API bool operator >= (const sc_int_base& u, const sc_unsigned& v);
1876 
1877  // Bitwise NOT operator (unary).
1878  friend SC_API sc_unsigned operator ~ (const sc_unsigned& u);
1879 
1880  // Helper functions.
1881  friend int compare_unsigned(small_type us,
1882  int unb,
1883  int und,
1884  const sc_digit *ud,
1885  small_type vs,
1886  int vnb,
1887  int vnd,
1888  const sc_digit *vd,
1889  small_type if_u_signed,
1890  small_type if_v_signed);
1891 
1893  int unb,
1894  int und,
1895  const sc_digit *ud,
1896  small_type vs,
1897  int vnb,
1898  int vnd,
1899  const sc_digit *vd);
1900 
1902  int unb,
1903  int und,
1904  const sc_digit *ud,
1905  small_type vs,
1906  int vnb,
1907  int vnd,
1908  const sc_digit *vd);
1909 
1911  int unb,
1912  int und,
1913  const sc_digit *ud,
1914  int vnb,
1915  int vnd,
1916  const sc_digit *vd);
1917 
1919  int unb,
1920  int und,
1921  const sc_digit *ud,
1922  int vnb,
1923  int vnd,
1924  const sc_digit *vd);
1925 
1927  int unb,
1928  int und,
1929  const sc_digit *ud,
1930  int vnb,
1931  int vnd,
1932  const sc_digit *vd);
1933 
1935  int unb,
1936  int und,
1937  const sc_digit *ud,
1938  small_type vs,
1939  int vnb,
1940  int vnd,
1941  const sc_digit *vd);
1942 
1944  int unb,
1945  int und,
1946  const sc_digit *ud,
1947  small_type vs,
1948  int vnb,
1949  int vnd,
1950  const sc_digit *vd);
1951 
1953  int unb,
1954  int und,
1955  const sc_digit *ud,
1956  small_type vs,
1957  int vnb,
1958  int vnd,
1959  const sc_digit *vd);
1960 
1961 public:
1963 
1964 private:
1965 
1966  small_type sgn; // Shortened as s.
1967  int nbits; // Shortened as nb.
1968  int ndigits; // Shortened as nd.
1969 
1970 #ifdef SC_MAX_NBITS
1971  sc_digit digit[DIV_CEIL(SC_MAX_NBITS)]; // Shortened as d.
1972 #else
1973  sc_digit *digit; // Shortened as d.
1974 #endif
1975 
1976  // Private constructors:
1977 
1978  // Create a copy of v with sign s.
1979  sc_unsigned(const sc_unsigned& v, small_type s);
1980  sc_unsigned(const sc_signed& v, small_type s);
1981 
1982  // Create an unsigned number with the given attributes.
1983  sc_unsigned(small_type s, int nb, int nd,
1984  sc_digit *d, bool alloc = true);
1985 
1986  // Create an unsigned number using the bits u[l..r].
1987  sc_unsigned(const sc_signed* u, int l, int r);
1988  sc_unsigned(const sc_unsigned* u, int l, int r);
1989 
1990  // Private member functions. The called functions are inline functions.
1991 
1992  small_type default_sign() const
1993  { return SC_POS; }
1994 
1995  int num_bits(int nb) const { return nb + 1; }
1996 
1997  bool check_if_outside(int bit_num) const;
1998 
1999  void copy_digits(int nb, int nd, const sc_digit *d)
2000  { copy_digits_unsigned(sgn, nbits, ndigits, digit, nb, nd, d); }
2001 
2002  void makezero()
2003  { sgn = make_zero(ndigits, digit); }
2004 
2005  // Conversion functions between 2's complement (2C) and
2006  // sign-magnitude (SM):
2007  void convert_2C_to_SM()
2008  { sgn = convert_unsigned_2C_to_SM(nbits, ndigits, digit); }
2009 
2010  void convert_SM_to_2C_to_SM()
2011  { sgn = convert_unsigned_SM_to_2C_to_SM(sgn, nbits, ndigits, digit); }
2012 
2013  void convert_SM_to_2C()
2014  { convert_unsigned_SM_to_2C(sgn, ndigits, digit); }
2015 
2016 };
2017 
2018 
2019 
2020 inline
2021 ::std::ostream&
2022 operator << ( ::std::ostream&, const sc_unsigned& );
2023 
2024 inline
2025 ::std::istream&
2026 operator >> ( ::std::istream&, sc_unsigned& );
2027 
2028 
2029 // IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
2030 
2038 inline
2039 ::std::ostream&
2040 operator << ( ::std::ostream& os, const sc_unsigned_bitref_r& a )
2041 {
2042  a.print( os );
2043  return os;
2044 }
2045 
2046 
2053 template<class T>
2055  const sc_generic_base<T>& a )
2056 {
2057  sc_unsigned temp( length() );
2058  a->to_sc_unsigned(temp);
2059  return *this = temp;
2060 }
2061 
2062 inline
2063 ::std::istream&
2064 operator >> ( ::std::istream& is, sc_unsigned_bitref& a )
2065 {
2066  a.scan( is );
2067  return is;
2068 }
2069 
2070 
2077 // reduce methods
2078 
2080 {
2081  const sc_unsigned* target_p = m_obj_p;
2082  for ( int i = m_right; i <= m_left; i++ )
2083  if ( !target_p->test(i) ) return false;
2084  return true;
2085 }
2086 
2088 {
2089  return !and_reduce();
2090 }
2091 
2093 {
2094  const sc_unsigned* target_p = m_obj_p;
2095  for ( int i = m_right; i <= m_left; i++ )
2096  if ( target_p->test(i) ) return true;
2097  return false;
2098 }
2099 
2101 {
2102  return !or_reduce();
2103 }
2104 
2106 {
2107  int odd;
2108  const sc_unsigned* target_p = m_obj_p;
2109  odd = 0;
2110  for ( int i = m_right; i <= m_left; i++ )
2111  if ( target_p->test(i) ) odd = ~odd;
2112  return odd ? true : false;
2113 }
2114 
2116 {
2117  return !xor_reduce();
2118 }
2119 
2120 
2121 inline
2122 ::std::ostream&
2123 operator << ( ::std::ostream& os, const sc_unsigned_subref_r& a )
2124 {
2125  a.print( os );
2126  return os;
2127 }
2128 
2129 
2136 // assignment operators
2137 
2138 inline
2139 const sc_unsigned_subref&
2141 {
2142  sc_unsigned aa( length() );
2143  return ( *this = aa = a );
2144 }
2145 
2146 
2147 inline
2148 ::std::istream&
2149 operator >> ( ::std::istream& is, sc_unsigned_subref& a )
2150 {
2151  a.scan( is );
2152  return is;
2153 }
2154 
2155 
2156 
2163 template<class T>
2165 {
2166  int nb = v->length();
2167  sgn = default_sign();
2168  if( nb > 0 ) {
2169  nbits = num_bits( nb );
2170  } else {
2171  invalid_init( "sc_generic_base<T>", nb );
2172  sc_core::sc_abort(); // can't recover from here
2173  }
2174  ndigits = DIV_CEIL(nbits);
2175 # ifdef SC_MAX_NBITS
2176  test_bound(nb);
2177 # else
2178  digit = new sc_digit[ndigits];
2179 # endif
2180  makezero();
2181  v->to_sc_unsigned(*this);
2182 }
2183 
2184 
2185 inline
2186 ::std::ostream&
2187 operator << ( ::std::ostream& os, const sc_unsigned& a )
2188 {
2189  a.print( os );
2190  return os;
2191 }
2192 
2193 inline
2194 ::std::istream&
2195 operator >> ( ::std::istream& is, sc_unsigned& a )
2196 {
2197  a.scan( is );
2198  return is;
2199 }
2200 
2201 } // namespace sc_dt
2202 
2203 #endif
SC_API sc_signed operator-(const sc_unsigned &u, const sc_signed &v)
Proxy class for sized bit concatenation.
Definition: sc_concatref.h:118
Base class for the fixed-point types; limited precision.
Definition: sc_fxnum.h:991
void scan(::std::istream &is=::std::cin)
void copy_digits_unsigned(small_type &us, int unb, int und, sc_digit *ud, int, int vnd, const sc_digit *vd)
Definition: sc_nbutils.h:953
#define BITS_PER_DIGIT
Definition: sc_nbdefs.h:143
sc_unsigned add_unsigned_friend(small_type us, int unb, int und, const sc_digit *ud, small_type vs, int vnb, int vnd, const sc_digit *vd)
void initialize(const sc_unsigned *obj_p, int left_, int right_)
Definition: sc_unsigned.h:824
static sc_core::sc_vpool< sc_unsigned_bitref > m_pool
Definition: sc_unsigned.h:795
small_type make_zero(int nd, sc_digit *d)
Definition: sc_nbutils.h:732
void check_index(int i) const
Definition: sc_unsigned.h:1109
Proxy class for sc_uint part selection (r-value only).
Definition: sc_uint_base.h:317
bool operator==(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:289
Proxy class for sc_int part selection (r-value only).
Definition: sc_int_base.h:325
Fixed-point value types; limited precision.
Definition: sc_fxval.h:439
SC_API sc_signed operator*(const sc_unsigned &u, const sc_signed &v)
virtual bool concat_get_ctrl(sc_digit *dst_p, int low_i) const
Definition: sc_unsigned.h:697
sc_proxy< X >::value_type nand_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1545
X & operator&=(sc_proxy< X > &px, const sc_proxy< Y > &py)
Definition: sc_lv_base.h:342
sc_unsigned xor_unsigned_friend(small_type us, int unb, int und, const sc_digit *ud, small_type vs, int vnb, int vnd, const sc_digit *vd)
void convert_SM_to_2C(small_type s, int nd, sc_digit *d)
Definition: sc_nbutils.h:776
int length() const
Definition: sc_unsigned.h:1244
virtual uint64 concat_get_uint64() const
Definition: sc_unsigned.h:695
int64_t int64
Definition: sc_nbdefs.h:188
Proxy class for sc_unsigned part selection (r-value only).
Definition: sc_unsigned.h:811
sc_proxy< X >::value_type xnor_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1577
Base class for sc_uint.
Definition: sc_uint_base.h:534
bool sign() const
Definition: sc_unsigned.h:1246
int small_type
Definition: sc_nbdefs.h:124
sc_proxy< X >::value_type nor_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1561
X & operator|=(sc_proxy< X > &px, const sc_proxy< Y > &py)
Definition: sc_lv_base.h:444
Arbitrary precision signed number.
Definition: sc_signed.h:1099
Abstract base class of all SystemC native variables.
Definition: sc_value_base.h:82
void scan(::std::istream &is=::std::cin)
uint64_t uint64
Definition: sc_nbdefs.h:189
Arbitrary precision unsigned number.
Definition: sc_unsigned.h:1001
Base class for the fixed-point types; arbitrary precision.
Definition: sc_fxnum.h:564
Base class for SystemC bit values.
Proxy class for sc_unsigned bit selection (r-value and l-value).
Definition: sc_unsigned.h:751
unsigned int sc_digit
Definition: sc_nbdefs.h:179
const sc_unsigned_bitref_r & bit(int i) const
Definition: sc_unsigned.h:1141
bool operator!=(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:292
sc_unsigned_bitref & bit(int i)
Definition: sc_unsigned.h:1132
const sc_fxval operator/(const sc_fxnum &a, const sc_fxnum &b)
Definition: sc_fxnum.h:2785
Base class for sc_int.
Definition: sc_int_base.h:548
const sc_bit operator|(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:338
sc_proxy< X >::value_type xor_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1569
small_type convert_unsigned_2C_to_SM(int nb, int nd, sc_digit *d)
Definition: sc_nbutils.h:888
Fixed-point value type; arbitrary precision.
Definition: sc_fxval.h:95
void initialize(const sc_unsigned *obj_p, int index_)
Definition: sc_unsigned.h:650
bool test(int i) const
SC_API sc_signed operator%(const sc_unsigned &u, const sc_signed &v)
Arbitrary size logic vector base class.
Definition: sc_lv_base.h:91
sc_unsigned mod_unsigned_friend(small_type us, int unb, int und, const sc_digit *ud, int vnb, int vnd, const sc_digit *vd)
Proxy class for sc_unsigned part selection (r-value and l-value).
Definition: sc_unsigned.h:925
SC_API sc_signed operator+(const sc_unsigned &u, const sc_signed &v)
sc_unsigned_bitref_r(const sc_unsigned_bitref_r &a)
Definition: sc_unsigned.h:665
sc_proxy< X >::value_type or_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1553
Proxy class for sc_signed part selection (r-value and l-value).
Definition: sc_signed.h:1018
bool operator>=(const sc_int_base &a, const sc_int_base &b)
Definition: sc_int_base.h:741
virtual int concat_length(bool *xz_present_p) const
Definition: sc_unsigned.h:877
External and friend functions for both sc_signed and.
bool operator<(const sc_int_base &a, const sc_int_base &b)
Definition: sc_int_base.h:732
sc_digit * get_raw() const
Definition: sc_unsigned.h:1085
const sc_lv_base reverse(const sc_proxy< X > &x)
Definition: sc_lv_base.h:747
static sc_core::sc_vpool< sc_unsigned > m_pool
Definition: sc_unsigned.h:1962
SC_API const std::string to_string(sc_enc)
sc_unsigned(int nb=sc_length_param().len())
bool operator>(const sc_int_base &a, const sc_int_base &b)
Definition: sc_int_base.h:738
Abstract base class of all SystemC `simulation&#39; objects.
void print(::std::ostream &os=::std::cout) const
Definition: sc_unsigned.h:1235
Proxy class for user-defined value classes and other classes that.
virtual int concat_length(bool *xz_present_p) const
Definition: sc_unsigned.h:693
void convert_unsigned_SM_to_2C(small_type s, int nd, sc_digit *d)
Definition: sc_nbutils.h:919
sc_numrep
Enumeration of number representations for character string conversion.
Definition: sc_nbdefs.h:97
const sc_unsigned_subref_r & range(int i, int j) const
Definition: sc_unsigned.h:1183
const sc_bit operator^(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:341
Proxy class for sc_signed part selection (r-value only).
Definition: sc_signed.h:905
virtual int concat_length(bool *xz_present_p) const
Definition: sc_unsigned.h:1086
Length parameter type.
void check_range(int l, int r) const
Definition: sc_unsigned.h:1160
virtual bool concat_get_data(sc_digit *dst_p, int low_i) const
Definition: sc_unsigned.h:704
int compare_unsigned(small_type us, int unb, int und, const sc_digit *ud, small_type vs, int vnb, int vnd, const sc_digit *vd, small_type if_u_signed=0, small_type if_v_signed=0)
sc_unsigned_bitref(const sc_unsigned_bitref &a)
Definition: sc_unsigned.h:767
X & operator^=(sc_proxy< X > &px, const sc_proxy< Y > &py)
Definition: sc_lv_base.h:546
sc_unsigned or_unsigned_friend(small_type us, int unb, int und, const sc_digit *ud, small_type vs, int vnb, int vnd, const sc_digit *vd)
void print(::std::ostream &os=::std::cout) const
Definition: sc_unsigned.h:724
#define DIV_CEIL(x)
Definition: sc_nbdefs.h:160
#define SC_POS
Definition: sc_nbdefs.h:117
#define SC_API_TEMPLATE_DECL_
Definition: sc_cmnhdr.h:177
small_type convert_unsigned_SM_to_2C_to_SM(small_type s, int nb, int nd, sc_digit *d)
Definition: sc_nbutils.h:900
sc_unsigned_subref(const sc_unsigned_subref &a)
Definition: sc_unsigned.h:942
static sc_core::sc_vpool< sc_unsigned_subref > m_pool
Definition: sc_unsigned.h:985
void scan(::std::istream &is=::std::cin)
void invert(int i)
Definition: sc_unsigned.h:1272
sc_unsigned sub_unsigned_friend(small_type us, int unb, int und, const sc_digit *ud, small_type vs, int vnb, int vnd, const sc_digit *vd)
const sc_bit operator&(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:335
sc_numrep sc_io_base(::std::ostream &, sc_numrep)
Definition: sc_nbutils.h:114
sc_unsigned_subref_r(const sc_unsigned_subref_r &a)
Definition: sc_unsigned.h:841
bool nand_reduce() const
Definition: sc_unsigned.h:1252
Top level header file for arbitrary precision signed/unsigned.
void print(::std::ostream &os=::std::cout) const
Definition: sc_unsigned.h:897
Temporary value pool classes.
const sc_unsigned_subref & operator=(const sc_unsigned_subref_r &a)
inline ::std::ostream & operator<<(::std::ostream &os, const sc_bit &a)
Definition: sc_bit.h:390
bool nor_reduce() const
Definition: sc_unsigned.h:1257
SC_NORETURN_ SC_API void sc_abort()
const sc_bit operator~(const sc_bit &a)
Definition: sc_bit.h:316
sc_unsigned div_unsigned_friend(small_type s, int unb, int und, const sc_digit *ud, int vnb, int vnd, const sc_digit *vd)
Arbitrary size bit vector base class.
Definition: sc_bv_base.h:80
External functions for both sc_signed and sc_unsigned.
Proxy class for sc_unsigned bit selection (r-value only).
Definition: sc_unsigned.h:639
bool xnor_reduce() const
Definition: sc_unsigned.h:1262
bool sc_io_show_base(::std::ostream &)
Definition: sc_nbutils.h:119
sc_proxy< X >::value_type and_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1537
virtual ~sc_unsigned()
Definition: sc_unsigned.h:1076
bool operator<=(const sc_int_base &a, const sc_int_base &b)
Definition: sc_int_base.h:735
sc_unsigned_subref & range(int i, int j)
Definition: sc_unsigned.h:1174
#define SC_API
Definition: sc_cmnhdr.h:168
inline ::std::istream & operator>>(::std::istream &is, sc_bit &a)
Definition: sc_bit.h:398
sc_unsigned and_unsigned_friend(small_type us, int unb, int und, const sc_digit *ud, small_type vs, int vnb, int vnd, const sc_digit *vd)
sc_unsigned mul_unsigned_friend(small_type s, int unb, int und, const sc_digit *ud, int vnb, int vnd, const sc_digit *vd)