--******************************************************************************
--* @short   Logic to combine the status bits of all chips to the GMT status.
--*          (Inside ROP Chip)
--*
--*          Contains only asynchronous logic to compare the status signals
--*          from the chips into an overal GMT status.
--*
--******************************************************************************
--* @author  SAKULIN Hannes  <hsakulin@dsy-srv3.cern.ch>
--* @version $Revision: 1.2 $
--* @date    $Date: 2004/12/16 19:02:15 $
--******************************************************************************
--/
library IEEE;
use IEEE.Std_logic_1164.all;

-- pragma translate_off
library UNISIM;
use UNISIM.VCOMPONENTS.all;
-- pragma translate_on
use IEEE.NUMERIC_STD.all;
use work.VMEMux.all;
use work.ROPVMEAddrMap.all;
 
entity ROPCombineStatus is
  port (
    -- STATUS Signals of FPGAs for VME
    dcm_locked_ROP : in std_logic;
    dcm_locked_INF : in std_logic;
    dcm_locked_INC : in std_logic;
    dcm_locked_IND : in std_logic;
    dcm_locked_INB : in std_logic;
    dcm_locked_AUF : in std_logic;
    dcm_locked_LFF : in std_logic;
    dcm_locked_LFB : in std_logic;
    dcm_locked_AUB : in std_logic;
    dcm_locked_SRT : in std_logic;

    -- STATUS Signals of FPGAs for TCS
    status_ROP : in std_logic_vector(1 downto 0);
    status_INF : in std_logic_vector(1 downto 0);
    status_INC : in std_logic_vector(1 downto 0);
    status_IND : in std_logic_vector(1 downto 0);
    status_INB : in std_logic_vector(1 downto 0);
    status_AUF : in std_logic_vector(1 downto 0);
    status_LFF : in std_logic_vector(1 downto 0);
    status_LFB : in std_logic_vector(1 downto 0);
    status_AUB : in std_logic_vector(1 downto 0);
    status_SRT : in std_logic_vector(1 downto 0);

    STAT_GMT : out std_logic_vector(3 downto 0);

    busy_from_SW  : in std_logic;
    ready_from_SW : in std_logic;

    -- Clock and control
    clk      : in std_logic;
    reset    : in std_logic
    );
end;


architecture behavioral of ROPCombineStatus is
  attribute syn_useioff               : boolean;
  attribute syn_useioff of behavioral : architecture is true;

  signal warning_ROP, outofsync_ROP, error_ROP  : std_logic;
  signal warning_INF, outofsync_INF, error_INF  : std_logic;
  signal warning_INC, outofsync_INC, error_INC  : std_logic;
  signal warning_IND, outofsync_IND, error_IND  : std_logic;
  signal warning_INB, outofsync_INB, error_INB  : std_logic;
  signal warning_AUF, outofsync_AUF, error_AUF  : std_logic;
  signal warning_LFB, outofsync_LFB, error_LFB  : std_logic;
  signal warning_LFF, outofsync_LFF, error_LFF  : std_logic;
  signal warning_AUB, outofsync_AUB, error_AUB  : std_logic;
  signal warning_SRT, outofsync_SRT, error_SRT  : std_logic;

  signal any_warning, any_outofsync, any_error : std_logic;
begin

  warning_ROP <= '1' when status_ROP = "01" else '0';
  warning_INF <= '1' when status_INF = "01" else '0';
  warning_INC <= '1' when status_INC = "01" else '0';
  warning_IND <= '1' when status_IND = "01" else '0';
  warning_INB <= '1' when status_INB = "01" else '0';
  warning_AUF <= '1' when status_AUF = "01" else '0';
  warning_LFB <= '1' when status_LFB = "01" else '0';
  warning_LFF <= '1' when status_LFF = "01" else '0';
  warning_AUB <= '1' when status_AUB = "01" else '0';
  warning_SRT <= '1' when status_SRT = "01" else '0';

  outofsync_ROP <= '1' when status_ROP = "10" else '0';
  outofsync_INF <= '1' when status_INF = "10" else '0';
  outofsync_INC <= '1' when status_INC = "10" else '0';
  outofsync_IND <= '1' when status_IND = "10" else '0';
  outofsync_INB <= '1' when status_INB = "10" else '0';
  outofsync_AUF <= '1' when status_AUF = "10" else '0';
  outofsync_LFB <= '1' when status_LFB = "10" else '0';
  outofsync_LFF <= '1' when status_LFF = "10" else '0';
  outofsync_AUB <= '1' when status_AUB = "10" else '0';
  outofsync_SRT <= '1' when status_SRT = "10" else '0';
  
  error_ROP <= '1' when (status_ROP = "11" or dcm_locked_ROP = '0') else '0';
  error_INF <= '1' when (status_INF = "11" or dcm_locked_INF = '0') else '0';
  error_INC <= '1' when (status_INC = "11" or dcm_locked_INC = '0') else '0';
  error_IND <= '1' when (status_IND = "11" or dcm_locked_IND = '0') else '0';
  error_INB <= '1' when (status_INB = "11" or dcm_locked_INB = '0') else '0';
  error_AUF <= '1' when (status_AUF = "11" or dcm_locked_AUF = '0') else '0';
  error_LFB <= '1' when (status_LFB = "11" or dcm_locked_LFB = '0') else '0';
  error_LFF <= '1' when (status_LFF = "11" or dcm_locked_LFF = '0') else '0';
  error_AUB <= '1' when (status_AUB = "11" or dcm_locked_AUB = '0') else '0';
  error_SRT <= '1' when (status_SRT = "11" or dcm_locked_SRT = '0') else '0';

  any_warning <= warning_ROP or
                 warning_INF or
                 warning_INC or
                 warning_IND or
                 warning_INB or
                 warning_AUF or
                 warning_LFB or
                 warning_LFF or
                 warning_AUB or
                 warning_SRT;   
 
  any_error <=  error_ROP or 
                error_INF or 
                error_INC or 
                error_IND or 
                error_INB or 
                error_AUF or 
                error_LFB or 
                error_LFF or 
                error_AUB or 
                error_SRT;

  any_outofsync <= outofsync_ROP or 
                   outofsync_INF or 
                   outofsync_INC or 
                   outofsync_IND or 
                   outofsync_INB or 
                   outofsync_AUF or 
                   outofsync_LFB or 
                   outofsync_LFF or 
                   outofsync_AUB or 
                   outofsync_SRT;   
 

  -- priority encoder

  stat_GMT <= "1100" when any_error = '1' else     -- ERROR
              "0010" when any_outofsync = '1' else -- OUTOFSYNC
              "0100" when busy_from_SW = '1' else  -- BUSY
              "0001" when any_warning = '1' else   -- WARNING
              "1000" when ready_from_SW = '1' else -- READY
              "0000";                              -- DISCONNECTED
end architecture behavioral;