Hey Tristan,

I found an interesting (and annoying) bug in GHDL's handling of bit_vector rol
and ror. Basically, rol and ror work fine, except when the amount to rotate
exactly matches the length of the bit_vector, in which case it gets rotated
incorrectly by one place.

Attached is code to illustrate the problem.

Output looks like this:

$ ghdl -i *.vhdl
$ ghdl -m bit_vector_rol_ror_bug
analyze bit_vector_rol_ror_bug.vhdl
elaborate bit_vector_rol_ror_bug
$ ghdl --version | head
GHDL 0.29 (20100109) [Sokcho edition]
$ ./bit_vector_rol_ror_bug
bit_vector_rol_ror_bug.vhdl:20:3:@0ms:(assertion warning): ror  5 is broken
bit_vector_rol_ror_bug.vhdl:28:3:@0ms:(assertion warning): ror -5 is broken
entity bit_vector_rol_ror_bug is
end entity;

architecture ghdl_bug of bit_vector_rol_ror_bug is
begin

  assert ((bit_vector'("11100") ror -8) = "00111") report "ror -8 is broken" severity warning;
  assert ((bit_vector'("11100") ror -7) = "10011") report "ror -7 is broken" severity warning;
  assert ((bit_vector'("11100") ror -6) = "11001") report "ror -6 is broken" severity warning;
  assert ((bit_vector'("11100") ror -5) = "11100") report "ror -5 is broken" severity warning;
  assert ((bit_vector'("11100") ror -4) = "01110") report "ror -4 is broken" severity warning;
  assert ((bit_vector'("11100") ror -3) = "00111") report "ror -3 is broken" severity warning;
  assert ((bit_vector'("11100") ror -2) = "10011") report "ror -2 is broken" severity warning;
  assert ((bit_vector'("11100") ror -1) = "11001") report "ror -1 is broken" severity warning;
  assert ((bit_vector'("11100") ror  0) = "11100") report "ror  0 is broken" severity warning;
  assert ((bit_vector'("11100") ror  1) = "01110") report "ror  1 is broken" severity warning;
  assert ((bit_vector'("11100") ror  2) = "00111") report "ror  2 is broken" severity warning;
  assert ((bit_vector'("11100") ror  3) = "10011") report "ror  3 is broken" severity warning;
  assert ((bit_vector'("11100") ror  4) = "11001") report "ror  4 is broken" severity warning;
  assert ((bit_vector'("11100") ror  5) = "11100") report "ror  5 is broken" severity warning;
  assert ((bit_vector'("11100") ror  6) = "01110") report "ror  6 is broken" severity warning;
  assert ((bit_vector'("11100") ror  7) = "00111") report "ror  7 is broken" severity warning;
  assert ((bit_vector'("11100") ror  8) = "10011") report "ror  8 is broken" severity warning;

  assert ((bit_vector'("11100") rol -8) = "10011") report "ror -8 is broken" severity warning;
  assert ((bit_vector'("11100") rol -7) = "00111") report "ror -7 is broken" severity warning;
  assert ((bit_vector'("11100") rol -6) = "01110") report "ror -6 is broken" severity warning;
  assert ((bit_vector'("11100") rol -5) = "11100") report "ror -5 is broken" severity warning;
  assert ((bit_vector'("11100") rol -4) = "11001") report "ror -4 is broken" severity warning;
  assert ((bit_vector'("11100") rol -3) = "10011") report "ror -3 is broken" severity warning;
  assert ((bit_vector'("11100") rol -2) = "00111") report "ror -2 is broken" severity warning;
  assert ((bit_vector'("11100") rol -1) = "01110") report "ror -1 is broken" severity warning;
  assert ((bit_vector'("11100") rol  0) = "11100") report "ror  0 is broken" severity warning;
  assert ((bit_vector'("11100") rol  1) = "11001") report "ror  1 is broken" severity warning;
  assert ((bit_vector'("11100") rol  2) = "10011") report "ror  2 is broken" severity warning;
  assert ((bit_vector'("11100") rol  3) = "00111") report "ror  3 is broken" severity warning;
  assert ((bit_vector'("11100") rol  4) = "01110") report "ror  4 is broken" severity warning;
  assert ((bit_vector'("11100") rol  5) = "11100") report "ror  5 is broken" severity warning;
  assert ((bit_vector'("11100") rol  6) = "11001") report "ror  6 is broken" severity warning;
  assert ((bit_vector'("11100") rol  7) = "10011") report "ror  7 is broken" severity warning;
  assert ((bit_vector'("11100") rol  8) = "00111") report "ror  8 is broken" severity warning;

end architecture;
_______________________________________________
Ghdl-discuss mailing list
[email protected]
https://mail.gna.org/listinfo/ghdl-discuss

Reply via email to