| /***************************************************************************** |
| |
| 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_logic.h -- C++ implementation of logic type. Behaves |
| pretty much the same way as HDLs except with 4 values. |
| |
| 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_logic.h,v $ |
| // Revision 1.3 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.2 2011/01/25 20:50:37 acg |
| // Andy Goodrich: changes for IEEE 1666 2011. |
| // |
| // Revision 1.1.1.1 2006/12/15 20:20:04 acg |
| // SystemC 2.3 |
| // |
| // Revision 1.5 2006/12/02 21:00:57 acg |
| // Andy Goodrich: fixes for concatenation support. |
| // |
| // Revision 1.4 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.3 2006/01/13 18:53:53 acg |
| // Andy Goodrich: added $Log command so that CVS comments are reproduced in |
| // the source. |
| // |
| |
| #ifndef __SYSTEMC_EXT_DT_BIT_SC_LOGIC_HH__ |
| #define __SYSTEMC_EXT_DT_BIT_SC_LOGIC_HH__ |
| |
| #include <cstdio> |
| #include <iostream> |
| |
| #include "../sc_mempool.hh" |
| #include "sc_bit.hh" |
| |
| namespace sc_dt |
| { |
| |
| // classes defined in this module |
| class sc_logic; |
| |
| |
| // ---------------------------------------------------------------------------- |
| // ENUM : sc_logic_value_t |
| // |
| // Enumeration of values for sc_logic. |
| // ---------------------------------------------------------------------------- |
| |
| enum sc_logic_value_t |
| { |
| Log_0 = 0, |
| Log_1, |
| Log_Z, |
| Log_X |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| // CLASS : sc_logic |
| // |
| // Four-valued logic type. |
| // ---------------------------------------------------------------------------- |
| |
| class sc_logic |
| { |
| private: |
| // support methods |
| static void invalid_value(sc_logic_value_t); |
| static void invalid_value(char); |
| static void invalid_value(int); |
| |
| static sc_logic_value_t |
| to_value(sc_logic_value_t v) |
| { |
| if (v < Log_0 || v > Log_X) { |
| invalid_value(v); |
| // may continue, if suppressed |
| v = Log_X; |
| } |
| return v; |
| } |
| |
| static sc_logic_value_t to_value(bool b) { return (b ? Log_1 : Log_0); } |
| |
| static sc_logic_value_t |
| to_value(char c) |
| { |
| unsigned int index = (int)c; |
| if (index > 127) { |
| invalid_value(c); |
| // may continue, if suppressed |
| index = 127; // aka Log_X |
| } |
| return char_to_logic[index]; |
| } |
| |
| static sc_logic_value_t |
| to_value(int i) |
| { |
| if (i < Log_0 || i > Log_X) { |
| invalid_value(i); |
| // may continue, if suppressed |
| i = Log_X; |
| } |
| return sc_logic_value_t(i); |
| } |
| |
| void invalid_01() const; |
| |
| public: |
| // conversion tables |
| static const sc_logic_value_t char_to_logic[128]; |
| static const char logic_to_char[4]; |
| static const sc_logic_value_t and_table[4][4]; |
| static const sc_logic_value_t or_table[4][4]; |
| static const sc_logic_value_t xor_table[4][4]; |
| static const sc_logic_value_t not_table[4]; |
| |
| // constructors |
| sc_logic() : m_val(Log_X) {} |
| sc_logic(const sc_logic &a) : m_val(a.m_val) {} |
| sc_logic(sc_logic_value_t v) : m_val(to_value(v)) {} |
| explicit sc_logic(bool a) : m_val(to_value(a)) {} |
| explicit sc_logic(char a) : m_val(to_value(a)) {} |
| explicit sc_logic(int a) : m_val(to_value(a)) {} |
| explicit sc_logic(const sc_bit &a) : m_val(to_value(a.to_bool())) {} |
| |
| // destructor |
| ~sc_logic() {} |
| |
| // (bitwise) assignment operators |
| #define DEFN_ASN_OP_T(op,tp) \ |
| sc_logic & \ |
| operator op (tp v) \ |
| { \ |
| *this op sc_logic(v); \ |
| return *this; \ |
| } |
| |
| #define DEFN_ASN_OP(op) \ |
| DEFN_ASN_OP_T(op, sc_logic_value_t) \ |
| DEFN_ASN_OP_T(op, bool) \ |
| DEFN_ASN_OP_T(op, char) \ |
| DEFN_ASN_OP_T(op, int) \ |
| DEFN_ASN_OP_T(op, const sc_bit &) |
| |
| sc_logic & |
| operator = (const sc_logic &a) |
| { |
| m_val = a.m_val; |
| return *this; |
| } |
| |
| sc_logic & |
| operator &= (const sc_logic &b) |
| { |
| m_val = and_table[m_val][b.m_val]; |
| return *this; |
| } |
| |
| sc_logic & |
| operator |= (const sc_logic &b) |
| { |
| m_val = or_table[m_val][b.m_val]; |
| return *this; |
| } |
| |
| sc_logic & |
| operator ^= (const sc_logic &b) |
| { |
| m_val = xor_table[m_val][b.m_val]; |
| return *this; |
| } |
| |
| DEFN_ASN_OP(=) |
| DEFN_ASN_OP(&=) |
| DEFN_ASN_OP(|=) |
| DEFN_ASN_OP(^=) |
| |
| #undef DEFN_ASN_OP_T |
| #undef DEFN_ASN_OP |
| |
| // bitwise operators and functions |
| friend const sc_logic operator & (const sc_logic &, const sc_logic &); |
| friend const sc_logic operator | (const sc_logic &, const sc_logic &); |
| friend const sc_logic operator ^ (const sc_logic &, const sc_logic &); |
| |
| // relational operators |
| friend bool operator == (const sc_logic &, const sc_logic &); |
| friend bool operator != (const sc_logic &, const sc_logic &); |
| |
| // bitwise complement |
| const sc_logic operator ~ () const { return sc_logic(not_table[m_val]); } |
| sc_logic & |
| b_not() |
| { |
| m_val = not_table[m_val]; |
| return *this; |
| } |
| |
| // explicit conversions |
| sc_logic_value_t value() const { return m_val; } |
| |
| bool is_01() const { return ((int)m_val == Log_0 || (int)m_val == Log_1); } |
| bool |
| to_bool() const |
| { |
| if (!is_01()) { |
| invalid_01(); |
| } |
| return ((int)m_val != Log_0); |
| } |
| |
| char to_char() const { return logic_to_char[m_val]; } |
| |
| // other methods |
| void print(::std::ostream &os=::std::cout) const { os << to_char(); } |
| void scan(::std::istream &is=::std::cin); |
| |
| // memory (de)allocation |
| // placement new |
| static void *operator new (std::size_t, void *p) { return p; } |
| static void * |
| operator new (std::size_t sz) |
| { |
| return sc_core::sc_mempool::allocate(sz); |
| } |
| static void |
| operator delete (void *p, std::size_t sz) |
| { |
| sc_core::sc_mempool::release(p, sz); |
| } |
| static void * |
| operator new [] (std::size_t sz) |
| { |
| return sc_core::sc_mempool::allocate(sz); |
| } |
| static void |
| operator delete [] (void *p, std::size_t sz) |
| { |
| sc_core::sc_mempool::release(p, sz); |
| } |
| |
| private: |
| sc_logic_value_t m_val; |
| |
| private: |
| // Disabled |
| explicit sc_logic(const char *); |
| sc_logic &operator = (const char *); |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| // bitwise operators |
| inline const sc_logic |
| operator & (const sc_logic &a, const sc_logic &b) |
| { |
| return sc_logic(sc_logic::and_table[a.m_val][b.m_val]); |
| } |
| |
| inline const sc_logic |
| operator | (const sc_logic &a, const sc_logic &b) |
| { |
| return sc_logic(sc_logic::or_table[a.m_val][b.m_val]); |
| } |
| |
| inline const sc_logic |
| operator ^ (const sc_logic &a, const sc_logic &b) |
| { |
| return sc_logic(sc_logic::xor_table[a.m_val][b.m_val]); |
| } |
| |
| #define DEFN_BIN_OP_T(ret,op,tp) \ |
| inline ret \ |
| operator op (const sc_logic &a, tp b) \ |
| { \ |
| return (a op sc_logic(b)); \ |
| } \ |
| inline ret \ |
| operator op (tp a, const sc_logic &b) \ |
| { \ |
| return (sc_logic(a) op b); \ |
| } |
| |
| #define DEFN_BIN_OP(ret, op) \ |
| DEFN_BIN_OP_T(ret, op, sc_logic_value_t) \ |
| DEFN_BIN_OP_T(ret, op, bool) \ |
| DEFN_BIN_OP_T(ret, op, char) \ |
| DEFN_BIN_OP_T(ret, op, int) |
| |
| DEFN_BIN_OP(const sc_logic, &) |
| DEFN_BIN_OP(const sc_logic, |) |
| DEFN_BIN_OP(const sc_logic, ^) |
| |
| // relational operators and functions |
| |
| inline bool |
| operator == (const sc_logic &a, const sc_logic &b) |
| { |
| return ((int)a.m_val == b.m_val); |
| } |
| |
| inline bool |
| operator != (const sc_logic &a, const sc_logic &b) |
| { |
| return ((int)a.m_val != b.m_val); |
| } |
| |
| DEFN_BIN_OP(bool, ==) |
| DEFN_BIN_OP(bool, !=) |
| |
| #undef DEFN_BIN_OP_T |
| #undef DEFN_BIN_OP |
| |
| // ---------------------------------------------------------------------------- |
| |
| inline ::std::ostream & |
| operator << (::std::ostream &os, const sc_logic &a) |
| { |
| a.print(os); |
| return os; |
| } |
| |
| inline ::std::istream & |
| operator >> (::std::istream &is, sc_logic &a) |
| { |
| a.scan(is); |
| return is; |
| } |
| |
| |
| extern const sc_logic SC_LOGIC_0; |
| extern const sc_logic SC_LOGIC_1; |
| extern const sc_logic SC_LOGIC_Z; |
| extern const sc_logic SC_LOGIC_X; |
| |
| // #ifdef SC_DT_DEPRECATED |
| extern const sc_logic sc_logic_0; |
| extern const sc_logic sc_logic_1; |
| extern const sc_logic sc_logic_Z; |
| extern const sc_logic sc_logic_X; |
| // #endif |
| |
| } // namespace sc_dt |
| |
| #endif // __SYSTEMC_EXT_DT_BIT_SC_LOGIC_HH__ |