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