Conversion of std_logic to integer
This commit is contained in:
parent
1250010696
commit
f88415b1d7
|
|
@ -70,7 +70,15 @@ vhdl_expr *vhdl_expr::cast(const vhdl_type *to)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (to->get_name() == VHDL_TYPE_INTEGER) {
|
else if (to->get_name() == VHDL_TYPE_INTEGER) {
|
||||||
vhdl_fcall *conv = new vhdl_fcall("To_Integer", new vhdl_type(*to));
|
vhdl_fcall *conv;
|
||||||
|
if (type_->get_name() == VHDL_TYPE_STD_LOGIC) {
|
||||||
|
require_support_function(SF_LOGIC_TO_INTEGER);
|
||||||
|
conv = new vhdl_fcall(support_function::function_name(SF_LOGIC_TO_INTEGER),
|
||||||
|
vhdl_type::integer());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
conv = new vhdl_fcall("To_Integer", new vhdl_type(*to));
|
||||||
|
|
||||||
conv->add_expr(this);
|
conv->add_expr(this);
|
||||||
|
|
||||||
return conv;
|
return conv;
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ const char *support_function::function_name(support_function_t type)
|
||||||
case SF_TERNARY_LOGIC: return "Ternary_Logic";
|
case SF_TERNARY_LOGIC: return "Ternary_Logic";
|
||||||
case SF_TERNARY_UNSIGNED: return "Ternary_Unsigned";
|
case SF_TERNARY_UNSIGNED: return "Ternary_Unsigned";
|
||||||
case SF_TERNARY_SIGNED: return "Ternary_Signed";
|
case SF_TERNARY_SIGNED: return "Ternary_Signed";
|
||||||
|
case SF_LOGIC_TO_INTEGER: return "Logic_To_Integer";
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
@ -60,6 +61,8 @@ vhdl_type *support_function::function_type(support_function_t type)
|
||||||
case SF_REDUCE_XOR:
|
case SF_REDUCE_XOR:
|
||||||
case SF_TERNARY_LOGIC:
|
case SF_TERNARY_LOGIC:
|
||||||
return vhdl_type::std_logic();
|
return vhdl_type::std_logic();
|
||||||
|
case SF_LOGIC_TO_INTEGER:
|
||||||
|
return vhdl_type::integer();
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
@ -141,6 +144,12 @@ void support_function::emit(std::ostream &of, int level) const
|
||||||
<< nl_string(level);
|
<< nl_string(level);
|
||||||
emit_ternary(of, level);
|
emit_ternary(of, level);
|
||||||
break;
|
break;
|
||||||
|
case SF_LOGIC_TO_INTEGER:
|
||||||
|
of << "(X : std_logic) return integer is" << nl_string(level)
|
||||||
|
<< "begin" << nl_string(indent(level))
|
||||||
|
<< "if X = '1' then return 1; else return 0; end if;"
|
||||||
|
<< nl_string(level);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ enum support_function_t {
|
||||||
SF_TERNARY_LOGIC,
|
SF_TERNARY_LOGIC,
|
||||||
SF_TERNARY_UNSIGNED,
|
SF_TERNARY_UNSIGNED,
|
||||||
SF_TERNARY_SIGNED,
|
SF_TERNARY_SIGNED,
|
||||||
|
SF_LOGIC_TO_INTEGER,
|
||||||
};
|
};
|
||||||
|
|
||||||
class support_function : public vhdl_function {
|
class support_function : public vhdl_function {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue