summaryrefslogtreecommitdiff
path: root/src/systemc/ext/dt/fx/scfx_utils.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/ext/dt/fx/scfx_utils.hh')
-rw-r--r--src/systemc/ext/dt/fx/scfx_utils.hh493
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__