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

--******************************************************************************
--** ENTITY intexcu
--**
--** Deskripsi: Struktur entity ini menguraikan Interrupt and Exception
--**            control unit. Entity ini digunakan untuk memilih interupsi mana
--**            untuk dibolehkan dan menahan program counter. Unit ini juga
--**            mengirimkan keluar interrupt acknowledgements. 
--******************************************************************************
ENTITY intexcu IS
    PORT(IF_PC, ID_PC, EX_PC               : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
         INSTR_INTERRUPT, Interrupts       : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
         pcSelect                          : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
         overflow, undefined, pcEnabled    : IN STD_LOGIC;
         clk, reti, ie                     : IN STD_LOGIC;
         ifid_flush, idex_flush            : OUT STD_LOGIC;
         exmem_flush, pcEnable             : OUT STD_LOGIC;
         pcSel                             : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
         intretu                           : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
         ACKNOWLEDGE                       : OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END ENTITY intexcu;

ARCHITECTURE structural_intexcu OF intexcu IS
    
    --Menentukan isyarat yang dibutuhkan
    SIGNAL temp_ACK, temp_EnabledInts       : STD_LOGIC_VECTOR(5 DOWNTO 0);
    SIGNAL temp_disableInt, temp_enable     : STD_LOGIC;
    SIGNAL temp_trappc                      : STD_LOGIC_VECTOR(1 DOWNTO 0);

    --**************************************************************************
    --**** Ini dimana struktur dari exception and
    --**** interrupt unit dimulai. Ini dibuat dari exception control unit,
    --**** regcu, acknowledgement registers, interrupt enabled
    --**** registers dan TRAP register.
    --**************************************************************************
    BEGIN
    
    --**************************************************************************
    --**** Exception Control Unit
    --**** PORT MAP ini menunjukkan hubungan dari Exception Control Unit
    --**** dalam interrupt and exception unit.
    --**************************************************************************
    exceptioncontrol : work.exceptcu
        PORT MAP(Interrupts, temp_EnabledInts, pcSelect, overflow, undefined, 
                 temp_enable,pcEnabled, temp_ACK, ifid_flush, idex_flush, 
                 exmem_flush,pcSel,temp_disableInt, temp_trappc, pcEnable);
    
    --**************************************************************************
    --**** regCU
    --**** PORT MAP ini menunjukkan hubungan antara regCU dan the rest
    --**** of the interrupt and exception unit.
    --**************************************************************************
    select1 : work.regcu
        PORT MAP(temp_disableInt, clk, reti, temp_enable);
    
    --**************************************************************************
    --**** Acknowledgement Register
    --**** PORT MAP ini menunjukkan hubungan antara acknowledgment
    --**** registers dan the rest of the exception unit.
    --**************************************************************************
    acknowledgement : work.ackreg
        PORT MAP(temp_ACK, clk, ACKNOWLEDGE);
    
    --**************************************************************************
    --**** Interrupts Enabled Register
    --**** PORT MAP ini menunjukkan hubungan antara interrupts enabled
    --**** register dan the rest of the interrupt and exception unit.
    --**************************************************************************
    enabled : work.iereg
        PORT MAP(INSTR_INTERRUPT, clk, ie, temp_EnabledInts);
    
    --**************************************************************************
    --**** TRAP
    --**** PORT MAP ini menunjukkan hubungan antara TRAP register dan
    --**** the rest of the interrupt and exception unit.
    --**************************************************************************
    trappc : work.trap
        PORT MAP(IF_PC, ID_PC, EX_PC, clk, temp_trappc, intretu);
    
END ARCHITECTURE structural_intexcu;
