diff --git a/vvp/compile.cc b/vvp/compile.cc index 16873f978..7234271d5 100644 --- a/vvp/compile.cc +++ b/vvp/compile.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: compile.cc,v 1.130 2002/06/02 18:55:58 steve Exp $" +#ident "$Id: compile.cc,v 1.131 2002/06/21 04:58:55 steve Exp $" #endif # include "arith.h" @@ -207,7 +207,8 @@ static vvp_ipoint_t ipoint_lookup(const char *label, unsigned idx) if (val.ptr) { vpiHandle vpi = (vpiHandle) val.ptr; assert((vpi->vpi_type->type_code == vpiNet) - || (vpi->vpi_type->type_code == vpiReg)); + || (vpi->vpi_type->type_code == vpiReg) + || (vpi->vpi_type->type_code == vpiIntegerVar)); __vpiSignal*sig = (__vpiSignal*)vpi; return vvp_fvector_get(sig->bits, idx); @@ -1354,7 +1355,7 @@ void compile_thread(char*start_sym) * write the label into the symbol table. */ void compile_variable(char*label, char*name, int msb, int lsb, - bool signed_flag) + char signed_flag) { unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1; @@ -1368,7 +1369,9 @@ void compile_variable(char*label, char*name, int msb, int lsb, /* Make the vpiHandle for the reg. */ vvp_fvector_t vec = vvp_fvector_continuous_new(wid, fdx); - vpiHandle obj = vpip_make_reg(name, msb, lsb, signed_flag, vec); + vpiHandle obj = (signed_flag > 1) ? + vpip_make_int(name, msb, lsb, vec) : + vpip_make_reg(name, msb, lsb, signed_flag!=0, vec); compile_vpi_symbol(label, obj); vpip_attach_to_current_scope(obj); @@ -1414,6 +1417,9 @@ vvp_ipoint_t debug_lookup_functor(const char*name) /* * $Log: compile.cc,v $ + * Revision 1.131 2002/06/21 04:58:55 steve + * Add support for special integer vectors. + * * Revision 1.130 2002/06/02 18:55:58 steve * Add %cmpi/u instruction. * diff --git a/vvp/compile.h b/vvp/compile.h index 498fd72d8..226dcabc7 100644 --- a/vvp/compile.h +++ b/vvp/compile.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: compile.h,v 1.42 2002/05/18 02:34:11 steve Exp $" +#ident "$Id: compile.h,v 1.43 2002/06/21 04:58:55 steve Exp $" #endif # include @@ -241,7 +241,7 @@ extern void compile_thread(char*start_sym); * This function is called to create a var vector with the given name. */ extern void compile_variable(char*label, char*name, - int msb, int lsb, bool signed_flag); + int msb, int lsb, char signed_flag); extern void compile_net(char*label, char*name, int msb, int lsb, bool signed_flag, @@ -249,6 +249,9 @@ extern void compile_net(char*label, char*name, /* * $Log: compile.h,v $ + * Revision 1.43 2002/06/21 04:58:55 steve + * Add support for special integer vectors. + * * Revision 1.42 2002/05/18 02:34:11 steve * Add vpi support for named events. * diff --git a/vvp/lexor.lex b/vvp/lexor.lex index c961e3bd9..862fc4ab5 100644 --- a/vvp/lexor.lex +++ b/vvp/lexor.lex @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: lexor.lex,v 1.33 2002/04/14 03:53:20 steve Exp $" +#ident "$Id: lexor.lex,v 1.34 2002/06/21 04:58:55 steve Exp $" #endif # include "parse_misc.h" @@ -103,6 +103,7 @@ ".ufunc" { return K_UFUNC; } ".var" { return K_VAR; } ".var/s" { return K_VAR_S; } +".var/i" { return K_VAR_I; /* integer */ } ".udp" { return K_UDP; } ".udp/c"(omb)? { return K_UDP_C; } ".udp/s"(equ)? { return K_UDP_S; } @@ -172,6 +173,9 @@ int yywrap() /* * $Log: lexor.lex,v $ + * Revision 1.34 2002/06/21 04:58:55 steve + * Add support for special integer vectors. + * * Revision 1.33 2002/04/14 03:53:20 steve * Allow signed constant vectors for call_vpi parameters. * diff --git a/vvp/parse.y b/vvp/parse.y index 9c3096850..6f830f1c1 100644 --- a/vvp/parse.y +++ b/vvp/parse.y @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: parse.y,v 1.46 2002/05/18 02:34:11 steve Exp $" +#ident "$Id: parse.y,v 1.47 2002/06/21 04:58:55 steve Exp $" #endif # include "parse_misc.h" @@ -64,7 +64,7 @@ extern FILE*yyin; %token K_UDP K_UDP_C K_UDP_S %token K_MEM K_MEM_P K_MEM_I %token K_FORCE -%token K_VAR K_VAR_S K_vpi_call K_vpi_func K_disable K_fork +%token K_VAR K_VAR_S K_VAR_I K_vpi_call K_vpi_func K_disable K_fork %token K_vpi_module K_vpi_time_precision %token T_INSTR @@ -306,10 +306,13 @@ statement the variable in the netlist. */ | T_LABEL K_VAR T_STRING ',' T_NUMBER ',' T_NUMBER ';' - { compile_variable($1, $3, $5, $7, false); } + { compile_variable($1, $3, $5, $7, 0 /* unsigned */ ); } | T_LABEL K_VAR_S T_STRING ',' T_NUMBER ',' T_NUMBER ';' - { compile_variable($1, $3, $5, $7, true); } + { compile_variable($1, $3, $5, $7, 1 /* signed */ ); } + + | T_LABEL K_VAR_I T_STRING ',' T_NUMBER ',' T_NUMBER ';' + { compile_variable($1, $3, $5, $7, 2 /* integer */); } /* Net statements are similar to .var statements, except that they declare nets, and they have an input list. */ @@ -550,6 +553,9 @@ int compile_design(const char*path) /* * $Log: parse.y,v $ + * Revision 1.47 2002/06/21 04:58:55 steve + * Add support for special integer vectors. + * * Revision 1.46 2002/05/18 02:34:11 steve * Add vpi support for named events. * diff --git a/vvp/vpi_priv.cc b/vvp/vpi_priv.cc index 8abd4f60a..6227b64f4 100644 --- a/vvp/vpi_priv.cc +++ b/vvp/vpi_priv.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_priv.cc,v 1.16 2002/06/02 19:05:50 steve Exp $" +#ident "$Id: vpi_priv.cc,v 1.17 2002/06/21 04:58:55 steve Exp $" #endif # include "vpi_priv.h" @@ -64,8 +64,13 @@ int vpi_get(int property, vpiHandle ref) if (ref == 0) return vpip_get_global(property); - if (property == vpiType) - return ref->vpi_type->type_code; + if (property == vpiType) { + struct __vpiSignal*rfp = (struct __vpiSignal*)ref; + if (ref->vpi_type->type_code == vpiReg && rfp->isint_) + return vpiIntegerVar; + else + return ref->vpi_type->type_code; + } if (ref->vpi_type->vpi_get_ == 0) return -1; @@ -207,6 +212,9 @@ extern "C" void vpi_sim_vcontrol(int operation, va_list ap) /* * $Log: vpi_priv.cc,v $ + * Revision 1.17 2002/06/21 04:58:55 steve + * Add support for special integer vectors. + * * Revision 1.16 2002/06/02 19:05:50 steve * Check for null pointers from users. * diff --git a/vvp/vpi_priv.h b/vvp/vpi_priv.h index 665990544..f966ab404 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.36 2002/05/19 05:18:16 steve Exp $" +#ident "$Id: vpi_priv.h,v 1.37 2002/06/21 04:58:55 steve Exp $" #endif # include "vpi_user.h" @@ -161,11 +161,13 @@ struct __vpiSignal { int msb, lsb; /* Flags */ unsigned signed_flag : 1; + unsigned isint_ : 1; // origial type was integer /* The represented value is here. */ vvp_fvector_t bits; /* This is the callback event functor */ struct callback_functor_s *callback; }; +extern vpiHandle vpip_make_int(char*name, int msb, int lsb, vvp_fvector_t vec); extern vpiHandle vpip_make_reg(char*name, int msb, int lsb, bool signed_flag, vvp_fvector_t vec); extern vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag, @@ -358,6 +360,9 @@ extern void vpip_oct_str_to_bits(unsigned char*bits, unsigned nbits, /* * $Log: vpi_priv.h,v $ + * Revision 1.37 2002/06/21 04:58:55 steve + * Add support for special integer vectors. + * * Revision 1.36 2002/05/19 05:18:16 steve * Add callbacks for vpiNamedEvent objects. * diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index 30b27ae05..277b0f909 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.34 2002/05/15 04:48:46 steve Exp $" +#ident "$Id: vpi_signal.cc,v 1.35 2002/06/21 04:58:55 steve Exp $" #endif /* @@ -609,6 +609,20 @@ static const struct __vpirt vpip_net_rt = { 0 }; +/* + * Construct a vpiIntegetVar object. Indicate the type using a flag + * to minimize the code modifications. Icarus implements integers + * as 'reg signed [31:0]'. + */ +vpiHandle vpip_make_int(char*name, int msb, int lsb, vvp_fvector_t vec) +{ + vpiHandle obj = vpip_make_net(name, msb,lsb, true, vec); + struct __vpiSignal*rfp = (struct __vpiSignal*)obj; + obj->vpi_type = &vpip_reg_rt; + rfp->isint_ = true; + return obj; +} + /* * Construct a vpiReg object. It's like a net, except for the type. */ @@ -634,6 +648,7 @@ vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag, obj->msb = msb; obj->lsb = lsb; obj->signed_flag = signed_flag? 1 : 0; + obj->isint_ = false; obj->bits = vec; obj->callback = 0; @@ -645,6 +660,9 @@ vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag, /* * $Log: vpi_signal.cc,v $ + * Revision 1.35 2002/06/21 04:58:55 steve + * Add support for special integer vectors. + * * Revision 1.34 2002/05/15 04:48:46 steve * Support set by string for reg objects. *