MMU: Implement a vestigial partition table
[microwatt.git] / crhelpers.vhdl
index 350fd13c6db4c21a3d5673905880e01864e9a508..1e6160f3ff8d54b2d766fb1671b88b6a708c4c7d 100644 (file)
@@ -5,130 +5,53 @@ library work;
 use work.common.all;
 
 package crhelpers is
-       function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer;
-       function num_to_fxm(num: integer) return std_ulogic_vector;
-       --function from_crfile(cr: crfile) return std_ulogic_vector;
-       --function extract_one_crfield(cr: crfile; fxm: std_ulogic_vector(7 downto 0)) return std_ulogic_vector;
-       --function insert_multiple_crfields(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile;
-       --function insert_one_crfield(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile;
+    subtype crnum_t is integer range 0 to 7;
+    subtype crmask_t is std_ulogic_vector(7 downto 0);
+
+    function fxm_to_num(fxm: crmask_t) return crnum_t;
+    function num_to_fxm(num: crnum_t) return crmask_t;
 end package crhelpers;
 
 package body crhelpers is
 
-       function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer is
-       begin
-               -- If multiple fields are set (undefined), match existing
-               -- hardware by returning the first one.
-               for i in 0 to 7 loop
-                       -- Big endian bit numbering
-                       if fxm(7-i) = '1' then
-                               return i;
-                       end if;
-               end loop;
+    function fxm_to_num(fxm: crmask_t) return crnum_t is
+    begin
+        -- If multiple fields are set (undefined), match existing
+        -- hardware by returning the first one.
+        for i in 0 to 7 loop
+            -- Big endian bit numbering
+            if fxm(7-i) = '1' then
+                return i;
+            end if;
+        end loop;
 
-               -- If no fields are set (undefined), also match existing
-               -- hardware by returning cr7.
-               return 7;
-       end;
+        -- If no fields are set (undefined), also match existing
+        -- hardware by returning cr7.
+        return 7;
+    end;
 
-       function num_to_fxm(num: integer) return std_ulogic_vector is
-       begin
-               case num is
-                       when 0 =>
-                               return "10000000";
-                       when 1 =>
-                               return "01000000";
-                       when 2 =>
-                               return "00100000";
-                       when 3 =>
-                               return "00010000";
-                       when 4 =>
-                               return "00001000";
-                       when 5 =>
-                               return "00000100";
-                       when 6 =>
-                               return "00000010";
-                       when 7 =>
-                               return "00000001";
-                       when others =>
-                               return "00000000";
-               end case;
-       end;
+    function num_to_fxm(num: crnum_t) return crmask_t is
+    begin
+        case num is
+            when 0 =>
+                return "10000000";
+            when 1 =>
+                return "01000000";
+            when 2 =>
+                return "00100000";
+            when 3 =>
+                return "00010000";
+            when 4 =>
+                return "00001000";
+            when 5 =>
+                return "00000100";
+            when 6 =>
+                return "00000010";
+            when 7 =>
+                return "00000001";
+            when others =>
+                return "00000000";
+        end case;
+    end;
 
---     function from_crfile(cr: crfile) return std_ulogic_vector is
---             variable combined_cr : std_ulogic_vector(31 downto 0) := (others => '0');
---             variable high, low: integer range 0 to 31 := 0;
---     begin
---             for i in 0 to cr'length-1 loop
---                     low := 4*(7-i);
---                     high := low+3;
---                     combined_cr(high downto low) := cr(i);
---             end loop;
---
---             return combined_cr;
---     end function;
---
---     function extract_one_crfield(cr: crfile; fxm: std_ulogic_vector(7 downto 0)) return std_ulogic_vector is
---             variable combined_cr : std_ulogic_vector(63 downto 0) := (others => '0');
---             variable crnum: integer range 0 to 7 := 0;
---     begin
---             crnum := fxm_to_num(fxm);
---
---             -- Vivado doesn't support non constant vector slice
---             -- low := 4*(7-crnum);
---             -- high := low+3;
---             -- combined_cr(high downto low) := cr(crnum);
---             case_0: case crnum is
---             when 0 =>
---                 combined_cr(31 downto 28) := cr(0);
---             when 1 =>
---                 combined_cr(27 downto 24) := cr(1);
---             when 2 =>
---                 combined_cr(23 downto 20) := cr(2);
---             when 3 =>
---                 combined_cr(19 downto 16) := cr(3);
---             when 4 =>
---                 combined_cr(15 downto 12) := cr(4);
---             when 5 =>
---                 combined_cr(11 downto 8) := cr(5);
---             when 6 =>
---                 combined_cr(7 downto 4) := cr(6);
---             when 7 =>
---                 combined_cr(3 downto 0) := cr(7);
---             end case;
---
---             return combined_cr;
---     end;
---
---     function insert_multiple_crfields(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile is
---             variable cr : crfile;
---             variable combined_cr : std_ulogic_vector(63 downto 0) := (others => '0');
---             variable high, low: integer range 0 to 31 := 0;
---     begin
---             cr := cr_in;
---
---             for i in 0 to 7 loop
---                     -- BE bit numbering
---                     if fxm(7-i) = '1' then
---                             low := 4*(7-i);
---                             high := low+3;
---                             cr(i) := rs(high downto low);
---                     end if;
---             end loop;
---
---             return cr;
---     end;
---
---     function insert_one_crfield(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile is
---             variable cr : crfile;
---             variable crnum: integer range 0 to 7 := 0;
---             variable high, low: integer range 0 to 31 := 0;
---     begin
---             cr := cr_in;
---             crnum := fxm_to_num(fxm);
---             low := 4*(7-crnum);
---             high := low+3;
---             cr(crnum) := rs(high downto low);
---             return cr;
---     end;
 end package body crhelpers;