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 cpucont
--**
--** Deskripsi: Struktur ini menggambarkan Control Unit termasuk
--**            control unit pipeline registers.  
--******************************************************************************
ENTITY cpucont IS
    PORT(opcode                             : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
         func                               : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
         zero, clk,idexflush                : IN STD_LOGIC;
         pcSelect,regSelect,ex_select       : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
         idexmemwe,memstage,wbSel           : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
         buSelect,ie,reti,ifid_flush        : OUT STD_LOGIC;
         alu_select,jal_control,exmem       : OUT STD_LOGIC;
         memwbc                             : OUT STD_LOGIC;
         alu_function                       : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
         wbc, exmemcrw                      : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END ENTITY cpucont;

ARCHITECTURE structural_cpucont OF cpucont IS
    
    --Menentukan isyarat yang dibutuhkan
    SIGNAL temp_oen, temp_aluSel, temp_jal  : STD_LOGIC;
    SIGNAL temp_exmemid                     : STD_LOGIC;
    SIGNAL temp_exstageSel,temp_memstagewe  : STD_LOGIC_VECTOR(1 DOWNTO 0);
    SIGNAL temp_idexmemwe                   : STD_LOGIC_VECTOR(1 DOWNTO 0);
    SIGNAL temp_aluOp                       : STD_LOGIC_VECTOR(3 DOWNTO 0);
    SIGNAL temp_wbc, temp_wbStage           : STD_LOGIC_VECTOR(2 DOWNTO 0);
    SIGNAL temp_exmemcrw                    : STD_LOGIC_VECTOR(2 DOWNTO 0);

    --**************************************************************************
    --**** Ini dimana deskripsi struktur dari cpucontrol dimulai.
    --**** ini menggambarkan control unit, idex,exmem,memwb control
    --**** registers.
    --**************************************************************************
    BEGIN
    
    --**************************************************************************
    --**** Control Unit
    --**** PORT MAP ini menunjukkan hubungan darie control unit dalam hubungannya
    --**** control component lainnya.
    --**************************************************************************
    control : work.control
        PORT MAP(opcode, func, zero, temp_oen, pcSelect, buSelect, temp_wbStage, 
                 temp_aluSel, ie, temp_exstageSel, temp_aluOp, regSelect, 
                 ifid_flush, temp_memstagewe,reti, temp_jal);
                 
    --**************************************************************************
    --**** IDEX Control Register
    --**** PORT MAP ini menunjukkan hubungan antara IDEX control register
    --**** dan hasil dari control unit.
    --**************************************************************************             
    idexcontrol : work.idex_c
        PORT MAP(idexflush,clk,temp_oen, temp_wbStage, temp_aluSel, 
                 temp_exstageSel, temp_aluOp,temp_memstagewe, temp_jal, 
                 temp_exmemid, temp_wbc, alu_select, alu_function, ex_select, 
                 temp_idexmemwe, jal_control);
    
    --**************************************************************************
    --**** EXMEM Control Register
    --**** PORT MAP ini menunjukkan hubungan antara EXMEM control 
    --**** register dan the rest of the control units.
    --**************************************************************************
    exmemcontrol: work.exmem_c
        PORT MAP(clk, temp_wbc, temp_exmemid, temp_idexmemwe, temp_exmemcrw, 
                 exmem, memstage);

    --**************************************************************************
    --**** MEMWB Control Register
    --**** PORT MAP ini menunjukkan hubungan antara MEMWB control 
    --**** register dan the rest of the control units.
    --**************************************************************************
    memwbcontrol : work.memwb_c
        PORT MAP(clk, temp_exmemcrw,wbSel, memwbc);

    --**************************************************************************
    --**** OUTPUTS
    --**** PORT MAPS dibawah ini digunakan untuk mengubah beberapa dari isyarat ke
    --**** output.
    --**************************************************************************
    select5 : work.through3
        PORT MAP(temp_wbc, wbc);

    select2 : work.through2
        PORT MAP(temp_idexmemwe, idexmemwe);
    
    select4 : work.through3
        PORT MAP(temp_exmemcrw, exmemcrw);

END ARCHITECTURE structural_cpucont;
