-- Patrick Wagstrom
-- CS471 - 001
-- Lab 10: n-Bit ALU without overflow

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY alu1 IS
	PORT ( a, b: IN STD_LOGIC;
		zero_in, carry_in, less: IN STD_LOGIC;
		control: IN STD_LOGIC_VECTOR (2 DOWNTO 0);
		zero_out, result, carry_out: OUT STD_LOGIC);
END alu1;
ARCHITECTURE dataflow OF alu1 IS
	SIGNAL b_tmp, result_tmp, carry_tmp: STD_LOGIC;
	SIGNAL sel_tmp: STD_LOGIC_VECTOR (1 DOWNTO 0);
BEGIN
	WITH control(2) SELECT
		b_tmp <= NOT b WHEN '1', 
			b WHEN OTHERS;
	
	sel_tmp <= control(1) & control(0);

	WITH sel_tmp SELECT
	result_tmp <= (a AND b_tmp) WHEN "00", 
			(a OR b_tmp) WHEN "01",
			(a XOR b_tmp) XOR carry_in WHEN "10",
			less WHEN OTHERS;

	carry_tmp <= ((a AND carry_in) OR (a AND b_tmp) OR (b_tmp AND carry_in));

	carry_out <= carry_tmp;
	zero_out <= zero_in OR result_tmp;
	result <= result_tmp;
END dataflow;