module add_cond4_64(a,b,cin,co,s);

input signed [63:0] a,b;
input signed cin;
output co;
output signed [63:0] s;

wire [63:0] ps;
wire [63:0] t, h6,h5,h4,h3,h2,h1,t5,t4,t3,t2,t1,s0,s1;
wire psb,cinb;
wire [63:0] g;
wire [63:0] ic0, ic1, psn, gn;

// partial sum

partialsum ixps (s[63:0], a[63:0], b[63:0]);

// 4-bit conditional sum computations

// 0-2 selected by Cin

not ins1_0(s1[0], ps[0]); 
nand ign0 (gn[0],a[0],b[0]);
nor  it0 (t[0],a[0],b[0]);

not  ixb1(psn[1], ps[1]);
xorb ins0_1(s0[1],psn[1],gn[0]);
xorb ins1_1(s1[1],psn[1],t[0]);
nand ign1 (gn[1],a[1],b[1]);
oai  inoais0_2 (ic0[2],gn[0],psn[1],gn[1]);
oai  inoais1_2 (ic1[2],t[0],psn[1],gn[1]);

xor ins0_2(s0[2],ps[2],ic0[2]);
xor ins1_2(s1[2],ps[2],ic1[2]);

//  conditional for 31-3 selected by H

cond4l ic41 (a[5:2],b[5:2],ps[6:3],s0[6:3],s1[6:3]);
cond4l ic42 (a[9:6],b[9:6],ps[10:7],s0[10:7],s1[10:7]);
cond4l ic43 (a[13:10],b[13:10],ps[14:11],s0[14:11],s1[14:11]);
cond4l ic44 (a[17:14],b[17:14],ps[18:15],s0[18:15],s1[18:15]);
cond4l ic45 (a[21:18],b[21:18],ps[22:19],s0[22:19],s1[22:19]);
cond4l ic46 (a[25:22],b[25:22],ps[26:23],s0[26:23],s1[26:23]);
cond4l ic47 (a[29:26],b[29:26],ps[30:27],s0[30:27],s1[30:27]);
cond4l ic48 (a[33:30],b[33:30],ps[34:31],s0[34:31],s1[34:31]);
cond4l ic49 (a[37:34],b[37:34],ps[38:35],s0[38:35],s1[38:35]);
cond4l ic410 (a[41:38],b[41:38],ps[42:39],s0[42:39],s1[42:39]);
cond4l ic411 (a[45:42],b[45:42],ps[46:43],s0[46:43],s1[46:43]);
cond4l ic412 (a[49:46],b[49:46],ps[50:47],s0[50:47],s1[50:47]);
cond4l ic413 (a[53:50],b[53:50],ps[54:51],s0[54:51],s1[54:51]);
cond4l ic414 (a[57:54],b[57:54],ps[58:55],s0[58:55],s1[58:55]);
cond4l ic415 (a[61:58],b[61:58],ps[62:59],s0[62:59],s1[62:59]);

nor it62 (t[62],a[62],b[62]);
not ixb63 (psn[63],ps[63]);
xorb ins1_63 (s1[63],psn[63],t[62]);


// 1st level H# and T#

h1 ih1i0(a[0],b[0],cin,cin,h1[0]);
h1 ih1i2(a[2],b[2],a[1],b[1],h1[2]);
h1 ih1i4(a[4],b[4],a[3],b[3],h1[4]);
h1 ih1i6(a[6],b[6],a[5],b[5],h1[6]);
h1 ih1i8(a[8],b[8],a[7],b[7],h1[8]);
h1 ih1i10(a[10],b[10],a[9],b[9],h1[10]);
h1 ih1i12(a[12],b[12],a[11],b[11],h1[12]);
h1 ih1i14(a[14],b[14],a[13],b[13],h1[14]);
h1 ih1i16(a[16],b[16],a[15],b[15],h1[16]);
h1 ih1i18(a[18],b[18],a[17],b[17],h1[18]);
h1 ih1i20(a[20],b[20],a[19],b[19],h1[20]);
h1 ih1i22(a[22],b[22],a[21],b[21],h1[22]);
h1 ih1i24(a[24],b[24],a[23],b[23],h1[24]);
h1 ih1i26(a[26],b[26],a[25],b[25],h1[26]);
h1 ih1i28(a[28],b[28],a[27],b[27],h1[28]);
h1 ih1i30(a[30],b[30],a[29],b[29],h1[30]);
h1 ih1i32(a[32],b[32],a[31],b[31],h1[32]);
h1 ih1i34(a[34],b[34],a[33],b[33],h1[34]);
h1 ih1i36(a[36],b[36],a[35],b[35],h1[36]);
h1 ih1i38(a[38],b[38],a[37],b[37],h1[38]);
h1 ih1i40(a[40],b[40],a[39],b[39],h1[40]);
h1 ih1i42(a[42],b[42],a[41],b[41],h1[42]);
h1 ih1i44(a[44],b[44],a[43],b[43],h1[44]);
h1 ih1i46(a[46],b[46],a[45],b[45],h1[46]);
h1 ih1i48(a[48],b[48],a[47],b[47],h1[48]);
h1 ih1i50(a[50],b[50],a[49],b[49],h1[50]);
h1 ih1i52(a[52],b[52],a[51],b[51],h1[52]);
h1 ih1i54(a[54],b[54],a[53],b[53],h1[54]);
h1 ih1i56(a[56],b[56],a[55],b[55],h1[56]);
h1 ih1i58(a[58],b[58],a[57],b[57],h1[58]);
h1 ih1i60(a[60],b[60],a[59],b[59],h1[60]);
h1 ih1i62(a[62],b[62],a[61],b[61],h1[62]);

t1 it1i1(a[1],b[1],a[0],b[0],t1[1]);
t1 it1i3(a[3],b[3],a[2],b[2],t1[3]);
t1 it1i5(a[5],b[5],a[4],b[4],t1[5]);
t1 it1i7(a[7],b[7],a[6],b[6],t1[7]);
t1 it1i9(a[9],b[9],a[8],b[8],t1[9]);
t1 it1i11(a[11],b[11],a[10],b[10],t1[11]);
t1 it1i13(a[13],b[13],a[12],b[12],t1[13]);
t1 it1i15(a[15],b[15],a[14],b[14],t1[15]);
t1 it1i17(a[17],b[17],a[16],b[16],t1[17]);
t1 it1i19(a[19],b[19],a[18],b[18],t1[19]);
t1 it1i21(a[21],b[21],a[20],b[20],t1[21]);
t1 it1i23(a[23],b[23],a[22],b[22],t1[23]);
t1 it1i25(a[25],b[25],a[24],b[24],t1[25]);
t1 it1i27(a[27],b[27],a[26],b[26],t1[27]);
t1 it1i29(a[29],b[29],a[28],b[28],t1[29]);
t1 it1i31(a[31],b[31],a[30],b[30],t1[31]);
t1 it1i33(a[33],b[33],a[32],b[32],t1[33]);
t1 it1i35(a[35],b[35],a[34],b[34],t1[35]);
t1 it1i37(a[37],b[37],a[36],b[36],t1[37]);
t1 it1i39(a[39],b[39],a[38],b[38],t1[39]);
t1 it1i41(a[41],b[41],a[40],b[40],t1[41]);
t1 it1i43(a[43],b[43],a[42],b[42],t1[43]);
t1 it1i45(a[45],b[45],a[44],b[44],t1[45]);
t1 it1i47(a[47],b[47],a[46],b[46],t1[47]);
t1 it1i49(a[49],b[49],a[48],b[48],t1[49]);
t1 it1i51(a[51],b[51],a[50],b[50],t1[51]);
t1 it1i53(a[53],b[53],a[52],b[52],t1[53]);
t1 it1i55(a[55],b[55],a[54],b[54],t1[55]);
t1 it1i57(a[57],b[57],a[56],b[56],t1[57]);
t1 it1i59(a[59],b[59],a[58],b[58],t1[59]);


// 2nd level H and T

oai ih2i2(h2[2],h1[0],t1[1],h1[2]);
oai ih2i6(h2[6],h1[4],t1[5],h1[6]);
oai ih2i10(h2[10],h1[8],t1[9],h1[10]);
oai ih2i14(h2[14],h1[12],t1[13],h1[14]);
oai ih2i18(h2[18],h1[16],t1[17],h1[18]);
oai ih2i22(h2[22],h1[20],t1[21],h1[22]);
oai ih2i26(h2[26],h1[24],t1[25],h1[26]);
oai ih2i30(h2[30],h1[28],t1[29],h1[30]);
oai ih2i34(h2[34],h1[32],t1[33],h1[34]);
oai ih2i38(h2[38],h1[36],t1[37],h1[38]);
oai ih2i42(h2[42],h1[40],t1[41],h1[42]);
oai ih2i46(h2[46],h1[44],t1[45],h1[46]);
oai ih2i50(h2[50],h1[48],t1[49],h1[50]);
oai ih2i54(h2[54],h1[52],t1[53],h1[54]);
oai ih2i58(h2[58],h1[56],t1[57],h1[58]);
oai ih2i62(h2[62],h1[60],t1[61],h1[62]);

nor it2i5(t2[5],t1[3],t1[5]);
nor it2i9(t2[9],t1[7],t1[9]);
nor it2i13(t2[13],t1[11],t1[13]);
nor it2i17(t2[17],t1[15],t1[17]);
nor it2i21(t2[21],t1[19],t1[21]);
nor it2i25(t2[25],t1[23],t1[25]);
nor it2i29(t2[29],t1[27],t1[29]);
nor it2i33(t2[33],t1[31],t1[33]);
nor it2i37(t2[37],t1[35],t1[37]);
nor it2i41(t2[41],t1[39],t1[41]);
nor it2i45(t2[45],t1[43],t1[45]);
nor it2i49(t2[49],t1[47],t1[49]);
nor it2i53(t2[53],t1[51],t1[53]);
nor it2i57(t2[57],t1[55],t1[57]);
nor it2i61(t2[61],t1[59],t1[61]);

// Level 3 H# and T#

not ih3i2(h3[2],h2[2]);
aoi ih3i6(h3[6],h2[2],t2[5],h2[6]);
aoi ih3i10(h3[10],h2[6],t2[9],h2[10]);
aoi ih3i14(h3[14],h2[10],t2[13],h2[14]);
aoi ih3i18(h3[18],h2[14],t2[17],h2[18]);
aoi ih3i22(h3[22],h2[18],t2[21],h2[22]);
aoi ih3i26(h3[26],h2[22],t2[25],h2[26]);
aoi ih3i30(h3[30],h2[26],t2[29],h2[30]);
aoi ih3i34(h3[34],h2[30],t2[33],h2[34]);
aoi ih3i38(h3[38],h2[34],t2[37],h2[38]);
aoi ih3i42(h3[42],h2[38],t2[41],h2[42]);
aoi ih3i46(h3[46],h2[42],t2[45],h2[46]);
aoi ih3i50(h3[50],h2[46],t2[49],h2[50]);
aoi ih3i54(h3[54],h2[50],t2[53],h2[54]);
aoi ih3i58(h3[58],h2[54],t2[57],h2[58]);
aoi ih3i62(h3[62],h2[58],t2[61],h2[62]);

nand it3i9(t3[9],t2[5],t2[9]);
nand it3i13(t3[13],t2[9],t2[13]);
nand it3i17(t3[17],t2[13],t2[17]);
nand it3i21(t3[21],t2[17],t2[21]);
nand it3i25(t3[25],t2[21],t2[25]);
nand it3i29(t3[29],t2[25],t2[29]);
nand it3i33(t3[33],t2[29],t2[33]);
nand it3i37(t3[37],t2[33],t2[37]);
nand it3i41(t3[41],t2[37],t2[41]);
nand it3i45(t3[45],t2[41],t2[45]);
nand it3i49(t3[49],t2[45],t2[49]);
nand it3i53(t3[53],t2[49],t2[53]);
nand it3i57(t3[57],t2[53],t2[57]);
nand it3i61(t3[61],t2[57],t2[61]);

// Level 4 H and T

not ih4i2(h4[2],h3[2]);
not ih4i6(h4[6],h3[6]);
oai ih4i10(h4[10],h3[2],t3[9],h3[10]);
oai ih4i14(h4[14],h3[6],t3[13],h3[14]);
oai ih4i18(h4[18],h3[10],t3[17],h3[18]);
oai ih4i22(h4[22],h3[14],t3[21],h3[22]);
oai ih4i26(h4[26],h3[18],t3[25],h3[26]);
oai ih4i30(h4[30],h3[22],t3[29],h3[30]);
oai ih4i34(h4[34],h3[26],t3[33],h3[34]);
oai ih4i38(h4[38],h3[30],t3[37],h3[38]);
oai ih4i42(h4[42],h3[34],t3[41],h3[42]);
oai ih4i46(h4[46],h3[38],t3[45],h3[46]);
oai ih4i50(h4[50],h3[42],t3[49],h3[50]);
oai ih4i54(h4[54],h3[46],t3[53],h3[54]);
oai ih4i58(h4[58],h3[50],t3[57],h3[58]);
oai ih4i62(h4[62],h3[54],t3[61],h3[62]);

nor it4i17(t4[17],t3[9],t3[17]);
nor it4i21(t4[21],t3[13],t3[21]);
nor it4i25(t4[25],t3[17],t3[25]);
nor it4i29(t4[29],t3[21],t3[29]);
nor it4i33(t4[33],t3[25],t3[33]);
nor it4i37(t4[37],t3[29],t3[37]);
nor it4i41(t4[41],t3[33],t3[41]);
nor it4i45(t4[45],t3[37],t3[45]);
nor it4i49(t4[49],t3[41],t3[49]);
nor it4i53(t4[53],t3[45],t3[53]);
nor it4i57(t4[57],t3[59],t3[57]);
nor it4i61(t4[61],t3[53],t3[61]);

// Level 5 H# 

not ih5i2(h5[2],h4[2]);
not ih5i6(h5[6],h4[6]);
not ih5i10(h5[10],h4[10]);
not ih5i14(h5[14],h4[14]);
aoi ih5i18(h5[18],h4[2],t4[17],h4[18]);
aoi ih5i22(h5[22],h4[6],t4[21],h4[22]);
aoi ih5i26(h5[26],h4[10],t4[25],h4[26]);
aoi ih5i30(h5[30],h4[14],t4[29],h4[30]);
aoi ih5i34(h5[34],h4[18],t4[33],h4[34]);
aoi ih5i38(h5[38],h4[22],t4[37],h4[38]);
aoi ih5i42(h5[42],h4[26],t4[41],h4[42]);
aoi ih5i46(h5[46],h4[30],t4[45],h4[46]);
aoi ih5i50(h5[50],h4[34],t4[49],h4[50]);
aoi ih5i54(h5[54],h4[38],t4[53],h4[54]);
aoi ih5i58(h5[58],h4[42],t4[57],h4[58]);
aoi ih5i62(h5[62],h4[46],t4[61],h4[62]);

nand it5i33(t5[33],t4[17],t4[33]);
nand it5i37(t5[37],t4[21],t4[37]);
nand it5i41(t5[41],t4[25],t4[41]);
nand it5i45(t5[45],t4[29],t4[45]);
nand it5i49(t5[49],t4[33],t4[49]);
nand it5i53(t5[53],t4[37],t4[53]);
nand it5i57(t5[57],t4[41],t4[57]);
nand it5i61(t5[61],t4[45],t4[61]);

// Level 6 H 
not ih6i2(h6[2],h5[2]);
not ih6i6(h6[6],h5[6]);
not ih6i10(h6[10],h5[10]);
not ih6i14(h6[14],h5[14]);
not ih6i18(h6[18],h5[18]);
not ih6i22(h6[22],h5[22]);
not ih6i26(h6[26],h5[26]);
not ih6i30(h6[30],h5[30]);
oai ih6i34(h6[34],h5[2],t5[33],h5[34]);
oai ih6i38(h6[38],h5[6],t5[37],h5[38]);
oai ih6i42(h6[42],h5[10],t5[41],h5[42]);
oai ih6i46(h6[46],h5[14],t5[45],h5[46]);
oai ih6i50(h6[50],h5[18],t5[49],h5[50]);
oai ih6i54(h6[54],h5[22],t5[53],h5[54]);
oai ih6i58(h6[58],h5[26],t5[57],h5[58]);
oai ih6i62(h6[62],h5[30],t5[61],h5[62]);


// SUM SELECT
not ibbb0(psb,ps[0]);
not ibbb1(cinb,cin);
mux21 im0(s[0],psb,ps[0],cin);
mux21 im1(s[1],s1[1],s0[1],cin);
mux21 im2(s[2],s1[2],s0[2],cin);
mux21 im3(s[3],s1[3],ps[3],h6[2]);
mux21 im4(s[4],s1[4],s0[4],h6[2]);
mux21 im5(s[5],s1[5],s0[5],h6[2]);
mux21 im6(s[6],s1[6],s0[6],h6[2]);
mux21 im7(s[7],s1[7],ps[7],h6[6]);
mux21 im8(s[8],s1[8],s0[8],h6[6]);
mux21 im9(s[9],s1[9],s0[9],h6[6]);
mux21 im10(s[10],s1[10],s0[10],h6[6]);
mux21 im11(s[11],s1[11],ps[11],h6[10]);
mux21 im12(s[12],s1[12],s0[12],h6[10]);
mux21 im13(s[13],s1[13],s0[13],h6[10]);
mux21 im14(s[14],s1[14],s0[14],h6[10]);
mux21 im15(s[15],s1[15],ps[15],h6[14]);
mux21 im16(s[16],s1[16],s0[16],h6[14]);
mux21 im17(s[17],s1[17],s0[17],h6[14]);
mux21 im18(s[18],s1[18],s0[18],h6[14]);
mux21 im19(s[19],s1[19],ps[19],h6[18]);
mux21 im20(s[20],s1[20],s0[20],h6[18]);
mux21 im21(s[21],s1[21],s0[21],h6[18]);
mux21 im22(s[22],s1[22],s0[22],h6[18]);
mux21 im23(s[23],s1[23],ps[23],h6[22]);
mux21 im24(s[24],s1[24],s0[24],h6[22]);
mux21 im25(s[25],s1[25],s0[25],h6[22]);
mux21 im26(s[26],s1[26],s0[26],h6[22]);
mux21 im27(s[27],s1[27],ps[27],h6[26]);
mux21 im28(s[28],s1[28],s0[28],h6[26]);
mux21 im29(s[29],s1[29],s0[29],h6[26]);
mux21 im30(s[30],s1[30],s0[30],h6[26]);
mux21 im31(s[31],s1[31],ps[31],h6[30]);
mux21 im32(s[32],s1[32],s0[32],h6[30]);
mux21 im33(s[33],s1[33],ps[33],h6[30]);
mux21 im34(s[34],s1[34],s0[34],h6[30]);
mux21 im35(s[35],s1[35],s0[35],h6[34]);
mux21 im36(s[36],s1[36],s0[36],h6[34]);
mux21 im37(s[37],s1[37],ps[37],h6[34]);
mux21 im38(s[38],s1[38],s0[38],h6[34]);
mux21 im39(s[39],s1[39],s0[39],h6[38]);
mux21 im40(s[40],s1[40],s0[40],h6[38]);
mux21 im41(s[41],s1[41],ps[41],h6[38]);
mux21 im42(s[42],s1[42],s0[42],h6[38]);
mux21 im43(s[43],s1[43],ps[43],h6[42]);
mux21 im44(s[44],s1[44],s0[44],h6[42]);
mux21 im45(s[45],s1[45],s0[45],h6[42]);
mux21 im46(s[46],s1[46],s0[46],h6[42]);
mux21 im47(s[47],s1[47],ps[47],h6[46]);
mux21 im48(s[48],s1[48],s0[48],h6[46]);
mux21 im49(s[49],s1[49],s0[49],h6[46]);
mux21 im50(s[50],s1[50],s0[50],h6[46]);
mux21 im51(s[51],s1[51],ps[51],h6[50]);
mux21 im52(s[52],s1[52],s0[52],h6[50]);
mux21 im53(s[53],s1[53],ps[53],h6[50]);
mux21 im54(s[54],s1[54],s0[54],h6[50]);
mux21 im55(s[55],s1[55],s0[55],h6[54]);
mux21 im56(s[56],s1[56],s0[56],h6[54]);
mux21 im57(s[57],s1[57],ps[57],h6[54]);
mux21 im58(s[58],s1[58],s0[58],h6[54]);
mux21 im59(s[59],s1[59],s0[59],h6[58]);
mux21 im60(s[60],s1[60],s0[60],h6[58]);
mux21 im61(s[61],s1[61],ps[61],h6[58]);
mux21 im62(s[62],s1[62],s0[62],h6[58]);
mux21 im63(s[63],s1[63],ps[63],h6[62]);

endmodule
