library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- Scaler
-- This entity scales the 'data_in' input by the factor 'factor'.

entity scaler is
    generic (
        DATA_WIDTH      : integer := 12;
        FACTOR_WIDTH    : integer := 4;
        PIPELINE_STAGES : integer := 1
    );
    port (
        clk         : in std_logic;  
        data_in     : in std_logic_vector(DATA_WIDTH-1 downto 0);
        factor      : in std_logic_vector(FACTOR_WIDTH-1 downto 0);
        data_out    : out std_logic_vector(DATA_WIDTH+FACTOR_WIDTH-1 downto 0)
    );
end entity;

architecture arch of scaler is
    
    --*****COMPONENT DECLARATION*****
    component mult is
        generic (
            A_WIDTH         : integer := 12;
            B_WIDTH         : integer := 4;
            PIPELINE_STAGES : integer := 1;
            UNSIGNED        : boolean := true
        );
        port (
            clk : in std_logic;  
            A   : in std_logic_vector(A_WIDTH-1 downto 0);
            B   : in std_logic_vector(B_WIDTH-1 downto 0);
            P   : out std_logic_vector(A_WIDTH+B_WIDTH-1 downto 0)
        );
    end component;
    
begin

    mult_inst : mult
        generic map(
            A_WIDTH         => DATA_WIDTH,
            B_WIDTH         => FACTOR_WIDTH,
            PIPELINE_STAGES => PIPELINE_STAGES,
            UNSIGNED        => true
        )
        port map(
            clk => clk,
            A   => data_in,
            B   => factor,
            P   => data_out
        );

end architecture;