PACKAGE alu_pkg IS TYPE bit_16_array IS array (integer range <>) of bit_vector(31 DOWNTO 0); TYPE bit_4_array IS array (integer range <>) of bit_vector(3 DOWNTO 0); TYPE integer_array IS array (integer range <>) of integer; TYPE bit_8 IS ARRAY (integer range <>) OF bit_vector(7 DOWNTO 0); PROCEDURE sub(r : IN bit_vector(3 DOWNTO 0); s : IN bit_vector(3 DOWNTO 0); sum : OUT bit_vector(3 DOWNTO 0); v : OUT bit ); PROCEDURE add (r : IN bit_vector(3 DOWNTO 0); s : IN bit_vector(3 DOWNTO 0); cin : IN bit; sum : OUT bit_vector(3 DOWNTO 0); v : OUT bit ); END alu_pkg; PACKAGE BODY alu_pkg IS PROCEDURE sub(r : IN bit_vector(3 DOWNTO 0); s : IN bit_vector(3 DOWNTO 0); sum : OUT bit_vector(3 DOWNTO 0); v : OUT bit ) IS VARIABLE carry : bit; VARIABLE carry2 : bit; VARIABLE carry3 : bit; VARIABLE bv : bit_vector(3 DOWNTO 0); BEGIN carry := '1'; bv := NOT BIT_VECTOR(s); FOR i IN 0 to 3 LOOP sum(i) := r(i) XOR bv(i) XOR carry; carry := (r(i) AND bv(i)) OR (r(i) AND carry) OR (carry AND bv(i)); IF (i = 2) THEN carry2 := carry; END IF; IF (i = 3) THEN carry3 := carry; END IF; END LOOP; -- i v := carry2 XOR carry3; END sub; PROCEDURE add (r : IN bit_vector(3 DOWNTO 0); s : IN bit_vector(3 DOWNTO 0); cin : IN bit; sum : OUT bit_vector(3 DOWNTO 0); v : OUT bit ) IS VARIABLE carry : bit; VARIABLE carry2 : bit; VARIABLE carry3 : bit; BEGIN carry := cin; FOR i IN 0 to 3 LOOP sum(i) := r(i) XOR s(i) XOR carry; carry := (r(i) AND s(i)) OR (r(i) AND carry) OR (carry AND r(i)); IF (i = 2) THEN carry2 := carry; ELSIF (i = 3) THEN carry3 := carry; END IF; END LOOP; -- i v := carry2 XOR carry3; END add; END alu_pkg;