diff --git a/vpi_user.h b/vpi_user.h index 33120b1c5..09c8edcea 100644 --- a/vpi_user.h +++ b/vpi_user.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: vpi_user.h,v 1.2 2001/03/22 02:23:17 steve Exp $" +#ident "$Id: vpi_user.h,v 1.3 2001/04/25 04:45:52 steve Exp $" #endif @@ -30,9 +30,15 @@ #endif #ifdef __cplusplus -extern "C" { +# define EXTERN_C_START extern "C" { +# define EXTERN_C_END } +#else +# define EXTERN_C_START +# define EXTERN_C_END #endif +EXTERN_C_START + typedef struct __vpiHandle *vpiHandle; /* @@ -253,6 +259,26 @@ extern void vpi_get_time(vpiHandle obj, s_vpi_time*t); extern int vpi_get(int property, vpiHandle ref); extern char* vpi_get_str(int property, vpiHandle ref); extern void vpi_get_value(vpiHandle expr, p_vpi_value value); + +/* + * This function puts a value into the object referenced by the + * handle. This assumes that the value supports having its value + * written to. The time parameter specifies when the assignment is to + * take place. This allows you to schedule an assignment to happen in + * the future. + * + * The flags value specifies the delay model to use in assigning the + * value. This specifies how the time value is to be used. + * + * vpiNoDelay -- Set the value immediately. The p_vpi_time parameter + * may be NULL, in this case. This is like a blocking assignment + * in behavioral code. + * + * vpiInertialDelay -- Set the value using the transport delay. The + * p_vpi_time parameter is required and specifies when the + * assignment is to take place. This is like a non-blocking + * assignment in behavioral code. + */ extern vpiHandle vpi_put_value(vpiHandle obj, p_vpi_value value, p_vpi_time when, int flags); @@ -263,12 +289,13 @@ extern int vpi_get_vlog_info(p_vpi_vlog_info vlog_info_p); /* This is the table of startup routines included in each module. */ extern DLLEXPORT void (*vlog_startup_routines[])(); -#ifdef __cplusplus -} -#endif +EXTERN_C_END /* * $Log: vpi_user.h,v $ + * Revision 1.3 2001/04/25 04:45:52 steve + * Implement vpi_put_value for signals. + * * Revision 1.2 2001/03/22 02:23:17 steve * fgetc patch from Peter Monta. * diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index 78907c5ec..49b87bfe0 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.7 2001/04/05 01:34:26 steve Exp $" +#ident "$Id: vpi_signal.cc,v 1.8 2001/04/25 04:45:52 steve Exp $" #endif /* @@ -246,15 +246,72 @@ static void signal_get_value(vpiHandle ref, s_vpi_value*vp) * equivilent instruction would cause. */ static vpiHandle signal_put_value(vpiHandle ref, s_vpi_value*vp, - p_vpi_time when, int flags) + p_vpi_time when, int flags) { assert((ref->vpi_type->type_code==vpiNet) || (ref->vpi_type->type_code==vpiReg)); struct __vpiSignal*rfp = (struct __vpiSignal*)ref; - /* XXXX Not implemented yet. */ - assert(0); + /* XXXX delays are not yet supported. */ + assert(flags == vpiNoDelay); + + unsigned wid = (rfp->msb >= rfp->lsb) + ? (rfp->msb - rfp->lsb + 1) + : (rfp->lsb - rfp->msb + 1); + + switch (vp->format) { + + case vpiScalarVal: + switch (vp->value.scalar) { + case vpi0: + functor_set(rfp->bits, 0, true); + break; + case vpi1: + functor_set(rfp->bits, 1, true); + break; + case vpiX: + functor_set(rfp->bits, 2, true); + break; + case vpiZ: + functor_set(rfp->bits, 3, true); + break; + default: + assert(0); + } + break; + + case vpiVectorVal: { + assert(wid <= sizeof (unsigned long)); + + unsigned long aval = vp->value.vector->aval; + unsigned long bval = vp->value.vector->bval; + for (unsigned idx = 0 ; idx < wid ; idx += 1) { + int bit = (aval&1) | ((bval<<1)&2); + switch (bit) { + case 0: /* zero */ + functor_set(ipoint_index(rfp->bits,idx), 0, true); + break; + case 1: /* one */ + functor_set(ipoint_index(rfp->bits,idx), 1, true); + break; + case 2: /* z */ + functor_set(ipoint_index(rfp->bits,idx), 3, true); + break; + case 3: /* x */ + functor_set(ipoint_index(rfp->bits,idx), 2, true); + break; + } + aval >>= 1; + bval >>= 1; + } + break; + } + + default: + assert(0); + + } return ref; } @@ -326,6 +383,9 @@ vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag, /* * $Log: vpi_signal.cc,v $ + * Revision 1.8 2001/04/25 04:45:52 steve + * Implement vpi_put_value for signals. + * * Revision 1.7 2001/04/05 01:34:26 steve * Add the .var/s and .net/s statements for VPI support. *