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