PACKAGE am2900_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 add_sub (sub : IN bit;
                     r : IN bit_vector(3 DOWNTO 0);
                     s : IN bit_vector(3 DOWNTO 0);
                     cn : IN bit;
                     f : OUT bit_vector(3 DOWNTO 0);
                     status : OUT bit_vector(3 DOWNTO 0)
                     );
END am2900_pkg;

PACKAGE BODY am2900_pkg IS
  PROCEDURE add_sub(sub : IN bit;
                     r : IN bit_vector(3 DOWNTO 0);
                     s : IN bit_vector(3 DOWNTO 0);
                     cn : IN bit;
                     f : OUT bit_vector(3 DOWNTO 0);
                     status : OUT bit_vector(3 DOWNTO 0)
                     ) IS
    VARIABLE carry_s : bit_vector(3 DOWNTO 0) := "0000";
    VARIABLE carry_a : bit_vector(3 DOWNTO 0) := "0000";    
    VARIABLE int_sub : bit_vector(3 DOWNTO 0) := "0000";
    VARIABLE final : bit_vector(3 DOWNTO 0) := "0000";
    
    BEGIN
      
-------------------------------------------------------------------------------
--  if subtraction, take twos compliment
-------------------------------------------------------------------------------
      IF (sub = '1') THEN
        int_sub(0) := '1' XOR s(0) XOR '1';
        carry_s(0) := ('1' AND s(0)) OR ('1' AND s(0));
        int_sub(1) := sub XOR s(1) XOR carry_s(0);
        carry_s(1) := ('1' AND s(1)) OR ('1' AND carry_s(0)) OR (carry_s(0)
                      AND s(1));
        int_sub(2) := sub XOR s(2) XOR carry_s(1);
        carry_s(2) := ('1' AND s(2)) OR ('1' AND carry_s(1)) OR (carry_s(1)
                      AND s(2));
        int_sub(3) := sub XOR s(3) XOR carry_s(2);
      ELSE
        int_sub := s;
      END IF;
-------------------------------------------------------------------------------
--  now add the two numbers 
-------------------------------------------------------------------------------

      final(0) := int_sub(0) XOR r(0) XOR cn;
      carry_a(0) := (int_sub(0) AND r(0)) OR
                    (int_sub(0) AND cn) OR
                    (cn AND r(0));
      final(1) := int_sub(1) XOR r(1) XOR carry_a(0);
      carry_a(1) := (int_sub(1) AND r(1)) OR
                    (int_sub(1) AND carry_a(0)) OR
                    (carry_a(0) AND r(1));
      final(2) := int_sub(2) XOR r(2) XOR carry_a(1);
      carry_a(2) := (int_sub(2) AND r(2)) OR
                    (int_sub(2) AND carry_a(1)) OR
                    (carry_a(1) AND r(2));
      final(3) := int_sub(3) XOR r(3) XOR carry_a(2);
      carry_a(3) := (int_sub(3) AND r(3)) OR
                    (int_sub(3) AND carry_a(2)) OR
                    (carry_a(2) AND r(3));
      IF (final = "0000") THEN
        status(2) := '0';
      END IF;
      status(0) := final(3);
      status(1) := carry_a(3);
      status(3) := carry_a(3) XOR carry_a(2);
      f := final;
    END add_sub;
    
END am2900_pkg;

<div align="center"><br /><script type="text/javascript"><!--
google_ad_client = "pub-7293844627074885";
//468x60, Created at 07. 11. 25
google_ad_slot = "8619794253";
google_ad_width = 468;
google_ad_height = 60;
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />&nbsp;</div>