operator_shift_left.cpp revision 12855:588919e0e4aa
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_left.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_left.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
64#if 0
65
66#define SHIFT_LEFT_OP(T_op)						      \
67{									      \
68  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);		      \
69  									      \
70  out << "------------------ " #T_op " ---- " << T_WL << ", " << T_IWL << " --------------\n"; \
71  T_op r(2);
72  int i;								      \
73  for (i = 0; i < T_WL+10; ++i)						      \
74    {									      \
75      r = r << 1;							      \
76      r += 1; 								      \
77      SHOW(i, r);							      \
78    }									      \
79    {									      \
80      T_op m(1, FX_off);						      \
81      T_op q(FX_off); 							      \
82      for (i = 0; i < T_WL+10; ++i)					      \
83      {									      \
84        q = m << i;							      \
85        q += 1; 							      \
86        SHOW(i, q);							      \
87      }									      \
88      q = m << 0;							      \
89      SHOW(0, q);							      \
90      q = m << -5;							      \
91      SHOW(-5, m);							      \
92    }									      \
93    r = r << 0;								      \
94    SHOW(0, r);								      \
95    r = r << -4;							      \
96    SHOW(-4, r);							      \
97    r <<= 0;								      \
98    SHOW(0, r);								      \
99    r <<= -4;							              \
100    SHOW(-4, r);							      \
101}
102
103#define SHIFT_LEFT							      \
104SHIFT_LEFT_OP(T_FX_FLOAT)						      \
105SHIFT_LEFT_OP(T_FX_UFIX)						      \
106SHIFT_LEFT_OP(T_FX_FIX)							      \
107SHIFT_LEFT_OP(T_FX_FIXED)						      \
108SHIFT_LEFT_OP(T_FX_UFIXED)
109
110
111
112void operator_shift_left(ostream& out)
113{
114#define T_WL 13
115#define T_IWL 13
116  SHIFT_LEFT;
117#undef T_WL
118#undef T_IWL
119#define T_WL 65
120#define T_IWL 65
121  SHIFT_LEFT;
122#undef T_WL
123#undef T_IWL
124#define T_WL 150
125#define T_IWL 150
126  SHIFT_LEFT;
127}
128
129#else
130
131#define QUOTE(x) #x
132
133void operator_shift_left(ostream& out)
134{
135#define T_WL 13
136#define T_IWL 13
137
138{
139  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
140
141  out << "------------------ " QUOTE(T_FX_FLOAT) " ---- " << T_WL << ", "
142     << T_IWL << " --------------\n";
143  T_FX_FLOAT r(2);
144  int i;
145  for (i = 0; i < T_WL+10; ++i)
146    {
147      r = r << 1;
148      r += 1;
149      SHOW(i, r);
150    }
151    {
152#include "fx_precision_double.h"
153      T_FX_FLOAT m(1);
154      T_FX_FLOAT q;
155#include "fx_precision_default.h"
156      for (i = 0; i < T_WL+10; ++i)
157      {
158        q = m << i;
159        q += 1;
160        SHOW(i, q);
161      }
162      q = m << 0;
163      SHOW(0, q);
164      q = m << -5;
165      SHOW(-5, m);
166    }
167    r = r << 0;
168    SHOW(0, r);
169    r = r << -4;
170    SHOW(-4, r);
171    r <<= 0;
172    SHOW(0, r);
173    r <<= -4;
174    SHOW(-4, r);
175}
176
177{
178  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
179
180  out << "------------------ " QUOTE(T_FX_UFIX) " ---- " << T_WL << ", "
181     << T_IWL << " --------------\n";
182  T_FX_UFIX r(2);
183  int i;
184  for (i = 0; i < T_WL+10; ++i)
185    {
186      r = r << 1;
187      r += 1;
188      SHOW(i, r);
189    }
190    {
191#include "fx_precision_double.h"
192      T_FX_UFIX m(1);
193      T_FX_UFIX q;
194#include "fx_precision_default.h"
195      for (i = 0; i < T_WL+10; ++i)
196      {
197        q = m << i;
198        q += 1;
199        SHOW(i, q);
200      }
201      q = m << 0;
202      SHOW(0, q);
203      q = m << -5;
204      SHOW(-5, m);
205    }
206    r = r << 0;
207    SHOW(0, r);
208    r = r << -4;
209    SHOW(-4, r);
210    r <<= 0;
211    SHOW(0, r);
212    r <<= -4;
213    SHOW(-4, r);
214}
215
216{
217  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
218
219  out << "------------------ " QUOTE(T_FX_FIX) " ---- " << T_WL << ", "
220     << T_IWL << " --------------\n";
221  T_FX_FIX r(2);
222  int i;
223  for (i = 0; i < T_WL+10; ++i)
224    {
225      r = r << 1;
226      r += 1;
227      SHOW(i, r);
228    }
229    {
230#include "fx_precision_double.h"
231      T_FX_FIX m(1);
232      T_FX_FIX q;
233#include "fx_precision_default.h"
234      for (i = 0; i < T_WL+10; ++i)
235      {
236        q = m << i;
237        q += 1;
238        SHOW(i, q);
239      }
240      q = m << 0;
241      SHOW(0, q);
242      q = m << -5;
243      SHOW(-5, m);
244    }
245    r = r << 0;
246    SHOW(0, r);
247    r = r << -4;
248    SHOW(-4, r);
249    r <<= 0;
250    SHOW(0, r);
251    r <<= -4;
252    SHOW(-4, r);
253}
254
255{
256  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
257
258  out << "------------------ " QUOTE(T_FX_FIXED) " ---- " << T_WL << ", "
259     << T_IWL << " --------------\n";
260  T_FX_FIXED r(2);
261  int i;
262  for (i = 0; i < T_WL+10; ++i)
263    {
264      r = r << 1;
265      r += 1;
266      SHOW(i, r);
267    }
268    {
269#include "fx_precision_double.h"
270      T_FX_FIXED m(1);
271      T_FX_FIXED q;
272#include "fx_precision_default.h"
273      for (i = 0; i < T_WL+10; ++i)
274      {
275        q = m << i;
276        q += 1;
277        SHOW(i, q);
278      }
279      q = m << 0;
280      SHOW(0, q);
281      q = m << -5;
282      SHOW(-5, m);
283    }
284    r = r << 0;
285    SHOW(0, r);
286    r = r << -4;
287    SHOW(-4, r);
288    r <<= 0;
289    SHOW(0, r);
290    r <<= -4;
291    SHOW(-4, r);
292}
293
294{
295  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
296
297  out << "------------------ " QUOTE(T_FX_UFIXED) " ---- " << T_WL << ", "
298     << T_IWL << " --------------\n";
299  T_FX_UFIXED r(2);
300  int i;
301  for (i = 0; i < T_WL+10; ++i)
302    {
303      r = r << 1;
304      r += 1;
305      SHOW(i, r);
306    }
307    {
308#include "fx_precision_double.h"
309      T_FX_UFIXED m(1);
310      T_FX_UFIXED q;
311#include "fx_precision_default.h"
312      for (i = 0; i < T_WL+10; ++i)
313      {
314        q = m << i;
315        q += 1;
316        SHOW(i, q);
317      }
318      q = m << 0;
319      SHOW(0, q);
320      q = m << -5;
321      SHOW(-5, m);
322    }
323    r = r << 0;
324    SHOW(0, r);
325    r = r << -4;
326    SHOW(-4, r);
327    r <<= 0;
328    SHOW(0, r);
329    r <<= -4;
330    SHOW(-4, r);
331}
332
333#undef T_WL
334#undef T_IWL
335#define T_WL 65
336#define T_IWL 65
337
338{
339  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
340
341  out << "------------------ " QUOTE(T_FX_FLOAT) " ---- " << T_WL << ", "
342     << T_IWL << " --------------\n";
343  T_FX_FLOAT r(2);
344  int i;
345  for (i = 0; i < T_WL+10; ++i)
346    {
347      r = r << 1;
348      r += 1;
349      SHOW(i, r);
350    }
351    {
352#include "fx_precision_double.h"
353      T_FX_FLOAT m(1);
354      T_FX_FLOAT q;
355#include "fx_precision_default.h"
356      for (i = 0; i < T_WL+10; ++i)
357      {
358        q = m << i;
359        q += 1;
360        SHOW(i, q);
361      }
362      q = m << 0;
363      SHOW(0, q);
364      q = m << -5;
365      SHOW(-5, m);
366    }
367    r = r << 0;
368    SHOW(0, r);
369    r = r << -4;
370    SHOW(-4, r);
371    r <<= 0;
372    SHOW(0, r);
373    r <<= -4;
374    SHOW(-4, r);
375}
376
377{
378  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
379
380  out << "------------------ " QUOTE(T_FX_UFIX) " ---- " << T_WL << ", "
381     << T_IWL << " --------------\n";
382  T_FX_UFIX r(2);
383  int i;
384  for (i = 0; i < T_WL+10; ++i)
385    {
386      r = r << 1;
387      r += 1;
388      SHOW(i, r);
389    }
390    {
391#include "fx_precision_double.h"
392      T_FX_UFIX m(1);
393      T_FX_UFIX q;
394#include "fx_precision_default.h"
395      for (i = 0; i < T_WL+10; ++i)
396      {
397        q = m << i;
398        q += 1;
399        SHOW(i, q);
400      }
401      q = m << 0;
402      SHOW(0, q);
403      q = m << -5;
404      SHOW(-5, m);
405    }
406    r = r << 0;
407    SHOW(0, r);
408    r = r << -4;
409    SHOW(-4, r);
410    r <<= 0;
411    SHOW(0, r);
412    r <<= -4;
413    SHOW(-4, r);
414}
415
416{
417  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
418
419  out << "------------------ " QUOTE(T_FX_FIX) " ---- " << T_WL << ", "
420     << T_IWL << " --------------\n";
421  T_FX_FIX r(2);
422  int i;
423  for (i = 0; i < T_WL+10; ++i)
424    {
425      r = r << 1;
426      r += 1;
427      SHOW(i, r);
428    }
429    {
430#include "fx_precision_double.h"
431      T_FX_FIX m(1);
432      T_FX_FIX q;
433#include "fx_precision_default.h"
434      for (i = 0; i < T_WL+10; ++i)
435      {
436        q = m << i;
437        q += 1;
438        SHOW(i, q);
439      }
440      q = m << 0;
441      SHOW(0, q);
442      q = m << -5;
443      SHOW(-5, m);
444    }
445    r = r << 0;
446    SHOW(0, r);
447    r = r << -4;
448    SHOW(-4, r);
449    r <<= 0;
450    SHOW(0, r);
451    r <<= -4;
452    SHOW(-4, r);
453}
454
455{
456  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
457
458  out << "------------------ " QUOTE(T_FX_FIXED) " ---- " << T_WL << ", "
459     << T_IWL << " --------------\n";
460  T_FX_FIXED r(2);
461  int i;
462  for (i = 0; i < T_WL+10; ++i)
463    {
464      r = r << 1;
465      r += 1;
466      SHOW(i, r);
467    }
468    {
469#include "fx_precision_double.h"
470      T_FX_FIXED m(1);
471      T_FX_FIXED q;
472#include "fx_precision_default.h"
473      for (i = 0; i < T_WL+10; ++i)
474      {
475        q = m << i;
476        q += 1;
477        SHOW(i, q);
478      }
479      q = m << 0;
480      SHOW(0, q);
481      q = m << -5;
482      SHOW(-5, m);
483    }
484    r = r << 0;
485    SHOW(0, r);
486    r = r << -4;
487    SHOW(-4, r);
488    r <<= 0;
489    SHOW(0, r);
490    r <<= -4;
491    SHOW(-4, r);
492}
493
494{
495  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
496
497  out << "------------------ " QUOTE(T_FX_UFIXED) " ---- " << T_WL << ", "
498     << T_IWL << " --------------\n";
499  T_FX_UFIXED r(2);
500  int i;
501  for (i = 0; i < T_WL+10; ++i)
502    {
503      r = r << 1;
504      r += 1;
505      SHOW(i, r);
506    }
507    {
508#include "fx_precision_double.h"
509      T_FX_UFIXED m(1);
510      T_FX_UFIXED q;
511#include "fx_precision_default.h"
512      for (i = 0; i < T_WL+10; ++i)
513      {
514        q = m << i;
515        q += 1;
516        SHOW(i, q);
517      }
518      q = m << 0;
519      SHOW(0, q);
520      q = m << -5;
521      SHOW(-5, m);
522    }
523    r = r << 0;
524    SHOW(0, r);
525    r = r << -4;
526    SHOW(-4, r);
527    r <<= 0;
528    SHOW(0, r);
529    r <<= -4;
530    SHOW(-4, r);
531}
532
533#undef T_WL
534#undef T_IWL
535#define T_WL 150
536#define T_IWL 150
537
538{
539  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
540
541  out << "------------------ " QUOTE(T_FX_FLOAT) " ---- " << T_WL << ", "
542     << T_IWL << " --------------\n";
543  T_FX_FLOAT r(2);
544  int i;
545  for (i = 0; i < T_WL+10; ++i)
546    {
547      r = r << 1;
548      r += 1;
549      SHOW(i, r);
550    }
551    {
552#include "fx_precision_double.h"
553      T_FX_FLOAT m(1);
554      T_FX_FLOAT q;
555#include "fx_precision_default.h"
556      for (i = 0; i < T_WL+10; ++i)
557      {
558        q = m << i;
559        q += 1;
560        SHOW(i, q);
561      }
562      q = m << 0;
563      SHOW(0, q);
564      q = m << -5;
565      SHOW(-5, m);
566    }
567    r = r << 0;
568    SHOW(0, r);
569    r = r << -4;
570    SHOW(-4, r);
571    r <<= 0;
572    SHOW(0, r);
573    r <<= -4;
574    SHOW(-4, r);
575}
576
577{
578  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
579
580  out << "------------------ " QUOTE(T_FX_UFIX) " ---- " << T_WL << ", "
581     << T_IWL << " --------------\n";
582  T_FX_UFIX r(2);
583  int i;
584  for (i = 0; i < T_WL+10; ++i)
585    {
586      r = r << 1;
587      r += 1;
588      SHOW(i, r);
589    }
590    {
591#include "fx_precision_double.h"
592      T_FX_UFIX m(1);
593      T_FX_UFIX q;
594#include "fx_precision_default.h"
595      for (i = 0; i < T_WL+10; ++i)
596      {
597        q = m << i;
598        q += 1;
599        SHOW(i, q);
600      }
601      q = m << 0;
602      SHOW(0, q);
603      q = m << -5;
604      SHOW(-5, m);
605    }
606    r = r << 0;
607    SHOW(0, r);
608    r = r << -4;
609    SHOW(-4, r);
610    r <<= 0;
611    SHOW(0, r);
612    r <<= -4;
613    SHOW(-4, r);
614}
615
616{
617  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
618
619  out << "------------------ " QUOTE(T_FX_FIX) " ---- " << T_WL << ", "
620     << T_IWL << " --------------\n";
621  T_FX_FIX r(2);
622  int i;
623  for (i = 0; i < T_WL+10; ++i)
624    {
625      r = r << 1;
626      r += 1;
627      SHOW(i, r);
628    }
629    {
630#include "fx_precision_double.h"
631      T_FX_FIX m(1);
632      T_FX_FIX q;
633#include "fx_precision_default.h"
634      for (i = 0; i < T_WL+10; ++i)
635      {
636        q = m << i;
637        q += 1;
638        SHOW(i, q);
639      }
640      q = m << 0;
641      SHOW(0, q);
642      q = m << -5;
643      SHOW(-5, m);
644    }
645    r = r << 0;
646    SHOW(0, r);
647    r = r << -4;
648    SHOW(-4, r);
649    r <<= 0;
650    SHOW(0, r);
651    r <<= -4;
652    SHOW(-4, r);
653}
654
655{
656  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
657
658  out << "------------------ " QUOTE(T_FX_FIXED) " ---- " << T_WL << ", "
659     << T_IWL << " --------------\n";
660  T_FX_FIXED r(2);
661  int i;
662  for (i = 0; i < T_WL+10; ++i)
663    {
664      r = r << 1;
665      r += 1;
666      SHOW(i, r);
667    }
668    {
669#include "fx_precision_double.h"
670      T_FX_FIXED m(1);
671      T_FX_FIXED q;
672#include "fx_precision_default.h"
673      for (i = 0; i < T_WL+10; ++i)
674      {
675        q = m << i;
676        q += 1;
677        SHOW(i, q);
678      }
679      q = m << 0;
680      SHOW(0, q);
681      q = m << -5;
682      SHOW(-5, m);
683    }
684    r = r << 0;
685    SHOW(0, r);
686    r = r << -4;
687    SHOW(-4, r);
688    r <<= 0;
689    SHOW(0, r);
690    r <<= -4;
691    SHOW(-4, r);
692}
693
694{
695  sc_fxtype_params fooc(T_WL, T_IWL, SC_TRN, SC_WRAP);
696
697  out << "------------------ " QUOTE(T_FX_UFIXED) " ---- " << T_WL << ", "
698     << T_IWL << " --------------\n";
699  T_FX_UFIXED r(2);
700  int i;
701  for (i = 0; i < T_WL+10; ++i)
702    {
703      r = r << 1;
704      r += 1;
705      SHOW(i, r);
706    }
707    {
708#include "fx_precision_double.h"
709      T_FX_UFIXED m(1);
710      T_FX_UFIXED q;
711#include "fx_precision_default.h"
712      for (i = 0; i < T_WL+10; ++i)
713      {
714        q = m << i;
715        q += 1;
716        SHOW(i, q);
717      }
718      q = m << 0;
719      SHOW(0, q);
720      q = m << -5;
721      SHOW(-5, m);
722    }
723    r = r << 0;
724    SHOW(0, r);
725    r = r << -4;
726    SHOW(-4, r);
727    r <<= 0;
728    SHOW(0, r);
729    r <<= -4;
730    SHOW(-4, r);
731}
732}
733
734#endif
735