Simplify support function emitting code

This commit is contained in:
Nick Gasson 2008-07-28 22:48:21 +01:00
parent f88415b1d7
commit 7a2e9c02cd
1 changed files with 13 additions and 18 deletions

View File

@ -70,9 +70,8 @@ vhdl_type *support_function::function_type(support_function_t type)
void support_function::emit_ternary(std::ostream &of, int level) const void support_function::emit_ternary(std::ostream &of, int level) const
{ {
of << "begin" << nl_string(indent(level)) of << nl_string(level) << "begin" << nl_string(indent(level))
<< "if T then return X; else return Y; end if;" << "if T then return X; else return Y; end if;";
<< nl_string(level);
} }
void support_function::emit(std::ostream &of, int level) const void support_function::emit(std::ostream &of, int level) const
@ -83,12 +82,12 @@ void support_function::emit(std::ostream &of, int level) const
case SF_UNSIGNED_TO_BOOLEAN: case SF_UNSIGNED_TO_BOOLEAN:
of << "(X : unsigned) return Boolean is" << nl_string(level) of << "(X : unsigned) return Boolean is" << nl_string(level)
<< "begin" << nl_string(indent(level)) << "begin" << nl_string(indent(level))
<< "return X /= To_Unsigned(0, X'Length);" << nl_string(level); << "return X /= To_Unsigned(0, X'Length);";
break; break;
case SF_SIGNED_TO_BOOLEAN: case SF_SIGNED_TO_BOOLEAN:
of << "(X : signed) return Boolean is" << nl_string(level) of << "(X : signed) return Boolean is" << nl_string(level)
<< "begin" << nl_string(indent(level)) << "begin" << nl_string(indent(level))
<< "return X /= To_Signed(0, X'Length);" << nl_string(level); << "return X /= To_Signed(0, X'Length);";
break; break;
case SF_BOOLEAN_TO_LOGIC: case SF_BOOLEAN_TO_LOGIC:
of << "(B : Boolean) return std_logic is" << nl_string(level) of << "(B : Boolean) return std_logic is" << nl_string(level)
@ -97,7 +96,7 @@ void support_function::emit(std::ostream &of, int level) const
<< "return '1';" << nl_string(indent(level)) << "return '1';" << nl_string(indent(level))
<< "else" << nl_string(indent(indent(level))) << "else" << nl_string(indent(indent(level)))
<< "return '0';" << nl_string(indent(level)) << "return '0';" << nl_string(indent(level))
<< "end if;" << nl_string(level); << "end if;";
break; break;
case SF_REDUCE_OR: case SF_REDUCE_OR:
of << "(X : std_logic_vector) return std_logic is" << nl_string(level) of << "(X : std_logic_vector) return std_logic is" << nl_string(level)
@ -107,7 +106,7 @@ void support_function::emit(std::ostream &of, int level) const
<< "return '1';" << nl_string(indent(indent(level))) << "return '1';" << nl_string(indent(indent(level)))
<< "end if;" << nl_string(indent(level)) << "end if;" << nl_string(indent(level))
<< "end loop;" << nl_string(indent(level)) << "end loop;" << nl_string(indent(level))
<< "return '0';" << nl_string(level); << "return '0';";
break; break;
case SF_REDUCE_AND: case SF_REDUCE_AND:
of << "(X : std_logic_vector) return std_logic is" << nl_string(level) of << "(X : std_logic_vector) return std_logic is" << nl_string(level)
@ -117,7 +116,7 @@ void support_function::emit(std::ostream &of, int level) const
<< "return '0';" << nl_string(indent(indent(level))) << "return '0';" << nl_string(indent(indent(level)))
<< "end if;" << nl_string(indent(level)) << "end if;" << nl_string(indent(level))
<< "end loop;" << nl_string(indent(level)) << "end loop;" << nl_string(indent(level))
<< "return '1';" << nl_string(level); << "return '1';";
break; break;
case SF_REDUCE_XOR: case SF_REDUCE_XOR:
of << "(X : std_logic_vector) return std_logic is" of << "(X : std_logic_vector) return std_logic is"
@ -127,32 +126,28 @@ void support_function::emit(std::ostream &of, int level) const
<< "for I in X'Range loop" << nl_string(indent(indent(level))) << "for I in X'Range loop" << nl_string(indent(indent(level)))
<< "R := X(I) xor R;" << nl_string(indent(level)) << "R := X(I) xor R;" << nl_string(indent(level))
<< "end loop;" << nl_string(indent(level)) << "end loop;" << nl_string(indent(level))
<< "return R;" << nl_string(level); << "return R;";
break; break;
case SF_TERNARY_LOGIC: case SF_TERNARY_LOGIC:
of << "(T : Boolean; X, Y : std_logic) return std_logic is" of << "(T : Boolean; X, Y : std_logic) return std_logic is";
<< nl_string(level);
emit_ternary(of, level); emit_ternary(of, level);
break; break;
case SF_TERNARY_SIGNED: case SF_TERNARY_SIGNED:
of << "(T : Boolean; X, Y : signed) return signed is" of << "(T : Boolean; X, Y : signed) return signed is";
<< nl_string(level);
emit_ternary(of, level); emit_ternary(of, level);
break; break;
case SF_TERNARY_UNSIGNED: case SF_TERNARY_UNSIGNED:
of << "(T : Boolean; X, Y : signed) return unsigned is" of << "(T : Boolean; X, Y : signed) return unsigned is";
<< nl_string(level);
emit_ternary(of, level); emit_ternary(of, level);
break; break;
case SF_LOGIC_TO_INTEGER: case SF_LOGIC_TO_INTEGER:
of << "(X : std_logic) return integer is" << nl_string(level) of << "(X : std_logic) return integer is" << nl_string(level)
<< "begin" << nl_string(indent(level)) << "begin" << nl_string(indent(level))
<< "if X = '1' then return 1; else return 0; end if;" << "if X = '1' then return 1; else return 0; end if;";
<< nl_string(level);
break; break;
default: default:
assert(false); assert(false);
} }
of << "end function;" << nl_string(level); of << nl_string(level) << "end function;" << nl_string(level);
} }