scfx_utils.hh revision 12853
12810Srdreslin@umich.edu/*****************************************************************************
213732Snikos.nikoleris@arm.com
311051Sandreas.hansson@arm.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
411051Sandreas.hansson@arm.com  more contributor license agreements.  See the NOTICE file distributed
511051Sandreas.hansson@arm.com  with this work for additional information regarding copyright ownership.
611051Sandreas.hansson@arm.com  Accellera licenses this file to you under the Apache License, Version 2.0
711051Sandreas.hansson@arm.com  (the "License"); you may not use this file except in compliance with the
811051Sandreas.hansson@arm.com  License.  You may obtain a copy of the License at
911051Sandreas.hansson@arm.com
1011051Sandreas.hansson@arm.com    http://www.apache.org/licenses/LICENSE-2.0
1111051Sandreas.hansson@arm.com
1211051Sandreas.hansson@arm.com  Unless required by applicable law or agreed to in writing, software
1311051Sandreas.hansson@arm.com  distributed under the License is distributed on an "AS IS" BASIS,
1411051Sandreas.hansson@arm.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1511051Sandreas.hansson@arm.com  implied.  See the License for the specific language governing
162810Srdreslin@umich.edu  permissions and limitations under the License.
172810Srdreslin@umich.edu
182810Srdreslin@umich.edu *****************************************************************************/
192810Srdreslin@umich.edu
202810Srdreslin@umich.edu/*****************************************************************************
212810Srdreslin@umich.edu
222810Srdreslin@umich.edu  scfx_utils.h -
232810Srdreslin@umich.edu
242810Srdreslin@umich.edu  Original Author: Martin Janssen, Synopsys, Inc.
252810Srdreslin@umich.edu
262810Srdreslin@umich.edu *****************************************************************************/
272810Srdreslin@umich.edu
282810Srdreslin@umich.edu/*****************************************************************************
292810Srdreslin@umich.edu
302810Srdreslin@umich.edu  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
312810Srdreslin@umich.edu  changes you are making here.
322810Srdreslin@umich.edu
332810Srdreslin@umich.edu      Name, Affiliation, Date:
342810Srdreslin@umich.edu  Description of Modification:
352810Srdreslin@umich.edu
362810Srdreslin@umich.edu *****************************************************************************/
372810Srdreslin@umich.edu
382810Srdreslin@umich.edu// $Log: scfx_utils.h,v $
392810Srdreslin@umich.edu// Revision 1.2  2009/02/28 00:26:20  acg
402810Srdreslin@umich.edu//  Andy Goodrich: bug fixes.
412810Srdreslin@umich.edu//
4211051Sandreas.hansson@arm.com// Revision 1.1.1.1  2006/12/15 20:31:36  acg
4311051Sandreas.hansson@arm.com// SystemC 2.2
442810Srdreslin@umich.edu//
4511051Sandreas.hansson@arm.com// Revision 1.3  2006/01/13 18:53:58  acg
4611051Sandreas.hansson@arm.com// Andy Goodrich: added $Log command so that CVS comments are reproduced in
4712349Snikos.nikoleris@arm.com// the source.
482810Srdreslin@umich.edu//
492810Srdreslin@umich.edu
502810Srdreslin@umich.edu#ifndef __SYSTEMC_EXT_DT_FX_SCFX_UTILS_HH__
512810Srdreslin@umich.edu#define __SYSTEMC_EXT_DT_FX_SCFX_UTILS_HH__
5211051Sandreas.hansson@arm.com
532810Srdreslin@umich.edu#include "sc_fxdefs.hh"
542810Srdreslin@umich.edu#include "scfx_params.hh"
5511051Sandreas.hansson@arm.com#include "scfx_string.hh"
562810Srdreslin@umich.edu
5712724Snikos.nikoleris@arm.comnamespace sc_dt
5812724Snikos.nikoleris@arm.com{
5912724Snikos.nikoleris@arm.com
6012334Sgabeblack@google.com// ----------------------------------------------------------------------------
6112724Snikos.nikoleris@arm.com//  Find the most and least significant non-zero bits in a unsigned long
6211051Sandreas.hansson@arm.com// ----------------------------------------------------------------------------
6311051Sandreas.hansson@arm.com
6411051Sandreas.hansson@arm.com#define MSB_STATEMENT(n) if (x >> n) { x >>= n; i += n; }
6511288Ssteve.reinhardt@amd.com
6612724Snikos.nikoleris@arm.cominline int
6713223Sodanrc@yahoo.com.brscfx_find_msb(unsigned long x)
6811051Sandreas.hansson@arm.com{
6912724Snikos.nikoleris@arm.com    int i = 0;
7012724Snikos.nikoleris@arm.com#   if defined(SC_LONG_64)
7112724Snikos.nikoleris@arm.com        MSB_STATEMENT(32);
7212724Snikos.nikoleris@arm.com#   endif // defined(SC_LONG_64)
7311051Sandreas.hansson@arm.com    MSB_STATEMENT(16);
7411053Sandreas.hansson@arm.com    MSB_STATEMENT(8);
7511053Sandreas.hansson@arm.com    MSB_STATEMENT(4);
7612724Snikos.nikoleris@arm.com    MSB_STATEMENT(2);
7711051Sandreas.hansson@arm.com    MSB_STATEMENT(1);
7811051Sandreas.hansson@arm.com    return i;
7911051Sandreas.hansson@arm.com}
8011051Sandreas.hansson@arm.com
8111601Sandreas.hansson@arm.com#undef MSB_STATEMENT
8211601Sandreas.hansson@arm.com
8311051Sandreas.hansson@arm.com#define LSB_STATEMENT(n) if (x << n) { x <<= n; i -= n; }
8412724Snikos.nikoleris@arm.com
8511051Sandreas.hansson@arm.cominline int
8612724Snikos.nikoleris@arm.comscfx_find_lsb(unsigned long x)
8711600Sandreas.hansson@arm.com{
8811600Sandreas.hansson@arm.com    int i;
8911051Sandreas.hansson@arm.com#   if defined(SC_LONG_64)
9011051Sandreas.hansson@arm.com        i = 63;
9111051Sandreas.hansson@arm.com        LSB_STATEMENT(32);
9211284Sandreas.hansson@arm.com#   else
9311051Sandreas.hansson@arm.com        i = 31;
9411051Sandreas.hansson@arm.com#   endif // defined(SC_LONG_64)
9511051Sandreas.hansson@arm.com    LSB_STATEMENT(16);
9611602Sandreas.hansson@arm.com    LSB_STATEMENT(8);
9711051Sandreas.hansson@arm.com    LSB_STATEMENT(4);
9811051Sandreas.hansson@arm.com    LSB_STATEMENT(2);
9911284Sandreas.hansson@arm.com    LSB_STATEMENT(1);
10011051Sandreas.hansson@arm.com    return i;
10111284Sandreas.hansson@arm.com}
10211602Sandreas.hansson@arm.com
10311051Sandreas.hansson@arm.com#undef LSB_STATEMENT
10411051Sandreas.hansson@arm.com
10511284Sandreas.hansson@arm.com
10611051Sandreas.hansson@arm.com// ----------------------------------------------------------------------------
10711284Sandreas.hansson@arm.com//  Utilities for parsing a character string number
10811284Sandreas.hansson@arm.com// ----------------------------------------------------------------------------
10911284Sandreas.hansson@arm.com
11011051Sandreas.hansson@arm.cominline int
11111051Sandreas.hansson@arm.comscfx_parse_sign(const char *&s, bool &sign_char)
11211051Sandreas.hansson@arm.com{
11311284Sandreas.hansson@arm.com    int sign = 1;
11411284Sandreas.hansson@arm.com
11511284Sandreas.hansson@arm.com    if (*s == '+') {
11611284Sandreas.hansson@arm.com        ++s;
11711051Sandreas.hansson@arm.com        sign_char = true;
11811051Sandreas.hansson@arm.com    } else if (*s == '-' ) {
11911051Sandreas.hansson@arm.com        sign = -1;
12011284Sandreas.hansson@arm.com        ++s;
12111284Sandreas.hansson@arm.com        sign_char = true;
12211284Sandreas.hansson@arm.com    } else {
12311197Sandreas.hansson@arm.com        sign_char = false;
12411601Sandreas.hansson@arm.com    }
12511601Sandreas.hansson@arm.com
12611601Sandreas.hansson@arm.com    return sign;
12711601Sandreas.hansson@arm.com}
12811601Sandreas.hansson@arm.com
12911601Sandreas.hansson@arm.cominline sc_numrep
13011601Sandreas.hansson@arm.comscfx_parse_prefix(const char *&s)
13111601Sandreas.hansson@arm.com{
13211197Sandreas.hansson@arm.com    if (s[0] == '0') {
13311601Sandreas.hansson@arm.com        switch (s[1]) {
13411601Sandreas.hansson@arm.com          case 'b':
13511601Sandreas.hansson@arm.com          case 'B':
13611601Sandreas.hansson@arm.com            {
13711601Sandreas.hansson@arm.com                if ((s[2] == 'u' || s[2] == 'U') &&
13811601Sandreas.hansson@arm.com                    (s[3] == 's' || s[3] == 'S')) {
13911601Sandreas.hansson@arm.com                    s += 4;
14011051Sandreas.hansson@arm.com                    return SC_BIN_US;
14111051Sandreas.hansson@arm.com                }
14211051Sandreas.hansson@arm.com                if ((s[2] == 's' || s[2] == 'S') &&
14311051Sandreas.hansson@arm.com                    (s[3] == 'm' || s[3] == 'M')) {
14411051Sandreas.hansson@arm.com                    s += 4;
14511284Sandreas.hansson@arm.com                    return SC_BIN_SM;
14611284Sandreas.hansson@arm.com                }
14711051Sandreas.hansson@arm.com                s += 2;
14811051Sandreas.hansson@arm.com                return SC_BIN;
14911051Sandreas.hansson@arm.com            }
15011051Sandreas.hansson@arm.com          case 'o':
15111284Sandreas.hansson@arm.com          case 'O':
15211051Sandreas.hansson@arm.com            {
15311051Sandreas.hansson@arm.com                if ((s[2] == 'u' || s[2] == 'U') &&
15411051Sandreas.hansson@arm.com                    (s[3] == 's' || s[3] == 'S')) {
15511051Sandreas.hansson@arm.com                    s += 4;
15611051Sandreas.hansson@arm.com                    return SC_OCT_US;
15711051Sandreas.hansson@arm.com                }
15811051Sandreas.hansson@arm.com                if ((s[2] == 's' || s[2] == 'S') &&
15911051Sandreas.hansson@arm.com                    (s[3] == 'm' || s[3] == 'M')) {
16011051Sandreas.hansson@arm.com                    s += 4;
16111051Sandreas.hansson@arm.com                    return SC_OCT_SM;
16211051Sandreas.hansson@arm.com                }
16311051Sandreas.hansson@arm.com                s += 2;
16413948Sodanrc@yahoo.com.br                return SC_OCT;
16511051Sandreas.hansson@arm.com            }
16611051Sandreas.hansson@arm.com          case 'x':
16711051Sandreas.hansson@arm.com          case 'X':
16812724Snikos.nikoleris@arm.com            {
16912724Snikos.nikoleris@arm.com                if ((s[2] == 'u' || s[2] == 'U') &&
17012724Snikos.nikoleris@arm.com                    (s[3] == 's' || s[3] == 'S')) {
17112724Snikos.nikoleris@arm.com                    s += 4;
17212724Snikos.nikoleris@arm.com                    return SC_HEX_US;
17312724Snikos.nikoleris@arm.com                }
17412724Snikos.nikoleris@arm.com                if ((s[2] == 's' || s[2] == 'S') &&
17511051Sandreas.hansson@arm.com                    (s[3] == 'm' || s[3] == 'M')) {
17613948Sodanrc@yahoo.com.br                    s += 4;
17713948Sodanrc@yahoo.com.br                    return SC_HEX_SM;
17813948Sodanrc@yahoo.com.br                }
17911051Sandreas.hansson@arm.com                s += 2;
18011051Sandreas.hansson@arm.com                return SC_HEX;
18111051Sandreas.hansson@arm.com            }
18213948Sodanrc@yahoo.com.br          case 'd':
18311051Sandreas.hansson@arm.com          case 'D':
18411051Sandreas.hansson@arm.com            {
18511484Snikos.nikoleris@arm.com                s += 2;
18611051Sandreas.hansson@arm.com                return SC_DEC;
18711051Sandreas.hansson@arm.com            }
18811051Sandreas.hansson@arm.com          case 'c':
18913948Sodanrc@yahoo.com.br          case 'C':
19011601Sandreas.hansson@arm.com            {
19111601Sandreas.hansson@arm.com                if ((s[2] == 's' || s[2] == 'S') &&
19211601Sandreas.hansson@arm.com                    (s[3] == 'd' || s[3] == 'D')) {
19313948Sodanrc@yahoo.com.br                    s += 4;
19411051Sandreas.hansson@arm.com                    return SC_CSD;
19513948Sodanrc@yahoo.com.br                }
19613948Sodanrc@yahoo.com.br                break;
19712345Snikos.nikoleris@arm.com            }
19813948Sodanrc@yahoo.com.br          default:
19913948Sodanrc@yahoo.com.br            break;
20013948Sodanrc@yahoo.com.br        }
20113948Sodanrc@yahoo.com.br    }
20213948Sodanrc@yahoo.com.br
20313948Sodanrc@yahoo.com.br    return SC_DEC;
20413948Sodanrc@yahoo.com.br}
20513948Sodanrc@yahoo.com.br
20613948Sodanrc@yahoo.com.brinline int
20713948Sodanrc@yahoo.com.brscfx_parse_base(const char *&s)
20813948Sodanrc@yahoo.com.br{
20913948Sodanrc@yahoo.com.br    const char *s1 = s + 1;
21013948Sodanrc@yahoo.com.br
21113948Sodanrc@yahoo.com.br    int base = 10;
21211051Sandreas.hansson@arm.com
21313948Sodanrc@yahoo.com.br    if (*s == '0') {
21413948Sodanrc@yahoo.com.br        switch (*s1) {
21513948Sodanrc@yahoo.com.br          case 'b':
21613948Sodanrc@yahoo.com.br          case 'B': base =  2; s += 2; break;
21713948Sodanrc@yahoo.com.br          case 'o':
21813948Sodanrc@yahoo.com.br          case 'O': base =  8; s += 2; break;
21913948Sodanrc@yahoo.com.br          case 'd':
22011051Sandreas.hansson@arm.com          case 'D': base = 10; s += 2; break;
22113948Sodanrc@yahoo.com.br          case 'x':
22213948Sodanrc@yahoo.com.br          case 'X': base = 16; s += 2; break;
22313948Sodanrc@yahoo.com.br        }
22413948Sodanrc@yahoo.com.br    }
22513948Sodanrc@yahoo.com.br
22613948Sodanrc@yahoo.com.br    return base;
22711051Sandreas.hansson@arm.com}
22811051Sandreas.hansson@arm.com
22911051Sandreas.hansson@arm.cominline bool
23011130Sali.jafri@arm.comscfx_is_equal(const char *a, const char *b)
23113948Sodanrc@yahoo.com.br{
23211130Sali.jafri@arm.com    while (*a != 0 && *b != 0 && *a == *b) {
23313948Sodanrc@yahoo.com.br        ++ a;
23413948Sodanrc@yahoo.com.br        ++ b;
23513948Sodanrc@yahoo.com.br    }
23613948Sodanrc@yahoo.com.br    return (*a == 0 && *b == 0);
23713948Sodanrc@yahoo.com.br}
23813948Sodanrc@yahoo.com.br
23913948Sodanrc@yahoo.com.brinline bool
24013948Sodanrc@yahoo.com.brscfx_is_nan(const char *s)
24113948Sodanrc@yahoo.com.br{
24213948Sodanrc@yahoo.com.br    return scfx_is_equal(s, "NaN");
24313948Sodanrc@yahoo.com.br}
24413948Sodanrc@yahoo.com.br
24513948Sodanrc@yahoo.com.brinline bool
24611130Sali.jafri@arm.comscfx_is_inf(const char *s)
24713948Sodanrc@yahoo.com.br{
24813948Sodanrc@yahoo.com.br    return (scfx_is_equal(s, "Inf") || scfx_is_equal(s, "Infinity"));
24913948Sodanrc@yahoo.com.br}
25013948Sodanrc@yahoo.com.br
25113948Sodanrc@yahoo.com.brinline bool
25213948Sodanrc@yahoo.com.brscfx_exp_start(const char *s)
25311130Sali.jafri@arm.com{
25413948Sodanrc@yahoo.com.br    if (*s == 'e' || *s == 'E') {
25513948Sodanrc@yahoo.com.br        ++s;
25613948Sodanrc@yahoo.com.br        if (*s == '+' || *s == '-')
25713948Sodanrc@yahoo.com.br            return true;
25813948Sodanrc@yahoo.com.br    }
25911130Sali.jafri@arm.com    return false;
26011130Sali.jafri@arm.com}
26111051Sandreas.hansson@arm.com
26211051Sandreas.hansson@arm.cominline bool
26311051Sandreas.hansson@arm.comscfx_is_digit(char c, sc_numrep numrep)
26411744Snikos.nikoleris@arm.com{
26511051Sandreas.hansson@arm.com    bool is_digit;
26611276Sandreas.hansson@arm.com
26711276Sandreas.hansson@arm.com    switch(numrep) {
26811276Sandreas.hansson@arm.com      case SC_DEC:
26911276Sandreas.hansson@arm.com        {
27011276Sandreas.hansson@arm.com            switch(c) {
27111276Sandreas.hansson@arm.com              case '0': case '1': case '2': case '3': case '4':
27211276Sandreas.hansson@arm.com              case '5': case '6': case '7': case '8': case '9':
27311276Sandreas.hansson@arm.com                {
27411276Sandreas.hansson@arm.com                    is_digit = true;
27511051Sandreas.hansson@arm.com                    break;
27611276Sandreas.hansson@arm.com                }
27711276Sandreas.hansson@arm.com              default:
27811276Sandreas.hansson@arm.com                    is_digit = false;
27911276Sandreas.hansson@arm.com            }
28011276Sandreas.hansson@arm.com            break;
28111051Sandreas.hansson@arm.com        }
28211051Sandreas.hansson@arm.com      case SC_BIN:
28311051Sandreas.hansson@arm.com      case SC_BIN_US:
28411051Sandreas.hansson@arm.com      case SC_BIN_SM:
28511051Sandreas.hansson@arm.com        {
28611051Sandreas.hansson@arm.com            switch(c) {
28711051Sandreas.hansson@arm.com              case '0': case '1':
28811051Sandreas.hansson@arm.com                {
28911051Sandreas.hansson@arm.com                    is_digit = true;
29011051Sandreas.hansson@arm.com                    break;
29111051Sandreas.hansson@arm.com                }
29212724Snikos.nikoleris@arm.com              default:
29311051Sandreas.hansson@arm.com                is_digit = false;
29411051Sandreas.hansson@arm.com            }
29511051Sandreas.hansson@arm.com            break;
29611051Sandreas.hansson@arm.com        }
29711051Sandreas.hansson@arm.com      case SC_OCT:
29811051Sandreas.hansson@arm.com      case SC_OCT_US:
29911051Sandreas.hansson@arm.com      case SC_OCT_SM:
30011051Sandreas.hansson@arm.com        {
30111051Sandreas.hansson@arm.com            switch(c) {
30211051Sandreas.hansson@arm.com              case '0': case '1': case '2': case '3':
30311051Sandreas.hansson@arm.com              case '4': case '5': case '6': case '7':
30411051Sandreas.hansson@arm.com                {
30511051Sandreas.hansson@arm.com                    is_digit = true;
30612630Snikos.nikoleris@arm.com                    break;
30712720Snikos.nikoleris@arm.com                }
30812720Snikos.nikoleris@arm.com              default:
30912720Snikos.nikoleris@arm.com                is_digit = false;
31012720Snikos.nikoleris@arm.com            }
31112720Snikos.nikoleris@arm.com            break;
31212720Snikos.nikoleris@arm.com        }
31312720Snikos.nikoleris@arm.com      case SC_HEX:
31412724Snikos.nikoleris@arm.com      case SC_HEX_US:
31512720Snikos.nikoleris@arm.com      case SC_HEX_SM:
31612720Snikos.nikoleris@arm.com        {
31712720Snikos.nikoleris@arm.com            switch (c) {
31812720Snikos.nikoleris@arm.com              case '0': case '1': case '2': case '3': case '4':
31912720Snikos.nikoleris@arm.com              case '5': case '6': case '7': case '8': case '9':
32012720Snikos.nikoleris@arm.com              case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
32112724Snikos.nikoleris@arm.com              case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
32212724Snikos.nikoleris@arm.com                {
32312724Snikos.nikoleris@arm.com                    is_digit = true;
32412724Snikos.nikoleris@arm.com                    break;
32512724Snikos.nikoleris@arm.com                }
32612724Snikos.nikoleris@arm.com              default:
32712724Snikos.nikoleris@arm.com                is_digit = false;
32812724Snikos.nikoleris@arm.com            }
32912724Snikos.nikoleris@arm.com            break;
33012724Snikos.nikoleris@arm.com        }
33112724Snikos.nikoleris@arm.com      case SC_CSD:
33212724Snikos.nikoleris@arm.com        {
33312724Snikos.nikoleris@arm.com            switch (c) {
33412724Snikos.nikoleris@arm.com              case '0': case '1': case '-':
33512724Snikos.nikoleris@arm.com                {
33612724Snikos.nikoleris@arm.com                    is_digit = true;
33712724Snikos.nikoleris@arm.com                    break;
33812724Snikos.nikoleris@arm.com                }
33912724Snikos.nikoleris@arm.com              default:
34012724Snikos.nikoleris@arm.com                is_digit = false;
34112724Snikos.nikoleris@arm.com            }
34212724Snikos.nikoleris@arm.com            break;
34312724Snikos.nikoleris@arm.com        }
34412724Snikos.nikoleris@arm.com      default:
34512724Snikos.nikoleris@arm.com        is_digit = false;
34612720Snikos.nikoleris@arm.com    }
34712720Snikos.nikoleris@arm.com
34812724Snikos.nikoleris@arm.com    return is_digit;
34912720Snikos.nikoleris@arm.com}
35012720Snikos.nikoleris@arm.com
35112720Snikos.nikoleris@arm.cominline int
35212720Snikos.nikoleris@arm.comscfx_to_digit(char c, sc_numrep numrep)
35312720Snikos.nikoleris@arm.com{
35412720Snikos.nikoleris@arm.com    int to_digit;
35512720Snikos.nikoleris@arm.com
35612720Snikos.nikoleris@arm.com    switch (numrep) {
35712720Snikos.nikoleris@arm.com      case SC_DEC:
35812720Snikos.nikoleris@arm.com      case SC_BIN:
35912720Snikos.nikoleris@arm.com      case SC_BIN_US:
36012720Snikos.nikoleris@arm.com      case SC_BIN_SM:
36112720Snikos.nikoleris@arm.com      case SC_OCT:
36212720Snikos.nikoleris@arm.com      case SC_OCT_US:
36312720Snikos.nikoleris@arm.com      case SC_OCT_SM:
36412720Snikos.nikoleris@arm.com        {
36512720Snikos.nikoleris@arm.com            to_digit = c - '0';
36612720Snikos.nikoleris@arm.com            break;
36712720Snikos.nikoleris@arm.com        }
36812720Snikos.nikoleris@arm.com      case SC_HEX:
36912720Snikos.nikoleris@arm.com      case SC_HEX_US:
37012720Snikos.nikoleris@arm.com      case SC_HEX_SM:
37112720Snikos.nikoleris@arm.com        {
37212749Sgiacomo.travaglini@arm.com            switch (c) {
37312749Sgiacomo.travaglini@arm.com              case '0': case '1': case '2': case '3': case '4':
37412749Sgiacomo.travaglini@arm.com              case '5': case '6': case '7': case '8': case '9':
37512749Sgiacomo.travaglini@arm.com                to_digit = c - '0';
37612720Snikos.nikoleris@arm.com                break;
37712720Snikos.nikoleris@arm.com              case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
37813860Sodanrc@yahoo.com.br                to_digit = c - 'a' + 10;
37912720Snikos.nikoleris@arm.com                break;
38012720Snikos.nikoleris@arm.com              case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
38112720Snikos.nikoleris@arm.com                to_digit = c - 'A' + 10;
38212720Snikos.nikoleris@arm.com                break;
38312720Snikos.nikoleris@arm.com              default:
38412720Snikos.nikoleris@arm.com                to_digit = -2;
38512720Snikos.nikoleris@arm.com            }
38613564Snikos.nikoleris@arm.com            break;
38712720Snikos.nikoleris@arm.com        }
38812720Snikos.nikoleris@arm.com      case SC_CSD:
38912720Snikos.nikoleris@arm.com        {
39012720Snikos.nikoleris@arm.com            if (c == '-')
39112720Snikos.nikoleris@arm.com                to_digit = -1;
39212720Snikos.nikoleris@arm.com            else
39312724Snikos.nikoleris@arm.com                to_digit = c - '0';
39412720Snikos.nikoleris@arm.com            break;
39512720Snikos.nikoleris@arm.com        }
39612720Snikos.nikoleris@arm.com      default:
39711051Sandreas.hansson@arm.com        to_digit = -2;
39811051Sandreas.hansson@arm.com    }
39911830Sbaz21@cam.ac.uk
40011051Sandreas.hansson@arm.com    return to_digit;
40111051Sandreas.hansson@arm.com}
40211051Sandreas.hansson@arm.com
40311284Sandreas.hansson@arm.com
40411051Sandreas.hansson@arm.com// ----------------------------------------------------------------------------
40511284Sandreas.hansson@arm.com//  Utilities for printing a character string number
40611284Sandreas.hansson@arm.com// ----------------------------------------------------------------------------
40711744Snikos.nikoleris@arm.com
40811744Snikos.nikoleris@arm.cominline void scfx_print_nan(scfx_string &s) { s += "NaN"; }
40911051Sandreas.hansson@arm.cominline void
41011284Sandreas.hansson@arm.comscfx_print_inf(scfx_string &s, bool negative)
41111284Sandreas.hansson@arm.com{
41211284Sandreas.hansson@arm.com    if (negative)
41311284Sandreas.hansson@arm.com        s += "-Inf";
41411284Sandreas.hansson@arm.com    else
41511334Sandreas.hansson@arm.com        s += "Inf";
41611284Sandreas.hansson@arm.com}
41711334Sandreas.hansson@arm.com
41811334Sandreas.hansson@arm.cominline void
41911334Sandreas.hansson@arm.comscfx_print_prefix(scfx_string &s, sc_numrep numrep)
42011334Sandreas.hansson@arm.com{
42111284Sandreas.hansson@arm.com    switch (numrep) {
42211334Sandreas.hansson@arm.com      case SC_DEC:
42311334Sandreas.hansson@arm.com        s += "0d";
42411334Sandreas.hansson@arm.com        break;
42511334Sandreas.hansson@arm.com      case SC_BIN:
42611334Sandreas.hansson@arm.com        s += "0b";
42711334Sandreas.hansson@arm.com        break;
42811051Sandreas.hansson@arm.com      case SC_BIN_US:
42911334Sandreas.hansson@arm.com        s += "0bus";
43011334Sandreas.hansson@arm.com        break;
43111334Sandreas.hansson@arm.com      case SC_BIN_SM:
43211334Sandreas.hansson@arm.com        s += "0bsm";
43311051Sandreas.hansson@arm.com        break;
43411334Sandreas.hansson@arm.com      case SC_OCT:
43511334Sandreas.hansson@arm.com        s += "0o";
43611334Sandreas.hansson@arm.com        break;
43711051Sandreas.hansson@arm.com      case SC_OCT_US:
43811334Sandreas.hansson@arm.com        s += "0ous";
43911334Sandreas.hansson@arm.com        break;
44011334Sandreas.hansson@arm.com      case SC_OCT_SM:
44111334Sandreas.hansson@arm.com        s += "0osm";
44211334Sandreas.hansson@arm.com        break;
44311334Sandreas.hansson@arm.com      case SC_HEX:
44411334Sandreas.hansson@arm.com        s += "0x";
44511051Sandreas.hansson@arm.com        break;
44611334Sandreas.hansson@arm.com      case SC_HEX_US:
44711334Sandreas.hansson@arm.com        s += "0xus";
44811334Sandreas.hansson@arm.com        break;
44912724Snikos.nikoleris@arm.com      case SC_HEX_SM:
45011334Sandreas.hansson@arm.com        s += "0xsm";
45111334Sandreas.hansson@arm.com        break;
45211334Sandreas.hansson@arm.com      case SC_CSD:
45311334Sandreas.hansson@arm.com        s += "0csd";
45411051Sandreas.hansson@arm.com        break;
45511284Sandreas.hansson@arm.com      default:
45611284Sandreas.hansson@arm.com        s += "unknown";
45711190Sandreas.hansson@arm.com    }
45811051Sandreas.hansson@arm.com}
45911334Sandreas.hansson@arm.com
46011334Sandreas.hansson@arm.cominline void
46111334Sandreas.hansson@arm.comscfx_print_exp(scfx_string &s, int exp)
46211334Sandreas.hansson@arm.com{
46311334Sandreas.hansson@arm.com    if (exp != 0) {
46412630Snikos.nikoleris@arm.com        s += 'e';
46511051Sandreas.hansson@arm.com
46611051Sandreas.hansson@arm.com        if (exp < 0) {
46712724Snikos.nikoleris@arm.com            exp = - exp;
46811051Sandreas.hansson@arm.com            s += '-';
46911051Sandreas.hansson@arm.com        } else {
47011051Sandreas.hansson@arm.com            s += '+';
47111452Sandreas.hansson@arm.com        }
47213350Snikos.nikoleris@arm.com
47313350Snikos.nikoleris@arm.com        bool first = true;
47411051Sandreas.hansson@arm.com        int scale = 1000000000;
47511452Sandreas.hansson@arm.com        do {
47611452Sandreas.hansson@arm.com            int digit = exp / scale;
47711452Sandreas.hansson@arm.com            exp = exp % scale;
47811051Sandreas.hansson@arm.com            if (digit != 0 || !first) {
47911051Sandreas.hansson@arm.com                s += static_cast<char>(digit + '0');
48011452Sandreas.hansson@arm.com                first = false;
48111745Sandreas.hansson@arm.com            }
48212349Snikos.nikoleris@arm.com            scale /= 10;
48311452Sandreas.hansson@arm.com        }
48411452Sandreas.hansson@arm.com        while (scale > 0);
48511452Sandreas.hansson@arm.com    }
48611051Sandreas.hansson@arm.com}
48711051Sandreas.hansson@arm.com
48811051Sandreas.hansson@arm.comvoid scfx_tc2csd(scfx_string &, int);
48911051Sandreas.hansson@arm.comvoid scfx_csd2tc(scfx_string &);
49011051Sandreas.hansson@arm.com
49111051Sandreas.hansson@arm.com} // namespace sc_dt
49211051Sandreas.hansson@arm.com
49311051Sandreas.hansson@arm.com#endif // __SYSTEMC_EXT_DT_FX_SCFX_UTILS_HH__
49411051Sandreas.hansson@arm.com