// ************************************************************************** //
//                                                                            //
//    eses                   eses                                             //
//   eses                     eses                                            //
//  eses    eseses  esesese    eses   Embedded Systems Group                  //
//  ese    ese  ese ese         ese                                           //
//  ese    eseseses eseseses    ese   Department of Computer Science          //
//  eses   eses          ese   eses                                           //
//   eses   eseses  eseseses  eses    University of Kaiserslautern            //
//    eses                   eses                                             //
//                                                                            //
// ************************************************************************** //


[64]nat x;
[64]nat y;
[65]nat s;

thread RadixBAddCarryLookahead64 {
    bool g0,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20,g21,g22,g23,g24,g25,g26,g27,g28,g29,g30,g31,g32,g33,g34,g35,g36,g37,g38,g39,g40,g41,g42,g43,g44,g45,g46,g47,g48,g49,g50,g51,g52,g53,g54,g55,g56,g57,g58,g59,g60,g61,g62,g63;
    bool p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,p60,p61,p62,p63;
    nat x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x30,x31,x32,x33,x34,x35,x36,x37,x38,x39,x40,x41,x42,x43,x44,x45,x46,x47,x48,x49,x50,x51,x52,x53,x54,x55,x56,x57,x58,x59,x60,x61,x62,x63;
    nat y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14,y15,y16,y17,y18,y19,y20,y21,y22,y23,y24,y25,y26,y27,y28,y29,y30,y31,y32,y33,y34,y35,y36,y37,y38,y39,y40,y41,y42,y43,y44,y45,y46,y47,y48,y49,y50,y51,y52,y53,y54,y55,y56,y57,y58,y59,y60,y61,y62,y63;
    nat s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23,s24,s25,s26,s27,s28,s29,s30,s31,s32,s33,s34,s35,s36,s37,s38,s39,s40,s41,s42,s43,s44,s45,s46,s47,s48,s49,s50,s51,s52,s53,s54,s55,s56,s57,s58,s59,s60,s61,s62,s63,s64;
    x0 = x[0];
    x1 = x[1];
    x2 = x[2];
    x3 = x[3];
    x4 = x[4];
    x5 = x[5];
    x6 = x[6];
    x7 = x[7];
    x8 = x[8];
    x9 = x[9];
    x10 = x[10];
    x11 = x[11];
    x12 = x[12];
    x13 = x[13];
    x14 = x[14];
    x15 = x[15];
    x16 = x[16];
    x17 = x[17];
    x18 = x[18];
    x19 = x[19];
    x20 = x[20];
    x21 = x[21];
    x22 = x[22];
    x23 = x[23];
    x24 = x[24];
    x25 = x[25];
    x26 = x[26];
    x27 = x[27];
    x28 = x[28];
    x29 = x[29];
    x30 = x[30];
    x31 = x[31];
    x32 = x[32];
    x33 = x[33];
    x34 = x[34];
    x35 = x[35];
    x36 = x[36];
    x37 = x[37];
    x38 = x[38];
    x39 = x[39];
    x40 = x[40];
    x41 = x[41];
    x42 = x[42];
    x43 = x[43];
    x44 = x[44];
    x45 = x[45];
    x46 = x[46];
    x47 = x[47];
    x48 = x[48];
    x49 = x[49];
    x50 = x[50];
    x51 = x[51];
    x52 = x[52];
    x53 = x[53];
    x54 = x[54];
    x55 = x[55];
    x56 = x[56];
    x57 = x[57];
    x58 = x[58];
    x59 = x[59];
    x60 = x[60];
    x61 = x[61];
    x62 = x[62];
    x63 = x[63];
    y0 = y[0];
    y1 = y[1];
    y2 = y[2];
    y3 = y[3];
    y4 = y[4];
    y5 = y[5];
    y6 = y[6];
    y7 = y[7];
    y8 = y[8];
    y9 = y[9];
    y10 = y[10];
    y11 = y[11];
    y12 = y[12];
    y13 = y[13];
    y14 = y[14];
    y15 = y[15];
    y16 = y[16];
    y17 = y[17];
    y18 = y[18];
    y19 = y[19];
    y20 = y[20];
    y21 = y[21];
    y22 = y[22];
    y23 = y[23];
    y24 = y[24];
    y25 = y[25];
    y26 = y[26];
    y27 = y[27];
    y28 = y[28];
    y29 = y[29];
    y30 = y[30];
    y31 = y[31];
    y32 = y[32];
    y33 = y[33];
    y34 = y[34];
    y35 = y[35];
    y36 = y[36];
    y37 = y[37];
    y38 = y[38];
    y39 = y[39];
    y40 = y[40];
    y41 = y[41];
    y42 = y[42];
    y43 = y[43];
    y44 = y[44];
    y45 = y[45];
    y46 = y[46];
    y47 = y[47];
    y48 = y[48];
    y49 = y[49];
    y50 = y[50];
    y51 = y[51];
    y52 = y[52];
    y53 = y[53];
    y54 = y[54];
    y55 = y[55];
    y56 = y[56];
    y57 = y[57];
    y58 = y[58];
    y59 = y[59];
    y60 = y[60];
    y61 = y[61];
    y62 = y[62];
    y63 = y[63];
    // preliminary sum digits
    s0 = x0 + y0;
    s1 = x1 + y1;
    s2 = x2 + y2;
    s3 = x3 + y3;
    s4 = x4 + y4;
    s5 = x5 + y5;
    s6 = x6 + y6;
    s7 = x7 + y7;
    s8 = x8 + y8;
    s9 = x9 + y9;
    s10 = x10 + y10;
    s11 = x11 + y11;
    s12 = x12 + y12;
    s13 = x13 + y13;
    s14 = x14 + y14;
    s15 = x15 + y15;
    s16 = x16 + y16;
    s17 = x17 + y17;
    s18 = x18 + y18;
    s19 = x19 + y19;
    s20 = x20 + y20;
    s21 = x21 + y21;
    s22 = x22 + y22;
    s23 = x23 + y23;
    s24 = x24 + y24;
    s25 = x25 + y25;
    s26 = x26 + y26;
    s27 = x27 + y27;
    s28 = x28 + y28;
    s29 = x29 + y29;
    s30 = x30 + y30;
    s31 = x31 + y31;
    s32 = x32 + y32;
    s33 = x33 + y33;
    s34 = x34 + y34;
    s35 = x35 + y35;
    s36 = x36 + y36;
    s37 = x37 + y37;
    s38 = x38 + y38;
    s39 = x39 + y39;
    s40 = x40 + y40;
    s41 = x41 + y41;
    s42 = x42 + y42;
    s43 = x43 + y43;
    s44 = x44 + y44;
    s45 = x45 + y45;
    s46 = x46 + y46;
    s47 = x47 + y47;
    s48 = x48 + y48;
    s49 = x49 + y49;
    s50 = x50 + y50;
    s51 = x51 + y51;
    s52 = x52 + y52;
    s53 = x53 + y53;
    s54 = x54 + y54;
    s55 = x55 + y55;
    s56 = x56 + y56;
    s57 = x57 + y57;
    s58 = x58 + y58;
    s59 = x59 + y59;
    s60 = x60 + y60;
    s61 = x61 + y61;
    s62 = x62 + y62;
    s63 = x63 + y63;
    // initial generate conditions
    g0 = s0>255;
    g1 = s1>255;
    g2 = s2>255;
    g3 = s3>255;
    g4 = s4>255;
    g5 = s5>255;
    g6 = s6>255;
    g7 = s7>255;
    g8 = s8>255;
    g9 = s9>255;
    g10 = s10>255;
    g11 = s11>255;
    g12 = s12>255;
    g13 = s13>255;
    g14 = s14>255;
    g15 = s15>255;
    g16 = s16>255;
    g17 = s17>255;
    g18 = s18>255;
    g19 = s19>255;
    g20 = s20>255;
    g21 = s21>255;
    g22 = s22>255;
    g23 = s23>255;
    g24 = s24>255;
    g25 = s25>255;
    g26 = s26>255;
    g27 = s27>255;
    g28 = s28>255;
    g29 = s29>255;
    g30 = s30>255;
    g31 = s31>255;
    g32 = s32>255;
    g33 = s33>255;
    g34 = s34>255;
    g35 = s35>255;
    g36 = s36>255;
    g37 = s37>255;
    g38 = s38>255;
    g39 = s39>255;
    g40 = s40>255;
    g41 = s41>255;
    g42 = s42>255;
    g43 = s43>255;
    g44 = s44>255;
    g45 = s45>255;
    g46 = s46>255;
    g47 = s47>255;
    g48 = s48>255;
    g49 = s49>255;
    g50 = s50>255;
    g51 = s51>255;
    g52 = s52>255;
    g53 = s53>255;
    g54 = s54>255;
    g55 = s55>255;
    g56 = s56>255;
    g57 = s57>255;
    g58 = s58>255;
    g59 = s59>255;
    g60 = s60>255;
    g61 = s61>255;
    g62 = s62>255;
    g63 = s63>255;
    // initial propagate conditions
    p0 = s0==255;
    p1 = s1==255;
    p2 = s2==255;
    p3 = s3==255;
    p4 = s4==255;
    p5 = s5==255;
    p6 = s6==255;
    p7 = s7==255;
    p8 = s8==255;
    p9 = s9==255;
    p10 = s10==255;
    p11 = s11==255;
    p12 = s12==255;
    p13 = s13==255;
    p14 = s14==255;
    p15 = s15==255;
    p16 = s16==255;
    p17 = s17==255;
    p18 = s18==255;
    p19 = s19==255;
    p20 = s20==255;
    p21 = s21==255;
    p22 = s22==255;
    p23 = s23==255;
    p24 = s24==255;
    p25 = s25==255;
    p26 = s26==255;
    p27 = s27==255;
    p28 = s28==255;
    p29 = s29==255;
    p30 = s30==255;
    p31 = s31==255;
    p32 = s32==255;
    p33 = s33==255;
    p34 = s34==255;
    p35 = s35==255;
    p36 = s36==255;
    p37 = s37==255;
    p38 = s38==255;
    p39 = s39==255;
    p40 = s40==255;
    p41 = s41==255;
    p42 = s42==255;
    p43 = s43==255;
    p44 = s44==255;
    p45 = s45==255;
    p46 = s46==255;
    p47 = s47==255;
    p48 = s48==255;
    p49 = s49==255;
    p50 = s50==255;
    p51 = s51==255;
    p52 = s52==255;
    p53 = s53==255;
    p54 = s54==255;
    p55 = s55==255;
    p56 = s56==255;
    p57 = s57==255;
    p58 = s58==255;
    p59 = s59==255;
    p60 = s60==255;
    p61 = s61==255;
    p62 = s62==255;
    p63 = s63==255;
    // carry propagation prefix tree
    // up-level 1
    g1 = g0 & p1 | g1;
    p1 = p1 & p0;
    g3 = g2 & p3 | g3;
    p3 = p3 & p2;
    g5 = g4 & p5 | g5;
    p5 = p5 & p4;
    g7 = g6 & p7 | g7;
    p7 = p7 & p6;
    g9 = g8 & p9 | g9;
    p9 = p9 & p8;
    g11 = g10 & p11 | g11;
    p11 = p11 & p10;
    g13 = g12 & p13 | g13;
    p13 = p13 & p12;
    g15 = g14 & p15 | g15;
    p15 = p15 & p14;
    g17 = g16 & p17 | g17;
    p17 = p17 & p16;
    g19 = g18 & p19 | g19;
    p19 = p19 & p18;
    g21 = g20 & p21 | g21;
    p21 = p21 & p20;
    g23 = g22 & p23 | g23;
    p23 = p23 & p22;
    g25 = g24 & p25 | g25;
    p25 = p25 & p24;
    g27 = g26 & p27 | g27;
    p27 = p27 & p26;
    g29 = g28 & p29 | g29;
    p29 = p29 & p28;
    g31 = g30 & p31 | g31;
    p31 = p31 & p30;
    g33 = g32 & p33 | g33;
    p33 = p33 & p32;
    g35 = g34 & p35 | g35;
    p35 = p35 & p34;
    g37 = g36 & p37 | g37;
    p37 = p37 & p36;
    g39 = g38 & p39 | g39;
    p39 = p39 & p38;
    g41 = g40 & p41 | g41;
    p41 = p41 & p40;
    g43 = g42 & p43 | g43;
    p43 = p43 & p42;
    g45 = g44 & p45 | g45;
    p45 = p45 & p44;
    g47 = g46 & p47 | g47;
    p47 = p47 & p46;
    g49 = g48 & p49 | g49;
    p49 = p49 & p48;
    g51 = g50 & p51 | g51;
    p51 = p51 & p50;
    g53 = g52 & p53 | g53;
    p53 = p53 & p52;
    g55 = g54 & p55 | g55;
    p55 = p55 & p54;
    g57 = g56 & p57 | g57;
    p57 = p57 & p56;
    g59 = g58 & p59 | g59;
    p59 = p59 & p58;
    g61 = g60 & p61 | g61;
    p61 = p61 & p60;
    g63 = g62 & p63 | g63;
    p63 = p63 & p62;
    // up-level 2
    g3 = g1 & p3 | g3;
    p3 = p3 & p1;
    g7 = g5 & p7 | g7;
    p7 = p7 & p5;
    g11 = g9 & p11 | g11;
    p11 = p11 & p9;
    g15 = g13 & p15 | g15;
    p15 = p15 & p13;
    g19 = g17 & p19 | g19;
    p19 = p19 & p17;
    g23 = g21 & p23 | g23;
    p23 = p23 & p21;
    g27 = g25 & p27 | g27;
    p27 = p27 & p25;
    g31 = g29 & p31 | g31;
    p31 = p31 & p29;
    g35 = g33 & p35 | g35;
    p35 = p35 & p33;
    g39 = g37 & p39 | g39;
    p39 = p39 & p37;
    g43 = g41 & p43 | g43;
    p43 = p43 & p41;
    g47 = g45 & p47 | g47;
    p47 = p47 & p45;
    g51 = g49 & p51 | g51;
    p51 = p51 & p49;
    g55 = g53 & p55 | g55;
    p55 = p55 & p53;
    g59 = g57 & p59 | g59;
    p59 = p59 & p57;
    g63 = g61 & p63 | g63;
    p63 = p63 & p61;
    // up-level 3
    g7 = g3 & p7 | g7;
    p7 = p7 & p3;
    g15 = g11 & p15 | g15;
    p15 = p15 & p11;
    g23 = g19 & p23 | g23;
    p23 = p23 & p19;
    g31 = g27 & p31 | g31;
    p31 = p31 & p27;
    g39 = g35 & p39 | g39;
    p39 = p39 & p35;
    g47 = g43 & p47 | g47;
    p47 = p47 & p43;
    g55 = g51 & p55 | g55;
    p55 = p55 & p51;
    g63 = g59 & p63 | g63;
    p63 = p63 & p59;
    // up-level 4
    g15 = g7 & p15 | g15;
    p15 = p15 & p7;
    g31 = g23 & p31 | g31;
    p31 = p31 & p23;
    g47 = g39 & p47 | g47;
    p47 = p47 & p39;
    g63 = g55 & p63 | g63;
    p63 = p63 & p55;
    // up-level 5
    g31 = g15 & p31 | g31;
    p31 = p31 & p15;
    g63 = g47 & p63 | g63;
    p63 = p63 & p47;
    // up-level 6
    g63 = g31 & p63 | g63;
    p63 = p63 & p31;
    // down-level 8
    // down-level 9
    g47 = g31 & p47 | g47;
    p47 = p47 & p31;
    // down-level 10
    g23 = g15 & p23 | g23;
    p23 = p23 & p15;
    g39 = g31 & p39 | g39;
    p39 = p39 & p31;
    g55 = g47 & p55 | g55;
    p55 = p55 & p47;
    // down-level 11
    g11 = g7 & p11 | g11;
    p11 = p11 & p7;
    g19 = g15 & p19 | g19;
    p19 = p19 & p15;
    g27 = g23 & p27 | g27;
    p27 = p27 & p23;
    g35 = g31 & p35 | g35;
    p35 = p35 & p31;
    g43 = g39 & p43 | g43;
    p43 = p43 & p39;
    g51 = g47 & p51 | g51;
    p51 = p51 & p47;
    g59 = g55 & p59 | g59;
    p59 = p59 & p55;
    // down-level 12
    g5 = g3 & p5 | g5;
    p5 = p5 & p3;
    g9 = g7 & p9 | g9;
    p9 = p9 & p7;
    g13 = g11 & p13 | g13;
    p13 = p13 & p11;
    g17 = g15 & p17 | g17;
    p17 = p17 & p15;
    g21 = g19 & p21 | g21;
    p21 = p21 & p19;
    g25 = g23 & p25 | g25;
    p25 = p25 & p23;
    g29 = g27 & p29 | g29;
    p29 = p29 & p27;
    g33 = g31 & p33 | g33;
    p33 = p33 & p31;
    g37 = g35 & p37 | g37;
    p37 = p37 & p35;
    g41 = g39 & p41 | g41;
    p41 = p41 & p39;
    g45 = g43 & p45 | g45;
    p45 = p45 & p43;
    g49 = g47 & p49 | g49;
    p49 = p49 & p47;
    g53 = g51 & p53 | g53;
    p53 = p53 & p51;
    g57 = g55 & p57 | g57;
    p57 = p57 & p55;
    g61 = g59 & p61 | g61;
    p61 = p61 & p59;
    // down-level 13
    g2 = g1 & p2 | g2;
    p2 = p2 & p1;
    g4 = g3 & p4 | g4;
    p4 = p4 & p3;
    g6 = g5 & p6 | g6;
    p6 = p6 & p5;
    g8 = g7 & p8 | g8;
    p8 = p8 & p7;
    g10 = g9 & p10 | g10;
    p10 = p10 & p9;
    g12 = g11 & p12 | g12;
    p12 = p12 & p11;
    g14 = g13 & p14 | g14;
    p14 = p14 & p13;
    g16 = g15 & p16 | g16;
    p16 = p16 & p15;
    g18 = g17 & p18 | g18;
    p18 = p18 & p17;
    g20 = g19 & p20 | g20;
    p20 = p20 & p19;
    g22 = g21 & p22 | g22;
    p22 = p22 & p21;
    g24 = g23 & p24 | g24;
    p24 = p24 & p23;
    g26 = g25 & p26 | g26;
    p26 = p26 & p25;
    g28 = g27 & p28 | g28;
    p28 = p28 & p27;
    g30 = g29 & p30 | g30;
    p30 = p30 & p29;
    g32 = g31 & p32 | g32;
    p32 = p32 & p31;
    g34 = g33 & p34 | g34;
    p34 = p34 & p33;
    g36 = g35 & p36 | g36;
    p36 = p36 & p35;
    g38 = g37 & p38 | g38;
    p38 = p38 & p37;
    g40 = g39 & p40 | g40;
    p40 = p40 & p39;
    g42 = g41 & p42 | g42;
    p42 = p42 & p41;
    g44 = g43 & p44 | g44;
    p44 = p44 & p43;
    g46 = g45 & p46 | g46;
    p46 = p46 & p45;
    g48 = g47 & p48 | g48;
    p48 = p48 & p47;
    g50 = g49 & p50 | g50;
    p50 = p50 & p49;
    g52 = g51 & p52 | g52;
    p52 = p52 & p51;
    g54 = g53 & p54 | g54;
    p54 = p54 & p53;
    g56 = g55 & p56 | g56;
    p56 = p56 & p55;
    g58 = g57 & p58 | g58;
    p58 = p58 & p57;
    g60 = g59 & p60 | g60;
    p60 = p60 & p59;
    g62 = g61 & p62 | g62;
    p62 = p62 & p61;
    // compute final sum digits
    s[0] = s0 % 256;
    s[1] = (s1+(g0?1:0)) % 256;
    s[2] = (s2+(g1?1:0)) % 256;
    s[3] = (s3+(g2?1:0)) % 256;
    s[4] = (s4+(g3?1:0)) % 256;
    s[5] = (s5+(g4?1:0)) % 256;
    s[6] = (s6+(g5?1:0)) % 256;
    s[7] = (s7+(g6?1:0)) % 256;
    s[8] = (s8+(g7?1:0)) % 256;
    s[9] = (s9+(g8?1:0)) % 256;
    s[10] = (s10+(g9?1:0)) % 256;
    s[11] = (s11+(g10?1:0)) % 256;
    s[12] = (s12+(g11?1:0)) % 256;
    s[13] = (s13+(g12?1:0)) % 256;
    s[14] = (s14+(g13?1:0)) % 256;
    s[15] = (s15+(g14?1:0)) % 256;
    s[16] = (s16+(g15?1:0)) % 256;
    s[17] = (s17+(g16?1:0)) % 256;
    s[18] = (s18+(g17?1:0)) % 256;
    s[19] = (s19+(g18?1:0)) % 256;
    s[20] = (s20+(g19?1:0)) % 256;
    s[21] = (s21+(g20?1:0)) % 256;
    s[22] = (s22+(g21?1:0)) % 256;
    s[23] = (s23+(g22?1:0)) % 256;
    s[24] = (s24+(g23?1:0)) % 256;
    s[25] = (s25+(g24?1:0)) % 256;
    s[26] = (s26+(g25?1:0)) % 256;
    s[27] = (s27+(g26?1:0)) % 256;
    s[28] = (s28+(g27?1:0)) % 256;
    s[29] = (s29+(g28?1:0)) % 256;
    s[30] = (s30+(g29?1:0)) % 256;
    s[31] = (s31+(g30?1:0)) % 256;
    s[32] = (s32+(g31?1:0)) % 256;
    s[33] = (s33+(g32?1:0)) % 256;
    s[34] = (s34+(g33?1:0)) % 256;
    s[35] = (s35+(g34?1:0)) % 256;
    s[36] = (s36+(g35?1:0)) % 256;
    s[37] = (s37+(g36?1:0)) % 256;
    s[38] = (s38+(g37?1:0)) % 256;
    s[39] = (s39+(g38?1:0)) % 256;
    s[40] = (s40+(g39?1:0)) % 256;
    s[41] = (s41+(g40?1:0)) % 256;
    s[42] = (s42+(g41?1:0)) % 256;
    s[43] = (s43+(g42?1:0)) % 256;
    s[44] = (s44+(g43?1:0)) % 256;
    s[45] = (s45+(g44?1:0)) % 256;
    s[46] = (s46+(g45?1:0)) % 256;
    s[47] = (s47+(g46?1:0)) % 256;
    s[48] = (s48+(g47?1:0)) % 256;
    s[49] = (s49+(g48?1:0)) % 256;
    s[50] = (s50+(g49?1:0)) % 256;
    s[51] = (s51+(g50?1:0)) % 256;
    s[52] = (s52+(g51?1:0)) % 256;
    s[53] = (s53+(g52?1:0)) % 256;
    s[54] = (s54+(g53?1:0)) % 256;
    s[55] = (s55+(g54?1:0)) % 256;
    s[56] = (s56+(g55?1:0)) % 256;
    s[57] = (s57+(g56?1:0)) % 256;
    s[58] = (s58+(g57?1:0)) % 256;
    s[59] = (s59+(g58?1:0)) % 256;
    s[60] = (s60+(g59?1:0)) % 256;
    s[61] = (s61+(g60?1:0)) % 256;
    s[62] = (s62+(g61?1:0)) % 256;
    s[63] = (s63+(g62?1:0)) % 256;
    s[64] = (g63?1:0);
}