acc_fetch_value support for %v format.

This commit is contained in:
steve 2003-04-20 02:49:07 +00:00
parent c75140592f
commit 299f6f8551
6 changed files with 155 additions and 87 deletions

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: a_fetch_value.c,v 1.1 2003/04/12 18:57:14 steve Exp $"
#ident "$Id: a_fetch_value.c,v 1.2 2003/04/20 02:49:07 steve Exp $"
#endif
# include <acc_user.h>
@ -62,12 +62,14 @@ static char* fetch_struct_value(handle obj, s_acc_value*value)
static char* fetch_strength_value(handle obj)
{
struct t_vpi_value val;
char str[4];
val.format = vpiStrengthVal;
vpi_get_value(obj, &val);
vpi_printf("XXXX acc_fetch_value(..., \"%%v\")\n");
return __acc_newstring("StX");
vpip_format_strength(str, &val);
return __acc_newstring(str);
}
char* acc_fetch_value(handle obj, const char*fmt, s_acc_value*value)
@ -75,6 +77,9 @@ char* acc_fetch_value(handle obj, const char*fmt, s_acc_value*value)
if (strcmp(fmt, "%%") == 0)
return fetch_struct_value(obj, value);
if (strcmp(fmt, "%v") == 0)
return fetch_strength_value(obj);
vpi_printf("XXXX acc_fetch_value(..., \"%s\", ...)\n", fmt);
return "<acc_fetch_value>";
}
@ -82,6 +87,9 @@ char* acc_fetch_value(handle obj, const char*fmt, s_acc_value*value)
/*
* $Log: a_fetch_value.c,v $
* Revision 1.2 2003/04/20 02:49:07 steve
* acc_fetch_value support for %v format.
*
* Revision 1.1 2003/04/12 18:57:14 steve
* More acc_ function stubs.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: sys_display.c,v 1.56 2003/03/12 03:11:00 steve Exp $"
#ident "$Id: sys_display.c,v 1.57 2003/04/20 02:49:07 steve Exp $"
#endif
# include "config.h"
@ -295,88 +295,11 @@ static void format_time_real(unsigned mcd, int fsize,
timeformat_info.suff);
}
static const char str_char1_table[256] = {
".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[256] = {
".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 */ };
static void format_strength(unsigned int mcd, s_vpi_value*value)
{
char str[4];
str[0] = '.';
str[1] = '.';
str[2] = '.';
str[3] = 0;
switch (value->value.strength[0].logic) {
case vpi0:
str[0] = str_char1_table[value->value.strength[0].s0];
str[1] = str_char2_table[value->value.strength[0].s0];
str[2] = '0';
break;
case vpi1:
str[0] = str_char1_table[value->value.strength[0].s1];
str[1] = str_char2_table[value->value.strength[0].s1];
str[2] = '1';
break;
case vpiX:
if (value->value.strength[0].s0 == 1) {
str[0] = str_char1_table[value->value.strength[0].s1];
str[1] = str_char2_table[value->value.strength[0].s1];
str[2] = 'H';
} else if (value->value.strength[0].s1 == 1) {
str[0] = str_char1_table[value->value.strength[0].s0];
str[1] = str_char2_table[value->value.strength[0].s0];
str[2] = 'L';
} else if (value->value.strength[0].s1 ==
value->value.strength[0].s0) {
str[0] = str_char1_table[value->value.strength[0].s0];
str[1] = str_char2_table[value->value.strength[0].s0];
str[2] = 'X';
} else {
int ss;
str[0] = '0';
ss = value->value.strength[0].s0;
while (ss > 1) {
str[0] += 1;
ss >>= 1;
}
str[1] = '0';
ss = value->value.strength[0].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:
assert(0);
}
vpip_format_strength(str, value);
vpi_mcd_printf(mcd, "%s", str);
}
@ -1726,6 +1649,9 @@ void sys_display_register()
/*
* $Log: sys_display.c,v $
* Revision 1.57 2003/04/20 02:49:07 steve
* acc_fetch_value support for %v format.
*
* Revision 1.56 2003/03/12 03:11:00 steve
* Donot rely on persistence of format string.
*

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: vpi_user.h,v 1.23 2003/03/13 18:26:12 steve Exp $"
#ident "$Id: vpi_user.h,v 1.24 2003/04/20 02:49:07 steve Exp $"
#endif
@ -218,13 +218,12 @@ extern void vpi_register_systf(const struct t_vpi_systf_data*ss);
extern void vpi_printf(const char*fmt, ...)
__attribute__((format (printf,1,2)));
/* vpi_vprintf is non-standard. */
extern void vpi_vprintf(const char*fmt, va_list ap);
extern PLI_UINT32 vpi_mcd_close(unsigned int mcd);
extern char *vpi_mcd_name(PLI_UINT32 mcd);
extern PLI_UINT32 vpi_mcd_open(char *name);
extern PLI_UINT32 vpi_mcd_open_x(char *name, char *mode);
extern PLI_UINT32 vpi_mcd_open_x(char *name, char *mode);
extern PLI_INT32 vpi_mcd_printf(unsigned int mcd, const char*fmt, ...)
__attribute__((format (printf,2,3)));
extern PLI_INT32 vpi_mcd_fputc(unsigned int mcd, unsigned char x);
@ -370,10 +369,28 @@ extern PLI_INT32 vpi_chk_error(p_vpi_error_info info);
/* This is the table of startup routines included in each module. */
extern DLLEXPORT void (*vlog_startup_routines[])();
/*
* ICARUS VERILOG EXTENSIONS
*
* The vpip_* functions are Icarus Verilog extensions. They are not
* standard VPI functions, so use these at your own risk.
*
* The vpip_format_* functions format values in string format in the
* manner of the $display system task.
*/
/* Format a scaler a la %v. The str points to a 4byte character
buffer. The value must be a vpiStrengthVal. */
extern void vpip_format_strength(char*str, s_vpi_value*value);
EXTERN_C_END
/*
* $Log: vpi_user.h,v $
* Revision 1.24 2003/04/20 02:49:07 steve
* acc_fetch_value support for %v format.
*
* Revision 1.23 2003/03/13 18:26:12 steve
* Verilog 2001 standart types.
*

View File

@ -16,7 +16,7 @@
# 59 Temple Place - Suite 330
# Boston, MA 02111-1307, USA
#
#ident "$Id: Makefile.in,v 1.48 2003/03/13 04:36:57 steve Exp $"
#ident "$Id: Makefile.in,v 1.49 2003/04/20 02:49:07 steve Exp $"
#
#
SHELL = /bin/sh
@ -66,7 +66,7 @@ check: all
V = vpi_modules.o vpi_callback.o vpi_const.o vpi_event.o vpi_iter.o vpi_mcd.o \
vpi_priv.o vpi_scope.o vpi_real.o vpi_signal.o vpi_tasks.o vpi_time.o \
vpi_memory.o vpi_vthr_vector.o vpip_bin.o vpip_hex.o vpip_oct.o \
vpip_to_dec.o vvp_vpi.o
vpip_to_dec.o vpip_format.o vvp_vpi.o
O = main.o parse.o parse_misc.o lexor.o arith.o bufif.o compile.o \
functor.o fvectors.o npmos.o resolv.o stop.o symbols.o ufunc.o codes.o \

115
vvp/vpip_format.c Normal file
View File

@ -0,0 +1,115 @@
/*
* Copyright (c) 2003 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: vpip_format.c,v 1.1 2003/04/20 02:49:07 steve Exp $"
#endif
# include <vpi_user.h>
# include <assert.h>
static const char str_char1_table[256] = {
".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[256] = {
".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 */ };
void vpip_format_strength(char*str, s_vpi_value*value)
{
str[0] = '.';
str[1] = '.';
str[2] = '.';
str[3] = 0;
assert(value->format == vpiStrengthVal);
switch (value->value.strength[0].logic) {
case vpi0:
str[0] = str_char1_table[value->value.strength[0].s0];
str[1] = str_char2_table[value->value.strength[0].s0];
str[2] = '0';
break;
case vpi1:
str[0] = str_char1_table[value->value.strength[0].s1];
str[1] = str_char2_table[value->value.strength[0].s1];
str[2] = '1';
break;
case vpiX:
if (value->value.strength[0].s0 == 1) {
str[0] = str_char1_table[value->value.strength[0].s1];
str[1] = str_char2_table[value->value.strength[0].s1];
str[2] = 'H';
} else if (value->value.strength[0].s1 == 1) {
str[0] = str_char1_table[value->value.strength[0].s0];
str[1] = str_char2_table[value->value.strength[0].s0];
str[2] = 'L';
} else if (value->value.strength[0].s1 ==
value->value.strength[0].s0) {
str[0] = str_char1_table[value->value.strength[0].s0];
str[1] = str_char2_table[value->value.strength[0].s0];
str[2] = 'X';
} else {
int ss;
str[0] = '0';
ss = value->value.strength[0].s0;
while (ss > 1) {
str[0] += 1;
ss >>= 1;
}
str[1] = '0';
ss = value->value.strength[0].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:
assert(0);
}
}
/*
* $Log: vpip_format.c,v $
* Revision 1.1 2003/04/20 02:49:07 steve
* acc_fetch_value support for %v format.
*
*/

View File

@ -30,3 +30,5 @@ vpi_scan
vpi_sim_control
vpi_sim_vcontrol
vpi_vprintf
vpip_format_strength