Add conversion from std_logic to (un)signed types

Implemented using the expression (0 => X, others => '0')
This commit is contained in:
Nick Gasson 2008-08-10 11:22:23 +01:00
parent 380e3a8121
commit 8e0bf3ebff
3 changed files with 61 additions and 0 deletions

View File

@ -83,6 +83,15 @@ vhdl_expr *vhdl_expr::cast(const vhdl_type *to)
return conv;
}
else if ((to->get_name() == VHDL_TYPE_UNSIGNED
|| to->get_name() == VHDL_TYPE_SIGNED) &&
type_->get_name() == VHDL_TYPE_STD_LOGIC) {
vhdl_bit_spec_expr *bs =
new vhdl_bit_spec_expr(new vhdl_type(*to), new vhdl_const_bit('0'));
bs->add_bit(0, this);
return bs;
}
else if (to->get_name() == VHDL_TYPE_STD_LOGIC &&
type_->get_name() == VHDL_TYPE_BOOLEAN) {
require_support_function(SF_BOOLEAN_TO_LOGIC);

View File

@ -735,6 +735,37 @@ void vhdl_binop_expr::emit(std::ostream &of, int level) const
of << ")";
}
vhdl_bit_spec_expr::~vhdl_bit_spec_expr()
{
delete others_;
std::list<bit_map>::iterator it;
for (it = bits_.begin(); it != bits_.end(); ++it)
delete (*it).e;
}
void vhdl_bit_spec_expr::add_bit(int bit, vhdl_expr *e)
{
bit_map bm = { bit, e };
bits_.push_back(bm);
}
void vhdl_bit_spec_expr::emit(std::ostream &of, int level) const
{
of << "(";
std::list<bit_map>::const_iterator it;
for (it = bits_.begin(); it != bits_.end(); ++it) {
of << (*it).bit << " => ";
(*it).e->emit(of, level);
of << ", ";
}
of << "others => ";
others_->emit(of, level);
of << ")";
}
vhdl_case_branch::~vhdl_case_branch()
{
delete when_;

View File

@ -129,6 +129,27 @@ private:
};
/*
* An expression like (0 => '1', 2 => '0', others => 'Z')
*/
class vhdl_bit_spec_expr : public vhdl_expr {
public:
vhdl_bit_spec_expr(vhdl_type *type, vhdl_expr *others)
: vhdl_expr(type), others_(others) {}
~vhdl_bit_spec_expr();
void add_bit(int bit, vhdl_expr *e);
void emit(std::ostream &of, int level) const;
private:
vhdl_expr *others_;
struct bit_map {
int bit;
vhdl_expr *e;
};
std::list<bit_map> bits_;
};
class vhdl_const_string : public vhdl_expr {
public:
vhdl_const_string(const char *value)