Add support for blocks and make hello1.v test pass
This commit is contained in:
parent
7bd1565cfb
commit
f49dd97d24
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generate VHDL for the $display system task.
|
* Generate VHDL for the $display system task.
|
||||||
|
|
@ -51,17 +52,24 @@ static int draw_stask_display(vhdl_process *proc, ivl_statement_t stmt)
|
||||||
line_var->set_comment("For generating $display output");
|
line_var->set_comment("For generating $display output");
|
||||||
proc->add_decl(line_var);
|
proc->add_decl(line_var);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Write the data into the line
|
// Write the data into the line
|
||||||
int count = ivl_stmt_parm_count(stmt);
|
int count = ivl_stmt_parm_count(stmt);
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
// TODO: Need to add a call to Type'Image for types not
|
// $display may have an empty parameter, in which case
|
||||||
// supported by std.textio
|
// the expression will be null
|
||||||
vhdl_expr *e = translate_expr(ivl_stmt_parm(stmt, i));
|
// The behaviour here seems to be to output a space
|
||||||
if (NULL == e)
|
ivl_expr_t net = ivl_stmt_parm(stmt, i);
|
||||||
return 1;
|
vhdl_expr *e = NULL;
|
||||||
|
if (net) {
|
||||||
|
// TODO: Need to add a call to Type'Image for types not
|
||||||
|
// supported by std.textio
|
||||||
|
e = translate_expr(net);
|
||||||
|
if (NULL == e)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
e = new vhdl_const_string(" ");
|
||||||
|
|
||||||
vhdl_pcall_stmt *write = new vhdl_pcall_stmt("Write");
|
vhdl_pcall_stmt *write = new vhdl_pcall_stmt("Write");
|
||||||
write->add_expr(new vhdl_var_ref(display_line));
|
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
|
* Generate VHDL statements for the given Verilog statement and
|
||||||
* add them to the given VHDL process.
|
* 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)) {
|
switch (ivl_statement_type(stmt)) {
|
||||||
case IVL_ST_STASK:
|
case IVL_ST_STASK:
|
||||||
return draw_stask(proc, stmt);
|
return draw_stask(proc, stmt);
|
||||||
|
case IVL_ST_BLOCK:
|
||||||
|
return draw_block(proc, stmt);
|
||||||
default:
|
default:
|
||||||
error("No VHDL translation for statement at %s:%d (type = %d)",
|
error("No VHDL translation for statement at %s:%d (type = %d)",
|
||||||
ivl_stmt_file(stmt), ivl_stmt_lineno(stmt),
|
ivl_stmt_file(stmt), ivl_stmt_lineno(stmt),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue