Skip to content
Snippets Groups Projects
matrix_pkg.vhd 4.21 KiB
Newer Older
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package matrix_pkg is

    type matrix is array(natural range <>, natural range <>) of std_logic;

    -- assign row

    function mrst(slm : matrix) return matrix;

    -- assign row

    ---function mset(slm : matrix; slv : std_logic_vector; rowindex : natural) return matrix;

    procedure mset(signal slm : out matrix; slv : std_logic_vector; rowindex : natural);

    procedure mset_no_rng(signal slm : out matrix; slv : std_logic_vector; rowindex : natural);

    -- get std logic vector from matrix row

    function mget(slm : matrix; rowindex : natural) return std_logic_vector;

    -- flatten matrix to std logic vector

    function mflat(slm : matrix) return std_logic_vector;

    -- inflate std logic vector to matrix 
    function minfl(slm : matrix; slv : std_logic_vector ) return matrix;

    --  inflate std logic vector to m x n matrix

    function minflmn(slv : std_logic_vector; col_len : natural; row_len : natural) return matrix;

  end matrix_pkg;

  package body matrix_pkg is  



    function mrst(slm : matrix) return matrix is
      variable res : matrix(slm'length(1)-1 downto 0, slm'length(2)-1 downto 0);
      variable row, col : natural := 0;      
      constant row_len : natural := slm'length(2);
      constant col_len : natural := slm'length(1);
    begin
      for row in 0 to col_len-1 loop
        for col in 0 to row_len-1 loop
          res(row, col) := '0';
        end loop;
      end loop;
      return res;		
    end function;

  
    procedure mset(signal slm : out matrix; slv : std_logic_vector; rowindex : natural) is
      variable i : natural := 0;
    begin
      for i in slv'range loop
        slm(rowindex, i) <= slv(i);
      end loop;	
    end procedure;

    procedure mset_no_rng(signal slm : out matrix; slv : std_logic_vector; rowindex : natural) is
      variable i : natural := 0;
      variable j : natural := 0;
    begin
      j := 0;
      for i in slv'range loop
        slm(rowindex, j) <= slv(i);
        j := j+1;
      end loop;	
    end procedure;
    

    -- set matrix row
--     function mset(slm : matrix; slv : std_logic_vector; rowindex : natural) return matrix is
 --      variable i : natural := 0;
 --      variable res : matrix(slm'length(1)-1 downto 0, slm'length(2)-1 downto 0);
--     begin
 --      res := slm;
 --      for i in slv'range loop
 --        res(rowindex, i) := slv(i);
 --      end loop;
 --      return res;		
--     end function;

    
    -- get matrix row
    function mget(slm : matrix; rowindex : natural) return std_logic_vector is
      variable i : natural := 0;
      variable slv : std_logic_vector(slm'high(2) downto 0);
    begin
      for i in slv'range loop
        slv(i)  := slm(rowindex, i);
      end loop;
      return slv;
    end function;

    
    -- flatten matrix to std logic vector
    function mflat(slm : matrix) return std_logic_vector is
      constant row_len : natural := slm'length(2);
      constant col_len : natural := slm'length(1);
      variable res : std_logic_vector(col_len*row_len-1 downto 0);  
    begin
      for row in 0 to col_len-1 loop
        for col in 0 to row_len-1 loop
          res(row*row_len+col)  := slm(row, col);
        end loop;
      end loop;
      return res;
    end function;


    -- inflate std logic vector to matrix
    function minfl(slm : matrix; slv : std_logic_vector) return matrix is
      constant row_len : natural := slm'length(2);
      constant col_len : natural := slm'length(1);
      variable res : matrix(slm'length(1)-1 downto 0, slm'length(2)-1 downto 0);
    begin
      for row in 0 to col_len-1 loop
         for col in 0 to row_len-1 loop
              res(row, col)  := slv(row*row_len+col);
         end loop;
      end loop;
      return res;
    end function;
    

    -- -- inflate std logic vector to m*n matrix 
    function minflmn(slv : std_logic_vector; col_len : natural; row_len : natural) return matrix is
      variable res : matrix(col_len-1 downto 0, row_len-1 downto 0);
    begin
      for row in 0 to col_len-1 loop
         for col in 0 to row_len-1 loop
              res(row, col)  := slv(slv'length-1 - (row*row_len+col));
         end loop;
      end loop;
      return res;
    end function;

  end matrix_pkg;