Add support for blocks and make hello1.v test pass

This commit is contained in:
Nick Gasson 2008-06-04 20:57:15 +01:00
parent 7bd1565cfb
commit f49dd97d24
1 changed files with 33 additions and 7 deletions

View File

@ -22,6 +22,7 @@
#include <iostream>
#include <cstring>
#include <cassert>
/*
* Generate VHDL for the $display system task.
@ -52,16 +53,23 @@ static int draw_stask_display(vhdl_process *proc, ivl_statement_t stmt)
proc->add_decl(line_var);
}
// Write the data into the line
int count = ivl_stmt_parm_count(stmt);
for (int i = 0; i < count; i++) {
// $display may have an empty parameter, in which case
// the expression will be null
// The behaviour here seems to be to output a space
ivl_expr_t net = ivl_stmt_parm(stmt, i);
vhdl_expr *e = NULL;
if (net) {
// TODO: Need to add a call to Type'Image for types not
// supported by std.textio
vhdl_expr *e = translate_expr(ivl_stmt_parm(stmt, i));
e = translate_expr(net);
if (NULL == e)
return 1;
}
else
e = new vhdl_const_string(" ");
vhdl_pcall_stmt *write = new vhdl_pcall_stmt("Write");
write->add_expr(new vhdl_var_ref(display_line));
@ -97,6 +105,22 @@ static int draw_stask(vhdl_process *proc, ivl_statement_t stmt)
}
}
/*
* Generate VHDL for a block of Verilog statements. This doesn't
* actually do anything, other than recursively translate the
* block's statements and add them to the process. This is OK as
* `begin' and `end process' function like a Verilog block.
*/
static int draw_block(vhdl_process *proc, ivl_statement_t stmt)
{
int count = ivl_stmt_block_count(stmt);
for (int i = 0; i < count; i++) {
if (draw_stmt(proc, ivl_stmt_block_stmt(stmt, i)) != 0)
return 1;
}
return 0;
}
/*
* Generate VHDL statements for the given Verilog statement and
* add them to the given VHDL process.
@ -106,6 +130,8 @@ int draw_stmt(vhdl_process *proc, ivl_statement_t stmt)
switch (ivl_statement_type(stmt)) {
case IVL_ST_STASK:
return draw_stask(proc, stmt);
case IVL_ST_BLOCK:
return draw_block(proc, stmt);
default:
error("No VHDL translation for statement at %s:%d (type = %d)",
ivl_stmt_file(stmt), ivl_stmt_lineno(stmt),