library ieee;
use ieee.std_logic_1164.all;

package ieee_to_string is
  function to_string(constant value: in std_ulogic;
                     constant as_char_lit: in boolean := true)
           return string;
  
  function to_string(constant value: in std_ulogic_vector;
                     constant as_string_lit: in boolean := true)
           return string;

  function to_string(constant value: in std_logic_vector;
                     constant as_string_lit: in boolean := true)
           return string;

end;

package body ieee_to_string is

  type val_list is array (std_ulogic) of character;
  constant char_val : val_list := "UX01ZWLH-";

  function to_string(constant value: in std_ulogic;
                     constant as_char_lit: in boolean := true)
  return string
  is
  begin
    if as_char_lit then
      return string'("'" & char_val(value) & "'");
    end if;
    return string'("" & char_val(value));
  end;

  function to_string(constant value: in std_ulogic_vector;
                     constant as_string_lit: in boolean := true)
  return string
  is
    variable str: string(1 to value'length) := (others => ' ');
    variable idx: natural := 1;
  begin
    for i in value'range loop
      str(idx to idx) := to_string(value(i), false);
      idx := idx + 1;
    end loop;
    if as_string_lit then
      return string'('"' & str & '"');
    end if;
    return str;
  end;

  function to_string(constant value: in std_logic_vector;
                     constant as_string_lit: in boolean := true)
  return string
  is
  begin
    return to_string(std_ulogic_vector(value), as_string_lit);
  end;

end;