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;

<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>