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 STAGE1
--**
--** Deskripsi: Struktur entity ini menguraikan Instruction Fetch stage
--** dari pipeline.
--******************************************************************************
ENTITY stage1 IS
    PORT(BU_PC, ReadOne, Intret, Instruction: IN STD_LOGIC_VECTOR(15 DOWNTO 0);
         PC_enable, IFID_flush, IFID_enable : IN STD_LOGIC; 
         clk                                : IN STD_LOGIC;
         OPC                                : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
         PC_INCREMENT, InstructionOut       : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
         pcValue                            : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)     
    );
END ENTITY stage1;


ARCHITECTURE structural_stage1 OF stage1 IS

    --Menentukan isyarat yang dibutuhkan
    
    --********** 16-bit temporary signals diperlukan **********
    SIGNAL program_counter, inc_pc          : STD_LOGIC_VECTOR(15 DOWNTO 0); 
    SIGNAL temp_newpc                       : STD_LOGIC_VECTOR(15 DOWNTO 0);
    
    --********** 1-bit temporary signals diperlukan ***********
    SIGNAL pbenable_bit                     : STD_LOGIC;
    SIGNAL miss_bit                         : STD_LOGIC;

    --**************************************************************************
    --**** ini dimana struktur dari Stage One dimulai. Stage
    --**** one dibuat dengan ENTITY dibawah ini.
    --**** ENTITIES:
    --****          pcselector, programcounter, incrementpc and ifid.
    --**************************************************************************
    BEGIN
    
    --**************************************************************************
    --**** PCSelector 
    --**** PORT MAP ini menunjukkan hubungan antara PCSelector dan the
    --**** rest of Stage One.
    --**************************************************************************
    pcselect : work.pcselector
        PORT MAP(inc_pc, BU_PC, ReadOne, Intret, OPC, temp_newpc);
    
    
    --**************************************************************************
    --**** Program Counter
    --**** PORT MAP ini menunjukkan bagaimana program counter dihubungkan ke the rest
    --**** of Stage One.
    --**************************************************************************
    programcounter : work.progc
        PORT MAP(temp_newpc, clk, PC_enable, program_counter);
    
    
    --**************************************************************************
    --**** Increment Program Counter
    --**** PORT MAP ini menunjukkan bagaimana increment program counter dihubungkan ke
    --**** the rest of Stage One.
    --**************************************************************************
    pluspc : work.incpc
        PORT MAP(program_counter, inc_pc);
    
    --**************************************************************************
    --**** Instruction Fetch / Instruction Decode Pipeline Register
    --**** PORT MAP ini menunjukkan bagaimana IFID pipeline register dihubungkan ke 
    --**** the rest of Stage One.
    --**************************************************************************
    ifidpipe : work.IFID
        PORT MAP(inc_pc, Instruction, clk, IFID_flush, IFID_enable, 
                 PC_INCREMENT, InstructionOut);

    --**************************************************************************
    --**** Ouputs
    --**** PORT MAP dibawah ini digunakan untuk keluaran temporary signal.
    --**************************************************************************
    select5 : work.through
        PORT MAP(program_counter, pcValue);

END ARCHITECTURE structural_stage1;
