sc_ufix.h revision 12027:1eb7dc7aa10b
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_ufix.h - 23 24 Original Author: Martin Janssen, Synopsys, Inc. 25 26 *****************************************************************************/ 27 28/***************************************************************************** 29 30 MODIFICATION LOG - modifiers, enter your name, affiliation, date and 31 changes you are making here. 32 33 Name, Affiliation, Date: 34 Description of Modification: 35 36 *****************************************************************************/ 37 38// $Log: sc_ufix.h,v $ 39// Revision 1.2 2011/01/20 22:52:30 acg 40// Andy Goodrich: Add float constructors. 41// 42// Revision 1.1.1.1 2006/12/15 20:20:04 acg 43// SystemC 2.3 44// 45// Revision 1.3 2006/01/13 18:53:58 acg 46// Andy Goodrich: added $Log command so that CVS comments are reproduced in 47// the source. 48// 49 50#ifndef SC_UFIX_H 51#define SC_UFIX_H 52 53 54#include "sysc/datatypes/fx/sc_fxnum.h" 55 56 57namespace sc_dt 58{ 59 60// classes defined in this module 61class sc_ufix; 62class sc_ufix_fast; 63 64 65// ---------------------------------------------------------------------------- 66// CLASS : sc_ufix 67// 68// "Unconstrained" unsigned fixed-point class; arbitrary precision. 69// ---------------------------------------------------------------------------- 70 71class sc_ufix : public sc_fxnum 72{ 73 74public: 75 76 // constructors 77 78 explicit sc_ufix( sc_fxnum_observer* = 0 ); 79 sc_ufix( int, int, 80 sc_fxnum_observer* = 0 ); 81 sc_ufix( sc_q_mode, sc_o_mode, 82 sc_fxnum_observer* = 0 ); 83 sc_ufix( sc_q_mode, sc_o_mode, int, 84 sc_fxnum_observer* = 0 ); 85 sc_ufix( int, int, sc_q_mode, sc_o_mode, 86 sc_fxnum_observer* = 0 ); 87 sc_ufix( int, int, sc_q_mode, sc_o_mode, int, 88 sc_fxnum_observer* = 0 ); 89 explicit sc_ufix( const sc_fxcast_switch&, 90 sc_fxnum_observer* = 0 ); 91 sc_ufix( int, int, 92 const sc_fxcast_switch&, 93 sc_fxnum_observer* = 0 ); 94 sc_ufix( sc_q_mode, sc_o_mode, 95 const sc_fxcast_switch&, 96 sc_fxnum_observer* = 0 ); 97 sc_ufix( sc_q_mode, sc_o_mode, int, 98 const sc_fxcast_switch&, 99 sc_fxnum_observer* = 0 ); 100 sc_ufix( int, int, sc_q_mode, sc_o_mode, 101 const sc_fxcast_switch&, 102 sc_fxnum_observer* = 0 ); 103 sc_ufix( int, int, sc_q_mode, sc_o_mode, int, 104 const sc_fxcast_switch&, 105 sc_fxnum_observer* = 0 ); 106 explicit sc_ufix( const sc_fxtype_params&, 107 sc_fxnum_observer* = 0 ); 108 sc_ufix( const sc_fxtype_params&, 109 const sc_fxcast_switch&, 110 sc_fxnum_observer* = 0 ); 111 112#define DECL_CTORS_T(tp) \ 113 sc_ufix( tp, \ 114 int, int, \ 115 sc_fxnum_observer* = 0 ); \ 116 sc_ufix( tp, \ 117 sc_q_mode, sc_o_mode, \ 118 sc_fxnum_observer* = 0 ); \ 119 sc_ufix( tp, \ 120 sc_q_mode, sc_o_mode, int, \ 121 sc_fxnum_observer* = 0 ); \ 122 sc_ufix( tp, \ 123 int, int, sc_q_mode, sc_o_mode, \ 124 sc_fxnum_observer* = 0 ); \ 125 sc_ufix( tp, \ 126 int, int, sc_q_mode, sc_o_mode, int, \ 127 sc_fxnum_observer* = 0 ); \ 128 sc_ufix( tp, \ 129 const sc_fxcast_switch&, \ 130 sc_fxnum_observer* = 0 ); \ 131 sc_ufix( tp, \ 132 int, int, \ 133 const sc_fxcast_switch&, \ 134 sc_fxnum_observer* = 0 ); \ 135 sc_ufix( tp, \ 136 sc_q_mode, sc_o_mode, \ 137 const sc_fxcast_switch&, \ 138 sc_fxnum_observer* = 0 ); \ 139 sc_ufix( tp, \ 140 sc_q_mode, sc_o_mode, int, \ 141 const sc_fxcast_switch&, \ 142 sc_fxnum_observer* = 0 ); \ 143 sc_ufix( tp, \ 144 int, int, sc_q_mode, sc_o_mode, \ 145 const sc_fxcast_switch&, \ 146 sc_fxnum_observer* = 0 ); \ 147 sc_ufix( tp, \ 148 int, int, sc_q_mode, sc_o_mode, int, \ 149 const sc_fxcast_switch&, \ 150 sc_fxnum_observer* = 0 ); \ 151 sc_ufix( tp, \ 152 const sc_fxtype_params&, \ 153 sc_fxnum_observer* = 0 ); \ 154 sc_ufix( tp, \ 155 const sc_fxtype_params&, \ 156 const sc_fxcast_switch&, \ 157 sc_fxnum_observer* = 0 ); 158 159#define DECL_CTORS_T_A(tp) \ 160 sc_ufix( tp, \ 161 sc_fxnum_observer* = 0 ); \ 162 DECL_CTORS_T(tp) 163 164#define DECL_CTORS_T_B(tp) \ 165 explicit sc_ufix( tp, \ 166 sc_fxnum_observer* = 0 ); \ 167 DECL_CTORS_T(tp) 168 169 DECL_CTORS_T_A(int) 170 DECL_CTORS_T_A(unsigned int) 171 DECL_CTORS_T_A(long) 172 DECL_CTORS_T_A(unsigned long) 173 DECL_CTORS_T_A(float) 174 DECL_CTORS_T_A(double) 175 DECL_CTORS_T_A(const char*) 176 DECL_CTORS_T_A(const sc_fxval&) 177 DECL_CTORS_T_A(const sc_fxval_fast&) 178 DECL_CTORS_T_A(const sc_fxnum&) 179 DECL_CTORS_T_A(const sc_fxnum_fast&) 180#ifndef SC_FX_EXCLUDE_OTHER 181 DECL_CTORS_T_B(int64) 182 DECL_CTORS_T_B(uint64) 183 DECL_CTORS_T_B(const sc_int_base&) 184 DECL_CTORS_T_B(const sc_uint_base&) 185 DECL_CTORS_T_B(const sc_signed&) 186 DECL_CTORS_T_B(const sc_unsigned&) 187#endif 188 189#undef DECL_CTORS_T 190#undef DECL_CTORS_T_A 191#undef DECL_CTORS_T_B 192 193 // copy constructor 194 195 sc_ufix( const sc_ufix& ); 196 197 198 // unary bitwise operators 199 200 const sc_ufix operator ~ () const; 201 202 203 // unary bitwise functions 204 205 friend void b_not( sc_ufix&, const sc_ufix& ); 206 207 208 // binary bitwise operators 209 210 friend const sc_ufix operator & ( const sc_ufix&, const sc_ufix& ); 211 friend const sc_ufix operator & ( const sc_ufix&, const sc_ufix_fast& ); 212 friend const sc_ufix operator & ( const sc_ufix_fast&, const sc_ufix& ); 213 friend const sc_ufix operator | ( const sc_ufix&, const sc_ufix& ); 214 friend const sc_ufix operator | ( const sc_ufix&, const sc_ufix_fast& ); 215 friend const sc_ufix operator | ( const sc_ufix_fast&, const sc_ufix& ); 216 friend const sc_ufix operator ^ ( const sc_ufix&, const sc_ufix& ); 217 friend const sc_ufix operator ^ ( const sc_ufix&, const sc_ufix_fast& ); 218 friend const sc_ufix operator ^ ( const sc_ufix_fast&, const sc_ufix& ); 219 220 221 // binary bitwise functions 222 223 friend void b_and( sc_ufix&, const sc_ufix&, const sc_ufix& ); 224 friend void b_and( sc_ufix&, const sc_ufix&, const sc_ufix_fast& ); 225 friend void b_and( sc_ufix&, const sc_ufix_fast&, const sc_ufix& ); 226 friend void b_or ( sc_ufix&, const sc_ufix&, const sc_ufix& ); 227 friend void b_or ( sc_ufix&, const sc_ufix&, const sc_ufix_fast& ); 228 friend void b_or ( sc_ufix&, const sc_ufix_fast&, const sc_ufix& ); 229 friend void b_xor( sc_ufix&, const sc_ufix&, const sc_ufix& ); 230 friend void b_xor( sc_ufix&, const sc_ufix&, const sc_ufix_fast& ); 231 friend void b_xor( sc_ufix&, const sc_ufix_fast&, const sc_ufix& ); 232 233 234 // assignment operators 235 236 sc_ufix& operator = ( const sc_ufix& ); 237 238#define DECL_ASN_OP_T(op,tp) \ 239 sc_ufix& operator op ( tp ); 240 241#ifndef SC_FX_EXCLUDE_OTHER 242#define DECL_ASN_OP_OTHER(op) \ 243 DECL_ASN_OP_T(op,int64) \ 244 DECL_ASN_OP_T(op,uint64) \ 245 DECL_ASN_OP_T(op,const sc_int_base&) \ 246 DECL_ASN_OP_T(op,const sc_uint_base&) \ 247 DECL_ASN_OP_T(op,const sc_signed&) \ 248 DECL_ASN_OP_T(op,const sc_unsigned&) 249#else 250#define DECL_ASN_OP_OTHER(op) 251#endif 252 253#define DECL_ASN_OP(op) \ 254 DECL_ASN_OP_T(op,int) \ 255 DECL_ASN_OP_T(op,unsigned int) \ 256 DECL_ASN_OP_T(op,long) \ 257 DECL_ASN_OP_T(op,unsigned long) \ 258 DECL_ASN_OP_T(op,float) \ 259 DECL_ASN_OP_T(op,double) \ 260 DECL_ASN_OP_T(op,const char*) \ 261 DECL_ASN_OP_T(op,const sc_fxval&) \ 262 DECL_ASN_OP_T(op,const sc_fxval_fast&) \ 263 DECL_ASN_OP_T(op,const sc_fxnum&) \ 264 DECL_ASN_OP_T(op,const sc_fxnum_fast&) \ 265 DECL_ASN_OP_OTHER(op) 266 267 DECL_ASN_OP(=) 268 269 DECL_ASN_OP(*=) 270 DECL_ASN_OP(/=) 271 DECL_ASN_OP(+=) 272 DECL_ASN_OP(-=) 273 274 DECL_ASN_OP_T(<<=,int) 275 DECL_ASN_OP_T(>>=,int) 276 277 DECL_ASN_OP_T(&=,const sc_ufix&) 278 DECL_ASN_OP_T(&=,const sc_ufix_fast&) 279 DECL_ASN_OP_T(|=,const sc_ufix&) 280 DECL_ASN_OP_T(|=,const sc_ufix_fast&) 281 DECL_ASN_OP_T(^=,const sc_ufix&) 282 DECL_ASN_OP_T(^=,const sc_ufix_fast&) 283 284#undef DECL_ASN_OP_T 285#undef DECL_ASN_OP_OTHER 286#undef DECL_ASN_OP 287 288 289 // auto-increment and auto-decrement 290 291 const sc_fxval operator ++ ( int ); 292 const sc_fxval operator -- ( int ); 293 294 sc_ufix& operator ++ (); 295 sc_ufix& operator -- (); 296 297}; 298 299 300// ---------------------------------------------------------------------------- 301// CLASS : sc_ufix_fast 302// 303// "Unconstrained" unsigned fixed-point class; limited precision. 304// ---------------------------------------------------------------------------- 305 306class sc_ufix_fast : public sc_fxnum_fast 307{ 308 309public: 310 311 // constructors 312 313 explicit sc_ufix_fast( sc_fxnum_fast_observer* = 0 ); 314 sc_ufix_fast( int, int, 315 sc_fxnum_fast_observer* = 0 ); 316 sc_ufix_fast( sc_q_mode, sc_o_mode, 317 sc_fxnum_fast_observer* = 0 ); 318 sc_ufix_fast( sc_q_mode, sc_o_mode, int, 319 sc_fxnum_fast_observer* = 0 ); 320 sc_ufix_fast( int, int, sc_q_mode, sc_o_mode, 321 sc_fxnum_fast_observer* = 0 ); 322 sc_ufix_fast( int, int, sc_q_mode, sc_o_mode, int, 323 sc_fxnum_fast_observer* = 0 ); 324 explicit sc_ufix_fast( const sc_fxcast_switch&, 325 sc_fxnum_fast_observer* = 0 ); 326 sc_ufix_fast( int, int, 327 const sc_fxcast_switch&, 328 sc_fxnum_fast_observer* = 0 ); 329 sc_ufix_fast( sc_q_mode, sc_o_mode, 330 const sc_fxcast_switch&, 331 sc_fxnum_fast_observer* = 0 ); 332 sc_ufix_fast( sc_q_mode, sc_o_mode, int, 333 const sc_fxcast_switch&, 334 sc_fxnum_fast_observer* = 0 ); 335 sc_ufix_fast( int, int, sc_q_mode, sc_o_mode, 336 const sc_fxcast_switch&, 337 sc_fxnum_fast_observer* = 0 ); 338 sc_ufix_fast( int, int, sc_q_mode, sc_o_mode, int, 339 const sc_fxcast_switch&, 340 sc_fxnum_fast_observer* = 0 ); 341 explicit sc_ufix_fast( const sc_fxtype_params&, 342 sc_fxnum_fast_observer* = 0 ); 343 sc_ufix_fast( const sc_fxtype_params&, 344 const sc_fxcast_switch&, 345 sc_fxnum_fast_observer* = 0 ); 346 347#define DECL_CTORS_T(tp) \ 348 sc_ufix_fast( tp, \ 349 int, int, \ 350 sc_fxnum_fast_observer* = 0 ); \ 351 sc_ufix_fast( tp, \ 352 sc_q_mode, sc_o_mode, \ 353 sc_fxnum_fast_observer* = 0 ); \ 354 sc_ufix_fast( tp, \ 355 sc_q_mode, sc_o_mode, int, \ 356 sc_fxnum_fast_observer* = 0 ); \ 357 sc_ufix_fast( tp, \ 358 int, int, sc_q_mode, sc_o_mode, \ 359 sc_fxnum_fast_observer* = 0 ); \ 360 sc_ufix_fast( tp, \ 361 int, int, sc_q_mode, sc_o_mode, int, \ 362 sc_fxnum_fast_observer* = 0 ); \ 363 sc_ufix_fast( tp, \ 364 const sc_fxcast_switch&, \ 365 sc_fxnum_fast_observer* = 0 ); \ 366 sc_ufix_fast( tp, \ 367 int, int, \ 368 const sc_fxcast_switch&, \ 369 sc_fxnum_fast_observer* = 0 ); \ 370 sc_ufix_fast( tp, \ 371 sc_q_mode, sc_o_mode, \ 372 const sc_fxcast_switch&, \ 373 sc_fxnum_fast_observer* = 0 ); \ 374 sc_ufix_fast( tp, \ 375 sc_q_mode, sc_o_mode, int, \ 376 const sc_fxcast_switch&, \ 377 sc_fxnum_fast_observer* = 0 ); \ 378 sc_ufix_fast( tp, \ 379 int, int, sc_q_mode, sc_o_mode, \ 380 const sc_fxcast_switch&, \ 381 sc_fxnum_fast_observer* = 0 ); \ 382 sc_ufix_fast( tp, \ 383 int, int, sc_q_mode, sc_o_mode, int, \ 384 const sc_fxcast_switch&, \ 385 sc_fxnum_fast_observer* = 0 ); \ 386 sc_ufix_fast( tp, \ 387 const sc_fxtype_params&, \ 388 sc_fxnum_fast_observer* = 0 ); \ 389 sc_ufix_fast( tp, \ 390 const sc_fxtype_params&, \ 391 const sc_fxcast_switch&, \ 392 sc_fxnum_fast_observer* = 0 ); 393 394#define DECL_CTORS_T_A(tp) \ 395 sc_ufix_fast( tp, \ 396 sc_fxnum_fast_observer* = 0 ); \ 397 DECL_CTORS_T(tp) 398 399#define DECL_CTORS_T_B(tp) \ 400 explicit sc_ufix_fast( tp, \ 401 sc_fxnum_fast_observer* = 0 ); \ 402 DECL_CTORS_T(tp) 403 404 DECL_CTORS_T_A(int) 405 DECL_CTORS_T_A(unsigned int) 406 DECL_CTORS_T_A(long) 407 DECL_CTORS_T_A(unsigned long) 408 DECL_CTORS_T_A(float) 409 DECL_CTORS_T_A(double) 410 DECL_CTORS_T_A(const char*) 411 DECL_CTORS_T_A(const sc_fxval&) 412 DECL_CTORS_T_A(const sc_fxval_fast&) 413 DECL_CTORS_T_A(const sc_fxnum&) 414 DECL_CTORS_T_A(const sc_fxnum_fast&) 415#ifndef SC_FX_EXCLUDE_OTHER 416 DECL_CTORS_T_B(int64) 417 DECL_CTORS_T_B(uint64) 418 DECL_CTORS_T_B(const sc_int_base&) 419 DECL_CTORS_T_B(const sc_uint_base&) 420 DECL_CTORS_T_B(const sc_signed&) 421 DECL_CTORS_T_B(const sc_unsigned&) 422#endif 423 424#undef DECL_CTORS_T 425#undef DECL_CTORS_T_A 426#undef DECL_CTORS_T_B 427 428 // copy constructor 429 430 sc_ufix_fast( const sc_ufix_fast& ); 431 432 433 // unary bitwise operators 434 435 const sc_ufix_fast operator ~ () const; 436 437 438 // unary bitwise functions 439 440 friend void b_not( sc_ufix_fast&, const sc_ufix_fast& ); 441 442 443 // binary bitwise operators 444 445 friend const sc_ufix_fast operator & ( const sc_ufix_fast&, 446 const sc_ufix_fast& ); 447 friend const sc_ufix_fast operator ^ ( const sc_ufix_fast&, 448 const sc_ufix_fast& ); 449 friend const sc_ufix_fast operator | ( const sc_ufix_fast&, 450 const sc_ufix_fast& ); 451 452 453 // binary bitwise functions 454 455 friend void b_and( sc_ufix_fast&, const sc_ufix_fast&, 456 const sc_ufix_fast& ); 457 friend void b_or ( sc_ufix_fast&, const sc_ufix_fast&, 458 const sc_ufix_fast& ); 459 friend void b_xor( sc_ufix_fast&, const sc_ufix_fast&, 460 const sc_ufix_fast& ); 461 462 463 // assignment operators 464 465 sc_ufix_fast& operator = ( const sc_ufix_fast& ); 466 467#define DECL_ASN_OP_T(op,tp) \ 468 sc_ufix_fast& operator op ( tp ); 469 470#ifndef SC_FX_EXCLUDE_OTHER 471#define DECL_ASN_OP_OTHER(op) \ 472 DECL_ASN_OP_T(op,int64) \ 473 DECL_ASN_OP_T(op,uint64) \ 474 DECL_ASN_OP_T(op,const sc_int_base&) \ 475 DECL_ASN_OP_T(op,const sc_uint_base&) \ 476 DECL_ASN_OP_T(op,const sc_signed&) \ 477 DECL_ASN_OP_T(op,const sc_unsigned&) 478#else 479#define DECL_ASN_OP_OTHER(op) 480#endif 481 482#define DECL_ASN_OP(op) \ 483 DECL_ASN_OP_T(op,int) \ 484 DECL_ASN_OP_T(op,unsigned int) \ 485 DECL_ASN_OP_T(op,long) \ 486 DECL_ASN_OP_T(op,unsigned long) \ 487 DECL_ASN_OP_T(op,float) \ 488 DECL_ASN_OP_T(op,double) \ 489 DECL_ASN_OP_T(op,const char*) \ 490 DECL_ASN_OP_T(op,const sc_fxval&) \ 491 DECL_ASN_OP_T(op,const sc_fxval_fast&) \ 492 DECL_ASN_OP_T(op,const sc_fxnum&) \ 493 DECL_ASN_OP_T(op,const sc_fxnum_fast&) \ 494 DECL_ASN_OP_OTHER(op) 495 496 DECL_ASN_OP(=) 497 498 DECL_ASN_OP(*=) 499 DECL_ASN_OP(/=) 500 DECL_ASN_OP(+=) 501 DECL_ASN_OP(-=) 502 503 DECL_ASN_OP_T(<<=,int) 504 DECL_ASN_OP_T(>>=,int) 505 506 DECL_ASN_OP_T(&=,const sc_ufix&) 507 DECL_ASN_OP_T(&=,const sc_ufix_fast&) 508 DECL_ASN_OP_T(|=,const sc_ufix&) 509 DECL_ASN_OP_T(|=,const sc_ufix_fast&) 510 DECL_ASN_OP_T(^=,const sc_ufix&) 511 DECL_ASN_OP_T(^=,const sc_ufix_fast&) 512 513#undef DECL_ASN_OP_T 514#undef DECL_ASN_OP_OTHER 515#undef DECL_ASN_OP 516 517 518 // auto-increment and auto-decrement 519 520 const sc_fxval_fast operator ++ ( int ); 521 const sc_fxval_fast operator -- ( int ); 522 523 sc_ufix_fast& operator ++ (); 524 sc_ufix_fast& operator -- (); 525 526}; 527 528 529// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 530 531// ---------------------------------------------------------------------------- 532// CLASS : sc_ufix 533// 534// "Unconstrained" unsigned fixed-point class; arbitrary precision. 535// ---------------------------------------------------------------------------- 536 537// constructors 538 539inline 540sc_ufix::sc_ufix( sc_fxnum_observer* observer_ ) 541: sc_fxnum( sc_fxtype_params(), 542 SC_US_, 543 sc_fxcast_switch(), 544 observer_ ) 545{} 546 547inline 548sc_ufix::sc_ufix( int wl_, int iwl_, 549 sc_fxnum_observer* observer_ ) 550: sc_fxnum( sc_fxtype_params( wl_, iwl_ ), 551 SC_US_, 552 sc_fxcast_switch(), 553 observer_ ) 554{} 555 556inline 557sc_ufix::sc_ufix( sc_q_mode qm, sc_o_mode om, 558 sc_fxnum_observer* observer_ ) 559: sc_fxnum( sc_fxtype_params( qm, om ), 560 SC_US_, 561 sc_fxcast_switch(), 562 observer_ ) 563{} 564 565inline 566sc_ufix::sc_ufix( sc_q_mode qm, sc_o_mode om, int nb, 567 sc_fxnum_observer* observer_ ) 568: sc_fxnum( sc_fxtype_params( qm, om, nb ), 569 SC_US_, 570 sc_fxcast_switch(), 571 observer_ ) 572{} 573 574inline 575sc_ufix::sc_ufix( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, 576 sc_fxnum_observer* observer_ ) 577: sc_fxnum( sc_fxtype_params( wl_, iwl_, qm, om ), 578 SC_US_, 579 sc_fxcast_switch(), 580 observer_ ) 581{} 582 583inline 584sc_ufix::sc_ufix( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, 585 sc_fxnum_observer* observer_ ) 586: sc_fxnum( sc_fxtype_params( wl_, iwl_, qm, om, nb ), 587 SC_US_, 588 sc_fxcast_switch(), 589 observer_ ) 590{} 591 592inline 593sc_ufix::sc_ufix( const sc_fxcast_switch& cast_sw, 594 sc_fxnum_observer* observer_ ) 595: sc_fxnum( sc_fxtype_params(), 596 SC_US_, 597 cast_sw, 598 observer_ ) 599{} 600 601inline 602sc_ufix::sc_ufix( int wl_, int iwl_, 603 const sc_fxcast_switch& cast_sw, 604 sc_fxnum_observer* observer_ ) 605: sc_fxnum( sc_fxtype_params( wl_, iwl_ ), 606 SC_US_, 607 cast_sw, 608 observer_ ) 609{} 610 611inline 612sc_ufix::sc_ufix( sc_q_mode qm, sc_o_mode om, 613 const sc_fxcast_switch& cast_sw, 614 sc_fxnum_observer* observer_ ) 615: sc_fxnum( sc_fxtype_params( qm, om ), 616 SC_US_, 617 cast_sw, 618 observer_ ) 619{} 620 621inline 622sc_ufix::sc_ufix( sc_q_mode qm, sc_o_mode om, int nb, 623 const sc_fxcast_switch& cast_sw, 624 sc_fxnum_observer* observer_ ) 625: sc_fxnum( sc_fxtype_params( qm, om, nb ), 626 SC_US_, 627 cast_sw, 628 observer_ ) 629{} 630 631inline 632sc_ufix::sc_ufix( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, 633 const sc_fxcast_switch& cast_sw, 634 sc_fxnum_observer* observer_ ) 635: sc_fxnum( sc_fxtype_params( wl_, iwl_, qm, om ), 636 SC_US_, 637 cast_sw, 638 observer_ ) 639{} 640 641inline 642sc_ufix::sc_ufix( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, 643 const sc_fxcast_switch& cast_sw, 644 sc_fxnum_observer* observer_ ) 645: sc_fxnum( sc_fxtype_params( wl_, iwl_, qm, om, nb ), 646 SC_US_, 647 cast_sw, 648 observer_ ) 649{} 650 651inline 652sc_ufix::sc_ufix( const sc_fxtype_params& type_params, 653 sc_fxnum_observer* observer_ ) 654: sc_fxnum( type_params, 655 SC_US_, 656 sc_fxcast_switch(), 657 observer_ ) 658{} 659 660inline 661sc_ufix::sc_ufix( const sc_fxtype_params& type_params, 662 const sc_fxcast_switch& cast_sw, 663 sc_fxnum_observer* observer_ ) 664: sc_fxnum( type_params, 665 SC_US_, 666 cast_sw, 667 observer_ ) 668{} 669 670#define DEFN_CTORS_T_A(tp) \ 671inline \ 672sc_ufix::sc_ufix( tp a, \ 673 sc_fxnum_observer* observer_ ) \ 674: sc_fxnum( a, \ 675 sc_fxtype_params(), \ 676 SC_US_, \ 677 sc_fxcast_switch(), \ 678 observer_ ) \ 679{} \ 680 \ 681inline \ 682sc_ufix::sc_ufix( tp a, \ 683 int wl_, int iwl_, \ 684 sc_fxnum_observer* observer_ ) \ 685: sc_fxnum( a, \ 686 sc_fxtype_params( wl_, iwl_ ), \ 687 SC_US_, \ 688 sc_fxcast_switch(), \ 689 observer_ ) \ 690{} \ 691 \ 692inline \ 693sc_ufix::sc_ufix( tp a, \ 694 sc_q_mode qm, sc_o_mode om, \ 695 sc_fxnum_observer* observer_ ) \ 696: sc_fxnum( a, \ 697 sc_fxtype_params( qm, om ), \ 698 SC_US_, \ 699 sc_fxcast_switch(), \ 700 observer_ ) \ 701{} \ 702 \ 703inline \ 704sc_ufix::sc_ufix( tp a, \ 705 sc_q_mode qm, sc_o_mode om, int nb, \ 706 sc_fxnum_observer* observer_ ) \ 707: sc_fxnum( a, \ 708 sc_fxtype_params( qm, om, nb ), \ 709 SC_US_, \ 710 sc_fxcast_switch(), \ 711 observer_ ) \ 712{} \ 713 \ 714inline \ 715sc_ufix::sc_ufix( tp a, \ 716 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \ 717 sc_fxnum_observer* observer_ ) \ 718: sc_fxnum( a, \ 719 sc_fxtype_params( wl_, iwl_, qm, om ), \ 720 SC_US_, \ 721 sc_fxcast_switch(), \ 722 observer_ ) \ 723{} \ 724 \ 725inline \ 726sc_ufix::sc_ufix( tp a, \ 727 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, \ 728 sc_fxnum_observer* observer_ ) \ 729: sc_fxnum( a, \ 730 sc_fxtype_params( wl_, iwl_, qm, om, nb ), \ 731 SC_US_, \ 732 sc_fxcast_switch(), \ 733 observer_ ) \ 734{} \ 735 \ 736inline \ 737sc_ufix::sc_ufix( tp a, \ 738 const sc_fxcast_switch& cast_sw, \ 739 sc_fxnum_observer* observer_ ) \ 740: sc_fxnum( a, \ 741 sc_fxtype_params(), \ 742 SC_US_, \ 743 cast_sw, \ 744 observer_ ) \ 745{} \ 746 \ 747inline \ 748sc_ufix::sc_ufix( tp a, \ 749 int wl_, int iwl_, \ 750 const sc_fxcast_switch& cast_sw, \ 751 sc_fxnum_observer* observer_ ) \ 752: sc_fxnum( a, \ 753 sc_fxtype_params( wl_, iwl_ ), \ 754 SC_US_, \ 755 cast_sw, \ 756 observer_ ) \ 757{} \ 758 \ 759inline \ 760sc_ufix::sc_ufix( tp a, \ 761 sc_q_mode qm, sc_o_mode om, \ 762 const sc_fxcast_switch& cast_sw, \ 763 sc_fxnum_observer* observer_ ) \ 764: sc_fxnum( a, \ 765 sc_fxtype_params( qm, om ), \ 766 SC_US_, \ 767 cast_sw, \ 768 observer_ ) \ 769{} \ 770 \ 771inline \ 772sc_ufix::sc_ufix( tp a, \ 773 sc_q_mode qm, sc_o_mode om, int nb, \ 774 const sc_fxcast_switch& cast_sw, \ 775 sc_fxnum_observer* observer_ ) \ 776: sc_fxnum( a, \ 777 sc_fxtype_params( qm, om, nb ), \ 778 SC_US_, \ 779 cast_sw, \ 780 observer_ ) \ 781{} \ 782 \ 783inline \ 784sc_ufix::sc_ufix( tp a, \ 785 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \ 786 const sc_fxcast_switch& cast_sw, \ 787 sc_fxnum_observer* observer_ ) \ 788: sc_fxnum( a, \ 789 sc_fxtype_params( wl_, iwl_, qm, om ), \ 790 SC_US_, \ 791 cast_sw, \ 792 observer_ ) \ 793{} \ 794 \ 795inline \ 796sc_ufix::sc_ufix( tp a, \ 797 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, \ 798 const sc_fxcast_switch& cast_sw, \ 799 sc_fxnum_observer* observer_ ) \ 800: sc_fxnum( a, \ 801 sc_fxtype_params( wl_, iwl_, qm, om, nb ), \ 802 SC_US_, \ 803 cast_sw, \ 804 observer_ ) \ 805{} \ 806 \ 807inline \ 808sc_ufix::sc_ufix( tp a, \ 809 const sc_fxtype_params& type_params, \ 810 sc_fxnum_observer* observer_ ) \ 811: sc_fxnum( a, \ 812 type_params, \ 813 SC_US_, \ 814 sc_fxcast_switch(), \ 815 observer_ ) \ 816{} \ 817 \ 818inline \ 819sc_ufix::sc_ufix( tp a, \ 820 const sc_fxtype_params& type_params, \ 821 const sc_fxcast_switch& cast_sw, \ 822 sc_fxnum_observer* observer_ ) \ 823: sc_fxnum( a, \ 824 type_params, \ 825 SC_US_, \ 826 cast_sw, \ 827 observer_ ) \ 828{} 829 830#define DEFN_CTORS_T_B(tp) \ 831inline \ 832sc_ufix::sc_ufix( tp a, \ 833 sc_fxnum_observer* observer_ ) \ 834: sc_fxnum( a, \ 835 a.type_params(), \ 836 SC_US_, \ 837 sc_fxcast_switch(), \ 838 observer_ ) \ 839{} \ 840 \ 841inline \ 842sc_ufix::sc_ufix( tp a, \ 843 int wl_, int iwl_, \ 844 sc_fxnum_observer* observer_ ) \ 845: sc_fxnum( a, \ 846 sc_fxtype_params( a.type_params(), wl_, iwl_ ), \ 847 SC_US_, \ 848 sc_fxcast_switch(), \ 849 observer_ ) \ 850{} \ 851 \ 852inline \ 853sc_ufix::sc_ufix( tp a, \ 854 sc_q_mode qm, sc_o_mode om, \ 855 sc_fxnum_observer* observer_ ) \ 856: sc_fxnum( a, \ 857 sc_fxtype_params( a.type_params(), qm, om ), \ 858 SC_US_, \ 859 sc_fxcast_switch(), \ 860 observer_ ) \ 861{} \ 862 \ 863inline \ 864sc_ufix::sc_ufix( tp a, \ 865 sc_q_mode qm, sc_o_mode om, int nb, \ 866 sc_fxnum_observer* observer_ ) \ 867: sc_fxnum( a, \ 868 sc_fxtype_params( a.type_params(), qm, om, nb ), \ 869 SC_US_, \ 870 sc_fxcast_switch(), \ 871 observer_ ) \ 872{} \ 873 \ 874inline \ 875sc_ufix::sc_ufix( tp a, \ 876 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \ 877 sc_fxnum_observer* observer_ ) \ 878: sc_fxnum( a, \ 879 sc_fxtype_params( wl_, iwl_, qm, om ), \ 880 SC_US_, \ 881 sc_fxcast_switch(), \ 882 observer_ ) \ 883{} \ 884 \ 885inline \ 886sc_ufix::sc_ufix( tp a, \ 887 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, \ 888 sc_fxnum_observer* observer_ ) \ 889: sc_fxnum( a, \ 890 sc_fxtype_params( wl_, iwl_, qm, om, nb ), \ 891 SC_US_, \ 892 sc_fxcast_switch(), \ 893 observer_ ) \ 894{} \ 895 \ 896inline \ 897sc_ufix::sc_ufix( tp a, \ 898 const sc_fxcast_switch& cast_sw, \ 899 sc_fxnum_observer* observer_ ) \ 900: sc_fxnum( a, \ 901 a.type_params(), \ 902 SC_US_, \ 903 cast_sw, \ 904 observer_ ) \ 905{} \ 906 \ 907inline \ 908sc_ufix::sc_ufix( tp a, \ 909 int wl_, int iwl_, \ 910 const sc_fxcast_switch& cast_sw, \ 911 sc_fxnum_observer* observer_ ) \ 912: sc_fxnum( a, \ 913 sc_fxtype_params( a.type_params(), wl_, iwl_ ), \ 914 SC_US_, \ 915 cast_sw, \ 916 observer_ ) \ 917{} \ 918 \ 919inline \ 920sc_ufix::sc_ufix( tp a, \ 921 sc_q_mode qm, sc_o_mode om, \ 922 const sc_fxcast_switch& cast_sw, \ 923 sc_fxnum_observer* observer_ ) \ 924: sc_fxnum( a, \ 925 sc_fxtype_params( a.type_params(), qm, om ), \ 926 SC_US_, \ 927 cast_sw, \ 928 observer_ ) \ 929{} \ 930 \ 931inline \ 932sc_ufix::sc_ufix( tp a, \ 933 sc_q_mode qm, sc_o_mode om, int nb, \ 934 const sc_fxcast_switch& cast_sw, \ 935 sc_fxnum_observer* observer_ ) \ 936: sc_fxnum( a, \ 937 sc_fxtype_params( a.type_params(), qm, om, nb ), \ 938 SC_US_, \ 939 cast_sw, \ 940 observer_ ) \ 941{} \ 942 \ 943inline \ 944sc_ufix::sc_ufix( tp a, \ 945 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \ 946 const sc_fxcast_switch& cast_sw, \ 947 sc_fxnum_observer* observer_ ) \ 948: sc_fxnum( a, \ 949 sc_fxtype_params( wl_, iwl_, qm, om ), \ 950 SC_US_, \ 951 cast_sw, \ 952 observer_ ) \ 953{} \ 954 \ 955inline \ 956sc_ufix::sc_ufix( tp a, \ 957 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, \ 958 const sc_fxcast_switch& cast_sw, \ 959 sc_fxnum_observer* observer_ ) \ 960: sc_fxnum( a, \ 961 sc_fxtype_params( wl_, iwl_, qm, om, nb ), \ 962 SC_US_, \ 963 cast_sw, \ 964 observer_ ) \ 965{} \ 966 \ 967inline \ 968sc_ufix::sc_ufix( tp a, \ 969 const sc_fxtype_params& type_params, \ 970 sc_fxnum_observer* observer_ ) \ 971: sc_fxnum( a, \ 972 type_params, \ 973 SC_US_, \ 974 sc_fxcast_switch(), \ 975 observer_ ) \ 976{} \ 977 \ 978inline \ 979sc_ufix::sc_ufix( tp a, \ 980 const sc_fxtype_params& type_params, \ 981 const sc_fxcast_switch& cast_sw, \ 982 sc_fxnum_observer* observer_ ) \ 983: sc_fxnum( a, \ 984 type_params, \ 985 SC_US_, \ 986 cast_sw, \ 987 observer_ ) \ 988{} 989 990DEFN_CTORS_T_A(int) 991DEFN_CTORS_T_A(unsigned int) 992DEFN_CTORS_T_A(long) 993DEFN_CTORS_T_A(unsigned long) 994DEFN_CTORS_T_A(float) 995DEFN_CTORS_T_A(double) 996DEFN_CTORS_T_A(const char*) 997DEFN_CTORS_T_A(const sc_fxval&) 998DEFN_CTORS_T_A(const sc_fxval_fast&) 999DEFN_CTORS_T_B(const sc_fxnum&) 1000DEFN_CTORS_T_B(const sc_fxnum_fast&) 1001#ifndef SC_FX_EXCLUDE_OTHER 1002DEFN_CTORS_T_A(int64) 1003DEFN_CTORS_T_A(uint64) 1004DEFN_CTORS_T_A(const sc_int_base&) 1005DEFN_CTORS_T_A(const sc_uint_base&) 1006DEFN_CTORS_T_A(const sc_signed&) 1007DEFN_CTORS_T_A(const sc_unsigned&) 1008#endif 1009 1010#undef DEFN_CTORS_T_A 1011#undef DEFN_CTORS_T_B 1012 1013// copy constructor 1014 1015inline 1016sc_ufix::sc_ufix( const sc_ufix& a ) 1017: sc_fxnum( a, 1018 a.type_params(), 1019 SC_US_, 1020 sc_fxcast_switch(), 1021 0 ) 1022{} 1023 1024 1025// unary bitwise operators 1026 1027inline 1028const sc_ufix 1029sc_ufix::operator ~ () const 1030{ 1031 SC_FXNUM_OBSERVER_READ_( *this ) 1032 int iwl_c = iwl(); 1033 int wl_c = wl(); 1034 sc_ufix c( wl_c, iwl_c ); 1035 for( int i = iwl_c - wl_c; i < iwl_c; ++ i ) 1036 c.set_bit( i, ! get_bit( i ) ); 1037 return sc_ufix( c, wl_c, iwl_c ); 1038} 1039 1040 1041// unary bitwise functions 1042 1043inline 1044void 1045b_not( sc_ufix& c, const sc_ufix& a ) 1046{ 1047 SC_FXNUM_OBSERVER_READ_( a ) 1048 int iwl_c = c.iwl(); 1049 for( int i = iwl_c - c.wl(); i < iwl_c; ++ i ) 1050 c.set_bit( i, ! a.get_bit( i ) ); 1051 c.cast(); 1052 SC_FXNUM_OBSERVER_WRITE_( c ) 1053} 1054 1055 1056// binary bitwise operators 1057 1058#define DEFN_BIN_OP_T(op,op2,tp1,tp2) \ 1059inline \ 1060const sc_ufix \ 1061operator op ( const tp1& a, const tp2& b ) \ 1062{ \ 1063 a.observer_read(); \ 1064 b.observer_read(); \ 1065 int iwl_a = a.iwl(); \ 1066 int iwl_b = b.iwl(); \ 1067 int iwl_c = sc_max( iwl_a, iwl_b ); \ 1068 int fwl_c = sc_max( a.wl() - iwl_a, b.wl() - iwl_b ); \ 1069 sc_ufix c( iwl_c + fwl_c, iwl_c ); \ 1070 for( int i = -fwl_c; i < iwl_c; ++ i ) \ 1071 c.set_bit( i, a.get_bit( i ) op2 b.get_bit( i ) ); \ 1072 return sc_ufix( c, iwl_c + fwl_c, iwl_c ); \ 1073} 1074 1075DEFN_BIN_OP_T(&,&&,sc_ufix,sc_ufix) 1076DEFN_BIN_OP_T(&,&&,sc_ufix,sc_ufix_fast) 1077DEFN_BIN_OP_T(&,&&,sc_ufix_fast,sc_ufix) 1078 1079DEFN_BIN_OP_T(|,||,sc_ufix,sc_ufix) 1080DEFN_BIN_OP_T(|,||,sc_ufix,sc_ufix_fast) 1081DEFN_BIN_OP_T(|,||,sc_ufix_fast,sc_ufix) 1082 1083DEFN_BIN_OP_T(^,!=,sc_ufix,sc_ufix) 1084DEFN_BIN_OP_T(^,!=,sc_ufix,sc_ufix_fast) 1085DEFN_BIN_OP_T(^,!=,sc_ufix_fast,sc_ufix) 1086 1087#undef DEFN_BIN_OP_T 1088 1089 1090// binary bitwise functions 1091 1092#define DEFN_BIN_FNC_T(fnc,op2,tp1,tp2) \ 1093inline \ 1094void \ 1095fnc ( sc_ufix& c, const tp1& a, const tp2& b ) \ 1096{ \ 1097 a.observer_read(); \ 1098 b.observer_read(); \ 1099 int iwl_c = c.iwl(); \ 1100 for( int i = iwl_c - c.wl(); i < iwl_c; ++ i ) \ 1101 c.set_bit( i, a.get_bit( i ) op2 b.get_bit( i ) ); \ 1102 c.cast(); \ 1103 SC_FXNUM_OBSERVER_WRITE_( c ) \ 1104} 1105 1106DEFN_BIN_FNC_T(b_and,&&,sc_ufix,sc_ufix) 1107DEFN_BIN_FNC_T(b_and,&&,sc_ufix,sc_ufix_fast) 1108DEFN_BIN_FNC_T(b_and,&&,sc_ufix_fast,sc_ufix) 1109 1110DEFN_BIN_FNC_T(b_or,||,sc_ufix,sc_ufix) 1111DEFN_BIN_FNC_T(b_or,||,sc_ufix,sc_ufix_fast) 1112DEFN_BIN_FNC_T(b_or,||,sc_ufix_fast,sc_ufix) 1113 1114DEFN_BIN_FNC_T(b_xor,!=,sc_ufix,sc_ufix) 1115DEFN_BIN_FNC_T(b_xor,!=,sc_ufix,sc_ufix_fast) 1116DEFN_BIN_FNC_T(b_xor,!=,sc_ufix_fast,sc_ufix) 1117 1118#undef DEFN_BIN_FNC_T 1119 1120 1121// assignment operators 1122 1123inline 1124sc_ufix& 1125sc_ufix::operator = ( const sc_ufix& a ) 1126{ 1127 sc_fxnum::operator = ( a ); 1128 return *this; 1129} 1130 1131#define DEFN_ASN_OP_T(op,tp) \ 1132inline \ 1133sc_ufix& \ 1134sc_ufix::operator op ( tp a ) \ 1135{ \ 1136 sc_fxnum::operator op( a ); \ 1137 return *this; \ 1138} 1139 1140#ifndef SC_FX_EXCLUDE_OTHER 1141#define DEFN_ASN_OP_OTHER(op) \ 1142DEFN_ASN_OP_T(op,int64) \ 1143DEFN_ASN_OP_T(op,uint64) \ 1144DEFN_ASN_OP_T(op,const sc_int_base&) \ 1145DEFN_ASN_OP_T(op,const sc_uint_base&) \ 1146DEFN_ASN_OP_T(op,const sc_signed&) \ 1147DEFN_ASN_OP_T(op,const sc_unsigned&) 1148#else 1149#define DEFN_ASN_OP_OTHER(op) 1150#endif 1151 1152#define DEFN_ASN_OP(op) \ 1153DEFN_ASN_OP_T(op,int) \ 1154DEFN_ASN_OP_T(op,unsigned int) \ 1155DEFN_ASN_OP_T(op,long) \ 1156DEFN_ASN_OP_T(op,unsigned long) \ 1157DEFN_ASN_OP_T(op,float) \ 1158DEFN_ASN_OP_T(op,double) \ 1159DEFN_ASN_OP_T(op,const char*) \ 1160DEFN_ASN_OP_T(op,const sc_fxval&) \ 1161DEFN_ASN_OP_T(op,const sc_fxval_fast&) \ 1162DEFN_ASN_OP_T(op,const sc_fxnum&) \ 1163DEFN_ASN_OP_T(op,const sc_fxnum_fast&) \ 1164DEFN_ASN_OP_OTHER(op) 1165 1166DEFN_ASN_OP(=) 1167 1168DEFN_ASN_OP(*=) 1169DEFN_ASN_OP(/=) 1170DEFN_ASN_OP(+=) 1171DEFN_ASN_OP(-=) 1172 1173DEFN_ASN_OP_T(<<=,int) 1174DEFN_ASN_OP_T(>>=,int) 1175 1176#undef DEFN_ASN_OP_T 1177#undef DEFN_ASN_OP_OTHER 1178#undef DEFN_ASN_OP 1179 1180 1181#define DEFN_ASN_OP_T(op,op2,tp) \ 1182inline \ 1183sc_ufix& \ 1184sc_ufix::operator op ( const tp& b ) \ 1185{ \ 1186 SC_FXNUM_OBSERVER_READ_( *this ) \ 1187 b.observer_read(); \ 1188 int iwl_c = iwl(); \ 1189 for( int i = iwl_c - wl(); i < iwl_c; ++ i ) \ 1190 set_bit( i, get_bit( i ) op2 b.get_bit( i ) ); \ 1191 cast(); \ 1192 SC_FXNUM_OBSERVER_WRITE_( *this ) \ 1193 return *this; \ 1194} 1195 1196DEFN_ASN_OP_T(&=,&&,sc_ufix) 1197DEFN_ASN_OP_T(&=,&&,sc_ufix_fast) 1198DEFN_ASN_OP_T(|=,||,sc_ufix) 1199DEFN_ASN_OP_T(|=,||,sc_ufix_fast) 1200DEFN_ASN_OP_T(^=,!=,sc_ufix) 1201DEFN_ASN_OP_T(^=,!=,sc_ufix_fast) 1202 1203#undef DEFN_ASN_OP_T 1204 1205 1206// auto-increment and auto-decrement 1207 1208inline 1209const sc_fxval 1210sc_ufix::operator ++ ( int ) 1211{ 1212 return sc_fxval( sc_fxnum::operator ++ ( 0 ) ); 1213} 1214 1215inline 1216const sc_fxval 1217sc_ufix::operator -- ( int ) 1218{ 1219 return sc_fxval( sc_fxnum::operator -- ( 0 ) ); 1220} 1221 1222inline 1223sc_ufix& 1224sc_ufix::operator ++ () 1225{ 1226 sc_fxnum::operator ++ (); 1227 return *this; 1228} 1229 1230inline 1231sc_ufix& 1232sc_ufix::operator -- () 1233{ 1234 sc_fxnum::operator -- (); 1235 return *this; 1236} 1237 1238 1239// ---------------------------------------------------------------------------- 1240// CLASS : sc_ufix_fast 1241// 1242// "Unconstrained" unsigned fixed-point class; limited precision. 1243// ---------------------------------------------------------------------------- 1244 1245// constructors 1246 1247inline 1248sc_ufix_fast::sc_ufix_fast( sc_fxnum_fast_observer* observer_ ) 1249: sc_fxnum_fast( sc_fxtype_params(), 1250 SC_US_, 1251 sc_fxcast_switch(), 1252 observer_ ) 1253{} 1254 1255inline 1256sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_, 1257 sc_fxnum_fast_observer* observer_ ) 1258: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_ ), 1259 SC_US_, 1260 sc_fxcast_switch(), 1261 observer_ ) 1262{} 1263 1264inline 1265sc_ufix_fast::sc_ufix_fast( sc_q_mode qm, sc_o_mode om, 1266 sc_fxnum_fast_observer* observer_ ) 1267: sc_fxnum_fast( sc_fxtype_params( qm, om ), 1268 SC_US_, 1269 sc_fxcast_switch(), 1270 observer_ ) 1271{} 1272 1273inline 1274sc_ufix_fast::sc_ufix_fast( sc_q_mode qm, sc_o_mode om, int nb, 1275 sc_fxnum_fast_observer* observer_ ) 1276: sc_fxnum_fast( sc_fxtype_params( qm, om, nb ), 1277 SC_US_, 1278 sc_fxcast_switch(), 1279 observer_ ) 1280{} 1281 1282inline 1283sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, 1284 sc_fxnum_fast_observer* observer_ ) 1285: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_, qm, om ), 1286 SC_US_, 1287 sc_fxcast_switch(), 1288 observer_ ) 1289{} 1290 1291inline 1292sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_, 1293 sc_q_mode qm, sc_o_mode om, int nb, 1294 sc_fxnum_fast_observer* observer_ ) 1295: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_, qm, om, nb ), 1296 SC_US_, 1297 sc_fxcast_switch(), 1298 observer_ ) 1299{} 1300 1301inline 1302sc_ufix_fast::sc_ufix_fast( const sc_fxcast_switch& cast_sw, 1303 sc_fxnum_fast_observer* observer_ ) 1304: sc_fxnum_fast( sc_fxtype_params(), 1305 SC_US_, 1306 cast_sw, 1307 observer_ ) 1308{} 1309 1310inline 1311sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_, 1312 const sc_fxcast_switch& cast_sw, 1313 sc_fxnum_fast_observer* observer_ ) 1314: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_ ), 1315 SC_US_, 1316 cast_sw, 1317 observer_ ) 1318{} 1319 1320inline 1321sc_ufix_fast::sc_ufix_fast( sc_q_mode qm, sc_o_mode om, 1322 const sc_fxcast_switch& cast_sw, 1323 sc_fxnum_fast_observer* observer_ ) 1324: sc_fxnum_fast( sc_fxtype_params( qm, om ), 1325 SC_US_, 1326 cast_sw, 1327 observer_ ) 1328{} 1329 1330inline 1331sc_ufix_fast::sc_ufix_fast( sc_q_mode qm, sc_o_mode om, int nb, 1332 const sc_fxcast_switch& cast_sw, 1333 sc_fxnum_fast_observer* observer_ ) 1334: sc_fxnum_fast( sc_fxtype_params( qm, om, nb ), 1335 SC_US_, 1336 cast_sw, 1337 observer_ ) 1338{} 1339 1340inline 1341sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, 1342 const sc_fxcast_switch& cast_sw, 1343 sc_fxnum_fast_observer* observer_ ) 1344: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_, qm, om ), 1345 SC_US_, 1346 cast_sw, 1347 observer_ ) 1348{} 1349 1350inline 1351sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_, 1352 sc_q_mode qm, sc_o_mode om, int nb, 1353 const sc_fxcast_switch& cast_sw, 1354 sc_fxnum_fast_observer* observer_ ) 1355: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_, qm, om, nb ), 1356 SC_US_, 1357 cast_sw, 1358 observer_ ) 1359{} 1360 1361inline 1362sc_ufix_fast::sc_ufix_fast( const sc_fxtype_params& type_params, 1363 sc_fxnum_fast_observer* observer_ ) 1364: sc_fxnum_fast( type_params, 1365 SC_US_, 1366 sc_fxcast_switch(), 1367 observer_ ) 1368{} 1369 1370inline 1371sc_ufix_fast::sc_ufix_fast( const sc_fxtype_params& type_params, 1372 const sc_fxcast_switch& cast_sw, 1373 sc_fxnum_fast_observer* observer_ ) 1374: sc_fxnum_fast( type_params, 1375 SC_US_, 1376 cast_sw, 1377 observer_ ) 1378{} 1379 1380#define DEFN_CTORS_T_A(tp) \ 1381inline \ 1382sc_ufix_fast::sc_ufix_fast( tp a, \ 1383 sc_fxnum_fast_observer* observer_ ) \ 1384: sc_fxnum_fast( a, \ 1385 sc_fxtype_params(), \ 1386 SC_US_, \ 1387 sc_fxcast_switch(), \ 1388 observer_ ) \ 1389{} \ 1390 \ 1391inline \ 1392sc_ufix_fast::sc_ufix_fast( tp a, \ 1393 int wl_, int iwl_, \ 1394 sc_fxnum_fast_observer* observer_ ) \ 1395: sc_fxnum_fast( a, \ 1396 sc_fxtype_params( wl_, iwl_ ), \ 1397 SC_US_, \ 1398 sc_fxcast_switch(), \ 1399 observer_ ) \ 1400{} \ 1401 \ 1402inline \ 1403sc_ufix_fast::sc_ufix_fast( tp a, \ 1404 sc_q_mode qm, sc_o_mode om, \ 1405 sc_fxnum_fast_observer* observer_ ) \ 1406: sc_fxnum_fast( a, \ 1407 sc_fxtype_params( qm, om ), \ 1408 SC_US_, \ 1409 sc_fxcast_switch(), \ 1410 observer_ ) \ 1411{} \ 1412 \ 1413inline \ 1414sc_ufix_fast::sc_ufix_fast( tp a, \ 1415 sc_q_mode qm, sc_o_mode om, int nb, \ 1416 sc_fxnum_fast_observer* observer_ ) \ 1417: sc_fxnum_fast( a, \ 1418 sc_fxtype_params( qm, om, nb ), \ 1419 SC_US_, \ 1420 sc_fxcast_switch(), \ 1421 observer_ ) \ 1422{} \ 1423 \ 1424inline \ 1425sc_ufix_fast::sc_ufix_fast( tp a, \ 1426 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \ 1427 sc_fxnum_fast_observer* observer_ ) \ 1428: sc_fxnum_fast( a, \ 1429 sc_fxtype_params( wl_, iwl_, qm, om ), \ 1430 SC_US_, \ 1431 sc_fxcast_switch(), \ 1432 observer_ ) \ 1433{} \ 1434 \ 1435inline \ 1436sc_ufix_fast::sc_ufix_fast( tp a, \ 1437 int wl_, int iwl_, \ 1438 sc_q_mode qm, sc_o_mode om, int nb, \ 1439 sc_fxnum_fast_observer* observer_ ) \ 1440: sc_fxnum_fast( a, \ 1441 sc_fxtype_params( wl_, iwl_, qm, om, nb ), \ 1442 SC_US_, \ 1443 sc_fxcast_switch(), \ 1444 observer_ ) \ 1445{} \ 1446 \ 1447inline \ 1448sc_ufix_fast::sc_ufix_fast( tp a, \ 1449 const sc_fxcast_switch& cast_sw, \ 1450 sc_fxnum_fast_observer* observer_ ) \ 1451: sc_fxnum_fast( a, \ 1452 sc_fxtype_params(), \ 1453 SC_US_, \ 1454 cast_sw, \ 1455 observer_ ) \ 1456{} \ 1457 \ 1458inline \ 1459sc_ufix_fast::sc_ufix_fast( tp a, \ 1460 int wl_, int iwl_, \ 1461 const sc_fxcast_switch& cast_sw, \ 1462 sc_fxnum_fast_observer* observer_ ) \ 1463: sc_fxnum_fast( a, \ 1464 sc_fxtype_params( wl_, iwl_ ), \ 1465 SC_US_, \ 1466 cast_sw, \ 1467 observer_ ) \ 1468{} \ 1469 \ 1470inline \ 1471sc_ufix_fast::sc_ufix_fast( tp a, \ 1472 sc_q_mode qm, sc_o_mode om, \ 1473 const sc_fxcast_switch& cast_sw, \ 1474 sc_fxnum_fast_observer* observer_ ) \ 1475: sc_fxnum_fast( a, \ 1476 sc_fxtype_params( qm, om ), \ 1477 SC_US_, \ 1478 cast_sw, \ 1479 observer_ ) \ 1480{} \ 1481 \ 1482inline \ 1483sc_ufix_fast::sc_ufix_fast( tp a, \ 1484 sc_q_mode qm, sc_o_mode om, int nb, \ 1485 const sc_fxcast_switch& cast_sw, \ 1486 sc_fxnum_fast_observer* observer_ ) \ 1487: sc_fxnum_fast( a, \ 1488 sc_fxtype_params( qm, om, nb ), \ 1489 SC_US_, \ 1490 cast_sw, \ 1491 observer_ ) \ 1492{} \ 1493 \ 1494inline \ 1495sc_ufix_fast::sc_ufix_fast( tp a, \ 1496 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \ 1497 const sc_fxcast_switch& cast_sw, \ 1498 sc_fxnum_fast_observer* observer_ ) \ 1499: sc_fxnum_fast( a, \ 1500 sc_fxtype_params( wl_, iwl_, qm, om ), \ 1501 SC_US_, \ 1502 cast_sw, \ 1503 observer_ ) \ 1504{} \ 1505 \ 1506inline \ 1507sc_ufix_fast::sc_ufix_fast( tp a, \ 1508 int wl_, int iwl_, \ 1509 sc_q_mode qm, sc_o_mode om, int nb, \ 1510 const sc_fxcast_switch& cast_sw, \ 1511 sc_fxnum_fast_observer* observer_ ) \ 1512: sc_fxnum_fast( a, \ 1513 sc_fxtype_params( wl_, iwl_, qm, om, nb ), \ 1514 SC_US_, \ 1515 cast_sw, \ 1516 observer_ ) \ 1517{} \ 1518 \ 1519inline \ 1520sc_ufix_fast::sc_ufix_fast( tp a, \ 1521 const sc_fxtype_params& type_params, \ 1522 sc_fxnum_fast_observer* observer_ ) \ 1523: sc_fxnum_fast( a, \ 1524 type_params, \ 1525 SC_US_, \ 1526 sc_fxcast_switch(), \ 1527 observer_ ) \ 1528{} \ 1529 \ 1530inline \ 1531sc_ufix_fast::sc_ufix_fast( tp a, \ 1532 const sc_fxtype_params& type_params, \ 1533 const sc_fxcast_switch& cast_sw, \ 1534 sc_fxnum_fast_observer* observer_ ) \ 1535: sc_fxnum_fast( a, \ 1536 type_params, \ 1537 SC_US_, \ 1538 cast_sw, \ 1539 observer_ ) \ 1540{} 1541 1542#define DEFN_CTORS_T_B(tp) \ 1543inline \ 1544sc_ufix_fast::sc_ufix_fast( tp a, \ 1545 sc_fxnum_fast_observer* observer_ ) \ 1546: sc_fxnum_fast( a, \ 1547 a.type_params(), \ 1548 SC_US_, \ 1549 sc_fxcast_switch(), \ 1550 observer_ ) \ 1551{} \ 1552 \ 1553inline \ 1554sc_ufix_fast::sc_ufix_fast( tp a, \ 1555 int wl_, int iwl_, \ 1556 sc_fxnum_fast_observer* observer_ ) \ 1557: sc_fxnum_fast( a, \ 1558 sc_fxtype_params( a.type_params(), wl_, iwl_ ), \ 1559 SC_US_, \ 1560 sc_fxcast_switch(), \ 1561 observer_ ) \ 1562{} \ 1563 \ 1564inline \ 1565sc_ufix_fast::sc_ufix_fast( tp a, \ 1566 sc_q_mode qm, sc_o_mode om, \ 1567 sc_fxnum_fast_observer* observer_ ) \ 1568: sc_fxnum_fast( a, \ 1569 sc_fxtype_params( a.type_params(), qm, om ), \ 1570 SC_US_, \ 1571 sc_fxcast_switch(), \ 1572 observer_ ) \ 1573{} \ 1574 \ 1575inline \ 1576sc_ufix_fast::sc_ufix_fast( tp a, \ 1577 sc_q_mode qm, sc_o_mode om, int nb, \ 1578 sc_fxnum_fast_observer* observer_ ) \ 1579: sc_fxnum_fast( a, \ 1580 sc_fxtype_params( a.type_params(), qm, om, nb ), \ 1581 SC_US_, \ 1582 sc_fxcast_switch(), \ 1583 observer_ ) \ 1584{} \ 1585 \ 1586inline \ 1587sc_ufix_fast::sc_ufix_fast( tp a, \ 1588 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \ 1589 sc_fxnum_fast_observer* observer_ ) \ 1590: sc_fxnum_fast( a, \ 1591 sc_fxtype_params( wl_, iwl_, qm, om ), \ 1592 SC_US_, \ 1593 sc_fxcast_switch(), \ 1594 observer_ ) \ 1595{} \ 1596 \ 1597inline \ 1598sc_ufix_fast::sc_ufix_fast( tp a, \ 1599 int wl_, int iwl_, \ 1600 sc_q_mode qm, sc_o_mode om, int nb, \ 1601 sc_fxnum_fast_observer* observer_ ) \ 1602: sc_fxnum_fast( a, \ 1603 sc_fxtype_params( wl_, iwl_, qm, om, nb ), \ 1604 SC_US_, \ 1605 sc_fxcast_switch(), \ 1606 observer_ ) \ 1607{} \ 1608 \ 1609inline \ 1610sc_ufix_fast::sc_ufix_fast( tp a, \ 1611 const sc_fxcast_switch& cast_sw, \ 1612 sc_fxnum_fast_observer* observer_ ) \ 1613: sc_fxnum_fast( a, \ 1614 a.type_params(), \ 1615 SC_US_, \ 1616 cast_sw, \ 1617 observer_ ) \ 1618{} \ 1619 \ 1620inline \ 1621sc_ufix_fast::sc_ufix_fast( tp a, \ 1622 int wl_, int iwl_, \ 1623 const sc_fxcast_switch& cast_sw, \ 1624 sc_fxnum_fast_observer* observer_ ) \ 1625: sc_fxnum_fast( a, \ 1626 sc_fxtype_params( a.type_params(), wl_, iwl_ ), \ 1627 SC_US_, \ 1628 cast_sw, \ 1629 observer_ ) \ 1630{} \ 1631 \ 1632inline \ 1633sc_ufix_fast::sc_ufix_fast( tp a, \ 1634 sc_q_mode qm, sc_o_mode om, \ 1635 const sc_fxcast_switch& cast_sw, \ 1636 sc_fxnum_fast_observer* observer_ ) \ 1637: sc_fxnum_fast( a, \ 1638 sc_fxtype_params( a.type_params(), qm, om ), \ 1639 SC_US_, \ 1640 cast_sw, \ 1641 observer_ ) \ 1642{} \ 1643 \ 1644inline \ 1645sc_ufix_fast::sc_ufix_fast( tp a, \ 1646 sc_q_mode qm, sc_o_mode om, int nb, \ 1647 const sc_fxcast_switch& cast_sw, \ 1648 sc_fxnum_fast_observer* observer_ ) \ 1649: sc_fxnum_fast( a, \ 1650 sc_fxtype_params( a.type_params(), qm, om, nb ), \ 1651 SC_US_, \ 1652 cast_sw, \ 1653 observer_ ) \ 1654{} \ 1655 \ 1656inline \ 1657sc_ufix_fast::sc_ufix_fast( tp a, \ 1658 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \ 1659 const sc_fxcast_switch& cast_sw, \ 1660 sc_fxnum_fast_observer* observer_ ) \ 1661: sc_fxnum_fast( a, \ 1662 sc_fxtype_params( wl_, iwl_, qm, om ), \ 1663 SC_US_, \ 1664 cast_sw, \ 1665 observer_ ) \ 1666{} \ 1667 \ 1668inline \ 1669sc_ufix_fast::sc_ufix_fast( tp a, \ 1670 int wl_, int iwl_, \ 1671 sc_q_mode qm, sc_o_mode om, int nb, \ 1672 const sc_fxcast_switch& cast_sw, \ 1673 sc_fxnum_fast_observer* observer_ ) \ 1674: sc_fxnum_fast( a, \ 1675 sc_fxtype_params( wl_, iwl_, qm, om, nb ), \ 1676 SC_US_, \ 1677 cast_sw, \ 1678 observer_ ) \ 1679{} \ 1680 \ 1681inline \ 1682sc_ufix_fast::sc_ufix_fast( tp a, \ 1683 const sc_fxtype_params& type_params, \ 1684 sc_fxnum_fast_observer* observer_ ) \ 1685: sc_fxnum_fast( a, \ 1686 type_params, \ 1687 SC_US_, \ 1688 sc_fxcast_switch(), \ 1689 observer_ ) \ 1690{} \ 1691 \ 1692inline \ 1693sc_ufix_fast::sc_ufix_fast( tp a, \ 1694 const sc_fxtype_params& type_params, \ 1695 const sc_fxcast_switch& cast_sw, \ 1696 sc_fxnum_fast_observer* observer_ ) \ 1697: sc_fxnum_fast( a, \ 1698 type_params, \ 1699 SC_US_, \ 1700 cast_sw, \ 1701 observer_ ) \ 1702{} 1703 1704DEFN_CTORS_T_A(int) 1705DEFN_CTORS_T_A(unsigned int) 1706DEFN_CTORS_T_A(long) 1707DEFN_CTORS_T_A(unsigned long) 1708DEFN_CTORS_T_A(float) 1709DEFN_CTORS_T_A(double) 1710DEFN_CTORS_T_A(const char*) 1711DEFN_CTORS_T_A(const sc_fxval&) 1712DEFN_CTORS_T_A(const sc_fxval_fast&) 1713DEFN_CTORS_T_B(const sc_fxnum&) 1714DEFN_CTORS_T_B(const sc_fxnum_fast&) 1715#ifndef SC_FX_EXCLUDE_OTHER 1716DEFN_CTORS_T_A(int64) 1717DEFN_CTORS_T_A(uint64) 1718DEFN_CTORS_T_A(const sc_int_base&) 1719DEFN_CTORS_T_A(const sc_uint_base&) 1720DEFN_CTORS_T_A(const sc_signed&) 1721DEFN_CTORS_T_A(const sc_unsigned&) 1722#endif 1723 1724#undef DEFN_CTORS_T_A 1725#undef DEFN_CTORS_T_B 1726 1727// copy constructor 1728 1729inline 1730sc_ufix_fast::sc_ufix_fast( const sc_ufix_fast& a ) 1731: sc_fxnum_fast( a, 1732 a.type_params(), 1733 SC_US_, 1734 sc_fxcast_switch(), 1735 0 ) 1736{} 1737 1738 1739// unary bitwise operators 1740 1741inline 1742const sc_ufix_fast 1743sc_ufix_fast::operator ~ () const 1744{ 1745 SC_FXNUM_FAST_OBSERVER_READ_( *this ) 1746 int iwl_c = iwl(); 1747 int wl_c = wl(); 1748 sc_ufix_fast c( wl_c, iwl_c ); 1749 for( int i = iwl_c - wl_c; i < iwl_c; ++ i ) 1750 c.set_bit( i, ! get_bit( i ) ); 1751 return sc_ufix_fast( c, wl_c, iwl_c ); 1752} 1753 1754 1755// unary bitwise functions 1756 1757inline 1758void 1759b_not( sc_ufix_fast& c, const sc_ufix_fast& a ) 1760{ 1761 SC_FXNUM_FAST_OBSERVER_READ_( a ) 1762 int iwl_c = c.iwl(); 1763 for( int i = iwl_c - c.wl(); i < iwl_c; ++ i ) 1764 c.set_bit( i, ! a.get_bit( i ) ); 1765 c.cast(); 1766 SC_FXNUM_FAST_OBSERVER_WRITE_( c ) 1767} 1768 1769 1770// binary bitwise operators 1771 1772#define DEFN_BIN_OP_T(op,op2,tp1,tp2) \ 1773inline \ 1774const sc_ufix_fast \ 1775operator op ( const tp1& a, const tp2& b ) \ 1776{ \ 1777 a.observer_read(); \ 1778 b.observer_read(); \ 1779 int iwl_a = a.iwl(); \ 1780 int iwl_b = b.iwl(); \ 1781 int iwl_c = sc_max( iwl_a, iwl_b ); \ 1782 int fwl_c = sc_max( a.wl() - iwl_a, b.wl() - iwl_b ); \ 1783 sc_ufix_fast c( iwl_c + fwl_c, iwl_c ); \ 1784 for( int i = -fwl_c; i < iwl_c; ++ i ) \ 1785 c.set_bit( i, a.get_bit( i ) op2 b.get_bit( i ) ); \ 1786 return sc_ufix_fast( c, iwl_c + fwl_c, iwl_c ); \ 1787} 1788 1789DEFN_BIN_OP_T(&,&&,sc_ufix_fast,sc_ufix_fast) 1790DEFN_BIN_OP_T(|,||,sc_ufix_fast,sc_ufix_fast) 1791DEFN_BIN_OP_T(^,!=,sc_ufix_fast,sc_ufix_fast) 1792 1793#undef DEFN_BIN_OP_T 1794 1795 1796// binary bitwise functions 1797 1798#define DEFN_BIN_FNC_T(fnc,op2,tp1,tp2) \ 1799inline \ 1800void \ 1801fnc ( sc_ufix_fast& c, const tp1& a, const tp2& b ) \ 1802{ \ 1803 a.observer_read(); \ 1804 b.observer_read(); \ 1805 int iwl_c = c.iwl(); \ 1806 for( int i = iwl_c - c.wl(); i < iwl_c; ++ i ) \ 1807 c.set_bit( i, a.get_bit( i ) op2 b.get_bit( i ) ); \ 1808 c.cast(); \ 1809 SC_FXNUM_FAST_OBSERVER_WRITE_( c ) \ 1810} 1811 1812DEFN_BIN_FNC_T(b_and,&&,sc_ufix_fast,sc_ufix_fast) 1813DEFN_BIN_FNC_T(b_or,||,sc_ufix_fast,sc_ufix_fast) 1814DEFN_BIN_FNC_T(b_xor,!=,sc_ufix_fast,sc_ufix_fast) 1815 1816#undef DEFN_BIN_FNC_T 1817 1818 1819// assignment operators 1820 1821inline 1822sc_ufix_fast& 1823sc_ufix_fast::operator = ( const sc_ufix_fast& a ) 1824{ 1825 sc_fxnum_fast::operator = ( a ); 1826 return *this; 1827} 1828 1829#define DEFN_ASN_OP_T(op,tp) \ 1830inline \ 1831sc_ufix_fast& \ 1832sc_ufix_fast::operator op ( tp a ) \ 1833{ \ 1834 sc_fxnum_fast::operator op( a ); \ 1835 return *this; \ 1836} 1837 1838#ifndef SC_FX_EXCLUDE_OTHER 1839#define DEFN_ASN_OP_OTHER(op) \ 1840DEFN_ASN_OP_T(op,int64) \ 1841DEFN_ASN_OP_T(op,uint64) \ 1842DEFN_ASN_OP_T(op,const sc_int_base&) \ 1843DEFN_ASN_OP_T(op,const sc_uint_base&) \ 1844DEFN_ASN_OP_T(op,const sc_signed&) \ 1845DEFN_ASN_OP_T(op,const sc_unsigned&) 1846#else 1847#define DEFN_ASN_OP_OTHER(op) 1848#endif 1849 1850#define DEFN_ASN_OP(op) \ 1851DEFN_ASN_OP_T(op,int) \ 1852DEFN_ASN_OP_T(op,unsigned int) \ 1853DEFN_ASN_OP_T(op,long) \ 1854DEFN_ASN_OP_T(op,unsigned long) \ 1855DEFN_ASN_OP_T(op,float) \ 1856DEFN_ASN_OP_T(op,double) \ 1857DEFN_ASN_OP_T(op,const char*) \ 1858DEFN_ASN_OP_T(op,const sc_fxval&) \ 1859DEFN_ASN_OP_T(op,const sc_fxval_fast&) \ 1860DEFN_ASN_OP_T(op,const sc_fxnum&) \ 1861DEFN_ASN_OP_T(op,const sc_fxnum_fast&) \ 1862DEFN_ASN_OP_OTHER(op) 1863 1864DEFN_ASN_OP(=) 1865 1866DEFN_ASN_OP(*=) 1867DEFN_ASN_OP(/=) 1868DEFN_ASN_OP(+=) 1869DEFN_ASN_OP(-=) 1870 1871DEFN_ASN_OP_T(<<=,int) 1872DEFN_ASN_OP_T(>>=,int) 1873 1874#undef DEFN_ASN_OP_T 1875#undef DEFN_ASN_OP_OTHER 1876#undef DEFN_ASN_OP 1877 1878 1879#define DEFN_ASN_OP_T(op,op2,tp) \ 1880inline \ 1881sc_ufix_fast& \ 1882sc_ufix_fast::operator op ( const tp& b ) \ 1883{ \ 1884 SC_FXNUM_FAST_OBSERVER_READ_( *this ) \ 1885 b.observer_read(); \ 1886 int iwl_c = iwl(); \ 1887 for( int i = iwl_c - wl(); i < iwl_c; ++ i ) \ 1888 set_bit( i, get_bit( i ) op2 b.get_bit( i ) ); \ 1889 cast(); \ 1890 SC_FXNUM_FAST_OBSERVER_WRITE_( *this ) \ 1891 return *this; \ 1892} 1893 1894DEFN_ASN_OP_T(&=,&&,sc_ufix) 1895DEFN_ASN_OP_T(&=,&&,sc_ufix_fast) 1896DEFN_ASN_OP_T(|=,||,sc_ufix) 1897DEFN_ASN_OP_T(|=,||,sc_ufix_fast) 1898DEFN_ASN_OP_T(^=,!=,sc_ufix) 1899DEFN_ASN_OP_T(^=,!=,sc_ufix_fast) 1900 1901#undef DEFN_ASN_OP_T 1902 1903 1904// auto-increment and auto-decrement 1905 1906inline 1907const sc_fxval_fast 1908sc_ufix_fast::operator ++ ( int ) 1909{ 1910 return sc_fxval_fast( sc_fxnum_fast::operator ++ ( 0 ) ); 1911} 1912 1913inline 1914const sc_fxval_fast 1915sc_ufix_fast::operator -- ( int ) 1916{ 1917 return sc_fxval_fast( sc_fxnum_fast::operator -- ( 0 ) ); 1918} 1919 1920inline 1921sc_ufix_fast& 1922sc_ufix_fast::operator ++ () 1923{ 1924 sc_fxnum_fast::operator ++ (); 1925 return *this; 1926} 1927 1928inline 1929sc_ufix_fast& 1930sc_ufix_fast::operator -- () 1931{ 1932 sc_fxnum_fast::operator -- (); 1933 return *this; 1934} 1935 1936} // namespace sc_dt 1937 1938 1939#endif 1940 1941// Taf! 1942