summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/datatypes/bit/sc_bit.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/systemc/src/sysc/datatypes/bit/sc_bit.h')
-rw-r--r--ext/systemc/src/sysc/datatypes/bit/sc_bit.h407
1 files changed, 407 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/datatypes/bit/sc_bit.h b/ext/systemc/src/sysc/datatypes/bit/sc_bit.h
new file mode 100644
index 000000000..2703971b6
--- /dev/null
+++ b/ext/systemc/src/sysc/datatypes/bit/sc_bit.h
@@ -0,0 +1,407 @@
+/*****************************************************************************
+
+ Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
+ more contributor license agreements. See the NOTICE file distributed
+ with this work for additional information regarding copyright ownership.
+ Accellera licenses this file to you under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with the
+ License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied. See the License for the specific language governing
+ permissions and limitations under the License.
+
+ *****************************************************************************/
+
+/*****************************************************************************
+
+ sc_bit.h -- Bit class.
+
+ Original Author: Stan Y. Liao, Synopsys, Inc.
+
+ *****************************************************************************/
+
+/*****************************************************************************
+
+ MODIFICATION LOG - modifiers, enter your name, affiliation, date and
+ changes you are making here.
+
+ Name, Affiliation, Date:
+ Description of Modification:
+
+ *****************************************************************************/
+
+// $Log: sc_bit.h,v $
+// Revision 1.2 2011/08/07 18:54:19 acg
+// Philipp A. Hartmann: remove friend function declarations that implement
+// code, and clean up how bit and logic operators are defined in general.
+//
+// Revision 1.1.1.1 2006/12/15 20:20:04 acg
+// SystemC 2.3
+//
+// Revision 1.6 2006/05/08 17:49:59 acg
+// Andy Goodrich: Added David Long's declarations for friend operators,
+// functions, and methods, to keep the Microsoft compiler happy.
+//
+// Revision 1.5 2006/04/12 20:17:52 acg
+// Andy Goodrich: enabled deprecation message for sc_bit.
+//
+// Revision 1.4 2006/01/24 20:50:55 acg
+// Andy Goodrich: added warnings indicating that sc_bit is deprecated and that
+// the C bool data type should be used in its place.
+//
+// Revision 1.3 2006/01/13 18:53:53 acg
+// Andy Goodrich: added $Log command so that CVS comments are reproduced in
+// the source.
+//
+
+#ifndef SC_BIT_H
+#define SC_BIT_H
+
+
+#include "sysc/datatypes/int/sc_nbdefs.h"
+#include "sysc/utils/sc_iostream.h"
+
+
+namespace sc_dt
+{
+
+// classes defined in this module
+class sc_bit;
+
+// forward class declarations
+class sc_logic;
+
+extern void sc_deprecated_sc_bit();
+
+// ----------------------------------------------------------------------------
+// CLASS : sc_bit
+//
+// Bit class.
+// Note: VSIA compatibility indicated.
+// ----------------------------------------------------------------------------
+
+class sc_bit
+{
+ // support methods
+
+ static void invalid_value( char );
+ static void invalid_value( int );
+
+ static bool to_value( char c )
+ {
+ if( c != '0' && c != '1' ) {
+ invalid_value( c );
+ }
+ return ( c == '0' ? false : true );
+ }
+
+ static bool to_value( int i )
+ {
+ if( i != 0 && i != 1 ) {
+ invalid_value( i );
+ }
+ return ( i == 0 ? false : true );
+ }
+ static bool to_value( bool b )
+ { return b; }
+
+#define DEFN_TO_VALUE_T(tp) \
+ static bool to_value( tp i ) \
+ { return to_value( (int) i); }
+
+ DEFN_TO_VALUE_T(unsigned)
+ DEFN_TO_VALUE_T(long)
+ DEFN_TO_VALUE_T(unsigned long)
+ DEFN_TO_VALUE_T(int64)
+ DEFN_TO_VALUE_T(uint64)
+
+#undef DEFN_TO_VALUE_T
+
+public:
+
+ // constructors
+ // MANDATORY
+
+ sc_bit()
+ : m_val( false )
+ {
+ sc_deprecated_sc_bit();
+ }
+
+#define DEFN_CTOR_T(tp) \
+ explicit sc_bit( tp a ) \
+ : m_val( to_value(a) ) \
+ { sc_deprecated_sc_bit(); }
+
+ DEFN_CTOR_T(bool)
+ DEFN_CTOR_T(char)
+ DEFN_CTOR_T(int)
+ DEFN_CTOR_T(unsigned)
+ DEFN_CTOR_T(long)
+ DEFN_CTOR_T(unsigned long)
+ DEFN_CTOR_T(int64)
+ DEFN_CTOR_T(uint64)
+
+#undef DEFN_CTOR_T
+
+ explicit sc_bit( const sc_logic& a ); // non-VSIA
+
+
+ // copy constructor
+ // MANDATORY
+
+ sc_bit( const sc_bit& a )
+ : m_val( a.m_val )
+ {}
+
+
+ // destructor
+ // MANDATORY
+
+ ~sc_bit()
+ {}
+
+
+ // assignment operators
+ // MANDATORY
+
+ sc_bit& operator = ( const sc_bit& b )
+ { m_val = b.m_val; return *this; }
+
+#define DEFN_ASN_OP_T(op,tp) \
+ sc_bit& operator op( tp b ) \
+ { return ( *this op sc_bit( b ) ); }
+#define DEFN_ASN_OP(op) \
+ DEFN_ASN_OP_T(op,int) \
+ DEFN_ASN_OP_T(op,bool) \
+ DEFN_ASN_OP_T(op,char)
+
+ DEFN_ASN_OP(=)
+ DEFN_ASN_OP_T(=,int64)
+ DEFN_ASN_OP_T(=,uint64)
+ DEFN_ASN_OP_T(=,long)
+ DEFN_ASN_OP_T(=,unsigned long)
+
+ sc_bit& operator = ( const sc_logic& b ); // non-VSIA
+
+
+ // bitwise assignment operators
+
+ sc_bit& operator &= ( const sc_bit& b )
+ { m_val = ( m_val && b.m_val ); return *this; }
+
+ sc_bit& operator |= ( const sc_bit& b )
+ { m_val = ( m_val || b.m_val ); return *this; }
+
+ sc_bit& operator ^= ( const sc_bit& b )
+ { m_val = ( m_val != b.m_val ); return *this; }
+
+ DEFN_ASN_OP(&=)
+ DEFN_ASN_OP(|=)
+ DEFN_ASN_OP(^=)
+
+#undef DEFN_ASN_OP_T
+#undef DEFN_ASN_OP
+
+ // conversions
+ // MANDATORY
+
+ // implicit conversion to bool
+
+ operator bool () const
+ { return m_val; }
+
+ bool operator ! () const // non-VSIA
+ { return ! m_val; }
+
+
+ // explicit conversions
+
+ bool to_bool() const // non-VSIA
+ { return m_val; }
+
+ char to_char() const
+ { return ( m_val ? '1' : '0' ); }
+
+
+ // relational operators and functions
+
+ // MANDATORY
+
+ friend bool operator == ( const sc_bit& a, const sc_bit& b );
+ friend bool operator != ( const sc_bit& a, const sc_bit& b );
+
+ // bitwise operators and functions
+
+ // bitwise complement
+
+ // MANDATORY
+
+ friend const sc_bit operator ~ ( const sc_bit& a );
+
+ // RECOMMENDED
+
+ sc_bit& b_not()
+ { m_val = ( ! m_val ); return *this; }
+
+ // binary bit-wise operations
+
+ friend const sc_bit operator | ( const sc_bit& a, const sc_bit& b );
+ friend const sc_bit operator & ( const sc_bit& a, const sc_bit& b );
+ friend const sc_bit operator ^ ( const sc_bit& a, const sc_bit& b );
+
+ // other methods
+
+ void print( ::std::ostream& os = ::std::cout ) const
+ { os << to_bool(); }
+
+ void scan( ::std::istream& = ::std::cin );
+
+private:
+ bool m_val;
+};
+
+// ----------------------------------------------------------------------------
+// relational operators and functions
+
+#define DEFN_BIN_FUN_T(ret,fun,tp) \
+ inline ret fun( const sc_bit& a, tp b ) \
+ { return fun(a, sc_bit(b) ); } \
+ inline ret fun( tp b, const sc_bit& a ) \
+ { return fun( sc_bit(a), b ); }
+
+#define DEFN_BIN_FUN(ret,fun) \
+ DEFN_BIN_FUN_T(ret,fun,bool) \
+ DEFN_BIN_FUN_T(ret,fun,char) \
+ DEFN_BIN_FUN_T(ret,fun,int)
+
+// MANDATORY
+
+inline bool operator == ( const sc_bit& a, const sc_bit& b )
+ { return ( a.m_val == b.m_val ); }
+
+inline bool operator != ( const sc_bit& a, const sc_bit& b )
+ { return ( a.m_val != b.m_val ); }
+
+DEFN_BIN_FUN(bool,operator==)
+DEFN_BIN_FUN(bool,operator!=)
+
+// OPTIONAL
+
+inline bool equal( const sc_bit& a, const sc_bit& b )
+ { return ( a == b ); }
+
+inline bool not_equal( const sc_bit& a, const sc_bit& b )
+ { return ( a != b ); }
+
+DEFN_BIN_FUN(bool,equal)
+DEFN_BIN_FUN(bool,not_equal)
+
+// ----------------------------------------------------------------------------
+// bitwise operators and functions
+
+// bitwise complement
+
+ // MANDATORY
+
+ inline const sc_bit operator ~ ( const sc_bit& a )
+ { return sc_bit( ! a.m_val ); }
+
+
+ // OPTIONAL
+
+ inline const sc_bit b_not( const sc_bit& a )
+ { return ( ~ a ); }
+
+
+ // RECOMMENDED
+
+ inline void b_not( sc_bit& r, const sc_bit& a )
+ { r = ( ~ a ); }
+
+ // binary bit-wise operations
+
+ // MANDATORY
+
+ inline const sc_bit operator & ( const sc_bit& a, const sc_bit& b )
+ { return sc_bit( a.m_val && b.m_val ); }
+
+ inline const sc_bit operator | ( const sc_bit& a, const sc_bit& b )
+ { return sc_bit( a.m_val || b.m_val ); }
+
+ inline const sc_bit operator ^ ( const sc_bit& a, const sc_bit& b )
+ { return sc_bit( a.m_val != b.m_val ); }
+
+ DEFN_BIN_FUN(const sc_bit,operator&)
+ DEFN_BIN_FUN(const sc_bit,operator|)
+ DEFN_BIN_FUN(const sc_bit,operator^)
+
+ // OPTIONAL
+
+ inline const sc_bit b_and ( const sc_bit& a, const sc_bit& b )
+ { return a & b; }
+
+ inline const sc_bit b_or ( const sc_bit& a, const sc_bit& b )
+ { return a | b; }
+
+ inline const sc_bit b_xor ( const sc_bit& a, const sc_bit& b )
+ { return a ^ b; }
+
+ DEFN_BIN_FUN(const sc_bit,b_and)
+ DEFN_BIN_FUN(const sc_bit,b_or)
+ DEFN_BIN_FUN(const sc_bit,b_xor)
+
+ // RECOMMENDED
+
+#define DEFN_TRN_FUN_T(fun,tp) \
+ inline void fun( sc_bit& r, const sc_bit& a, tp b ) \
+ { r = fun( a, sc_bit(b) ); } \
+ inline void fun( sc_bit& r, tp a, const sc_bit& b ) \
+ { r = fun( sc_bit(a), b ); }
+
+#define DEFN_TRN_FUN(fun) \
+ inline void fun( sc_bit& r, const sc_bit& a, const sc_bit& b ) \
+ { r = fun( a , b ); } \
+ DEFN_TRN_FUN_T(fun,int) \
+ DEFN_TRN_FUN_T(fun,bool) \
+ DEFN_TRN_FUN_T(fun,char)
+
+ DEFN_TRN_FUN( b_and )
+ DEFN_TRN_FUN( b_or )
+ DEFN_TRN_FUN( b_xor )
+
+#undef DEFN_BIN_FUN_T
+#undef DEFN_BIN_FUN
+#undef DEFN_TRN_FUN_T
+#undef DEFN_TRN_FUN
+
+
+// ----------------------------------------------------------------------------
+
+inline
+::std::ostream&
+operator << ( ::std::ostream& os, const sc_bit& a )
+{
+ a.print( os );
+ return os;
+}
+
+inline
+::std::istream&
+operator >> ( ::std::istream& is, sc_bit& a )
+{
+ a.scan( is );
+ return is;
+}
+
+} // namespace sc_dt
+
+
+#endif
+
+// Taf!