blob: 970e6d401e2a585d2097734f4d5e3b0cbcd0b4d1 [file] [log] [blame] [edit]
module BigCircle(output G, P, input Gi, Pi, GiPrev, PiPrev);
wire e;
and #(1) (e, Pi, GiPrev);
or #(1) (G, e, Gi);
and #(1) (P, Pi, PiPrev);
endmodule
module SmallCircle(output Ci, input Gi);
buf #(1) (Ci, Gi);
endmodule
module Square(output G, P, input Ai, Bi);
and #(1) (G, Ai, Bi);
xor #(2) (P, Ai, Bi);
endmodule
module Triangle(output Si, input Pi, CiPrev);
xor #(2) (Si, Pi, CiPrev);
endmodule
module KSA8(output [7:0] sum, output cout, input [7:0] a, b);
wire cin = 1'b0;
wire [7:0] c;
wire [7:0] g, p;
Square sq[7:0](g, p, a, b);
// first line of circles
wire [7:1] g2, p2;
SmallCircle sc0_0(c[0], g[0]);
BigCircle bc0[7:1](g2[7:1], p2[7:1], g[7:1], p[7:1], g[6:0], p[6:0]);
// second line of circle
wire [7:3] g3, p3;
SmallCircle sc1[2:1](c[2:1], g2[2:1]);
BigCircle bc1[7:3](g3[7:3], p3[7:3], g2[7:3], p2[7:3], g2[5:1], p2[5:1]);
// third line of circle
wire [7:7] g4, p4;
SmallCircle sc2[6:3](c[6:3], g3[6:3]);
BigCircle bc2_7(g4[7], p4[7], g3[7], p3[7], g3[3], p3[3]);
// fourth line of circle
SmallCircle sc3_7(c[7], g4[7]);
// last line - triangles
Triangle tr0(sum[0], p[0], cin);
Triangle tr[7:1](sum[7:1], p[7:1], c[6:0]);
// generate cout
buf #(1) (cout, c[7]);
endmodule
module KSA16(output [15:0] sum, output cout, input [15:0] a, b);
wire cin = 1'b0;
wire [15:0] c;
wire [15:0] g, p;
Square sq[15:0](g, p, a, b);
// first line of circles
wire [15:1] g2, p2;
SmallCircle sc0_0(c[0], g[0]);
BigCircle bc0[15:1](g2[15:1], p2[15:1], g[15:1], p[15:1], g[14:0], p[14:0]);
// second line of circle
wire [15:3] g3, p3;
SmallCircle sc1[2:1](c[2:1], g2[2:1]);
BigCircle bc1[15:3](g3[15:3], p3[15:3], g2[15:3], p2[15:3], g2[13:1], p2[13:1]);
// third line of circle
wire [15:7] g4, p4;
SmallCircle sc2[6:3](c[6:3], g3[6:3]);
BigCircle bc2[15:7](g4[15:7], p4[15:7], g3[15:7], p3[15:7], g3[11:3], p3[11:3]);
// fourth line of circle
wire [15:15] g5, p5;
SmallCircle sc3[14:7](c[14:7], g4[14:7]);
BigCircle bc3_15(g5[15], p5[15], g4[15], p4[15], g4[7], p4[7]);
// fifth line of circle
SmallCircle sc4_15(c[15], g5[15]);
// last line - triangles
Triangle tr0(sum[0], p[0], cin);
Triangle tr[15:1](sum[15:1], p[15:1], c[14:0]);
// generate cout
buf #(1) (cout, c[15]);
endmodule
module KSA32(output [31:0] sum, output cout, input [31:0] a, b);
wire cin = 1'b0;
wire [31:0] c;
wire [31:0] g, p;
Square sq[31:0](g, p, a, b);
// first line of circles
wire [31:1] g2, p2;
SmallCircle sc0_0(c[0], g[0]);
BigCircle bc0[31:1](g2[31:1], p2[31:1], g[31:1], p[31:1], g[30:0], p[30:0]);
// second line of circles
wire [31:3] g3, p3;
SmallCircle sc1[2:1](c[2:1], g2[2:1]);
BigCircle bc1[31:3](g3[31:3], p3[31:3], g2[31:3], p2[31:3], g2[29:1], p2[29:1]);
// third line of circles
wire [31:7] g4, p4;
SmallCircle sc2[6:3](c[6:3], g3[6:3]);
BigCircle bc2[31:7](g4[31:7], p4[31:7], g3[31:7], p3[31:7], g3[27:3], p3[27:3]);
// fourth line of circles
wire [31:15] g5, p5;
SmallCircle sc3[14:7](c[14:7], g4[14:7]);
BigCircle bc3[31:15](g5[31:15], p5[31:15], g4[31:15], p4[31:15], g4[23:7], p4[23:7]);
// fifth line of circles
wire [31:31] g6, p6;
SmallCircle sc4[30:15](c[30:15], g5[30:15]);
BigCircle bc4_31(g6[31], p6[31], g5[31], p5[31], g5[15], p5[15]);
// sixth line of circles
SmallCircle sc5_31(c[31], g6[31]);
// last line - triangless
Triangle tr0(sum[0], p[0], cin);
Triangle tr[31:1](sum[31:1], p[31:1], c[30:0]);
// generate cout
buf #(1) (cout, c[31]);
endmodule
module KSA64(output [63:0] sum, output cout, input [63:0] a, b);
wire cin = 1'b0;
wire [63:0] c;
wire [63:0] g, p;
Square sq[63:0](g, p, a, b);
// first line of circles
wire [63:1] g2, p2;
SmallCircle sc0_0(c[0], g[0]);
BigCircle bc0[63:1](g2[63:1], p2[63:1], g[63:1], p[63:1], g[62:0], p[62:0]);
// second line of circles
wire [63:3] g3, p3;
SmallCircle sc1[2:1](c[2:1], g2[2:1]);
BigCircle bc1[63:3](g3[63:3], p3[63:3], g2[63:3], p2[63:3], g2[61:1], p2[61:1]);
// third line of circles
wire [63:7] g4, p4;
SmallCircle sc2[6:3](c[6:3], g3[6:3]);
BigCircle bc2[63:7](g4[63:7], p4[63:7], g3[63:7], p3[63:7], g3[59:3], p3[59:3]);
// fourth line of circles
wire [63:15] g5, p5;
SmallCircle sc3[14:7](c[14:7], g4[14:7]);
BigCircle bc3[63:15](g5[63:15], p5[63:15], g4[63:15], p4[63:15], g4[55:7], p4[55:7]);
// fifth line of circles
wire [63:31] g6, p6;
SmallCircle sc4[30:15](c[30:15], g5[30:15]);
BigCircle bc4[63:31](g6[63:31], p6[63:31], g5[63:31], p5[63:31], g5[47:15], p5[47:15]);
// sixth line of circles
wire [63:63] g7, p7;
SmallCircle sc5[62:31](c[62:31], g6[62:31]);
BigCircle bc4_63(g7[63], p7[63], g6[63], p6[63], g6[31], p6[31]);
// seventh line of circles
SmallCircle sc6(c[63], g7[63]);
// last line - triangles
Triangle tr0(sum[0], p[0], cin);
Triangle tr[63:1](sum[63:1], p[63:1], c[62:0]);
// generate cout
buf #(1) (cout, c[63]);
endmodule