/*** * This code is a part of EvoApproxLib library (ehw.fit.vutbr.cz/approxlib) distributed under The MIT License. * When used, please cite the following article(s): V. Mrazek, S. S. Sarwar, L. Sekanina, Z. Vasicek and K. Roy, "Design of power-efficient approximate multipliers for approximate artificial neural networks," 2016 IEEE/ACM International Conference on Computer-Aided Design (ICCAD), Austin, TX, 2016, pp. 1-7. doi: 10.1145/2966986.2967021 * This file contains a circuit from a sub-set of pareto optimal circuits with respect to the pwr and mae parameters ***/ // MAE% = 1.18 % // MAE = 49343 // WCE% = 6.03 % // WCE = 252964 // WCRE% = 3051.52 % // EP% = 99.90 % // MRE% = 19.95 % // MSE = 37290.89e5 // PDK45_PWR = 0.236 mW // PDK45_AREA = 524.2 um2 // PDK45_DELAY = 1.13 ns #include #include uint64_t mul11u_09Z(uint64_t a, uint64_t b) { int wa[11]; int wb[11]; uint64_t y = 0; wa[0] = (a >> 0) & 0x01; wb[0] = (b >> 0) & 0x01; wa[1] = (a >> 1) & 0x01; wb[1] = (b >> 1) & 0x01; wa[2] = (a >> 2) & 0x01; wb[2] = (b >> 2) & 0x01; wa[3] = (a >> 3) & 0x01; wb[3] = (b >> 3) & 0x01; wa[4] = (a >> 4) & 0x01; wb[4] = (b >> 4) & 0x01; wa[5] = (a >> 5) & 0x01; wb[5] = (b >> 5) & 0x01; wa[6] = (a >> 6) & 0x01; wb[6] = (b >> 6) & 0x01; wa[7] = (a >> 7) & 0x01; wb[7] = (b >> 7) & 0x01; wa[8] = (a >> 8) & 0x01; wb[8] = (b >> 8) & 0x01; wa[9] = (a >> 9) & 0x01; wb[9] = (b >> 9) & 0x01; wa[10] = (a >> 10) & 0x01; wb[10] = (b >> 10) & 0x01; int sig_30 = wa[8] & wb[7]; int sig_75 = ~(wb[0] | wb[4]); int sig_76 = wa[10] & wb[4]; int sig_86 = wa[9] & wb[5]; int sig_87 = wa[10] & wb[5]; int sig_95 = wa[0] & wb[0]; int sig_96 = wa[8] & wb[6]; int sig_97 = wa[9] & wb[6]; int sig_98 = wa[10] & wb[6]; int sig_106 = wa[7] & wb[5]; int sig_107 = wa[8] & wb[7]; int sig_108 = wa[9] & wb[7]; int sig_109 = wa[10] & wb[7]; int sig_114 = wa[4] & wb[8]; int sig_116 = wa[6] & wb[8]; int sig_117 = wa[7] & wb[8]; int sig_118 = wa[8] & wb[8]; int sig_119 = wa[9] & wb[8]; int sig_120 = wa[10] & wb[8]; int sig_127 = wa[6] & wb[9]; int sig_128 = wa[7] & wb[9]; int sig_129 = wa[8] & wb[9]; int sig_130 = wa[9] & wb[9]; int sig_131 = wa[10] & wb[9]; int sig_137 = wa[5] & wb[10]; int sig_138 = wa[6] & wb[10]; int sig_139 = wa[7] & wb[10]; int sig_140 = wa[8] & wb[10]; int sig_141 = wa[9] & wb[10]; int sig_142 = wa[10] & wb[10]; int sig_156 = wb[6] & wa[5]; int sig_235 = wa[1] & sig_75; int sig_238 = sig_235; int sig_239 = sig_76 & sig_86; int sig_240 = sig_76 ^ sig_86; int sig_243 = wb[7] & wa[10]; int sig_269 = sig_95 & wb[6]; int sig_272 = sig_269 | wb[4]; int sig_273 = sig_96; int sig_274 = wa[8] & sig_106; int sig_275 = sig_273 & sig_116; int sig_276 = sig_273 ^ sig_116; int sig_277 = sig_274 | sig_275; int sig_278 = sig_97 ^ sig_107; int sig_279 = sig_97 & sig_107; int sig_280 = sig_278 & sig_117; int sig_282 = sig_279 | sig_280; int sig_283 = sig_98 ^ sig_108; int sig_284 = sig_98 & sig_108; int sig_285 = sig_283 & sig_118; int sig_286 = sig_283 ^ sig_118; int sig_287 = sig_284 | sig_285; int sig_288 = sig_109 & sig_119; int sig_289 = sig_109 ^ sig_119; int sig_376 = sig_238 ^ sig_276; int sig_377 = sig_238 & sig_276; int sig_378 = sig_376 & sig_272; int sig_379 = sig_376 ^ sig_272; int sig_380 = sig_377 | sig_378; int sig_381 = sig_239; int sig_382 = sig_239 & wa[3]; int sig_384 = sig_381 ^ sig_277; int sig_385 = sig_382; int sig_386 = sig_286 & sig_282; int sig_387 = sig_286 ^ sig_282; int sig_388 = sig_289 & sig_287; int sig_389 = sig_289 ^ sig_287; int sig_390 = sig_120 & sig_288; int sig_391 = sig_120 ^ sig_288; int sig_420 = wb[3]; int sig_441 = sig_240 & sig_379; int sig_442 = sig_240 ^ sig_379; int sig_443 = sig_87 & sig_384; int sig_444 = sig_87 ^ sig_384; int sig_472 = sig_380 ^ sig_127; int sig_473 = sig_380 & sig_127; int sig_474 = sig_472 & sig_137; int sig_475 = sig_472 ^ sig_137; int sig_476 = sig_473 | sig_474; int sig_477 = sig_385 ^ sig_128; int sig_478 = sig_385 & sig_128; int sig_479 = sig_477 & sig_138; int sig_480 = sig_477 ^ sig_138; int sig_481 = sig_478 | sig_479; int sig_482 = sig_386 ^ sig_129; int sig_483 = sig_386 & sig_129; int sig_484 = sig_482 & sig_139; int sig_485 = sig_482 ^ sig_139; int sig_486 = sig_483 | sig_484; int sig_487 = sig_388 ^ sig_130; int sig_488 = sig_388 & sig_130; int sig_489 = sig_487 & sig_140; int sig_490 = sig_487 ^ sig_140; int sig_491 = sig_488 | sig_489; int sig_492 = sig_390 ^ sig_131; int sig_493 = sig_390 & sig_131; int sig_494 = sig_492 & sig_141; int sig_495 = sig_492 ^ sig_141; int sig_496 = sig_493 | sig_494; int sig_519 = wa[10] & sig_420; int sig_538 = wa[5]; int sig_539 = sig_442 & wb[6]; int sig_540 = !sig_538; int sig_542 = sig_539 | sig_540; int sig_543 = sig_444 ^ sig_441; int sig_544 = sig_444 | sig_441; int sig_545 = sig_543 & wb[2]; int sig_546 = sig_543 ^ sig_475; int sig_547 = sig_544 | sig_545; int sig_548 = sig_387 ^ sig_443; int sig_549 = sig_387 & sig_443; int sig_550 = sig_548 & sig_480; int sig_551 = sig_548 ^ sig_480; int sig_552 = sig_549 | sig_550; int sig_553 = sig_389 & sig_485; int sig_554 = sig_389 ^ sig_485; int sig_555 = sig_391 & sig_490; int sig_556 = sig_391 ^ sig_490; int sig_575 = wa[8] ^ wa[8]; int sig_591 = wb[8] & wa[5]; int sig_592 = sig_546 ^ sig_542; int sig_593 = sig_546 & sig_542; int sig_595 = !sig_592; int sig_596 = sig_593; int sig_597 = sig_551 ^ sig_547; int sig_598 = sig_551 & sig_547; int sig_599 = sig_597 & sig_476; int sig_600 = sig_597 ^ sig_476; int sig_601 = sig_598 | sig_599; int sig_602 = sig_554 ^ sig_552; int sig_603 = sig_554 & sig_552; int sig_604 = sig_602 & sig_481; int sig_605 = sig_602 ^ sig_481; int sig_606 = sig_603 | sig_604; int sig_607 = sig_556 ^ sig_553; int sig_608 = sig_556 & sig_553; int sig_609 = sig_607 & sig_486; int sig_610 = sig_607 ^ sig_486; int sig_611 = sig_608 | sig_609; int sig_612 = sig_495 ^ sig_555; int sig_613 = sig_495 & sig_555; int sig_614 = sig_612 & sig_491; int sig_615 = sig_612 ^ sig_491; int sig_616 = sig_613 | sig_614; int sig_617 = sig_142 & sig_496; int sig_618 = sig_142 ^ sig_496; int sig_621 = wa[2]; int sig_623 = sig_621 & wb[7]; int sig_625 = wa[1] | sig_623; int sig_652 = sig_575 & wa[5]; int sig_655 = sig_652; int sig_691 = ~(sig_625 | wa[0]); int sig_692 = sig_655 & sig_691; int sig_693 = wb[6] & sig_625; int sig_694 = sig_692 ^ sig_693; int sig_707 = sig_595 ^ sig_591; int sig_708 = wb[3] & wa[10]; int sig_709 = sig_707 & wb[6]; int sig_711 = sig_708 | sig_709; int sig_748 = sig_711 & wa[7]; int sig_749 = wa[6] & sig_694; int sig_750 = sig_748 | sig_749; int sig_751 = sig_600 ^ sig_596; int sig_752 = sig_600 & sig_596; int sig_753 = sig_605 ^ sig_601; int sig_754 = sig_605 & sig_601; int sig_755 = sig_753 & sig_752; int sig_756 = sig_753 ^ sig_752; int sig_757 = sig_754 | sig_755; int sig_758 = sig_610 ^ sig_606; int sig_759 = sig_610 & sig_606; int sig_760 = sig_758 & sig_757; int sig_761 = sig_758 ^ sig_757; int sig_762 = sig_759 | sig_760; int sig_763 = sig_615 ^ sig_611; int sig_764 = sig_615 & sig_611; int sig_765 = sig_763 & sig_762; int sig_766 = sig_763 ^ sig_762; int sig_767 = sig_764 | sig_765; int sig_768 = ~(sig_600 ^ wa[2]); int sig_769 = sig_600 & wb[9]; int sig_770 = !sig_768; int sig_771 = sig_769 | sig_768; int sig_772 = sig_605 ^ sig_601; int sig_773 = sig_605 & sig_601; int sig_774 = sig_772 & sig_771; int sig_775 = sig_772 ^ sig_771; int sig_776 = sig_773 ^ sig_774; int sig_777 = sig_610 ^ sig_606; int sig_778 = sig_610 & sig_606; int sig_779 = sig_777 & sig_776; int sig_780 = sig_777 ^ sig_776; int sig_781 = sig_778 | sig_779; int sig_782 = sig_615 ^ sig_611; int sig_783 = sig_615 & sig_611; int sig_784 = sig_782 & sig_781; int sig_785 = sig_782 ^ sig_781; int sig_786 = sig_783 | sig_784; int sig_787 = !sig_750; int sig_788 = sig_751 & sig_787; int sig_789 = sig_770 & sig_750; int sig_790 = sig_788 | sig_789; int sig_791 = !sig_750; int sig_792 = sig_756 & sig_791; int sig_793 = sig_775 & sig_750; int sig_794 = sig_792 | sig_793; int sig_795 = !sig_750; int sig_796 = sig_761 & sig_795; int sig_797 = sig_780 & sig_750; int sig_798 = sig_796 | sig_797; int sig_799 = !sig_750; int sig_800 = sig_766 & sig_799; int sig_801 = sig_785 & sig_750; int sig_802 = sig_800 ^ sig_801; int sig_803 = !sig_750; int sig_804 = sig_767 & sig_803; int sig_805 = sig_786 & sig_750; int sig_806 = sig_804 | sig_805; int sig_807 = sig_618 ^ sig_616; int sig_808 = sig_618 & sig_616; int sig_810 = sig_617 ^ sig_808; int sig_811 = sig_618 ^ sig_616; int sig_812 = wa[6] & sig_616; int sig_813 = !sig_811; int sig_814 = sig_812 | sig_811; int sig_816 = sig_617 ^ sig_814; int sig_817 = !sig_806; int sig_818 = sig_807 & sig_817; int sig_819 = sig_813 & sig_806; int sig_820 = sig_818 | sig_819; int sig_821 = !sig_806; int sig_822 = sig_810 & sig_821; int sig_823 = sig_816 & sig_806; int sig_824 = sig_822 | sig_823; y |= (sig_492 & 0x01) << 0; // default output y |= (sig_602 & 0x01) << 1; // default output y |= (sig_603 & 0x01) << 2; // default output y |= (sig_30 & 0x01) << 3; // default output y |= (sig_276 & 0x01) << 4; // default output y |= (sig_519 & 0x01) << 5; // default output y |= (sig_243 & 0x01) << 6; // default output y |= (sig_114 & 0x01) << 7; // default output y |= (sig_156 & 0x01) << 8; // default output y |= (sig_443 & 0x01) << 9; // default output y |= (sig_616 & 0x01) << 10; // default output y |= (sig_794 & 0x01) << 11; // default output y |= (sig_796 & 0x01) << 12; // default output y |= (sig_614 & 0x01) << 13; // default output y |= (sig_800 & 0x01) << 14; // default output y |= (sig_472 & 0x01) << 15; // default output y |= (sig_790 & 0x01) << 16; // default output y |= (sig_794 & 0x01) << 17; // default output y |= (sig_798 & 0x01) << 18; // default output y |= (sig_802 & 0x01) << 19; // default output y |= (sig_820 & 0x01) << 20; // default output y |= (sig_824 & 0x01) << 21; // default output return y; }