00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 #ifndef SC_UNSIGNED_H
00085 #define SC_UNSIGNED_H
00086
00087
00088 #include "sysc/kernel/sc_object.h"
00089 #include "sysc/datatypes/misc/sc_value_base.h"
00090 #include "sysc/utils/sc_iostream.h"
00091 #include "sysc/utils/sc_temporary.h"
00092 #include "sysc/datatypes/int/sc_length_param.h"
00093 #include "sysc/datatypes/int/sc_nbdefs.h"
00094 #include "sysc/datatypes/int/sc_nbutils.h"
00095 #include "sysc/datatypes/int/sc_nbexterns.h"
00096 #include "sysc/utils/sc_temporary.h"
00097
00098
00099 namespace sc_dt
00100 {
00101
00102
00103 class sc_unsigned_bitref_r;
00104 class sc_unsigned_bitref;
00105 class sc_unsigned_subref_r;
00106 class sc_unsigned_subref;
00107 class sc_concatref;
00108 class sc_unsigned;
00109
00110
00111 class sc_bv_base;
00112 class sc_lv_base;
00113 class sc_int_base;
00114 class sc_uint_base;
00115 class sc_int_subref_r;
00116 class sc_uint_subref_r;
00117 class sc_signed;
00118 class sc_signed_subref_r;
00119 class sc_fxval;
00120 class sc_fxval_fast;
00121 class sc_fxnum;
00122 class sc_fxnum_fast;
00123
00124
00125 int compare_unsigned(small_type us,
00126 int unb,
00127 int und,
00128 const sc_digit *ud,
00129 small_type vs,
00130 int vnb,
00131 int vnd,
00132 const sc_digit *vd,
00133 small_type if_u_signed,
00134 small_type if_v_signed);
00135
00136 sc_unsigned add_unsigned_friend(small_type us,
00137 int unb,
00138 int und,
00139 const sc_digit *ud,
00140 small_type vs,
00141 int vnb,
00142 int vnd,
00143 const sc_digit *vd);
00144
00145 sc_unsigned sub_unsigned_friend(small_type us,
00146 int unb,
00147 int und,
00148 const sc_digit *ud,
00149 small_type vs,
00150 int vnb,
00151 int vnd,
00152 const sc_digit *vd);
00153
00154 sc_unsigned mul_unsigned_friend(small_type s,
00155 int unb,
00156 int und,
00157 const sc_digit *ud,
00158 int vnb,
00159 int vnd,
00160 const sc_digit *vd);
00161
00162 sc_unsigned div_unsigned_friend(small_type s,
00163 int unb,
00164 int und,
00165 const sc_digit *ud,
00166 int vnb,
00167 int vnd,
00168 const sc_digit *vd);
00169
00170 sc_unsigned mod_unsigned_friend(small_type us,
00171 int unb,
00172 int und,
00173 const sc_digit *ud,
00174 int vnb,
00175 int vnd,
00176 const sc_digit *vd);
00177
00178 sc_unsigned and_unsigned_friend(small_type us,
00179 int unb,
00180 int und,
00181 const sc_digit *ud,
00182 small_type vs,
00183 int vnb,
00184 int vnd,
00185 const sc_digit *vd);
00186
00187
00188 sc_unsigned or_unsigned_friend(small_type us,
00189 int unb,
00190 int und,
00191 const sc_digit *ud,
00192 small_type vs,
00193 int vnb,
00194 int vnd,
00195 const sc_digit *vd);
00196
00197 sc_unsigned xor_unsigned_friend(small_type us,
00198 int unb,
00199 int und,
00200 const sc_digit *ud,
00201 small_type vs,
00202 int vnb,
00203 int vnd,
00204 const sc_digit *vd);
00205
00206
00207
00208
00209
00210
00211 sc_signed operator + (const sc_unsigned& u, const sc_signed& v);
00212 sc_signed operator + (const sc_signed& u, const sc_unsigned& v);
00213
00214 sc_unsigned operator + (const sc_unsigned& u, const sc_unsigned& v);
00215 sc_signed operator + (const sc_unsigned& u, int64 v);
00216 sc_unsigned operator + (const sc_unsigned& u, uint64 v);
00217 sc_signed operator + (const sc_unsigned& u, long v);
00218 sc_unsigned operator + (const sc_unsigned& u, unsigned long v);
00219 sc_signed operator + (const sc_unsigned& u, int v);
00220 inline sc_unsigned operator + (const sc_unsigned& u, unsigned int v);
00221
00222 sc_signed operator + (int64 u, const sc_unsigned& v);
00223 sc_unsigned operator + (uint64 u, const sc_unsigned& v);
00224 sc_signed operator + (long u, const sc_unsigned& v);
00225 sc_unsigned operator + (unsigned long u, const sc_unsigned& v);
00226 sc_signed operator + (int u, const sc_unsigned& v);
00227 inline sc_unsigned operator + (unsigned int u, const sc_unsigned& v);
00228
00229 sc_unsigned operator + (const sc_unsigned& u, const sc_uint_base& v);
00230 sc_signed operator + (const sc_unsigned& u, const sc_int_base& v);
00231 sc_unsigned operator + (const sc_uint_base& u, const sc_unsigned& v);
00232 sc_signed operator + (const sc_int_base& u, const sc_unsigned& v);
00233
00234
00235
00236 sc_signed operator - (const sc_unsigned& u, const sc_signed& v);
00237 sc_signed operator - (const sc_signed& u, const sc_unsigned& v);
00238
00239 sc_signed operator - (const sc_unsigned& u, const sc_unsigned& v);
00240 sc_signed operator - (const sc_unsigned& u, int64 v);
00241 sc_signed operator - (const sc_unsigned& u, uint64 v);
00242 sc_signed operator - (const sc_unsigned& u, long v);
00243 sc_signed operator - (const sc_unsigned& u, unsigned long v);
00244 sc_signed operator - (const sc_unsigned& u, int v);
00245 sc_signed operator - (const sc_unsigned& u, unsigned int v);
00246
00247 sc_signed operator - (int64 u, const sc_unsigned& v);
00248 sc_signed operator - (uint64 u, const sc_unsigned& v);
00249 sc_signed operator - (long u, const sc_unsigned& v);
00250 sc_signed operator - (unsigned long u, const sc_unsigned& v);
00251 sc_signed operator - (int u, const sc_unsigned& v);
00252 sc_signed operator - (unsigned int u, const sc_unsigned& v);
00253
00254 sc_signed operator - (const sc_unsigned& u, const sc_uint_base& v);
00255 sc_signed operator - (const sc_unsigned& u, const sc_int_base& v);
00256 sc_signed operator - (const sc_uint_base& u, const sc_unsigned& v);
00257 sc_signed operator - (const sc_int_base& u, const sc_unsigned& v);
00258
00259
00260
00261 sc_signed operator * (const sc_unsigned& u, const sc_signed& v);
00262 sc_signed operator * (const sc_signed& u, const sc_unsigned& v);
00263
00264 sc_unsigned operator * (const sc_unsigned& u, const sc_unsigned& v);
00265 sc_signed operator * (const sc_unsigned& u, int64 v);
00266 sc_unsigned operator * (const sc_unsigned& u, uint64 v);
00267 sc_signed operator * (const sc_unsigned& u, long v);
00268 sc_unsigned operator * (const sc_unsigned& u, unsigned long v);
00269 sc_signed operator * (const sc_unsigned& u, int v);
00270 inline sc_unsigned operator * (const sc_unsigned& u, unsigned int v);
00271
00272 sc_signed operator * (int64 u, const sc_unsigned& v);
00273 sc_unsigned operator * (uint64 u, const sc_unsigned& v);
00274 sc_signed operator * (long u, const sc_unsigned& v);
00275 sc_unsigned operator * (unsigned long u, const sc_unsigned& v);
00276 sc_signed operator * (int u, const sc_unsigned& v);
00277 inline sc_unsigned operator * (unsigned int u, const sc_unsigned& v);
00278
00279 sc_unsigned operator * (const sc_unsigned& u, const sc_uint_base& v);
00280 sc_signed operator * (const sc_unsigned& u, const sc_int_base& v);
00281 sc_unsigned operator * (const sc_uint_base& u, const sc_unsigned& v);
00282 sc_signed operator * (const sc_int_base& u, const sc_unsigned& v);
00283
00284
00285
00286 sc_signed operator / (const sc_unsigned& u, const sc_signed& v);
00287 sc_signed operator / (const sc_signed& u, const sc_unsigned& v);
00288
00289 sc_unsigned operator / (const sc_unsigned& u, const sc_unsigned& v);
00290 sc_signed operator / (const sc_unsigned& u, int64 v);
00291 sc_unsigned operator / (const sc_unsigned& u, uint64 v);
00292 sc_signed operator / (const sc_unsigned& u, long v);
00293 sc_unsigned operator / (const sc_unsigned& u, unsigned long v);
00294 sc_signed operator / (const sc_unsigned& u, int v);
00295 inline sc_unsigned operator / (const sc_unsigned& u, unsigned int v);
00296
00297 sc_signed operator / (int64 u, const sc_unsigned& v);
00298 sc_unsigned operator / (uint64 u, const sc_unsigned& v);
00299 sc_signed operator / (long u, const sc_unsigned& v);
00300 sc_unsigned operator / (unsigned long u, const sc_unsigned& v);
00301 sc_signed operator / (int u, const sc_unsigned& v);
00302 inline sc_unsigned operator / (unsigned int u, const sc_unsigned& v);
00303
00304 sc_unsigned operator / (const sc_unsigned& u, const sc_uint_base& v);
00305 sc_signed operator / (const sc_unsigned& u, const sc_int_base& v);
00306 sc_unsigned operator / (const sc_uint_base& u, const sc_unsigned& v);
00307 sc_signed operator / (const sc_int_base& u, const sc_unsigned& v);
00308
00309
00310
00311 sc_signed operator % (const sc_unsigned& u, const sc_signed& v);
00312 sc_signed operator % (const sc_signed& u, const sc_unsigned& v);
00313
00314 sc_unsigned operator % (const sc_unsigned& u, const sc_unsigned& v);
00315 sc_signed operator % (const sc_unsigned& u, int64 v);
00316 sc_unsigned operator % (const sc_unsigned& u, uint64 v);
00317 sc_signed operator % (const sc_unsigned& u, long v);
00318 sc_unsigned operator % (const sc_unsigned& u, unsigned long v);
00319 sc_signed operator % (const sc_unsigned& u, int v);
00320 inline sc_unsigned operator % (const sc_unsigned& u, unsigned int v);
00321
00322 sc_signed operator % (int64 u, const sc_unsigned& v);
00323 sc_unsigned operator % (uint64 u, const sc_unsigned& v);
00324 sc_signed operator % (long u, const sc_unsigned& v);
00325 sc_unsigned operator % (unsigned long u, const sc_unsigned& v);
00326 sc_signed operator % (int u, const sc_unsigned& v);
00327 inline sc_unsigned operator % (unsigned int u, const sc_unsigned& v);
00328
00329 sc_unsigned operator % (const sc_unsigned& u, const sc_uint_base& v);
00330 sc_signed operator % (const sc_unsigned& u, const sc_int_base& v);
00331 sc_unsigned operator % (const sc_uint_base& u, const sc_unsigned& v);
00332 sc_signed operator % (const sc_int_base& u, const sc_unsigned& v);
00333
00334
00335
00336
00337
00338 sc_signed operator & (const sc_unsigned& u, const sc_signed& v);
00339 sc_signed operator & (const sc_signed& u, const sc_unsigned& v);
00340
00341 sc_unsigned operator & (const sc_unsigned& u, const sc_unsigned& v);
00342 sc_signed operator & (const sc_unsigned& u, int64 v);
00343 sc_unsigned operator & (const sc_unsigned& u, uint64 v);
00344 sc_signed operator & (const sc_unsigned& u, long v);
00345 sc_unsigned operator & (const sc_unsigned& u, unsigned long v);
00346 sc_signed operator & (const sc_unsigned& u, int v);
00347 inline sc_unsigned operator & (const sc_unsigned& u, unsigned int v);
00348
00349 sc_signed operator & (int64 u, const sc_unsigned& v);
00350 sc_unsigned operator & (uint64 u, const sc_unsigned& v);
00351 sc_signed operator & (long u, const sc_unsigned& v);
00352 sc_unsigned operator & (unsigned long u, const sc_unsigned& v);
00353 sc_signed operator & (int u, const sc_unsigned& v);
00354 inline sc_unsigned operator & (unsigned int u, const sc_unsigned& v);
00355
00356 sc_unsigned operator & (const sc_unsigned& u, const sc_uint_base& v);
00357 sc_signed operator & (const sc_unsigned& u, const sc_int_base& v);
00358 sc_unsigned operator & (const sc_uint_base& u, const sc_unsigned& v);
00359 sc_signed operator & (const sc_int_base& u, const sc_unsigned& v);
00360
00361
00362
00363 sc_signed operator | (const sc_unsigned& u, const sc_signed& v);
00364 sc_signed operator | (const sc_signed& u, const sc_unsigned& v);
00365
00366 sc_unsigned operator | (const sc_unsigned& u, const sc_unsigned& v);
00367 sc_signed operator | (const sc_unsigned& u, int64 v);
00368 sc_unsigned operator | (const sc_unsigned& u, uint64 v);
00369 sc_signed operator | (const sc_unsigned& u, long v);
00370 sc_unsigned operator | (const sc_unsigned& u, unsigned long v);
00371 sc_signed operator | (const sc_unsigned& u, int v);
00372 inline sc_unsigned operator | (const sc_unsigned& u, unsigned int v);
00373
00374 sc_signed operator | (int64 u, const sc_unsigned& v);
00375 sc_unsigned operator | (uint64 u, const sc_unsigned& v);
00376 sc_signed operator | (long u, const sc_unsigned& v);
00377 sc_unsigned operator | (unsigned long u, const sc_unsigned& v);
00378 sc_signed operator | (int u, const sc_unsigned& v);
00379 inline sc_unsigned operator | (unsigned int u, const sc_unsigned& v);
00380
00381 sc_unsigned operator | (const sc_unsigned& u, const sc_uint_base& v);
00382 sc_signed operator | (const sc_unsigned& u, const sc_int_base& v);
00383 sc_unsigned operator | (const sc_uint_base& u, const sc_unsigned& v);
00384 sc_signed operator | (const sc_int_base& u, const sc_unsigned& v);
00385
00386
00387
00388 sc_signed operator ^ (const sc_unsigned& u, const sc_signed& v);
00389 sc_signed operator ^ (const sc_signed& u, const sc_unsigned& v);
00390
00391 sc_unsigned operator ^ (const sc_unsigned& u, const sc_unsigned& v);
00392 sc_signed operator ^ (const sc_unsigned& u, int64 v);
00393 sc_unsigned operator ^ (const sc_unsigned& u, uint64 v);
00394 sc_signed operator ^ (const sc_unsigned& u, long v);
00395 sc_unsigned operator ^ (const sc_unsigned& u, unsigned long v);
00396 sc_signed operator ^ (const sc_unsigned& u, int v);
00397 inline sc_unsigned operator ^ (const sc_unsigned& u, unsigned int v);
00398
00399 sc_signed operator ^ (int64 u, const sc_unsigned& v);
00400 sc_unsigned operator ^ (uint64 u, const sc_unsigned& v);
00401 sc_signed operator ^ (long u, const sc_unsigned& v);
00402 sc_unsigned operator ^ (unsigned long u, const sc_unsigned& v);
00403 sc_signed operator ^ (int u, const sc_unsigned& v);
00404 inline sc_unsigned operator ^ (unsigned int u, const sc_unsigned& v);
00405
00406 sc_unsigned operator ^ (const sc_unsigned& u, const sc_uint_base& v);
00407 sc_signed operator ^ (const sc_unsigned& u, const sc_int_base& v);
00408 sc_unsigned operator ^ (const sc_uint_base& u, const sc_unsigned& v);
00409 sc_signed operator ^ (const sc_int_base& u, const sc_unsigned& v);
00410
00411
00412
00413
00414
00415 sc_unsigned operator << (const sc_unsigned& u, const sc_signed& v);
00416 sc_signed operator << (const sc_signed& u, const sc_unsigned& v);
00417
00418 sc_unsigned operator << (const sc_unsigned& u, const sc_unsigned& v);
00419 sc_unsigned operator << (const sc_unsigned& u, int64 v);
00420 sc_unsigned operator << (const sc_unsigned& u, uint64 v);
00421 sc_unsigned operator << (const sc_unsigned& u, long v);
00422 sc_unsigned operator << (const sc_unsigned& u, unsigned long v);
00423 inline sc_unsigned operator << (const sc_unsigned& u, int v);
00424 inline sc_unsigned operator << (const sc_unsigned& u, unsigned int v);
00425
00426 sc_unsigned operator << (const sc_unsigned& u, const sc_uint_base& v);
00427 sc_unsigned operator << (const sc_unsigned& u, const sc_int_base& v);
00428
00429
00430
00431 sc_unsigned operator >> (const sc_unsigned& u, const sc_signed& v);
00432 sc_signed operator >> (const sc_signed& u, const sc_unsigned& v);
00433
00434 sc_unsigned operator >> (const sc_unsigned& u, const sc_unsigned& v);
00435 sc_unsigned operator >> (const sc_unsigned& u, int64 v);
00436 sc_unsigned operator >> (const sc_unsigned& u, uint64 v);
00437 sc_unsigned operator >> (const sc_unsigned& u, long v);
00438 sc_unsigned operator >> (const sc_unsigned& u, unsigned long v);
00439 inline sc_unsigned operator >> (const sc_unsigned& u, int v);
00440 inline sc_unsigned operator >> (const sc_unsigned& u, unsigned int v);
00441
00442 sc_unsigned operator >> ( const sc_unsigned& , const sc_uint_base& );
00443 sc_unsigned operator >> ( const sc_unsigned&, const sc_int_base& );
00444
00445
00446 sc_unsigned operator + (const sc_unsigned& u);
00447 sc_signed operator - (const sc_unsigned& u);
00448
00449
00450
00451
00452
00453 bool operator == (const sc_unsigned& u, const sc_signed& v);
00454 bool operator == (const sc_signed& u, const sc_unsigned& v);
00455
00456 bool operator == (const sc_unsigned& u, const sc_unsigned& v);
00457 bool operator == (const sc_unsigned& u, int64 v);
00458 bool operator == (const sc_unsigned& u, uint64 v);
00459 bool operator == (const sc_unsigned& u, long v);
00460 bool operator == (const sc_unsigned& u, unsigned long v);
00461 inline bool operator == (const sc_unsigned& u, int v);
00462 inline bool operator == (const sc_unsigned& u, unsigned int v);
00463
00464 bool operator == (int64 u, const sc_unsigned& v);
00465 bool operator == (uint64 u, const sc_unsigned& v);
00466 bool operator == (long u, const sc_unsigned& v);
00467 bool operator == (unsigned long u, const sc_unsigned& v);
00468 inline bool operator == (int u, const sc_unsigned& v);
00469 inline bool operator == (unsigned int u, const sc_unsigned& v) ;
00470
00471 bool operator == (const sc_unsigned& u, const sc_uint_base& v);
00472 bool operator == (const sc_unsigned& u, const sc_int_base& v);
00473 bool operator == (const sc_uint_base& u, const sc_unsigned& v);
00474 bool operator == (const sc_int_base& u, const sc_unsigned& v);
00475
00476
00477
00478 bool operator != (const sc_unsigned& u, const sc_signed& v);
00479 bool operator != (const sc_signed& u, const sc_unsigned& v);
00480
00481 bool operator != (const sc_unsigned& u, const sc_unsigned& v);
00482 bool operator != (const sc_unsigned& u, int64 v);
00483 bool operator != (const sc_unsigned& u, uint64 v);
00484 bool operator != (const sc_unsigned& u, long v);
00485 bool operator != (const sc_unsigned& u, unsigned long v);
00486 inline bool operator != (const sc_unsigned& u, int v);
00487 inline bool operator != (const sc_unsigned& u, unsigned int v);
00488
00489 bool operator != (int64 u, const sc_unsigned& v);
00490 bool operator != (uint64 u, const sc_unsigned& v);
00491 bool operator != (long u, const sc_unsigned& v);
00492 bool operator != (unsigned long u, const sc_unsigned& v);
00493 inline bool operator != (int u, const sc_unsigned& v);
00494 inline bool operator != (unsigned int u, const sc_unsigned& v);
00495
00496 bool operator != (const sc_unsigned& u, const sc_uint_base& v);
00497 bool operator != (const sc_unsigned& u, const sc_int_base& v);
00498 bool operator != (const sc_uint_base& u, const sc_unsigned& v);
00499 bool operator != (const sc_int_base& u, const sc_unsigned& v);
00500
00501
00502
00503 bool operator < (const sc_unsigned& u, const sc_signed& v);
00504 bool operator < (const sc_signed& u, const sc_unsigned& v);
00505
00506 bool operator < (const sc_unsigned& u, const sc_unsigned& v);
00507 bool operator < (const sc_unsigned& u, int64 v);
00508 bool operator < (const sc_unsigned& u, uint64 v);
00509 bool operator < (const sc_unsigned& u, long v);
00510 bool operator < (const sc_unsigned& u, unsigned long v);
00511 inline bool operator < (const sc_unsigned& u, int v);
00512 inline bool operator < (const sc_unsigned& u, unsigned int v);
00513
00514 bool operator < (int64 u, const sc_unsigned& v);
00515 bool operator < (uint64 u, const sc_unsigned& v);
00516 bool operator < (long u, const sc_unsigned& v);
00517 bool operator < (unsigned long u, const sc_unsigned& v);
00518 inline bool operator < (int u, const sc_unsigned& v);
00519 inline bool operator < (unsigned int u, const sc_unsigned& v);
00520
00521 bool operator < (const sc_unsigned& u, const sc_uint_base& v);
00522 bool operator < (const sc_unsigned& u, const sc_int_base& v);
00523 bool operator < (const sc_uint_base& u, const sc_unsigned& v);
00524 bool operator < (const sc_int_base& u, const sc_unsigned& v);
00525
00526
00527
00528 bool operator <= (const sc_unsigned& u, const sc_signed& v);
00529 bool operator <= (const sc_signed& u, const sc_unsigned& v);
00530
00531 bool operator <= (const sc_unsigned& u, const sc_unsigned& v);
00532 bool operator <= (const sc_unsigned& u, int64 v);
00533 bool operator <= (const sc_unsigned& u, uint64 v);
00534 bool operator <= (const sc_unsigned& u, long v);
00535 bool operator <= (const sc_unsigned& u, unsigned long v);
00536 inline bool operator <= (const sc_unsigned& u, int v);
00537 inline bool operator <= (const sc_unsigned& u, unsigned int v);
00538
00539 bool operator <= (int64 u, const sc_unsigned& v);
00540 bool operator <= (uint64 u, const sc_unsigned& v);
00541 bool operator <= (long u, const sc_unsigned& v);
00542 bool operator <= (unsigned long u, const sc_unsigned& v);
00543 inline bool operator <= (int u, const sc_unsigned& v);
00544 inline bool operator <= (unsigned int u, const sc_unsigned& v);
00545
00546 bool operator <= (const sc_unsigned& u, const sc_uint_base& v);
00547 bool operator <= (const sc_unsigned& u, const sc_int_base& v);
00548 bool operator <= (const sc_uint_base& u, const sc_unsigned& v);
00549 bool operator <= (const sc_int_base& u, const sc_unsigned& v);
00550
00551
00552
00553 bool operator > (const sc_unsigned& u, const sc_signed& v);
00554 bool operator > (const sc_signed& u, const sc_unsigned& v);
00555
00556 bool operator > (const sc_unsigned& u, const sc_unsigned& v);
00557 bool operator > (const sc_unsigned& u, int64 v);
00558 bool operator > (const sc_unsigned& u, uint64 v);
00559 bool operator > (const sc_unsigned& u, long v);
00560 bool operator > (const sc_unsigned& u, unsigned long v);
00561 inline bool operator > (const sc_unsigned& u, int v);
00562 inline bool operator > (const sc_unsigned& u, unsigned int v);
00563
00564 bool operator > (int64 u, const sc_unsigned& v);
00565 bool operator > (uint64 u, const sc_unsigned& v);
00566 bool operator > (long u, const sc_unsigned& v);
00567 bool operator > (unsigned long u, const sc_unsigned& v);
00568 inline bool operator > (int u, const sc_unsigned& v);
00569 inline bool operator > (unsigned int u, const sc_unsigned& v);
00570
00571 bool operator > (const sc_unsigned& u, const sc_uint_base& v);
00572 bool operator > (const sc_unsigned& u, const sc_int_base& v);
00573 bool operator > (const sc_uint_base& u, const sc_unsigned& v);
00574 bool operator > (const sc_int_base& u, const sc_unsigned& v);
00575
00576
00577
00578 bool operator >= (const sc_unsigned& u, const sc_signed& v);
00579 bool operator >= (const sc_signed& u, const sc_unsigned& v);
00580
00581 bool operator >= (const sc_unsigned& u, const sc_unsigned& v);
00582 bool operator >= (const sc_unsigned& u, int64 v);
00583 bool operator >= (const sc_unsigned& u, uint64 v);
00584 bool operator >= (const sc_unsigned& u, long v);
00585 bool operator >= (const sc_unsigned& u, unsigned long v);
00586 inline bool operator >= (const sc_unsigned& u, int v);
00587 inline bool operator >= (const sc_unsigned& u, unsigned int v);
00588
00589 bool operator >= (int64 u, const sc_unsigned& v);
00590 bool operator >= (uint64 u, const sc_unsigned& v);
00591 bool operator >= (long u, const sc_unsigned& v);
00592 bool operator >= (unsigned long u, const sc_unsigned& v);
00593 inline bool operator >= (int u, const sc_unsigned& v);
00594 inline bool operator >= (unsigned int u, const sc_unsigned& v);
00595
00596 bool operator >= (const sc_unsigned& u, const sc_uint_base& v);
00597 bool operator >= (const sc_unsigned& u, const sc_int_base& v);
00598 bool operator >= (const sc_uint_base& u, const sc_unsigned& v);
00599 bool operator >= (const sc_int_base& u, const sc_unsigned& v);
00600
00601
00602 sc_unsigned operator ~ (const sc_unsigned& u);
00603
00604
00605
00606
00607
00608
00609
00610 class sc_unsigned_bitref_r : public sc_value_base
00611 {
00612 friend class sc_unsigned;
00613
00614 protected:
00615
00616
00617
00618 sc_unsigned_bitref_r()
00619 {}
00620
00621 void initialize( const sc_unsigned* obj_p, int index_ )
00622 {
00623 m_obj_p = CCAST<sc_unsigned*>( obj_p );
00624 m_index = index_;
00625 }
00626
00627 public:
00628
00629
00630
00631 virtual ~sc_unsigned_bitref_r()
00632 {}
00633
00634
00635
00636 sc_unsigned_bitref_r( const sc_unsigned_bitref_r& a )
00637 : m_index( a.m_index ), m_obj_p( a.m_obj_p )
00638 {}
00639
00640
00641
00642 int length() const
00643 { return 1; }
00644
00645
00646
00647
00648 operator uint64 () const;
00649 bool operator ! () const;
00650 bool operator ~ () const;
00651
00652
00653
00654
00655 uint64 value() const
00656 { return operator uint64(); }
00657
00658 bool to_bool() const
00659 { return operator uint64(); }
00660
00661
00662
00663
00664 virtual int concat_length(bool* xz_present_p) const
00665 { if ( xz_present_p ) *xz_present_p = false; return 1; }
00666 virtual uint64 concat_get_uint64() const
00667 { return (uint64)operator uint64(); }
00668 virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const
00669 {
00670 int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
00671 int word_i = low_i / BITS_PER_DIGIT;
00672 dst_p[word_i] &= ~bit_mask;
00673 return false;
00674 }
00675 virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const
00676 {
00677 int bit_mask = 1 << (low_i % BITS_PER_DIGIT);
00678 bool result;
00679 int word_i = low_i / BITS_PER_DIGIT;
00680 if ( operator uint64() )
00681 {
00682 dst_p[word_i] |= bit_mask;
00683 result = true;
00684 }
00685 else
00686 {
00687 dst_p[word_i] &= ~bit_mask;
00688 result = false;
00689 }
00690 return result;
00691 }
00692
00693
00694
00695 void print( ::std::ostream& os = ::std::cout ) const
00696 { os << to_bool(); }
00697
00698 protected:
00699
00700 int m_index;
00701 sc_unsigned* m_obj_p;
00702
00703 private:
00704
00705
00706 const sc_unsigned_bitref_r& operator = ( const sc_unsigned_bitref_r& );
00707 };
00708
00709
00710
00711 inline
00712 ::std::ostream&
00713 operator << ( ::std::ostream&, const sc_unsigned_bitref_r& );
00714
00715
00716
00717
00718
00719
00720
00721
00722 class sc_unsigned_bitref
00723 : public sc_unsigned_bitref_r
00724 {
00725 friend class sc_unsigned;
00726 friend class sc_core::sc_vpool<sc_unsigned_bitref>;
00727
00728
00729 protected:
00730
00731 sc_unsigned_bitref()
00732 {}
00733
00734 public:
00735
00736
00737
00738 sc_unsigned_bitref( const sc_unsigned_bitref& a )
00739 : sc_unsigned_bitref_r( a )
00740 {}
00741
00742
00743
00744
00745 const sc_unsigned_bitref& operator = ( const sc_unsigned_bitref_r& );
00746 const sc_unsigned_bitref& operator = ( const sc_unsigned_bitref& );
00747 const sc_unsigned_bitref& operator = ( bool );
00748
00749 const sc_unsigned_bitref& operator &= ( bool );
00750 const sc_unsigned_bitref& operator |= ( bool );
00751 const sc_unsigned_bitref& operator ^= ( bool );
00752
00753
00754
00755 virtual void concat_set(int64 src, int low_i);
00756 virtual void concat_set(const sc_signed& src, int low_i);
00757 virtual void concat_set(const sc_unsigned& src, int low_i);
00758 virtual void concat_set(uint64 src, int low_i);
00759
00760
00761
00762
00763 void scan( ::std::istream& is = ::std::cin );
00764
00765 protected:
00766 static sc_core::sc_vpool<sc_unsigned_bitref> m_pool;
00767 };
00768
00769
00770
00771 inline
00772 ::std::istream&
00773 operator >> ( ::std::istream&, sc_unsigned_bitref& );
00774
00775
00776
00777
00778
00779
00780
00781
00782 class sc_unsigned_subref_r : public sc_value_base
00783 {
00784 friend class sc_signed;
00785 friend class sc_unsigned;
00786 friend class sc_unsigned_signal;
00787
00788 protected:
00789
00790
00791
00792 sc_unsigned_subref_r()
00793 {}
00794
00795 void initialize( const sc_unsigned* obj_p, int left_, int right_ )
00796 {
00797 m_obj_p = CCAST<sc_unsigned*>( obj_p );
00798 m_left = left_;
00799 m_right = right_;
00800 }
00801
00802 public:
00803
00804
00805
00806 virtual ~sc_unsigned_subref_r()
00807 {}
00808
00809
00810
00811
00812 sc_unsigned_subref_r( const sc_unsigned_subref_r& a )
00813 : m_left( a.m_left ), m_obj_p( a.m_obj_p ), m_right( a.m_right )
00814 {}
00815
00816
00817
00818
00819 int length() const
00820 { return m_left >= m_right ? (m_left-m_right+1) : (m_right-m_left+1 ); }
00821
00822
00823
00824
00825 operator sc_unsigned () const;
00826
00827
00828
00829
00830 int to_int() const;
00831 unsigned int to_uint() const;
00832 long to_long() const;
00833 unsigned long to_ulong() const;
00834 int64 to_int64() const;
00835 uint64 to_uint64() const;
00836 double to_double() const;
00837
00838
00839
00840
00841 const std::string to_string( sc_numrep numrep = SC_DEC ) const;
00842 const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
00843
00844
00845
00846
00847 virtual int concat_length(bool* xz_present_p) const
00848 {
00849 if ( xz_present_p ) *xz_present_p = false;
00850 return m_left - m_right + 1;
00851 }
00852 virtual uint64 concat_get_uint64() const;
00853 virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
00854 virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
00855
00856
00857
00858 bool and_reduce() const;
00859 bool nand_reduce() const;
00860 bool or_reduce() const;
00861 bool nor_reduce() const;
00862 bool xor_reduce() const ;
00863 bool xnor_reduce() const;
00864
00865
00866
00867 void print( ::std::ostream& os = ::std::cout ) const
00868 { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
00869
00870 protected:
00871
00872 int m_left;
00873 sc_unsigned* m_obj_p;
00874 int m_right;
00875
00876 private:
00877
00878
00879 const sc_unsigned_subref_r& operator = ( const sc_unsigned_subref_r& );
00880 };
00881
00882
00883
00884 inline
00885 ::std::ostream&
00886 operator << ( ::std::ostream&, const sc_unsigned_subref_r& );
00887
00888
00889
00890
00891
00892
00893
00894
00895 class sc_unsigned_subref
00896 : public sc_unsigned_subref_r
00897 {
00898 friend class sc_unsigned;
00899 friend class sc_core::sc_vpool<sc_unsigned_subref>;
00900
00901
00902
00903
00904 protected:
00905 sc_unsigned_subref()
00906 {}
00907
00908 public:
00909
00910
00911
00912 sc_unsigned_subref( const sc_unsigned_subref& a )
00913 : sc_unsigned_subref_r( a )
00914 {}
00915
00916
00917
00918 const sc_unsigned_subref& operator = ( const sc_unsigned_subref_r& a );
00919 const sc_unsigned_subref& operator = ( const sc_unsigned_subref& a );
00920 const sc_unsigned_subref& operator = ( const sc_unsigned& a );
00921
00922 template<class T>
00923 const sc_unsigned_subref& operator = ( const sc_generic_base<T>& a );
00924 const sc_unsigned_subref& operator = ( const sc_signed_subref_r& a );
00925 const sc_unsigned_subref& operator = ( const sc_signed& a );
00926
00927 const sc_unsigned_subref& operator = ( const char* a );
00928 const sc_unsigned_subref& operator = ( unsigned long a );
00929 const sc_unsigned_subref& operator = ( long a );
00930
00931 const sc_unsigned_subref& operator = ( unsigned int a )
00932 { return operator = ( (unsigned long) a ); }
00933
00934 const sc_unsigned_subref& operator = ( int a )
00935 { return operator = ( (long) a ); }
00936
00937 const sc_unsigned_subref& operator = ( uint64 a );
00938 const sc_unsigned_subref& operator = ( int64 a );
00939 const sc_unsigned_subref& operator = ( double a );
00940 const sc_unsigned_subref& operator = ( const sc_int_base& a );
00941 const sc_unsigned_subref& operator = ( const sc_uint_base& a );
00942
00943
00944
00945 virtual void concat_set(int64 src, int low_i);
00946 virtual void concat_set(const sc_signed& src, int low_i);
00947 virtual void concat_set(const sc_unsigned& src, int low_i);
00948 virtual void concat_set(uint64 src, int low_i);
00949
00950
00951
00952 void scan( ::std::istream& is = ::std::cin );
00953
00954 protected:
00955 static sc_core::sc_vpool<sc_unsigned_subref> m_pool;
00956 };
00957
00958
00959
00960 inline
00961 ::std::istream&
00962 operator >> ( ::std::istream&, sc_unsigned_subref& );
00963
00964
00965
00966
00967
00968
00969
00970
00971 class sc_unsigned : public sc_value_base
00972 {
00973 friend class sc_concatref;
00974 friend class sc_unsigned_bitref_r;
00975 friend class sc_unsigned_bitref;
00976 friend class sc_unsigned_subref_r;
00977 friend class sc_unsigned_subref;
00978 friend class sc_signed;
00979 friend class sc_signed_subref;
00980 friend class sc_signed_subref_r;
00981
00982
00983 typedef bool elemtype;
00984
00985 public:
00986
00987
00988
00989 explicit sc_unsigned( int nb = sc_length_param().len() );
00990 sc_unsigned( const sc_unsigned& v );
00991 sc_unsigned( const sc_signed& v );
00992 template<class T>
00993 explicit sc_unsigned( const sc_generic_base<T>& v );
00994 explicit sc_unsigned( const sc_bv_base& v );
00995 explicit sc_unsigned( const sc_lv_base& v );
00996 explicit sc_unsigned( const sc_int_subref_r& v );
00997 explicit sc_unsigned( const sc_uint_subref_r& v );
00998 explicit sc_unsigned( const sc_signed_subref_r& v );
00999 explicit sc_unsigned( const sc_unsigned_subref_r& v );
01000
01001
01002
01003
01004
01005 const sc_unsigned& operator = (const sc_unsigned& v);
01006 const sc_unsigned& operator = (const sc_unsigned_subref_r& a );
01007
01008 template<class T>
01009 const sc_unsigned& operator = ( const sc_generic_base<T>& a )
01010 { a->to_sc_unsigned(*this); return *this; }
01011
01012 const sc_unsigned& operator = (const sc_signed& v);
01013 const sc_unsigned& operator = (const sc_signed_subref_r& a );
01014
01015 const sc_unsigned& operator = ( const char* v);
01016 const sc_unsigned& operator = ( int64 v);
01017 const sc_unsigned& operator = ( uint64 v);
01018 const sc_unsigned& operator = ( long v);
01019 const sc_unsigned& operator = ( unsigned long v);
01020
01021 const sc_unsigned& operator = ( int v)
01022 { return operator=((long) v); }
01023
01024 const sc_unsigned& operator = ( unsigned int v)
01025 { return operator=((unsigned long) v); }
01026
01027 const sc_unsigned& operator = ( double v);
01028 const sc_unsigned& operator = ( const sc_int_base& v);
01029 const sc_unsigned& operator = ( const sc_uint_base& v);
01030
01031 const sc_unsigned& operator = ( const sc_bv_base& );
01032 const sc_unsigned& operator = ( const sc_lv_base& );
01033
01034 #ifdef SC_INCLUDE_FX
01035 const sc_unsigned& operator = ( const sc_fxval& );
01036 const sc_unsigned& operator = ( const sc_fxval_fast& );
01037 const sc_unsigned& operator = ( const sc_fxnum& );
01038 const sc_unsigned& operator = ( const sc_fxnum_fast& );
01039 #endif
01040
01041
01042
01043
01044 virtual ~sc_unsigned()
01045 {
01046 # ifndef SC_MAX_NBITS
01047 delete [] digit;
01048 # endif
01049 }
01050
01051
01052
01053 sc_digit* get_raw() const { return digit; }
01054 virtual int concat_length(bool* xz_present_p) const
01055 { if ( xz_present_p ) *xz_present_p = false; return nbits-1; }
01056 virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
01057 virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
01058 virtual uint64 concat_get_uint64() const;
01059 virtual void concat_set(int64 src, int low_i);
01060 virtual void concat_set(const sc_signed& src, int low_i);
01061 virtual void concat_set(const sc_unsigned& src, int low_i);
01062 virtual void concat_set(uint64 src, int low_i);
01063
01064
01065
01066 sc_unsigned& operator ++ ();
01067 const sc_unsigned operator ++ (int);
01068
01069
01070
01071 sc_unsigned& operator -- ();
01072 const sc_unsigned operator -- (int);
01073
01074
01075
01076
01077 inline void check_index( int i ) const
01078 { if ( (i < 0) || (i >= nbits-1) ) invalid_index(i); }
01079
01080 void invalid_index( int i ) const;
01081
01082 sc_unsigned_bitref& operator [] ( int i )
01083 {
01084 check_index(i);
01085 sc_unsigned_bitref* result_p =
01086 sc_unsigned_bitref::m_pool.allocate();
01087 result_p->initialize( this, i );
01088 return *result_p;
01089 }
01090
01091 const sc_unsigned_bitref_r& operator [] ( int i ) const
01092 {
01093 check_index(i);
01094 sc_unsigned_bitref* result_p =
01095 sc_unsigned_bitref::m_pool.allocate();
01096 result_p->initialize( this, i );
01097 return *result_p;
01098 }
01099
01100 sc_unsigned_bitref& bit( int i )
01101 {
01102 check_index(i);
01103 sc_unsigned_bitref* result_p =
01104 sc_unsigned_bitref::m_pool.allocate();
01105 result_p->initialize( this, i );
01106 return *result_p;
01107 }
01108
01109 const sc_unsigned_bitref_r& bit( int i ) const
01110 {
01111 check_index(i);
01112 sc_unsigned_bitref* result_p =
01113 sc_unsigned_bitref::m_pool.allocate();
01114 result_p->initialize( this, i );
01115 return *result_p;
01116 }
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128 inline void check_range( int l, int r ) const
01129 {
01130 if ( l < r )
01131 {
01132 if ( (l < 0) || (r >= nbits-1) ) invalid_range(l,r);
01133 }
01134 else
01135 {
01136 if ( (r < 0) || (l >= nbits-1) ) invalid_range(l,r);
01137 }
01138 }
01139
01140 void invalid_range( int l, int r ) const;
01141
01142 sc_unsigned_subref& range( int i, int j )
01143 {
01144 check_range(i,j);
01145 sc_unsigned_subref* result_p =
01146 sc_unsigned_subref::m_pool.allocate();
01147 result_p->initialize( this, i, j );
01148 return *result_p;
01149 }
01150
01151 const sc_unsigned_subref_r& range( int i, int j ) const
01152 {
01153 check_range(i,j);
01154 sc_unsigned_subref* result_p =
01155 sc_unsigned_subref::m_pool.allocate();
01156 result_p->initialize( this, i, j );
01157 return *result_p;
01158 }
01159
01160 sc_unsigned_subref& operator () ( int i, int j )
01161 {
01162 check_range(i,j);
01163 sc_unsigned_subref* result_p =
01164 sc_unsigned_subref::m_pool.allocate();
01165 result_p->initialize( this, i, j );
01166 return *result_p;
01167 }
01168
01169 const sc_unsigned_subref_r& operator () ( int i, int j ) const
01170 {
01171 check_range(i,j);
01172 sc_unsigned_subref* result_p =
01173 sc_unsigned_subref::m_pool.allocate();
01174 result_p->initialize( this, i, j );
01175 return *result_p;
01176 }
01177
01178
01179
01180 int to_int() const;
01181 unsigned int to_uint() const;
01182 long to_long() const;
01183 unsigned long to_ulong() const;
01184 int64 to_int64() const;
01185 uint64 to_uint64() const;
01186 double to_double() const;
01187
01188 #ifdef SC_DT_DEPRECATED
01189 int to_signed() const
01190 { return to_int(); }
01191
01192 unsigned int to_unsigned() const
01193 { return to_uint(); }
01194 #endif
01195
01196
01197
01198 const std::string to_string( sc_numrep numrep = SC_DEC ) const;
01199 const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
01200
01201
01202
01203 void print( ::std::ostream& os = ::std::cout ) const
01204 { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
01205
01206 void scan( ::std::istream& is = ::std::cin );
01207
01208 void dump( ::std::ostream& os = ::std::cout ) const;
01209
01210
01211
01212 int length() const { return nbits - 1; }
01213 bool iszero() const;
01214 bool sign() const { return 0; }
01215
01216
01217
01218 bool and_reduce() const;
01219
01220 bool nand_reduce() const
01221 { return ( ! and_reduce() ); }
01222
01223 bool or_reduce() const;
01224
01225 bool nor_reduce() const
01226 { return ( ! or_reduce() ); }
01227
01228 bool xor_reduce() const;
01229
01230 bool xnor_reduce() const
01231 { return ( ! xor_reduce() ); }
01232
01233
01234
01235 bool test(int i) const;
01236 void set(int i);
01237 void clear(int i);
01238 void set(int i, bool v)
01239 { if (v) set(i); else clear(i); }
01240 void invert(int i)
01241 { if (test(i)) clear(i); else set(i); }
01242
01243
01244 void reverse();
01245
01246
01247 void get_packed_rep(sc_digit *buf) const;
01248 void set_packed_rep(sc_digit *buf);
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283 friend sc_signed operator + (const sc_unsigned& u, const sc_signed& v);
01284 friend sc_signed operator + (const sc_signed& u, const sc_unsigned& v);
01285
01286 friend sc_unsigned operator + (const sc_unsigned& u, const sc_unsigned& v);
01287 friend sc_signed operator + (const sc_unsigned& u, int64 v);
01288 friend sc_unsigned operator + (const sc_unsigned& u, uint64 v);
01289 friend sc_signed operator + (const sc_unsigned& u, long v);
01290 friend sc_unsigned operator + (const sc_unsigned& u, unsigned long v);
01291 friend sc_signed operator + (const sc_unsigned& u, int v);
01292 friend sc_unsigned operator + (const sc_unsigned& u, unsigned int v)
01293 { return operator+(u, (unsigned long) v); }
01294
01295 friend sc_signed operator + (int64 u, const sc_unsigned& v);
01296 friend sc_unsigned operator + (uint64 u, const sc_unsigned& v);
01297 friend sc_signed operator + (long u, const sc_unsigned& v);
01298 friend sc_unsigned operator + (unsigned long u, const sc_unsigned& v);
01299 friend sc_signed operator + (int u, const sc_unsigned& v);
01300 friend sc_unsigned operator + (unsigned int u, const sc_unsigned& v)
01301 { return operator+((unsigned long) u, v); }
01302
01303 const sc_unsigned& operator += (const sc_signed& v);
01304 const sc_unsigned& operator += (const sc_unsigned& v);
01305 const sc_unsigned& operator += (int64 v);
01306 const sc_unsigned& operator += (uint64 v);
01307 const sc_unsigned& operator += (long v);
01308 const sc_unsigned& operator += (unsigned long v);
01309 const sc_unsigned& operator += (int v)
01310 { return operator+=((long) v); }
01311 const sc_unsigned& operator += (unsigned int v)
01312 { return operator+=((unsigned long) v); }
01313
01314 friend sc_unsigned operator + (const sc_unsigned& u, const sc_uint_base& v);
01315 friend sc_signed operator + (const sc_unsigned& u, const sc_int_base& v);
01316 friend sc_unsigned operator + (const sc_uint_base& u, const sc_unsigned& v);
01317 friend sc_signed operator + (const sc_int_base& u, const sc_unsigned& v);
01318 const sc_unsigned& operator += (const sc_int_base& v);
01319 const sc_unsigned& operator += (const sc_uint_base& v);
01320
01321
01322
01323 friend sc_signed operator - (const sc_unsigned& u, const sc_signed& v);
01324 friend sc_signed operator - (const sc_signed& u, const sc_unsigned& v);
01325
01326 friend sc_signed operator - (const sc_unsigned& u, const sc_unsigned& v);
01327 friend sc_signed operator - (const sc_unsigned& u, int64 v);
01328 friend sc_signed operator - (const sc_unsigned& u, uint64 v);
01329 friend sc_signed operator - (const sc_unsigned& u, long v);
01330 friend sc_signed operator - (const sc_unsigned& u, unsigned long v);
01331 friend sc_signed operator - (const sc_unsigned& u, int v);
01332 friend sc_signed operator - (const sc_unsigned& u, unsigned int v);
01333
01334 friend sc_signed operator - (int64 u, const sc_unsigned& v);
01335 friend sc_signed operator - (uint64 u, const sc_unsigned& v);
01336 friend sc_signed operator - (long u, const sc_unsigned& v);
01337 friend sc_signed operator - (unsigned long u, const sc_unsigned& v);
01338 friend sc_signed operator - (int u, const sc_unsigned& v);
01339 friend sc_signed operator - (unsigned int u, const sc_unsigned& v);
01340
01341 const sc_unsigned& operator -= (const sc_signed& v);
01342 const sc_unsigned& operator -= (const sc_unsigned& v);
01343 const sc_unsigned& operator -= (int64 v);
01344 const sc_unsigned& operator -= (uint64 v);
01345 const sc_unsigned& operator -= (long v);
01346 const sc_unsigned& operator -= (unsigned long v);
01347 const sc_unsigned& operator -= (int v)
01348 { return operator-=((long) v); }
01349 const sc_unsigned& operator -= (unsigned int v)
01350 { return operator-=((unsigned long) v); }
01351
01352 friend sc_signed operator - (const sc_unsigned& u, const sc_uint_base& v);
01353 friend sc_signed operator - (const sc_unsigned& u, const sc_int_base& v);
01354 friend sc_signed operator - (const sc_uint_base& u, const sc_unsigned& v);
01355 friend sc_signed operator - (const sc_int_base& u, const sc_unsigned& v);
01356 const sc_unsigned& operator -= (const sc_int_base& v);
01357 const sc_unsigned& operator -= (const sc_uint_base& v);
01358
01359
01360
01361 friend sc_signed operator * (const sc_unsigned& u, const sc_signed& v);
01362 friend sc_signed operator * (const sc_signed& u, const sc_unsigned& v);
01363
01364 friend sc_unsigned operator * (const sc_unsigned& u, const sc_unsigned& v);
01365 friend sc_signed operator * (const sc_unsigned& u, int64 v);
01366 friend sc_unsigned operator * (const sc_unsigned& u, uint64 v);
01367 friend sc_signed operator * (const sc_unsigned& u, long v);
01368 friend sc_unsigned operator * (const sc_unsigned& u, unsigned long v);
01369 friend sc_signed operator * (const sc_unsigned& u, int v);
01370 friend sc_unsigned operator * (const sc_unsigned& u, unsigned int v)
01371 { return operator*(u, (unsigned long) v); }
01372
01373 friend sc_signed operator * (int64 u, const sc_unsigned& v);
01374 friend sc_unsigned operator * (uint64 u, const sc_unsigned& v);
01375 friend sc_signed operator * (long u, const sc_unsigned& v);
01376 friend sc_unsigned operator * (unsigned long u, const sc_unsigned& v);
01377 friend sc_signed operator * (int u, const sc_unsigned& v);
01378 friend sc_unsigned operator * (unsigned int u, const sc_unsigned& v)
01379 { return operator*((unsigned long) u, v); }
01380
01381 const sc_unsigned& operator *= (const sc_signed& v);
01382 const sc_unsigned& operator *= (const sc_unsigned& v);
01383 const sc_unsigned& operator *= (int64 v);
01384 const sc_unsigned& operator *= (uint64 v);
01385 const sc_unsigned& operator *= (long v);
01386 const sc_unsigned& operator *= (unsigned long v);
01387 const sc_unsigned& operator *= (int v)
01388 { return operator*=((long) v); }
01389 const sc_unsigned& operator *= (unsigned int v)
01390 { return operator*=((unsigned long) v); }
01391
01392 friend sc_unsigned operator * (const sc_unsigned& u, const sc_uint_base& v);
01393 friend sc_signed operator * (const sc_unsigned& u, const sc_int_base& v);
01394 friend sc_unsigned operator * (const sc_uint_base& u, const sc_unsigned& v);
01395 friend sc_signed operator * (const sc_int_base& u, const sc_unsigned& v);
01396 const sc_unsigned& operator *= (const sc_int_base& v);
01397 const sc_unsigned& operator *= (const sc_uint_base& v);
01398
01399
01400
01401 friend sc_signed operator / (const sc_unsigned& u, const sc_signed& v);
01402 friend sc_signed operator / (const sc_signed& u, const sc_unsigned& v);
01403
01404 friend sc_unsigned operator / (const sc_unsigned& u, const sc_unsigned& v);
01405 friend sc_signed operator / (const sc_unsigned& u, int64 v);
01406 friend sc_unsigned operator / (const sc_unsigned& u, uint64 v);
01407 friend sc_signed operator / (const sc_unsigned& u, long v);
01408 friend sc_unsigned operator / (const sc_unsigned& u, unsigned long v);
01409 friend sc_signed operator / (const sc_unsigned& u, int v);
01410 friend sc_unsigned operator / (const sc_unsigned& u, unsigned int v)
01411 { return operator/(u, (unsigned long) v); }
01412
01413 friend sc_signed operator / (int64 u, const sc_unsigned& v);
01414 friend sc_unsigned operator / (uint64 u, const sc_unsigned& v);
01415 friend sc_signed operator / (long u, const sc_unsigned& v);
01416 friend sc_unsigned operator / (unsigned long u, const sc_unsigned& v);
01417 friend sc_signed operator / (int u, const sc_unsigned& v);
01418 friend sc_unsigned operator / (unsigned int u, const sc_unsigned& v)
01419 { return operator/((unsigned long) u, v); }
01420
01421 const sc_unsigned& operator /= (const sc_signed& v);
01422 const sc_unsigned& operator /= (const sc_unsigned& v);
01423 const sc_unsigned& operator /= (int64 v);
01424 const sc_unsigned& operator /= (uint64 v);
01425 const sc_unsigned& operator /= (long v);
01426 const sc_unsigned& operator /= (unsigned long v);
01427 const sc_unsigned& operator /= (int v)
01428 { return operator/=((long) v); }
01429 const sc_unsigned& operator /= (unsigned int v)
01430 { return operator/=((unsigned long) v); }
01431
01432 friend sc_unsigned operator / (const sc_unsigned& u, const sc_uint_base& v);
01433 friend sc_signed operator / (const sc_unsigned& u, const sc_int_base& v);
01434 friend sc_unsigned operator / (const sc_uint_base& u, const sc_unsigned& v);
01435 friend sc_signed operator / (const sc_int_base& u, const sc_unsigned& v);
01436 const sc_unsigned& operator /= (const sc_int_base& v);
01437 const sc_unsigned& operator /= (const sc_uint_base& v);
01438
01439
01440
01441 friend sc_signed operator % (const sc_unsigned& u, const sc_signed& v);
01442 friend sc_signed operator % (const sc_signed& u, const sc_unsigned& v);
01443
01444 friend sc_unsigned operator % (const sc_unsigned& u, const sc_unsigned& v);
01445 friend sc_signed operator % (const sc_unsigned& u, int64 v);
01446 friend sc_unsigned operator % (const sc_unsigned& u, uint64 v);
01447 friend sc_signed operator % (const sc_unsigned& u, long v);
01448 friend sc_unsigned operator % (const sc_unsigned& u, unsigned long v);
01449 friend sc_signed operator % (const sc_unsigned& u, int v);
01450 friend sc_unsigned operator % (const sc_unsigned& u, unsigned int v)
01451 { return operator%(u, (unsigned long) v); }
01452
01453 friend sc_signed operator % (int64 u, const sc_unsigned& v);
01454 friend sc_unsigned operator % (uint64 u, const sc_unsigned& v);
01455 friend sc_signed operator % (long u, const sc_unsigned& v);
01456 friend sc_unsigned operator % (unsigned long u, const sc_unsigned& v);
01457 friend sc_signed operator % (int u, const sc_unsigned& v);
01458 friend sc_unsigned operator % (unsigned int u, const sc_unsigned& v)
01459 { return operator%((unsigned long) u, v); }
01460
01461 const sc_unsigned& operator %= (const sc_signed& v);
01462 const sc_unsigned& operator %= (const sc_unsigned& v);
01463 const sc_unsigned& operator %= (int64 v);
01464 const sc_unsigned& operator %= (uint64 v);
01465 const sc_unsigned& operator %= (long v);
01466 const sc_unsigned& operator %= (unsigned long v);
01467 const sc_unsigned& operator %= (int v)
01468 { return operator%=((long) v); }
01469 const sc_unsigned& operator %= (unsigned int v)
01470 { return operator%=((unsigned long) v); }
01471
01472 friend sc_unsigned operator % (const sc_unsigned& u, const sc_uint_base& v);
01473 friend sc_signed operator % (const sc_unsigned& u, const sc_int_base& v);
01474 friend sc_unsigned operator % (const sc_uint_base& u, const sc_unsigned& v);
01475 friend sc_signed operator % (const sc_int_base& u, const sc_unsigned& v);
01476 const sc_unsigned& operator %= (const sc_int_base& v);
01477 const sc_unsigned& operator %= (const sc_uint_base& v);
01478
01479
01480
01481
01482
01483 friend sc_signed operator & (const sc_unsigned& u, const sc_signed& v);
01484 friend sc_signed operator & (const sc_signed& u, const sc_unsigned& v);
01485
01486 friend sc_unsigned operator & (const sc_unsigned& u, const sc_unsigned& v);
01487 friend sc_signed operator & (const sc_unsigned& u, int64 v);
01488 friend sc_unsigned operator & (const sc_unsigned& u, uint64 v);
01489 friend sc_signed operator & (const sc_unsigned& u, long v);
01490 friend sc_unsigned operator & (const sc_unsigned& u, unsigned long v);
01491 friend sc_signed operator & (const sc_unsigned& u, int v);
01492 friend sc_unsigned operator & (const sc_unsigned& u, unsigned int v)
01493 { return operator&(u, (unsigned long) v); }
01494
01495 friend sc_signed operator & (int64 u, const sc_unsigned& v);
01496 friend sc_unsigned operator & (uint64 u, const sc_unsigned& v);
01497 friend sc_signed operator & (long u, const sc_unsigned& v);
01498 friend sc_unsigned operator & (unsigned long u, const sc_unsigned& v);
01499 friend sc_signed operator & (int u, const sc_unsigned& v);
01500 friend sc_unsigned operator & (unsigned int u, const sc_unsigned& v)
01501 { return operator&((unsigned long) u, v); }
01502
01503 const sc_unsigned& operator &= (const sc_signed& v);
01504 const sc_unsigned& operator &= (const sc_unsigned& v);
01505 const sc_unsigned& operator &= (int64 v);
01506 const sc_unsigned& operator &= (uint64 v);
01507 const sc_unsigned& operator &= (long v);
01508 const sc_unsigned& operator &= (unsigned long v);
01509 const sc_unsigned& operator &= (int v)
01510 { return operator&=((long) v); }
01511 const sc_unsigned& operator &= (unsigned int v)
01512 { return operator&=((unsigned long) v); }
01513
01514 friend sc_unsigned operator & (const sc_unsigned& u, const sc_uint_base& v);
01515 friend sc_signed operator & (const sc_unsigned& u, const sc_int_base& v);
01516 friend sc_unsigned operator & (const sc_uint_base& u, const sc_unsigned& v);
01517 friend sc_signed operator & (const sc_int_base& u, const sc_unsigned& v);
01518 const sc_unsigned& operator &= (const sc_int_base& v);
01519 const sc_unsigned& operator &= (const sc_uint_base& v);
01520
01521
01522
01523 friend sc_signed operator | (const sc_unsigned& u, const sc_signed& v);
01524 friend sc_signed operator | (const sc_signed& u, const sc_unsigned& v);
01525
01526 friend sc_unsigned operator | (const sc_unsigned& u, const sc_unsigned& v);
01527 friend sc_signed operator | (const sc_unsigned& u, int64 v);
01528 friend sc_unsigned operator | (const sc_unsigned& u, uint64 v);
01529 friend sc_signed operator | (const sc_unsigned& u, long v);
01530 friend sc_unsigned operator | (const sc_unsigned& u, unsigned long v);
01531 friend sc_signed operator | (const sc_unsigned& u, int v);
01532 friend sc_unsigned operator | (const sc_unsigned& u, unsigned int v)
01533 { return operator|(u, (unsigned long) v); }
01534
01535 friend sc_signed operator | (int64 u, const sc_unsigned& v);
01536 friend sc_unsigned operator | (uint64 u, const sc_unsigned& v);
01537 friend sc_signed operator | (long u, const sc_unsigned& v);
01538 friend sc_unsigned operator | (unsigned long u, const sc_unsigned& v);
01539 friend sc_signed operator | (int u, const sc_unsigned& v);
01540 friend sc_unsigned operator | (unsigned int u, const sc_unsigned& v)
01541 { return operator|((unsigned long) u, v); }
01542
01543 const sc_unsigned& operator |= (const sc_signed& v);
01544 const sc_unsigned& operator |= (const sc_unsigned& v);
01545 const sc_unsigned& operator |= (int64 v);
01546 const sc_unsigned& operator |= (uint64 v);
01547 const sc_unsigned& operator |= (long v);
01548 const sc_unsigned& operator |= (unsigned long v);
01549 const sc_unsigned& operator |= (int v)
01550 { return operator|=((long) v); }
01551 const sc_unsigned& operator |= (unsigned int v)
01552 { return operator|=((unsigned long) v); }
01553
01554 friend sc_unsigned operator | (const sc_unsigned& u, const sc_uint_base& v);
01555 friend sc_signed operator | (const sc_unsigned& u, const sc_int_base& v);
01556 friend sc_unsigned operator | (const sc_uint_base& u, const sc_unsigned& v);
01557 friend sc_signed operator | (const sc_int_base& u, const sc_unsigned& v);
01558 const sc_unsigned& operator |= (const sc_int_base& v);
01559 const sc_unsigned& operator |= (const sc_uint_base& v);
01560
01561
01562
01563 friend sc_signed operator ^ (const sc_unsigned& u, const sc_signed& v);
01564 friend sc_signed operator ^ (const sc_signed& u, const sc_unsigned& v);
01565
01566 friend sc_unsigned operator ^ (const sc_unsigned& u, const sc_unsigned& v);
01567 friend sc_signed operator ^ (const sc_unsigned& u, int64 v);
01568 friend sc_unsigned operator ^ (const sc_unsigned& u, uint64 v);
01569 friend sc_signed operator ^ (const sc_unsigned& u, long v);
01570 friend sc_unsigned operator ^ (const sc_unsigned& u, unsigned long v);
01571 friend sc_signed operator ^ (const sc_unsigned& u, int v);
01572 friend sc_unsigned operator ^ (const sc_unsigned& u, unsigned int v)
01573 { return operator^(u, (unsigned long) v); }
01574
01575 friend sc_signed operator ^ (int64 u, const sc_unsigned& v);
01576 friend sc_unsigned operator ^ (uint64 u, const sc_unsigned& v);
01577 friend sc_signed operator ^ (long u, const sc_unsigned& v);
01578 friend sc_unsigned operator ^ (unsigned long u, const sc_unsigned& v);
01579 friend sc_signed operator ^ (int u, const sc_unsigned& v);
01580 friend sc_unsigned operator ^ (unsigned int u, const sc_unsigned& v)
01581 { return operator^((unsigned long) u, v); }
01582
01583 const sc_unsigned& operator ^= (const sc_signed& v);
01584 const sc_unsigned& operator ^= (const sc_unsigned& v);
01585 const sc_unsigned& operator ^= (int64 v);
01586 const sc_unsigned& operator ^= (uint64 v);
01587 const sc_unsigned& operator ^= (long v);
01588 const sc_unsigned& operator ^= (unsigned long v);
01589 const sc_unsigned& operator ^= (int v)
01590 { return operator^=((long) v); }
01591 const sc_unsigned& operator ^= (unsigned int v)
01592 { return operator^=((unsigned long) v); }
01593
01594 friend sc_unsigned operator ^ (const sc_unsigned& u, const sc_uint_base& v);
01595 friend sc_signed operator ^ (const sc_unsigned& u, const sc_int_base& v);
01596 friend sc_unsigned operator ^ (const sc_uint_base& u, const sc_unsigned& v);
01597 friend sc_signed operator ^ (const sc_int_base& u, const sc_unsigned& v);
01598 const sc_unsigned& operator ^= (const sc_int_base& v);
01599 const sc_unsigned& operator ^= (const sc_uint_base& v);
01600
01601
01602
01603
01604
01605 friend sc_unsigned operator << (const sc_unsigned& u, const sc_signed& v);
01606 friend sc_signed operator << (const sc_signed& u, const sc_unsigned& v);
01607
01608 friend sc_unsigned operator << (const sc_unsigned& u, const sc_unsigned& v);
01609 friend sc_unsigned operator << (const sc_unsigned& u, int64 v);
01610 friend sc_unsigned operator << (const sc_unsigned& u, uint64 v);
01611 friend sc_unsigned operator << (const sc_unsigned& u, long v);
01612 friend sc_unsigned operator << (const sc_unsigned& u, unsigned long v);
01613 friend sc_unsigned operator << (const sc_unsigned& u, int v)
01614 { return operator<<(u, (long) v); }
01615 friend sc_unsigned operator << (const sc_unsigned& u, unsigned int v)
01616 { return operator<<(u, (unsigned long) v); }
01617
01618 const sc_unsigned& operator <<= (const sc_signed& v);
01619 const sc_unsigned& operator <<= (const sc_unsigned& v);
01620 const sc_unsigned& operator <<= (int64 v);
01621 const sc_unsigned& operator <<= (uint64 v);
01622 const sc_unsigned& operator <<= (long v);
01623 const sc_unsigned& operator <<= (unsigned long v);
01624 const sc_unsigned& operator <<= (int v)
01625 { return operator<<=((long) v); }
01626 const sc_unsigned& operator <<= (unsigned int v)
01627 { return operator<<=((unsigned long) v); }
01628
01629 friend sc_unsigned operator << (const sc_unsigned& u, const sc_uint_base& v);
01630 friend sc_unsigned operator << (const sc_unsigned& u, const sc_int_base& v);
01631 const sc_unsigned& operator <<= (const sc_int_base& v);
01632 const sc_unsigned& operator <<= (const sc_uint_base& v);
01633
01634
01635
01636 friend sc_unsigned operator >> (const sc_unsigned& u, const sc_signed& v);
01637 friend sc_signed operator >> (const sc_signed& u, const sc_unsigned& v);
01638
01639 friend sc_unsigned operator >> (const sc_unsigned& u, const sc_unsigned& v);
01640 friend sc_unsigned operator >> (const sc_unsigned& u, int64 v);
01641 friend sc_unsigned operator >> (const sc_unsigned& u, uint64 v);
01642 friend sc_unsigned operator >> (const sc_unsigned& u, long v);
01643 friend sc_unsigned operator >> (const sc_unsigned& u, unsigned long v);
01644 friend sc_unsigned operator >> (const sc_unsigned& u, int v)
01645 { return operator>>(u, (long) v); }
01646 friend sc_unsigned operator >> (const sc_unsigned& u, unsigned int v)
01647 { return operator>>(u, (unsigned long) v); }
01648
01649 const sc_unsigned& operator >>= (const sc_signed& v);
01650 const sc_unsigned& operator >>= (const sc_unsigned& v);
01651 const sc_unsigned& operator >>= (int64 v);
01652 const sc_unsigned& operator >>= (uint64 v);
01653 const sc_unsigned& operator >>= (long v);
01654 const sc_unsigned& operator >>= (unsigned long v);
01655 const sc_unsigned& operator >>= (int v)
01656 { return operator>>=((long) v); }
01657 const sc_unsigned& operator >>= (unsigned int v)
01658 { return operator>>=((unsigned long) v); }
01659
01660 friend sc_unsigned operator >> ( const sc_unsigned& , const sc_uint_base& );
01661 friend sc_unsigned operator >> ( const sc_unsigned&, const sc_int_base& );
01662 const sc_unsigned& operator >>= (const sc_int_base& v);
01663 const sc_unsigned& operator >>= (const sc_uint_base& v);
01664
01665
01666 friend sc_unsigned operator + (const sc_unsigned& u);
01667 friend sc_signed operator - (const sc_unsigned& u);
01668
01669
01670
01671
01672
01673 friend bool operator == (const sc_unsigned& u, const sc_signed& v);
01674 friend bool operator == (const sc_signed& u, const sc_unsigned& v);
01675
01676 friend bool operator == (const sc_unsigned& u, const sc_unsigned& v);
01677 friend bool operator == (const sc_unsigned& u, int64 v);
01678 friend bool operator == (const sc_unsigned& u, uint64 v);
01679 friend bool operator == (const sc_unsigned& u, long v);
01680 friend bool operator == (const sc_unsigned& u, unsigned long v);
01681 friend bool operator == (const sc_unsigned& u, int v)
01682 { return operator==(u, (long) v); }
01683 friend bool operator == (const sc_unsigned& u, unsigned int v)
01684 { return operator==(u, (unsigned long) v); }
01685
01686 friend bool operator == (int64 u, const sc_unsigned& v);
01687 friend bool operator == (uint64 u, const sc_unsigned& v);
01688 friend bool operator == (long u, const sc_unsigned& v);
01689 friend bool operator == (unsigned long u, const sc_unsigned& v);
01690 friend bool operator == (int u, const sc_unsigned& v)
01691 { return operator==((long) u, v); }
01692 friend bool operator == (unsigned int u, const sc_unsigned& v)
01693 { return operator==((unsigned long) u, v); }
01694
01695 friend bool operator == (const sc_unsigned& u, const sc_uint_base& v);
01696 friend bool operator == (const sc_unsigned& u, const sc_int_base& v);
01697 friend bool operator == (const sc_uint_base& u, const sc_unsigned& v);
01698 friend bool operator == (const sc_int_base& u, const sc_unsigned& v);
01699
01700
01701
01702 friend bool operator != (const sc_unsigned& u, const sc_signed& v);
01703 friend bool operator != (const sc_signed& u, const sc_unsigned& v);
01704
01705 friend bool operator != (const sc_unsigned& u, const sc_unsigned& v);
01706 friend bool operator != (const sc_unsigned& u, int64 v);
01707 friend bool operator != (const sc_unsigned& u, uint64 v);
01708 friend bool operator != (const sc_unsigned& u, long v);
01709 friend bool operator != (const sc_unsigned& u, unsigned long v);
01710 friend bool operator != (const sc_unsigned& u, int v)
01711 { return operator!=(u, (long) v); }
01712 friend bool operator != (const sc_unsigned& u, unsigned int v)
01713 { return operator!=(u, (unsigned long) v); }
01714
01715 friend bool operator != (int64 u, const sc_unsigned& v);
01716 friend bool operator != (uint64 u, const sc_unsigned& v);
01717 friend bool operator != (long u, const sc_unsigned& v);
01718 friend bool operator != (unsigned long u, const sc_unsigned& v);
01719 friend bool operator != (int u, const sc_unsigned& v)
01720 { return operator!=((long) u, v); }
01721 friend bool operator != (unsigned int u, const sc_unsigned& v)
01722 { return operator!=((unsigned long) u, v); }
01723
01724 friend bool operator != (const sc_unsigned& u, const sc_uint_base& v);
01725 friend bool operator != (const sc_unsigned& u, const sc_int_base& v);
01726 friend bool operator != (const sc_uint_base& u, const sc_unsigned& v);
01727 friend bool operator != (const sc_int_base& u, const sc_unsigned& v);
01728
01729
01730
01731 friend bool operator < (const sc_unsigned& u, const sc_signed& v);
01732 friend bool operator < (const sc_signed& u, const sc_unsigned& v);
01733
01734 friend bool operator < (const sc_unsigned& u, const sc_unsigned& v);
01735 friend bool operator < (const sc_unsigned& u, int64 v);
01736 friend bool operator < (const sc_unsigned& u, uint64 v);
01737 friend bool operator < (const sc_unsigned& u, long v);
01738 friend bool operator < (const sc_unsigned& u, unsigned long v);
01739 friend bool operator < (const sc_unsigned& u, int v)
01740 { return operator<(u, (long) v); }
01741 friend bool operator < (const sc_unsigned& u, unsigned int v)
01742 { return operator<(u, (unsigned long) v); }
01743
01744 friend bool operator < (int64 u, const sc_unsigned& v);
01745 friend bool operator < (uint64 u, const sc_unsigned& v);
01746 friend bool operator < (long u, const sc_unsigned& v);
01747 friend bool operator < (unsigned long u, const sc_unsigned& v);
01748 friend bool operator < (int u, const sc_unsigned& v)
01749 { return operator<((long) u, v); }
01750 friend bool operator < (unsigned int u, const sc_unsigned& v)
01751 { return operator<((unsigned long) u, v); }
01752
01753 friend bool operator < (const sc_unsigned& u, const sc_uint_base& v);
01754 friend bool operator < (const sc_unsigned& u, const sc_int_base& v);
01755 friend bool operator < (const sc_uint_base& u, const sc_unsigned& v);
01756 friend bool operator < (const sc_int_base& u, const sc_unsigned& v);
01757
01758
01759
01760 friend bool operator <= (const sc_unsigned& u, const sc_signed& v);
01761 friend bool operator <= (const sc_signed& u, const sc_unsigned& v);
01762
01763 friend bool operator <= (const sc_unsigned& u, const sc_unsigned& v);
01764 friend bool operator <= (const sc_unsigned& u, int64 v);
01765 friend bool operator <= (const sc_unsigned& u, uint64 v);
01766 friend bool operator <= (const sc_unsigned& u, long v);
01767 friend bool operator <= (const sc_unsigned& u, unsigned long v);
01768 friend bool operator <= (const sc_unsigned& u, int v)
01769 { return operator<=(u, (long) v); }
01770 friend bool operator <= (const sc_unsigned& u, unsigned int v)
01771 { return operator<=(u, (unsigned long) v); }
01772
01773 friend bool operator <= (int64 u, const sc_unsigned& v);
01774 friend bool operator <= (uint64 u, const sc_unsigned& v);
01775 friend bool operator <= (long u, const sc_unsigned& v);
01776 friend bool operator <= (unsigned long u, const sc_unsigned& v);
01777 friend bool operator <= (int u, const sc_unsigned& v)
01778 { return operator<=((long) u, v); }
01779 friend bool operator <= (unsigned int u, const sc_unsigned& v)
01780 { return operator<=((unsigned long) u, v); }
01781
01782 friend bool operator <= (const sc_unsigned& u, const sc_uint_base& v);
01783 friend bool operator <= (const sc_unsigned& u, const sc_int_base& v);
01784 friend bool operator <= (const sc_uint_base& u, const sc_unsigned& v);
01785 friend bool operator <= (const sc_int_base& u, const sc_unsigned& v);
01786
01787
01788
01789 friend bool operator > (const sc_unsigned& u, const sc_signed& v);
01790 friend bool operator > (const sc_signed& u, const sc_unsigned& v);
01791
01792 friend bool operator > (const sc_unsigned& u, const sc_unsigned& v);
01793 friend bool operator > (const sc_unsigned& u, int64 v);
01794 friend bool operator > (const sc_unsigned& u, uint64 v);
01795 friend bool operator > (const sc_unsigned& u, long v);
01796 friend bool operator > (const sc_unsigned& u, unsigned long v);
01797 friend bool operator > (const sc_unsigned& u, int v)
01798 { return operator>(u, (long) v); }
01799 friend bool operator > (const sc_unsigned& u, unsigned int v)
01800 { return operator>(u, (unsigned long) v); }
01801
01802 friend bool operator > (int64 u, const sc_unsigned& v);
01803 friend bool operator > (uint64 u, const sc_unsigned& v);
01804 friend bool operator > (long u, const sc_unsigned& v);
01805 friend bool operator > (unsigned long u, const sc_unsigned& v);
01806 friend bool operator > (int u, const sc_unsigned& v)
01807 { return operator>((long) u, v); }
01808 friend bool operator > (unsigned int u, const sc_unsigned& v)
01809 { return operator>((unsigned long) u, v); }
01810
01811 friend bool operator > (const sc_unsigned& u, const sc_uint_base& v);
01812 friend bool operator > (const sc_unsigned& u, const sc_int_base& v);
01813 friend bool operator > (const sc_uint_base& u, const sc_unsigned& v);
01814 friend bool operator > (const sc_int_base& u, const sc_unsigned& v);
01815
01816
01817
01818 friend bool operator >= (const sc_unsigned& u, const sc_signed& v);
01819 friend bool operator >= (const sc_signed& u, const sc_unsigned& v);
01820
01821 friend bool operator >= (const sc_unsigned& u, const sc_unsigned& v);
01822 friend bool operator >= (const sc_unsigned& u, int64 v);
01823 friend bool operator >= (const sc_unsigned& u, uint64 v);
01824 friend bool operator >= (const sc_unsigned& u, long v);
01825 friend bool operator >= (const sc_unsigned& u, unsigned long v);
01826 friend bool operator >= (const sc_unsigned& u, int v)
01827 { return operator>=(u, (long) v); }
01828 friend bool operator >= (const sc_unsigned& u, unsigned int v)
01829 { return operator>=(u, (unsigned long) v); }
01830
01831 friend bool operator >= (int64 u, const sc_unsigned& v);
01832 friend bool operator >= (uint64 u, const sc_unsigned& v);
01833 friend bool operator >= (long u, const sc_unsigned& v);
01834 friend bool operator >= (unsigned long u, const sc_unsigned& v);
01835 friend bool operator >= (int u, const sc_unsigned& v)
01836 { return operator>=((long) u, v); }
01837 friend bool operator >= (unsigned int u, const sc_unsigned& v)
01838 { return operator>=((unsigned long) u, v); }
01839
01840 friend bool operator >= (const sc_unsigned& u, const sc_uint_base& v);
01841 friend bool operator >= (const sc_unsigned& u, const sc_int_base& v);
01842 friend bool operator >= (const sc_uint_base& u, const sc_unsigned& v);
01843 friend bool operator >= (const sc_int_base& u, const sc_unsigned& v);
01844
01845
01846 friend sc_unsigned operator ~ (const sc_unsigned& u);
01847
01848
01849 friend int compare_unsigned(small_type us,
01850 int unb,
01851 int und,
01852 const sc_digit *ud,
01853 small_type vs,
01854 int vnb,
01855 int vnd,
01856 const sc_digit *vd,
01857 small_type if_u_signed = 0,
01858 small_type if_v_signed = 0);
01859
01860 friend sc_unsigned add_unsigned_friend(small_type us,
01861 int unb,
01862 int und,
01863 const sc_digit *ud,
01864 small_type vs,
01865 int vnb,
01866 int vnd,
01867 const sc_digit *vd);
01868
01869 friend sc_unsigned sub_unsigned_friend(small_type us,
01870 int unb,
01871 int und,
01872 const sc_digit *ud,
01873 small_type vs,
01874 int vnb,
01875 int vnd,
01876 const sc_digit *vd);
01877
01878 friend sc_unsigned mul_unsigned_friend(small_type s,
01879 int unb,
01880 int und,
01881 const sc_digit *ud,
01882 int vnb,
01883 int vnd,
01884 const sc_digit *vd);
01885
01886 friend sc_unsigned div_unsigned_friend(small_type s,
01887 int unb,
01888 int und,
01889 const sc_digit *ud,
01890 int vnb,
01891 int vnd,
01892 const sc_digit *vd);
01893
01894 friend sc_unsigned mod_unsigned_friend(small_type us,
01895 int unb,
01896 int und,
01897 const sc_digit *ud,
01898 int vnb,
01899 int vnd,
01900 const sc_digit *vd);
01901
01902 friend sc_unsigned and_unsigned_friend(small_type us,
01903 int unb,
01904 int und,
01905 const sc_digit *ud,
01906 small_type vs,
01907 int vnb,
01908 int vnd,
01909 const sc_digit *vd);
01910
01911 friend sc_unsigned or_unsigned_friend(small_type us,
01912 int unb,
01913 int und,
01914 const sc_digit *ud,
01915 small_type vs,
01916 int vnb,
01917 int vnd,
01918 const sc_digit *vd);
01919
01920 friend sc_unsigned xor_unsigned_friend(small_type us,
01921 int unb,
01922 int und,
01923 const sc_digit *ud,
01924 small_type vs,
01925 int vnb,
01926 int vnd,
01927 const sc_digit *vd);
01928
01929 public:
01930 static sc_core::sc_vpool<sc_unsigned> m_pool;
01931
01932 private:
01933
01934 small_type sgn;
01935 int nbits;
01936 int ndigits;
01937
01938 #ifdef SC_MAX_NBITS
01939 sc_digit digit[DIV_CEIL(SC_MAX_NBITS)];
01940 #else
01941 sc_digit *digit;
01942 #endif
01943
01944
01945
01946
01947 sc_unsigned(const sc_unsigned& v, small_type s);
01948 sc_unsigned(const sc_signed& v, small_type s);
01949
01950
01951 sc_unsigned(small_type s, int nb, int nd,
01952 sc_digit *d, bool alloc = true);
01953
01954
01955 sc_unsigned(const sc_signed* u, int l, int r);
01956 sc_unsigned(const sc_unsigned* u, int l, int r);
01957
01958
01959
01960 small_type default_sign() const
01961 { return SC_POS; }
01962
01963 int num_bits(int nb) const { return nb + 1; }
01964
01965 bool check_if_outside(int bit_num) const;
01966
01967 void copy_digits(int nb, int nd, const sc_digit *d)
01968 { copy_digits_unsigned(sgn, nbits, ndigits, digit, nb, nd, d); }
01969
01970 void makezero()
01971 { sgn = make_zero(ndigits, digit); }
01972
01973
01974
01975 void convert_2C_to_SM()
01976 { sgn = convert_unsigned_2C_to_SM(nbits, ndigits, digit); }
01977
01978 void convert_SM_to_2C_to_SM()
01979 { sgn = convert_unsigned_SM_to_2C_to_SM(sgn, nbits, ndigits, digit); }
01980
01981 void convert_SM_to_2C()
01982 { convert_unsigned_SM_to_2C(sgn, ndigits, digit); }
01983
01984 };
01985
01986
01987
01988 inline
01989 ::std::ostream&
01990 operator << ( ::std::ostream&, const sc_unsigned& );
01991
01992 inline
01993 ::std::istream&
01994 operator >> ( ::std::istream&, sc_unsigned& );
01995
01996
01997
01998
01999
02000
02001
02002
02003
02004
02005
02006 inline
02007 ::std::ostream&
02008 operator << ( ::std::ostream& os, const sc_unsigned_bitref_r& a )
02009 {
02010 a.print( os );
02011 return os;
02012 }
02013
02014
02015
02016
02017
02018
02019
02020
02021 template<class T>
02022 inline const sc_unsigned_subref& sc_unsigned_subref::operator = (
02023 const sc_generic_base<T>& a )
02024 {
02025 sc_unsigned temp( length() );
02026 a->to_sc_unsigned(temp);
02027 return *this = temp;
02028 }
02029
02030 inline
02031 ::std::istream&
02032 operator >> ( ::std::istream& is, sc_unsigned_bitref& a )
02033 {
02034 a.scan( is );
02035 return is;
02036 }
02037
02038
02039
02040
02041
02042
02043
02044
02045
02046
02047 inline bool sc_unsigned_subref_r::and_reduce() const
02048 {
02049 const sc_unsigned* target_p = m_obj_p;
02050 for ( int i = m_right; i <= m_left; i++ )
02051 if ( !target_p->test(i) ) return false;
02052 return true;
02053 }
02054
02055 inline bool sc_unsigned_subref_r::nand_reduce() const
02056 {
02057 return !and_reduce();
02058 }
02059
02060 inline bool sc_unsigned_subref_r::or_reduce() const
02061 {
02062 const sc_unsigned* target_p = m_obj_p;
02063 for ( int i = m_right; i <= m_left; i++ )
02064 if ( target_p->test(i) ) return true;
02065 return false;
02066 }
02067
02068 inline bool sc_unsigned_subref_r::nor_reduce() const
02069 {
02070 return !or_reduce();
02071 }
02072
02073 inline bool sc_unsigned_subref_r::xor_reduce() const
02074 {
02075 int odd;
02076 const sc_unsigned* target_p = m_obj_p;
02077 odd = 0;
02078 for ( int i = m_right; i <= m_left; i++ )
02079 if ( target_p->test(i) ) odd = ~odd;
02080 return odd ? true : false;
02081 }
02082
02083 inline bool sc_unsigned_subref_r::xnor_reduce() const
02084 {
02085 return !xor_reduce();
02086 }
02087
02088
02089 inline
02090 ::std::ostream&
02091 operator << ( ::std::ostream& os, const sc_unsigned_subref_r& a )
02092 {
02093 a.print( os );
02094 return os;
02095 }
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106 inline
02107 const sc_unsigned_subref&
02108 sc_unsigned_subref::operator = ( const char* a )
02109 {
02110 sc_unsigned aa( length() );
02111 return ( *this = aa = a );
02112 }
02113
02114
02115 inline
02116 ::std::istream&
02117 operator >> ( ::std::istream& is, sc_unsigned_subref& a )
02118 {
02119 a.scan( is );
02120 return is;
02121 }
02122
02123
02124
02125
02126
02127
02128
02129
02130
02131 template<class T>
02132 sc_unsigned::sc_unsigned( const sc_generic_base<T>& v )
02133 {
02134 int nb = v->length();
02135 sgn = default_sign();
02136 if( nb > 0 ) {
02137 nbits = num_bits( nb );
02138 } else {
02139 char msg[BUFSIZ];
02140 std::sprintf( msg,
02141 "sc_unsigned( sc_generic_base<T> ) : nb = %d is not valid", nb);
02142 SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
02143 }
02144 ndigits = DIV_CEIL(nbits);
02145 # ifdef SC_MAX_NBITS
02146 test_bound(nb);
02147 # else
02148 digit = new sc_digit[ndigits];
02149 # endif
02150 makezero();
02151 v->to_sc_unsigned(*this);
02152 }
02153
02154
02155 inline
02156 ::std::ostream&
02157 operator << ( ::std::ostream& os, const sc_unsigned& a )
02158 {
02159 a.print( os );
02160 return os;
02161 }
02162
02163 inline
02164 ::std::istream&
02165 operator >> ( ::std::istream& is, sc_unsigned& a )
02166 {
02167 a.scan( is );
02168 return is;
02169 }
02170
02171
02172 }
02173
02174
02175 #endif