Support conversion of (un)signed to std_logic

Take the least-significant bit. This fixes a couple of broken
test cases.
This commit is contained in:
Nick Gasson 2008-08-22 20:59:14 +01:00
parent 331a51e842
commit d21b3258e3
3 changed files with 38 additions and 0 deletions

View File

@ -106,6 +106,28 @@ vhdl_expr *vhdl_expr::cast(const vhdl_type *to)
return ah;
}
else if (to->get_name() == VHDL_TYPE_STD_LOGIC
&& (type_->get_name() == VHDL_TYPE_SIGNED)) {
require_support_function(SF_SIGNED_TO_LOGIC);
vhdl_fcall *ah =
new vhdl_fcall(support_function::function_name(SF_SIGNED_TO_LOGIC),
vhdl_type::std_logic());
ah->add_expr(this);
return ah;
}
else if (to->get_name() == VHDL_TYPE_STD_LOGIC
&& (type_->get_name() == VHDL_TYPE_UNSIGNED)) {
require_support_function(SF_UNSIGNED_TO_LOGIC);
vhdl_fcall *ah =
new vhdl_fcall(support_function::function_name(SF_UNSIGNED_TO_LOGIC),
vhdl_type::std_logic());
ah->add_expr(this);
return ah;
}
else {
// We have to cast the expression before resizing or the
// wrong sign bit may be extended (i.e. when casting between

View File

@ -44,6 +44,8 @@ const char *support_function::function_name(support_function_t type)
case SF_TERNARY_UNSIGNED: return "Ternary_Unsigned";
case SF_TERNARY_SIGNED: return "Ternary_Signed";
case SF_LOGIC_TO_INTEGER: return "Logic_To_Integer";
case SF_SIGNED_TO_LOGIC: return "Signed_To_Logic";
case SF_UNSIGNED_TO_LOGIC: return "Unsigned_To_Logic";
default:
assert(false);
}
@ -60,6 +62,8 @@ vhdl_type *support_function::function_type(support_function_t type)
case SF_REDUCE_AND:
case SF_REDUCE_XOR:
case SF_TERNARY_LOGIC:
case SF_SIGNED_TO_LOGIC:
case SF_UNSIGNED_TO_LOGIC:
return vhdl_type::std_logic();
case SF_TERNARY_SIGNED:
return new vhdl_type(VHDL_TYPE_SIGNED);
@ -102,6 +106,16 @@ void support_function::emit(std::ostream &of, int level) const
<< "return '0';" << nl_string(indent(level))
<< "end if;";
break;
case SF_UNSIGNED_TO_LOGIC:
of << "(X : unsigned) return std_logic is" << nl_string(level)
<< "begin" << nl_string(indent(level))
<< "return X(0);";
break;
case SF_SIGNED_TO_LOGIC:
of << "(X : signed) return std_logic is" << nl_string(level)
<< "begin" << nl_string(indent(level))
<< "return X(0);";
break;
case SF_REDUCE_OR:
of << "(X : std_logic_vector) return std_logic is" << nl_string(level)
<< "begin" << nl_string(indent(level))

View File

@ -34,6 +34,8 @@ enum support_function_t {
SF_TERNARY_UNSIGNED,
SF_TERNARY_SIGNED,
SF_LOGIC_TO_INTEGER,
SF_SIGNED_TO_LOGIC,
SF_UNSIGNED_TO_LOGIC,
};
class support_function : public vhdl_function {