diff --git a/tgt-vvp/vvp_scope.c b/tgt-vvp/vvp_scope.c index a31a16233..6bd81dd4e 100644 --- a/tgt-vvp/vvp_scope.c +++ b/tgt-vvp/vvp_scope.c @@ -477,6 +477,12 @@ static void draw_net_in_scope(ivl_signal_t sig) unsigned iword; switch (ivl_signal_data_type(sig)) { + case IVL_VT_BOOL: + if (ivl_signal_signed(sig)) + datatype_flag = "/2s"; + else + datatype_flag = "/2u"; + break; case IVL_VT_REAL: datatype_flag = "/real"; break; diff --git a/vvp/compile.h b/vvp/compile.h index 7b2d2d157..6bf83bd3a 100644 --- a/vvp/compile.h +++ b/vvp/compile.h @@ -443,19 +443,29 @@ extern void compile_variable(char*label, char*name, extern void compile_var_real(char*label, char*name, int msb, int lsb); -extern void compile_net(char*label, char*name, - int msb, int lsb, bool signed_flag, - bool net8_flag, bool local_flag, +/* + * The compile_net functio is called to create a .net vector with a + * given name. + * + * The vpi_type_code argument of compile_net() is one of the vpi + * object codes for the equivelent variable types. The supported codes + * are: + * vpiLogic -- 4-value logic + * vpiIntVar -- 2-value logic + * -vpiLogic -- 8-value (i.e. strength aware) logic + */ +extern void compile_net(char*label, char*name, int msb, int lsb, + int vpi_type_code, bool signed_flag, bool local_flag, unsigned argc, struct symb_s*argv); + extern void compile_net_real(char*label, char*name, int msb, int lsb, bool local_flag, unsigned argc, struct symb_s*argv); -extern void compile_netw(char*label, char*array_symbol, - unsigned long array_addr, - int msb, int lsb, bool signed_flag, - bool net8_flag, +extern void compile_netw(char*label, char*array_label, unsigned long array_addr, + int msb, int lsb, int vpi_type_code, bool signed_flag, unsigned argc, struct symb_s*argv); + extern void compile_netw_real(char*label, char*array_symbol, unsigned long array_addr, int msb, int lsb, diff --git a/vvp/lexor.lex b/vvp/lexor.lex index b9519b73f..b1685e379 100644 --- a/vvp/lexor.lex +++ b/vvp/lexor.lex @@ -148,8 +148,10 @@ static char* strdupnew(char const *str) ".functor" { return K_FUNCTOR; } ".import" { return K_IMPORT; } ".island" { return K_ISLAND; } -".modpath" { return K_MODPATH; } +".modpath" { return K_MODPATH; } ".net" { return K_NET; } +".net/2s" { return K_NET_2S; } +".net/2u" { return K_NET_2U; } ".net8" { return K_NET8; } ".net8/s" { return K_NET8_S; } ".net/real" { return K_NET_R; } diff --git a/vvp/parse.y b/vvp/parse.y index 2d2d29655..0bb59813b 100644 --- a/vvp/parse.y +++ b/vvp/parse.y @@ -76,8 +76,8 @@ static struct __vpiModPath*modpath_dst = 0; %token K_CMP_GE K_CMP_GE_R K_CMP_GE_S K_CMP_GT K_CMP_GT_R K_CMP_GT_S %token K_CONCAT K_DEBUG K_DELAY K_DFF %token K_EVENT K_EVENT_OR K_EXPORT K_EXTEND_S K_FUNCTOR K_IMPORT K_ISLAND -%token K_MODPATH K_NET K_NET_S K_NET_R -%token K_NET8 K_NET8_S +%token K_MODPATH +%token K_NET K_NET_S K_NET_R K_NET_2S K_NET_2U K_NET8 K_NET8_S %token K_PARAM_STR K_PARAM_L K_PARAM_REAL K_PART K_PART_PV %token K_PART_V K_PART_V_S K_PORT K_PV K_REDUCE_AND K_REDUCE_OR K_REDUCE_XOR %token K_REDUCE_NAND K_REDUCE_NOR K_REDUCE_XNOR K_REPEAT @@ -673,19 +673,27 @@ statement | T_LABEL K_NET local_flag T_STRING ',' signed_t_number signed_t_number ',' symbols_net ';' - { compile_net($1, $4, $6, $7, false, false, $3, $9.cnt, $9.vect); } + { compile_net($1, $4, $6, $7, vpiLogicVar, false, $3, $9.cnt, $9.vect); } | T_LABEL K_NET_S local_flag T_STRING ',' signed_t_number signed_t_number ',' symbols_net ';' - { compile_net($1, $4, $6, $7, true, false, $3, $9.cnt, $9.vect); } + { compile_net($1, $4, $6, $7, vpiLogicVar, true, $3, $9.cnt, $9.vect); } + + | T_LABEL K_NET_2U local_flag T_STRING ',' signed_t_number signed_t_number + ',' symbols_net ';' + { compile_net($1, $4, $6, $7, vpiIntVar, false, $3, $9.cnt, $9.vect); } + + | T_LABEL K_NET_2S local_flag T_STRING ',' signed_t_number signed_t_number + ',' symbols_net ';' + { compile_net($1, $4, $6, $7, vpiIntVar, true, $3, $9.cnt, $9.vect); } | T_LABEL K_NET8 local_flag T_STRING ',' signed_t_number signed_t_number ',' symbols_net ';' - { compile_net($1, $4, $6, $7, false, true, $3, $9.cnt, $9.vect); } + { compile_net($1, $4, $6, $7, -vpiLogicVar, false, $3, $9.cnt, $9.vect); } | T_LABEL K_NET8_S local_flag T_STRING ',' signed_t_number signed_t_number ',' symbols_net ';' - { compile_net($1, $4, $6, $7, true, true, $3, $9.cnt, $9.vect); } + { compile_net($1, $4, $6, $7, -vpiLogicVar, true, $3, $9.cnt, $9.vect); } | T_LABEL K_NET_R local_flag T_STRING ',' signed_t_number signed_t_number ',' symbols_net ';' @@ -693,30 +701,25 @@ statement /* Arrayed versions of net directives. */ - | T_LABEL K_NET T_SYMBOL T_NUMBER ',' - signed_t_number signed_t_number ',' - symbols_net ';' - { compile_netw($1, $3, $4, $6, $7, false, false, $9.cnt, $9.vect); } + | T_LABEL K_NET T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ',' + symbols_net ';' + { compile_netw($1, $3, $4, $6, $7, vpiLogicVar, false, $9.cnt, $9.vect); } - | T_LABEL K_NET_S T_SYMBOL T_NUMBER ',' - signed_t_number signed_t_number ',' - symbols_net ';' - { compile_netw($1, $3, $4, $6, $7, true, false, $9.cnt, $9.vect); } + | T_LABEL K_NET_S T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ',' + symbols_net ';' + { compile_netw($1, $3, $4, $6, $7, vpiLogicVar, true, $9.cnt, $9.vect); } - | T_LABEL K_NET8 T_SYMBOL T_NUMBER ',' - signed_t_number signed_t_number ',' - symbols_net ';' - { compile_netw($1, $3, $4, $6, $7, false, true, $9.cnt, $9.vect); } + | T_LABEL K_NET8 T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ',' + symbols_net ';' + { compile_netw($1, $3, $4, $6, $7, -vpiLogicVar, false, $9.cnt, $9.vect); } - | T_LABEL K_NET8_S T_SYMBOL T_NUMBER ',' - signed_t_number signed_t_number ',' - symbols_net ';' - { compile_netw($1, $3, $4, $6, $7, true, true, $9.cnt, $9.vect); } + | T_LABEL K_NET8_S T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ',' + symbols_net ';' + { compile_netw($1, $3, $4, $6, $7, -vpiLogicVar, true, $9.cnt, $9.vect); } - | T_LABEL K_NET_R T_SYMBOL T_NUMBER ',' - signed_t_number signed_t_number ',' - symbols_net ';' - { compile_netw_real($1, $3, $4, $6, $7, $9.cnt, $9.vect); } + | T_LABEL K_NET_R T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ',' + symbols_net ';' + { compile_netw_real($1, $3, $4, $6, $7, $9.cnt, $9.vect); } /* Array word versions of alias directives. */ diff --git a/vvp/words.cc b/vvp/words.cc index afdfe4bea..4b58e2226 100644 --- a/vvp/words.cc +++ b/vvp/words.cc @@ -208,12 +208,12 @@ class __compile_net_resolv : public base_net_resolv { struct __vpiScope*scope, char*my_label, char*name, int msb, int lsb, unsigned array_addr, - bool signed_flag, bool net8_flag, bool local_flag) + int vpi_type_code, bool signed_flag, bool local_flag) : base_net_resolv(ref_label, array, scope, my_label, name, array_addr, local_flag) { msb_ = msb; lsb_ = lsb; + vpi_type_code_ = vpi_type_code; signed_flag_ = signed_flag; - net8_flag_ = net8_flag; } ~__compile_net_resolv() { } @@ -222,7 +222,8 @@ class __compile_net_resolv : public base_net_resolv { private: int msb_, lsb_; - bool signed_flag_, net8_flag_; + int vpi_type_code_; + bool signed_flag_; }; /* @@ -241,7 +242,7 @@ static void do_compile_net(vvp_net_t*node, vvp_array_t array, struct __vpiScope*scope, char*my_label, char*name, int msb, int lsb, unsigned array_addr, - bool signed_flag, bool net8_flag, bool local_flag) + int vpi_type_code, bool signed_flag, bool local_flag) { unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1; assert(node); @@ -249,10 +250,18 @@ static void do_compile_net(vvp_net_t*node, vvp_array_t array, vvp_wire_base*vsig = dynamic_cast(node->fil); if (vsig == 0) { - vsig = net8_flag - ? dynamic_cast(new vvp_wire_vec8(wid)) - : dynamic_cast(new vvp_wire_vec4(wid,BIT4_Z)); - + switch (vpi_type_code) { + case vpiLogicVar: + vsig = new vvp_wire_vec4(wid,BIT4_Z); + break; + case -vpiLogicVar: + vsig = new vvp_wire_vec8(wid); + break; + case vpiIntVar: + vsig = new vvp_wire_vec4(wid,BIT4_Z); + break; + } + assert(vsig); node->fil = vsig; } @@ -285,7 +294,7 @@ static void do_compile_net(vvp_net_t*node, vvp_array_t array, static void __compile_net(char*label, char*name, char*array_label, unsigned long array_addr, int msb, int lsb, - bool signed_flag, bool net8_flag, bool local_flag, + int vpi_type_code, bool signed_flag, bool local_flag, unsigned argc, struct symb_s*argv) { vvp_array_t array = array_label? array_find(array_label) : 0; @@ -312,7 +321,7 @@ static void __compile_net(char*label, = new __compile_net_resolv(argv[0].text, array, scope, label, name, msb, lsb, array_addr, - signed_flag, net8_flag, local_flag); + vpi_type_code, signed_flag, local_flag); resolv_submit(res); free(argv); return; @@ -321,7 +330,7 @@ static void __compile_net(char*label, struct __vpiScope*scope = vpip_peek_current_scope(); do_compile_net(node, array, scope, label, name, msb, lsb, array_addr, - signed_flag, net8_flag, local_flag); + vpi_type_code, signed_flag, local_flag); free(argv[0].text); free(argv); @@ -334,30 +343,28 @@ bool __compile_net_resolv::resolve(bool msg_flag) return false; } - do_compile_net(node, array_, scope_, my_label_, name_, msb_, lsb_, array_addr_, signed_flag_, net8_flag_, local_flag_); + do_compile_net(node, array_, scope_, my_label_, name_, msb_, lsb_, array_addr_, vpi_type_code_, signed_flag_, local_flag_); return true; } void compile_net(char*label, char*name, int msb, int lsb, - bool signed_flag, bool net8_flag, bool local_flag, + int vpi_type_code, bool signed_flag, bool local_flag, unsigned argc, struct symb_s*argv) { - __compile_net(label, name, 0, 0, - msb, lsb, signed_flag, net8_flag, local_flag, + __compile_net(label, name, 0, 0, msb, lsb, + vpi_type_code, signed_flag, local_flag, argc, argv); } void compile_netw(char*label, char*array_label, unsigned long array_addr, - int msb, int lsb, - bool signed_flag, bool net8_flag, - unsigned argc, struct symb_s*argv) + int msb, int lsb, int vpi_type_code, bool signed_flag, + unsigned argc, struct symb_s*argv) { __compile_net(label, 0, array_label, array_addr, - msb, lsb, signed_flag, net8_flag, false, + msb, lsb, vpi_type_code, signed_flag, false, argc, argv); } - class __compile_real_net_resolv : public base_net_resolv { public: