--- /dev/null
+module half_add(a, b, s, c);
+ input a, b;
+ output s, c;
+ assign s = a ^ b;
+ assign c = a & b;
+endmodule /* half_add */
+
+module add(a, b, ci, o, co);
+ input a, b, ci;
+ output o, co;
+ wire c1, c2, x;
+ half_add h1(a, b, x, c1);
+ half_add h2(x, ci, o, c2);
+ assign co = c1 | c2;
+endmodule /* add */
+
+module main(a, b, ci, out);
+
+ input [7:0] a;
+ input [7:0] b;
+ input ci;
+ output [8:0] out;
+ wire [7:0] c;
+
+ add a1(a[0], b[0], ci, out[0], c[0]);
+ add a2(a[1], b[1], c[0], out[1], c[1]);
+ add a3(a[2], b[2], c[1], out[2], c[2]);
+ add a4(a[3], b[3], c[2], out[3], c[3]);
+ add a5(a[4], b[4], c[3], out[4], c[4]);
+ add a6(a[5], b[5], c[4], out[5], c[5]);
+ add a7(a[6], b[6], c[5], out[6], c[6]);
+ add a8(a[7], b[7], c[6], out[7], out[8]);
+
+endmodule /* main */
+