Generate VHDL for non-blocking assignments
This commit is contained in:
parent
39228f3495
commit
c064ae6bc3
|
|
@ -153,7 +153,37 @@ static int draw_noop(vhdl_process *proc, ivl_statement_t stmt)
|
||||||
*/
|
*/
|
||||||
static int draw_nbassign(vhdl_process *proc, ivl_statement_t stmt)
|
static int draw_nbassign(vhdl_process *proc, ivl_statement_t stmt)
|
||||||
{
|
{
|
||||||
std::cout << "draw_nbassign" << std::endl;
|
int nlvals = ivl_stmt_lvals(stmt);
|
||||||
|
if (nlvals != 1) {
|
||||||
|
error("Can only have 1 lval at the moment (found %d)", nlvals);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ivl_lval_t lval = ivl_stmt_lval(stmt, 0);
|
||||||
|
ivl_signal_t sig;
|
||||||
|
if ((sig = ivl_lval_sig(lval))) {
|
||||||
|
const char *signame = ivl_signal_basename(sig);
|
||||||
|
|
||||||
|
vhdl_expr *rhs = translate_expr(ivl_stmt_rval(stmt));
|
||||||
|
if (NULL == rhs)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
vhdl_decl *decl = proc->get_parent()->get_decl(signame);
|
||||||
|
assert(decl);
|
||||||
|
|
||||||
|
vhdl_type *lval_type = decl->get_type()->clone();
|
||||||
|
vhdl_var_ref *lval_ref = new vhdl_var_ref(signame, lval_type);
|
||||||
|
|
||||||
|
// TODO: Internal sanity check:
|
||||||
|
// ensure rhs->get_type() == lval_type
|
||||||
|
|
||||||
|
proc->add_stmt(new vhdl_nbassign_stmt(lval_ref, rhs));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error("Only signals as lvals supported at the moment");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -343,6 +343,15 @@ void vhdl_wait_stmt::emit(std::ofstream &of, int level) const
|
||||||
of << "wait;";
|
of << "wait;";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a deep copy of this type, so it can appear in more
|
||||||
|
* than one place in the AST.
|
||||||
|
*/
|
||||||
|
vhdl_type *vhdl_scalar_type::clone() const
|
||||||
|
{
|
||||||
|
return new vhdl_scalar_type(name_.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
vhdl_scalar_type *vhdl_scalar_type::std_logic()
|
vhdl_scalar_type *vhdl_scalar_type::std_logic()
|
||||||
{
|
{
|
||||||
return new vhdl_scalar_type("std_logic");
|
return new vhdl_scalar_type("std_logic");
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,8 @@ public:
|
||||||
vhdl_type(const char *name) : name_(name) {}
|
vhdl_type(const char *name) : name_(name) {}
|
||||||
virtual ~vhdl_type() {}
|
virtual ~vhdl_type() {}
|
||||||
|
|
||||||
|
virtual vhdl_type *clone() const = 0;
|
||||||
|
|
||||||
const std::string &get_name() const { return name_; }
|
const std::string &get_name() const { return name_; }
|
||||||
protected:
|
protected:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
|
|
@ -70,6 +72,7 @@ public:
|
||||||
: vhdl_type(name) {}
|
: vhdl_type(name) {}
|
||||||
|
|
||||||
void emit(std::ofstream &of, int level) const;
|
void emit(std::ofstream &of, int level) const;
|
||||||
|
vhdl_type *clone() const;
|
||||||
|
|
||||||
// Common types
|
// Common types
|
||||||
static vhdl_scalar_type *std_logic();
|
static vhdl_scalar_type *std_logic();
|
||||||
|
|
@ -179,7 +182,7 @@ public:
|
||||||
vhdl_nbassign_stmt(vhdl_var_ref *lhs, vhdl_expr *rhs)
|
vhdl_nbassign_stmt(vhdl_var_ref *lhs, vhdl_expr *rhs)
|
||||||
: lhs_(lhs), rhs_(rhs) {}
|
: lhs_(lhs), rhs_(rhs) {}
|
||||||
|
|
||||||
void emit(std::ofstream &of, int level);
|
void emit(std::ofstream &of, int level) const;
|
||||||
private:
|
private:
|
||||||
vhdl_var_ref *lhs_;
|
vhdl_var_ref *lhs_;
|
||||||
vhdl_expr *rhs_;
|
vhdl_expr *rhs_;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue