Convert std_logic to Boolean in loop tests

This commit is contained in:
Nick Gasson 2008-07-27 18:39:16 +01:00
parent ba462eb8b7
commit 8b32096e2a
4 changed files with 21 additions and 0 deletions

View File

@ -168,6 +168,8 @@ vhdl_expr *vhdl_const_bit::cast(const vhdl_type *to)
{
if (to->get_name() == VHDL_TYPE_INTEGER)
return new vhdl_const_int(bit_ == '1' ? 1 : 0);
else if (to->get_name() == VHDL_TYPE_BOOLEAN)
return new vhdl_const_bool(bit_ == '1');
else
return vhdl_expr::cast(to);
}

View File

@ -551,6 +551,11 @@ int draw_while(vhdl_procedural *proc, stmt_container *container,
if (NULL == test)
return 1;
// The test must be a Boolean (and std_logic and (un)signed types
// must be explicitly cast unlike in Verilog)
vhdl_type boolean(VHDL_TYPE_BOOLEAN);
test = test->cast(&boolean);
vhdl_while_stmt *loop = new vhdl_while_stmt(test);
container->add_stmt(loop);

View File

@ -567,6 +567,11 @@ void vhdl_const_int::emit(std::ostream &of, int level) const
of << value_;
}
void vhdl_const_bool::emit(std::ostream &of, int level) const
{
of << (value_ ? "True" : "False");
}
void vhdl_const_time::emit(std::ostream &of, int level) const
{
of << value_;

View File

@ -180,6 +180,15 @@ private:
int64_t value_;
};
class vhdl_const_bool : public vhdl_expr {
public:
vhdl_const_bool(bool value)
: vhdl_expr(vhdl_type::boolean(), true), value_(value) {}
void emit(std::ostream &of, int level) const;
private:
bool value_;
};
class vhdl_expr_list : public vhdl_element {
public:
~vhdl_expr_list();