From 5ee040a534d422ee08918ef49d55620184df7120 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 22 May 2018 02:21:17 -0700 Subject: Systemc: Port over all of the systemc "datatype" headers. These are the headers originally written by Accellera with a few modifications. Most significantly, I went through and mostly (but not entirely) manually editted them to conform to gem5 style and to be more self consistent. Second, I resolved some macros which optionally select features. I removed support for deprecated functions, and otherwise enabled everything. The actual implementation behind these headers will also be ported over, but in a subsequent change. Change-Id: I203d3f6c8a3af9120b946001d01defbb0643a6b6 Reviewed-on: https://gem5-review.googlesource.com/10843 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/ext/dt/fx/sc_fixed.hh | 586 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 586 insertions(+) create mode 100644 src/systemc/ext/dt/fx/sc_fixed.hh (limited to 'src/systemc/ext/dt/fx/sc_fixed.hh') diff --git a/src/systemc/ext/dt/fx/sc_fixed.hh b/src/systemc/ext/dt/fx/sc_fixed.hh new file mode 100644 index 000000000..2f8e7a52e --- /dev/null +++ b/src/systemc/ext/dt/fx/sc_fixed.hh @@ -0,0 +1,586 @@ +/***************************************************************************** + + 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_fixed.h - + + Original Author: Martin Janssen, Synopsys, Inc. + + *****************************************************************************/ + +/***************************************************************************** + + MODIFICATION LOG - modifiers, enter your name, affiliation, date and + changes you are making here. + + Name, Affiliation, Date: + Description of Modification: + + *****************************************************************************/ + +// $Log: sc_fixed.h,v $ +// Revision 1.2 2011/01/19 18:57:40 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.3 2006/01/13 18:53:57 acg +// Andy Goodrich: added $Log command so that CVS comments are reproduced in +// the source. +// + +#ifndef __SYSTEMC_EXT_DT_FX_SC_FIXED_HH__ +#define __SYSTEMC_EXT_DT_FX_SC_FIXED_HH__ + +#include "sc_fix.hh" + +namespace sc_dt +{ + +// classes defined in this module +template +class sc_fixed; +template +class sc_fixed_fast; + +// ---------------------------------------------------------------------------- +// TEMPLATE CLASS : sc_fixed +// +// "Constrained" signed fixed-point class; arbitrary precision. +// ---------------------------------------------------------------------------- + +template +class sc_fixed : public sc_fix +{ + public: + // constructors + explicit sc_fixed(sc_fxnum_observer * =0); + explicit sc_fixed(const sc_fxcast_switch &, sc_fxnum_observer * =0); + +#define DECL_CTORS_T_A(tp) \ + sc_fixed(tp, sc_fxnum_observer * =0); \ + sc_fixed(tp, const sc_fxcast_switch &, sc_fxnum_observer * =0); + +#define DECL_CTORS_T_B(tp) \ + explicit sc_fixed(tp, sc_fxnum_observer * =0); \ + sc_fixed(tp, const sc_fxcast_switch &, sc_fxnum_observer * =0); + + DECL_CTORS_T_A(int) + DECL_CTORS_T_A(unsigned int) + DECL_CTORS_T_A(long) + DECL_CTORS_T_A(unsigned long) + DECL_CTORS_T_A(float) + DECL_CTORS_T_A(double) + DECL_CTORS_T_A(const char *) + DECL_CTORS_T_A(const sc_fxval &) + DECL_CTORS_T_A(const sc_fxval_fast &) + DECL_CTORS_T_A(const sc_fxnum &) + DECL_CTORS_T_A(const sc_fxnum_fast &) + + DECL_CTORS_T_B(int64) + DECL_CTORS_T_B(uint64) + DECL_CTORS_T_B(const sc_int_base&) + DECL_CTORS_T_B(const sc_uint_base&) + DECL_CTORS_T_B(const sc_signed&) + DECL_CTORS_T_B(const sc_unsigned&) + +#undef DECL_CTORS_T_A +#undef DECL_CTORS_T_B + + // copy constructor + sc_fixed(const sc_fixed &); + + // assignment operators + sc_fixed &operator = (const sc_fixed &); + +#define DECL_ASN_OP_T(op, tp) sc_fixed &operator op (tp); + +#define DECL_ASN_OP_OTHER(op) \ + DECL_ASN_OP_T(op, int64) \ + DECL_ASN_OP_T(op, uint64) \ + DECL_ASN_OP_T(op, const sc_int_base&) \ + DECL_ASN_OP_T(op, const sc_uint_base&) \ + DECL_ASN_OP_T(op, const sc_signed&) \ + DECL_ASN_OP_T(op, const sc_unsigned&) + +#define DECL_ASN_OP(op) \ + DECL_ASN_OP_T(op, int) \ + DECL_ASN_OP_T(op, unsigned int) \ + DECL_ASN_OP_T(op, long) \ + DECL_ASN_OP_T(op, unsigned long) \ + DECL_ASN_OP_T(op, float) \ + DECL_ASN_OP_T(op, double) \ + DECL_ASN_OP_T(op, const char *) \ + DECL_ASN_OP_T(op, const sc_fxval &) \ + DECL_ASN_OP_T(op, const sc_fxval_fast &) \ + DECL_ASN_OP_T(op, const sc_fxnum &) \ + DECL_ASN_OP_T(op, const sc_fxnum_fast &) \ + DECL_ASN_OP_OTHER(op) + + DECL_ASN_OP(=) + + DECL_ASN_OP(*=) + DECL_ASN_OP(/=) + DECL_ASN_OP(+=) + DECL_ASN_OP(-=) + + DECL_ASN_OP_T(<<=, int) + DECL_ASN_OP_T(>>=, int) + + DECL_ASN_OP_T(&=, const sc_fix &) + DECL_ASN_OP_T(&=, const sc_fix_fast &) + DECL_ASN_OP_T(|=, const sc_fix &) + DECL_ASN_OP_T(|=, const sc_fix_fast &) + DECL_ASN_OP_T(^=, const sc_fix &) + DECL_ASN_OP_T(^=, const sc_fix_fast &) + +#undef DECL_ASN_OP_T +#undef DECL_ASN_OP_OTHER +#undef DECL_ASN_OP + + // auto-increment and auto-decrement + const sc_fxval operator ++ (int); + const sc_fxval operator -- (int); + + sc_fixed & operator ++ (); + sc_fixed & operator -- (); +}; + + +// ---------------------------------------------------------------------------- +// TEMPLATE CLASS : sc_fixed_fast +// +// "Constrained" signed fixed-point class; limited precision. +// ---------------------------------------------------------------------------- + +template +class sc_fixed_fast : public sc_fix_fast +{ + public: + // constructors + explicit sc_fixed_fast(sc_fxnum_fast_observer * =0); + explicit sc_fixed_fast(const sc_fxcast_switch &, + sc_fxnum_fast_observer * =0); + +#define DECL_CTORS_T_A(tp) \ + sc_fixed_fast(tp, sc_fxnum_fast_observer * =0); \ + sc_fixed_fast(tp, const sc_fxcast_switch &, \ + sc_fxnum_fast_observer * =0); + +#define DECL_CTORS_T_B(tp) \ + explicit sc_fixed_fast(tp, sc_fxnum_fast_observer * =0); \ + sc_fixed_fast(tp, const sc_fxcast_switch &, \ + sc_fxnum_fast_observer * =0); + + DECL_CTORS_T_A(int) + DECL_CTORS_T_A(unsigned int) + DECL_CTORS_T_A(long) + DECL_CTORS_T_A(unsigned long) + DECL_CTORS_T_A(float) + DECL_CTORS_T_A(double) + DECL_CTORS_T_A(const char *) + DECL_CTORS_T_A(const sc_fxval &) + DECL_CTORS_T_A(const sc_fxval_fast &) + DECL_CTORS_T_A(const sc_fxnum &) + DECL_CTORS_T_A(const sc_fxnum_fast &) + + DECL_CTORS_T_B(int64) + DECL_CTORS_T_B(uint64) + DECL_CTORS_T_B(const sc_int_base &) + DECL_CTORS_T_B(const sc_uint_base &) + DECL_CTORS_T_B(const sc_signed &) + DECL_CTORS_T_B(const sc_unsigned &) + +#undef DECL_CTORS_T_A +#undef DECL_CTORS_T_B + + // copy constructor + sc_fixed_fast(const sc_fixed_fast &); + + // assignment operators + sc_fixed_fast &operator = (const sc_fixed_fast &); + +#define DECL_ASN_OP_T(op, tp) sc_fixed_fast &operator op (tp); + +#define DECL_ASN_OP_OTHER(op) \ + DECL_ASN_OP_T(op, int64) \ + DECL_ASN_OP_T(op, uint64) \ + DECL_ASN_OP_T(op, const sc_int_base &) \ + DECL_ASN_OP_T(op, const sc_uint_base &) \ + DECL_ASN_OP_T(op, const sc_signed &) \ + DECL_ASN_OP_T(op, const sc_unsigned &) + +#define DECL_ASN_OP(op) \ + DECL_ASN_OP_T(op, int) \ + DECL_ASN_OP_T(op, unsigned int) \ + DECL_ASN_OP_T(op, long) \ + DECL_ASN_OP_T(op, unsigned long) \ + DECL_ASN_OP_T(op, float) \ + DECL_ASN_OP_T(op, double) \ + DECL_ASN_OP_T(op, const char *) \ + DECL_ASN_OP_T(op, const sc_fxval &) \ + DECL_ASN_OP_T(op, const sc_fxval_fast &) \ + DECL_ASN_OP_T(op, const sc_fxnum &) \ + DECL_ASN_OP_T(op, const sc_fxnum_fast &) \ + DECL_ASN_OP_OTHER(op) + + DECL_ASN_OP(=) + + DECL_ASN_OP(*=) + DECL_ASN_OP(/=) + DECL_ASN_OP(+=) + DECL_ASN_OP(-=) + + DECL_ASN_OP_T(<<=, int) + DECL_ASN_OP_T(>>=, int) + + DECL_ASN_OP_T(&=, const sc_fix &) + DECL_ASN_OP_T(&=, const sc_fix_fast &) + DECL_ASN_OP_T(|=, const sc_fix &) + DECL_ASN_OP_T(|=, const sc_fix_fast &) + DECL_ASN_OP_T(^=, const sc_fix &) + DECL_ASN_OP_T(^=, const sc_fix_fast &) + +#undef DECL_ASN_OP_T +#undef DECL_ASN_OP_OTHER +#undef DECL_ASN_OP + + // auto-increment and auto-decrement + const sc_fxval_fast operator ++ (int); + const sc_fxval_fast operator -- (int); + + sc_fixed_fast& operator ++ (); + sc_fixed_fast& operator -- (); +}; + + +// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + +// ---------------------------------------------------------------------------- +// TEMPLATE CLASS : sc_fixed +// +// "Constrained" signed fixed-point class; arbitrary precision. +// ---------------------------------------------------------------------------- + +template +inline sc_fixed::sc_fixed(sc_fxnum_observer *observer_) : + sc_fix(W, I, Q, O, N, observer_) +{} + +template +inline sc_fixed::sc_fixed( + const sc_fxcast_switch &cast_sw, sc_fxnum_observer *observer_) : + sc_fix(W, I, Q, O, N, cast_sw, observer_) +{} + +#define DEFN_CTORS_T(tp) \ +template \ +inline sc_fixed::sc_fixed( \ + tp a, sc_fxnum_observer* observer_) : \ + sc_fix(a, W, I, Q, O, N, observer_) \ +{} \ + \ +template \ +inline sc_fixed::sc_fixed( \ + tp a, const sc_fxcast_switch &cast_sw, \ + sc_fxnum_observer *observer_) : \ + sc_fix(a, W, I, Q, O, N, cast_sw, observer_) \ +{} + +DEFN_CTORS_T(int) +DEFN_CTORS_T(unsigned int) +DEFN_CTORS_T(long) +DEFN_CTORS_T(unsigned long) +DEFN_CTORS_T(float) +DEFN_CTORS_T(double) +DEFN_CTORS_T(const char *) +DEFN_CTORS_T(const sc_fxval &) +DEFN_CTORS_T(const sc_fxval_fast &) +DEFN_CTORS_T(const sc_fxnum &) +DEFN_CTORS_T(const sc_fxnum_fast &) + +DEFN_CTORS_T(int64) +DEFN_CTORS_T(uint64) +DEFN_CTORS_T(const sc_int_base &) +DEFN_CTORS_T(const sc_uint_base &) +DEFN_CTORS_T(const sc_signed &) +DEFN_CTORS_T(const sc_unsigned &) + +#undef DEFN_CTORS_T + +// copy constructor +template +inline sc_fixed::sc_fixed(const sc_fixed &a) : + sc_fix(a, W, I, Q, O, N) +{} + +// assignment operators +template +inline sc_fixed & +sc_fixed::operator = (const sc_fixed &a) +{ + sc_fix::operator = (a); + return *this; +} + +#define DEFN_ASN_OP_T(op, tp) \ +template \ +inline sc_fixed & \ +sc_fixed::operator op (tp a) \ +{ \ + sc_fix::operator op (a); \ + return *this; \ +} + +#define DEFN_ASN_OP_OTHER(op) \ +DEFN_ASN_OP_T(op, int64) \ +DEFN_ASN_OP_T(op, uint64) \ +DEFN_ASN_OP_T(op, const sc_int_base &) \ +DEFN_ASN_OP_T(op, const sc_uint_base &) \ +DEFN_ASN_OP_T(op, const sc_signed &) \ +DEFN_ASN_OP_T(op, const sc_unsigned &) + +#define DEFN_ASN_OP(op) \ +DEFN_ASN_OP_T(op, int) \ +DEFN_ASN_OP_T(op, unsigned int) \ +DEFN_ASN_OP_T(op, long) \ +DEFN_ASN_OP_T(op, unsigned long) \ +DEFN_ASN_OP_T(op, float) \ +DEFN_ASN_OP_T(op, double) \ +DEFN_ASN_OP_T(op, const char *) \ +DEFN_ASN_OP_T(op, const sc_fxval &) \ +DEFN_ASN_OP_T(op, const sc_fxval_fast &) \ +DEFN_ASN_OP_T(op, const sc_fxnum &) \ +DEFN_ASN_OP_T(op, const sc_fxnum_fast &) \ +DEFN_ASN_OP_OTHER(op) + +DEFN_ASN_OP(=) + +DEFN_ASN_OP(*=) +DEFN_ASN_OP(/=) +DEFN_ASN_OP(+=) +DEFN_ASN_OP(-=) + +DEFN_ASN_OP_T(<<=, int) +DEFN_ASN_OP_T(>>=, int) + +DEFN_ASN_OP_T(&=, const sc_fix &) +DEFN_ASN_OP_T(&=, const sc_fix_fast &) +DEFN_ASN_OP_T(|=, const sc_fix &) +DEFN_ASN_OP_T(|=, const sc_fix_fast &) +DEFN_ASN_OP_T(^=, const sc_fix &) +DEFN_ASN_OP_T(^=, const sc_fix_fast &) + +#undef DEFN_ASN_OP_T +#undef DEFN_ASN_OP_OTHER +#undef DEFN_ASN_OP + +// auto-increment and auto-decrement +template +inline const sc_fxval +sc_fixed::operator ++ (int) +{ + return sc_fxval(sc_fix::operator ++ (0)); +} + +template +inline const sc_fxval +sc_fixed::operator -- (int) +{ + return sc_fxval(sc_fix::operator -- (0)); +} + +template +inline sc_fixed & +sc_fixed::operator ++ () +{ + sc_fix::operator ++ (); + return *this; +} + +template +inline sc_fixed & +sc_fixed::operator -- () +{ + sc_fix::operator -- (); + return *this; +} + + +// ---------------------------------------------------------------------------- +// TEMPLATE CLASS : sc_fixed_fast +// +// "Constrained" signed fixed-point class; limited precision. +// ---------------------------------------------------------------------------- + +template +inline sc_fixed_fast::sc_fixed_fast( + sc_fxnum_fast_observer *observer_) : + sc_fix_fast(W, I, Q, O, N, observer_) +{} + +template +inline sc_fixed_fast::sc_fixed_fast( + const sc_fxcast_switch &cast_sw, sc_fxnum_fast_observer *observer_) : + sc_fix_fast(W, I, Q, O, N, cast_sw, observer_) +{} + +#define DEFN_CTORS_T(tp) \ +template \ +inline sc_fixed_fast::sc_fixed_fast( \ + tp a, sc_fxnum_fast_observer *observer_) : \ + sc_fix_fast(a, W, I, Q, O, N, observer_) \ +{} \ + \ +template \ +inline sc_fixed_fast::sc_fixed_fast( \ + tp a, const sc_fxcast_switch &cast_sw, \ + sc_fxnum_fast_observer *observer_) : \ + sc_fix_fast(a, W, I, Q, O, N, cast_sw, observer_) \ +{} + +DEFN_CTORS_T(int) +DEFN_CTORS_T(unsigned int) +DEFN_CTORS_T(long) +DEFN_CTORS_T(unsigned long) +DEFN_CTORS_T(float) +DEFN_CTORS_T(double) +DEFN_CTORS_T(const char *) +DEFN_CTORS_T(const sc_fxval &) +DEFN_CTORS_T(const sc_fxval_fast &) +DEFN_CTORS_T(const sc_fxnum &) +DEFN_CTORS_T(const sc_fxnum_fast &) + +DEFN_CTORS_T(int64) +DEFN_CTORS_T(uint64) +DEFN_CTORS_T(const sc_int_base &) +DEFN_CTORS_T(const sc_uint_base &) +DEFN_CTORS_T(const sc_signed &) +DEFN_CTORS_T(const sc_unsigned &) + +#undef DEFN_CTORS_T + +// copy constructor +template +inline sc_fixed_fast::sc_fixed_fast( + const sc_fixed_fast &a) : sc_fix_fast(a, W, I, Q, O, N) +{} + +// assignment operators +template +inline sc_fixed_fast & +sc_fixed_fast::operator = ( + const sc_fixed_fast &a) +{ + sc_fix_fast::operator = (a); + return *this; +} + +#define DEFN_ASN_OP_T(op, tp) \ +template \ +inline sc_fixed_fast & \ +sc_fixed_fast::operator op (tp a) \ +{ \ + sc_fix_fast::operator op (a); \ + return *this; \ +} + +#define DEFN_ASN_OP_OTHER(op) \ +DEFN_ASN_OP_T(op, int64) \ +DEFN_ASN_OP_T(op, uint64) \ +DEFN_ASN_OP_T(op, const sc_int_base &) \ +DEFN_ASN_OP_T(op, const sc_uint_base &) \ +DEFN_ASN_OP_T(op, const sc_signed &) \ +DEFN_ASN_OP_T(op, const sc_unsigned &) + +#define DEFN_ASN_OP(op) \ +DEFN_ASN_OP_T(op, int) \ +DEFN_ASN_OP_T(op, unsigned int) \ +DEFN_ASN_OP_T(op, long) \ +DEFN_ASN_OP_T(op, unsigned long) \ +DEFN_ASN_OP_T(op, float) \ +DEFN_ASN_OP_T(op, double) \ +DEFN_ASN_OP_T(op, const char *) \ +DEFN_ASN_OP_T(op, const sc_fxval &) \ +DEFN_ASN_OP_T(op, const sc_fxval_fast &) \ +DEFN_ASN_OP_T(op, const sc_fxnum &) \ +DEFN_ASN_OP_T(op, const sc_fxnum_fast &) \ +DEFN_ASN_OP_OTHER(op) + +DEFN_ASN_OP(=) + +DEFN_ASN_OP(*=) +DEFN_ASN_OP(/=) +DEFN_ASN_OP(+=) +DEFN_ASN_OP(-=) + +DEFN_ASN_OP_T(<<=, int) +DEFN_ASN_OP_T(>>=, int) + +DEFN_ASN_OP_T(&=, const sc_fix &) +DEFN_ASN_OP_T(&=, const sc_fix_fast &) +DEFN_ASN_OP_T(|=, const sc_fix &) +DEFN_ASN_OP_T(|=, const sc_fix_fast &) +DEFN_ASN_OP_T(^=, const sc_fix &) +DEFN_ASN_OP_T(^=, const sc_fix_fast &) + +#undef DEFN_ASN_OP_T +#undef DEFN_ASN_OP_OTHER +#undef DEFN_ASN_OP + +// auto-increment and auto-decrement +template +inline const sc_fxval_fast +sc_fixed_fast::operator ++ (int) +{ + return sc_fxval_fast(sc_fix_fast::operator ++ (0)); +} + +template +inline const sc_fxval_fast +sc_fixed_fast::operator -- (int) +{ + return sc_fxval_fast(sc_fix_fast::operator -- (0)); +} + +template +inline sc_fixed_fast & +sc_fixed_fast::operator ++ () +{ + sc_fix_fast::operator ++ (); + return *this; +} + +template +inline sc_fixed_fast & +sc_fixed_fast::operator -- () +{ + sc_fix_fast::operator -- (); + return *this; +} + +} // namespace sc_dt + +#endif // __SYSTEMC_EXT_DT_FX_SC_FIXED_HH__ -- cgit v1.2.3