Add reduction XOR/XNOR in expressions

This commit is contained in:
Nick Gasson 2008-09-13 18:09:11 +01:00
parent e5343ef73f
commit e5abe182c1
3 changed files with 17 additions and 0 deletions

View File

@ -180,6 +180,10 @@ static vhdl_expr *translate_unary(ivl_expr_t e)
return translate_reduction(SF_REDUCE_AND, true, operand);
case '&':
return translate_reduction(SF_REDUCE_AND, false, operand);
case '^': // XOR
return translate_reduction(SF_REDUCE_XOR, false, operand);
case 'X': // XNOR
return translate_reduction(SF_REDUCE_XNOR, false, operand);
default:
error("No translation for unary opcode '%c'\n",
ivl_expr_opcode(e));

View File

@ -40,6 +40,7 @@ const char *support_function::function_name(support_function_t type)
case SF_REDUCE_OR: return "Reduce_OR";
case SF_REDUCE_AND: return "Reduce_AND";
case SF_REDUCE_XOR: return "Reduce_XOR";
case SF_REDUCE_XNOR: return "Reduce_XNOR";
case SF_TERNARY_LOGIC: return "Ternary_Logic";
case SF_TERNARY_UNSIGNED: return "Ternary_Unsigned";
case SF_TERNARY_SIGNED: return "Ternary_Signed";
@ -61,6 +62,7 @@ vhdl_type *support_function::function_type(support_function_t type)
case SF_REDUCE_OR:
case SF_REDUCE_AND:
case SF_REDUCE_XOR:
case SF_REDUCE_XNOR:
case SF_TERNARY_LOGIC:
case SF_SIGNED_TO_LOGIC:
case SF_UNSIGNED_TO_LOGIC:
@ -146,6 +148,16 @@ void support_function::emit(std::ostream &of, int level) const
<< "end loop;" << nl_string(indent(level))
<< "return R;";
break;
case SF_REDUCE_XNOR:
of << "(X : std_logic_vector) return std_logic is"
<< nl_string(indent(level))
<< "variable R : std_logic := '0';" << nl_string(level)
<< "begin" << nl_string(indent(level))
<< "for I in X'Range loop" << nl_string(indent(indent(level)))
<< "R := X(I) xnor R;" << nl_string(indent(level))
<< "end loop;" << nl_string(indent(level))
<< "return R;";
break;
case SF_TERNARY_LOGIC:
of << "(T : Boolean; X, Y : std_logic) return std_logic is";
emit_ternary(of, level);

View File

@ -30,6 +30,7 @@ enum support_function_t {
SF_REDUCE_OR,
SF_REDUCE_AND,
SF_REDUCE_XOR,
SF_REDUCE_XNOR,
SF_TERNARY_LOGIC,
SF_TERNARY_UNSIGNED,
SF_TERNARY_SIGNED,