Generate code for signal references

This commit is contained in:
Nick Gasson 2008-06-07 11:24:09 +01:00
parent 5f90a3e48c
commit 305f448d05
2 changed files with 15 additions and 14 deletions

View File

@ -33,6 +33,16 @@ static vhdl_expr *translate_string(ivl_expr_t e)
return new vhdl_const_string(str); return new vhdl_const_string(str);
} }
/*
* A reference to a signal in an expression. It's assumed that the
* signal has already been defined elsewhere.
*/
static vhdl_expr *translate_signal(ivl_expr_t e)
{
ivl_signal_t sig = ivl_expr_signal(e);
return new vhdl_var_ref(ivl_signal_basename(sig));
}
/* /*
* Generate a VHDL expression from a Verilog expression. * Generate a VHDL expression from a Verilog expression.
*/ */
@ -43,6 +53,8 @@ vhdl_expr *translate_expr(ivl_expr_t e)
switch (type) { switch (type) {
case IVL_EX_STRING: case IVL_EX_STRING:
return translate_string(e); return translate_string(e);
case IVL_EX_SIGNAL:
return translate_signal(e);
default: default:
error("No VHDL translation for expression at %s:%d (type = %d)", error("No VHDL translation for expression at %s:%d (type = %d)",
ivl_expr_file(e), ivl_expr_lineno(e), type); ivl_expr_file(e), ivl_expr_lineno(e), type);

View File

@ -179,22 +179,11 @@ static int draw_wait(vhdl_process *proc, ivl_statement_t stmt)
if ((sig = ivl_nexus_ptr_sig(nexus_ptr))) { if ((sig = ivl_nexus_ptr_sig(nexus_ptr))) {
const char *signame = ivl_signal_basename(sig); const char *signame = ivl_signal_basename(sig);
std::cout << "signal " << signame << std::endl; std::cout << "signal " << signame << std::endl;
if (!proc->get_parent()->have_declared(signame)) {
// First time this signal has been encountered
vhdl_scalar_type *std_logic =
new vhdl_scalar_type("std_logic");
vhdl_signal_decl *sig_decl =
new vhdl_signal_decl(signame, std_logic);
proc->get_parent()->add_decl(sig_decl);
}
proc->add_sensitivity(signame); proc->add_sensitivity(signame);
} }
else if ((log = ivl_nexus_ptr_log(nexus_ptr))) { else if ((log = ivl_nexus_ptr_log(nexus_ptr))) {
error("Nexus points to net logic"); std::cout << "net logic " << ivl_logic_basename(log) << " ";
return 1; std::cout << "type = " << ivl_logic_type(log) << std::endl;
} }
else { else {
error("Nexus points to unknown"); error("Nexus points to unknown");