/***
* 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.
***/
#include <stdint.h>
#include <stdlib.h>

/// Approximate function add8_413
///  Library = EvoApprox8b
///  Circuit = add8_413
///  Area   (180) = 1280
///  Delay  (180) = 0.960
///  Power  (180) = 376.90
///  Area   (45) = 87
///  Delay  (45) = 0.390
///  Power  (45) = 30.12
///  Nodes = 27
///  HD = 170624
///  MAE = 3.99609
///  MSE = 40.00000
///  MRE = 2.08 %
///  WCE = 23
///  WCRE = 400 %
///  EP = 89.1 %
uint16_t add8_413(uint8_t a, uint8_t b)
{
  uint16_t c = 0;
  uint8_t n2 = (a >> 1) & 0x1;
  uint8_t n4 = (a >> 2) & 0x1;
  uint8_t n6 = (a >> 3) & 0x1;
  uint8_t n8 = (a >> 4) & 0x1;
  uint8_t n10 = (a >> 5) & 0x1;
  uint8_t n12 = (a >> 6) & 0x1;
  uint8_t n14 = (a >> 7) & 0x1;
  uint8_t n20 = (b >> 2) & 0x1;
  uint8_t n22 = (b >> 3) & 0x1;
  uint8_t n24 = (b >> 4) & 0x1;
  uint8_t n26 = (b >> 5) & 0x1;
  uint8_t n28 = (b >> 6) & 0x1;
  uint8_t n30 = (b >> 7) & 0x1;
  uint8_t n32;
  uint8_t n36;
  uint8_t n43;
  uint8_t n62;
  uint8_t n63;
  uint8_t n72;
  uint8_t n73;
  uint8_t n82;
  uint8_t n83;
  uint8_t n92;
  uint8_t n93;
  uint8_t n94;
  uint8_t n102;
  uint8_t n103;
  uint8_t n143;
  uint8_t n162;
  uint8_t n163;
  uint8_t n168;
  uint8_t n169;
  uint8_t n173;
  uint8_t n182;
  uint8_t n193;
  uint8_t n223;
  uint8_t n230;
  uint8_t n242;
  uint8_t n263;
  uint8_t n322;
  uint8_t n332;
  uint8_t n342;
  uint8_t n382;
  uint8_t n392;
  uint8_t n402;
  uint8_t n412;
  uint8_t n413;
  uint8_t n422;

  n32 = n28 ^ n12;
  n36 = n24 & n6;
  n43 = ~(n2 ^ n2);
  n62 = n6 ^ n22;
  n63 = n6 & n22;
  n72 = n8 ^ n24;
  n73 = n8 & n24;
  n82 = n10 ^ n26;
  n83 = n10 & n26;
  n92 = n12 ^ n28;
  n93 = n12 & n28;
  n94 = n83;
  n102 = n14 ^ n30;
  n103 = n14 & n30;
  n143 = n36 & n63;
  n162 = n73 | n143;
  n163 = n73 | n143;
  n168 = n82;
  n169 = n82;
  n173 = n32 & n94;
  n182 = n32 & n169;
  n193 = n93 | n173;
  n223 = n182 & n163;
  n230 = n162;
  n242 = n193 | n223;
  n263 = n230;
  n322 = n63;
  n332 = n168 & n263;
  n342 = n94 | n332;
  n382 = n72 | n322;
  n392 = n168 ^ n263;
  n402 = n92 ^ n342;
  n412 = n102 ^ n242;
  n413 = n102 & n242;
  n422 = n103 | n413;

  c |= (n20 & 0x1) << 0;
  c |= (n4 & 0x1) << 1;
  c |= (n43 & 0x1) << 2;
  c |= (n62 & 0x1) << 3;
  c |= (n382 & 0x1) << 4;
  c |= (n392 & 0x1) << 5;
  c |= (n402 & 0x1) << 6;
  c |= (n412 & 0x1) << 7;
  c |= (n422 & 0x1) << 8;

  return c;
}