% 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, R. Hrbacek, Z. Vasicek and L. Sekanina, "EvoApprox8b: Library of approximate adders and multipliers for circuit design and benchmarking of approximation methods". Design, Automation & Test in Europe Conference & Exhibition (DATE), 2017, Lausanne, 2017, pp. 258-261. doi: 10.23919/DATE.2017.7926993 
% This file contains a circuit from evoapprox8b dataset. Note that a new version of library was already published.

function [ c ] = mul8_359( a, b )
% Approximate function mul8_359
%  Library = EvoApprox8b
%  Circuit = mul8_359
%  Area   (180) = 10046
%  Delay  (180) = 3.270
%  Power  (180) = 4270.50
%  Area   (45) = 733
%  Delay  (45) = 1.210
%  Power  (45) = 364.80
%  Nodes = 186
%  HD = 278254
%  MAE = 98.00250
%  MSE = 17557.46289
%  MRE = 2.96 %
%  WCE = 766
%  WCRE = 200 %
%  EP = 97.3 %
  a = uint16(a);
  b = uint16(b);
  c = 0;
  n0 = bitand(bitshift(a, -0), 1, 'uint16');
  n2 = bitand(bitshift(a, -1), 1, 'uint16');
  n4 = bitand(bitshift(a, -2), 1, 'uint16');
  n6 = bitand(bitshift(a, -3), 1, 'uint16');
  n8 = bitand(bitshift(a, -4), 1, 'uint16');
  n10 = bitand(bitshift(a, -5), 1, 'uint16');
  n12 = bitand(bitshift(a, -6), 1, 'uint16');
  n14 = bitand(bitshift(a, -7), 1, 'uint16');
  n16 = bitand(bitshift(b, -0), 1, 'uint16');
  n18 = bitand(bitshift(b, -1), 1, 'uint16');
  n20 = bitand(bitshift(b, -2), 1, 'uint16');
  n22 = bitand(bitshift(b, -3), 1, 'uint16');
  n24 = bitand(bitshift(b, -4), 1, 'uint16');
  n26 = bitand(bitshift(b, -5), 1, 'uint16');
  n28 = bitand(bitshift(b, -6), 1, 'uint16');
  n30 = bitand(bitshift(b, -7), 1, 'uint16');
  n32 = bitand(n18, n12);
  n33 = bitand(n18, n12);
  n34 = bitcmp(bitand(n30, bitand(n12, n10)));
  n35 = bitcmp(bitand(n30, bitand(n12, n10)));
  n37 = n2;
  n38 = bitcmp(n28);
  n41 = bitcmp(bitor(n18, bitor(n12, n35)));
  n42 = bitcmp(bitor(n33, bitor(n34, n6)));
  n43 = bitcmp(bitor(n33, bitor(n34, n6)));
  n44 = bitxor(bitxor(n18, n20), n35);
  n45 = bitor(bitor(bitand(n18, n20), bitand(n20, n35)), bitand(n18, n35));
  n46 = bitand(n33, n12);
  n47 = bitand(n33, n12);
  n49 = bitcmp(bitand(n41, bitand(n38, n0)));
  n50 = n22;
  n51 = n22;
  n52 = bitxor(n18, n42);
  n54 = bitcmp(bitand(n22, n46));
  n55 = bitcmp(bitand(n22, n46));
  n57 = bitcmp(bitor(n33, bitor(n54, n0)));
  n58 = bitcmp(bitand(n55, bitand(n52, n57)));
  n62 = bitxor(n43, n0);
  n67 = n10;
  n69 = bitcmp(bitxor(n33, n20));
  n70 = n47;
  n71 = n47;
  n73 = bitcmp(bitand(n70, bitand(n62, n6)));
  n76 = bitcmp(bitor(n18, n54));
  n77 = bitcmp(bitor(n18, n54));
  n78 = bitcmp(bitand(n37, n28));
  n79 = bitcmp(bitand(n37, n28));
  n80 = bitcmp(bitand(n18, n71));
  n82 = bitcmp(n45);
  n83 = bitcmp(n45);
  n85 = bitcmp(bitor(n69, n4));
  n86 = bitor(n49, n32);
  n89 = bitcmp(bitxor(n18, n78));
  n91 = bitcmp(bitand(bitor(n45, n16), n37));
  n93 = n89;
  n95 = bitor(bitand(n73, n80), bitand(bitcmp(n73), n67));
  n99 = bitcmp(bitor(bitand(n43, n54), n18));
  n100 = bitcmp(bitor(bitand(n85, n58), n79));
  n104 = bitcmp(bitor(n33, n46));
  n105 = bitcmp(bitor(n33, n46));
  n106 = bitand(n10, n70);
  n107 = bitand(n10, n70);
  n109 = bitcmp(bitxor(n77, n86));
  n110 = bitcmp(n95);
  n114 = bitcmp(bitand(bitor(n10, n32), n37));
  n121 = bitand(n12, n16);
  n131 = bitor(bitand(n107, n50), bitand(bitcmp(n107), n99));
  n133 = bitor(n10, n86);
  n134 = bitand(n14, n16);
  n137 = bitcmp(bitor(n73, bitor(n28, n91)));
  n138 = n41;
  n139 = n41;
  n141 = bitcmp(bitor(n26, bitor(n46, n55)));
  n142 = bitcmp(bitor(bitand(n99, n86), n49));
  n144 = bitcmp(bitand(n73, n134));
  n150 = bitcmp(bitand(n93, n20));
  n153 = bitcmp(bitor(n57, bitor(n38, n144)));
  n169 = bitcmp(bitand(n49, bitand(n110, n139)));
  n181 = bitcmp(bitand(n169, n142));
  n193 = bitcmp(bitor(bitand(n18, n12), n83));
  n201 = bitcmp(n169);
  n218 = bitxor(bitxor(n105, n44), n133);
  n224 = bitand(n10, n18);
  n227 = bitcmp(bitand(n10, n100));
  n229 = bitxor(n109, n42);
  n238 = bitand(n12, n18);
  n239 = bitand(n12, n18);
  n251 = n141;
  n252 = bitcmp(bitor(n181, n46));
  n254 = bitand(n14, n18);
  n269 = bitcmp(bitand(n153, bitand(n218, n251)));
  n285 = n229;
  n294 = bitcmp(bitor(n269, n82));
  n313 = bitand(n6, n20);
  n321 = bitand(n18, n134);
  n343 = bitand(n10, n20);
  n356 = bitand(n12, n20);
  n372 = bitand(n14, n20);
  n393 = bitand(n153, n150);
  n401 = bitand(n201, n294);
  n406 = bitcmp(n239);
  n414 = bitor(bitand(n33, n252), bitand(bitcmp(n33), n37));
  n416 = bitcmp(bitand(n4, bitand(n22, n6)));
  n432 = bitand(n6, n22);
  n446 = bitand(n8, n22);
  n460 = bitand(n10, n22);
  n476 = bitand(n12, n22);
  n480 = bitcmp(n393);
  n490 = bitand(n14, n22);
  n510 = bitxor(bitxor(n131, n480), n93);
  n533 = bitand(n193, n4);
  n534 = bitand(n4, n24);
  n535 = bitand(n4, n24);
  n550 = bitand(n6, n24);
  n564 = bitand(n8, n24);
  n566 = n141;
  n580 = bitand(n10, n24);
  n581 = bitand(n10, n24);
  n594 = bitand(n12, n24);
  n608 = bitand(n14, n24);
  n617 = bitcmp(n137);
  n638 = bitand(n2, n26);
  n645 = bitand(n401, n414);
  n651 = bitcmp(bitor(n645, n114));
  n654 = bitand(n4, n26);
  n668 = bitand(n6, n26);
  n678 = bitor(bitand(n321, n104), bitand(bitcmp(n321), n227));
  n682 = bitand(n8, n26);
  n686 = n139;
  n698 = bitand(n10, n26);
  n712 = bitand(n12, n26);
  n728 = bitand(n14, n26);
  n729 = bitand(n14, n26);
  n745 = bitcmp(bitand(n313, bitand(n535, n651)));
  n756 = bitand(n2, n138);
  n772 = bitand(n4, n28);
  n786 = bitand(n6, n28);
  n802 = bitand(n8, n28);
  n816 = bitand(n10, n28);
  n832 = bitand(n12, n28);
  n846 = bitand(n14, n28);
  n860 = bitand(n0, n30);
  n869 = bitand(n533, n414);
  n876 = bitand(n2, n30);
  n890 = bitand(n4, n30);
  n902 = n869;
  n905 = bitxor(n745, n678);
  n906 = bitand(n6, n30);
  n920 = bitand(n8, n30);
  n934 = bitand(n10, n30);
  n950 = bitand(n12, n30);
  n964 = bitand(n14, n30);
  n965 = bitand(n14, n30);
  n980 = n46;
  n1009 = bitor(bitand(n51, n566), bitand(bitcmp(n51), n76));
  n1038 = bitcmp(bitand(n106, n16));
  n1054 = bitor(n121, n224);
  n1055 = bitor(n121, n224);
  n1068 = bitxor(bitxor(n134, n238), n343);
  n1069 = bitor(bitor(bitand(n134, n238), bitand(n238, n343)), bitand(n134, n343));
  n1082 = bitand(n254, n356);
  n1098 = bitxor(n254, n356);
  n1129 = bitand(n416, n638);
  n1136 = bitcmp(bitxor(n905, n902));
  n1143 = bitxor(n432, n534);
  n1156 = bitxor(bitxor(n446, n550), n654);
  n1157 = bitor(bitor(bitand(n446, n550), bitand(n550, n654)), bitand(n446, n654));
  n1172 = bitxor(bitxor(n460, n564), n668);
  n1173 = bitor(bitor(bitand(n460, n564), bitand(n564, n668)), bitand(n460, n668));
  n1186 = bitxor(bitxor(n476, n580), n682);
  n1187 = bitor(bitor(bitand(n476, n580), bitand(n580, n682)), bitand(n476, n682));
  n1191 = bitxor(n617, n510);
  n1202 = bitxor(bitxor(n490, n594), n698);
  n1203 = bitor(bitor(bitand(n490, n594), bitand(n594, n698)), bitand(n490, n698));
  n1232 = bitxor(n608, n712);
  n1233 = bitand(n608, n712);
  n1246 = n533;
  n1276 = bitand(n581, n1009);
  n1277 = bitand(n581, n1009);
  n1291 = n1038;
  n1306 = bitand(n1054, n686);
  n1320 = bitxor(bitxor(n1068, n1055), n1156);
  n1321 = bitor(bitor(bitand(n1068, n1055), bitand(n1055, n1156)), bitand(n1068, n1156));
  n1334 = bitxor(bitxor(n1098, n1069), n1172);
  n1335 = bitor(bitor(bitand(n1098, n1069), bitand(n1069, n1172)), bitand(n1098, n1172));
  n1350 = bitxor(bitxor(n372, n1082), n1186);
  n1351 = bitor(bitor(bitand(n372, n1082), bitand(n1082, n1186)), bitand(n372, n1186));
  n1365 = bitand(n1129, n406);
  n1380 = bitxor(bitxor(n1143, n756), n860);
  n1381 = bitor(bitor(bitand(n1143, n756), bitand(n756, n860)), bitand(n1143, n860));
  n1394 = bitxor(bitxor(n1157, n772), n876);
  n1395 = bitor(bitor(bitand(n1157, n772), bitand(n772, n876)), bitand(n1157, n876));
  n1408 = bitxor(bitxor(n1173, n786), n890);
  n1409 = bitor(bitor(bitand(n1173, n786), bitand(n786, n890)), bitand(n1173, n890));
  n1424 = bitxor(bitxor(n1187, n802), n906);
  n1425 = bitor(bitor(bitand(n1187, n802), bitand(n802, n906)), bitand(n1187, n906));
  n1427 = bitcmp(bitor(bitand(n1191, n1136), n285));
  n1438 = bitxor(bitxor(n1203, n816), n920);
  n1439 = bitor(bitor(bitand(n1203, n816), bitand(n816, n920)), bitand(n1203, n920));
  n1454 = bitxor(bitxor(n1233, n832), n934);
  n1455 = bitor(bitor(bitand(n1233, n832), bitand(n832, n934)), bitand(n1233, n934));
  n1468 = bitand(n846, n950);
  n1482 = bitxor(n846, n950);
  n1498 = n965;
  n1499 = n965;
  n1513 = n1276;
  n1529 = bitand(n729, n1277);
  n1542 = bitand(n1306, n1291);
  n1543 = bitand(n1306, n1291);
  n1556 = bitxor(bitxor(n1320, n1082), n1380);
  n1557 = bitor(bitor(bitand(n1320, n1082), bitand(n1082, n1380)), bitand(n1320, n1380));
  n1572 = bitxor(bitxor(n1334, n1321), n1394);
  n1573 = bitor(bitor(bitand(n1334, n1321), bitand(n1321, n1394)), bitand(n1334, n1394));
  n1586 = bitxor(bitxor(n1350, n1335), n1408);
  n1587 = bitor(bitor(bitand(n1350, n1335), bitand(n1335, n1408)), bitand(n1350, n1408));
  n1602 = bitxor(bitxor(n1202, n1351), n1424);
  n1603 = bitor(bitor(bitand(n1202, n1351), bitand(n1351, n1424)), bitand(n1202, n1424));
  n1616 = bitand(n1232, n1438);
  n1632 = bitxor(n1232, n1438);
  n1646 = bitand(n728, n1454);
  n1660 = bitxor(n728, n1454);
  n1676 = bitor(n1529, n1499);
  n1677 = bitor(n1529, n1499);
  n1691 = bitand(n343, n1513);
  n1706 = bitxor(n1542, n1529);
  n1707 = bitand(n1542, n1529);
  n1720 = bitxor(bitxor(n1556, n1543), n1365);
  n1721 = bitor(bitor(bitand(n1556, n1543), bitand(n1543, n1365)), bitand(n1556, n1365));
  n1734 = bitxor(bitxor(n1572, n1557), n1381);
  n1735 = bitor(bitor(bitand(n1572, n1557), bitand(n1557, n1381)), bitand(n1572, n1381));
  n1750 = bitxor(bitxor(n1586, n1573), n1395);
  n1751 = bitor(bitor(bitand(n1586, n1573), bitand(n1573, n1395)), bitand(n1586, n1395));
  n1764 = bitxor(bitxor(n1602, n1587), n1409);
  n1765 = bitor(bitor(bitand(n1602, n1587), bitand(n1587, n1409)), bitand(n1602, n1409));
  n1780 = bitxor(bitxor(n1632, n1603), n1425);
  n1781 = bitor(bitor(bitand(n1632, n1603), bitand(n1603, n1425)), bitand(n1632, n1425));
  n1794 = bitxor(bitxor(n1660, n1616), n1439);
  n1795 = bitor(bitor(bitand(n1660, n1616), bitand(n1616, n1439)), bitand(n1660, n1439));
  n1808 = bitxor(bitxor(n1482, n1646), n1455);
  n1809 = bitor(bitor(bitand(n1482, n1646), bitand(n1646, n1455)), bitand(n1482, n1455));
  n1824 = bitand(n964, n1468);
  n1838 = bitxor(n964, n1468);
  n1854 = bitxor(n1427, n1677);
  n1869 = bitand(n1706, n1691);
  n1882 = bitxor(bitxor(n1720, n1707), n1869);
  n1898 = bitxor(n1734, n1721);
  n1899 = bitand(n1734, n1721);
  n1912 = bitxor(bitxor(n1750, n1735), n1899);
  n1913 = bitor(bitor(bitand(n1750, n1735), bitand(n1735, n1899)), bitand(n1750, n1899));
  n1928 = bitxor(bitxor(n1764, n1751), n1913);
  n1929 = bitor(bitor(bitand(n1764, n1751), bitand(n1751, n1913)), bitand(n1764, n1913));
  n1942 = bitxor(bitxor(n1780, n1765), n1929);
  n1943 = bitor(bitor(bitand(n1780, n1765), bitand(n1765, n1929)), bitand(n1780, n1929));
  n1956 = bitxor(bitxor(n1794, n1781), n1943);
  n1957 = bitor(bitor(bitand(n1794, n1781), bitand(n1781, n1943)), bitand(n1794, n1943));
  n1972 = bitxor(bitxor(n1808, n1795), n1957);
  n1973 = bitor(bitor(bitand(n1808, n1795), bitand(n1795, n1957)), bitand(n1808, n1957));
  n1986 = bitxor(bitxor(n1838, n1809), n1973);
  n1987 = bitor(bitor(bitand(n1838, n1809), bitand(n1809, n1973)), bitand(n1838, n1973));
  n2016 = bitor(n1824, n1987);
  c = bitor(c, bitshift(bitand(n32, 1), 0));
  c = bitor(c, bitshift(bitand(n980, 1), 1));
  c = bitor(c, bitshift(bitand(n1246, 1), 2));
  c = bitor(c, bitshift(bitand(n1498, 1), 3));
  c = bitor(c, bitshift(bitand(n1676, 1), 4));
  c = bitor(c, bitshift(bitand(n1854, 1), 5));
  c = bitor(c, bitshift(bitand(n1943, 1), 6));
  c = bitor(c, bitshift(bitand(n1882, 1), 7));
  c = bitor(c, bitshift(bitand(n1898, 1), 8));
  c = bitor(c, bitshift(bitand(n1912, 1), 9));
  c = bitor(c, bitshift(bitand(n1928, 1), 10));
  c = bitor(c, bitshift(bitand(n1942, 1), 11));
  c = bitor(c, bitshift(bitand(n1956, 1), 12));
  c = bitor(c, bitshift(bitand(n1972, 1), 13));
  c = bitor(c, bitshift(bitand(n1986, 1), 14));
  c = bitor(c, bitshift(bitand(n2016, 1), 15));
end