diff options
author | Gabe Black <gabeblack@google.com> | 2018-05-22 02:21:17 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-08-08 10:08:12 +0000 |
commit | 5ee040a534d422ee08918ef49d55620184df7120 (patch) | |
tree | 1688e050dec6abf1a36fc92070b151e6b0682fdd /src/systemc/ext/dt/fx/scfx_utils.hh | |
parent | 7adb1b250b712920ea5d685f146ad6df55346393 (diff) | |
download | gem5-5ee040a534d422ee08918ef49d55620184df7120.tar.xz |
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 <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc/ext/dt/fx/scfx_utils.hh')
-rw-r--r-- | src/systemc/ext/dt/fx/scfx_utils.hh | 493 |
1 files changed, 493 insertions, 0 deletions
diff --git a/src/systemc/ext/dt/fx/scfx_utils.hh b/src/systemc/ext/dt/fx/scfx_utils.hh new file mode 100644 index 000000000..37c57844c --- /dev/null +++ b/src/systemc/ext/dt/fx/scfx_utils.hh @@ -0,0 +1,493 @@ +/***************************************************************************** + + 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. + + *****************************************************************************/ + +/***************************************************************************** + + scfx_utils.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: scfx_utils.h,v $ +// Revision 1.2 2009/02/28 00:26:20 acg +// Andy Goodrich: bug fixes. +// +// Revision 1.1.1.1 2006/12/15 20:31:36 acg +// SystemC 2.2 +// +// Revision 1.3 2006/01/13 18:53:58 acg +// Andy Goodrich: added $Log command so that CVS comments are reproduced in +// the source. +// + +#ifndef __SYSTEMC_EXT_DT_FX_SCFX_UTILS_HH__ +#define __SYSTEMC_EXT_DT_FX_SCFX_UTILS_HH__ + +#include "sc_fxdefs.hh" +#include "scfx_params.hh" +#include "scfx_string.hh" + +namespace sc_dt +{ + +// ---------------------------------------------------------------------------- +// Find the most and least significant non-zero bits in a unsigned long +// ---------------------------------------------------------------------------- + +#define MSB_STATEMENT(n) if (x >> n) { x >>= n; i += n; } + +inline int +scfx_find_msb(unsigned long x) +{ + int i = 0; +# if defined(SC_LONG_64) + MSB_STATEMENT(32); +# endif // defined(SC_LONG_64) + MSB_STATEMENT(16); + MSB_STATEMENT(8); + MSB_STATEMENT(4); + MSB_STATEMENT(2); + MSB_STATEMENT(1); + return i; +} + +#undef MSB_STATEMENT + +#define LSB_STATEMENT(n) if (x << n) { x <<= n; i -= n; } + +inline int +scfx_find_lsb(unsigned long x) +{ + int i; +# if defined(SC_LONG_64) + i = 63; + LSB_STATEMENT(32); +# else + i = 31; +# endif // defined(SC_LONG_64) + LSB_STATEMENT(16); + LSB_STATEMENT(8); + LSB_STATEMENT(4); + LSB_STATEMENT(2); + LSB_STATEMENT(1); + return i; +} + +#undef LSB_STATEMENT + + +// ---------------------------------------------------------------------------- +// Utilities for parsing a character string number +// ---------------------------------------------------------------------------- + +inline int +scfx_parse_sign(const char *&s, bool &sign_char) +{ + int sign = 1; + + if (*s == '+') { + ++s; + sign_char = true; + } else if (*s == '-' ) { + sign = -1; + ++s; + sign_char = true; + } else { + sign_char = false; + } + + return sign; +} + +inline sc_numrep +scfx_parse_prefix(const char *&s) +{ + if (s[0] == '0') { + switch (s[1]) { + case 'b': + case 'B': + { + if ((s[2] == 'u' || s[2] == 'U') && + (s[3] == 's' || s[3] == 'S')) { + s += 4; + return SC_BIN_US; + } + if ((s[2] == 's' || s[2] == 'S') && + (s[3] == 'm' || s[3] == 'M')) { + s += 4; + return SC_BIN_SM; + } + s += 2; + return SC_BIN; + } + case 'o': + case 'O': + { + if ((s[2] == 'u' || s[2] == 'U') && + (s[3] == 's' || s[3] == 'S')) { + s += 4; + return SC_OCT_US; + } + if ((s[2] == 's' || s[2] == 'S') && + (s[3] == 'm' || s[3] == 'M')) { + s += 4; + return SC_OCT_SM; + } + s += 2; + return SC_OCT; + } + case 'x': + case 'X': + { + if ((s[2] == 'u' || s[2] == 'U') && + (s[3] == 's' || s[3] == 'S')) { + s += 4; + return SC_HEX_US; + } + if ((s[2] == 's' || s[2] == 'S') && + (s[3] == 'm' || s[3] == 'M')) { + s += 4; + return SC_HEX_SM; + } + s += 2; + return SC_HEX; + } + case 'd': + case 'D': + { + s += 2; + return SC_DEC; + } + case 'c': + case 'C': + { + if ((s[2] == 's' || s[2] == 'S') && + (s[3] == 'd' || s[3] == 'D')) { + s += 4; + return SC_CSD; + } + break; + } + default: + break; + } + } + + return SC_DEC; +} + +inline int +scfx_parse_base(const char *&s) +{ + const char *s1 = s + 1; + + int base = 10; + + if (*s == '0') { + switch (*s1) { + case 'b': + case 'B': base = 2; s += 2; break; + case 'o': + case 'O': base = 8; s += 2; break; + case 'd': + case 'D': base = 10; s += 2; break; + case 'x': + case 'X': base = 16; s += 2; break; + } + } + + return base; +} + +inline bool +scfx_is_equal(const char *a, const char *b) +{ + while (*a != 0 && *b != 0 && *a == *b) { + ++ a; + ++ b; + } + return (*a == 0 && *b == 0); +} + +inline bool +scfx_is_nan(const char *s) +{ + return scfx_is_equal(s, "NaN"); +} + +inline bool +scfx_is_inf(const char *s) +{ + return (scfx_is_equal(s, "Inf") || scfx_is_equal(s, "Infinity")); +} + +inline bool +scfx_exp_start(const char *s) +{ + if (*s == 'e' || *s == 'E') { + ++s; + if (*s == '+' || *s == '-') + return true; + } + return false; +} + +inline bool +scfx_is_digit(char c, sc_numrep numrep) +{ + bool is_digit; + + switch(numrep) { + case SC_DEC: + { + switch(c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + is_digit = true; + break; + } + default: + is_digit = false; + } + break; + } + case SC_BIN: + case SC_BIN_US: + case SC_BIN_SM: + { + switch(c) { + case '0': case '1': + { + is_digit = true; + break; + } + default: + is_digit = false; + } + break; + } + case SC_OCT: + case SC_OCT_US: + case SC_OCT_SM: + { + switch(c) { + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + { + is_digit = true; + break; + } + default: + is_digit = false; + } + break; + } + case SC_HEX: + case SC_HEX_US: + case SC_HEX_SM: + { + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + { + is_digit = true; + break; + } + default: + is_digit = false; + } + break; + } + case SC_CSD: + { + switch (c) { + case '0': case '1': case '-': + { + is_digit = true; + break; + } + default: + is_digit = false; + } + break; + } + default: + is_digit = false; + } + + return is_digit; +} + +inline int +scfx_to_digit(char c, sc_numrep numrep) +{ + int to_digit; + + switch (numrep) { + case SC_DEC: + case SC_BIN: + case SC_BIN_US: + case SC_BIN_SM: + case SC_OCT: + case SC_OCT_US: + case SC_OCT_SM: + { + to_digit = c - '0'; + break; + } + case SC_HEX: + case SC_HEX_US: + case SC_HEX_SM: + { + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + to_digit = c - '0'; + break; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + to_digit = c - 'a' + 10; + break; + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + to_digit = c - 'A' + 10; + break; + default: + to_digit = -2; + } + break; + } + case SC_CSD: + { + if (c == '-') + to_digit = -1; + else + to_digit = c - '0'; + break; + } + default: + to_digit = -2; + } + + return to_digit; +} + + +// ---------------------------------------------------------------------------- +// Utilities for printing a character string number +// ---------------------------------------------------------------------------- + +inline void scfx_print_nan(scfx_string &s) { s += "NaN"; } +inline void +scfx_print_inf(scfx_string &s, bool negative) +{ + if (negative) + s += "-Inf"; + else + s += "Inf"; +} + +inline void +scfx_print_prefix(scfx_string &s, sc_numrep numrep) +{ + switch (numrep) { + case SC_DEC: + s += "0d"; + break; + case SC_BIN: + s += "0b"; + break; + case SC_BIN_US: + s += "0bus"; + break; + case SC_BIN_SM: + s += "0bsm"; + break; + case SC_OCT: + s += "0o"; + break; + case SC_OCT_US: + s += "0ous"; + break; + case SC_OCT_SM: + s += "0osm"; + break; + case SC_HEX: + s += "0x"; + break; + case SC_HEX_US: + s += "0xus"; + break; + case SC_HEX_SM: + s += "0xsm"; + break; + case SC_CSD: + s += "0csd"; + break; + default: + s += "unknown"; + } +} + +inline void +scfx_print_exp(scfx_string &s, int exp) +{ + if (exp != 0) { + s += 'e'; + + if (exp < 0) { + exp = - exp; + s += '-'; + } else { + s += '+'; + } + + bool first = true; + int scale = 1000000000; + do { + int digit = exp / scale; + exp = exp % scale; + if (digit != 0 || !first) { + s += static_cast<char>(digit + '0'); + first = false; + } + scale /= 10; + } + while (scale > 0); + } +} + +void scfx_tc2csd(scfx_string &, int); +void scfx_csd2tc(scfx_string &); + +} // namespace sc_dt + +#endif // __SYSTEMC_EXT_DT_FX_SCFX_UTILS_HH__ |