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 STAGE45
--**
--** Deskripsi: Struktur entity ini menguraikan Memory/IO dan Write
--** Back stages dari pipeline. 
--******************************************************************************
ENTITY stage45 IS
    port(Input, Read, Result                : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
         wbReg                              : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
         memSel                             : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
         clk, output_enable                 : IN STD_LOGIC;
         OutputPort, RF_WriteData           : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
         RF_WriteBackReg                    : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));         
END ENTITY stage45;

ARCHITECTURE structural_stage45 OF stage45 IS
    --******** 16-bit temporary signals diperlukan ********
    SIGNAL alu_result, read_result, input_result: STD_LOGIC_VECTOR(15 DOWNTO 0);
    
    --**************************************************************************
    --**** Ini dimana struktur dari Stage 4 dan Stage 5 dari 
    --**** pipeline dimulai. Ini dibuat dari entity dibawah ini:
    --**** ENTITIES:
    --****          output, memwb pipeline register and register file selector
    --**************************************************************************
    BEGIN
    
    --**************************************************************************
    --**** Output Port
    --**** PORT MAP ini menunjukkan hubungan dari Output Port ke the rest
    --**** of stage 4 dari pipeline.
    --**************************************************************************
    outputreg : work.outreg
        PORT MAP(Result, output_enable, clk, OutputPort);
    
    --**************************************************************************
    --**** MemoryIO / Write Back Pipeline Register
    --**** PORT MAP ini menunjukkan hubungan dari MEMWB pipeline register 
    --**** didalam stage 4 and 5 dari pipeline.
    --**************************************************************************
    memwbpipeline : work.memwb
        PORT MAP(Read, Result, Input, clk, wbReg, read_result, alu_result, 
                 input_result, RF_WriteBackReg);
                 
    --**************************************************************************
    --**** Result Selector
    --**** PORT MAP ini menunjukkan hubungan dari result selector.  
    --**** memilih nilai mana untuk ditulis kembali kedalam register file.
    --**************************************************************************
    result_select : work.rselector
        PORT MAP(read_result, alu_result, input_result, memSel, RF_WriteData);

END ARCHITECTURE structural_stage45;
