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