module full_adder(
input a, b, cin,
output sum, cout
);
assign sum = a ^ b ^ cin;
assign cout = (a & b) | (b & cin) | (a & cin);
endmodule
module adder4(
input [3:0] x, y,
input cin,
output [3:0] sum,
output cout
);
wire c1, c2, c3;
full_adder u0(x[0], y[0], cin, sum[0], c1);
full_adder u1(x[1], y[1], c1, sum[1], c2);
full_adder u2(x[2], y[2], c2, sum[2], c3);
full_adder u3(x[3], y[3], c3, sum[3], cout);
endmodule
module sub4_2c(
input [3:0] a, b,
output [3:0] diff,
output bout
);
wire [3:0] nb = ~b;
wire cout;
adder4 u5 (a, nb, 1'b1, diff, cout);
assign bout = ~cout;
endmodule