Add Tercel PHY reset synchronization
[microwatt.git] / utils.vhdl
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
4
5 package utils is
6
7 function log2(i : natural) return integer;
8 function log2ceil(i : natural) return integer;
9 function ispow2(i : integer) return boolean;
10 function round_up(i : integer; s : integer) return integer;
11 end utils;
12
13 package body utils is
14
15 function log2(i : natural) return integer is
16 variable tmp : integer := i;
17 variable ret : integer := 0;
18 begin
19 while tmp > 1 loop
20 ret := ret + 1;
21 tmp := tmp / 2;
22 end loop;
23 return ret;
24 end function;
25
26 function log2ceil(i : natural) return integer is
27 variable tmp : integer := i;
28 variable ret : integer := 0;
29 begin
30 while tmp >= 1 loop
31 ret := ret + 1;
32 tmp := tmp / 2;
33 end loop;
34 return ret;
35 end function;
36
37 function ispow2(i : integer) return boolean is
38 begin
39 if to_integer(to_unsigned(i, 32) and to_unsigned(i - 1, 32)) = 0 then
40 return true;
41 else
42 return false;
43 end if;
44 end function;
45
46 function round_up(i : integer; s : integer) return integer is
47 begin
48 return ((i + (s - 1)) / s) * s;
49 end function;
50 end utils;
51