From fea1febf54af24b35d286d49c6df945eaa38dc96 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Thu, 27 Dec 2007 18:34:12 -0700 Subject: [PATCH] Generate explicit locals in the vvp target. With this change, local symbols are not emitted in the vvp target, but are marked as local. When thus marked, the vvp run time does not offfer any VPI access and the signals (net or var) are effectively invisible. --- t-dll.cc | 2 +- tgt-vvp/vvp_scope.c | 14 ++++++-------- vvp/compile.h | 2 +- vvp/parse.y | 42 +++++++++++++++++++++--------------------- vvp/words.cc | 12 +++++++----- 5 files changed, 36 insertions(+), 36 deletions(-) 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);