SystemC 3.0.0
Accellera SystemC proof-of-concept library
sc_bit_proxies.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_bit_proxies.h -- Proxy classes for vector data types.
23
24 Original Author: Gene Bushuyev, Synopsys, Inc.
25
26 CHANGE LOG AT THE END OF THE FILE
27 *****************************************************************************/
28
29#ifndef SC_BIT_PROXIES_H
30#define SC_BIT_PROXIES_H
31
32
35
36#ifdef _MSC_VER
37// disable false positive warning C4806:
38// '&': unsafe operation: no value of type 'bool' promoted to type
39// 'const sc_dt::sc_digit' can equal the given constant
40// triggered by calling sc_subref<sc_bv_base>::get_cword
41// TODO: optimize get_cword for bit ranges to avoid check entirely
42#pragma warning(push)
43#pragma warning(disable:4806)
44#endif
45
46namespace sc_dt
47{
48
49// classes defined in this module
50template <class X, class Traits> class sc_bitref_conv_r;
51template <class X> class sc_bitref_r;
52template <class X> class sc_bitref;
53template <class X> class sc_subref_r;
54template <class X> class sc_subref;
55template <class X, class Y> class sc_concref_r;
56template <class X, class Y> class sc_concref;
57
58// ----------------------------------------------------------------------------
59// CLASS TEMPLATE : sc_bitref_conv_r<T>
60//
61// Proxy class for sc_proxy bit selection (r-value only, boolean conversion).
62// ----------------------------------------------------------------------------
63template<class T, class Traits = typename T::traits_type>
64class sc_bitref_conv_r { /* empty by default */ };
65
66// specialization for bit-vector based sc_proxy classes
67template<typename T>
69{
70public:
71#if IEEE_1666_CPLUSPLUS >= 201103L // explicit operator needs C++11
72 // explicit conversion to bool
73 explicit operator bool() const {
74 return static_cast<const sc_bitref_r<T>&>(*this).to_bool();
75 }
76#endif
77
78 // explicit (negating) conversion to bool
79 bool operator!() const {
80 return ! static_cast<const sc_bitref_r<T>&>(*this).to_bool();
81 }
82};
83
84// ----------------------------------------------------------------------------
85// CLASS TEMPLATE : sc_bitref_r<T>
86//
87// Proxy class for sc_proxy bit selection (r-value only).
88// ----------------------------------------------------------------------------
89
90template <class T>
92 : public sc_bitref_conv_r<T>
93{
94 friend class sc_bv_base;
95 friend class sc_lv_base;
96
97public:
98
99 // typedefs
100
101 typedef typename T::traits_type traits_type;
102 typedef typename traits_type::bit_type bit_type;
103 typedef typename traits_type::value_type value_type;
104
105 // constructor
106
107 sc_bitref_r( const T& obj_, int index_ )
108 : m_obj( const_cast<T&>( obj_ ) ), m_index( index_ )
109 {}
110
111
112 // copy constructor
113
115 : m_obj( a.m_obj ), m_index( a.m_index )
116 {}
117
118 // cloning
119
121 { return new sc_bitref_r<T>( *this ); }
122
123
124 // bitwise operators and functions
125
126 // bitwise complement
127
129 { return bit_type( sc_logic::not_table[value()] ); }
130
131
132 // implicit conversion to bit_type
133
134 operator bit_type() const
135 { return bit_type( m_obj.get_bit( m_index ) ); }
136
137
138 // explicit conversions
139
141 { return m_obj.get_bit( m_index ); }
142
143
144 bool is_01() const
145 { return sc_logic( value() ).is_01(); }
146
147 bool to_bool() const
148 { return sc_logic( value() ).to_bool(); }
149
150 char to_char() const
151 { return sc_logic( value() ).to_char(); }
152
153 explicit operator bool () const
154 { return to_bool(); }
155
156 bool operator ! () const
157 { return !to_bool(); }
158
159 // common methods
160
161 int length() const
162 { return 1; }
163
164 int size() const
165 { return ( (length() - 1) / SC_DIGIT_SIZE + 1 ); }
166
167 value_type get_bit( int n ) const;
168
169 sc_digit get_word( int i ) const;
170 sc_digit get_cword( int i ) const;
171
172
173 // other methods
174
175 void print( ::std::ostream& os = ::std::cout ) const
176 { os << to_char(); }
177
178protected:
179
182
183private:
184
185 // disabled
186 sc_bitref_r();
187 sc_bitref_r<T>& operator = ( const sc_bitref_r<T>& );
188};
189
190
191// bitwise operators and functions
192
193// bitwise and
194
195template <class T1, class T2>
196inline
198operator & ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
199
200
201// bitwise or
202
203template <class T1, class T2>
204inline
206operator | ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
207
208
209// bitwise xor
210
211template <class T1, class T2>
212inline
214operator ^ ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
215
216
217// relational operators and functions
218
219template <class T1, class T2>
220inline
221bool
223
224template <class T1, class T2>
225inline
226bool
228
229
230// r-value concatenation operators and functions
231
232template <class T1, class T2>
233inline
236
237template <class T1, class T2>
238inline
241
242template <class T1, class T2, class T3>
243inline
246
247template <class T1, class T2>
248inline
251
252template <class T>
253inline
255operator , ( sc_bitref_r<T>, const char* );
256
257template <class T>
258inline
260operator , ( const char*, sc_bitref_r<T> );
261
262template <class T>
263inline
266
267template <class T>
268inline
271
272template <class T>
273inline
276
277template <class T>
278inline
281
282
283template <class T1, class T2>
284inline
287
288template <class T1, class T2>
289inline
292
293template <class T1, class T2, class T3>
294inline
297
298template <class T1, class T2>
299inline
302
303template <class T>
304inline
306concat( sc_bitref_r<T>, const char* );
307
308template <class T>
309inline
311concat( const char*, sc_bitref_r<T> );
312
313template <class T>
314inline
317
318template <class T>
319inline
322
323template <class T>
324inline
326concat( sc_bitref_r<T>, bool );
327
328template <class T>
329inline
331concat( bool, sc_bitref_r<T> );
332
333
334#ifdef SC_DT_MIXED_COMMA_OPERATORS
335
336template <class T1, class T2>
337inline
340
341template <class T1, class T2>
342inline
345
346template <class T1, class T2>
347inline
350
351template <class T1, class T2>
352inline
355
356template <class T1, class T2, class T3>
357inline
360
361template <class T1, class T2, class T3>
362inline
365
366template <class T1, class T2>
367inline
370
371template <class T1, class T2>
372inline
375
376template <class T>
377inline
379operator , ( sc_bitref<T>, const char* );
380
381template <class T>
382inline
384operator , ( const char*, sc_bitref<T> );
385
386template <class T>
387inline
390
391template <class T>
392inline
395
396template <class T>
397inline
400
401template <class T>
402inline
405
406
407template <class T1, class T2>
408inline
411
412template <class T1, class T2>
413inline
416
417template <class T1, class T2>
418inline
421
422template <class T1, class T2>
423inline
426
427template <class T1, class T2, class T3>
428inline
431
432template <class T1, class T2, class T3>
433inline
436
437template <class T1, class T2>
438inline
441
442template <class T1, class T2>
443inline
446
447template <class T>
448inline
450concat( sc_bitref<T>, const char* );
451
452template <class T>
453inline
455concat( const char*, sc_bitref<T> );
456
457template <class T>
458inline
460concat( sc_bitref<T>, const sc_logic& );
461
462template <class T>
463inline
465concat( const sc_logic&, sc_bitref<T> );
466
467template <class T>
468inline
470concat( sc_bitref<T>, bool );
471
472template <class T>
473inline
475concat( bool, sc_bitref<T> );
476
477#endif
478
479
480// ----------------------------------------------------------------------------
481// CLASS TEMPLATE : sc_bitref<X>
482//
483// Proxy class for sc_proxy bit selection (r-value and l-value).
484// ----------------------------------------------------------------------------
485
486template <class X>
488 : public sc_bitref_r<X>
489{
490 friend class sc_bv_base;
491 friend class sc_lv_base;
492
493public:
495
496 // constructor
497
498 sc_bitref( X& obj_, int index_ )
499 : sc_bitref_r<X>( obj_, index_ )
500 {}
501
502
503 // copy constructor
504
506 : sc_bitref_r<X>( a )
507 {}
508
509
510 // cloning
511
513 { return new sc_bitref<X>( *this ); }
514
515
516 // assignment operators
517
520
522 { this->m_obj.set_bit( this->m_index, a.value() ); return *this; }
523
525 { *this = sc_logic( v ); return *this; }
526
528 { *this = sc_logic( a ); return *this; }
529
531 { *this = sc_logic( a ); return *this; }
532
534 { *this = sc_logic( a ); return *this; }
535
537 { *this = sc_logic( a ); return *this; }
538
539
540 // bitwise assignment operators
541
544
546 { *this &= sc_logic( v ); return *this; }
547
549 { *this &= sc_logic( a ); return *this; }
550
552 { *this &= sc_logic( a ); return *this; }
553
555 { *this &= sc_logic( a ); return *this; }
556
557
560
562 { *this |= sc_logic( v ); return *this; }
563
565 { *this |= sc_logic( a ); return *this; }
566
568 { *this |= sc_logic( a ); return *this; }
569
571 { *this |= sc_logic( a ); return *this; }
572
573
576
578 { *this ^= sc_logic( v ); return *this; }
579
581 { *this ^= sc_logic( a ); return *this; }
582
584 { *this ^= sc_logic( a ); return *this; }
585
587 { *this ^= sc_logic( a ); return *this; }
588
589
590 // bitwise operators and functions
591
592 // bitwise complement
593
595
596
597 // common methods
598
599 void set_bit( int n, value_type value );
600
601 void set_word( int i, sc_digit w );
602 void set_cword( int i, sc_digit w );
603
605 { this->m_obj.clean_tail(); }
606
607
608 // other methods
609
610 void scan( ::std::istream& is = ::std::cin );
611
612private:
613
614 // disabled
615 sc_bitref();
616};
617
618
619// l-value concatenation operators and functions
620
621template <class T1, class T2>
622inline
623sc_concref<sc_bitref<T1>,sc_bitref<T2> >
624operator , ( sc_bitref<T1>, sc_bitref<T2> );
625
626template <class T1, class T2>
627inline
628sc_concref<sc_bitref<T1>,sc_subref<T2> >
629operator , ( sc_bitref<T1>, sc_subref<T2> );
630
631template <class T1, class T2, class T3>
632inline
633sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
634operator , ( sc_bitref<T1>, sc_concref<T2,T3> );
635
636template <class T1, class T2>
637inline
638sc_concref<sc_bitref<T1>,T2>
639operator , ( sc_bitref<T1>, sc_proxy<T2>& );
640
641
642template <class T1, class T2>
643inline
644sc_concref<sc_bitref<T1>,sc_bitref<T2> >
645concat( sc_bitref<T1>, sc_bitref<T2> );
646
647template <class T1, class T2>
648inline
649sc_concref<sc_bitref<T1>,sc_subref<T2> >
650concat( sc_bitref<T1>, sc_subref<T2> );
651
652template <class T1, class T2, class T3>
653inline
654sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
655concat( sc_bitref<T1>, sc_concref<T2,T3> );
656
657template <class T1, class T2>
658inline
659sc_concref<sc_bitref<T1>,T2>
660concat( sc_bitref<T1>, sc_proxy<T2>& );
661
662
663template <class T>
664::std::istream&
665operator >> ( ::std::istream&, sc_bitref<T> );
666
667
668// ----------------------------------------------------------------------------
669// CLASS TEMPLATE : sc_subref_r<X>
670//
671// Proxy class for sc_proxy part selection (r-value only).
672// ----------------------------------------------------------------------------
673
674template <class X>
676 : public sc_proxy<sc_subref_r<X> >
677{
678 void check_bounds();
679
680public:
682
683 // constructor
684
685 sc_subref_r( const X& obj_, int hi_, int lo_ )
686 : m_obj( const_cast<X&>( obj_ ) ), m_hi( hi_ ), m_lo( lo_ ), m_len( 0 )
687 { check_bounds(); }
688
689
690 // copy constructor
691
693 : m_obj( a.m_obj ), m_hi( a.m_hi ), m_lo( a.m_lo ), m_len( a.m_len )
694 {}
695
696
697 // cloning
698
700 { return new sc_subref_r<X>( *this ); }
701
702
703 // common methods
704
705 int length() const
706 { return m_len; }
707
708 int size() const
709 { return ( (length() - 1) / SC_DIGIT_SIZE + 1 ); }
710
711 value_type get_bit( int n ) const;
712 void set_bit( int n, value_type value );
713
714 sc_digit get_word( int i )const;
715 void set_word( int i, sc_digit w );
716
717 sc_digit get_cword( int i ) const;
718 void set_cword( int i, sc_digit w );
719
721 { m_obj.clean_tail(); }
722
723
724 // other methods
725
726 bool is_01() const;
727
728 bool reversed() const
729 { return m_lo > m_hi; }
730
731protected:
732
734 int m_hi;
735 int m_lo;
736 int m_len;
737
738private:
739
740 // disabled
741 sc_subref_r();
742 sc_subref_r<X>& operator = ( const sc_subref_r<X>& );
743};
744
745
746// r-value concatenation operators and functions
747
748template <class T1, class T2>
749inline
752
753template <class T1, class T2>
754inline
757
758template <class T1, class T2, class T3>
759inline
762
763template <class T1, class T2>
764inline
767
768template <class T>
769inline
771operator , ( sc_subref_r<T>, const char* );
772
773template <class T>
774inline
776operator , ( const char*, sc_subref_r<T> );
777
778template <class T>
779inline
782
783template <class T>
784inline
787
788template <class T>
789inline
792
793template <class T>
794inline
797
798
799template <class T1, class T2>
800inline
803
804template <class T1, class T2>
805inline
808
809template <class T1, class T2, class T3>
810inline
813
814template <class T1, class T2>
815inline
818
819template <class T>
820inline
822concat( sc_subref_r<T>, const char* );
823
824template <class T>
825inline
827concat( const char*, sc_subref_r<T> );
828
829template <class T>
830inline
833
834template <class T>
835inline
838
839template <class T>
840inline
842concat( sc_subref_r<T>, bool );
843
844template <class T>
845inline
847concat( bool, sc_subref_r<T> );
848
849
850#ifdef SC_DT_MIXED_COMMA_OPERATORS
851
852template <class T1, class T2>
853inline
856
857template <class T1, class T2>
858inline
861
862template <class T1, class T2>
863inline
866
867template <class T1, class T2>
868inline
871
872template <class T1, class T2, class T3>
873inline
876
877template <class T1, class T2, class T3>
878inline
881
882template <class T1, class T2>
883inline
886
887template <class T1, class T2>
888inline
891
892template <class T>
893inline
895operator , ( sc_subref<T>, const char* );
896
897template <class T>
898inline
900operator , ( const char*, sc_subref<T> );
901
902template <class T>
903inline
906
907template <class T>
908inline
911
912template <class T>
913inline
916
917template <class T>
918inline
921
922
923template <class T1, class T2>
924inline
927
928template <class T1, class T2>
929inline
932
933template <class T1, class T2>
934inline
937
938template <class T1, class T2>
939inline
942
943template <class T1, class T2, class T3>
944inline
947
948template <class T1, class T2, class T3>
949inline
952
953template <class T1, class T2>
954inline
957
958template <class T1, class T2>
959inline
962
963template <class T>
964inline
966concat( sc_subref<T>, const char* );
967
968template <class T>
969inline
971concat( const char*, sc_subref<T> );
972
973template <class T>
974inline
976concat( sc_subref<T>, const sc_logic& );
977
978template <class T>
979inline
981concat( const sc_logic&, sc_subref<T> );
982
983template <class T>
984inline
986concat( sc_subref<T>, bool );
987
988template <class T>
989inline
991concat( bool, sc_subref<T> );
992
993#endif
994
995
996// ----------------------------------------------------------------------------
997// CLASS TEMPLATE : sc_subref<X>
998//
999// Proxy class for sc_proxy part selection (r-value and l-value).
1000// ----------------------------------------------------------------------------
1001
1002template <class X>
1004 : public sc_subref_r<X>
1005{
1006public:
1007
1008 // typedefs
1009
1011
1012
1013 // constructor
1014
1015 sc_subref( X& obj_, int hi_, int lo_ )
1016 : sc_subref_r<X>( obj_, hi_, lo_ )
1017 {}
1018
1019
1020 // copy constructor
1021
1023 : sc_subref_r<X>( a )
1024 {}
1025
1026
1027 // cloning
1028
1030 { return new sc_subref<X>( *this ); }
1031
1032
1033 // assignment operators
1034
1035 template <class Y>
1037 { base_type::assign_( a ); return *this; }
1038
1041
1042 sc_subref<X>& operator = ( const char* a )
1043 { base_type::assign_( a ); return *this; }
1044
1045 sc_subref<X>& operator = ( const bool* a )
1046 { base_type::assign_( a ); return *this; }
1047
1049 { base_type::assign_( a ); return *this; }
1050
1052 { base_type::assign_( a ); return *this; }
1053
1055 { base_type::assign_( a ); return *this; }
1056
1058 { base_type::assign_( a ); return *this; }
1059
1061 { base_type::assign_( a ); return *this; }
1062
1063 sc_subref<X>& operator = ( unsigned long a )
1064 { base_type::assign_( a ); return *this; }
1065
1067 { base_type::assign_( a ); return *this; }
1068
1069 sc_subref<X>& operator = ( unsigned int a )
1070 { base_type::assign_( a ); return *this; }
1071
1073 { base_type::assign_( a ); return *this; }
1074
1076 { base_type::assign_( a ); return *this; }
1077
1079 { base_type::assign_( a ); return *this; }
1080
1081
1082 // other methods
1083
1084 void scan( ::std::istream& = ::std::cin );
1085
1086private:
1087
1088 // disabled
1089 sc_subref();
1090};
1091
1092
1093// l-value concatenation operators and functions
1094
1095template <class T1, class T2>
1096inline
1097sc_concref<sc_subref<T1>,sc_bitref<T2> >
1098operator , ( sc_subref<T1>, sc_bitref<T2> );
1099
1100template <class T1, class T2>
1101inline
1102sc_concref<sc_subref<T1>,sc_subref<T2> >
1103operator , ( sc_subref<T1>, sc_subref<T2> );
1104
1105template <class T1, class T2, class T3>
1106inline
1107sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
1108operator , ( sc_subref<T1>, sc_concref<T2,T3> );
1109
1110template <class T1, class T2>
1111inline
1112sc_concref<sc_subref<T1>,T2>
1113operator , ( sc_subref<T1>, sc_proxy<T2>& );
1114
1115
1116template <class T1, class T2>
1117inline
1118sc_concref<sc_subref<T1>,sc_bitref<T2> >
1119concat( sc_subref<T1>, sc_bitref<T2> );
1120
1121template <class T1, class T2>
1122inline
1123sc_concref<sc_subref<T1>,sc_subref<T2> >
1124concat( sc_subref<T1>, sc_subref<T2> );
1125
1126template <class T1, class T2, class T3>
1127inline
1128sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
1129concat( sc_subref<T1>, sc_concref<T2,T3> );
1130
1131template <class T1, class T2>
1132inline
1133sc_concref<sc_subref<T1>,T2>
1134concat( sc_subref<T1>, sc_proxy<T2>& );
1135
1136
1137template <class T>
1138inline
1139::std::istream&
1140operator >> ( ::std::istream&, sc_subref<T> );
1141
1142
1143// ----------------------------------------------------------------------------
1144// CLASS TEMPLATE : sc_concref_r<X,Y>
1145//
1146// Proxy class for sc_proxy concatenation (r-value only).
1147// ----------------------------------------------------------------------------
1148
1149template <class X, class Y>
1151 : public sc_proxy<sc_concref_r<X,Y> >
1152{
1153public:
1155
1156 // constructor
1157
1158 sc_concref_r( const X& left_, const Y& right_, int delete_ = 0 )
1159 : m_left( const_cast<X&>( left_ ) ), m_right( const_cast<Y&>( right_ ) ),
1160 m_delete( delete_ ), m_refs( *new int( 1 ) )
1161 {}
1162
1163
1164 // copy constructor
1165
1167 : m_left( a.m_left ), m_right( a.m_right ),
1168 m_delete( a.m_delete ), m_refs( a.m_refs )
1169 { ++ m_refs; }
1170
1171
1172 // destructor
1173
1174 virtual ~sc_concref_r();
1175
1176
1177 // cloning
1178
1180 { return new sc_concref_r<X,Y>( *this ); }
1181
1182
1183 // common methods
1184
1185 int length() const
1186 { return ( m_left.length() + m_right.length() ); }
1187
1188 int size() const
1189 { return ( (length() - 1) / SC_DIGIT_SIZE + 1 ); }
1190
1191 value_type get_bit( int n ) const;
1192 void set_bit( int n, value_type value );
1193
1194 sc_digit get_word( int i ) const;
1195 void set_word( int i, sc_digit w );
1196
1197 sc_digit get_cword( int i ) const;
1198 void set_cword( int i, sc_digit w );
1199
1201 { m_left.clean_tail(); m_right.clean_tail(); }
1202
1203
1204 // other methods
1205
1206 bool is_01() const
1207 { return ( m_left.is_01() && m_right.is_01() ); }
1208
1209protected:
1210
1213 mutable int m_delete;
1215
1216private:
1217
1218 // disabled
1219 sc_concref_r();
1220 sc_concref_r<X,Y>& operator = ( const sc_concref_r<X,Y>& );
1221};
1222
1223
1224// r-value concatenation operators and functions
1225
1226template <class T1, class T2, class T3>
1227inline
1230
1231template <class T1, class T2, class T3>
1232inline
1235
1236template <class T1, class T2, class T3, class T4>
1237inline
1240
1241template <class T1, class T2, class T3>
1242inline
1245
1246template <class T1, class T2>
1247inline
1249operator , ( sc_concref_r<T1,T2>, const char* );
1250
1251template <class T1, class T2>
1252inline
1254operator , ( const char*, sc_concref_r<T1,T2> );
1255
1256template <class T1, class T2>
1257inline
1260
1261template <class T1, class T2>
1262inline
1265
1266template <class T1, class T2>
1267inline
1270
1271template <class T1, class T2>
1272inline
1275
1276
1277template <class T1, class T2, class T3>
1278inline
1281
1282template <class T1, class T2, class T3>
1283inline
1286
1287template <class T1, class T2, class T3, class T4>
1288inline
1291
1292template <class T1, class T2, class T3>
1293inline
1296
1297template <class T1, class T2>
1298inline
1300concat( sc_concref_r<T1,T2>, const char* );
1301
1302template <class T1, class T2>
1303inline
1305concat( const char*, sc_concref_r<T1,T2> );
1306
1307template <class T1, class T2>
1308inline
1311
1312template <class T1, class T2>
1313inline
1316
1317template <class T1, class T2>
1318inline
1321
1322template <class T1, class T2>
1323inline
1326
1327
1328#ifdef SC_DT_MIXED_COMMA_OPERATORS
1329
1330template <class T1, class T2, class T3>
1331inline
1334
1335template <class T1, class T2, class T3>
1336inline
1339
1340template <class T1, class T2, class T3>
1341inline
1344
1345template <class T1, class T2, class T3>
1346inline
1349
1350template <class T1, class T2, class T3, class T4>
1351inline
1354
1355template <class T1, class T2, class T3, class T4>
1356inline
1359
1360template <class T1, class T2, class T3>
1361inline
1364
1365template <class T1, class T2, class T3>
1366inline
1369
1370template <class T1, class T2>
1371inline
1373operator , ( sc_concref<T1,T2>, const char* );
1374
1375template <class T1, class T2>
1376inline
1378operator , ( const char*, sc_concref<T1,T2> );
1379
1380template <class T1, class T2>
1381inline
1384
1385template <class T1, class T2>
1386inline
1389
1390template <class T1, class T2>
1391inline
1394
1395template <class T1, class T2>
1396inline
1399
1400
1401template <class T1, class T2, class T3>
1402inline
1405
1406template <class T1, class T2, class T3>
1407inline
1410
1411template <class T1, class T2, class T3>
1412inline
1415
1416template <class T1, class T2, class T3>
1417inline
1420
1421template <class T1, class T2, class T3, class T4>
1422inline
1425
1426template <class T1, class T2, class T3, class T4>
1427inline
1430
1431template <class T1, class T2, class T3>
1432inline
1435
1436template <class T1, class T2, class T3>
1437inline
1440
1441template <class T1, class T2>
1442inline
1444concat( sc_concref<T1,T2>, const char* );
1445
1446template <class T1, class T2>
1447inline
1449concat( const char*, sc_concref<T1,T2> );
1450
1451template <class T1, class T2>
1452inline
1455
1456template <class T1, class T2>
1457inline
1460
1461template <class T1, class T2>
1462inline
1464concat( sc_concref<T1,T2>, bool );
1465
1466template <class T1, class T2>
1467inline
1469concat( bool, sc_concref<T1,T2> );
1470
1471#endif
1472
1473
1474// ----------------------------------------------------------------------------
1475// CLASS TEMPLATE : sc_concref<X,Y>
1476//
1477// Proxy class for sc_proxy concatenation (r-value and l-value).
1478// ----------------------------------------------------------------------------
1479
1480template <class X, class Y>
1482 : public sc_concref_r<X,Y>
1483{
1484public:
1485
1486 // typedefs
1487
1489
1490
1491 // constructor
1492
1493 sc_concref( X& left_, Y& right_, int delete_ = 0 )
1494 : sc_concref_r<X,Y>( left_, right_, delete_ )
1495 {}
1496
1497
1498 // copy constructor
1499
1501 : sc_concref_r<X,Y>( a )
1502 {}
1503
1504
1505 // cloning
1506
1508 { return new sc_concref<X,Y>( *this ); }
1509
1510
1511 // assignment operators
1512
1513 template <class Z>
1515 { base_type::assign_( a ); return *this; }
1516
1518 { base_type::assign_( a ); return *this; }
1519
1521 { base_type::assign_( a ); return *this; }
1522
1524 { base_type::assign_( a ); return *this; }
1525
1527 { base_type::assign_( a ); return *this; }
1528
1530 { base_type::assign_( a ); return *this; }
1531
1533 { base_type::assign_( a ); return *this; }
1534
1536 { base_type::assign_( a ); return *this; }
1537
1539 { base_type::assign_( a ); return *this; }
1540
1541 sc_concref<X,Y>& operator = ( unsigned long a )
1542 { base_type::assign_( a ); return *this; }
1543
1545 { base_type::assign_( a ); return *this; }
1546
1547 sc_concref<X,Y>& operator = ( unsigned int a )
1548 { base_type::assign_( a ); return *this; }
1549
1551 { base_type::assign_( a ); return *this; }
1552
1554 { base_type::assign_( a ); return *this; }
1555
1557 { base_type::assign_( a ); return *this; }
1558
1559
1560 // other methods
1561
1562 void scan( ::std::istream& = ::std::cin );
1563
1564private:
1565
1566 // disabled
1567 sc_concref();
1568};
1569
1570
1571// l-value concatenation operators and functions
1572
1573template <class T1, class T2, class T3>
1574inline
1575sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
1576operator , ( sc_concref<T1,T2>, sc_bitref<T3> );
1577
1578template <class T1, class T2, class T3>
1579inline
1580sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
1581operator , ( sc_concref<T1,T2>, sc_subref<T3> );
1582
1583template <class T1, class T2, class T3, class T4>
1584inline
1585sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
1586operator , ( sc_concref<T1,T2>, sc_concref<T3,T4> );
1587
1588template <class T1, class T2, class T3>
1589inline
1590sc_concref<sc_concref<T1,T2>,T3>
1591operator , ( sc_concref<T1,T2>, sc_proxy<T3>& );
1592
1593
1594template <class T1, class T2, class T3>
1595inline
1596sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
1597concat( sc_concref<T1,T2>, sc_bitref<T3> );
1598
1599template <class T1, class T2, class T3>
1600inline
1601sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
1602concat( sc_concref<T1,T2>, sc_subref<T3> );
1603
1604template <class T1, class T2, class T3, class T4>
1605inline
1606sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
1607concat( sc_concref<T1,T2>, sc_concref<T3,T4> );
1608
1609template <class T1, class T2, class T3>
1610inline
1611sc_concref<sc_concref<T1,T2>,T3>
1612concat( sc_concref<T1,T2>, sc_proxy<T3>& );
1613
1614
1615template <class T1, class T2>
1616inline
1617::std::istream&
1619
1620
1621// ----------------------------------------------------------------------------
1622// CLASS TEMPLATE : sc_proxy<T>
1623//
1624// Base class template for bit/logic vector classes.
1625// (Barton/Nackmann implementation)
1626// ----------------------------------------------------------------------------
1627
1628// r-value concatenation operators and functions
1629
1630template <class T1, class T2>
1631inline
1634
1635template <class T1, class T2>
1636inline
1639
1640template <class T1, class T2, class T3>
1641inline
1644
1645template <class T1, class T2>
1646inline
1648operator , ( const sc_proxy<T1>&, const sc_proxy<T2>& );
1649
1650template <class T>
1651inline
1653operator , ( const sc_proxy<T>&, const char* );
1654
1655template <class T>
1656inline
1658operator , ( const char*, const sc_proxy<T>& );
1659
1660template <class T>
1661inline
1663operator , ( const sc_proxy<T>&, const sc_logic& );
1664
1665template <class T>
1666inline
1668operator , ( const sc_logic&, const sc_proxy<T>& );
1669
1670template <class T>
1671inline
1673operator , ( const sc_proxy<T>&, bool );
1674
1675template <class T>
1676inline
1678operator , ( bool, const sc_proxy<T>& );
1679
1680
1681template <class T1, class T2>
1682inline
1685
1686template <class T1, class T2>
1687inline
1690
1691template <class T1, class T2, class T3>
1692inline
1695
1696template <class T1, class T2>
1697inline
1699concat( const sc_proxy<T1>&, const sc_proxy<T2>& );
1700
1701template <class T>
1702inline
1704concat( const sc_proxy<T>&, const char* );
1705
1706template <class T>
1707inline
1709concat( const char*, const sc_proxy<T>& );
1710
1711template <class T>
1712inline
1714concat( const sc_proxy<T>&, const sc_logic& );
1715
1716template <class T>
1717inline
1719concat( const sc_logic&, const sc_proxy<T>& );
1720
1721template <class T>
1722inline
1724concat( const sc_proxy<T>&, bool );
1725
1726template <class T>
1727inline
1729concat( bool, const sc_proxy<T>& );
1730
1731
1732#ifdef SC_DT_MIXED_COMMA_OPERATORS
1733
1734template <class T1, class T2>
1735inline
1738
1739template <class T1, class T2>
1740inline
1743
1744template <class T1, class T2>
1745inline
1748
1749template <class T1, class T2>
1750inline
1753
1754template <class T1, class T2, class T3>
1755inline
1758
1759template <class T1, class T2, class T3>
1760inline
1763
1764template <class T1, class T2>
1765inline
1768
1769template <class T1, class T2>
1770inline
1773
1774template <class T>
1775inline
1777operator , ( sc_proxy<T>&, const char* );
1778
1779template <class T>
1780inline
1782operator , ( const char*, sc_proxy<T>& );
1783
1784template <class T>
1785inline
1787operator , ( sc_proxy<T>&, const sc_logic& );
1788
1789template <class T>
1790inline
1792operator , ( const sc_logic&, sc_proxy<T>& );
1793
1794template <class T>
1795inline
1797operator , ( sc_proxy<T>&, bool );
1798
1799template <class T>
1800inline
1802operator , ( bool, sc_proxy<T>& );
1803
1804
1805template <class T1, class T2>
1806inline
1809
1810template <class T1, class T2>
1811inline
1814
1815template <class T1, class T2>
1816inline
1819
1820template <class T1, class T2>
1821inline
1824
1825template <class T1, class T2, class T3>
1826inline
1829
1830template <class T1, class T2, class T3>
1831inline
1834
1835template <class T1, class T2>
1836inline
1838concat( const sc_proxy<T1>&, sc_proxy<T2>& );
1839
1840template <class T1, class T2>
1841inline
1843concat( sc_proxy<T1>&, const sc_proxy<T2>& );
1844
1845template <class T>
1846inline
1848concat( sc_proxy<T>&, const char* );
1849
1850template <class T>
1851inline
1853concat( const char*, sc_proxy<T>& );
1854
1855template <class T>
1856inline
1858concat( sc_proxy<T>&, const sc_logic& );
1859
1860template <class T>
1861inline
1863concat( const sc_logic&, sc_proxy<T>& );
1864
1865template <class T>
1866inline
1868concat( sc_proxy<T>&, bool );
1869
1870template <class T>
1871inline
1873concat( bool, sc_proxy<T>& );
1874
1875#endif
1876
1877
1878// l-value concatenation operators and functions
1879
1880template <class T1, class T2>
1881inline
1884
1885template <class T1, class T2>
1886inline
1889
1890template <class T1, class T2, class T3>
1891inline
1894
1895template <class T1, class T2>
1896inline
1899
1900
1901template <class T1, class T2>
1902inline
1905
1906template <class T1, class T2>
1907inline
1910
1911template <class T1, class T2, class T3>
1912inline
1915
1916template <class T1, class T2>
1917inline
1920
1921
1922// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
1923
1924// ----------------------------------------------------------------------------
1925// CLASS TEMPLATE : sc_bitref_r<T>
1926//
1927// Proxy class for sc_proxy bit selection (r-value only).
1928// ----------------------------------------------------------------------------
1929
1930// bitwise operators and functions
1931
1932// bitwise and
1933
1934template <class T1, class T2>
1935inline
1938{
1939 return sc_logic( sc_logic::and_table[a.value()][b.value()] );
1940}
1941
1942
1943// bitwise or
1944
1945template <class T1, class T2>
1946inline
1949{
1950 return sc_logic( sc_logic::or_table[a.value()][b.value()] );
1951}
1952
1953
1954// bitwise xor
1955
1956template <class T1, class T2>
1957inline
1960{
1961 return sc_logic( sc_logic::xor_table[a.value()][b.value()] );
1962}
1963
1964
1965// relational operators and functions
1966
1967template <class T1, class T2>
1968inline
1969bool
1971{
1972 return ( (int) a.value() == b.value() );
1973}
1974
1975template <class T1, class T2>
1976inline
1977bool
1979{
1980 return ( (int) a.value() != b.value() );
1981}
1982
1983
1984// common methods
1985
1986template <class T>
1987inline
1990{
1991 if( n == 0 ) {
1992 return m_obj.get_bit( m_index );
1993 } else {
1995 return Log_0;
1996 }
1997}
1998
1999
2000template <class T>
2001inline
2004{
2005 if( n == 0 ) {
2006 return ( get_bit( n ) & SC_DIGIT_ONE );
2007 } else {
2009 return 0;
2010 }
2011}
2012
2013template <class T>
2014inline
2017{
2018 if( n == 0 ) {
2019 return ( (get_bit( n ) & SC_DIGIT_TWO) >> 1 );
2020 } else {
2022 return 0;
2023 }
2024}
2025
2026
2027// r-value concatenation operators and functions
2028
2029template <class T1, class T2>
2030inline
2033{
2035 *a.clone(), *b.clone(), 3 );
2036}
2037
2038template <class T1, class T2>
2039inline
2040sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
2042{
2044 *a.clone(), *b.clone(), 3 );
2045}
2046
2047template <class T1, class T2, class T3>
2048inline
2049sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
2051{
2053 *a.clone(), *b.clone(), 3 );
2054}
2055
2056template <class T1, class T2>
2057inline
2058sc_concref_r<sc_bitref_r<T1>,T2>
2060{
2062 *a.clone(), b.back_cast(), 1 );
2063}
2064
2065
2066template <class T1, class T2>
2067inline
2068sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
2070{
2072 *a.clone(), *b.clone(), 3 );
2073}
2074
2075template <class T1, class T2>
2076inline
2077sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
2079{
2081 *a.clone(), *b.clone(), 3 );
2082}
2083
2084template <class T1, class T2, class T3>
2085inline
2086sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
2088{
2090 *a.clone(), *b.clone(), 3 );
2091}
2092
2093template <class T1, class T2>
2094inline
2095sc_concref_r<sc_bitref_r<T1>,T2>
2097{
2099 *a.clone(), b.back_cast(), 1 );
2100}
2101
2102
2103#ifdef SC_DT_MIXED_COMMA_OPERATORS
2104
2105template <class T1, class T2>
2106inline
2107sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
2109{
2111 *a.clone(), *b.clone(), 3 );
2112}
2113
2114template <class T1, class T2>
2115inline
2116sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
2118{
2120 *a.clone(), *b.clone(), 3 );
2121}
2122
2123template <class T1, class T2>
2124inline
2125sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
2127{
2129 *a.clone(), *b.clone(), 3 );
2130}
2131
2132template <class T1, class T2>
2133inline
2134sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
2136{
2138 *a.clone(), *b.clone(), 3 );
2139}
2140
2141template <class T1, class T2, class T3>
2142inline
2143sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
2145{
2147 *a.clone(), *b.clone(), 3 );
2148}
2149
2150template <class T1, class T2, class T3>
2151inline
2152sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
2154{
2156 *a.clone(), *b.clone(), 3 );
2157}
2158
2159template <class T1, class T2>
2160inline
2161sc_concref_r<sc_bitref_r<T1>,T2>
2163{
2165 *a.clone(), b.back_cast(), 1 );
2166}
2167
2168template <class T1, class T2>
2169inline
2170sc_concref_r<sc_bitref_r<T1>,T2>
2172{
2174 *a.clone(), b.back_cast(), 1 );
2175}
2176
2177
2178template <class T1, class T2>
2179inline
2180sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
2182{
2184 *a.clone(), *b.clone(), 3 );
2185}
2186
2187template <class T1, class T2>
2188inline
2189sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
2191{
2193 *a.clone(), *b.clone(), 3 );
2194}
2195
2196template <class T1, class T2>
2197inline
2198sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
2200{
2202 *a.clone(), *b.clone(), 3 );
2203}
2204
2205template <class T1, class T2>
2206inline
2207sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
2209{
2211 *a.clone(), *b.clone(), 3 );
2212}
2213
2214template <class T1, class T2, class T3>
2215inline
2216sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
2218{
2220 *a.clone(), *b.clone(), 3 );
2221}
2222
2223template <class T1, class T2, class T3>
2224inline
2225sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
2227{
2229 *a.clone(), *b.clone(), 3 );
2230}
2231
2232template <class T1, class T2>
2233inline
2234sc_concref_r<sc_bitref_r<T1>,T2>
2236{
2238 *a.clone(), b.back_cast(), 1 );
2239}
2240
2241template <class T1, class T2>
2242inline
2243sc_concref_r<sc_bitref_r<T1>,T2>
2245{
2247 *a.clone(), b.back_cast(), 1 );
2248}
2249
2250#endif
2251
2252
2253// ----------------------------------------------------------------------------
2254// CLASS TEMPLATE : sc_bitref<X>
2255//
2256// Proxy class for sc_proxy bit selection (r-value and l-value).
2257// ----------------------------------------------------------------------------
2258
2259// assignment operators
2260
2261template <class X>
2262inline
2263sc_bitref<X>&
2265{
2266 this->m_obj.set_bit( this->m_index, a.value() );
2267 return *this;
2268}
2269
2270template <class X>
2271inline
2274{
2275 if( &a != this ) {
2276 this->m_obj.set_bit( this->m_index, a.value() );
2277 }
2278 return *this;
2279}
2280
2281
2282// bitwise assignment operators
2283
2284template <class X>
2285inline
2288{
2289 if( &a != this ) {
2290 this->m_obj.set_bit( this->m_index,
2291 sc_logic::and_table[this->value()][a.value()] );
2292 }
2293 return *this;
2294}
2295
2296template <class X>
2297inline
2300{
2301 this->m_obj.set_bit( this->m_index,
2302 sc_logic::and_table[this->value()][a.value()] );
2303 return *this;
2304}
2305
2306
2307template <class X>
2308inline
2311{
2312 if( &a != this ) {
2313 this->m_obj.set_bit( this->m_index,
2314 sc_logic::or_table[this->value()][a.value()] );
2315 }
2316 return *this;
2317}
2318
2319template <class X>
2320inline
2323{
2324 this->m_obj.set_bit( this->m_index,
2325 sc_logic::or_table[this->value()][a.value()] );
2326 return *this;
2327}
2328
2329
2330template <class X>
2331inline
2334{
2335 if( &a != this ) {
2336 this->m_obj.set_bit( this->m_index,
2337 sc_logic::xor_table[this->value()][a.value()] );
2338 }
2339 return *this;
2340}
2341
2342template <class X>
2343inline
2346{
2347 this->m_obj.set_bit( this->m_index,
2348 sc_logic::xor_table[this->value()][a.value()] );
2349 return *this;
2350}
2351
2352
2353// bitwise operators and functions
2354
2355// bitwise complement
2356
2357template <class X>
2358inline
2361{
2362 this->m_obj.set_bit( this->m_index,
2363 sc_logic::not_table[this->value()] );
2364 return *this;
2365}
2366
2367
2368// common methods
2369
2370template <class X>
2371inline
2372void
2374{
2375 if( n == 0 ) {
2376 this->m_obj.set_bit( this->m_index, value );
2377 } else {
2379 }
2380}
2381
2382template <class X>
2383inline
2384void
2386{
2387 unsigned int bi = this->m_index % (8*sizeof(sc_digit));
2388 sc_digit temp;
2389 unsigned int wi = this->m_index / (8*sizeof(sc_digit));
2390 if( n == 0 ) {
2391 temp = this->m_obj.get_word(wi);
2392 temp = (temp & ~(1 << bi)) | ((w&1) << bi);
2393 this->m_obj.set_word(wi, temp);
2394 } else {
2396 }
2397
2398}
2399
2400template <class X>
2401inline
2402void
2404{
2405 unsigned int bi = this->m_index % (8*sizeof(sc_digit));
2406 sc_digit temp;
2407 unsigned int wi = this->m_index / (8*sizeof(sc_digit));
2408 if( n == 0 ) {
2409 temp = this->m_obj.get_cword(wi);
2410 temp = (temp & ~(1 << bi)) | ((w&1) << bi);
2411 this->m_obj.set_cword(wi, temp);
2412 } else {
2414 }
2415}
2416
2417// other methods
2418
2419template <class X>
2420inline
2421void
2422sc_bitref<X>::scan( ::std::istream& is )
2423{
2424 char c;
2425 is >> c;
2426 *this = c;
2427}
2428
2429
2430// l-value concatenation operators and functions
2431
2432template <class T1, class T2>
2433inline
2436{
2438 *a.clone(), *b.clone(), 3 );
2439}
2440
2441template <class T1, class T2>
2442inline
2443sc_concref<sc_bitref<T1>,sc_subref<T2> >
2445{
2447 *a.clone(), *b.clone(), 3 );
2448}
2449
2450template <class T1, class T2, class T3>
2451inline
2452sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
2454{
2456 *a.clone(), *b.clone(), 3 );
2457}
2458
2459template <class T1, class T2>
2460inline
2461sc_concref<sc_bitref<T1>,T2>
2463{
2464 return sc_concref<sc_bitref<T1>,T2>(
2465 *a.clone(), b.back_cast(), 1 );
2466}
2467
2468
2469template <class T1, class T2>
2470inline
2471sc_concref<sc_bitref<T1>,sc_bitref<T2> >
2473{
2475 *a.clone(), *b.clone(), 3 );
2476}
2477
2478template <class T1, class T2>
2479inline
2480sc_concref<sc_bitref<T1>,sc_subref<T2> >
2482{
2484 *a.clone(), *b.clone(), 3 );
2485}
2486
2487template <class T1, class T2, class T3>
2488inline
2489sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
2491{
2493 *a.clone(), *b.clone(), 3 );
2494}
2495
2496template <class T1, class T2>
2497inline
2498sc_concref<sc_bitref<T1>,T2>
2500{
2501 return sc_concref<sc_bitref<T1>,T2>(
2502 *a.clone(), b.back_cast(), 1 );
2503}
2504
2505
2506template <class X>
2507inline
2508::std::istream&
2509operator >> ( ::std::istream& is, sc_bitref<X> a )
2510{
2511 a.scan( is );
2512 return is;
2513}
2514
2515
2516// ----------------------------------------------------------------------------
2517// CLASS TEMPLATE : sc_subref_r<X>
2518//
2519// Proxy class for sc_proxy part selection (r-value only).
2520// ----------------------------------------------------------------------------
2521
2522template <class X>
2523inline
2524void
2525sc_subref_r<X>::check_bounds()
2526{
2527 int len = m_obj.length();
2528 if( m_hi < 0 || m_hi >= len || m_lo < 0 || m_lo >= len ) {
2530 sc_core::sc_abort(); // can't recover from here
2531 }
2532 if( reversed() ) {
2533 m_len = m_lo - m_hi + 1;
2534 } else {
2535 m_len = m_hi - m_lo + 1;
2536 }
2537}
2538
2539
2540// common methods
2541
2542template <class X>
2543inline
2546{
2547 if( reversed() ) {
2548 return m_obj.get_bit( m_lo - n );
2549 } else {
2550 return m_obj.get_bit( m_lo + n );
2551 }
2552}
2553
2554template <class X>
2555inline
2556void
2558{
2559 if( reversed() ) {
2560 m_obj.set_bit( m_lo - n, value );
2561 } else {
2562 m_obj.set_bit( m_lo + n, value );
2563 }
2564}
2565
2566
2567template <class X>
2568inline
2571{
2572 int n1 = 0;
2573 int n2 = 0;
2574 sc_digit result = 0;
2575 int k = 0;
2576 if( reversed() ) {
2577 n1 = m_lo - i * SC_DIGIT_SIZE;
2578 n2 = sc_max( n1 - SC_DIGIT_SIZE, m_hi - 1 );
2579 for( int n = n1; n > n2; n -- ) {
2580 result |= (m_obj[n].value() & SC_DIGIT_ONE) << k ++;
2581 }
2582 } else {
2583 n1 = m_lo + i * SC_DIGIT_SIZE;
2584 n2 = sc_min( n1 + SC_DIGIT_SIZE, m_hi + 1 );
2585 for( int n = n1; n < n2; n ++ ) {
2586 result |= (m_obj[n].value() & SC_DIGIT_ONE) << k ++;
2587 }
2588 }
2589 return result;
2590}
2591
2592template <class X>
2593inline
2594void
2596{
2597 int n1 = 0;
2598 int n2 = 0;
2599 int k = 0;
2600 if( reversed() ) {
2601 n1 = m_lo - i * SC_DIGIT_SIZE;
2602 n2 = sc_max( n1 - SC_DIGIT_SIZE, m_hi - 1 );
2603 for( int n = n1; n > n2; n -- ) {
2604 m_obj.set_bit( n, value_type(
2605 ( (w >> k ++) & SC_DIGIT_ONE ) |
2606 ( m_obj[n].value() & SC_DIGIT_TWO ) ) );
2607 }
2608 } else {
2609 n1 = m_lo + i * SC_DIGIT_SIZE;
2610 n2 = sc_min( n1 + SC_DIGIT_SIZE, m_hi + 1 );
2611 for( int n = n1; n < n2; n ++ ) {
2612 m_obj.set_bit( n, value_type(
2613 ( (w >> k ++) & SC_DIGIT_ONE ) |
2614 ( m_obj[n].value() & SC_DIGIT_TWO ) ) );
2615 }
2616 }
2617}
2618
2619
2620template <class X>
2621inline
2624{
2625 int n1 = 0;
2626 int n2 = 0;
2627 sc_digit result = 0;
2628 int k = 0;
2629 if( reversed() ) {
2630 n1 = m_lo - i * SC_DIGIT_SIZE;
2631 n2 = sc_max( n1 - SC_DIGIT_SIZE, m_hi - 1 );
2632 for( int n = n1; n > n2; n -- ) {
2633 result |= ((m_obj[n].value() & SC_DIGIT_TWO) >> 1) << k ++;
2634 }
2635 } else {
2636 n1 = m_lo + i * SC_DIGIT_SIZE;
2637 n2 = sc_min( n1 + SC_DIGIT_SIZE, m_hi + 1 );
2638 for( int n = n1; n < n2; n ++ ) {
2639 result |= ((m_obj[n].value() & SC_DIGIT_TWO) >> 1) << k ++;
2640 }
2641 }
2642 return result;
2643}
2644
2645template <class X>
2646inline
2647void
2649{
2650 int n1 = 0;
2651 int n2 = 0;
2652 int k = 0;
2653 if( reversed() ) {
2654 n1 = m_lo - i * SC_DIGIT_SIZE;
2655 n2 = sc_max( n1 - SC_DIGIT_SIZE, m_hi - 1 );
2656 for( int n = n1; n > n2; n -- ) {
2657 m_obj.set_bit( n, value_type(
2658 ( ((w >> k ++) & SC_DIGIT_ONE) << 1 ) |
2659 ( m_obj[n].value() & SC_DIGIT_ONE ) ) );
2660 }
2661 } else {
2662 n1 = m_lo + i * SC_DIGIT_SIZE;
2663 n2 = sc_min( n1 + SC_DIGIT_SIZE, m_hi + 1 );
2664 for( int n = n1; n < n2; n ++ ) {
2665 m_obj.set_bit( n, value_type(
2666 ( ((w >> k ++) & SC_DIGIT_ONE) << 1 ) |
2667 ( m_obj[n].value() & SC_DIGIT_ONE ) ) );
2668 }
2669 }
2670}
2671
2672
2673// other methods
2674
2675template <class X>
2676inline
2677bool
2679{
2680 int sz = size();
2681 for( int i = 0; i < sz; ++ i ) {
2682 if( get_cword( i ) != SC_DIGIT_ZERO ) {
2683 return false;
2684 }
2685 }
2686 return true;
2687}
2688
2689
2690// r-value concatenation operators and functions
2691
2692template <class T1, class T2>
2693inline
2696{
2698 *a.clone(), *b.clone(), 3 );
2699}
2700
2701template <class T1, class T2>
2702inline
2703sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
2705{
2707 *a.clone(), *b.clone(), 3 );
2708}
2709
2710template <class T1, class T2, class T3>
2711inline
2712sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
2714{
2716 *a.clone(), *b.clone(), 3 );
2717}
2718
2719template <class T1, class T2>
2720inline
2721sc_concref_r<sc_subref_r<T1>,T2>
2723{
2725 *a.clone(), b.back_cast(), 1 );
2726}
2727
2728
2729template <class T1, class T2>
2730inline
2731sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
2733{
2735 *a.clone(), *b.clone(), 3 );
2736}
2737
2738template <class T1, class T2>
2739inline
2740sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
2742{
2744 *a.clone(), *b.clone(), 3 );
2745}
2746
2747template <class T1, class T2, class T3>
2748inline
2749sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
2751{
2753 *a.clone(), *b.clone(), 3 );
2754}
2755
2756template <class T1, class T2>
2757inline
2758sc_concref_r<sc_subref_r<T1>,T2>
2760{
2762 *a.clone(), b.back_cast(), 1 );
2763}
2764
2765
2766#ifdef SC_DT_MIXED_COMMA_OPERATORS
2767
2768template <class T1, class T2>
2769inline
2770sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
2772{
2774 *a.clone(), *b.clone(), 3 );
2775}
2776
2777template <class T1, class T2>
2778inline
2779sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
2781{
2783 *a.clone(), *b.clone(), 3 );
2784}
2785
2786template <class T1, class T2>
2787inline
2788sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
2790{
2792 *a.clone(), *b.clone(), 3 );
2793}
2794
2795template <class T1, class T2>
2796inline
2797sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
2799{
2801 *a.clone(), *b.clone(), 3 );
2802}
2803
2804template <class T1, class T2, class T3>
2805inline
2806sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
2808{
2810 *a.clone(), *b.clone(), 3 );
2811}
2812
2813template <class T1, class T2, class T3>
2814inline
2815sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
2817{
2819 *a.clone(), *b.clone(), 3 );
2820}
2821
2822template <class T1, class T2>
2823inline
2824sc_concref_r<sc_subref_r<T1>,T2>
2826{
2828 *a.clone(), b.back_cast(), 1 );
2829}
2830
2831template <class T1, class T2>
2832inline
2833sc_concref_r<sc_subref_r<T1>,T2>
2835{
2837 *a.clone(), b.back_cast(), 1 );
2838}
2839
2840
2841template <class T1, class T2>
2842inline
2843sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
2845{
2847 *a.clone(), *b.clone(), 3 );
2848}
2849
2850template <class T1, class T2>
2851inline
2852sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
2854{
2856 *a.clone(), *b.clone(), 3 );
2857}
2858
2859template <class T1, class T2>
2860inline
2861sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
2863{
2865 *a.clone(), *b.clone(), 3 );
2866}
2867
2868template <class T1, class T2>
2869inline
2870sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
2872{
2874 *a.clone(), *b.clone(), 3 );
2875}
2876
2877template <class T1, class T2, class T3>
2878inline
2879sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
2881{
2883 *a.clone(), *b.clone(), 3 );
2884}
2885
2886template <class T1, class T2, class T3>
2887inline
2888sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
2890{
2892 *a.clone(), *b.clone(), 3 );
2893}
2894
2895template <class T1, class T2>
2896inline
2897sc_concref_r<sc_subref_r<T1>,T2>
2899{
2901 *a.clone(), b.back_cast(), 1 );
2902}
2903
2904template <class T1, class T2>
2905inline
2906sc_concref_r<sc_subref_r<T1>,T2>
2908{
2910 *a.clone(), b.back_cast(), 1 );
2911}
2912
2913#endif
2914
2915
2916// ----------------------------------------------------------------------------
2917// CLASS TEMPLATE : sc_subref<X>
2918//
2919// Proxy class for sc_proxy part selection (r-value and l-value).
2920// ----------------------------------------------------------------------------
2921
2922// assignment operators
2923
2924// sc_subref<X>::operator = ( const sc_subref_r<X>& ) in sc_lv_base.h
2925// sc_subref<X>::operator = ( const sc_subref<X>& ) in sc_lv_base.h
2926
2927
2928// other methods
2929
2930template <class T>
2931inline
2932void
2933sc_subref<T>::scan( ::std::istream& is )
2934{
2935 std::string s;
2936 is >> s;
2937 *this = s.c_str();
2938}
2939
2940
2941// l-value concatenation operators and functions
2942
2943template <class T1, class T2>
2944inline
2947{
2949 *a.clone(), *b.clone(), 3 );
2950}
2951
2952template <class T1, class T2>
2953inline
2954sc_concref<sc_subref<T1>,sc_subref<T2> >
2956{
2958 *a.clone(), *b.clone(), 3 );
2959}
2960
2961template <class T1, class T2, class T3>
2962inline
2963sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
2965{
2967 *a.clone(), *b.clone(), 3 );
2968}
2969
2970template <class T1, class T2>
2971inline
2972sc_concref<sc_subref<T1>,T2>
2974{
2975 return sc_concref<sc_subref<T1>,T2>(
2976 *a.clone(), b.back_cast(), 1 );
2977}
2978
2979
2980template <class T1, class T2>
2981inline
2982sc_concref<sc_subref<T1>,sc_bitref<T2> >
2984{
2986 *a.clone(), *b.clone(), 3 );
2987}
2988
2989template <class T1, class T2>
2990inline
2991sc_concref<sc_subref<T1>,sc_subref<T2> >
2993{
2995 *a.clone(), *b.clone(), 3 );
2996}
2997
2998template <class T1, class T2, class T3>
2999inline
3000sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
3002{
3004 *a.clone(), *b.clone(), 3 );
3005}
3006
3007template <class T1, class T2>
3008inline
3009sc_concref<sc_subref<T1>,T2>
3011{
3012 return sc_concref<sc_subref<T1>,T2>(
3013 *a.clone(), b.back_cast(), 1 );
3014}
3015
3016
3017template <class X>
3018inline
3019::std::istream&
3020operator >> ( ::std::istream& is, sc_subref<X> a )
3021{
3022 a.scan( is );
3023 return is;
3024}
3025
3026
3027// ----------------------------------------------------------------------------
3028// CLASS TEMPLATE : sc_concref_r<X,Y>
3029//
3030// Proxy class for sc_proxy concatenation (r-value only).
3031// ----------------------------------------------------------------------------
3032
3033// destructor
3034
3035template <class X, class Y>
3036inline
3038{
3039 if( -- m_refs == 0 ) {
3040 delete &m_refs;
3041 if( m_delete == 0 ) {
3042 return;
3043 }
3044 if( m_delete & 1 ) {
3045 delete &m_left;
3046 }
3047 if( m_delete & 2 ) {
3048 delete &m_right;
3049 }
3050 }
3051}
3052
3053
3054// common methods
3055
3056template <class X, class Y>
3057inline
3060{
3061 int r_len = m_right.length();
3062 if( n < r_len ) {
3063 return value_type(m_right.get_bit( n ));
3064 } else if( n < r_len + m_left.length() ) {
3065 return value_type(m_left.get_bit( n - r_len ));
3066 } else {
3068 return Log_0;
3069 }
3070}
3071
3072template <class X, class Y>
3073inline
3074void
3076{
3077 int r_len = m_right.length();
3078 if( n < r_len ) {
3079 m_right.set_bit( n, typename Y::value_type(v) );
3080 } else if( n < r_len + m_left.length() ) {
3081 m_left.set_bit( n - r_len, typename X::value_type(v) );
3082 } else {
3084 }
3085}
3086
3087
3088template <class X, class Y>
3089inline
3092{
3093 if( i < 0 || i >= size() ) {
3095 }
3096 // 0 <= i < size()
3097 Y& r = m_right;
3098 int r_len = r.length();
3099 int border = r_len / SC_DIGIT_SIZE;
3100 if( i < border ) {
3101 return r.get_word( i );
3102 }
3103 // border <= i < size()
3104 X& l = m_left;
3105 int shift = r_len % SC_DIGIT_SIZE;
3106 int j = i - border;
3107 if( shift == 0 ) {
3108 return l.get_word( j );
3109 }
3110 // border <= i < size() && shift != 0
3111 int nshift = SC_DIGIT_SIZE - shift;
3112 if( i == border ) {
3113 sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift;
3114 return ( (r.get_word( i ) & rl_mask) | (l.get_word( 0 ) << shift) );
3115 }
3116 // border < i < size() && shift != 0
3117 if ( j < l.size() )
3118 return ( (l.get_word( j - 1 ) >> nshift) | (l.get_word( j ) << shift) );
3119 else
3120 return (l.get_word( j - 1 ) >> nshift);
3121}
3122
3123template <class X, class Y>
3124inline
3125void
3127{
3128 if( i < 0 || i >= size() ) {
3130 }
3131 // 0 <= i < size()
3132 Y& r = m_right;
3133 int r_len = r.length();
3134 int border = r_len / SC_DIGIT_SIZE;
3135 if( i < border ) {
3136 r.set_word( i, w );
3137 return;
3138 }
3139 // border <= i < size()
3140 X& l = m_left;
3141 int shift = r_len % SC_DIGIT_SIZE;
3142 int j = i - border;
3143 if( shift == 0 ) {
3144 l.set_word( j, w );
3145 return;
3146 }
3147 // border <= i < size() && shift != 0
3148 int nshift = SC_DIGIT_SIZE - shift;
3149 sc_digit lh_mask = ~SC_DIGIT_ZERO << nshift;
3150 if( i == border ) {
3151 sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift;
3152 r.set_word( i, w & rl_mask );
3153 l.set_word( 0, (l.get_word( 0 ) & lh_mask) | (w >> shift) );
3154 return;
3155 }
3156 // border < i < size() && shift != 0
3157 sc_digit ll_mask = ~SC_DIGIT_ZERO >> shift;
3158 l.set_word( j - 1, (l.get_word( j - 1 ) & ll_mask) | (w << nshift) );
3159 if ( j < l.size() )
3160 l.set_word( j, (l.get_word( j ) & lh_mask) | (w >> shift) );
3161}
3162
3163
3164template <class X, class Y>
3165inline
3168{
3169 if( i < 0 || i >= size() ) {
3171 }
3172 // 0 <= i < size()
3173 Y& r = m_right;
3174 int r_len = r.length();
3175 int border = r_len / SC_DIGIT_SIZE;
3176 if( i < border ) {
3177 return r.get_cword( i );
3178 }
3179 // border <= i < size()
3180 X& l = m_left;
3181 int shift = r_len % SC_DIGIT_SIZE;
3182 int j = i - border;
3183 if( shift == 0 ) {
3184 return l.get_cword( j );
3185 }
3186 // border <= i < size() && shift != 0
3187 int nshift = SC_DIGIT_SIZE - shift;
3188 if( i == border ) {
3189 sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift;
3190 return ( (r.get_cword( i ) & rl_mask) | (l.get_cword( 0 ) << shift) );
3191 }
3192 // border < i < size() && shift != 0
3193 if ( j < l.size() )
3194 return ( (l.get_cword(j - 1) >> nshift) | (l.get_cword(j) << shift) );
3195 else
3196 return (l.get_cword( j - 1 ) >> nshift);
3197}
3198
3199template <class X, class Y>
3200inline
3201void
3203{
3204 if( i < 0 || i >= size() ) {
3206 }
3207 // 0 <= i < size()
3208 Y& r = m_right;
3209 int r_len = r.length();
3210 int border = r_len / SC_DIGIT_SIZE;
3211 if( i < border ) {
3212 r.set_cword( i, w );
3213 return;
3214 }
3215 // border <= i < size()
3216 X& l = m_left;
3217 int shift = r_len % SC_DIGIT_SIZE;
3218 int j = i - border;
3219 if( shift == 0 ) {
3220 l.set_cword( j, w );
3221 return;
3222 }
3223 // border <= i < size() && shift != 0
3224 int nshift = SC_DIGIT_SIZE - shift;
3225 sc_digit lh_mask = ~SC_DIGIT_ZERO << nshift;
3226 if( i == border ) {
3227 sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift;
3228 r.set_cword( i, w & rl_mask );
3229 l.set_cword( 0, (l.get_cword( 0 ) & lh_mask) | (w >> shift) );
3230 return;
3231 }
3232 // border < i < size() && shift != 0
3233 sc_digit ll_mask = ~SC_DIGIT_ZERO >> shift;
3234 l.set_cword( j - 1, (l.get_cword( j - 1 ) & ll_mask) | (w << nshift) );
3235 if ( j < l.size() )
3236 l.set_cword( j, (l.get_cword( j ) & lh_mask) | (w >> shift) );
3237}
3238
3239
3240// r-value concatenation operators and functions
3241
3242template <class T1, class T2, class T3>
3243inline
3246{
3248 *a.clone(), *b.clone(), 3 );
3249}
3250
3251template <class T1, class T2, class T3>
3252inline
3253sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
3255{
3257 *a.clone(), *b.clone(), 3 );
3258}
3259
3260template <class T1, class T2, class T3, class T4>
3261inline
3262sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
3264{
3266 *a.clone(), *b.clone(), 3 );
3267}
3268
3269template <class T1, class T2, class T3>
3270inline
3271sc_concref_r<sc_concref_r<T1,T2>,T3>
3273{
3275 *a.clone(), b.back_cast(), 1 );
3276}
3277
3278
3279template <class T1, class T2, class T3>
3280inline
3281sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
3283{
3285 *a.clone(), *b.clone(), 3 );
3286}
3287
3288template <class T1, class T2, class T3>
3289inline
3290sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
3292{
3294 *a.clone(), *b.clone(), 3 );
3295}
3296
3297template <class T1, class T2, class T3, class T4>
3298inline
3299sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
3301{
3303 *a.clone(), *b.clone(), 3 );
3304}
3305
3306template <class T1, class T2, class T3>
3307inline
3308sc_concref_r<sc_concref_r<T1,T2>,T3>
3310{
3312 *a.clone(), b.back_cast(), 1 );
3313}
3314
3315
3316#ifdef SC_DT_MIXED_COMMA_OPERATORS
3317
3318template <class T1, class T2, class T3>
3319inline
3320sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
3322{
3324 *a.clone(), *b.clone(), 3 );
3325}
3326
3327template <class T1, class T2, class T3>
3328inline
3329sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
3331{
3333 *a.clone(), *b.clone(), 3 );
3334}
3335
3336template <class T1, class T2, class T3>
3337inline
3338sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
3340{
3342 *a.clone(), *b.clone(), 3 );
3343}
3344
3345template <class T1, class T2, class T3>
3346inline
3347sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
3349{
3351 *a.clone(), *b.clone(), 3 );
3352}
3353
3354template <class T1, class T2, class T3, class T4>
3355inline
3356sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
3358{
3360 *a.clone(), *b.clone(), 3 );
3361}
3362
3363template <class T1, class T2, class T3, class T4>
3364inline
3365sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
3367{
3369 *a.clone(), *b.clone(), 3 );
3370}
3371
3372template <class T1, class T2, class T3>
3373inline
3374sc_concref_r<sc_concref_r<T1,T2>,T3>
3376{
3378 *a.clone(), b.back_cast(), 1 );
3379}
3380
3381template <class T1, class T2, class T3>
3382inline
3383sc_concref_r<sc_concref_r<T1,T2>,T3>
3385{
3387 *a.clone(), b.back_cast(), 1 );
3388}
3389
3390
3391template <class T1, class T2, class T3>
3392inline
3393sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
3395{
3397 *a.clone(), *b.clone(), 3 );
3398}
3399
3400template <class T1, class T2, class T3>
3401inline
3402sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
3404{
3406 *a.clone(), *b.clone(), 3 );
3407}
3408
3409template <class T1, class T2, class T3>
3410inline
3411sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
3413{
3415 *a.clone(), *b.clone(), 3 );
3416}
3417
3418template <class T1, class T2, class T3>
3419inline
3420sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
3422{
3424 *a.clone(), *b.clone(), 3 );
3425}
3426
3427template <class T1, class T2, class T3, class T4>
3428inline
3429sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
3431{
3433 *a.clone(), *b.clone(), 3 );
3434}
3435
3436template <class T1, class T2, class T3, class T4>
3437inline
3438sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
3440{
3442 *a.clone(), *b.clone(), 3 );
3443}
3444
3445template <class T1, class T2, class T3>
3446inline
3447sc_concref_r<sc_concref_r<T1,T2>,T3>
3449{
3451 *a.clone(), b.back_cast(), 1 );
3452}
3453
3454template <class T1, class T2, class T3>
3455inline
3456sc_concref_r<sc_concref_r<T1,T2>,T3>
3458{
3460 *a.clone(), b.back_cast(), 1 );
3461}
3462
3463#endif
3464
3465
3466// ----------------------------------------------------------------------------
3467// CLASS TEMPLATE : sc_concref<X,Y>
3468//
3469// Proxy class for sc_proxy concatenation (r-value and l-value).
3470// ----------------------------------------------------------------------------
3471
3472// other methods
3473
3474template <class T1, class T2>
3475inline
3476void
3477sc_concref<T1,T2>::scan( ::std::istream& is )
3478{
3479 std::string s;
3480 is >> s;
3481 *this = s.c_str();
3482}
3483
3484
3485// l-value concatenation operators and functions
3486
3487template <class T1, class T2, class T3>
3488inline
3491{
3493 *a.clone(), *b.clone(), 3 );
3494}
3495
3496template <class T1, class T2, class T3>
3497inline
3498sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
3500{
3502 *a.clone(), *b.clone(), 3 );
3503}
3504
3505template <class T1, class T2, class T3, class T4>
3506inline
3507sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
3509{
3511 *a.clone(), *b.clone(), 3 );
3512}
3513
3514template <class T1, class T2, class T3>
3515inline
3516sc_concref<sc_concref<T1,T2>,T3>
3518{
3520 *a.clone(), b.back_cast(), 1 );
3521}
3522
3523
3524template <class T1, class T2, class T3>
3525inline
3526sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
3528{
3530 *a.clone(), *b.clone(), 3 );
3531}
3532
3533template <class T1, class T2, class T3>
3534inline
3535sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
3537{
3539 *a.clone(), *b.clone(), 3 );
3540}
3541
3542template <class T1, class T2, class T3, class T4>
3543inline
3544sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
3546{
3548 *a.clone(), *b.clone(), 3 );
3549}
3550
3551template <class T1, class T2, class T3>
3552inline
3553sc_concref<sc_concref<T1,T2>,T3>
3555{
3557 *a.clone(), b.back_cast(), 1 );
3558}
3559
3560
3561template <class X, class Y>
3562inline
3563::std::istream&
3564operator >> ( ::std::istream& is, sc_concref<X,Y> a )
3565{
3566 a.scan( is );
3567 return is;
3568}
3569
3570
3571// ----------------------------------------------------------------------------
3572// CLASS TEMPLATE : sc_proxy<T>
3573//
3574// Base class template for bit/logic vector classes.
3575// (Barton/Nackmann implementation)
3576// ----------------------------------------------------------------------------
3577
3578// r-value concatenation operators and functions
3579
3580template <class T1, class T2>
3581inline
3582sc_concref_r<T1,sc_bitref_r<T2> >
3584{
3586 a.back_cast(), *b.clone(), 2 );
3587}
3588
3589template <class T1, class T2>
3590inline
3591sc_concref_r<T1,sc_subref_r<T2> >
3593{
3595 a.back_cast(), *b.clone(), 2 );
3596}
3597
3598template <class T1, class T2, class T3>
3599inline
3600sc_concref_r<T1,sc_concref_r<T2,T3> >
3602{
3604 a.back_cast(), *b.clone(), 2 );
3605}
3606
3607template <class T1, class T2>
3608inline
3609sc_concref_r<T1,T2>
3611{
3612 return sc_concref_r<T1,T2>(
3613 a.back_cast(), b.back_cast() );
3614}
3615
3616
3617template <class T1, class T2>
3618inline
3619sc_concref_r<T1,sc_bitref_r<T2> >
3621{
3623 a.back_cast(), *b.clone(), 2 );
3624}
3625
3626template <class T1, class T2>
3627inline
3628sc_concref_r<T1,sc_subref_r<T2> >
3630{
3632 a.back_cast(), *b.clone(), 2 );
3633}
3634
3635template <class T1, class T2, class T3>
3636inline
3637sc_concref_r<T1,sc_concref_r<T2,T3> >
3639{
3641 a.back_cast(), *b.clone(), 2 );
3642}
3643
3644template <class T1, class T2>
3645inline
3646sc_concref_r<T1,T2>
3648{
3649 return sc_concref_r<T1,T2>(
3650 a.back_cast(), b.back_cast() );
3651}
3652
3653
3654#ifdef SC_DT_MIXED_COMMA_OPERATORS
3655
3656template <class T1, class T2>
3657inline
3658sc_concref_r<T1,sc_bitref_r<T2> >
3660{
3662 a.back_cast(), *b.clone(), 2 );
3663}
3664
3665template <class T1, class T2>
3666inline
3667sc_concref_r<T1,sc_bitref_r<T2> >
3669{
3671 a.back_cast(), *b.clone(), 2 );
3672}
3673
3674template <class T1, class T2>
3675inline
3676sc_concref_r<T1,sc_subref_r<T2> >
3678{
3680 a.back_cast(), *b.clone(), 2 );
3681}
3682
3683template <class T1, class T2>
3684inline
3685sc_concref_r<T1,sc_subref_r<T2> >
3687{
3689 a.back_cast(), *b.clone(), 2 );
3690}
3691
3692template <class T1, class T2, class T3>
3693inline
3694sc_concref_r<T1,sc_concref_r<T2,T3> >
3696{
3698 a.back_cast(), *b.clone(), 2 );
3699}
3700
3701template <class T1, class T2, class T3>
3702inline
3703sc_concref_r<T1,sc_concref_r<T2,T3> >
3705{
3707 a.back_cast(), *b.clone(), 2 );
3708}
3709
3710template <class T1, class T2>
3711inline
3712sc_concref_r<T1,T2>
3714{
3715 return sc_concref_r<T1,T2>(
3716 a.back_cast(), b.back_cast() );
3717}
3718
3719template <class T1, class T2>
3720inline
3721sc_concref_r<T1,T2>
3723{
3724 return sc_concref_r<T1,T2>(
3725 a.back_cast(), b.back_cast() );
3726}
3727
3728
3729template <class T1, class T2>
3730inline
3731sc_concref_r<T1,sc_bitref_r<T2> >
3733{
3735 a.back_cast(), *b.clone(), 2 );
3736}
3737
3738template <class T1, class T2>
3739inline
3740sc_concref_r<T1,sc_bitref_r<T2> >
3742{
3744 a.back_cast(), *b.clone(), 2 );
3745}
3746
3747template <class T1, class T2>
3748inline
3749sc_concref_r<T1,sc_subref_r<T2> >
3751{
3753 a.back_cast(), *b.clone(), 2 );
3754}
3755
3756template <class T1, class T2>
3757inline
3758sc_concref_r<T1,sc_subref_r<T2> >
3760{
3762 a.back_cast(), *b.clone(), 2 );
3763}
3764
3765template <class T1, class T2, class T3>
3766inline
3767sc_concref_r<T1,sc_concref_r<T2,T3> >
3769{
3771 a.back_cast(), *b.clone(), 2 );
3772}
3773
3774template <class T1, class T2, class T3>
3775inline
3776sc_concref_r<T1,sc_concref_r<T2,T3> >
3778{
3780 a.back_cast(), *b.clone(), 2 );
3781}
3782
3783template <class T1, class T2>
3784inline
3785sc_concref_r<T1,T2>
3787{
3788 return sc_concref_r<T1,T2>(
3789 a.back_cast(), b.back_cast() );
3790}
3791
3792template <class T1, class T2>
3793inline
3794sc_concref_r<T1,T2>
3796{
3797 return sc_concref_r<T1,T2>(
3798 a.back_cast(), b.back_cast() );
3799}
3800
3801#endif
3802
3803
3804// l-value concatenation operators and functions
3805
3806template <class T1, class T2>
3807inline
3808sc_concref<T1,sc_bitref<T2> >
3810{
3812 a.back_cast(), *b.clone(), 2 );
3813}
3814
3815template <class T1, class T2>
3816inline
3817sc_concref<T1,sc_subref<T2> >
3819{
3821 a.back_cast(), *b.clone(), 2 );
3822}
3823
3824template <class T1, class T2, class T3>
3825inline
3826sc_concref<T1,sc_concref<T2,T3> >
3828{
3830 a.back_cast(), *b.clone(), 2 );
3831}
3832
3833template <class T1, class T2>
3834inline
3835sc_concref<T1,T2>
3837{
3838 return sc_concref<T1,T2>(
3839 a.back_cast(), b.back_cast() );
3840}
3841
3842
3843template <class T1, class T2>
3844inline
3845sc_concref<T1,sc_bitref<T2> >
3847{
3849 a.back_cast(), *b.clone(), 2 );
3850}
3851
3852template <class T1, class T2>
3853inline
3854sc_concref<T1,sc_subref<T2> >
3856{
3858 a.back_cast(), *b.clone(), 2 );
3859}
3860
3861template <class T1, class T2, class T3>
3862inline
3863sc_concref<T1,sc_concref<T2,T3> >
3865{
3867 a.back_cast(), *b.clone(), 2 );
3868}
3869
3870template <class T1, class T2>
3871inline
3872sc_concref<T1,T2>
3874{
3875 return sc_concref<T1,T2>(
3876 a.back_cast(), b.back_cast() );
3877}
3878
3879} // namespace sc_dt
3880
3881#ifdef _MSC_VER
3882#pragma warning(pop)
3883#endif
3884
3885// $Log: sc_bit_proxies.h,v $
3886// Revision 1.10 2011/09/05 21:19:53 acg
3887// Philipp A. Hartmann: added parentheses to expressions to eliminate
3888// compiler warnings.
3889//
3890// Revision 1.9 2011/09/01 15:03:42 acg
3891// Philipp A. Hartmann: add parentheses to eliminate compiler warnings.
3892//
3893// Revision 1.8 2011/08/29 18:04:32 acg
3894// Philipp A. Hartmann: miscellaneous clean ups.
3895//
3896// Revision 1.7 2011/08/24 22:05:40 acg
3897// Torsten Maehne: initialization changes to remove warnings.
3898//
3899// Revision 1.6 2010/02/22 14:25:43 acg
3900// Andy Goodrich: removed 'mutable' directive from references, since it
3901// is not a legal C++ construct.
3902//
3903// Revision 1.5 2009/02/28 00:26:14 acg
3904// Andy Goodrich: bug fixes.
3905//
3906// Revision 1.4 2007/03/14 17:48:37 acg
3907// Andy Goodrich: fixed bug.
3908//
3909// Revision 1.3 2007/01/18 19:29:18 acg
3910// Andy Goodrich: fixed bug in concatenations of bit selects on sc_lv and
3911// sc_bv types. The offending code was in sc_bitref<X>::set_word and
3912// sc_bitref<X>::get_word. These methods were not writing the bit they
3913// represented, but rather writing an entire word whose index was the
3914// index of the bit they represented. This not only did not write the
3915// correct bit, but clobbered a word that might not even be in the
3916// variable the reference was for.
3917//
3918// Revision 1.2 2007/01/17 22:45:08 acg
3919// Andy Goodrich: fixed sc_bitref<X>::set_bit().
3920//
3921// Revision 1.1.1.1 2006/12/15 20:31:36 acg
3922// SystemC 2.2
3923//
3924// Revision 1.3 2006/01/13 18:53:53 acg
3925// Andy Goodrich: added $Log command so that CVS comments are reproduced in
3926// the source.
3927//
3928
3929
3930#endif
#define SC_REPORT_ERROR(msg_type, msg)
Definition: sc_report.h:217
SC_API const char SC_ID_OUT_OF_BOUNDS_[]
SC_API void sc_abort()
const sc_digit SC_DIGIT_ONE
Definition: sc_proxy.h:98
sc_logic_value_t
Definition: sc_logic.h:87
@ Log_0
Definition: sc_logic.h:88
const int SC_DIGIT_SIZE
Definition: sc_proxy.h:95
sc_bit operator&(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:331
sc_bit operator^(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:337
const sc_digit SC_DIGIT_ZERO
Definition: sc_proxy.h:97
unsigned long long uint64
Definition: sc_nbdefs.h:216
bool operator==(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:285
const T sc_min(const T &a, const T &b)
Definition: sc_macros.h:40
sc_concref_r< sc_bitref_r< T1 >, sc_bitref_r< T2 > > concat(sc_bitref_r< T1 >, sc_bitref_r< T2 >)
sc_concref_r< sc_bitref_r< T1 >, sc_bitref_r< T2 > > operator,(sc_bitref_r< T1 >, sc_bitref_r< T2 >)
class SC_API sc_logic
Definition: sc_signal_ifs.h:39
const T sc_max(const T &a, const T &b)
Definition: sc_macros.h:48
const sc_digit SC_DIGIT_TWO
Definition: sc_proxy.h:99
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
uint64 const sc_uint_base int b
Definition: sc_fxval.h:955
sc_bit operator|(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:334
long long int64
Definition: sc_nbdefs.h:215
sc_core::sc_signal_in_if< T > & value(const T &val)
Definition: sc_stub.h:217
char to_char() const
T::traits_type traits_type
bool to_bool() const
bool operator!() const
sc_bitref_r(const sc_bitref_r< T > &a)
sc_digit get_word(int i) const
traits_type::bit_type bit_type
sc_bitref_r(const T &obj_, int index_)
bit_type operator~() const
sc_bitref_r< T > * clone() const
bool is_01() const
sc_digit get_cword(int i) const
value_type value() const
void print(::std::ostream &os=::std::cout) const
value_type get_bit(int n) const
traits_type::value_type value_type
sc_bitref(const sc_bitref< X > &a)
sc_bitref_r< X >::value_type value_type
sc_bitref< X > & operator&=(const sc_bitref_r< X > &a)
void set_bit(int n, value_type value)
sc_bitref< X > & b_not()
sc_bitref< X > & operator^=(const sc_bitref_r< X > &a)
sc_bitref< X > & operator|=(const sc_bitref_r< X > &a)
void set_cword(int i, sc_digit w)
sc_bitref(X &obj_, int index_)
void scan(::std::istream &is=::std::cin)
sc_bitref< X > * clone() const
sc_bitref< X > & operator=(const sc_bitref_r< X > &a)
void set_word(int i, sc_digit w)
void set_bit(int n, value_type value)
sc_subref_r< X > * clone() const
void set_word(int i, sc_digit w)
sc_digit get_word(int i) const
sc_digit get_cword(int i) const
value_type get_bit(int n) const
sc_subref_r(const sc_subref_r< X > &a)
sc_subref_r(const X &obj_, int hi_, int lo_)
bool reversed() const
void set_cword(int i, sc_digit w)
sc_proxy< sc_subref_r< X > >::value_type value_type
sc_subref< X > & operator=(const sc_proxy< Y > &a)
sc_subref_r< X > base_type
void scan(::std::istream &=::std::cin)
sc_subref< X > * clone() const
sc_subref(const sc_subref< X > &a)
sc_subref(X &obj_, int hi_, int lo_)
value_type get_bit(int n) const
sc_concref_r(const X &left_, const Y &right_, int delete_=0)
void set_cword(int i, sc_digit w)
sc_concref_r(const sc_concref_r< X, Y > &a)
sc_proxy< sc_concref_r< X, Y > >::value_type value_type
sc_concref_r< X, Y > * clone() const
void set_word(int i, sc_digit w)
sc_digit get_cword(int i) const
void set_bit(int n, value_type value)
sc_digit get_word(int i) const
sc_concref< X, Y > * clone() const
sc_concref< X, Y > & operator=(const sc_proxy< Z > &a)
void scan(::std::istream &=::std::cin)
sc_concref(const sc_concref< X, Y > &a)
sc_concref(X &left_, Y &right_, int delete_=0)
sc_concref_r< X, Y > base_type
static const sc_logic_value_t or_table[4][4]
Definition: sc_logic.h:155
static const sc_logic_value_t xor_table[4][4]
Definition: sc_logic.h:156
static const sc_logic_value_t and_table[4][4]
Definition: sc_logic.h:154
static const sc_logic_value_t not_table[4]
Definition: sc_logic.h:157
sc_logic_value_t value() const
Definition: sc_logic.h:254
sc_subref_r< X > & assign_(const sc_proxy< Y > &a)
Definition: sc_proxy.h:221
X & back_cast()
Definition: sc_proxy.h:211
uint_type value() const
Definition: sc_uint_base.h:805