Emit Write() calls for parameters of $display
This commit is contained in:
parent
9f035108e1
commit
6e448da90d
|
|
@ -23,11 +23,29 @@
|
|||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
/*
|
||||
* Convert a constant Verilog string to a constant VHDL string.
|
||||
*/
|
||||
static vhdl_expr *translate_string(ivl_expr_t e)
|
||||
{
|
||||
// TODO: May need to inspect or escape parts of this
|
||||
const char *str = ivl_expr_string(e);
|
||||
return new vhdl_const_string(str);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate a VHDL expression from a Verilog expression.
|
||||
*/
|
||||
vhdl_expr *translate_expr(ivl_expr_t e)
|
||||
{
|
||||
assert(false);
|
||||
ivl_expr_type_t type = ivl_expr_type(e);
|
||||
|
||||
switch (type) {
|
||||
case IVL_EX_STRING:
|
||||
return translate_string(e);
|
||||
default:
|
||||
error("No VHDL translation for expression at %s:%d (type = %d)",
|
||||
ivl_expr_file(e), ivl_expr_lineno(e), type);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
*/
|
||||
static int generate_vhdl_process(vhdl_entity *ent, ivl_process_t proc)
|
||||
{
|
||||
|
||||
// Create a new process and store it in the entity's
|
||||
// architecture. This needs to be done first or the
|
||||
// parent link won't be valid (and draw_stmt needs this
|
||||
|
|
|
|||
|
|
@ -52,14 +52,30 @@ static int draw_stask_display(vhdl_process *proc, ivl_statement_t stmt)
|
|||
proc->add_decl(line_var);
|
||||
}
|
||||
|
||||
// TODO: Write the data into the line
|
||||
|
||||
|
||||
// Write the data into the line
|
||||
int count = ivl_stmt_parm_count(stmt);
|
||||
for (int i = 0; i < count; i++) {
|
||||
// TODO: This is a bit simplistic since it will only
|
||||
// work with strings
|
||||
// --> Need to add a call to Type'Image for non-string
|
||||
// expressions
|
||||
vhdl_expr *e = translate_expr(ivl_stmt_parm(stmt, i));
|
||||
if (NULL == e)
|
||||
return 1;
|
||||
|
||||
vhdl_pcall_stmt *write = new vhdl_pcall_stmt("Write");
|
||||
write->add_expr(new vhdl_var_ref(display_line));
|
||||
write->add_expr(e);
|
||||
|
||||
proc->add_stmt(write);
|
||||
}
|
||||
|
||||
// WriteLine(Output, Verilog_Display_Line)
|
||||
vhdl_var_ref *output_ref = new vhdl_var_ref("Output");
|
||||
vhdl_var_ref *line_ref = new vhdl_var_ref(display_line);
|
||||
vhdl_pcall_stmt *write_line = new vhdl_pcall_stmt("WriteLine");
|
||||
write_line->add_expr(output_ref);
|
||||
write_line->add_expr(line_ref);
|
||||
write_line->add_expr(new vhdl_var_ref("Output"));
|
||||
write_line->add_expr(new vhdl_var_ref(display_line));
|
||||
proc->add_stmt(write_line);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -354,3 +354,8 @@ void vhdl_var_ref::emit(std::ofstream &of, int level) const
|
|||
{
|
||||
of << name_;
|
||||
}
|
||||
|
||||
void vhdl_const_string::emit(std::ofstream &of, int level) const
|
||||
{
|
||||
of << "\"" << value_ << "\"";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,6 +83,15 @@ private:
|
|||
std::string name_;
|
||||
};
|
||||
|
||||
class vhdl_const_string : public vhdl_expr {
|
||||
public:
|
||||
vhdl_const_string(const char *value) : value_(value) {}
|
||||
|
||||
void emit(std::ofstream &of, int level) const;
|
||||
private:
|
||||
std::string value_;
|
||||
};
|
||||
|
||||
class vhdl_expr_list : public vhdl_element {
|
||||
public:
|
||||
~vhdl_expr_list();
|
||||
|
|
|
|||
Loading…
Reference in New Issue