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:
Stephen Williams 2007-12-27 18:34:12 -07:00
parent 931d08a9fc
commit fea1febf54
5 changed files with 36 additions and 36 deletions

View File

@ -2083,7 +2083,7 @@ void dll_target::signal(const NetNet*net)
obj->lsb_index = net->lsb(); obj->lsb_index = net->lsb();
obj->lsb_dist = net->msb() >= net->lsb() ? 1 : -1; obj->lsb_dist = net->msb() >= net->lsb() ? 1 : -1;
obj->isint_ = false; 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(); obj->array_dimensions_ = net->array_dimensions();

View File

@ -952,6 +952,7 @@ static void draw_reg_in_scope(ivl_signal_t sig)
const char*datatype_flag = ivl_signal_integer(sig) ? "/i" : const char*datatype_flag = ivl_signal_integer(sig) ? "/i" :
ivl_signal_signed(sig)? "/s" : ""; ivl_signal_signed(sig)? "/s" : "";
const char*local_flag = ivl_signal_local(sig)? "*" : "";
switch (ivl_signal_data_type(sig)) { switch (ivl_signal_data_type(sig)) {
case IVL_VT_REAL: case IVL_VT_REAL:
@ -974,8 +975,8 @@ static void draw_reg_in_scope(ivl_signal_t sig)
} else { } else {
fprintf(vvp_out, "v%p_0 .var%s \"%s\", %d %d;%s\n", fprintf(vvp_out, "v%p_0 .var%s %s\"%s\", %d %d;%s\n",
sig, datatype_flag, sig, datatype_flag, local_flag,
vvp_mangle_name(ivl_signal_basename(sig)), msb, lsb, vvp_mangle_name(ivl_signal_basename(sig)), msb, lsb,
ivl_signal_local(sig)? " Local signal" : ""); 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); int lsb = ivl_signal_lsb(sig);
const char*datatype_flag = ivl_signal_signed(sig)? "/s" : ""; const char*datatype_flag = ivl_signal_signed(sig)? "/s" : "";
const char*local_flag = ivl_signal_local(sig)? "*" : "";
unsigned iword; unsigned iword;
/* Skip the local signal. */
if (ivl_signal_local(sig))
return;
switch (ivl_signal_data_type(sig)) { switch (ivl_signal_data_type(sig)) {
case IVL_VT_REAL: case IVL_VT_REAL:
datatype_flag = "/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 /* If this is an isolated word, it uses its
own name. */ own name. */
assert(word_count == 1); 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", " %u drivers%s\n",
sig, iword, vec8, datatype_flag, sig, iword, vec8, datatype_flag, local_flag,
vvp_mangle_name(ivl_signal_basename(sig)), vvp_mangle_name(ivl_signal_basename(sig)),
msb, lsb, driver, msb, lsb, driver,
nex_data->drivers_count, nex_data->drivers_count,

View File

@ -368,7 +368,7 @@ extern void compile_net(char*label, char*name,
bool net8_flag, bool local_flag, bool net8_flag, bool local_flag,
unsigned argc, struct symb_s*argv); unsigned argc, struct symb_s*argv);
extern void compile_net_real(char*label, char*name, 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); unsigned argc, struct symb_s*argv);
extern void compile_netw(char*label, char*array_symbol, extern void compile_netw(char*label, char*array_symbol,

View File

@ -523,33 +523,33 @@ statement
',' symbols_net ';' ',' symbols_net ';'
{ compile_net($1, $4, $6, $7, false, false, $3, $9.cnt, $9.vect); } { 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 | T_LABEL K_NET_S local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_net($1, $3, $5, $6, true, false, false, $8.cnt, $8.vect); } { 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 | T_LABEL K_NET8 local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_net($1, $3, $5, $6, false, true, false, $8.cnt, $8.vect); } { 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 | T_LABEL K_NET8_S local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_net($1, $3, $5, $6, true, true, false, $8.cnt, $8.vect); } { 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 | T_LABEL K_NET_R local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_net_real($1, $3, $5, $6, $8.cnt, $8.vect); } { compile_net_real($1, $4, $6, $7, $3, $9.cnt, $9.vect); }
| T_LABEL K_ALIAS T_STRING ',' signed_t_number signed_t_number | T_LABEL K_ALIAS T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_alias($1, $3, $5, $6, false, $8.cnt, $8.vect); } { compile_alias($1, $3, $5, $6, false, $8.cnt, $8.vect); }
| T_LABEL K_ALIAS_S T_STRING ',' signed_t_number signed_t_number | T_LABEL K_ALIAS_S T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_alias($1, $3, $5, $6, true, $8.cnt, $8.vect); } { compile_alias($1, $3, $5, $6, true, $8.cnt, $8.vect); }
| T_LABEL K_ALIAS_R T_STRING ',' signed_t_number signed_t_number | T_LABEL K_ALIAS_R T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_alias_real($1, $3, $5, $6, $8.cnt, $8.vect); } { compile_alias_real($1, $3, $5, $6, $8.cnt, $8.vect); }
/* Arrayed versions of net directives. */ /* Arrayed versions of net directives. */

View File

@ -206,7 +206,7 @@ void compile_netw(char*label, char*array_label, unsigned long array_addr,
argc, argv); 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) unsigned argc, struct symb_s*argv)
{ {
vvp_net_t*net = new vvp_net_t; 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. */ /* Connect the source to my input. */
inputs_connect(net, 1, argv); inputs_connect(net, 1, argv);
/* Make the vpiHandle for the reg. */ if (! local_flag) {
vpiHandle obj = vpip_make_real_var(name, net); /* Make the vpiHandle for the reg. */
compile_vpi_symbol(label, obj); vpiHandle obj = vpip_make_real_var(name, net);
vpip_attach_to_current_scope(obj); compile_vpi_symbol(label, obj);
vpip_attach_to_current_scope(obj);
}
free(label); free(label);
free(name); free(name);