SystemC 3.0.0
Accellera SystemC proof-of-concept library
sc_bit.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.h -- Bit class.
23
24 Original Author: Stan Y. Liao, Synopsys, Inc.
25
26 *****************************************************************************/
27
28/*****************************************************************************
29
30 MODIFICATION LOG - modifiers, enter your name, affiliation, date and
31 changes you are making here.
32
33 Name, Affiliation, Date:
34 Description of Modification:
35
36 *****************************************************************************/
37
38// $Log: sc_bit.h,v $
39// Revision 1.2 2011/08/07 18:54:19 acg
40// Philipp A. Hartmann: remove friend function declarations that implement
41// code, and clean up how bit and logic operators are defined in general.
42//
43// Revision 1.1.1.1 2006/12/15 20:20:04 acg
44// SystemC 2.3
45//
46// Revision 1.6 2006/05/08 17:49:59 acg
47// Andy Goodrich: Added David Long's declarations for friend operators,
48// functions, and methods, to keep the Microsoft compiler happy.
49//
50// Revision 1.5 2006/04/12 20:17:52 acg
51// Andy Goodrich: enabled deprecation message for sc_bit.
52//
53// Revision 1.4 2006/01/24 20:50:55 acg
54// Andy Goodrich: added warnings indicating that sc_bit is deprecated and that
55// the C bool data type should be used in its place.
56//
57// Revision 1.3 2006/01/13 18:53:53 acg
58// Andy Goodrich: added $Log command so that CVS comments are reproduced in
59// the source.
60//
61
62#ifndef SC_BIT_H
63#define SC_BIT_H
64
65
67#include <iostream>
68
69
70namespace sc_dt
71{
72
73// classes defined in this module
74class sc_bit;
75
76// forward class declarations
77class sc_logic;
78
80
81// ----------------------------------------------------------------------------
82// CLASS : sc_bit
83//
84// Bit class.
85// Note: VSIA compatibility indicated.
86// ----------------------------------------------------------------------------
87
89{
90 // support methods
91
92 static void invalid_value( char );
93 static void invalid_value( int );
94
95 static bool to_value( char c )
96 {
97 if( c != '0' && c != '1' ) {
98 invalid_value( c );
99 }
100 return ( c == '0' ? false : true );
101 }
102
103 static bool to_value( int i )
104 {
105 if( i != 0 && i != 1 ) {
106 invalid_value( i );
107 }
108 return ( i == 0 ? false : true );
109 }
110 static bool to_value( bool b )
111 { return b; }
112
113#define DEFN_TO_VALUE_T(tp) \
114 static bool to_value( tp i ) \
115 { return to_value( (int) i); }
116
117 DEFN_TO_VALUE_T(unsigned)
118 DEFN_TO_VALUE_T(long)
119 DEFN_TO_VALUE_T(unsigned long)
122
123#undef DEFN_TO_VALUE_T
124
125public:
126
127 // constructors
128 // MANDATORY
129
131 : m_val( false )
132 {
134 }
135
136#define DEFN_CTOR_T(tp) \
137 explicit sc_bit( tp a ) \
138 : m_val( to_value(a) ) \
139 { sc_deprecated_sc_bit(); }
140
141 DEFN_CTOR_T(bool)
142 DEFN_CTOR_T(char)
143 DEFN_CTOR_T(int)
144 DEFN_CTOR_T(unsigned)
145 DEFN_CTOR_T(long)
146 DEFN_CTOR_T(unsigned long)
149
150#undef DEFN_CTOR_T
151
152 explicit sc_bit( const sc_logic& a ); // non-VSIA
153
154
155 // copy constructor
156 // MANDATORY
157
158 sc_bit( const sc_bit& a )
159 : m_val( a.m_val )
160 {}
161
162
163 // destructor
164 // MANDATORY
165
167 {}
168
169
170 // assignment operators
171 // MANDATORY
172
173 sc_bit& operator = ( const sc_bit& b )
174 { m_val = b.m_val; return *this; }
175
176#define DEFN_ASN_OP_T(op,tp) \
177 sc_bit& operator op( tp b ) \
178 { return ( *this op sc_bit( b ) ); }
179#define DEFN_ASN_OP(op) \
180 DEFN_ASN_OP_T(op,int) \
181 DEFN_ASN_OP_T(op,bool) \
182 DEFN_ASN_OP_T(op,char)
183
184 DEFN_ASN_OP(=)
187 DEFN_ASN_OP_T(=,long)
188 DEFN_ASN_OP_T(=,unsigned long)
189
190 sc_bit& operator = ( const sc_logic& b ); // non-VSIA
191
192
193 // bitwise assignment operators
194
195 sc_bit& operator &= ( const sc_bit& b )
196 { m_val = ( m_val && b.m_val ); return *this; }
197
199 { m_val = ( m_val || b.m_val ); return *this; }
200
202 { m_val = ( m_val != b.m_val ); return *this; }
203
204 DEFN_ASN_OP(&=)
205 DEFN_ASN_OP(|=)
206 DEFN_ASN_OP(^=)
207
208#undef DEFN_ASN_OP_T
209#undef DEFN_ASN_OP
210
211 // conversions
212 // MANDATORY
213
214 // implicit conversion to bool
215
216 operator bool () const
217 { return m_val; }
218
219 bool operator ! () const // non-VSIA
220 { return ! m_val; }
221
222
223 // explicit conversions
224
225 bool to_bool() const // non-VSIA
226 { return m_val; }
227
228 char to_char() const
229 { return ( m_val ? '1' : '0' ); }
230
231
232 // relational operators and functions
233
234 // MANDATORY
235
236 friend bool operator == ( const sc_bit& a, const sc_bit& b );
237 friend bool operator != ( const sc_bit& a, const sc_bit& b );
238
239 // bitwise operators and functions
240
241 // bitwise complement
242
243 // MANDATORY
244
245 friend sc_bit operator ~ ( const sc_bit& a );
246
247 // RECOMMENDED
248
250 { m_val = ( ! m_val ); return *this; }
251
252 // binary bit-wise operations
253
254 friend sc_bit operator | ( const sc_bit& a, const sc_bit& b );
255 friend sc_bit operator & ( const sc_bit& a, const sc_bit& b );
256 friend sc_bit operator ^ ( const sc_bit& a, const sc_bit& b );
257
258 // other methods
259
260 void print( ::std::ostream& os = ::std::cout ) const
261 { os << to_bool(); }
262
263 void scan( ::std::istream& = ::std::cin );
264
265private:
266 bool m_val;
267};
268
269// ----------------------------------------------------------------------------
270// relational operators and functions
271
272#define DEFN_BIN_FUN_T(ret,fun,tp) \
273 inline ret fun( const sc_bit& a, tp b ) \
274 { return fun(a, sc_bit(b) ); } \
275 inline ret fun( tp b, const sc_bit& a ) \
276 { return fun( sc_bit(a), b ); }
277
278#define DEFN_BIN_FUN(ret,fun) \
279 DEFN_BIN_FUN_T(ret,fun,bool) \
280 DEFN_BIN_FUN_T(ret,fun,char) \
281 DEFN_BIN_FUN_T(ret,fun,int)
282
283// MANDATORY
284
285inline bool operator == ( const sc_bit& a, const sc_bit& b )
286 { return ( a.m_val == b.m_val ); }
287
288inline bool operator != ( const sc_bit& a, const sc_bit& b )
289 { return ( a.m_val != b.m_val ); }
290
291DEFN_BIN_FUN(bool,operator==)
292DEFN_BIN_FUN(bool,operator!=)
293
294// OPTIONAL
295
296inline bool equal( const sc_bit& a, const sc_bit& b )
297 { return ( a == b ); }
298
299inline bool not_equal( const sc_bit& a, const sc_bit& b )
300 { return ( a != b ); }
301
304
305// ----------------------------------------------------------------------------
306// bitwise operators and functions
307
308// bitwise complement
309
310 // MANDATORY
311
312 inline sc_bit operator ~ ( const sc_bit& a )
313 { return sc_bit( ! a.m_val ); }
314
315
316 // OPTIONAL
317
318 inline sc_bit b_not( const sc_bit& a )
319 { return ( ~ a ); }
320
321
322 // RECOMMENDED
323
324 inline void b_not( sc_bit& r, const sc_bit& a )
325 { r = ( ~ a ); }
326
327 // binary bit-wise operations
328
329 // MANDATORY
330
331 inline sc_bit operator & ( const sc_bit& a, const sc_bit& b )
332 { return sc_bit( a.m_val && b.m_val ); }
333
334 inline sc_bit operator | ( const sc_bit& a, const sc_bit& b )
335 { return sc_bit( a.m_val || b.m_val ); }
336
337 inline sc_bit operator ^ ( const sc_bit& a, const sc_bit& b )
338 { return sc_bit( a.m_val != b.m_val ); }
339
340 DEFN_BIN_FUN(sc_bit,operator&)
341 DEFN_BIN_FUN(sc_bit,operator|)
342 DEFN_BIN_FUN(sc_bit,operator^)
343
344 // OPTIONAL
345
346 inline sc_bit b_and ( const sc_bit& a, const sc_bit& b )
347 { return a & b; }
348
349 inline sc_bit b_or ( const sc_bit& a, const sc_bit& b )
350 { return a | b; }
351
352 inline sc_bit b_xor ( const sc_bit& a, const sc_bit& b )
353 { return a ^ b; }
354
355 DEFN_BIN_FUN(sc_bit,b_and)
356 DEFN_BIN_FUN(sc_bit,b_or)
357 DEFN_BIN_FUN(sc_bit,b_xor)
358
359 // RECOMMENDED
360
361#define DEFN_TRN_FUN_T(fun,tp) \
362 inline void fun( sc_bit& r, const sc_bit& a, tp b ) \
363 { r = fun( a, sc_bit(b) ); } \
364 inline void fun( sc_bit& r, tp a, const sc_bit& b ) \
365 { r = fun( sc_bit(a), b ); }
366
367#define DEFN_TRN_FUN(fun) \
368 inline void fun( sc_bit& r, const sc_bit& a, const sc_bit& b ) \
369 { r = fun( a , b ); } \
370 DEFN_TRN_FUN_T(fun,int) \
371 DEFN_TRN_FUN_T(fun,bool) \
372 DEFN_TRN_FUN_T(fun,char)
373
377
378#undef DEFN_BIN_FUN_T
379#undef DEFN_BIN_FUN
380#undef DEFN_TRN_FUN_T
381#undef DEFN_TRN_FUN
382
383
384// ----------------------------------------------------------------------------
385
386inline
387::std::ostream&
388operator << ( ::std::ostream& os, const sc_bit& a )
389{
390 a.print( os );
391 return os;
392}
393
394inline
395::std::istream&
396operator >> ( ::std::istream& is, sc_bit& a )
397{
398 a.scan( is );
399 return is;
400}
401
402} // namespace sc_dt
403
404
405#endif
406
407// Taf!
#define DEFN_CTOR_T(tp)
Definition: sc_bit.h:136
#define DEFN_BIN_FUN(ret, fun)
Definition: sc_bit.h:278
#define DEFN_ASN_OP(op)
Definition: sc_bit.h:179
#define DEFN_TRN_FUN(fun)
Definition: sc_bit.h:367
#define DEFN_ASN_OP_T(op, tp)
Definition: sc_bit.h:176
#define DEFN_TO_VALUE_T(tp)
Definition: sc_bit.h:113
#define SC_API
Definition: sc_cmnhdr.h:148
sc_bit b_and(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:346
X & operator|=(sc_proxy< X > &px, const sc_proxy< Y > &py)
Definition: sc_lv_base.h:474
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
sc_bit b_or(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:349
X & operator^=(sc_proxy< X > &px, const sc_proxy< Y > &py)
Definition: sc_lv_base.h:613
unsigned long long uint64
Definition: sc_nbdefs.h:216
bool operator==(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:285
class SC_API sc_logic
Definition: sc_signal_ifs.h:39
bool equal(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:296
void sc_deprecated_sc_bit()
bool not_equal(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:299
sc_bit b_not(const sc_bit &a)
Definition: sc_bit.h:318
sc_bit b_xor(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:352
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
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_bit operator~(const sc_bit &a)
Definition: sc_bit.h:312
sc_bit operator|(const sc_bit &a, const sc_bit &b)
Definition: sc_bit.h:334
long long int64
Definition: sc_nbdefs.h:215
void print(::std::ostream &os=::std::cout) const
Definition: sc_bit.h:260
sc_bit(const sc_logic &a)
bool to_bool() const
Definition: sc_bit.h:225
char to_char() const
Definition: sc_bit.h:228
sc_bit & b_not()
Definition: sc_bit.h:249
sc_bit(const sc_bit &a)
Definition: sc_bit.h:158
void scan(::std::istream &=::std::cin)