From 706f2ffc89e52bf18f46e5a90f6e8f7e56f1be87 Mon Sep 17 00:00:00 2001 From: steve Date: Mon, 15 Oct 2001 01:49:50 +0000 Subject: [PATCH] Support getting scope of scope, and scope of signals. --- vvp/vpi_priv.h | 6 +++++- vvp/vpi_scope.cc | 40 ++++++++++++++++++++++++++++++++++++++-- vvp/vpi_signal.cc | 25 ++++++++++++++++++++++--- 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/vvp/vpi_priv.h b/vvp/vpi_priv.h index 6bfb4497c..021606641 100644 --- a/vvp/vpi_priv.h +++ b/vvp/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.22 2001/08/08 01:05:06 steve Exp $" +#ident "$Id: vpi_priv.h,v 1.23 2001/10/15 01:49:50 steve Exp $" #endif # include "vpi_user.h" @@ -81,6 +81,7 @@ extern vpiHandle vpip_make_iterator(unsigned nargs, vpiHandle*args); */ struct __vpiScope { struct __vpiHandle base; + struct __vpiScope *scope; /* The scope has a name. */ char*name; /* Keep an array of internal scope items. */ @@ -258,6 +259,9 @@ extern void vpip_set_time_precision(int pres); /* * $Log: vpi_priv.h,v $ + * Revision 1.23 2001/10/15 01:49:50 steve + * Support getting scope of scope, and scope of signals. + * * Revision 1.22 2001/08/08 01:05:06 steve * Initial implementation of vvp_fvectors. * (Stephan Boettcher) diff --git a/vvp/vpi_scope.cc b/vvp/vpi_scope.cc index f8746840b..786a5705d 100644 --- a/vvp/vpi_scope.cc +++ b/vvp/vpi_scope.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_scope.cc,v 1.7 2001/09/15 18:27:05 steve Exp $" +#ident "$Id: vpi_scope.cc,v 1.8 2001/10/15 01:49:50 steve Exp $" #endif # include "compile.h" @@ -33,6 +33,7 @@ static char* scope_get_str(int code, vpiHandle obj) { struct __vpiScope*ref = (struct __vpiScope*)obj; + char *n, *nn; assert((obj->vpi_type->type_code == vpiModule) || (obj->vpi_type->type_code == vpiNamedBegin) @@ -41,12 +42,41 @@ static char* scope_get_str(int code, vpiHandle obj) switch (code) { case vpiFullName: return ref->name; + + case vpiName: + nn = n = ref->name; + while (*n) + if (*n=='\\' && *++n) + ++n; + else if (*n=='.') + nn = ++n; + else + ++n; + return nn; + default: assert(0); return 0; } } +static vpiHandle scope_get_handle(int code, vpiHandle obj) +{ + assert((obj->vpi_type->type_code == vpiModule) + || (obj->vpi_type->type_code == vpiNamedBegin) + || (obj->vpi_type->type_code == vpiTask)); + + struct __vpiScope*rfp = (struct __vpiScope*)obj; + + switch (code) { + + case vpiScope: + return &rfp->scope->base; + } + + return 0; +} + static vpiHandle module_iter(int code, vpiHandle obj) { struct __vpiScope*ref = (struct __vpiScope*)obj; @@ -68,7 +98,7 @@ static const struct __vpirt vpip_scope_rt = { scope_get_str, 0, 0, - 0, + scope_get_handle, module_iter }; @@ -115,6 +145,9 @@ void compile_scope_decl(char*label, char*name, char*parent) assert(obj); struct __vpiScope*sp = (struct __vpiScope*) obj; attach_to_scope_(sp, &scope->base); + scope->scope = (struct __vpiScope*)obj; + } else { + scope->scope = 0x0; } } @@ -137,6 +170,9 @@ void vpip_attach_to_current_scope(vpiHandle obj) /* * $Log: vpi_scope.cc,v $ + * Revision 1.8 2001/10/15 01:49:50 steve + * Support getting scope of scope, and scope of signals. + * * Revision 1.7 2001/09/15 18:27:05 steve * Make configure detect malloc.h * diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index ab1885712..5add5e23e 100644 --- a/vvp/vpi_signal.cc +++ b/vvp/vpi_signal.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_signal.cc,v 1.25 2001/09/30 05:18:46 steve Exp $" +#ident "$Id: vpi_signal.cc,v 1.26 2001/10/15 01:49:50 steve Exp $" #endif /* @@ -106,6 +106,22 @@ static char* signal_get_str(int code, vpiHandle ref) return 0; } +static vpiHandle signal_get_handle(int code, vpiHandle ref) +{ + assert((ref->vpi_type->type_code==vpiNet) + || (ref->vpi_type->type_code==vpiReg)); + + struct __vpiSignal*rfp = (struct __vpiSignal*)ref; + + switch (code) { + + case vpiScope: + return &rfp->scope->base; + } + + return 0; +} + static char buf[4096]; static void signal_vpiDecStrVal(struct __vpiSignal*rfp, s_vpi_value*vp) @@ -455,7 +471,7 @@ static const struct __vpirt vpip_reg_rt = { signal_get_str, signal_get_value, signal_put_value, - 0, + signal_get_handle, 0 }; @@ -465,7 +481,7 @@ static const struct __vpirt vpip_net_rt = { signal_get_str, signal_get_value, signal_put_value, - 0, + signal_get_handle, 0 }; @@ -505,6 +521,9 @@ vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag, /* * $Log: vpi_signal.cc,v $ + * Revision 1.26 2001/10/15 01:49:50 steve + * Support getting scope of scope, and scope of signals. + * * Revision 1.25 2001/09/30 05:18:46 steve * Reduce VCD output by removing duplicates. (Stephan Boettcher) *