--
-- Star Fast-Link Definitions Package
-- 
-- Matt Warren July 2015
--
--

---------------------------------------------------------------------
-- 
--
---------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


package pkg_star_flink is

  constant sIDLE  : std_logic_vector(3 downto 0) := x"1";
  constant sBCR   : std_logic_vector(3 downto 0) := x"2";
  constant sLS    : std_logic_vector(3 downto 0) := x"3";
  constant sBCRLS : std_logic_vector(3 downto 0) := x"4";
  constant sPR    : std_logic_vector(3 downto 0) := x"5";
  constant sLP    : std_logic_vector(3 downto 0) := x"6";
  constant sDATA7 : std_logic_vector(3 downto 0) := x"7";
  constant sDATA0 : std_logic_vector(3 downto 0) := x"8";
  constant sDATA1 : std_logic_vector(3 downto 0) := x"9";
  constant sDATA2 : std_logic_vector(3 downto 0) := x"a";
  constant sDATA3 : std_logic_vector(3 downto 0) := x"b";
  constant sDATA4 : std_logic_vector(3 downto 0) := x"c";
  constant sDATA5 : std_logic_vector(3 downto 0) := x"d";
  constant sDATA6 : std_logic_vector(3 downto 0) := x"e";

  function data2symb (data3b : std_logic_vector(2 downto 0))
    return std_logic_vector;

  function symb2data (symb4b : std_logic_vector(3 downto 0))
    return std_logic_vector;

  type t_usymbol is (ID, BR, LS, BL, PR, LP, D0, D1, D2, D3, D4, D5, D6, D7, AA, ZZ);


end pkg_star_flink;



--=========================================================================================
--
-- B O D Y
--
--=========================================================================================

package body pkg_star_flink is

  function data2symb (
    data3b : std_logic_vector(2 downto 0)
    ) return std_logic_vector is
    variable rval4b : std_logic_vector(3 downto 0);
  begin

    case data3b is
      when "000"  => rval4b := sDATA0;
      when "001"  => rval4b := sDATA1;
      when "010"  => rval4b := sDATA2;
      when "011"  => rval4b := sDATA3;
      when "100"  => rval4b := sDATA4;
      when "101"  => rval4b := sDATA5;
      when "110"  => rval4b := sDATA6;
      when others => rval4b := sDATA7;
    end case;

    return rval4b;
  end function;

  function symb2data (
    symb4b : std_logic_vector(3 downto 0)
    ) return std_logic_vector is
    variable rval3b : std_logic_vector(2 downto 0);
  begin

    case symb4b is
      when sDATA0 => rval3b := "000";
      when sDATA1 => rval3b := "001";
      when sDATA2 => rval3b := "010";
      when sDATA3 => rval3b := "011";
      when sDATA4 => rval3b := "100";
      when sDATA5 => rval3b := "101";
      when sDATA6 => rval3b := "110";
      when others => rval3b := "111";
    end case;

    return rval3b;
  end function;

end pkg_star_flink;