112853Sgabeblack@google.com/*****************************************************************************
212853Sgabeblack@google.com
312853Sgabeblack@google.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412853Sgabeblack@google.com  more contributor license agreements.  See the NOTICE file distributed
512853Sgabeblack@google.com  with this work for additional information regarding copyright ownership.
612853Sgabeblack@google.com  Accellera licenses this file to you under the Apache License, Version 2.0
712853Sgabeblack@google.com  (the "License"); you may not use this file except in compliance with the
812853Sgabeblack@google.com  License.  You may obtain a copy of the License at
912853Sgabeblack@google.com
1012853Sgabeblack@google.com    http://www.apache.org/licenses/LICENSE-2.0
1112853Sgabeblack@google.com
1212853Sgabeblack@google.com  Unless required by applicable law or agreed to in writing, software
1312853Sgabeblack@google.com  distributed under the License is distributed on an "AS IS" BASIS,
1412853Sgabeblack@google.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512853Sgabeblack@google.com  implied.  See the License for the specific language governing
1612853Sgabeblack@google.com  permissions and limitations under the License.
1712853Sgabeblack@google.com
1812853Sgabeblack@google.com *****************************************************************************/
1912853Sgabeblack@google.com
2012853Sgabeblack@google.com/*****************************************************************************
2112853Sgabeblack@google.com
2212853Sgabeblack@google.com  sc_logic.h -- C++ implementation of logic type. Behaves
2312853Sgabeblack@google.com                pretty much the same way as HDLs except with 4 values.
2412853Sgabeblack@google.com
2512853Sgabeblack@google.com  Original Author: Stan Y. Liao, Synopsys, Inc.
2612853Sgabeblack@google.com
2712853Sgabeblack@google.com *****************************************************************************/
2812853Sgabeblack@google.com
2912853Sgabeblack@google.com/*****************************************************************************
3012853Sgabeblack@google.com
3112853Sgabeblack@google.com  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3212853Sgabeblack@google.com  changes you are making here.
3312853Sgabeblack@google.com
3412853Sgabeblack@google.com      Name, Affiliation, Date:
3512853Sgabeblack@google.com  Description of Modification:
3612853Sgabeblack@google.com
3712853Sgabeblack@google.com *****************************************************************************/
3812853Sgabeblack@google.com
3912853Sgabeblack@google.com// $Log: sc_logic.h,v $
4012853Sgabeblack@google.com// Revision 1.3  2011/08/07 18:54:19  acg
4112853Sgabeblack@google.com//  Philipp A. Hartmann: remove friend function declarations that implement
4212853Sgabeblack@google.com//  code, and clean up how bit and logic operators are defined in general.
4312853Sgabeblack@google.com//
4412853Sgabeblack@google.com// Revision 1.2  2011/01/25 20:50:37  acg
4512853Sgabeblack@google.com//  Andy Goodrich: changes for IEEE 1666 2011.
4612853Sgabeblack@google.com//
4712853Sgabeblack@google.com// Revision 1.1.1.1  2006/12/15 20:20:04  acg
4812853Sgabeblack@google.com// SystemC 2.3
4912853Sgabeblack@google.com//
5012853Sgabeblack@google.com// Revision 1.5  2006/12/02 21:00:57  acg
5112853Sgabeblack@google.com//  Andy Goodrich: fixes for concatenation support.
5212853Sgabeblack@google.com//
5312853Sgabeblack@google.com// Revision 1.4  2006/05/08 17:49:59  acg
5412853Sgabeblack@google.com//   Andy Goodrich: Added David Long's declarations for friend operators,
5512853Sgabeblack@google.com//   functions, and methods, to keep the Microsoft compiler happy.
5612853Sgabeblack@google.com//
5712853Sgabeblack@google.com// Revision 1.3  2006/01/13 18:53:53  acg
5812853Sgabeblack@google.com// Andy Goodrich: added $Log command so that CVS comments are reproduced in
5912853Sgabeblack@google.com// the source.
6012853Sgabeblack@google.com//
6112853Sgabeblack@google.com
6212853Sgabeblack@google.com#ifndef __SYSTEMC_EXT_DT_BIT_SC_LOGIC_HH__
6312853Sgabeblack@google.com#define __SYSTEMC_EXT_DT_BIT_SC_LOGIC_HH__
6412853Sgabeblack@google.com
6512853Sgabeblack@google.com#include <cstdio>
6612853Sgabeblack@google.com#include <iostream>
6712853Sgabeblack@google.com
6812853Sgabeblack@google.com#include "../sc_mempool.hh"
6912853Sgabeblack@google.com#include "sc_bit.hh"
7012853Sgabeblack@google.com
7112853Sgabeblack@google.comnamespace sc_dt
7212853Sgabeblack@google.com{
7312853Sgabeblack@google.com
7412853Sgabeblack@google.com// classes defined in this module
7512853Sgabeblack@google.comclass sc_logic;
7612853Sgabeblack@google.com
7712853Sgabeblack@google.com
7812853Sgabeblack@google.com// ----------------------------------------------------------------------------
7912853Sgabeblack@google.com//  ENUM : sc_logic_value_t
8012853Sgabeblack@google.com//
8112853Sgabeblack@google.com//  Enumeration of values for sc_logic.
8212853Sgabeblack@google.com// ----------------------------------------------------------------------------
8312853Sgabeblack@google.com
8412853Sgabeblack@google.comenum sc_logic_value_t
8512853Sgabeblack@google.com{
8612853Sgabeblack@google.com    Log_0 = 0,
8712853Sgabeblack@google.com    Log_1,
8812853Sgabeblack@google.com    Log_Z,
8912853Sgabeblack@google.com    Log_X
9012853Sgabeblack@google.com};
9112853Sgabeblack@google.com
9212853Sgabeblack@google.com// ----------------------------------------------------------------------------
9312853Sgabeblack@google.com//  CLASS : sc_logic
9412853Sgabeblack@google.com//
9512853Sgabeblack@google.com//  Four-valued logic type.
9612853Sgabeblack@google.com// ----------------------------------------------------------------------------
9712853Sgabeblack@google.com
9812853Sgabeblack@google.comclass sc_logic
9912853Sgabeblack@google.com{
10012853Sgabeblack@google.com  private:
10112853Sgabeblack@google.com    // support methods
10212853Sgabeblack@google.com    static void invalid_value(sc_logic_value_t);
10312853Sgabeblack@google.com    static void invalid_value(char);
10412853Sgabeblack@google.com    static void invalid_value(int);
10512853Sgabeblack@google.com
10612853Sgabeblack@google.com    static sc_logic_value_t
10712853Sgabeblack@google.com    to_value(sc_logic_value_t v)
10812853Sgabeblack@google.com    {
10912853Sgabeblack@google.com        if (v < Log_0 || v > Log_X) {
11012853Sgabeblack@google.com            invalid_value(v);
11112853Sgabeblack@google.com            // may continue, if suppressed
11212853Sgabeblack@google.com            v = Log_X;
11312853Sgabeblack@google.com        }
11412853Sgabeblack@google.com        return v;
11512853Sgabeblack@google.com    }
11612853Sgabeblack@google.com
11712853Sgabeblack@google.com    static sc_logic_value_t to_value(bool b) { return (b ? Log_1 : Log_0); }
11812853Sgabeblack@google.com
11912853Sgabeblack@google.com    static sc_logic_value_t
12012853Sgabeblack@google.com    to_value(char c)
12112853Sgabeblack@google.com    {
12212853Sgabeblack@google.com        unsigned int index = (int)c;
12312853Sgabeblack@google.com        if (index > 127) {
12412853Sgabeblack@google.com            invalid_value(c);
12512853Sgabeblack@google.com            // may continue, if suppressed
12612853Sgabeblack@google.com            index = 127; // aka Log_X
12712853Sgabeblack@google.com        }
12812853Sgabeblack@google.com        return char_to_logic[index];
12912853Sgabeblack@google.com    }
13012853Sgabeblack@google.com
13112853Sgabeblack@google.com    static sc_logic_value_t
13212853Sgabeblack@google.com    to_value(int i)
13312853Sgabeblack@google.com    {
13412853Sgabeblack@google.com        if (i < Log_0 || i > Log_X) {
13512853Sgabeblack@google.com            invalid_value(i);
13612853Sgabeblack@google.com            // may continue, if suppressed
13712853Sgabeblack@google.com            i = Log_X;
13812853Sgabeblack@google.com        }
13912853Sgabeblack@google.com        return sc_logic_value_t(i);
14012853Sgabeblack@google.com    }
14112853Sgabeblack@google.com
14212853Sgabeblack@google.com    void invalid_01() const;
14312853Sgabeblack@google.com
14412853Sgabeblack@google.com  public:
14512853Sgabeblack@google.com    // conversion tables
14612853Sgabeblack@google.com    static const sc_logic_value_t char_to_logic[128];
14712853Sgabeblack@google.com    static const char logic_to_char[4];
14812853Sgabeblack@google.com    static const sc_logic_value_t and_table[4][4];
14912853Sgabeblack@google.com    static const sc_logic_value_t or_table[4][4];
15012853Sgabeblack@google.com    static const sc_logic_value_t xor_table[4][4];
15112853Sgabeblack@google.com    static const sc_logic_value_t not_table[4];
15212853Sgabeblack@google.com
15312853Sgabeblack@google.com    // constructors
15412853Sgabeblack@google.com    sc_logic() : m_val(Log_X) {}
15512853Sgabeblack@google.com    sc_logic(const sc_logic &a) : m_val(a.m_val) {}
15612853Sgabeblack@google.com    sc_logic(sc_logic_value_t v) : m_val(to_value(v)) {}
15712853Sgabeblack@google.com    explicit sc_logic(bool a) : m_val(to_value(a)) {}
15812853Sgabeblack@google.com    explicit sc_logic(char a) : m_val(to_value(a)) {}
15912853Sgabeblack@google.com    explicit sc_logic(int a) : m_val(to_value(a)) {}
16012853Sgabeblack@google.com    explicit sc_logic(const sc_bit &a) : m_val(to_value(a.to_bool())) {}
16112853Sgabeblack@google.com
16212853Sgabeblack@google.com    // destructor
16312853Sgabeblack@google.com    ~sc_logic() {}
16412853Sgabeblack@google.com
16512853Sgabeblack@google.com    // (bitwise) assignment operators
16612853Sgabeblack@google.com#define DEFN_ASN_OP_T(op,tp) \
16712853Sgabeblack@google.com    sc_logic & \
16812853Sgabeblack@google.com    operator op (tp v) \
16912853Sgabeblack@google.com    { \
17012853Sgabeblack@google.com        *this op sc_logic(v); \
17112853Sgabeblack@google.com        return *this; \
17212853Sgabeblack@google.com    }
17312853Sgabeblack@google.com
17412853Sgabeblack@google.com#define DEFN_ASN_OP(op) \
17512853Sgabeblack@google.com    DEFN_ASN_OP_T(op, sc_logic_value_t) \
17612853Sgabeblack@google.com    DEFN_ASN_OP_T(op, bool) \
17712853Sgabeblack@google.com    DEFN_ASN_OP_T(op, char) \
17812853Sgabeblack@google.com    DEFN_ASN_OP_T(op, int) \
17912853Sgabeblack@google.com    DEFN_ASN_OP_T(op, const sc_bit &)
18012853Sgabeblack@google.com
18112853Sgabeblack@google.com    sc_logic &
18212853Sgabeblack@google.com    operator = (const sc_logic &a)
18312853Sgabeblack@google.com    {
18412853Sgabeblack@google.com        m_val = a.m_val;
18512853Sgabeblack@google.com        return *this;
18612853Sgabeblack@google.com    }
18712853Sgabeblack@google.com
18812853Sgabeblack@google.com    sc_logic &
18912853Sgabeblack@google.com    operator &= (const sc_logic &b)
19012853Sgabeblack@google.com    {
19112853Sgabeblack@google.com        m_val = and_table[m_val][b.m_val];
19212853Sgabeblack@google.com        return *this;
19312853Sgabeblack@google.com    }
19412853Sgabeblack@google.com
19512853Sgabeblack@google.com    sc_logic &
19612853Sgabeblack@google.com    operator |= (const sc_logic &b)
19712853Sgabeblack@google.com    {
19812853Sgabeblack@google.com        m_val = or_table[m_val][b.m_val];
19912853Sgabeblack@google.com        return *this;
20012853Sgabeblack@google.com    }
20112853Sgabeblack@google.com
20212853Sgabeblack@google.com    sc_logic &
20312853Sgabeblack@google.com    operator ^= (const sc_logic &b)
20412853Sgabeblack@google.com    {
20512853Sgabeblack@google.com        m_val = xor_table[m_val][b.m_val];
20612853Sgabeblack@google.com        return *this;
20712853Sgabeblack@google.com    }
20812853Sgabeblack@google.com
20912853Sgabeblack@google.com    DEFN_ASN_OP(=)
21012853Sgabeblack@google.com    DEFN_ASN_OP(&=)
21112853Sgabeblack@google.com    DEFN_ASN_OP(|=)
21212853Sgabeblack@google.com    DEFN_ASN_OP(^=)
21312853Sgabeblack@google.com
21412853Sgabeblack@google.com#undef DEFN_ASN_OP_T
21512853Sgabeblack@google.com#undef DEFN_ASN_OP
21612853Sgabeblack@google.com
21712853Sgabeblack@google.com    // bitwise operators and functions
21812853Sgabeblack@google.com    friend const sc_logic operator & (const sc_logic &, const sc_logic &);
21912853Sgabeblack@google.com    friend const sc_logic operator | (const sc_logic &, const sc_logic &);
22012853Sgabeblack@google.com    friend const sc_logic operator ^ (const sc_logic &, const sc_logic &);
22112853Sgabeblack@google.com
22212853Sgabeblack@google.com    // relational operators
22312853Sgabeblack@google.com    friend bool operator == (const sc_logic &, const sc_logic &);
22412853Sgabeblack@google.com    friend bool operator != (const sc_logic &, const sc_logic &);
22512853Sgabeblack@google.com
22612853Sgabeblack@google.com    // bitwise complement
22712853Sgabeblack@google.com    const sc_logic operator ~ () const { return sc_logic(not_table[m_val]); }
22812853Sgabeblack@google.com    sc_logic &
22912853Sgabeblack@google.com    b_not()
23012853Sgabeblack@google.com    {
23112853Sgabeblack@google.com        m_val = not_table[m_val];
23212853Sgabeblack@google.com        return *this;
23312853Sgabeblack@google.com    }
23412853Sgabeblack@google.com
23512853Sgabeblack@google.com    // explicit conversions
23612853Sgabeblack@google.com    sc_logic_value_t value() const { return m_val; }
23712853Sgabeblack@google.com
23812853Sgabeblack@google.com    bool is_01() const { return ((int)m_val == Log_0 || (int)m_val == Log_1); }
23912853Sgabeblack@google.com    bool
24012853Sgabeblack@google.com    to_bool() const
24112853Sgabeblack@google.com    {
24212853Sgabeblack@google.com        if (!is_01()) {
24312853Sgabeblack@google.com            invalid_01();
24412853Sgabeblack@google.com        }
24512853Sgabeblack@google.com        return ((int)m_val != Log_0);
24612853Sgabeblack@google.com    }
24712853Sgabeblack@google.com
24812853Sgabeblack@google.com    char to_char() const { return logic_to_char[m_val]; }
24912853Sgabeblack@google.com
25012853Sgabeblack@google.com    // other methods
25112853Sgabeblack@google.com    void print(::std::ostream &os=::std::cout) const { os << to_char(); }
25212853Sgabeblack@google.com    void scan(::std::istream &is=::std::cin);
25312853Sgabeblack@google.com
25412853Sgabeblack@google.com    // memory (de)allocation
25512853Sgabeblack@google.com    // placement new
25612853Sgabeblack@google.com    static void *operator new (std::size_t, void *p) { return p; }
25712853Sgabeblack@google.com    static void *
25812853Sgabeblack@google.com    operator new (std::size_t sz)
25912853Sgabeblack@google.com    {
26012853Sgabeblack@google.com        return sc_core::sc_mempool::allocate(sz);
26112853Sgabeblack@google.com    }
26212853Sgabeblack@google.com    static void
26312853Sgabeblack@google.com    operator delete (void *p, std::size_t sz)
26412853Sgabeblack@google.com    {
26512853Sgabeblack@google.com        sc_core::sc_mempool::release(p, sz);
26612853Sgabeblack@google.com    }
26712853Sgabeblack@google.com    static void *
26812853Sgabeblack@google.com    operator new [] (std::size_t sz)
26912853Sgabeblack@google.com    {
27012853Sgabeblack@google.com        return sc_core::sc_mempool::allocate(sz);
27112853Sgabeblack@google.com    }
27212853Sgabeblack@google.com    static void
27312853Sgabeblack@google.com    operator delete [] (void *p, std::size_t sz)
27412853Sgabeblack@google.com    {
27512853Sgabeblack@google.com        sc_core::sc_mempool::release(p, sz);
27612853Sgabeblack@google.com    }
27712853Sgabeblack@google.com
27812853Sgabeblack@google.com  private:
27912853Sgabeblack@google.com    sc_logic_value_t m_val;
28012853Sgabeblack@google.com
28112853Sgabeblack@google.com  private:
28212853Sgabeblack@google.com    // Disabled
28312853Sgabeblack@google.com    explicit sc_logic(const char *);
28412853Sgabeblack@google.com    sc_logic &operator = (const char *);
28512853Sgabeblack@google.com};
28612853Sgabeblack@google.com
28712853Sgabeblack@google.com// ----------------------------------------------------------------------------
28812853Sgabeblack@google.com
28912853Sgabeblack@google.com// bitwise operators
29012853Sgabeblack@google.cominline const sc_logic
29112853Sgabeblack@google.comoperator & (const sc_logic &a, const sc_logic &b)
29212853Sgabeblack@google.com{
29312853Sgabeblack@google.com    return sc_logic(sc_logic::and_table[a.m_val][b.m_val]);
29412853Sgabeblack@google.com}
29512853Sgabeblack@google.com
29612853Sgabeblack@google.cominline const sc_logic
29712853Sgabeblack@google.comoperator | (const sc_logic &a, const sc_logic &b)
29812853Sgabeblack@google.com{
29912853Sgabeblack@google.com    return sc_logic(sc_logic::or_table[a.m_val][b.m_val]);
30012853Sgabeblack@google.com}
30112853Sgabeblack@google.com
30212853Sgabeblack@google.cominline const sc_logic
30312853Sgabeblack@google.comoperator ^ (const sc_logic &a, const sc_logic &b)
30412853Sgabeblack@google.com{
30512853Sgabeblack@google.com    return sc_logic(sc_logic::xor_table[a.m_val][b.m_val]);
30612853Sgabeblack@google.com}
30712853Sgabeblack@google.com
30812853Sgabeblack@google.com#define DEFN_BIN_OP_T(ret,op,tp) \
30912853Sgabeblack@google.com    inline ret \
31012853Sgabeblack@google.com    operator op (const sc_logic &a, tp b) \
31112853Sgabeblack@google.com    { \
31212853Sgabeblack@google.com        return (a op sc_logic(b)); \
31312853Sgabeblack@google.com    } \
31412853Sgabeblack@google.com    inline ret \
31512853Sgabeblack@google.com    operator op (tp a, const sc_logic &b) \
31612853Sgabeblack@google.com    { \
31712853Sgabeblack@google.com        return (sc_logic(a) op b); \
31812853Sgabeblack@google.com    }
31912853Sgabeblack@google.com
32012853Sgabeblack@google.com#define DEFN_BIN_OP(ret, op) \
32112853Sgabeblack@google.com    DEFN_BIN_OP_T(ret, op, sc_logic_value_t) \
32212853Sgabeblack@google.com    DEFN_BIN_OP_T(ret, op, bool) \
32312853Sgabeblack@google.com    DEFN_BIN_OP_T(ret, op, char) \
32412853Sgabeblack@google.com    DEFN_BIN_OP_T(ret, op, int)
32512853Sgabeblack@google.com
32612853Sgabeblack@google.comDEFN_BIN_OP(const sc_logic, &)
32712853Sgabeblack@google.comDEFN_BIN_OP(const sc_logic, |)
32812853Sgabeblack@google.comDEFN_BIN_OP(const sc_logic, ^)
32912853Sgabeblack@google.com
33012853Sgabeblack@google.com// relational operators and functions
33112853Sgabeblack@google.com
33212853Sgabeblack@google.cominline bool
33312853Sgabeblack@google.comoperator == (const sc_logic &a, const sc_logic &b)
33412853Sgabeblack@google.com{
33512853Sgabeblack@google.com    return ((int)a.m_val == b.m_val);
33612853Sgabeblack@google.com}
33712853Sgabeblack@google.com
33812853Sgabeblack@google.cominline bool
33912853Sgabeblack@google.comoperator != (const sc_logic &a, const sc_logic &b)
34012853Sgabeblack@google.com{
34112853Sgabeblack@google.com    return ((int)a.m_val != b.m_val);
34212853Sgabeblack@google.com}
34312853Sgabeblack@google.com
34412853Sgabeblack@google.comDEFN_BIN_OP(bool, ==)
34512853Sgabeblack@google.comDEFN_BIN_OP(bool, !=)
34612853Sgabeblack@google.com
34712853Sgabeblack@google.com#undef DEFN_BIN_OP_T
34812853Sgabeblack@google.com#undef DEFN_BIN_OP
34912853Sgabeblack@google.com
35012853Sgabeblack@google.com// ----------------------------------------------------------------------------
35112853Sgabeblack@google.com
35212853Sgabeblack@google.cominline ::std::ostream &
35312853Sgabeblack@google.comoperator << (::std::ostream &os, const sc_logic &a)
35412853Sgabeblack@google.com{
35512853Sgabeblack@google.com    a.print(os);
35612853Sgabeblack@google.com    return os;
35712853Sgabeblack@google.com}
35812853Sgabeblack@google.com
35912853Sgabeblack@google.cominline ::std::istream &
36012853Sgabeblack@google.comoperator >> (::std::istream &is, sc_logic &a)
36112853Sgabeblack@google.com{
36212853Sgabeblack@google.com    a.scan(is);
36312853Sgabeblack@google.com    return is;
36412853Sgabeblack@google.com}
36512853Sgabeblack@google.com
36612853Sgabeblack@google.com
36712853Sgabeblack@google.comextern const sc_logic SC_LOGIC_0;
36812853Sgabeblack@google.comextern const sc_logic SC_LOGIC_1;
36912853Sgabeblack@google.comextern const sc_logic SC_LOGIC_Z;
37012853Sgabeblack@google.comextern const sc_logic SC_LOGIC_X;
37112853Sgabeblack@google.com
37212853Sgabeblack@google.com// #ifdef SC_DT_DEPRECATED
37312853Sgabeblack@google.comextern const sc_logic sc_logic_0;
37412853Sgabeblack@google.comextern const sc_logic sc_logic_1;
37512853Sgabeblack@google.comextern const sc_logic sc_logic_Z;
37612853Sgabeblack@google.comextern const sc_logic sc_logic_X;
37712853Sgabeblack@google.com// #endif
37812853Sgabeblack@google.com
37912853Sgabeblack@google.com} // namespace sc_dt
38012853Sgabeblack@google.com
38112853Sgabeblack@google.com#endif // __SYSTEMC_EXT_DT_BIT_SC_LOGIC_HH__
382