Wait statements
This commit is contained in:
parent
1d28b935e8
commit
d762253f74
|
|
@ -73,7 +73,7 @@ int draw_process(ivl_process_t proc, void *cd)
|
||||||
assert(ivl_scope_type(scope) == IVL_SCT_MODULE);
|
assert(ivl_scope_type(scope) == IVL_SCT_MODULE);
|
||||||
vhdl_entity *ent = find_entity(ivl_scope_tname(scope));
|
vhdl_entity *ent = find_entity(ivl_scope_tname(scope));
|
||||||
assert(ent != NULL);
|
assert(ent != NULL);
|
||||||
|
|
||||||
// If the scope this process belongs to is the same as the
|
// If the scope this process belongs to is the same as the
|
||||||
// VHDL entity was generated from, then create a VHDL process
|
// VHDL entity was generated from, then create a VHDL process
|
||||||
// from this Verilog process. This ensures that each process
|
// from this Verilog process. This ensures that each process
|
||||||
|
|
|
||||||
|
|
@ -190,7 +190,22 @@ static int draw_nbassign(vhdl_process *proc, ivl_statement_t stmt)
|
||||||
*/
|
*/
|
||||||
static int draw_delay(vhdl_process *proc, ivl_statement_t stmt)
|
static int draw_delay(vhdl_process *proc, ivl_statement_t stmt)
|
||||||
{
|
{
|
||||||
std::cout << "draw_delay" << std::endl;
|
uint64_t value = ivl_stmt_delay_val(stmt);
|
||||||
|
|
||||||
|
// This currently ignores the time units and precision
|
||||||
|
// of the enclosing scope
|
||||||
|
// A neat way to do this would be to make these values
|
||||||
|
// constants in the scope (type is Time), and have the
|
||||||
|
// VHDL wait statement compute the value from that.
|
||||||
|
// The other solution is to add them as parameters to
|
||||||
|
// the vhdl_process class
|
||||||
|
std::cout << "Delay for " << value << std::endl;
|
||||||
|
|
||||||
|
// Expand the sub-statement as well
|
||||||
|
// Often this can result in a useless `null' statement
|
||||||
|
// Maybe add a check here and ignore it if it IVL_ST_NOOP?
|
||||||
|
draw_stmt(proc, ivl_stmt_sub_stmt(stmt));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -262,10 +262,28 @@ void vhdl_component_decl::emit(std::ofstream &of, int level) const
|
||||||
of << "end component;";
|
of << "end component;";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vhdl_wait_stmt::~vhdl_wait_stmt()
|
||||||
|
{
|
||||||
|
if (expr_ != NULL)
|
||||||
|
delete expr_;
|
||||||
|
}
|
||||||
|
|
||||||
void vhdl_wait_stmt::emit(std::ofstream &of, int level) const
|
void vhdl_wait_stmt::emit(std::ofstream &of, int level) const
|
||||||
{
|
{
|
||||||
// TODO: There are lots of different types of `wait'
|
of << "wait";
|
||||||
of << "wait;";
|
|
||||||
|
switch (type_) {
|
||||||
|
case VHDL_WAIT_INDEF:
|
||||||
|
break;
|
||||||
|
case VHDL_WAIT_FOR_NS:
|
||||||
|
assert(expr_);
|
||||||
|
of << " for ";
|
||||||
|
expr_->emit(of, level);
|
||||||
|
of << " ns";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
of << ";";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,13 +154,26 @@ private:
|
||||||
vhdl_expr *rhs_;
|
vhdl_expr *rhs_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum vhdl_wait_type_t {
|
||||||
|
VHDL_WAIT_INDEF, // Suspend indefinitely
|
||||||
|
VHDL_WAIT_FOR_NS, // Wait for a constant number of nanoseconds
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Delay simulation indefinitely, until an event, or for a
|
* Delay simulation indefinitely, until an event, or for a
|
||||||
* specified time.
|
* specified time.
|
||||||
*/
|
*/
|
||||||
class vhdl_wait_stmt : public vhdl_seq_stmt {
|
class vhdl_wait_stmt : public vhdl_seq_stmt {
|
||||||
public:
|
public:
|
||||||
|
vhdl_wait_stmt(vhdl_wait_type_t type = VHDL_WAIT_INDEF,
|
||||||
|
vhdl_expr *expr = NULL)
|
||||||
|
: type_(type), expr_(expr) {}
|
||||||
|
~vhdl_wait_stmt();
|
||||||
|
|
||||||
void emit(std::ofstream &of, int level) const;
|
void emit(std::ofstream &of, int level) const;
|
||||||
|
private:
|
||||||
|
vhdl_wait_type_t type_;
|
||||||
|
vhdl_expr *expr_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue