SystemC 3.0.0
Accellera SystemC proof-of-concept library
sc_uint_base.h
Go to the documentation of this file.
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_uint_base.h -- A sc_uint is an unsigned integer whose length is between
23 1 and 64. The sc_uint integer is useful when the user does
24 not need arbitrary precision and the performance is superior
25 to sc_bigint/sc_biguint.
26
27 Original Author: Amit Rao, Synopsys, Inc.
28
29 *****************************************************************************/
30
31/*****************************************************************************
32
33 MODIFICATION LOG - modifiers, enter your name, affiliation, date and
34 changes you are making here.
35
36 Name, Affiliation, Date: Ali Dasdan, Synopsys, Inc.
37 Description of Modification: - Resolved ambiguity with sc_(un)signed.
38 - Merged the code for 64- and 32-bit versions
39 via the constants in sc_nbdefs.h.
40 - Eliminated redundant file inclusions.
41
42 Name, Affiliation, Date:
43 Description of Modification:
44
45 *****************************************************************************/
46
47// $Log: sc_uint_base.h,v $
48// Revision 1.3 2011/08/24 22:05:46 acg
49// Torsten Maehne: initialization changes to remove warnings.
50//
51// Revision 1.2 2011/02/18 20:19:15 acg
52// Andy Goodrich: updating Copyright notice.
53//
54// Revision 1.1.1.1 2006/12/15 20:20:05 acg
55// SystemC 2.3
56//
57// Revision 1.4 2006/05/08 17:50:02 acg
58// Andy Goodrich: Added David Long's declarations for friend operators,
59// functions, and methods, to keep the Microsoft compiler happy.
60//
61// Revision 1.3 2006/01/13 18:49:32 acg
62// Added $Log command so that CVS check in comments are reproduced in the
63// source.
64//
65
66#ifndef SC_UINT_BASE_H
67#define SC_UINT_BASE_H
68
69
78
79
80namespace sc_dt
81{
82
83class sc_concatref;
84
85// classes defined in this module
86class sc_uint_bitref_r;
87class sc_uint_bitref;
88class sc_uint_subref_r;
89class sc_uint_subref;
90class sc_uint_base;
91
92// forward class declarations
93class sc_bv_base;
94class sc_lv_base;
95class sc_int_subref_r;
96class sc_signed_subref_r;
97class sc_unsigned_subref_r;
98class sc_signed;
99class sc_unsigned;
100class sc_fxval;
101class sc_fxval_fast;
102class sc_fxnum;
103class sc_fxnum_fast;
104
105
107
108// friend operator declarations
109 inline bool operator == ( const sc_uint_base& a, const sc_uint_base& b );
110 inline bool operator != ( const sc_uint_base& a, const sc_uint_base& b );
111 inline bool operator < ( const sc_uint_base& a, const sc_uint_base& b );
112 inline bool operator <= ( const sc_uint_base& a, const sc_uint_base& b );
113 inline bool operator > ( const sc_uint_base& a, const sc_uint_base& b );
114 inline bool operator >= ( const sc_uint_base& a, const sc_uint_base& b );
115
116
117
118// ----------------------------------------------------------------------------
119// CLASS : sc_uint_bitref_r
120//
121// Proxy class for sc_uint bit selection (r-value only).
122// ----------------------------------------------------------------------------
123
125{
126 friend class sc_uint_base;
127 friend class sc_uint_signal;
128
129
130 // constructors
131
132public:
134 sc_value_base(init), m_index(init.m_index), m_obj_p(init.m_obj_p)
135 {}
136
137protected:
138 sc_uint_bitref_r() : sc_value_base(), m_index(0), m_obj_p(0)
139 {}
140
141 // initializer for sc_core::sc_vpool:
142
143 void initialize( const sc_uint_base* obj_p, int index_ )
144 {
145 m_obj_p = (sc_uint_base*)obj_p;
146 m_index = index_;
147 }
148
149public:
150
151 // destructor
152
154 {}
155
156 // concatenation support
157
158 virtual int concat_length(bool* xz_present_p) const
159 { if ( xz_present_p ) *xz_present_p = false; return 1; }
160 virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const
161 {
162 int bit_mask = 1 << SC_BIT_INDEX(low_i);
163 int word_i = SC_DIGIT_INDEX(low_i);
164
165 dst_p[word_i] &= ~bit_mask;
166 return false;
167 }
168 virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const
169 {
170 int bit_mask = 1 << SC_BIT_INDEX(low_i);
171 bool result; // True is non-zero.
172 int word_i = SC_DIGIT_INDEX(low_i);
173
174 if ( operator uint64() )
175 {
176 dst_p[word_i] |= bit_mask;
177 result = true;
178 }
179 else
180 {
181 dst_p[word_i] &= ~bit_mask;
182 result = false;
183 }
184 return result;
185 }
186 virtual uint64 concat_get_uint64() const
187 { return operator uint64(); }
188
189 // capacity
190
191 int length() const
192 { return 1; }
193
194#ifdef SC_DT_DEPRECATED
195 int bitwidth() const
196 { return length(); }
197#endif
198
199
200 // implicit conversion to uint64
201
202 operator uint64 () const;
203 bool operator ! () const;
204 bool operator ~ () const;
205
206
207 // explicit conversions
208
209 uint64 value() const
210 { return operator uint64 (); }
211
212 bool to_bool() const
213 { return operator uint64 (); }
214
215
216 // other methods
217
218 void print( ::std::ostream& os = ::std::cout ) const
219 { os << to_bool(); }
220
221protected:
222
225
226private:
227
228 // disabled
229 sc_uint_bitref_r& operator = ( const sc_uint_bitref_r& );
230};
231
232
233
234inline
235::std::ostream&
236operator << ( ::std::ostream&, const sc_uint_bitref_r& );
237
238
239// ----------------------------------------------------------------------------
240// CLASS : sc_uint_bitref
241//
242// Proxy class for sc_uint bit selection (r-value and l-value).
243// ----------------------------------------------------------------------------
244
246 : public sc_uint_bitref_r
247{
248 friend class sc_uint_base;
249 friend class sc_core::sc_vpool<sc_uint_bitref>;
250
251
252 // constructors
253
254protected:
256 {}
257public:
259 {}
260
261public:
262
263 // assignment operators
264
265 sc_uint_bitref& operator = ( const sc_uint_bitref_r& b );
266 sc_uint_bitref& operator = ( const sc_uint_bitref& b );
267 sc_uint_bitref& operator = ( bool b );
268
272
273 // concatenation methods
274
275 virtual void concat_set(int64 src, int low_i);
276 virtual void concat_set(const sc_signed& src, int low_i);
277 virtual void concat_set(const sc_unsigned& src, int low_i);
278 virtual void concat_set(uint64 src, int low_i);
279
280 // other methods
281
282 void scan( ::std::istream& is = ::std::cin );
283
284};
285
286
287
288inline
289::std::istream&
290operator >> ( ::std::istream&, sc_uint_bitref& );
291
292
293// ----------------------------------------------------------------------------
294// CLASS : sc_uint_subref_r
295//
296// Proxy class for sc_uint part selection (r-value only).
297// ----------------------------------------------------------------------------
298
300{
301 friend class sc_uint_base;
302 friend class sc_uint_subref;
303
304
305 // constructors
306
307public:
309 sc_value_base(init), m_left(init.m_left), m_obj_p(init.m_obj_p),
310 m_right(init.m_right)
311 {}
312
313protected:
314 sc_uint_subref_r() : sc_value_base(), m_left(0), m_obj_p(0), m_right(0)
315 {}
316
317 // initializer for sc_core::sc_vpool:
318
319 void initialize( const sc_uint_base* obj_p, int left_i, int right_i )
320 {
321 m_obj_p = (sc_uint_base*)obj_p;
322 m_left = left_i;
323 m_right = right_i;
324 }
325
326public:
327
328 // destructor
329
331 {}
332
333 // capacity
334
335 int length() const
336 { return ( m_left - m_right + 1 ); }
337
338#ifdef SC_DT_DEPRECATED
339 int bitwidth() const
340 { return length(); }
341#endif
342
343 // concatenation support
344
345 virtual int concat_length(bool* xz_present_p) const
346 { if ( xz_present_p ) *xz_present_p = false; return length(); }
347 virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
348 virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
349 virtual uint64 concat_get_uint64() const
350 { return (uint64)operator uint_type(); }
351
352
353 // reduce methods
354
355 bool and_reduce() const;
356
357 bool nand_reduce() const
358 { return ( ! and_reduce() ); }
359
360 bool or_reduce() const;
361
362 bool nor_reduce() const
363 { return ( ! or_reduce() ); }
364
365 bool xor_reduce() const;
366
367 bool xnor_reduce() const
368 { return ( ! xor_reduce() ); }
369
370
371 // implicit conversion to uint_type
372
373 operator uint_type() const;
374
375
376 // explicit conversions
377
379 { return operator uint_type(); }
380
381
382 int to_int() const;
383 unsigned int to_uint() const;
384 long to_long() const;
385 unsigned long to_ulong() const;
386 int64 to_int64() const;
387 uint64 to_uint64() const;
388 double to_double() const;
389
390
391 // explicit conversion to character string
392
393 const std::string to_string( sc_numrep numrep = SC_DEC ) const;
394 const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
395
396
397 // other methods
398
399 void print( ::std::ostream& os = ::std::cout ) const
400 { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
401
402protected:
403
407
408private:
409
410 // disabled
411 sc_uint_subref_r& operator = ( const sc_uint_subref_r& );
412};
413
414
415
416inline
417::std::ostream&
418operator << ( ::std::ostream&, const sc_uint_subref_r& );
419
420
421// ----------------------------------------------------------------------------
422// CLASS : sc_uint_subref
423//
424// Proxy class for sc_uint part selection (r-value and l-value).
425// ----------------------------------------------------------------------------
426
428 : public sc_uint_subref_r
429{
430 friend class sc_uint_base;
431 friend class sc_core::sc_vpool<sc_uint_subref>;
432
433
434 // constructors
435
436protected:
438 {}
439
440public:
442 {}
443
444public:
445
446 // assignment operators
447
448 sc_uint_subref& operator = ( uint_type v );
449
450 sc_uint_subref& operator = ( const sc_uint_base& a );
451
452 sc_uint_subref& operator = ( const sc_uint_subref_r& a )
453 { return operator = ( a.operator uint_type() ); }
454
455 sc_uint_subref& operator = ( const sc_uint_subref& a )
456 { return operator = ( a.operator uint_type() ); }
457
458 template<class T>
459 sc_uint_subref& operator = ( const sc_generic_base<T>& a )
460 { return operator = ( a->to_uint64() ); }
461
462 sc_uint_subref& operator = ( const char* a );
463
464 sc_uint_subref& operator = ( unsigned long a )
465 { return operator = ( (uint_type) a ); }
466
467 sc_uint_subref& operator = ( long a )
468 { return operator = ( (uint_type) a ); }
469
470 sc_uint_subref& operator = ( unsigned int a )
471 { return operator = ( (uint_type) a ); }
472
473 sc_uint_subref& operator = ( int a )
474 { return operator = ( (uint_type) a ); }
475
476 sc_uint_subref& operator = ( int64 a )
477 { return operator = ( (uint_type) a ); }
478
479 sc_uint_subref& operator = ( double a )
480 { return operator = ( (uint_type) a ); }
481
482 sc_uint_subref& operator = ( const sc_signed& );
483 sc_uint_subref& operator = ( const sc_unsigned& );
484 sc_uint_subref& operator = ( const sc_bv_base& );
485 sc_uint_subref& operator = ( const sc_lv_base& );
486
487 // concatenation methods
488
489 virtual void concat_set(int64 src, int low_i);
490 virtual void concat_set(const sc_signed& src, int low_i);
491 virtual void concat_set(const sc_unsigned& src, int low_i);
492 virtual void concat_set(uint64 src, int low_i);
493
494 // other methods
495
496 void scan( ::std::istream& is = ::std::cin );
497
498};
499
500
501
502inline
503::std::istream&
504operator >> ( ::std::istream&, sc_uint_subref& );
505
506
507// ----------------------------------------------------------------------------
508// CLASS : sc_uint_base
509//
510// Base class for sc_uint.
511// ----------------------------------------------------------------------------
512
514{
515 friend class sc_uint_bitref_r;
516 friend class sc_uint_bitref;
517 friend class sc_uint_subref_r;
518 friend class sc_uint_subref;
519
520
521 // support methods
522
523 void invalid_length() const;
524 void invalid_index( int i ) const;
525 void invalid_range( int l, int r ) const;
526
527 void check_length() const
528 { if( m_len <= 0 || m_len > SC_INTWIDTH ) { invalid_length(); } }
529
530 void check_index( int i ) const
531 { if( i < 0 || i >= m_len ) { invalid_index( i ); } }
532
533 void check_range( int l, int r ) const
534 { if( r < 0 || l >= m_len || l < r ) { invalid_range( l, r ); } }
535
536 void check_value() const;
537
538 void extend_sign()
539 {
540#ifdef DEBUG_SYSTEMC
541 check_value();
542#endif
543 m_val &= ( ~UINT_ZERO >> m_ulen );
544 }
545
546public:
547
548 // constructors
549
550 explicit sc_uint_base( int w = sc_length_param().len() )
551 : m_val( 0 ), m_len( w ), m_ulen( SC_INTWIDTH - m_len )
552 { check_length(); }
553
555 : m_val( v ), m_len( w ), m_ulen( SC_INTWIDTH - m_len )
556 { check_length(); extend_sign(); }
557
559 : sc_value_base(a), m_val(a.m_val), m_len(a.m_len), m_ulen(a.m_ulen)
560 {}
561
562 explicit sc_uint_base( const sc_uint_subref_r& a )
563 : m_val( a ), m_len( a.length() ),
564 m_ulen( SC_INTWIDTH - m_len )
565 { extend_sign(); }
566
567 template<class T>
568 explicit sc_uint_base( const sc_generic_base<T>& a )
569 : m_val( a->to_uint64() ), m_len( a->length() ),
570 m_ulen( SC_INTWIDTH - m_len )
571 { check_length(); extend_sign(); }
572
573 explicit sc_uint_base( const sc_bv_base& v );
574 explicit sc_uint_base( const sc_lv_base& v );
575 explicit sc_uint_base( const sc_int_subref_r& v );
576 explicit sc_uint_base( const sc_signed_subref_r& v );
577 explicit sc_uint_base( const sc_unsigned_subref_r& v );
578 explicit sc_uint_base( const sc_signed& a );
579 explicit sc_uint_base( const sc_unsigned& a );
580
581
582 // destructor
583
585 {}
586
587
588 // assignment operators
589
590 sc_uint_base& operator = ( uint_type v )
591 { m_val = v; extend_sign(); return *this; }
592
593 sc_uint_base& operator = ( const sc_uint_base& a )
594 { m_val = a.m_val; extend_sign(); return *this; }
595
596 sc_uint_base& operator = ( const sc_uint_subref_r& a )
597 { m_val = a; extend_sign(); return *this; }
598
599 template<class T>
600 sc_uint_base& operator = ( const sc_generic_base<T>& a )
601 { m_val = a->to_uint64(); extend_sign(); return *this; }
602
603 sc_uint_base& operator = ( const sc_signed& a );
604 sc_uint_base& operator = ( const sc_unsigned& a );
605
606 inline sc_uint_base& operator = ( const sc_signed_subref_r& a );
607 inline sc_uint_base& operator = ( const sc_unsigned_subref_r& a );
608
609#ifdef SC_INCLUDE_FX
610 sc_uint_base& operator = ( const sc_fxval& a );
611 sc_uint_base& operator = ( const sc_fxval_fast& a );
612 sc_uint_base& operator = ( const sc_fxnum& a );
613 sc_uint_base& operator = ( const sc_fxnum_fast& a );
614#endif
615
616 sc_uint_base& operator = ( const sc_bv_base& a );
617 sc_uint_base& operator = ( const sc_lv_base& a );
618
619 sc_uint_base& operator = ( const char* a );
620
621 sc_uint_base& operator = ( unsigned long a )
622 { m_val = a; extend_sign(); return *this; }
623
624 sc_uint_base& operator = ( long a )
625 { m_val = a; extend_sign(); return *this; }
626
627 sc_uint_base& operator = ( unsigned int a )
628 { m_val = a; extend_sign(); return *this; }
629
630 sc_uint_base& operator = ( int a )
631 { m_val = a; extend_sign(); return *this; }
632
633 sc_uint_base& operator = ( int64 a )
634 { m_val = a; extend_sign(); return *this; }
635
636 sc_uint_base& operator = ( double a )
637 { m_val = (uint_type) a; extend_sign(); return *this; }
638
639
640 // arithmetic assignment operators
641
642 sc_uint_base& operator += ( uint_type v )
643 { m_val += v; extend_sign(); return *this; }
644
645 sc_uint_base& operator -= ( uint_type v )
646 { m_val -= v; extend_sign(); return *this; }
647
648 sc_uint_base& operator *= ( uint_type v )
649 { m_val *= v; extend_sign(); return *this; }
650
651 sc_uint_base& operator /= ( uint_type v )
652 { m_val /= v; extend_sign(); return *this; }
653
654 sc_uint_base& operator %= ( uint_type v )
655 { m_val %= v; extend_sign(); return *this; }
656
657
658 // bitwise assignment operators
659
661 { m_val &= v; extend_sign(); return *this; }
662
664 { m_val |= v; extend_sign(); return *this; }
665
667 { m_val ^= v; extend_sign(); return *this; }
668
669
670 sc_uint_base& operator <<= ( uint_type v )
671 { m_val <<= v; extend_sign(); return *this; }
672
673 sc_uint_base& operator >>= ( uint_type v )
674 { m_val >>= v; /* no sign extension needed */ return *this; }
675
676
677 // prefix and postfix increment and decrement operators
678
679 sc_uint_base& operator ++ () // prefix
680 { ++ m_val; extend_sign(); return *this; }
681
682 sc_uint_base operator ++ ( int ) // postfix
683 { sc_uint_base tmp( *this ); ++ m_val; extend_sign(); return tmp; }
684
685 sc_uint_base& operator -- () // prefix
686 { -- m_val; extend_sign(); return *this; }
687
688 sc_uint_base operator -- ( int ) // postfix
689 { sc_uint_base tmp( *this ); -- m_val; extend_sign(); return tmp; }
690
691
692 // relational operators
693
694 friend bool operator == ( const sc_uint_base& a, const sc_uint_base& b )
695 { return a.m_val == b.m_val; }
696
697 friend bool operator != ( const sc_uint_base& a, const sc_uint_base& b )
698 { return a.m_val != b.m_val; }
699
700 friend bool operator < ( const sc_uint_base& a, const sc_uint_base& b )
701 { return a.m_val < b.m_val; }
702
703 friend bool operator <= ( const sc_uint_base& a, const sc_uint_base& b )
704 { return a.m_val <= b.m_val; }
705
706 friend bool operator > ( const sc_uint_base& a, const sc_uint_base& b )
707 { return a.m_val > b.m_val; }
708
709 friend bool operator >= ( const sc_uint_base& a, const sc_uint_base& b )
710 { return a.m_val >= b.m_val; }
711
712
713 // bit selection
714
715 sc_uint_bitref& operator [] ( int i );
716 const sc_uint_bitref_r& operator [] ( int i ) const;
717
718 sc_uint_bitref& bit( int i );
719 const sc_uint_bitref_r& bit( int i ) const;
720
722 {
724 return pool.allocate();
725 }
726
727
728 // part selection
729
730 sc_uint_subref& operator () ( int left, int right );
731 const sc_uint_subref_r& operator () ( int left, int right ) const;
732
733 sc_uint_subref& range( int left, int right );
734 const sc_uint_subref_r& range( int left, int right ) const;
735
737 {
739 return pool.allocate();
740 }
741
742
743 // bit access, without bounds checking or sign extension
744
745 bool test( int i ) const
746 { return ( 0 != (m_val & (UINT_ONE << i)) ); }
747
748 void set( int i )
749 { m_val |= (UINT_ONE << i); }
750
751 void set( int i, bool v )
752 { v ? m_val |= (UINT_ONE << i) : m_val &= ~(UINT_ONE << i); }
753
754
755 // capacity
756
757 int length() const
758 { return m_len; }
759
760#ifdef SC_DT_DEPRECATED
761 int bitwidth() const
762 { return length(); }
763#endif
764
765 // concatenation support
766
767 virtual int concat_length(bool* xz_present_p) const
768 { if ( xz_present_p ) *xz_present_p = false; return length(); }
769 virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
770 virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
771 virtual uint64 concat_get_uint64() const
772 { return m_val; }
773 virtual void concat_set(int64 src, int low_i);
774 virtual void concat_set(const sc_signed& src, int low_i);
775 virtual void concat_set(const sc_unsigned& src, int low_i);
776 virtual void concat_set(uint64 src, int low_i);
777
778
779 // reduce methods
780
781 bool and_reduce() const;
782
783 bool nand_reduce() const
784 { return ( ! and_reduce() ); }
785
786 bool or_reduce() const;
787
788 bool nor_reduce() const
789 { return ( ! or_reduce() ); }
790
791 bool xor_reduce() const;
792
793 bool xnor_reduce() const
794 { return ( ! xor_reduce() ); }
795
796
797 // implicit conversion to uint_type
798
799 operator uint_type() const
800 { return m_val; }
801
802
803 // explicit conversions
804
806 { return operator uint_type(); }
807
808
809 int to_int() const
810 { return (int) m_val; }
811
812 unsigned int to_uint() const
813 { return (unsigned int) m_val; }
814
815 long to_long() const
816 { return (long) m_val; }
817
818 unsigned long to_ulong() const
819 { return (unsigned long) m_val; }
820
822 { return (int64) m_val; }
823
825 { return (uint64) m_val; }
826
827 double to_double() const
828 { return uint64_to_double( m_val ); }
829
830
831 long long_low() const
832 { return (long) (m_val & UINT64_32ONES); }
833
834 long long_high() const
835 { return (long) ((m_val >> 32) & UINT64_32ONES); }
836
837 // explicit conversion to character string
838
839 const std::string to_string( sc_numrep numrep = SC_DEC ) const;
840 const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
841
842
843 // other methods
844
845 void print( ::std::ostream& os = ::std::cout ) const
846 { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
847
848 void scan( ::std::istream& is = ::std::cin );
849
850protected:
851
852 uint_type m_val; // value
853 int m_len; // length
854 int m_ulen; // unused length
855};
856
857
858
859inline
860::std::ostream&
861operator << ( ::std::ostream&, const sc_uint_base& );
862
863inline
864::std::istream&
865operator >> ( ::std::istream&, sc_uint_base& );
866
867
868
869// ----------------------------------------------------------------------------
870// CLASS : sc_uint_bitref_r
871//
872// Proxy class for sc_uint bit selection (r-value only).
873// ----------------------------------------------------------------------------
874
875// implicit conversion to bool
876
877inline
878sc_uint_bitref_r::operator uint64 () const
879{
880 return m_obj_p->test( m_index );
881}
882
883inline
884bool
886{
887 return ! m_obj_p->test( m_index );
888}
889
890inline
891bool
893{
894 return ! m_obj_p->test( m_index );
895}
896
897
898
899inline
900::std::ostream&
901operator << ( ::std::ostream& os, const sc_uint_bitref_r& a )
902{
903 a.print( os );
904 return os;
905}
906
907
908// ----------------------------------------------------------------------------
909// CLASS : sc_uint_bitref
910//
911// Proxy class for sc_uint bit selection (r-value and l-value).
912// ----------------------------------------------------------------------------
913
914// assignment operators
915
916inline
917sc_uint_bitref&
919{
920 m_obj_p->set( m_index, b.to_bool() );
921 return *this;
922}
923
924inline
927{
928 m_obj_p->set( m_index, b.to_bool() );
929 return *this;
930}
931
932inline
935{
936 m_obj_p->set( m_index, b );
937 return *this;
938}
939
940
941inline
944{
945 if( ! b ) {
946 m_obj_p->set( m_index, b );
947 }
948 return *this;
949}
950
951inline
954{
955 if( b ) {
956 m_obj_p->set( m_index, b );
957 }
958 return *this;
959}
960
961inline
964{
965 if( b ) {
966 m_obj_p->m_val ^= (UINT_ONE << m_index);
967 }
968 return *this;
969}
970
971
972
973inline
974::std::istream&
975operator >> ( ::std::istream& is, sc_uint_bitref& a )
976{
977 a.scan( is );
978 return is;
979}
980
981
982// ----------------------------------------------------------------------------
983// CLASS : sc_uint_subref_r
984//
985// Proxy class for sc_uint part selection (r-value only).
986// ----------------------------------------------------------------------------
987
988// implicit conversion to uint_type
989
990inline
991sc_uint_subref_r::operator uint_type() const
992{
993 uint_type val = m_obj_p->m_val;
994 int uleft = SC_INTWIDTH - (m_left + 1);
995 return ( (val & (~UINT_ZERO >> uleft)) >> m_right );
996}
997
998
999// reduce methods
1000
1001inline
1002bool
1004{
1005 sc_uint_base a( *this );
1006 return a.and_reduce();
1007}
1008
1009inline
1010bool
1012{
1013 sc_uint_base a( *this );
1014 return a.or_reduce();
1015}
1016
1017inline
1018bool
1020{
1021 sc_uint_base a( *this );
1022 return a.xor_reduce();
1023}
1024
1025
1026// explicit conversions
1027
1028inline
1029int
1031{
1032 sc_uint_base a( *this );
1033 return a.to_int();
1034}
1035
1036inline
1037unsigned int
1039{
1040 sc_uint_base a( *this );
1041 return a.to_uint();
1042}
1043
1044inline
1045long
1047{
1048 sc_uint_base a( *this );
1049 return a.to_long();
1050}
1051
1052inline
1053unsigned long
1055{
1056 sc_uint_base a( *this );
1057 return a.to_ulong();
1058}
1059
1060inline
1061int64
1063{
1064 sc_uint_base a( *this );
1065 return a.to_int64();
1066}
1067
1068inline
1069uint64
1071{
1072 sc_uint_base a( *this );
1073 return a.to_uint64();
1074}
1075
1076inline
1077double
1079{
1080 sc_uint_base a( *this );
1081 return a.to_double();
1082}
1083
1084
1085// explicit conversion to character string
1086
1087inline
1088const std::string
1090{
1091 sc_uint_base a( *this );
1092 return a.to_string( numrep );
1093}
1094
1095inline
1096const std::string
1097sc_uint_subref_r::to_string( sc_numrep numrep, bool w_prefix ) const
1098{
1099 sc_uint_base a( *this );
1100 return a.to_string( numrep, w_prefix );
1101}
1102
1103
1104// functional notation for the reduce methods
1105
1106inline
1107bool
1109{
1110 return a.and_reduce();
1111}
1112
1113inline
1114bool
1116{
1117 return a.nand_reduce();
1118}
1119
1120inline
1121bool
1123{
1124 return a.or_reduce();
1125}
1126
1127inline
1128bool
1130{
1131 return a.nor_reduce();
1132}
1133
1134inline
1135bool
1137{
1138 return a.xor_reduce();
1139}
1140
1141inline
1142bool
1144{
1145 return a.xnor_reduce();
1146}
1147
1148
1149
1150inline
1151::std::ostream&
1152operator << ( ::std::ostream& os, const sc_uint_subref_r& a )
1153{
1154 a.print( os );
1155 return os;
1156}
1157
1158
1159// ----------------------------------------------------------------------------
1160// CLASS : sc_uint_subref
1161//
1162// Proxy class for sc_uint part selection (r-value and l-value).
1163// ----------------------------------------------------------------------------
1164
1165// assignment operators
1166
1167inline
1168sc_uint_subref&
1170{
1171 return operator = ( a.operator uint_type() );
1172}
1173
1174inline
1177{
1178 sc_uint_base aa( length() );
1179 return ( *this = aa = a );
1180}
1181
1182
1183
1184inline
1185::std::istream&
1186operator >> ( ::std::istream& is, sc_uint_subref& a )
1187{
1188 a.scan( is );
1189 return is;
1190}
1191
1192
1193// ----------------------------------------------------------------------------
1194// CLASS : sc_uint_base
1195//
1196// Base class for sc_uint.
1197// ----------------------------------------------------------------------------
1198
1199// bit selection
1200
1201inline
1202sc_uint_bitref&
1204{
1205 check_index( i );
1206 sc_uint_bitref* result_p = temporary_bitref();
1207 result_p->initialize(this, i);
1208 return *result_p;
1209}
1210
1211inline
1212const sc_uint_bitref_r&
1214{
1215 check_index( i );
1216 sc_uint_bitref* result_p = temporary_bitref();
1217 result_p->initialize(this, i);
1218 return *result_p;
1219}
1220
1221
1222inline
1225{
1226 check_index( i );
1227 sc_uint_bitref* result_p = temporary_bitref();
1228 result_p->initialize(this, i);
1229 return *result_p;
1230}
1231
1232inline
1233const sc_uint_bitref_r&
1234sc_uint_base::bit( int i ) const
1235{
1236 check_index( i );
1237 sc_uint_bitref* result_p = temporary_bitref();
1238 result_p->initialize(this, i);
1239 return *result_p;
1240}
1241
1242
1243// part selection
1244
1245inline
1247sc_uint_base::operator () ( int left, int right )
1248{
1249 check_range( left, right );
1250 sc_uint_subref* result_p = temporary_subref();
1251 result_p->initialize(this, left, right);
1252 return *result_p;
1253}
1254
1255inline
1256const sc_uint_subref_r&
1257sc_uint_base::operator () ( int left, int right ) const
1258{
1259 check_range( left, right );
1260 sc_uint_subref* result_p = temporary_subref();
1261 result_p->initialize(this, left, right);
1262 return *result_p;
1263}
1264
1265
1266inline
1268sc_uint_base::range( int left, int right )
1269{
1270 check_range( left, right );
1271 sc_uint_subref* result_p = temporary_subref();
1272 result_p->initialize(this, left, right);
1273 return *result_p;
1274}
1275
1276inline
1277const sc_uint_subref_r&
1278sc_uint_base::range( int left, int right ) const
1279{
1280 check_range( left, right );
1281 sc_uint_subref* result_p = temporary_subref();
1282 result_p->initialize(this, left, right);
1283 return *result_p;
1284}
1285
1286
1287// functional notation for the reduce methods
1288
1289inline
1290bool
1292{
1293 return a.and_reduce();
1294}
1295
1296inline
1297bool
1299{
1300 return a.nand_reduce();
1301}
1302
1303inline
1304bool
1306{
1307 return a.or_reduce();
1308}
1309
1310inline
1311bool
1313{
1314 return a.nor_reduce();
1315}
1316
1317inline
1318bool
1320{
1321 return a.xor_reduce();
1322}
1323
1324inline
1325bool
1327{
1328 return a.xnor_reduce();
1329}
1330
1331
1332
1333inline
1334::std::ostream&
1335operator << ( ::std::ostream& os, const sc_uint_base& a )
1336{
1337 a.print( os );
1338 return os;
1339}
1340
1341inline
1342::std::istream&
1343operator >> ( ::std::istream& is, sc_uint_base& a )
1344{
1345 a.scan( is );
1346 return is;
1347}
1348
1349} // namespace sc_dt
1350
1351#endif
1352
1353// Taf!
#define SC_DIGIT_INDEX(BIT_INDEX)
Definition: sc_nbdefs.h:186
#define SC_BIT_INDEX(BIT)
Definition: sc_nbdefs.h:185
#define SC_INTWIDTH
Definition: sc_nbdefs.h:260
#define SC_API
Definition: sc_cmnhdr.h:148
bool operator>=(const sc_int_base &a, const sc_int_base &b)
Definition: sc_int_base.h:741
sc_numrep sc_io_base(systemc_ostream &stream_object, sc_numrep def_base)
Definition: sc_string.h:108
X & operator|=(sc_proxy< X > &px, const sc_proxy< Y > &py)
Definition: sc_lv_base.h:474
bool sc_io_show_base(systemc_ostream &stream_object)
Definition: sc_string.h:113
double uint64_to_double(uint64 a)
Definition: scfx_ieee.h:684
sc_proxy< X >::value_type or_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1496
sc_proxy< X >::value_type xor_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1512
sc_numrep
Definition: sc_string.h:56
@ SC_DEC
Definition: sc_string.h:60
constexpr uint64 UINT_ONE
Definition: sc_nbdefs.h:262
X & operator^=(sc_proxy< X > &px, const sc_proxy< Y > &py)
Definition: sc_lv_base.h:613
constexpr uint64 UINT64_32ONES
Definition: sc_nbdefs.h:220
unsigned long long uint64
Definition: sc_nbdefs.h:216
bool operator==(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:285
bool operator<(const sc_int_base &a, const sc_int_base &b)
Definition: sc_int_base.h:732
sc_proxy< X >::value_type nor_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1504
SC_API std::string to_string(sc_enc)
bool operator<=(const sc_int_base &a, const sc_int_base &b)
Definition: sc_int_base.h:735
constexpr uint64 UINT_ZERO
Definition: sc_nbdefs.h:261
uint64 uint_type
Definition: sc_nbdefs.h:259
X & operator&=(sc_proxy< X > &px, const sc_proxy< Y > &py)
Definition: sc_lv_base.h:340
unsigned int sc_digit
Definition: sc_nbdefs.h:161
bool operator!=(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:288
inline::std::istream & operator>>(::std::istream &is, sc_bit &a)
Definition: sc_bit.h:396
sc_proxy< X >::value_type and_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1480
SC_API const uint_type mask_int[SC_INTWIDTH][SC_INTWIDTH]
Definition: sc_uint_base.h:106
bool operator>(const sc_int_base &a, const sc_int_base &b)
Definition: sc_int_base.h:738
inline::std::ostream & operator<<(::std::ostream &os, const sc_bit &a)
Definition: sc_bit.h:388
uint64 const sc_uint_base int b
Definition: sc_fxval.h:955
sc_proxy< X >::value_type xnor_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1520
sc_proxy< X >::value_type nand_reduce(const sc_proxy< X > &a)
Definition: sc_proxy.h:1488
sc_bit operator~(const sc_bit &a)
Definition: sc_bit.h:312
long long int64
Definition: sc_nbdefs.h:215
void print(::std::ostream &os=::std::cout) const
Definition: sc_uint_base.h:218
virtual uint64 concat_get_uint64() const
Definition: sc_uint_base.h:186
virtual int concat_length(bool *xz_present_p) const
Definition: sc_uint_base.h:158
uint64 value() const
Definition: sc_uint_base.h:209
void initialize(const sc_uint_base *obj_p, int index_)
Definition: sc_uint_base.h:143
virtual bool concat_get_ctrl(sc_digit *dst_p, int low_i) const
Definition: sc_uint_base.h:160
virtual bool concat_get_data(sc_digit *dst_p, int low_i) const
Definition: sc_uint_base.h:168
sc_uint_bitref_r(const sc_uint_bitref_r &init)
Definition: sc_uint_base.h:133
sc_uint_base * m_obj_p
Definition: sc_uint_base.h:224
sc_uint_bitref & operator&=(bool b)
Definition: sc_uint_base.h:943
virtual void concat_set(const sc_unsigned &src, int low_i)
sc_uint_bitref(const sc_uint_bitref &init)
Definition: sc_uint_base.h:258
sc_uint_bitref & operator=(const sc_uint_bitref_r &b)
Definition: sc_uint_base.h:918
virtual void concat_set(int64 src, int low_i)
sc_uint_bitref & operator|=(bool b)
Definition: sc_uint_base.h:953
virtual void concat_set(uint64 src, int low_i)
void scan(::std::istream &is=::std::cin)
sc_uint_bitref & operator^=(bool b)
Definition: sc_uint_base.h:963
virtual void concat_set(const sc_signed &src, int low_i)
uint64 to_uint64() const
virtual bool concat_get_ctrl(sc_digit *dst_p, int low_i) const
virtual int concat_length(bool *xz_present_p) const
Definition: sc_uint_base.h:345
void initialize(const sc_uint_base *obj_p, int left_i, int right_i)
Definition: sc_uint_base.h:319
bool nand_reduce() const
Definition: sc_uint_base.h:357
double to_double() const
virtual bool concat_get_data(sc_digit *dst_p, int low_i) const
sc_uint_base * m_obj_p
Definition: sc_uint_base.h:405
sc_uint_subref_r(const sc_uint_subref_r &init)
Definition: sc_uint_base.h:308
const std::string to_string(sc_numrep numrep=SC_DEC) const
uint_type value() const
Definition: sc_uint_base.h:378
virtual uint64 concat_get_uint64() const
Definition: sc_uint_base.h:349
unsigned long to_ulong() const
unsigned int to_uint() const
bool xnor_reduce() const
Definition: sc_uint_base.h:367
void print(::std::ostream &os=::std::cout) const
Definition: sc_uint_base.h:399
sc_uint_subref & operator=(uint_type v)
virtual void concat_set(const sc_unsigned &src, int low_i)
void scan(::std::istream &is=::std::cin)
virtual void concat_set(uint64 src, int low_i)
virtual void concat_set(const sc_signed &src, int low_i)
virtual void concat_set(int64 src, int low_i)
sc_uint_subref(const sc_uint_subref &init)
Definition: sc_uint_base.h:441
void set(int i, bool v)
Definition: sc_uint_base.h:751
virtual void concat_set(int64 src, int low_i)
uint_type value() const
Definition: sc_uint_base.h:805
sc_uint_base(const sc_uint_subref_r &a)
Definition: sc_uint_base.h:562
sc_uint_base(uint_type v, int w)
Definition: sc_uint_base.h:554
sc_uint_base(const sc_generic_base< T > &a)
Definition: sc_uint_base.h:568
sc_uint_bitref & operator[](int i)
int to_int() const
Definition: sc_uint_base.h:809
sc_uint_subref & range(int left, int right)
unsigned long to_ulong() const
Definition: sc_uint_base.h:818
bool xnor_reduce() const
Definition: sc_uint_base.h:793
sc_uint_base(int w=sc_length_param().len())
Definition: sc_uint_base.h:550
bool nor_reduce() const
Definition: sc_uint_base.h:788
bool and_reduce() const
bool nand_reduce() const
Definition: sc_uint_base.h:783
void scan(::std::istream &is=::std::cin)
sc_uint_base(const sc_bv_base &v)
sc_uint_base(const sc_unsigned_subref_r &v)
virtual void concat_set(const sc_unsigned &src, int low_i)
void print(::std::ostream &os=::std::cout) const
Definition: sc_uint_base.h:845
sc_uint_subref * temporary_subref() const
Definition: sc_uint_base.h:736
sc_uint_bitref * temporary_bitref() const
Definition: sc_uint_base.h:721
sc_uint_base(const sc_signed &a)
virtual int concat_length(bool *xz_present_p) const
Definition: sc_uint_base.h:767
const std::string to_string(sc_numrep numrep, bool w_prefix) const
sc_uint_base(const sc_int_subref_r &v)
sc_uint_base(const sc_lv_base &v)
bool or_reduce() const
long to_long() const
Definition: sc_uint_base.h:815
virtual bool concat_get_ctrl(sc_digit *dst_p, int low_i) const
long long_low() const
Definition: sc_uint_base.h:831
int length() const
Definition: sc_uint_base.h:757
bool xor_reduce() const
sc_uint_subref & operator()(int left, int right)
sc_uint_base(const sc_unsigned &a)
virtual void concat_set(uint64 src, int low_i)
unsigned int to_uint() const
Definition: sc_uint_base.h:812
sc_uint_bitref & bit(int i)
virtual ~sc_uint_base()
Definition: sc_uint_base.h:584
int64 to_int64() const
Definition: sc_uint_base.h:821
double to_double() const
Definition: sc_uint_base.h:827
virtual void concat_set(const sc_signed &src, int low_i)
bool test(int i) const
Definition: sc_uint_base.h:745
long long_high() const
Definition: sc_uint_base.h:834
uint64 to_uint64() const
Definition: sc_uint_base.h:824
const std::string to_string(sc_numrep numrep=SC_DEC) const
sc_uint_base(const sc_signed_subref_r &v)
virtual bool concat_get_data(sc_digit *dst_p, int low_i) const
virtual uint64 concat_get_uint64() const
Definition: sc_uint_base.h:771
sc_uint_base(const sc_uint_base &a)
Definition: sc_uint_base.h:558