// ************************************************************************** // // // // 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 // // // // ************************************************************************** // [32]nat x; [32]nat y; [33]nat s; thread RadixBAddCarryLookahead32 { [32]bool g; [32]bool p; // preliminary sum digits s[0] = x[0] + y[0]; s[1] = x[1] + y[1]; s[2] = x[2] + y[2]; s[3] = x[3] + y[3]; s[4] = x[4] + y[4]; s[5] = x[5] + y[5]; s[6] = x[6] + y[6]; s[7] = x[7] + y[7]; s[8] = x[8] + y[8]; s[9] = x[9] + y[9]; s[10] = x[10] + y[10]; s[11] = x[11] + y[11]; s[12] = x[12] + y[12]; s[13] = x[13] + y[13]; s[14] = x[14] + y[14]; s[15] = x[15] + y[15]; s[16] = x[16] + y[16]; s[17] = x[17] + y[17]; s[18] = x[18] + y[18]; s[19] = x[19] + y[19]; s[20] = x[20] + y[20]; s[21] = x[21] + y[21]; s[22] = x[22] + y[22]; s[23] = x[23] + y[23]; s[24] = x[24] + y[24]; s[25] = x[25] + y[25]; s[26] = x[26] + y[26]; s[27] = x[27] + y[27]; s[28] = x[28] + y[28]; s[29] = x[29] + y[29]; s[30] = x[30] + y[30]; s[31] = x[31] + y[31]; // initial generate conditions g[0] = s[0]>255; g[1] = s[1]>255; g[2] = s[2]>255; g[3] = s[3]>255; g[4] = s[4]>255; g[5] = s[5]>255; g[6] = s[6]>255; g[7] = s[7]>255; g[8] = s[8]>255; g[9] = s[9]>255; g[10] = s[10]>255; g[11] = s[11]>255; g[12] = s[12]>255; g[13] = s[13]>255; g[14] = s[14]>255; g[15] = s[15]>255; g[16] = s[16]>255; g[17] = s[17]>255; g[18] = s[18]>255; g[19] = s[19]>255; g[20] = s[20]>255; g[21] = s[21]>255; g[22] = s[22]>255; g[23] = s[23]>255; g[24] = s[24]>255; g[25] = s[25]>255; g[26] = s[26]>255; g[27] = s[27]>255; g[28] = s[28]>255; g[29] = s[29]>255; g[30] = s[30]>255; g[31] = s[31]>255; // initial propagate conditions p[0] = s[0]==255; p[1] = s[1]==255; p[2] = s[2]==255; p[3] = s[3]==255; p[4] = s[4]==255; p[5] = s[5]==255; p[6] = s[6]==255; p[7] = s[7]==255; p[8] = s[8]==255; p[9] = s[9]==255; p[10] = s[10]==255; p[11] = s[11]==255; p[12] = s[12]==255; p[13] = s[13]==255; p[14] = s[14]==255; p[15] = s[15]==255; p[16] = s[16]==255; p[17] = s[17]==255; p[18] = s[18]==255; p[19] = s[19]==255; p[20] = s[20]==255; p[21] = s[21]==255; p[22] = s[22]==255; p[23] = s[23]==255; p[24] = s[24]==255; p[25] = s[25]==255; p[26] = s[26]==255; p[27] = s[27]==255; p[28] = s[28]==255; p[29] = s[29]==255; p[30] = s[30]==255; p[31] = s[31]==255; // carry propagation prefix tree // up-level 1 g[1] = g[0] & p[1] | g[1]; p[1] = p[1] & p[0]; g[3] = g[2] & p[3] | g[3]; p[3] = p[3] & p[2]; g[5] = g[4] & p[5] | g[5]; p[5] = p[5] & p[4]; g[7] = g[6] & p[7] | g[7]; p[7] = p[7] & p[6]; g[9] = g[8] & p[9] | g[9]; p[9] = p[9] & p[8]; g[11] = g[10] & p[11] | g[11]; p[11] = p[11] & p[10]; g[13] = g[12] & p[13] | g[13]; p[13] = p[13] & p[12]; g[15] = g[14] & p[15] | g[15]; p[15] = p[15] & p[14]; g[17] = g[16] & p[17] | g[17]; p[17] = p[17] & p[16]; g[19] = g[18] & p[19] | g[19]; p[19] = p[19] & p[18]; g[21] = g[20] & p[21] | g[21]; p[21] = p[21] & p[20]; g[23] = g[22] & p[23] | g[23]; p[23] = p[23] & p[22]; g[25] = g[24] & p[25] | g[25]; p[25] = p[25] & p[24]; g[27] = g[26] & p[27] | g[27]; p[27] = p[27] & p[26]; g[29] = g[28] & p[29] | g[29]; p[29] = p[29] & p[28]; g[31] = g[30] & p[31] | g[31]; p[31] = p[31] & p[30]; // up-level 2 g[3] = g[1] & p[3] | g[3]; p[3] = p[3] & p[1]; g[7] = g[5] & p[7] | g[7]; p[7] = p[7] & p[5]; g[11] = g[9] & p[11] | g[11]; p[11] = p[11] & p[9]; g[15] = g[13] & p[15] | g[15]; p[15] = p[15] & p[13]; g[19] = g[17] & p[19] | g[19]; p[19] = p[19] & p[17]; g[23] = g[21] & p[23] | g[23]; p[23] = p[23] & p[21]; g[27] = g[25] & p[27] | g[27]; p[27] = p[27] & p[25]; g[31] = g[29] & p[31] | g[31]; p[31] = p[31] & p[29]; // up-level 3 g[7] = g[3] & p[7] | g[7]; p[7] = p[7] & p[3]; g[15] = g[11] & p[15] | g[15]; p[15] = p[15] & p[11]; g[23] = g[19] & p[23] | g[23]; p[23] = p[23] & p[19]; g[31] = g[27] & p[31] | g[31]; p[31] = p[31] & p[27]; // up-level 4 g[15] = g[7] & p[15] | g[15]; p[15] = p[15] & p[7]; g[31] = g[23] & p[31] | g[31]; p[31] = p[31] & p[23]; // up-level 5 g[31] = g[15] & p[31] | g[31]; p[31] = p[31] & p[15]; // down-level 7 // down-level 8 g[23] = g[15] & p[23] | g[23]; p[23] = p[23] & p[15]; // down-level 9 g[11] = g[7] & p[11] | g[11]; p[11] = p[11] & p[7]; g[19] = g[15] & p[19] | g[19]; p[19] = p[19] & p[15]; g[27] = g[23] & p[27] | g[27]; p[27] = p[27] & p[23]; // down-level 10 g[5] = g[3] & p[5] | g[5]; p[5] = p[5] & p[3]; g[9] = g[7] & p[9] | g[9]; p[9] = p[9] & p[7]; g[13] = g[11] & p[13] | g[13]; p[13] = p[13] & p[11]; g[17] = g[15] & p[17] | g[17]; p[17] = p[17] & p[15]; g[21] = g[19] & p[21] | g[21]; p[21] = p[21] & p[19]; g[25] = g[23] & p[25] | g[25]; p[25] = p[25] & p[23]; g[29] = g[27] & p[29] | g[29]; p[29] = p[29] & p[27]; // down-level 11 g[2] = g[1] & p[2] | g[2]; p[2] = p[2] & p[1]; g[4] = g[3] & p[4] | g[4]; p[4] = p[4] & p[3]; g[6] = g[5] & p[6] | g[6]; p[6] = p[6] & p[5]; g[8] = g[7] & p[8] | g[8]; p[8] = p[8] & p[7]; g[10] = g[9] & p[10] | g[10]; p[10] = p[10] & p[9]; g[12] = g[11] & p[12] | g[12]; p[12] = p[12] & p[11]; g[14] = g[13] & p[14] | g[14]; p[14] = p[14] & p[13]; g[16] = g[15] & p[16] | g[16]; p[16] = p[16] & p[15]; g[18] = g[17] & p[18] | g[18]; p[18] = p[18] & p[17]; g[20] = g[19] & p[20] | g[20]; p[20] = p[20] & p[19]; g[22] = g[21] & p[22] | g[22]; p[22] = p[22] & p[21]; g[24] = g[23] & p[24] | g[24]; p[24] = p[24] & p[23]; g[26] = g[25] & p[26] | g[26]; p[26] = p[26] & p[25]; g[28] = g[27] & p[28] | g[28]; p[28] = p[28] & p[27]; g[30] = g[29] & p[30] | g[30]; p[30] = p[30] & p[29]; // compute final sum digits s[0] = s[0] % 256; s[1] = (s[1]+(g[0]?1:0)) % 256; s[2] = (s[2]+(g[1]?1:0)) % 256; s[3] = (s[3]+(g[2]?1:0)) % 256; s[4] = (s[4]+(g[3]?1:0)) % 256; s[5] = (s[5]+(g[4]?1:0)) % 256; s[6] = (s[6]+(g[5]?1:0)) % 256; s[7] = (s[7]+(g[6]?1:0)) % 256; s[8] = (s[8]+(g[7]?1:0)) % 256; s[9] = (s[9]+(g[8]?1:0)) % 256; s[10] = (s[10]+(g[9]?1:0)) % 256; s[11] = (s[11]+(g[10]?1:0)) % 256; s[12] = (s[12]+(g[11]?1:0)) % 256; s[13] = (s[13]+(g[12]?1:0)) % 256; s[14] = (s[14]+(g[13]?1:0)) % 256; s[15] = (s[15]+(g[14]?1:0)) % 256; s[16] = (s[16]+(g[15]?1:0)) % 256; s[17] = (s[17]+(g[16]?1:0)) % 256; s[18] = (s[18]+(g[17]?1:0)) % 256; s[19] = (s[19]+(g[18]?1:0)) % 256; s[20] = (s[20]+(g[19]?1:0)) % 256; s[21] = (s[21]+(g[20]?1:0)) % 256; s[22] = (s[22]+(g[21]?1:0)) % 256; s[23] = (s[23]+(g[22]?1:0)) % 256; s[24] = (s[24]+(g[23]?1:0)) % 256; s[25] = (s[25]+(g[24]?1:0)) % 256; s[26] = (s[26]+(g[25]?1:0)) % 256; s[27] = (s[27]+(g[26]?1:0)) % 256; s[28] = (s[28]+(g[27]?1:0)) % 256; s[29] = (s[29]+(g[28]?1:0)) % 256; s[30] = (s[30]+(g[29]?1:0)) % 256; s[31] = (s[31]+(g[30]?1:0)) % 256; s[32] = (g[31]?1:0); }