`timescale 1ns/1ns

module lca_4(
input [3:0]          A_in  ,
input         [3:0]          B_in  ,
        input                                 C_1   ,
 
  output wire CO    ,
output       wire [3:0] S
);
    wire    [3:0]     G;
    wire    [3:0]     P;
    wire    [3:0]     C;
    genvar i;
    generate
    for(i = 0; i < 4; i = i + 1) begin
        assign G[i] = A_in[i] & B_in[i];
        assign P[i] = A_in[i] ^ B_in[i];
        assign C[i] = (i == 0) ? (G[i] | (P[i] & C_1)) : (G[i] | (P[i] & C[i-1])); 
        assign S[i] = (i == 0) ? (P[i] ^ C_1) : (P[i] ^ C[i-1]);
    end
    endgenerate
    
    assign CO = C[3];
endmodule