From e7b3168466a796381b347c57ed0ce52bef1906d8 Mon Sep 17 00:00:00 2001 From: steve Date: Thu, 29 May 2003 03:46:21 +0000 Subject: [PATCH] Add tf_getp/putp support for integers and real valued arguments. Add tf_mipname function. --- libveriuser/getp.c | 90 ++++++++++++++++++++++++++++++++++----- libveriuser/putp.c | 95 +++++++++++++++++++++++++++++++++++++----- libveriuser/spname.c | 18 +++++++- veriuser.h | 29 ++++++++++--- vvp/vpi_const.cc | 70 ++++++++++++++++++------------- vvp/vpi_vthr_vector.cc | 15 ++++++- 6 files changed, 260 insertions(+), 57 deletions(-) diff --git a/libveriuser/getp.c b/libveriuser/getp.c index 6fd83c7d7..cd65a7481 100644 --- a/libveriuser/getp.c +++ b/libveriuser/getp.c @@ -1,5 +1,5 @@ /* vi:sw=6 - * Copyright (c) 2002 Michael Ruff (mruff at chiaro.com) + * Copyright (c) 2002,2003 Michael Ruff (mruff at chiaro.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 @@ -17,31 +17,32 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: getp.c,v 1.3 2003/03/15 05:42:39 steve Exp $" +#ident "$Id: getp.c,v 1.4 2003/05/29 03:46:21 steve Exp $" #endif -#include -#include -#include +# include +# include +# include +# include "priv.h" /* - * tf_getp implemented using VPI interface + * tf_getp and friends, implemented using VPI interface */ -int tf_getp(int n) +PLI_INT32 tf_igetp(PLI_INT32 n, void *obj) { vpiHandle sys_h, sys_i, arg_h = 0; s_vpi_value value; - int rtn; + int rtn = 0; assert(n > 0); /* get task/func handle */ - sys_h = vpi_handle(vpiSysTfCall, 0); + sys_h = (vpiHandle)obj; sys_i = vpi_iterate(vpiArgument, sys_h); /* find nth arg */ while (n > 0) { - if (!(arg_h = vpi_scan(sys_i))) assert(0); + if (!(arg_h = vpi_scan(sys_i))) { goto out; } n--; } @@ -60,11 +61,80 @@ int tf_getp(int n) vpi_free_object(sys_i); +out: + if (pli_trace) { + fprintf(pli_trace, "tf_igetp(n=%d, obj=%p) --> %d\n", + n, obj, rtn); + fflush(pli_trace); + } + return rtn; } +PLI_INT32 tf_getp(PLI_INT32 n) +{ + int rtn = tf_igetp(n, vpi_handle(vpiSysTfCall, 0)); + + return rtn; +} + + +double tf_igetrealp(PLI_INT32 n, void *obj) +{ + vpiHandle sys_h, sys_i, arg_h = 0; + s_vpi_value value; + double rtn = 0.0; + + assert(n > 0); + + /* get task/func handle */ + sys_h = (vpiHandle)obj; + sys_i = vpi_iterate(vpiArgument, sys_h); + + /* find nth arg */ + while (n > 0) { + if (!(arg_h = vpi_scan(sys_i))) { goto out; } + n--; + } + + if (vpi_get(vpiType, arg_h) == vpiConstant && + vpi_get(vpiConstType, arg_h) == vpiStringConst) + { + rtn = 0.0; + } else { + value.format = vpiRealVal; + vpi_get_value(arg_h, &value); + rtn = value.value.real; + } + + vpi_free_object(sys_i); + +out: + if (pli_trace) { + fprintf(pli_trace, "tf_igetrealp(n=%d, obj=%p) --> %f\n", + n, obj, rtn); + fflush(pli_trace); + } + + return rtn; +} + +double tf_getrealp(PLI_INT32 n) +{ + double rtn = tf_igetrealp(n, vpi_handle(vpiSysTfCall, 0)); + + return rtn; +} + + /* * $Log: getp.c,v $ + * Revision 1.4 2003/05/29 03:46:21 steve + * Add tf_getp/putp support for integers + * and real valued arguments. + * + * Add tf_mipname function. + * * Revision 1.3 2003/03/15 05:42:39 steve * free argument iterators. * diff --git a/libveriuser/putp.c b/libveriuser/putp.c index c64d980ef..b0fc2b5dd 100644 --- a/libveriuser/putp.c +++ b/libveriuser/putp.c @@ -1,5 +1,5 @@ /* vi:sw=6 - * Copyright (c) 2002 Michael Ruff (mruff at chiaro.com) + * Copyright (c) 2002,2003 Michael Ruff (mruff at chiaro.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 @@ -17,36 +17,37 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: putp.c,v 1.3 2003/03/15 05:42:39 steve Exp $" +#ident "$Id: putp.c,v 1.4 2003/05/29 03:46:21 steve Exp $" #endif -#include -#include -#include +# include +# include +# include +# include "priv.h" /* - * tf_putp implemented using VPI interface + * tf_putp and friends implemented using VPI interface */ -void tf_putp(int n, int value) +PLI_INT32 tf_iputp(PLI_INT32 n, PLI_INT32 value, void *obj) { vpiHandle sys_h, sys_i, arg_h = 0; s_vpi_value val; - int type; + int rtn = 0, type; assert(n >= 0); /* get task/func handle */ - sys_h = vpi_handle(vpiSysTfCall, 0); + sys_h = (vpiHandle)obj; sys_i = vpi_iterate(vpiArgument, sys_h); type = vpi_get(vpiType, sys_h); /* verify function */ - assert(!(n == 0 && type != vpiSysFuncCall)); + if (n == 0 && type != vpiSysFuncCall) { rtn = 1; goto free; } /* find nth arg */ while (n > 0) { - if (!(arg_h = vpi_scan(sys_i))) assert(0); + if (!(arg_h = vpi_scan(sys_i))) { rtn = 1; goto out; } n--; } if (!arg_h) arg_h = sys_h; @@ -56,11 +57,83 @@ void tf_putp(int n, int value) val.value.integer = value; (void)vpi_put_value(arg_h, &val, 0, vpiNoDelay); +free: vpi_free_object(sys_i); + +out: + if (pli_trace) { + fprintf(pli_trace, "tf_iputp(n=%d, value=%d, obj=%p) --> %d\n", + n, value, obj, rtn); + fflush(pli_trace); + } + + return rtn; } +PLI_INT32 tf_putp(PLI_INT32 n, PLI_INT32 value) +{ + int rtn = tf_iputp(n, value, vpi_handle(vpiSysTfCall, 0)); + + return rtn; +} + + +PLI_INT32 tf_iputrealp(PLI_INT32 n, double value, void *obj) +{ + vpiHandle sys_h, sys_i, arg_h = 0; + s_vpi_value val; + int rtn = 0, type; + + assert(n >= 0); + + /* get task/func handle */ + sys_h = (vpiHandle)obj; + sys_i = vpi_iterate(vpiArgument, sys_h); + + type = vpi_get(vpiType, sys_h); + + /* verify function */ + if (n == 0 && type != vpiSysFuncCall) { rtn = 1; goto free; } + + /* find nth arg */ + while (n > 0) { + if (!(arg_h = vpi_scan(sys_i))) { rtn = 1; goto out; } + n--; + } + if (!arg_h) arg_h = sys_h; + + /* fill in vpi_value */ + val.format = vpiRealVal; + val.value.real = value; + (void)vpi_put_value(arg_h, &val, 0, vpiNoDelay); + +free: + vpi_free_object(sys_i); + +out: + if (pli_trace) { + fprintf(pli_trace, "tf_iputrealp(n=%d, value=%f, obj=%p) --> %d\n", + n, value, obj, rtn); + fflush(pli_trace); + } + + return rtn; +} + +PLI_INT32 tf_putrealp(PLI_INT32 n, double value) +{ + int rtn = tf_iputrealp(n, value, vpi_handle(vpiSysTfCall, 0)); + + return rtn; +} /* * $Log: putp.c,v $ + * Revision 1.4 2003/05/29 03:46:21 steve + * Add tf_getp/putp support for integers + * and real valued arguments. + * + * Add tf_mipname function. + * * Revision 1.3 2003/03/15 05:42:39 steve * free argument iterators. * diff --git a/libveriuser/spname.c b/libveriuser/spname.c index 543cc6d87..6ba9c5821 100644 --- a/libveriuser/spname.c +++ b/libveriuser/spname.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: spname.c,v 1.2 2003/05/18 00:16:35 steve Exp $" +#ident "$Id: spname.c,v 1.3 2003/05/29 03:46:21 steve Exp $" #endif #include @@ -43,8 +43,24 @@ char* tf_spname(void) return rtn; } +char *tf_imipname(void *obj) +{ + return vpi_get_str(vpiFullName, vpi_handle(vpiScope, (vpiHandle)obj)); +} + +char *tf_mipname(void) +{ + return tf_imipname(vpi_handle(vpiSysTfCall,0)); +} + /* * $Log: spname.c,v $ + * Revision 1.3 2003/05/29 03:46:21 steve + * Add tf_getp/putp support for integers + * and real valued arguments. + * + * Add tf_mipname function. + * * Revision 1.2 2003/05/18 00:16:35 steve * Add PLI_TRACE tracing of PLI1 modules. * diff --git a/veriuser.h b/veriuser.h index 16c94dd29..2eed96b62 100644 --- a/veriuser.h +++ b/veriuser.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: veriuser.h,v 1.27 2003/05/28 03:38:05 steve Exp $" +#ident "$Id: veriuser.h,v 1.28 2003/05/29 03:46:21 steve Exp $" #endif /* @@ -249,7 +249,11 @@ extern PLI_BYTE8* tf_getinstance(void); extern int tf_getlongp(int*aof_highvalue, int pnum); -extern int tf_getp(int pnum); +extern PLI_INT32 tf_getp(PLI_INT32); +extern PLI_INT32 tf_igetp(PLI_INT32, void*); + +extern double tf_getrealp(PLI_INT32); +extern double tf_igetrealp(PLI_INT32, void*); extern char *tf_strgettime(void); extern PLI_INT32 tf_gettime(void); @@ -272,15 +276,19 @@ extern PLI_INT32 tf_message(PLI_INT32 level, char*facility, extern void tf_multiply_long(PLI_INT32*aof_low1, PLI_INT32*aof_high1, PLI_INT32 aof_low2, PLI_INT32 aof_high2); -extern int tf_nump(void); -extern int tf_inump(void*); +extern PLI_INT32 tf_nump(void); +extern PLI_INT32 tf_inump(void*); /* IEEE1364 NOTE: tf_putlongp is listed as returning in in the header file shown in the standard, but as returning void in the detailed - description of the function. So I call it void. Same for tf_putp. */ + description of the function. So I call it void. */ extern void tf_putlongp(int pnum, int lowvalue, int highvalue); -extern void tf_putp(int pnum, int value); +extern PLI_INT32 tf_putp(PLI_INT32, PLI_INT32); +extern PLI_INT32 tf_iputp(PLI_INT32, PLI_INT32, void*); + +extern PLI_INT32 tf_putrealp(PLI_INT32, double); +extern PLI_INT32 tf_iputrealp(PLI_INT32, double, void*); /* Activate the misctf function after a delay. The units are of the current scope. The tf_isetdelay variant specifies a particular @@ -299,6 +307,9 @@ extern PLI_INT32 tf_setworkarea(void*workarea); task call. */ extern char* tf_spname(void); +extern char* tf_mipname(void); +extern char* tf_imipname(void*); + extern PLI_INT32 tf_synchronize(void); extern PLI_INT32 tf_isynchronize(void* sys); @@ -311,6 +322,12 @@ EXTERN_C_END /* * $Log: veriuser.h,v $ + * Revision 1.28 2003/05/29 03:46:21 steve + * Add tf_getp/putp support for integers + * and real valued arguments. + * + * Add tf_mipname function. + * * Revision 1.27 2003/05/28 03:38:05 steve * Implement tf_inump * diff --git a/vvp/vpi_const.cc b/vvp/vpi_const.cc index ce00ebee7..18d7e31bf 100644 --- a/vvp/vpi_const.cc +++ b/vvp/vpi_const.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: vpi_const.cc,v 1.28 2003/03/17 23:47:25 steve Exp $" +#ident "$Id: vpi_const.cc,v 1.29 2003/05/29 03:46:21 steve Exp $" #endif # include "vpi_priv.h" @@ -317,6 +317,36 @@ static void binary_vpiStringVal(struct __vpiBinaryConst*rfp, p_vpi_value vp) vp->value.str = rbuf; } +static int bits2int(struct __vpiBinaryConst*rfp) +{ + unsigned val = 0; + unsigned bit_val = 0; + unsigned bit_limit = rfp->nbits; + if (bit_limit > 8*sizeof(val)) + bit_limit = 8*sizeof(val); + + for (unsigned idx = 0 ; idx < bit_limit ; idx += 1) { + unsigned nibble = idx/4; + unsigned shift = 2 * (idx%4); + bit_val = (rfp->bits[nibble] >> shift) & 3; + if (bit_val > 1) { + return 0; + } else { + val |= bit_val << idx; + } + } + + /* sign extend */ + if (rfp->signed_flag && bit_val) { + for (unsigned idx = rfp->nbits; idx vpi_type->type_code == vpiConstant); @@ -385,33 +415,7 @@ static void binary_value(vpiHandle ref, p_vpi_value vp) } case vpiIntVal: { - unsigned val = 0; - unsigned bit_val = 0; - unsigned bit_limit = rfp->nbits; - if (bit_limit > 8*sizeof(val)) - bit_limit = 8*sizeof(val); - - for (unsigned idx = 0 ; idx < bit_limit ; idx += 1) { - unsigned nibble = idx/4; - unsigned shift = 2 * (idx%4); - bit_val = (rfp->bits[nibble] >> shift) & 3; - if (bit_val > 1) { - vp->value.integer = 0; - return; - } else { - val |= bit_val << idx; - } - } - - /* sign extend */ - if (rfp->signed_flag && bit_val) { - for (unsigned idx = rfp->nbits; idx value.integer = val; + vp->value.integer = bits2int(rfp); break; } @@ -458,6 +462,10 @@ static void binary_value(vpiHandle ref, p_vpi_value vp) break; } + case vpiRealVal: + vp->value.real = (double)bits2int(rfp); + break; + case vpiStringVal: binary_vpiStringVal(rfp, vp); break; @@ -633,6 +641,12 @@ vpiHandle vpip_make_dec_const(int value) /* * $Log: vpi_const.cc,v $ + * Revision 1.29 2003/05/29 03:46:21 steve + * Add tf_getp/putp support for integers + * and real valued arguments. + * + * Add tf_mipname function. + * * Revision 1.28 2003/03/17 23:47:25 steve * Make a safe copy of const string values. * diff --git a/vvp/vpi_vthr_vector.cc b/vvp/vpi_vthr_vector.cc index e94acd907..88f555d72 100644 --- a/vvp/vpi_vthr_vector.cc +++ b/vvp/vpi_vthr_vector.cc @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: vpi_vthr_vector.cc,v 1.15 2003/05/28 03:10:52 steve Exp $" +#ident "$Id: vpi_vthr_vector.cc,v 1.16 2003/05/29 03:46:21 steve Exp $" #endif /* @@ -412,6 +412,10 @@ static void vthr_real_get_value(vpiHandle ref, s_vpi_value*vp) vp->value.real = val; break; + case vpiIntVal: + vp->value.integer = (int)(val + 0.5); + break; + case vpiDecStrVal: sprintf(rbuf, "%0.0f", val); vp->value.str = rbuf; @@ -447,6 +451,9 @@ static void vthr_real_get_value(vpiHandle ref, s_vpi_value*vp) } default: + fprintf(stderr, "vvp error: get %d not supported " + "by vpiConstant (Real)\n", vp->format); + vp->format = vpiSuppressVal; break; } @@ -480,6 +487,12 @@ vpiHandle vpip_make_vthr_word(unsigned base, const char*type) /* * $Log: vpi_vthr_vector.cc,v $ + * Revision 1.16 2003/05/29 03:46:21 steve + * Add tf_getp/putp support for integers + * and real valued arguments. + * + * Add tf_mipname function. + * * Revision 1.15 2003/05/28 03:10:52 steve * Some asserts that check for thread vector overflow. *