// ************************************************************************** // // // // 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 // // // // ************************************************************************** // nat x0,x1,x2,x3,x4,x5,x6,x7; nat y0,y1,y2,y3,y4,y5,y6,y7; nat p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15; thread RadixBMulDadda { nat t0,t1,t10,t100,t101,t102,t103,t104,t105,t106,t107,t108,t109,t11,t110,t111,t112,t113,t114,t115,t116,t117,t118,t119,t12,t120,t121,t122,t123,t124,t125,t126,t127,t128,t129,t13,t130,t131,t132,t133,t134,t135,t136,t137,t138,t139,t14,t140,t141,t142,t143,t144,t145,t146,t147,t148,t149,t15,t150,t151,t152,t153,t154,t155,t156,t157,t158,t159,t16,t160,t161,t162,t163,t164,t165,t166,t167,t168,t169,t17,t170,t171,t172,t173,t174,t175,t176,t177,t178,t179,t18,t180,t181,t182,t183,t184,t185,t186,t187,t188,t189,t19,t190,t191,t192,t193,t194,t195,t196,t197,t198,t199,t2,t20,t200,t201,t202,t203,t204,t205,t206,t207,t208,t209,t21,t210,t211,t212,t213,t214,t215,t216,t217,t218,t219,t22,t220,t221,t222,t223,t224,t225,t226,t227,t228,t229,t23,t230,t231,t232,t233,t234,t235,t236,t237,t238,t239,t24,t240,t241,t242,t243,t244,t245,t246,t247,t248,t249,t25,t250,t251,t252,t253,t254,t255,t256,t257,t258,t259,t26,t260,t261,t262,t263,t264,t265,t266,t267,t268,t269,t27,t270,t271,t272,t273,t274,t275,t276,t277,t278,t279,t28,t280,t281,t282,t283,t284,t285,t286,t287,t288,t289,t29,t290,t291,t292,t293,t294,t295,t296,t297,t298,t299,t3,t30,t300,t301,t302,t303,t304,t305,t306,t307,t308,t309,t31,t310,t311,t312,t313,t314,t315,t316,t317,t318,t319,t32,t320,t321,t322,t323,t324,t325,t326,t327,t328,t329,t33,t330,t331,t332,t333,t334,t335,t336,t337,t338,t339,t34,t340,t341,t342,t343,t344,t345,t346,t347,t348,t349,t35,t350,t351,t352,t353,t354,t355,t356,t357,t358,t359,t36,t360,t361,t362,t363,t364,t365,t366,t367,t368,t369,t37,t370,t371,t372,t373,t374,t375,t376,t377,t378,t379,t38,t380,t381,t382,t383,t384,t385,t386,t387,t388,t389,t39,t390,t391,t392,t393,t394,t395,t396,t397,t398,t399,t4,t40,t400,t401,t402,t403,t404,t405,t406,t407,t408,t409,t41,t410,t411,t412,t413,t414,t415,t416,t417,t418,t419,t42,t420,t421,t422,t423,t424,t425,t426,t427,t428,t429,t43,t430,t431,t432,t433,t434,t435,t436,t437,t438,t439,t44,t440,t441,t442,t443,t444,t445,t446,t447,t448,t449,t45,t450,t451,t452,t453,t454,t455,t456,t457,t458,t459,t46,t460,t461,t462,t463,t464,t465,t466,t467,t468,t469,t47,t470,t471,t472,t473,t474,t475,t476,t477,t478,t479,t48,t480,t481,t482,t483,t484,t485,t486,t487,t488,t489,t49,t490,t491,t492,t493,t494,t495,t496,t497,t498,t499,t5,t50,t500,t501,t502,t503,t504,t505,t506,t507,t508,t509,t51,t510,t511,t512,t513,t514,t515,t516,t517,t518,t519,t52,t520,t521,t522,t523,t524,t53,t54,t55,t56,t57,t58,t59,t6,t60,t61,t62,t63,t64,t65,t66,t67,t68,t69,t7,t70,t71,t72,t73,t74,t75,t76,t77,t78,t79,t8,t80,t81,t82,t83,t84,t85,t86,t87,t88,t89,t9,t90,t91,t92,t93,t94,t95,t96,t97,t98,t99; bool t525,t526,t527,t528,t529,t530,t531,t532,t533,t534,t535,t536,t537,t538,t539,t540,t541,t542,t543,t544,t545,t546,t547,t548,t549,t550,t551,t552,t553,t554; // compute partial products t0 = x0 * y0; t1 = t0 / 256; t2 = t0 % 256; t3 = x0 * y1; t4 = t3 / 256; t5 = t3 % 256; t6 = x1 * y0; t7 = t6 / 256; t8 = t6 % 256; t9 = x0 * y2; t10 = t9 / 256; t11 = t9 % 256; t12 = x1 * y1; t13 = t12 / 256; t14 = t12 % 256; t15 = x2 * y0; t16 = t15 / 256; t17 = t15 % 256; t18 = x0 * y3; t19 = t18 / 256; t20 = t18 % 256; t21 = x1 * y2; t22 = t21 / 256; t23 = t21 % 256; t24 = x2 * y1; t25 = t24 / 256; t26 = t24 % 256; t27 = x3 * y0; t28 = t27 / 256; t29 = t27 % 256; t30 = x0 * y4; t31 = t30 / 256; t32 = t30 % 256; t33 = x1 * y3; t34 = t33 / 256; t35 = t33 % 256; t36 = x2 * y2; t37 = t36 / 256; t38 = t36 % 256; t39 = x3 * y1; t40 = t39 / 256; t41 = t39 % 256; t42 = x4 * y0; t43 = t42 / 256; t44 = t42 % 256; t45 = x0 * y5; t46 = t45 / 256; t47 = t45 % 256; t48 = x1 * y4; t49 = t48 / 256; t50 = t48 % 256; t51 = x2 * y3; t52 = t51 / 256; t53 = t51 % 256; t54 = x3 * y2; t55 = t54 / 256; t56 = t54 % 256; t57 = x4 * y1; t58 = t57 / 256; t59 = t57 % 256; t60 = x5 * y0; t61 = t60 / 256; t62 = t60 % 256; t63 = x0 * y6; t64 = t63 / 256; t65 = t63 % 256; t66 = x1 * y5; t67 = t66 / 256; t68 = t66 % 256; t69 = x2 * y4; t70 = t69 / 256; t71 = t69 % 256; t72 = x3 * y3; t73 = t72 / 256; t74 = t72 % 256; t75 = x4 * y2; t76 = t75 / 256; t77 = t75 % 256; t78 = x5 * y1; t79 = t78 / 256; t80 = t78 % 256; t81 = x6 * y0; t82 = t81 / 256; t83 = t81 % 256; t84 = x0 * y7; t85 = t84 / 256; t86 = t84 % 256; t87 = x1 * y6; t88 = t87 / 256; t89 = t87 % 256; t90 = x2 * y5; t91 = t90 / 256; t92 = t90 % 256; t93 = x3 * y4; t94 = t93 / 256; t95 = t93 % 256; t96 = x4 * y3; t97 = t96 / 256; t98 = t96 % 256; t99 = x5 * y2; t100 = t99 / 256; t101 = t99 % 256; t102 = x6 * y1; t103 = t102 / 256; t104 = t102 % 256; t105 = x7 * y0; t106 = t105 / 256; t107 = t105 % 256; t108 = x1 * y7; t109 = t108 / 256; t110 = t108 % 256; t111 = x2 * y6; t112 = t111 / 256; t113 = t111 % 256; t114 = x3 * y5; t115 = t114 / 256; t116 = t114 % 256; t117 = x4 * y4; t118 = t117 / 256; t119 = t117 % 256; t120 = x5 * y3; t121 = t120 / 256; t122 = t120 % 256; t123 = x6 * y2; t124 = t123 / 256; t125 = t123 % 256; t126 = x7 * y1; t127 = t126 / 256; t128 = t126 % 256; t129 = x2 * y7; t130 = t129 / 256; t131 = t129 % 256; t132 = x3 * y6; t133 = t132 / 256; t134 = t132 % 256; t135 = x4 * y5; t136 = t135 / 256; t137 = t135 % 256; t138 = x5 * y4; t139 = t138 / 256; t140 = t138 % 256; t141 = x6 * y3; t142 = t141 / 256; t143 = t141 % 256; t144 = x7 * y2; t145 = t144 / 256; t146 = t144 % 256; t147 = x3 * y7; t148 = t147 / 256; t149 = t147 % 256; t150 = x4 * y6; t151 = t150 / 256; t152 = t150 % 256; t153 = x5 * y5; t154 = t153 / 256; t155 = t153 % 256; t156 = x6 * y4; t157 = t156 / 256; t158 = t156 % 256; t159 = x7 * y3; t160 = t159 / 256; t161 = t159 % 256; t162 = x4 * y7; t163 = t162 / 256; t164 = t162 % 256; t165 = x5 * y6; t166 = t165 / 256; t167 = t165 % 256; t168 = x6 * y5; t169 = t168 / 256; t170 = t168 % 256; t171 = x7 * y4; t172 = t171 / 256; t173 = t171 % 256; t174 = x5 * y7; t175 = t174 / 256; t176 = t174 % 256; t177 = x6 * y6; t178 = t177 / 256; t179 = t177 % 256; t180 = x7 * y5; t181 = t180 / 256; t182 = t180 % 256; t183 = x6 * y7; t184 = t183 / 256; t185 = t183 % 256; t186 = x7 * y6; t187 = t186 / 256; t188 = t186 % 256; t189 = x7 * y7; t190 = t189 / 256; t191 = t189 % 256; // reduce heights of each column to 13 t192 = t107 + t104 + t101; t193 = t192 / 256; t194 = t192 % 256; t195 = t119 + t116; t196 = t195 / 256; t197 = t195 % 256; t198 = t128 + t125 + t122; t199 = t198 / 256; t200 = t198 % 256; t201 = t146 + t143 + t140; t202 = t201 / 256; t203 = t201 % 256; // reduce heights of each column to 9 t204 = t62 + t59 + t56; t205 = t204 / 256; t206 = t204 % 256; t207 = t65 + t61; t208 = t207 / 256; t209 = t207 % 256; t210 = t74 + t71 + t68; t211 = t210 / 256; t212 = t210 % 256; t213 = t83 + t80 + t77; t214 = t213 / 256; t215 = t213 % 256; t216 = t70 + t67; t217 = t216 / 256; t218 = t216 % 256; t219 = t79 + t76 + t73; t220 = t219 / 256; t221 = t219 % 256; t222 = t89 + t86 + t82; t223 = t222 / 256; t224 = t222 % 256; t225 = t98 + t95 + t92; t226 = t225 / 256; t227 = t225 % 256; t228 = t85 + t193 + t197; t229 = t228 / 256; t230 = t228 % 256; t231 = t94 + t91 + t88; t232 = t231 / 256; t233 = t231 % 256; t234 = t103 + t100 + t97; t235 = t234 / 256; t236 = t234 % 256; t237 = t113 + t110 + t106; t238 = t237 / 256; t239 = t237 % 256; t240 = t109 + t196 + t199; t241 = t240 / 256; t242 = t240 % 256; t243 = t118 + t115 + t112; t244 = t243 / 256; t245 = t243 % 256; t246 = t127 + t124 + t121; t247 = t246 / 256; t248 = t246 % 256; t249 = t137 + t134 + t131; t250 = t249 / 256; t251 = t249 % 256; t252 = t133 + t130; t253 = t252 / 256; t254 = t252 % 256; t255 = t142 + t139 + t136; t256 = t255 / 256; t257 = t255 % 256; t258 = t152 + t149 + t145; t259 = t258 / 256; t260 = t258 % 256; t261 = t161 + t158 + t155; t262 = t261 / 256; t263 = t261 % 256; t264 = t164 + t160 + t157; t265 = t264 / 256; t266 = t264 % 256; t267 = t173 + t170 + t167; t268 = t267 / 256; t269 = t267 % 256; // reduce heights of each column to 6 t270 = t29 + t26; t271 = t270 / 256; t272 = t270 % 256; t273 = t35 + t32 + t28; t274 = t273 / 256; t275 = t273 % 256; t276 = t44 + t41 + t38; t277 = t276 / 256; t278 = t276 % 256; t279 = t34 + t31; t280 = t279 / 256; t281 = t279 % 256; t282 = t43 + t40 + t37; t283 = t282 / 256; t284 = t282 % 256; t285 = t53 + t50 + t47; t286 = t285 / 256; t287 = t285 % 256; t288 = t209 + t212 + t215; t289 = t288 / 256; t290 = t288 % 256; t291 = t49 + t46 + t205; t292 = t291 / 256; t293 = t291 % 256; t294 = t58 + t55 + t52; t295 = t294 / 256; t296 = t294 % 256; t297 = t221 + t224 + t227; t298 = t297 / 256; t299 = t297 % 256; t300 = t211 + t214 + t218; t301 = t300 / 256; t302 = t300 % 256; t303 = t64 + t194 + t208; t304 = t303 / 256; t305 = t303 % 256; t306 = t233 + t236 + t239; t307 = t306 / 256; t308 = t306 % 256; t309 = t223 + t226 + t230; t310 = t309 / 256; t311 = t309 % 256; t312 = t200 + t217 + t220; t313 = t312 / 256; t314 = t312 % 256; t315 = t245 + t248 + t251; t316 = t315 / 256; t317 = t315 % 256; t318 = t235 + t238 + t242; t319 = t318 / 256; t320 = t318 % 256; t321 = t203 + t229 + t232; t322 = t321 / 256; t323 = t321 % 256; t324 = t257 + t260 + t263; t325 = t324 / 256; t326 = t324 % 256; t327 = t247 + t250 + t254; t328 = t327 / 256; t329 = t327 % 256; t330 = t202 + t241 + t244; t331 = t330 / 256; t332 = t330 % 256; t333 = t262 + t266 + t269; t334 = t333 / 256; t335 = t333 % 256; t336 = t253 + t256 + t259; t337 = t336 / 256; t338 = t336 % 256; t339 = t154 + t151 + t148; t340 = t339 / 256; t341 = t339 % 256; t342 = t163 + t265 + t268; t343 = t342 / 256; t344 = t342 % 256; t345 = t172 + t169 + t166; t346 = t345 / 256; t347 = t345 % 256; t348 = t182 + t179 + t176; t349 = t348 / 256; t350 = t348 % 256; t351 = t188 + t185 + t181; t352 = t351 / 256; t353 = t351 % 256; // reduce heights of each column to 4 t354 = t17 + t14; t355 = t354 / 256; t356 = t354 % 256; t357 = t13 + t10; t358 = t357 / 256; t359 = t357 % 256; t360 = t23 + t20 + t16; t361 = t360 / 256; t362 = t360 % 256; t363 = t271 + t275 + t278; t364 = t363 / 256; t365 = t363 % 256; t366 = t25 + t22 + t19; t367 = t366 / 256; t368 = t366 % 256; t369 = t281 + t284 + t287; t370 = t369 / 256; t371 = t369 % 256; t372 = t206 + t274 + t277; t373 = t372 / 256; t374 = t372 % 256; t375 = t290 + t293 + t296; t376 = t375 / 256; t377 = t375 % 256; t378 = t280 + t283 + t286; t379 = t378 / 256; t380 = t378 % 256; t381 = t299 + t302 + t305; t382 = t381 / 256; t383 = t381 % 256; t384 = t289 + t292 + t295; t385 = t384 / 256; t386 = t384 % 256; t387 = t308 + t311 + t314; t388 = t387 / 256; t389 = t387 % 256; t390 = t298 + t301 + t304; t391 = t390 / 256; t392 = t390 % 256; t393 = t317 + t320 + t323; t394 = t393 / 256; t395 = t393 % 256; t396 = t307 + t310 + t313; t397 = t396 / 256; t398 = t396 % 256; t399 = t326 + t329 + t332; t400 = t399 / 256; t401 = t399 % 256; t402 = t316 + t319 + t322; t403 = t402 / 256; t404 = t402 % 256; t405 = t335 + t338 + t341; t406 = t405 / 256; t407 = t405 % 256; t408 = t325 + t328 + t331; t409 = t408 / 256; t410 = t408 % 256; t411 = t344 + t347 + t350; t412 = t411 / 256; t413 = t411 % 256; t414 = t334 + t337 + t340; t415 = t414 / 256; t416 = t414 % 256; t417 = t346 + t349 + t353; t418 = t417 / 256; t419 = t417 % 256; t420 = t178 + t175 + t343; t421 = t420 / 256; t422 = t420 % 256; t423 = t191 + t187 + t184; t424 = t423 / 256; t425 = t423 % 256; // reduce heights of each column to 3 t426 = t11 + t7; t427 = t426 / 256; t428 = t426 % 256; t429 = t272 + t355 + t359; t430 = t429 / 256; t431 = t429 % 256; t432 = t358 + t361 + t365; t433 = t432 / 256; t434 = t432 % 256; t435 = t364 + t367 + t371; t436 = t435 / 256; t437 = t435 % 256; t438 = t370 + t373 + t377; t439 = t438 / 256; t440 = t438 % 256; t441 = t376 + t379 + t383; t442 = t441 / 256; t443 = t441 % 256; t444 = t382 + t385 + t389; t445 = t444 / 256; t446 = t444 % 256; t447 = t388 + t391 + t395; t448 = t447 / 256; t449 = t447 % 256; t450 = t394 + t397 + t401; t451 = t450 / 256; t452 = t450 % 256; t453 = t400 + t403 + t407; t454 = t453 / 256; t455 = t453 % 256; t456 = t406 + t409 + t413; t457 = t456 / 256; t458 = t456 % 256; t459 = t412 + t415 + t419; t460 = t459 / 256; t461 = t459 % 256; t462 = t352 + t418 + t421; t463 = t462 / 256; t464 = t462 % 256; // reduce heights of each column to 2 t465 = t8 + t5; t466 = t465 / 256; t467 = t465 % 256; t468 = t4 + t356 + t428; t469 = t468 / 256; t470 = t468 % 256; t471 = t362 + t427 + t431; t472 = t471 / 256; t473 = t471 % 256; t474 = t368 + t430 + t434; t475 = t474 / 256; t476 = t474 % 256; t477 = t374 + t433 + t437; t478 = t477 / 256; t479 = t477 % 256; t480 = t380 + t436 + t440; t481 = t480 / 256; t482 = t480 % 256; t483 = t386 + t439 + t443; t484 = t483 / 256; t485 = t483 % 256; t486 = t392 + t442 + t446; t487 = t486 / 256; t488 = t486 % 256; t489 = t398 + t445 + t449; t490 = t489 / 256; t491 = t489 % 256; t492 = t404 + t448 + t452; t493 = t492 / 256; t494 = t492 % 256; t495 = t410 + t451 + t455; t496 = t495 / 256; t497 = t495 % 256; t498 = t416 + t454 + t458; t499 = t498 / 256; t500 = t498 % 256; t501 = t422 + t457 + t461; t502 = t501 / 256; t503 = t501 % 256; t504 = t425 + t460 + t464; t505 = t504 / 256; t506 = t504 % 256; t507 = t190 + t424 + t463; t508 = t507 / 256; t509 = t507 % 256; // preliminary addition of the two remaining numbers t510 = t1 + t467; t511 = t466 + t470; t512 = t469 + t473; t513 = t472 + t476; t514 = t475 + t479; t515 = t478 + t482; t516 = t481 + t485; t517 = t484 + t488; t518 = t487 + t491; t519 = t490 + t494; t520 = t493 + t497; t521 = t496 + t500; t522 = t499 + t503; t523 = t502 + t506; t524 = t505 + t509; // compute generate and propagate pairs t525 = t510 > 255; t526 = t510 == 255; t527 = t511 > 255; t528 = t511 == 255; t529 = t512 > 255; t530 = t512 == 255; t531 = t513 > 255; t532 = t513 == 255; t533 = t514 > 255; t534 = t514 == 255; t535 = t515 > 255; t536 = t515 == 255; t537 = t516 > 255; t538 = t516 == 255; t539 = t517 > 255; t540 = t517 == 255; t541 = t518 > 255; t542 = t518 == 255; t543 = t519 > 255; t544 = t519 == 255; t545 = t520 > 255; t546 = t520 == 255; t547 = t521 > 255; t548 = t521 == 255; t549 = t522 > 255; t550 = t522 == 255; t551 = t523 > 255; t552 = t523 == 255; t553 = t524 > 255; t554 = t524 == 255; // parallel prefix tree for computing carry bits // up-level 1 t527 = t528 & t525 | t527; t528 = t528 & t526; t531 = t532 & t529 | t531; t532 = t532 & t530; t535 = t536 & t533 | t535; t536 = t536 & t534; t539 = t540 & t537 | t539; t540 = t540 & t538; t543 = t544 & t541 | t543; t544 = t544 & t542; t547 = t548 & t545 | t547; t548 = t548 & t546; t551 = t552 & t549 | t551; t552 = t552 & t550; // up-level 2 t531 = t532 & t527 | t531; t532 = t532 & t528; t539 = t540 & t535 | t539; t540 = t540 & t536; t547 = t548 & t543 | t547; t548 = t548 & t544; // up-level 3 t539 = t540 & t531 | t539; t540 = t540 & t532; // down-level 5 t547 = t548 & t539 | t547; t548 = t548 & t540; // down-level 6 t551 = t552 & t547 | t551; t552 = t552 & t548; t535 = t536 & t531 | t535; t536 = t536 & t532; t551 = t552 & t547 | t551; t552 = t552 & t548; t543 = t544 & t539 | t543; t544 = t544 & t540; t551 = t552 & t547 | t551; t552 = t552 & t548; // down-level 7 t553 = t554 & t543 | t553; t554 = t554 & t544; t529 = t530 & t527 | t529; t530 = t530 & t528; t553 = t554 & t543 | t553; t554 = t554 & t544; t533 = t534 & t531 | t533; t534 = t534 & t532; t553 = t554 & t543 | t553; t554 = t554 & t544; t537 = t538 & t551 | t537; t538 = t538 & t552; t553 = t554 & t543 | t553; t554 = t554 & t544; t541 = t542 & t535 | t541; t542 = t542 & t536; t553 = t554 & t543 | t553; t554 = t554 & t544; t545 = t546 & t539 | t545; t546 = t546 & t540; t553 = t554 & t543 | t553; t554 = t554 & t544; t549 = t550 & t551 | t549; t550 = t550 & t552; t553 = t554 & t543 | t553; t554 = t554 & t544; // compute final sum digits as the digits of the product t524 = t524 + (nat) (t551&(bool)1); t523 = t523 + (nat) (t549&(bool)1); t522 = t522 + (nat) (t547&(bool)1); t521 = t521 + (nat) (t545&(bool)1); t520 = t520 + (nat) (t543&(bool)1); t519 = t519 + (nat) (t541&(bool)1); t518 = t518 + (nat) (t539&(bool)1); t517 = t517 + (nat) (t537&(bool)1); t516 = t516 + (nat) (t535&(bool)1); t515 = t515 + (nat) (t533&(bool)1); t514 = t514 + (nat) (t531&(bool)1); t513 = t513 + (nat) (t529&(bool)1); t512 = t512 + (nat) (t527&(bool)1); t511 = t511 + (nat) (t525&(bool)1); // get the product digits p0 = t2; p1 = t510 % 256; p2 = t511 % 256; p3 = t512 % 256; p4 = t513 % 256; p5 = t514 % 256; p6 = t515 % 256; p7 = t516 % 256; p8 = t517 % 256; p9 = t518 % 256; p10 = t519 % 256; p11 = t520 % 256; p12 = t521 % 256; p13 = t522 % 256; p14 = t523 % 256; p15 = t524 % 256; }