`timescale 1ns/1ns
module add_4(
input [3:0] A ,
input [3:0] B ,
input Ci ,
output wire [3:0] S ,
output wire Co
);
wire [4:1] C;
assign Co = C[4];
add_full u0
(
.A (A[0]),
.B (B[0]),
.Ci (Ci),
.S (S[0]),
.Co (C[1])
);
add_full u1
(
.A (A[1]),
.B (B[1]),
.Ci (C[1]),
.S (S[1]),
.Co (C[2])
);
add_full u2
(
.A (A[2]),
.B (B[2]),
.Ci (C[2]),
.S (S[2]),
.Co (C[3])
);
add_full u3
(
.A (A[3]),
.B (B[3]),
.Ci (C[3]),
.S (S[3]),
.Co (C[4])
);
endmodule
module add_half(
input A ,
input B ,
output wire S ,
output wire C
);
assign S = A ^ B;
assign C = A & B;
endmodule
module add_full(
input A ,
input B ,
input Ci ,
output wire S ,
output wire Co
);
wire c_1;
wire c_2;
wire sum_1;
add_half add_half_1(
.A (A),
.B (B),
.S (sum_1),
.C (c_1)
);
add_half add_half_2(
.A (sum_1),
.B (Ci),
.S (S),
.C (c_2)
);
assign Co = c_1 | c_2;
endmodule