Name      Adder;
Partno    CA0016;
Date      10/08/85;
Rev       01;
Designer  Woolhiser;
Company   Assisted Technology;
Assembly  None;
Location  None;
Device    G16V8;

/****************************************************************/
/*                                                              */
/* Four bit adder using the CUPL function statement.            */
/*                                                              */
/* 4-bit asynchronous adder implemented as a ripple-carry       */
/* through four adder-slice circuits.  Each adder-slice         */
/* takes a pair of 1-bit numbers (Xi, Yi) and the carry from    */
/* a previous slice (Cin) and produces their 1-bit sum (Zi)     */
/* and carry (Cout).  Each adder-slice circuit is defined       */
/* using the CUPL function adder_slice(), which returns         */
/* the product directly and the carry as Cout.                  */
/****************************************************************/

/** Inputs **/

Pin [1..4] = [X1..4];           /* First 4-bit number   */
Pin [5..8] = [Y1..4];           /* Second 4-bit number  */

/** Outputs **/

Pin [12..15] = [Z1..4];         /* 4-bit sum                    */
Pin [16..18] = [C1..3];         /* Intermediate carry vaules    */
Pin 19 = Carry;                 /* Carry for 4-bit sum          */

/* Adder-slice circuit - add 2, 1-bit, numbers with carry */

function adder_slice(X, Y, Cin, Cout) {
        Cout    = Cin & X               /* Compute carry */
                # Cin & Y
                # X & Y;
        adder_slice = Cin $ (X $ Y);    /* Compute sum */
}

/* Perform 4, 1-bit, additions and keep the final carry */

Z1 = adder_slice(X1, Y1, 'h'0, C1);     /* Initial carry = 'h'0         */
Z2 = adder_slice(X2, Y2,   C1, C2);
Z3 = adder_slice(X3, Y3,   C2, C3);
Z4 = adder_slice(X4, Y4,   C3, Carry);  /* Get final carry value        */