--  Hello world program.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.MATH_REAL.ALL;

use std.textio.all; --  Imports the standard textio package.

--  Defines a design entity, without any ports.
entity test is
end test;

architecture behaviour of test is
subtype test_range_t is integer range -15 to 16;
type test_t is array (test_range_t range <>) of std_ulogic;
type natural_ptr is access natural;

signal a_s, b_s : integer := 10;
signal c_s : real := 0.0;
signal clk_s : std_logic := '0';
signal res_s : std_logic := '1';
signal test_s : test_t(2 downto -5);

begin
resgen:
  process
    begin
      wait for 10 ns;
      res_s <= not res_s;
      wait;
  end process;

clkgen:
  process
  variable count : natural_ptr;
    begin
      count := new natural'(10);
      wait for 10 ns;
        if (a_s > 0) then
          clk_s <= not clk_s;
        else
          report "Ende der Simulation" severity note;
        end if;
        end process;

output_proc:
process (clk_s, res_s)
  variable l : line;
  variable b_v : integer := 0;
  variable c_v : real := 1.0;
begin
  if (res_s = '1') then
    write (l, String'("Hello world!"));
    writeline (output, l);

    write (l, String'("High="));
    write (l, test_s'high);
    writeline (output, l);

    write (l, String'("Low="));
    write (l, test_s'low);
    writeline (output, l);

    write (l, String'("Left="));
    write (l, test_s'left);
    writeline (output, l);

    write (l, String'("Right="));
    write (l, test_s'right);
    writeline (output, l);

    write (l, String'("Var="));
    write (l, sin(math_pi_over_4));
    writeline (output, l);


  elsif (rising_edge(clk_s)) then
    write (l, String'("a="));
    write (l, a_s);
    writeline (output, l);

    write (l, String'("b="));
    write (l, b_v);
    writeline (output, l);

    write (l, String'("c="));
    write (l, c_v);
    writeline (output, l);

    a_s <= a_s - 1;
    b_v := b_v + 1;
    c_v := 0.1 * c_v;
  end if;
  b_s <= b_v after 3 ns;
  c_s <= c_v after 3 ns;
end process;

end behaviour;

