module adder_demo(
a,b,cin,co,so
);
input [3:0]a;
input [3:0]b;
input cin;
output co;
output [3:0]so;
wire [3:0]G,P;
wire [3:0]C;
assign G[0]=a[0]&b[0];
assign P[0]=a[0]|b[0];
assign C[0]=cin;
assign so[0]=G[0]^P[0]^C[0];
assign G[1] = a[1] & b[1];
assign P[1] = a[1] | b[1];
assign C[1] = G[0] |(P[0] & cin);
assign so[1] = G[1] ^ P[1] ^ C[1];
assign G[2] = a[2] & b[2];
assign P[2] = a[2] | b[2];
assign C[2] = G[1] |(P[1] & C[1]);
assign so[2] = G[2] ^ P[2] ^ C[2];
assign G[3] = a[3] & b[3];
assign P[3] = a[3] | b[3];
assign C[3] = G[2] |(P[2] & C[2]);
assign so[3] = G[3] ^ P[3] ^ C[3];
assign co = G[3] |(P[3] & C[3]);
Endmodule