diff --git a/t-dll.cc b/t-dll.cc index ac0b66bdf..a40990fd5 100644 --- a/t-dll.cc +++ b/t-dll.cc @@ -2083,7 +2083,7 @@ void dll_target::signal(const NetNet*net) obj->lsb_index = net->lsb(); obj->lsb_dist = net->msb() >= net->lsb() ? 1 : -1; obj->isint_ = false; - obj->local_ = (net->local_flag() && (net->peek_eref() == 0))? 1 : 0; + obj->local_ = net->local_flag()? 1 : 0; obj->array_dimensions_ = net->array_dimensions(); diff --git a/tgt-vvp/vvp_scope.c b/tgt-vvp/vvp_scope.c index 2fa94a06d..8eb57ddac 100644 --- a/tgt-vvp/vvp_scope.c +++ b/tgt-vvp/vvp_scope.c @@ -952,6 +952,7 @@ static void draw_reg_in_scope(ivl_signal_t sig) const char*datatype_flag = ivl_signal_integer(sig) ? "/i" : ivl_signal_signed(sig)? "/s" : ""; + const char*local_flag = ivl_signal_local(sig)? "*" : ""; switch (ivl_signal_data_type(sig)) { case IVL_VT_REAL: @@ -974,8 +975,8 @@ static void draw_reg_in_scope(ivl_signal_t sig) } else { - fprintf(vvp_out, "v%p_0 .var%s \"%s\", %d %d;%s\n", - sig, datatype_flag, + fprintf(vvp_out, "v%p_0 .var%s %s\"%s\", %d %d;%s\n", + sig, datatype_flag, local_flag, vvp_mangle_name(ivl_signal_basename(sig)), msb, lsb, ivl_signal_local(sig)? " Local signal" : ""); } @@ -992,12 +993,9 @@ static void draw_net_in_scope(ivl_signal_t sig) int lsb = ivl_signal_lsb(sig); const char*datatype_flag = ivl_signal_signed(sig)? "/s" : ""; + const char*local_flag = ivl_signal_local(sig)? "*" : ""; unsigned iword; - /* Skip the local signal. */ - if (ivl_signal_local(sig)) - return; - switch (ivl_signal_data_type(sig)) { case IVL_VT_REAL: datatype_flag = "/real"; @@ -1049,9 +1047,9 @@ static void draw_net_in_scope(ivl_signal_t sig) /* If this is an isolated word, it uses its own name. */ assert(word_count == 1); - fprintf(vvp_out, "v%p_%u .net%s%s \"%s\", %d %d, %s;" + fprintf(vvp_out, "v%p_%u .net%s%s %s\"%s\", %d %d, %s;" " %u drivers%s\n", - sig, iword, vec8, datatype_flag, + sig, iword, vec8, datatype_flag, local_flag, vvp_mangle_name(ivl_signal_basename(sig)), msb, lsb, driver, nex_data->drivers_count, diff --git a/vvp/compile.h b/vvp/compile.h index f731d5e2c..1ca828d46 100644 --- a/vvp/compile.h +++ b/vvp/compile.h @@ -368,7 +368,7 @@ extern void compile_net(char*label, char*name, bool net8_flag, bool local_flag, unsigned argc, struct symb_s*argv); extern void compile_net_real(char*label, char*name, - int msb, int lsb, + int msb, int lsb, bool local_flag, unsigned argc, struct symb_s*argv); extern void compile_netw(char*label, char*array_symbol, diff --git a/vvp/parse.y b/vvp/parse.y index 1a23c790f..69613c018 100644 --- a/vvp/parse.y +++ b/vvp/parse.y @@ -523,33 +523,33 @@ statement ',' symbols_net ';' { compile_net($1, $4, $6, $7, false, false, $3, $9.cnt, $9.vect); } - | T_LABEL K_NET_S T_STRING ',' signed_t_number signed_t_number - ',' symbols_net ';' -{ compile_net($1, $3, $5, $6, true, false, false, $8.cnt, $8.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); } - | T_LABEL K_NET8 T_STRING ',' signed_t_number signed_t_number - ',' symbols_net ';' -{ compile_net($1, $3, $5, $6, false, true, false, $8.cnt, $8.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); } - | T_LABEL K_NET8_S T_STRING ',' signed_t_number signed_t_number - ',' symbols_net ';' -{ compile_net($1, $3, $5, $6, true, true, false, $8.cnt, $8.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); } - | T_LABEL K_NET_R T_STRING ',' signed_t_number signed_t_number - ',' symbols_net ';' - { compile_net_real($1, $3, $5, $6, $8.cnt, $8.vect); } + | T_LABEL K_NET_R local_flag T_STRING ',' signed_t_number signed_t_number + ',' symbols_net ';' + { compile_net_real($1, $4, $6, $7, $3, $9.cnt, $9.vect); } - | T_LABEL K_ALIAS T_STRING ',' signed_t_number signed_t_number - ',' symbols_net ';' - { compile_alias($1, $3, $5, $6, false, $8.cnt, $8.vect); } + | T_LABEL K_ALIAS T_STRING ',' signed_t_number signed_t_number + ',' symbols_net ';' + { compile_alias($1, $3, $5, $6, false, $8.cnt, $8.vect); } - | T_LABEL K_ALIAS_S T_STRING ',' signed_t_number signed_t_number - ',' symbols_net ';' - { compile_alias($1, $3, $5, $6, true, $8.cnt, $8.vect); } + | T_LABEL K_ALIAS_S T_STRING ',' signed_t_number signed_t_number + ',' symbols_net ';' + { compile_alias($1, $3, $5, $6, true, $8.cnt, $8.vect); } - | T_LABEL K_ALIAS_R T_STRING ',' signed_t_number signed_t_number - ',' symbols_net ';' - { compile_alias_real($1, $3, $5, $6, $8.cnt, $8.vect); } + | T_LABEL K_ALIAS_R T_STRING ',' signed_t_number signed_t_number + ',' symbols_net ';' + { compile_alias_real($1, $3, $5, $6, $8.cnt, $8.vect); } /* Arrayed versions of net directives. */ diff --git a/vvp/words.cc b/vvp/words.cc index 562cc1afc..d73378745 100644 --- a/vvp/words.cc +++ b/vvp/words.cc @@ -206,7 +206,7 @@ void compile_netw(char*label, char*array_label, unsigned long array_addr, argc, argv); } -void compile_net_real(char*label, char*name, int msb, int lsb, +void compile_net_real(char*label, char*name, int msb, int lsb, bool local_flag, unsigned argc, struct symb_s*argv) { vvp_net_t*net = new vvp_net_t; @@ -222,10 +222,12 @@ void compile_net_real(char*label, char*name, int msb, int lsb, /* Connect the source to my input. */ inputs_connect(net, 1, argv); - /* Make the vpiHandle for the reg. */ - vpiHandle obj = vpip_make_real_var(name, net); - compile_vpi_symbol(label, obj); - vpip_attach_to_current_scope(obj); + if (! local_flag) { + /* Make the vpiHandle for the reg. */ + vpiHandle obj = vpip_make_real_var(name, net); + compile_vpi_symbol(label, obj); + vpip_attach_to_current_scope(obj); + } free(label); free(name);