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.
This commit is contained in:
parent
931d08a9fc
commit
fea1febf54
2
t-dll.cc
2
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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
42
vvp/parse.y
42
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. */
|
||||
|
||||
|
|
|
|||
12
vvp/words.cc
12
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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue