iverilog/vvp/vpip_format.cc

107 lines
3.8 KiB
C++

/*
* Copyright (c) 2003-2010 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
* General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
# include "vpi_user.h"
# include <cassert>
static const char str_char1_table[257] = {
".HS1M222" "W3333333" /* 00 0F */ "L4444444" "44444444" /* 10 1F */
"P5555555" "55555555" /* 20 2F */ "55555555" "55555555" /* 30 3F */
"S6666666" "66666666" /* 40 4F */ "66666666" "66666666" /* 50 5F */
"66666666" "66666666" /* 60 6F */ "66666666" "66666666" /* 70 7F */
"S7777777" "77777777" /* 80 8F */ "77777777" "77777777" /* 90 9F */
"77777777" "77777777" /* A0 AF */ "77777777" "77777777" /* B0 BF */
"77777777" "77777777" /* C0 CF */ "77777777" "77777777" /* D0 DF */
"77777777" "77777777" /* E0 EF */ "77777777" "77777777" /* F0 FF */ };
static const char str_char2_table[257] = {
".im0e010" "e0102010" /* 00 0F */ "a0102010" "30102010" /* 10 1F */
"u0102010" "30102010" /* 20 2F */ "40102010" "30102010" /* 30 3F */
"t0102010" "30102010" /* 40 4F */ "40102010" "30102010" /* 50 5F */
"50102010" "30102010" /* 60 6F */ "40102010" "30102010" /* 70 7F */
"u0102010" "30102010" /* 80 8F */ "40102010" "30102010" /* 90 9F */
"50102010" "30102010" /* A0 AF */ "40102010" "30102010" /* B0 BF */
"60102010" "30102010" /* C0 CF */ "40102010" "30102010" /* D0 DF */
"50102010" "30102010" /* E0 EF */ "40102010" "30102010" /* F0 FF */ };
extern "C" void vpip_format_strength(char*str, s_vpi_value*value, unsigned bit)
{
str[0] = '.';
str[1] = '.';
str[2] = '.';
str[3] = 0;
assert(value->format == vpiStrengthVal);
switch (value->value.strength[bit].logic) {
case vpi0:
str[0] = str_char1_table[value->value.strength[bit].s0];
str[1] = str_char2_table[value->value.strength[bit].s0];
str[2] = '0';
break;
case vpi1:
str[0] = str_char1_table[value->value.strength[bit].s1];
str[1] = str_char2_table[value->value.strength[bit].s1];
str[2] = '1';
break;
case vpiX:
if (value->value.strength[bit].s0 == 1) {
str[0] = str_char1_table[value->value.strength[bit].s1];
str[1] = str_char2_table[value->value.strength[bit].s1];
str[2] = 'H';
} else if (value->value.strength[bit].s1 == 1) {
str[0] = str_char1_table[value->value.strength[bit].s0];
str[1] = str_char2_table[value->value.strength[bit].s0];
str[2] = 'L';
} else if (value->value.strength[bit].s1 ==
value->value.strength[bit].s0) {
str[0] = str_char1_table[value->value.strength[bit].s0];
str[1] = str_char2_table[value->value.strength[bit].s0];
str[2] = 'X';
} else {
int ss;
str[0] = '0';
ss = value->value.strength[bit].s0;
while (ss > 1) {
str[0] += 1;
ss >>= 1;
}
str[1] = '0';
ss = value->value.strength[bit].s1;
while (ss > 1) {
str[1] += 1;
ss >>= 1;
}
str[2] = 'X';
}
break;
case vpiZ:
str[0] = 'H';
str[1] = 'i';
str[2] = 'Z';
break;
default:
fprintf(stderr, "Unsupported type %d.\n",
(int)value->value.strength[bit].logic);
assert(0);
}
}