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 operator_shift_right.cpp -- 23 24 Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15 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// This may look like C code, but it is really -*- C++ -*- 39// 40// operator_shift_right.cxx -- 41// Copyright Synopsys 1998 42// Author : Ric Hilderink 43// Created On : Fri Jan 15 14:08:43 1999 44// Status : none 45// 46 47 48#include <limits.h> 49#define SC_INCLUDE_FX 50#include "systemc.h" 51 52 53 54#define T_FX_FLOAT sc_fxval 55#define T_FX_UFIX sc_ufix 56#define T_FX_FIX sc_fix 57#define T_FX_FIXED sc_fixed<T_WL, T_IWL> 58#define T_FX_UFIXED sc_ufixed<T_WL, T_IWL> 59 60#define SHOW(i, a) \ 61 out << i << " : " << a.to_string(SC_BIN) << "\n"; 62 63#if 0 64 65#define SHIFT_RIGHT_OP(T_op) \ 66{ \ 67 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); \ 68 \ 69 out << "------------------ " #T_op " ---- " << T_WL << ", " << T_IWL << " --------------\n"; \ 70 T_op r(0x8000); \ 71 T_op m(0x8000, FX_off); \ 72 T_op q(FX_off); \ 73 int i; \ 74 for (i = 0; i < T_WL+10; ++i) \ 75 { \ 76 r = r >> 1; \ 77 r += 1; \ 78 q = m << i; \ 79 q += 1; \ 80 SHOW(i, r); \ 81 SHOW(i, q); \ 82 } \ 83 r = r >> 0; \ 84 SHOW(0, r); \ 85 r = r >> -4; \ 86 SHOW(-4, r); \ 87 r >>= 0; \ 88 SHOW(0, r); \ 89 r >>= -4; \ 90 SHOW(-4, r); \ 91 q = m >> 0; \ 92 SHOW(0, m); \ 93 q = m >> -5; \ 94 SHOW(-5, q); \ 95} 96 97#define SHIFT_RIGHT \ 98SHIFT_RIGHT_OP(T_FX_FLOAT) \ 99SHIFT_RIGHT_OP(T_FX_UFIX) \ 100SHIFT_RIGHT_OP(T_FX_FIX) \ 101SHIFT_RIGHT_OP(T_FX_FIXED) \ 102SHIFT_RIGHT_OP(T_FX_UFIXED) 103 104 105 106void operator_shift_right(ostream& out) 107{ 108#define T_WL 13 109#define T_IWL 1 110 SHIFT_RIGHT; 111#undef T_WL 112#undef T_IWL 113#define T_WL 65 114#define T_IWL 1 115 SHIFT_RIGHT; 116#undef T_WL 117#undef T_IWL 118#define T_WL 150 119#define T_IWL 1 120 SHIFT_RIGHT; 121} 122 123#else 124 125#define QUOTE(x) #x 126 127void operator_shift_right(ostream& out) 128{ 129#define T_WL 13 130#define T_IWL 1 131 132{ 133 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 134 135 out << "------------------ " QUOTE(T_FX_FLOAT) " ---- " << T_WL << ", " 136 << T_IWL << " --------------\n"; 137 T_FX_FLOAT r(0x8000); 138#include "fx_precision_double.h" 139 T_FX_FLOAT m(0x8000); 140 T_FX_FLOAT q; 141#include "fx_precision_default.h" 142 int i; 143 for (i = 0; i < T_WL+10; ++i) 144 { 145 r = r >> 1; 146 r += 1; 147 q = m << i; 148 q += 1; 149 SHOW(i, r); 150 SHOW(i, q); 151 } 152 r = r >> 0; 153 SHOW(0, r); 154 r = r >> -4; 155 SHOW(-4, r); 156 r >>= 0; 157 SHOW(0, r); 158 r >>= -4; 159 SHOW(-4, r); 160 q = m >> 0; 161 SHOW(0, m); 162 q = m >> -5; 163 SHOW(-5, q); 164} 165 166{ 167 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 168 169 out << "------------------ " QUOTE(T_FX_UFIX) " ---- " << T_WL << ", " 170 << T_IWL << " --------------\n"; 171 T_FX_UFIX r(0x8000); 172#include "fx_precision_double.h" 173 T_FX_UFIX m(0x8000); 174 T_FX_UFIX q; 175#include "fx_precision_default.h" 176 int i; 177 for (i = 0; i < T_WL+10; ++i) 178 { 179 r = r >> 1; 180 r += 1; 181 q = m << i; 182 q += 1; 183 SHOW(i, r); 184 SHOW(i, q); 185 } 186 r = r >> 0; 187 SHOW(0, r); 188 r = r >> -4; 189 SHOW(-4, r); 190 r >>= 0; 191 SHOW(0, r); 192 r >>= -4; 193 SHOW(-4, r); 194 q = m >> 0; 195 SHOW(0, m); 196 q = m >> -5; 197 SHOW(-5, q); 198} 199 200{ 201 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 202 203 out << "------------------ " QUOTE(T_FX_FIX) " ---- " << T_WL << ", " 204 << T_IWL << " --------------\n"; 205 T_FX_FIX r(0x8000); 206#include "fx_precision_double.h" 207 T_FX_FIX m(0x8000); 208 T_FX_FIX q; 209#include "fx_precision_default.h" 210 int i; 211 for (i = 0; i < T_WL+10; ++i) 212 { 213 r = r >> 1; 214 r += 1; 215 q = m << i; 216 q += 1; 217 SHOW(i, r); 218 SHOW(i, q); 219 } 220 r = r >> 0; 221 SHOW(0, r); 222 r = r >> -4; 223 SHOW(-4, r); 224 r >>= 0; 225 SHOW(0, r); 226 r >>= -4; 227 SHOW(-4, r); 228 q = m >> 0; 229 SHOW(0, m); 230 q = m >> -5; 231 SHOW(-5, q); 232} 233 234{ 235 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 236 237 out << "------------------ " QUOTE(T_FX_FIXED) " ---- " << T_WL << ", " 238 << T_IWL << " --------------\n"; 239 T_FX_FIXED r(0x8000); 240#include "fx_precision_double.h" 241 T_FX_FIXED m(0x8000); 242 T_FX_FIXED q; 243#include "fx_precision_default.h" 244 int i; 245 for (i = 0; i < T_WL+10; ++i) 246 { 247 r = r >> 1; 248 r += 1; 249 q = m << i; 250 q += 1; 251 SHOW(i, r); 252 SHOW(i, q); 253 } 254 r = r >> 0; 255 SHOW(0, r); 256 r = r >> -4; 257 SHOW(-4, r); 258 r >>= 0; 259 SHOW(0, r); 260 r >>= -4; 261 SHOW(-4, r); 262 q = m >> 0; 263 SHOW(0, m); 264 q = m >> -5; 265 SHOW(-5, q); 266} 267 268{ 269 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 270 271 out << "------------------ " QUOTE(T_FX_UFIXED) " ---- " << T_WL << ", " 272 << T_IWL << " --------------\n"; 273 T_FX_UFIXED r(0x8000); 274#include "fx_precision_double.h" 275 T_FX_UFIXED m(0x8000); 276 T_FX_UFIXED q; 277#include "fx_precision_default.h" 278 int i; 279 for (i = 0; i < T_WL+10; ++i) 280 { 281 r = r >> 1; 282 r += 1; 283 q = m << i; 284 q += 1; 285 SHOW(i, r); 286 SHOW(i, q); 287 } 288 r = r >> 0; 289 SHOW(0, r); 290 r = r >> -4; 291 SHOW(-4, r); 292 r >>= 0; 293 SHOW(0, r); 294 r >>= -4; 295 SHOW(-4, r); 296 q = m >> 0; 297 SHOW(0, m); 298 q = m >> -5; 299 SHOW(-5, q); 300} 301 302#undef T_WL 303#undef T_IWL 304#define T_WL 65 305#define T_IWL 1 306 307{ 308 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 309 310 out << "------------------ " QUOTE(T_FX_FLOAT) " ---- " << T_WL << ", " 311 << T_IWL << " --------------\n"; 312 T_FX_FLOAT r(0x8000); 313#include "fx_precision_double.h" 314 T_FX_FLOAT m(0x8000); 315 T_FX_FLOAT q; 316#include "fx_precision_default.h" 317 int i; 318 for (i = 0; i < T_WL+10; ++i) 319 { 320 r = r >> 1; 321 r += 1; 322 q = m << i; 323 q += 1; 324 SHOW(i, r); 325 SHOW(i, q); 326 } 327 r = r >> 0; 328 SHOW(0, r); 329 r = r >> -4; 330 SHOW(-4, r); 331 r >>= 0; 332 SHOW(0, r); 333 r >>= -4; 334 SHOW(-4, r); 335 q = m >> 0; 336 SHOW(0, m); 337 q = m >> -5; 338 SHOW(-5, q); 339} 340 341{ 342 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 343 344 out << "------------------ " QUOTE(T_FX_UFIX) " ---- " << T_WL << ", " 345 << T_IWL << " --------------\n"; 346 T_FX_UFIX r(0x8000); 347#include "fx_precision_double.h" 348 T_FX_UFIX m(0x8000); 349 T_FX_UFIX q; 350#include "fx_precision_default.h" 351 int i; 352 for (i = 0; i < T_WL+10; ++i) 353 { 354 r = r >> 1; 355 r += 1; 356 q = m << i; 357 q += 1; 358 SHOW(i, r); 359 SHOW(i, q); 360 } 361 r = r >> 0; 362 SHOW(0, r); 363 r = r >> -4; 364 SHOW(-4, r); 365 r >>= 0; 366 SHOW(0, r); 367 r >>= -4; 368 SHOW(-4, r); 369 q = m >> 0; 370 SHOW(0, m); 371 q = m >> -5; 372 SHOW(-5, q); 373} 374 375{ 376 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 377 378 out << "------------------ " QUOTE(T_FX_FIX) " ---- " << T_WL << ", " 379 << T_IWL << " --------------\n"; 380 T_FX_FIX r(0x8000); 381#include "fx_precision_double.h" 382 T_FX_FIX m(0x8000); 383 T_FX_FIX q; 384#include "fx_precision_default.h" 385 int i; 386 for (i = 0; i < T_WL+10; ++i) 387 { 388 r = r >> 1; 389 r += 1; 390 q = m << i; 391 q += 1; 392 SHOW(i, r); 393 SHOW(i, q); 394 } 395 r = r >> 0; 396 SHOW(0, r); 397 r = r >> -4; 398 SHOW(-4, r); 399 r >>= 0; 400 SHOW(0, r); 401 r >>= -4; 402 SHOW(-4, r); 403 q = m >> 0; 404 SHOW(0, m); 405 q = m >> -5; 406 SHOW(-5, q); 407} 408 409{ 410 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 411 412 out << "------------------ " QUOTE(T_FX_FIXED) " ---- " << T_WL << ", " 413 << T_IWL << " --------------\n"; 414 T_FX_FIXED r(0x8000); 415#include "fx_precision_double.h" 416 T_FX_FIXED m(0x8000); 417 T_FX_FIXED q; 418#include "fx_precision_default.h" 419 int i; 420 for (i = 0; i < T_WL+10; ++i) 421 { 422 r = r >> 1; 423 r += 1; 424 q = m << i; 425 q += 1; 426 SHOW(i, r); 427 SHOW(i, q); 428 } 429 r = r >> 0; 430 SHOW(0, r); 431 r = r >> -4; 432 SHOW(-4, r); 433 r >>= 0; 434 SHOW(0, r); 435 r >>= -4; 436 SHOW(-4, r); 437 q = m >> 0; 438 SHOW(0, m); 439 q = m >> -5; 440 SHOW(-5, q); 441} 442 443{ 444 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 445 446 out << "------------------ " QUOTE(T_FX_UFIXED) " ---- " << T_WL << ", " 447 << T_IWL << " --------------\n"; 448 T_FX_UFIXED r(0x8000); 449#include "fx_precision_double.h" 450 T_FX_UFIXED m(0x8000); 451 T_FX_UFIXED q; 452#include "fx_precision_default.h" 453 int i; 454 for (i = 0; i < T_WL+10; ++i) 455 { 456 r = r >> 1; 457 r += 1; 458 q = m << i; 459 q += 1; 460 SHOW(i, r); 461 SHOW(i, q); 462 } 463 r = r >> 0; 464 SHOW(0, r); 465 r = r >> -4; 466 SHOW(-4, r); 467 r >>= 0; 468 SHOW(0, r); 469 r >>= -4; 470 SHOW(-4, r); 471 q = m >> 0; 472 SHOW(0, m); 473 q = m >> -5; 474 SHOW(-5, q); 475} 476 477#undef T_WL 478#undef T_IWL 479#define T_WL 150 480#define T_IWL 1 481 482{ 483 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 484 485 out << "------------------ " QUOTE(T_FX_FLOAT) " ---- " << T_WL << ", " 486 << T_IWL << " --------------\n"; 487 T_FX_FLOAT r(0x8000); 488#include "fx_precision_double.h" 489 T_FX_FLOAT m(0x8000); 490 T_FX_FLOAT q; 491#include "fx_precision_default.h" 492 int i; 493 for (i = 0; i < T_WL+10; ++i) 494 { 495 r = r >> 1; 496 r += 1; 497 q = m << i; 498 q += 1; 499 SHOW(i, r); 500 SHOW(i, q); 501 } 502 r = r >> 0; 503 SHOW(0, r); 504 r = r >> -4; 505 SHOW(-4, r); 506 r >>= 0; 507 SHOW(0, r); 508 r >>= -4; 509 SHOW(-4, r); 510 q = m >> 0; 511 SHOW(0, m); 512 q = m >> -5; 513 SHOW(-5, q); 514} 515 516{ 517 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 518 519 out << "------------------ " QUOTE(T_FX_UFIX) " ---- " << T_WL << ", " 520 << T_IWL << " --------------\n"; 521 T_FX_UFIX r(0x8000); 522#include "fx_precision_double.h" 523 T_FX_UFIX m(0x8000); 524 T_FX_UFIX q; 525#include "fx_precision_default.h" 526 int i; 527 for (i = 0; i < T_WL+10; ++i) 528 { 529 r = r >> 1; 530 r += 1; 531 q = m << i; 532 q += 1; 533 SHOW(i, r); 534 SHOW(i, q); 535 } 536 r = r >> 0; 537 SHOW(0, r); 538 r = r >> -4; 539 SHOW(-4, r); 540 r >>= 0; 541 SHOW(0, r); 542 r >>= -4; 543 SHOW(-4, r); 544 q = m >> 0; 545 SHOW(0, m); 546 q = m >> -5; 547 SHOW(-5, q); 548} 549 550{ 551 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 552 553 out << "------------------ " QUOTE(T_FX_FIX) " ---- " << T_WL << ", " 554 << T_IWL << " --------------\n"; 555 T_FX_FIX r(0x8000); 556#include "fx_precision_double.h" 557 T_FX_FIX m(0x8000); 558 T_FX_FIX q; 559#include "fx_precision_default.h" 560 int i; 561 for (i = 0; i < T_WL+10; ++i) 562 { 563 r = r >> 1; 564 r += 1; 565 q = m << i; 566 q += 1; 567 SHOW(i, r); 568 SHOW(i, q); 569 } 570 r = r >> 0; 571 SHOW(0, r); 572 r = r >> -4; 573 SHOW(-4, r); 574 r >>= 0; 575 SHOW(0, r); 576 r >>= -4; 577 SHOW(-4, r); 578 q = m >> 0; 579 SHOW(0, m); 580 q = m >> -5; 581 SHOW(-5, q); 582} 583 584{ 585 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 586 587 out << "------------------ " QUOTE(T_FX_FIXED) " ---- " << T_WL << ", " 588 << T_IWL << " --------------\n"; 589 T_FX_FIXED r(0x8000); 590#include "fx_precision_double.h" 591 T_FX_FIXED m(0x8000); 592 T_FX_FIXED q; 593#include "fx_precision_default.h" 594 int i; 595 for (i = 0; i < T_WL+10; ++i) 596 { 597 r = r >> 1; 598 r += 1; 599 q = m << i; 600 q += 1; 601 SHOW(i, r); 602 SHOW(i, q); 603 } 604 r = r >> 0; 605 SHOW(0, r); 606 r = r >> -4; 607 SHOW(-4, r); 608 r >>= 0; 609 SHOW(0, r); 610 r >>= -4; 611 SHOW(-4, r); 612 q = m >> 0; 613 SHOW(0, m); 614 q = m >> -5; 615 SHOW(-5, q); 616} 617 618{ 619 sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP); 620 621 out << "------------------ " QUOTE(T_FX_UFIXED) " ---- " << T_WL << ", " 622 << T_IWL << " --------------\n"; 623 T_FX_UFIXED r(0x8000); 624#include "fx_precision_double.h" 625 T_FX_UFIXED m(0x8000); 626 T_FX_UFIXED q; 627#include "fx_precision_default.h" 628 int i; 629 for (i = 0; i < T_WL+10; ++i) 630 { 631 r = r >> 1; 632 r += 1; 633 q = m << i; 634 q += 1; 635 SHOW(i, r); 636 SHOW(i, q); 637 } 638 r = r >> 0; 639 SHOW(0, r); 640 r = r >> -4; 641 SHOW(-4, r); 642 r >>= 0; 643 SHOW(0, r); 644 r >>= -4; 645 SHOW(-4, r); 646 q = m >> 0; 647 SHOW(0, m); 648 q = m >> -5; 649 SHOW(-5, q); 650} 651} 652 653#endif 654