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 STAGE3
--**
--** Deskripsi: Struktur entity ini menguraikan Execution Stage 
--** dari pipeline. 
--******************************************************************************
ENTITY stage3 IS
    PORT(RegA, RegB, R_immediate            : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
         idex_pc, S_Immediate               : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
         M_Immediate                        : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
         alu_sel, jal_control, clk          : IN STD_LOGIC;
         alu_function                       : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
         ex_select                          : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
         idexwb                             : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
         exmem_pc, exmem_read, exmem_result : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
         exmem_wb                           : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
         overflow                           : OUT STD_LOGIC);
END ENTITY stage3;

ARCHITECTURE structural_stage3 OF stage3 IS
    --Menentukan isyarat yang dibutuhkan
    
    --******** 3-bit temporary signals diperlukan ********
    SIGNAL regOneIn, regTwoIn               : STD_LOGIC_VECTOR(2 DOWNTO 0);
    
    --******** 16-bit temporary signals diperlukan *******
    SIGNAL alu_result, temp_result          : STD_LOGIC_VECTOR(15 DOWNTO 0);


    --**************************************************************************
    --**** Ini dimana strukstur dari Stage Three dimulai. Stage
    --**** three dibuat dengan entity dibawah ini.
    --**** ENTITIES:
    --****          alu, bus_mux_16 and the EXMEM pipeline register.
    --**************************************************************************
    BEGIN
    
    --**************************************************************************
    --**** ALU
    --**** PORT MAP ini menunjukkan bagaimana ALU dihubungkan dalam stage three dari 
    --**** pipeline.
    --**************************************************************************
    alu : work.alu
        PORT MAP(regA, regB, R_Immediate, S_Immediate, M_Immediate, 
                 alu_sel, alu_function, ex_select, alu_result, overflow);
    
    --**************************************************************************
    --**** bus_mux_16
    --**** PORT MAP ini digunakan untuk menghubungkan sebuah multiplexor yang dipilih 
    --**** antara alu result dan program counter. Program counter yang
    --**** disimpan ketika terdapat sebuah instruksi JAL.
    --**************************************************************************
    mux1 : work.bus_mux_16
        PORT MAP(alu_result, idex_pc, jal_control, temp_result);

    --**************************************************************************
    --**** Execution / Memory IO Pipeline Register
    --**** PORT MAP ini menunjukkan hubungan dari EXMEM pipeline register 
    --**** didalam stage three dari pipeline.
    --**************************************************************************
    exmempipeline : work.exmem
        PORT MAP(idex_pc, temp_result, regB, clk, idexwb, exmem_pc, 
                 exmem_result, exmem_read, exmem_wb);
   
END ARCHITECTURE structural_stage3;
