From 3fe034424614a621cbfeaccf2bb51a4592024425 Mon Sep 17 00:00:00 2001 From: steve Date: Sat, 6 Nov 1999 16:52:16 +0000 Subject: [PATCH] complete value retrieval for number constants. --- vvm/vpi_const.c | 217 +++++++++++++++++++++++++++++++++++++++++++++-- vvm/vpi_priv.h | 8 +- vvm/vpi_signal.c | 206 ++------------------------------------------ 3 files changed, 220 insertions(+), 211 deletions(-) diff --git a/vvm/vpi_const.c b/vvm/vpi_const.c index 2a8290d5b..387c4daf6 100644 --- a/vvm/vpi_const.c +++ b/vvm/vpi_const.c @@ -17,11 +17,213 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_const.c,v 1.2 1999/11/06 16:00:18 steve Exp $" +#ident "$Id: vpi_const.c,v 1.3 1999/11/06 16:52:16 steve Exp $" #endif # include "vpi_priv.h" # include +# include +# include + + +/* + * This function is used in a couple places to interpret a bit string + * as a value. + */ +void vpip_bits_get_value(enum vpip_bit_t*bits, unsigned nbits, s_vpi_value*vp) +{ + static char buff[1024]; + char*cp; + unsigned val; + unsigned idx; + + cp = buff; + + switch (vp->format) { + case vpiObjTypeVal: + case vpiBinStrVal: + for (idx = 0 ; idx < nbits ; idx += 1) + switch (bits[nbits-idx-1]) { + case V0: + *cp++ = '0'; + break; + case V1: + *cp++ = '1'; + break; + case Vx: + *cp++ = 'x'; + break; + case Vz: + *cp++ = 'z'; + break; + } + vp->format = vpiBinStrVal; + break; + + case vpiDecStrVal: + val = 0; + for (idx = 0 ; idx < nbits ; idx += 1) { + val *= 2; + switch (bits[nbits-idx-1]) { + case V0: + case Vx: + case Vz: + break; + case V1: + val += 1; + break; + } + } + sprintf(cp, "%u", val); + cp += strlen(cp); + break; + + case vpiOctStrVal: + if (nbits%3) { + unsigned x = 0; + unsigned z = 0; + unsigned v = 0; + unsigned i; + for (i = 0 ; i < nbits%3 ; i += 1) { + v *= 2; + switch (bits[nbits-i-1]) { + case V0: + break; + case V1: + v += 1; + break; + case Vx: + x += 1; + break; + case Vz: + z += 1; + break; + } + } + if (x == nbits%3) + *cp++ = 'x'; + else if (x > 0) + *cp++ = 'X'; + else if (z == nbits%3) + *cp++ = 'z'; + else if (z > 0) + *cp++ = 'Z'; + else + *cp++ = "01234567"[v]; + } + + for (idx = nbits%3 ; idx < nbits ; idx += 3) { + unsigned x = 0; + unsigned z = 0; + unsigned v = 0; + unsigned i; + for (i = idx ; i < idx+3 ; i += 1) { + v *= 2; + switch (bits[nbits-i-1]) { + case V0: + break; + case V1: + v += 1; + break; + case Vx: + x += 1; + break; + case Vz: + z += 1; + break; + } + } + if (x == 3) + *cp++ = 'x'; + else if (x > 0) + *cp++ = 'X'; + else if (z == 3) + *cp++ = 'z'; + else if (z > 0) + *cp++ = 'Z'; + else + *cp++ = "01234567"[v]; + } + break; + + case vpiHexStrVal: + if (nbits%4) { + unsigned x = 0; + unsigned z = 0; + unsigned v = 0; + unsigned i; + for (i = 0 ; i < nbits%4 ; i += 1) { + v *= 2; + switch (bits[nbits-i-1]) { + case V0: + break; + case V1: + v += 1; + break; + case Vx: + x += 1; + break; + case Vz: + z += 1; + break; + } + } + if (x == nbits%4) + *cp++ = 'x'; + else if (x > 0) + *cp++ = 'X'; + else if (z == nbits%4) + *cp++ = 'z'; + else if (z > 0) + *cp++ = 'Z'; + else + *cp++ = "0123456789abcdef"[v]; + } + + for (idx = nbits%4 ; idx < nbits ; idx += 4) { + unsigned x = 0; + unsigned z = 0; + unsigned v = 0; + unsigned i; + for (i = idx ; i < idx+4 ; i += 1) { + v *= 2; + switch (bits[nbits-i-1]) { + case V0: + break; + case V1: + v += 1; + break; + case Vx: + x += 1; + break; + case Vz: + z += 1; + break; + } + } + if (x == 4) + *cp++ = 'x'; + else if (x > 0) + *cp++ = 'X'; + else if (z == 4) + *cp++ = 'z'; + else if (z > 0) + *cp++ = 'Z'; + else + *cp++ = "0123456789abcdef"[v]; + } + break; + + default: + *cp++ = '('; + *cp++ = '?'; + *cp++ = ')'; + break; + } + + *cp++ = 0; + vp->value.str = buff; +} static void string_value(vpiHandle ref, p_vpi_value vp) @@ -44,15 +246,9 @@ static void string_value(vpiHandle ref, p_vpi_value vp) static void number_value(vpiHandle ref, p_vpi_value vp) { - struct __vpiStringConst*rfp = (struct __vpiStringConst*)ref; + struct __vpiNumberConst*rfp = (struct __vpiNumberConst*)ref; assert(ref->vpi_type->type_code == vpiConstant); - - switch (vp->format) { - - default: - vp->format = vpiSuppressVal; - break; - } + vpip_bits_get_value(rfp->bits, rfp->nbits, vp); } static const struct __vpirt vpip_string_rt = { @@ -92,6 +288,9 @@ vpiHandle vpip_make_number_const(struct __vpiNumberConst*ref, /* * $Log: vpi_const.c,v $ + * Revision 1.3 1999/11/06 16:52:16 steve + * complete value retrieval for number constants. + * * Revision 1.2 1999/11/06 16:00:18 steve * Put number constants into a static table. * diff --git a/vvm/vpi_priv.h b/vvm/vpi_priv.h index d127dec0c..b9a7a384f 100644 --- a/vvm/vpi_priv.h +++ b/vvm/vpi_priv.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_priv.h,v 1.4 1999/11/06 16:00:18 steve Exp $" +#ident "$Id: vpi_priv.h,v 1.5 1999/11/06 16:52:16 steve Exp $" #endif /* @@ -37,6 +37,9 @@ extern "C" { struct __vpirt; enum vpip_bit_t { V0 = 0, V1, Vx, Vz }; +extern void vpip_bits_get_value(enum vpip_bit_t*bits, unsigned nbits, + s_vpi_value*vp); + /* * This structure is the very base of a vpiHandle. Every handle * structure starts with this structure, so that the library can @@ -236,6 +239,9 @@ extern int vpip_finished(); /* * $Log: vpi_priv.h,v $ + * Revision 1.5 1999/11/06 16:52:16 steve + * complete value retrieval for number constants. + * * Revision 1.4 1999/11/06 16:00:18 steve * Put number constants into a static table. * diff --git a/vvm/vpi_signal.c b/vvm/vpi_signal.c index b59718382..7a8c614fe 100644 --- a/vvm/vpi_signal.c +++ b/vvm/vpi_signal.c @@ -17,13 +17,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_signal.c,v 1.2 1999/10/29 03:37:22 steve Exp $" +#ident "$Id: vpi_signal.c,v 1.3 1999/11/06 16:52:16 steve Exp $" #endif # include "vpi_priv.h" # include -# include -# include static char* signal_get_str(int code, vpiHandle ref) @@ -39,207 +37,10 @@ static char* signal_get_str(int code, vpiHandle ref) return 0; } -/* - * This function is a get_value_ method of a vpiHandle, that supports - * reading bits as a string. - */ static void signal_get_value(vpiHandle ref, s_vpi_value*vp) { - static char buff[1024]; - char*cp; - unsigned width; - unsigned val; - unsigned idx; struct __vpiSignal*rfp = (struct __vpiSignal*)ref; - - assert(rfp->bits); - width = rfp->nbits; - cp = buff; - - switch (vp->format) { - case vpiObjTypeVal: - case vpiBinStrVal: - for (idx = 0 ; idx < width ; idx += 1) - switch (rfp->bits[width-idx-1]) { - case V0: - *cp++ = '0'; - break; - case V1: - *cp++ = '1'; - break; - case Vx: - *cp++ = 'x'; - break; - case Vz: - *cp++ = 'z'; - break; - } - vp->format = vpiBinStrVal; - break; - - case vpiDecStrVal: - val = 0; - for (idx = 0 ; idx < width ; idx += 1) { - val *= 2; - switch (rfp->bits[width-idx-1]) { - case V0: - case Vx: - case Vz: - break; - case V1: - val += 1; - break; - } - } - sprintf(cp, "%u", val); - cp += strlen(cp); - break; - - case vpiOctStrVal: - if (width%3) { - unsigned x = 0; - unsigned z = 0; - unsigned v = 0; - unsigned i; - for (i = 0 ; i < width%3 ; i += 1) { - v *= 2; - switch (rfp->bits[width-i-1]) { - case V0: - break; - case V1: - v += 1; - break; - case Vx: - x += 1; - break; - case Vz: - z += 1; - break; - } - } - if (x == width%3) - *cp++ = 'x'; - else if (x > 0) - *cp++ = 'X'; - else if (z == width%3) - *cp++ = 'z'; - else if (z > 0) - *cp++ = 'Z'; - else - *cp++ = "01234567"[v]; - } - - for (idx = width%3 ; idx < width ; idx += 3) { - unsigned x = 0; - unsigned z = 0; - unsigned v = 0; - unsigned i; - for (i = idx ; i < idx+3 ; i += 1) { - v *= 2; - switch (rfp->bits[width-i-1]) { - case V0: - break; - case V1: - v += 1; - break; - case Vx: - x += 1; - break; - case Vz: - z += 1; - break; - } - } - if (x == 3) - *cp++ = 'x'; - else if (x > 0) - *cp++ = 'X'; - else if (z == 3) - *cp++ = 'z'; - else if (z > 0) - *cp++ = 'Z'; - else - *cp++ = "01234567"[v]; - } - break; - - case vpiHexStrVal: - if (width%4) { - unsigned x = 0; - unsigned z = 0; - unsigned v = 0; - unsigned i; - for (i = 0 ; i < width%4 ; i += 1) { - v *= 2; - switch (rfp->bits[width-i-1]) { - case V0: - break; - case V1: - v += 1; - break; - case Vx: - x += 1; - break; - case Vz: - z += 1; - break; - } - } - if (x == width%4) - *cp++ = 'x'; - else if (x > 0) - *cp++ = 'X'; - else if (z == width%4) - *cp++ = 'z'; - else if (z > 0) - *cp++ = 'Z'; - else - *cp++ = "0123456789abcdef"[v]; - } - - for (idx = width%4 ; idx < width ; idx += 4) { - unsigned x = 0; - unsigned z = 0; - unsigned v = 0; - unsigned i; - for (i = idx ; i < idx+4 ; i += 1) { - v *= 2; - switch (rfp->bits[width-i-1]) { - case V0: - break; - case V1: - v += 1; - break; - case Vx: - x += 1; - break; - case Vz: - z += 1; - break; - } - } - if (x == 4) - *cp++ = 'x'; - else if (x > 0) - *cp++ = 'X'; - else if (z == 4) - *cp++ = 'z'; - else if (z > 0) - *cp++ = 'Z'; - else - *cp++ = "0123456789abcdef"[v]; - } - break; - - default: - *cp++ = '('; - *cp++ = '?'; - *cp++ = ')'; - break; - } - - *cp++ = 0; - vp->value.str = buff; + vpip_bits_get_value(rfp->bits, rfp->nbits, vp); } static const struct __vpirt vpip_net_rt = { @@ -278,6 +79,9 @@ vpiHandle vpip_make_reg(struct __vpiSignal*ref, const char*name) /* * $Log: vpi_signal.c,v $ + * Revision 1.3 1999/11/06 16:52:16 steve + * complete value retrieval for number constants. + * * Revision 1.2 1999/10/29 03:37:22 steve * Support vpiValueChance callbacks. *