From 8d806d538bbe630db44d0f63d6ef27642b4707c3 Mon Sep 17 00:00:00 2001 From: steve Date: Sat, 6 Nov 1999 22:16:50 +0000 Subject: [PATCH] Get the $strobe task working. --- vpi/sys_display.c | 209 +++++++++++++++++++++++++++++++++++++++++++--- vvm/vpi_const.c | 38 ++++++++- 2 files changed, 231 insertions(+), 16 deletions(-) diff --git a/vpi/sys_display.c b/vpi/sys_display.c index 043f6c01f..fafba73a8 100644 --- a/vpi/sys_display.c +++ b/vpi/sys_display.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: sys_display.c,v 1.6 1999/10/29 03:37:22 steve Exp $" +#ident "$Id: sys_display.c,v 1.7 1999/11/06 22:16:50 steve Exp $" #endif # include "vpi_user.h" @@ -236,9 +236,178 @@ static int sys_display_calltf(char *name) return 0; } + +static int format_str(char*fmt, int argc, vpiHandle*argv) +{ + s_vpi_value value; + char buf[256]; + char*cp = fmt; + int idx; + + assert(fmt); + + idx = 0; + + while (*cp) { + size_t cnt = strcspn(cp, "%\\"); + if (cnt > 0) { + if (cnt >= sizeof buf) + cnt = sizeof buf - 1; + strncpy(buf, cp, cnt); + buf[cnt] = 0; + vpi_printf("%s", buf); + cp += cnt; + + } else if (*cp == '%') { + int fsize = -1; + + cp += 1; + if (isdigit(*cp)) + fsize = strtoul(cp, &cp, 10); + + switch (*cp) { + case 0: + break; + case 'b': + case 'B': + value.format = vpiBinStrVal; + vpi_get_value(argv[idx++], &value); + vpi_printf("%s", value.value.str); + cp += 1; + break; + case 'd': + case 'D': + value.format = vpiDecStrVal; + vpi_get_value(argv[idx++], &value); + vpi_printf("%s", value.value.str); + cp += 1; + break; + case 'h': + case 'H': + case 'x': + case 'X': + value.format = vpiHexStrVal; + vpi_get_value(argv[idx++], &value); + vpi_printf("%s", value.value.str); + cp += 1; + break; + case 'm': + vpi_printf("%s", + vpi_get_str(vpiFullName, argv[idx++])); + cp += 1; + break; + case 'o': + case 'O': + value.format = vpiOctStrVal; + vpi_get_value(argv[idx++], &value); + vpi_printf("%s", value.value.str); + cp += 1; + break; + case 't': + case 'T': + value.format = vpiDecStrVal; + vpi_get_value(argv[idx++], &value); + vpi_printf("%s", value.value.str); + cp += 1; + break; + case '%': + vpi_printf("%%"); + cp += 1; + break; + default: + vpi_printf("%c", *cp); + cp += 1; + break; + } + + } else { + + cp += 1; + switch (*cp) { + case 0: + break; + case 'n': + vpi_printf("\n"); + cp += 1; + break; + default: + vpi_printf("%c", *cp); + cp += 1; + } + } + } + + return idx; +} + +/* + * The strobe implementation takes the parameter handles that are + * passed to the calltf and puts them in to an array for safe + * keeping. That array (and other bookkeeping) is passed, via the + * struct_cb_info object, to the REadOnlySych function strobe_cb, + * where it is use to perform the actual formatting and printing. + */ +struct strobe_cb_info { + char*name; + vpiHandle*items; + unsigned nitems; +}; + static int strobe_cb(p_cb_data cb) { - vpi_printf("%s NOT IMPLEMENTED YET\n", cb->user_data); + s_vpi_value value; + unsigned idx; + struct strobe_cb_info*info = (struct strobe_cb_info*)cb->user_data; + + + for (idx = 0 ; idx < info->nitems ; idx += 1) { + vpiHandle item = info->items[idx]; + + switch (vpi_get(vpiType, item)) { + + case 0: + vpi_printf(" "); + break; + + case vpiConstant: + if (vpi_get(vpiConstType, item) == vpiStringConst) { + value.format = vpiStringVal; + vpi_get_value(item, &value); + idx += format_str(value.value.str, + info->nitems-idx-1, + info->items+1); + } else { + value.format = vpiBinStrVal; + vpi_get_value(item, &value); + vpi_printf("%s", value.value.str); + } + break; + + case vpiNet: + case vpiReg: + value.format = vpiBinStrVal; + vpi_get_value(item, &value); + vpi_printf("%s", value.value.str); + break; + + case vpiTimeVar: + value.format = vpiTimeVal; + vpi_get_value(item, &value); + vpi_printf("%u", value.value.time->low); + break; + + default: + vpi_printf("?"); + break; + } + } + + vpi_printf("\n"); + + free(info->name); + free(info->items); + free(info); + return 0; } @@ -246,6 +415,27 @@ static int sys_strobe_calltf(char*name) { struct t_cb_data cb; struct t_vpi_time time; + struct strobe_cb_info*info; + + vpiHandle sys = vpi_handle(vpiSysTfCall, 0); + + vpiHandle argv = vpi_iterate(vpiArgument, sys); + vpiHandle item; + + vpiHandle*items; + unsigned nitems = 1; + items = malloc(sizeof(vpiHandle)); + items[0] = vpi_scan(argv); + for (item = vpi_scan(argv) ; item ; item = vpi_scan(argv)) { + items = realloc(items, (nitems+1)*sizeof(vpiHandle)); + items[nitems] = item; + nitems += 1; + } + + info = calloc(1, sizeof(struct strobe_cb_info)); + info->name = strdup(name); + info->items = items; + info->nitems = nitems; time.type = vpiSimTime; time.low = 0; @@ -255,7 +445,7 @@ static int sys_strobe_calltf(char*name) cb.cb_rtn = strobe_cb; cb.time = &time; cb.obj = 0; - cb.user_data = name; + cb.user_data = (char*)info; vpi_register_cb(&cb); return 0; } @@ -275,16 +465,6 @@ static int sys_monitor_calltf(char*name) switch (vpi_get(vpiType, item)) { - case vpiNet: - case vpiReg: - cb.reason = cbValueChange; - cb.cb_rtn = strobe_cb; - cb.time = &time; - cb.obj = item; - cb.user_data = name; - vpi_register_cb(&cb); - break; - default: break; } @@ -334,6 +514,9 @@ void sys_display_register() /* * $Log: sys_display.c,v $ + * Revision 1.7 1999/11/06 22:16:50 steve + * Get the $strobe task working. + * * Revision 1.6 1999/10/29 03:37:22 steve * Support vpiValueChance callbacks. * diff --git a/vvm/vpi_const.c b/vvm/vpi_const.c index 387c4daf6..6678b3903 100644 --- a/vvm/vpi_const.c +++ b/vvm/vpi_const.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_const.c,v 1.3 1999/11/06 16:52:16 steve Exp $" +#ident "$Id: vpi_const.c,v 1.4 1999/11/06 22:16:50 steve Exp $" #endif # include "vpi_priv.h" @@ -225,6 +225,20 @@ void vpip_bits_get_value(enum vpip_bit_t*bits, unsigned nbits, s_vpi_value*vp) vp->value.str = buff; } +static int string_get(int code, vpiHandle ref) +{ + struct __vpiStringConst*rfp = (struct __vpiStringConst*)ref; + assert(ref->vpi_type->type_code == vpiConstant); + + switch (code) { + case vpiConstType: + return vpiStringConst; + + default: + assert(0); + return 0; + } +} static void string_value(vpiHandle ref, p_vpi_value vp) { @@ -244,6 +258,21 @@ static void string_value(vpiHandle ref, p_vpi_value vp) } } +static int number_get(int code, vpiHandle ref) +{ + struct __vpiNumberConst*rfp = (struct __vpiNumberConst*)ref; + assert(ref->vpi_type->type_code == vpiConstant); + + switch (code) { + case vpiConstType: + return vpiBinaryConst; + + default: + assert(0); + return 0; + } +} + static void number_value(vpiHandle ref, p_vpi_value vp) { struct __vpiNumberConst*rfp = (struct __vpiNumberConst*)ref; @@ -253,7 +282,7 @@ static void number_value(vpiHandle ref, p_vpi_value vp) static const struct __vpirt vpip_string_rt = { vpiConstant, - 0, + string_get, 0, string_value, 0, @@ -262,7 +291,7 @@ static const struct __vpirt vpip_string_rt = { static const struct __vpirt vpip_number_rt = { vpiConstant, - 0, + number_get, 0, number_value, 0, @@ -288,6 +317,9 @@ vpiHandle vpip_make_number_const(struct __vpiNumberConst*ref, /* * $Log: vpi_const.c,v $ + * Revision 1.4 1999/11/06 22:16:50 steve + * Get the $strobe task working. + * * Revision 1.3 1999/11/06 16:52:16 steve * complete value retrieval for number constants. *