/*Copyright 2020 Infxl LLC. All rights reserved. This is proprietary software. No warranty,
  explicit or implicit, provided. In no event shall Infxl LLC be liable for any claim or damages.
  ***********************************************************************************************
  ********  RANKING BY ACCURACY                                 34-16-8-1508-616-663-rb-ecR-OFimp
  ********  ACCURACY       COST
  ********    0.9576       1244 Most accurate 
  ********    0.9576       2708 
  ********    0.9569        607 Fastest, most energy-efficient and compact (see code below)
  ********    0.9562       1587 
  ********    0.9549       2521 
  ********  WHAT FOLLOWS IS THE CODE FOR A DEEP NET BUILT BY Infxl. THREE VERSIONS ARE PROVIDED:
  ********  1- USES WHILE-LOOPS & POINTERS
  ***********************************************************************************************/
//these 333 inputs were found to be irrelevant: 0,2,5,6,8,12,13,14,15,17,18,19,20,21,26,29,30,35,43,44,45,46,47,48,59,60,61,65,67,68,71,74,78,79,80,81,82,83,84,85,86,88,90,91,94,95,96,97,98,100,101,107,120,123,124,126,128,130,133,135,136,137,138,153,154,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,180,181,188,204,206,207,208,209,211,213,217,218,219,220,221,223,224,226,228,229,230,231,232,234,235,239,240,241,242,243,244,245,246,247,252,253,254,255,256,257,258,259,265,266,272,277,278,279,280,281,282,283,284,285,286,290,291,293,294,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,318,319,320,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,349,350,351,352,353,355,357,358,360,361,362,364,370,375,376,378,379,380,381,382,383,384,385,386,387,389,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,429,430,431,432,434,435,436,437,438,439,440,441,443,447,448,460,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,503,505,506,508,509,514,515,517,518,520,521,522,524,528,529,530,531,532,533,534,535,537,540,541,542,543,544,545,546,547,548,553

//********  VERSION 1: USES WHILE-LOOPS & POINTERS  *********************************************
#include <string.h>
#include <stdint.h>
int16_t const ROM16[] = { 561,6,26,-34,-32768,102,-32768,458,38,105,110,114,121,142,146,147,148,149,151,152,155,182,192,198,260,298,371,373,374,445,527,550,556,559,560,-32768,27,28,32,36,37,41,42,50,53,63,143,145,150,158,185,186,187,194,195,210,238,264,296,451,-32768,535,1,4,27,28,32,36,40,41,49,50,53,110,111,118,143,144,145,150,156,158,185,186,187,191,194,197,198,212,237,238,261,292,295,368,374,428,451,458,510,538,-32768,25,37,42,57,77,105,114,115,122,142,147,148,149,151,155,182,192,196,263,298,372,445,452,555,557,559,-32768,167,3,9,16,62,70,129,141,143,184,194,201,203,236,271,296,366,455,523,525,-32768,37,117,118,156,197,198,199,222,250,295,317,348,369,526,538,552,-32768,-10,24,37,92,114,115,117,118,142,156,197,198,199,227,273,287,289,295,366,367,368,450,516,523,526,536,538,-32768,36,55,62,70,72,131,134,157,185,186,192,205,261,296,442,444,458,-32768,468,4,7,22,37,55,106,108,117,119,127,131,132,134,140,148,159,163,190,192,205,261,269,270,276,298,299,321,451,458,459,512,552,-32768,1,9,23,24,28,89,92,93,118,143,158,189,197,202,227,233,262,267,274,297,365,367,390,411,417,433,502,504,507,-32768,149,-32768,377,-32768,549,10,32,36,39,55,63,99,134,141,157,185,193,261,269,300,451,458,558,-32768,1,24,31,73,75,92,104,114,115,116,118,139,142,147,197,199,237,248,289,295,367,368,449,450,510,516,523,526,538,549,-32768,759,23,24,28,57,58,66,102,103,104,114,116,118,159,197,237,288,367,445,454,525,549,558,-32768,40,49,52,55,56,76,106,157,388,501,513,552,559,-32768,293,36,37,39,40,49,52,55,56,64,87,106,108,113,117,119,125,148,156,179,198,199,202,276,354,356,369,449,453,458,461,519,551,552,-32768,3,9,11,28,38,57,62,109,172,186,189,190,194,195,200,214,215,225,268,297,363,446,452,504,558,-32768,278,1,32,36,41,50,51,53,63,69,118,119,144,145,150,158,183,185,186,187,191,194,197,225,237,238,446,451,538,539,-32768,34,39,110,112,142,149,156,182,189,196,198,260,263,366,372,374,445,452,511,554,559,560,-32768,139,7,36,37,102,103,104,157,159,160,163,192,249,251,269,275,287,348,366,367,433,456,457,458,512,523,559,-32768,1,28,33,54,89,92,114,152,195,201,214,216,274,359,502,504,507,-32768,323,571,-32768,566,569,-32768,309,566,572,-32768,562,-32768,157,564,566,568,569,571,572,-32768,563,565,570,-32768,0,561,566,572,-32768,567,-32768,452,565,569,-32768,564,566,572,-32768,381,563,564,568,569,571,-32768,562,565,-32768,340,568,570,571,-32768,562,563,564,569,572,-32768,180,561,564,-32768,566,568,570,571,572,-32768,64,575,576,577,578,579,-32768,573,574,580,-32768,265,573,574,576,578,579,580,-32768,575,577,-32768,224,576,579,-32768,574,577,578,-32768,31,574,576,577,-32768,575,578,579,580,-32768,139,576,577,578,580,-32768,574,575,579,-32768,101,574,575,576,578,-32768,573,577,579,-32768,-32768 };

//modify only copy_inp_vec_to_ram8_head() and read_op_vec_frm_ram8_tail() to meet the needs of your project

void copy_inp_vec_to_ram8_head(int8_t *ram8) {        
    //the following line is a placeholder for code that brings the data from the sensors after it has been pre-processed to the range [-127, 127]
    int8_t preprocessed_inp_vec8[] = { 33,-3,-2,-119,-117,-84,-121,-117,-85,-113,-70,-60,91,80,100,-111,-127,-127,-119,-124,-121,-105,-22,-49,32,66,-62,62,-6,27,-17,17,-2,-14,9,-22,5,10,-63,-90,119,-36,15,-117,-119,-71,-118,-119,-77,115,-36,20,120,-34,-10,-2,105,-110,-123,-121,-120,-96,-54,-127,28,-55,55,-55,55,-101,99,-99,100,-125,125,-126,125,125,-127,-122,9,6,-14,-115,-119,-119,-116,-119,-120,-115,-121,-113,114,121,120,-118,-126,-127,-127,-119,-120,-123,-11,-40,-64,66,-29,63,40,29,15,28,54,-11,18,-25,9,-34,5,-45,15,-12,24,-112,-103,-119,-113,-109,-120,-84,-90,-82,106,105,103,-101,-124,-125,-126,-112,-115,-122,98,-34,58,-10,-2,30,-25,4,-10,1,31,28,-36,32,2,82,-30,-39,-26,-22,-12,-114,-116,-119,-116,-118,-121,-110,-116,-114,115,116,120,-118,-126,-126,-127,-119,-122,-123,5,10,-25,14,-3,25,39,15,7,9,25,40,-27,22,19,16,-20,-41,-110,-89,-94,-96,-125,-110,-124,-109,33,7,-26,77,-71,-110,-89,-94,-96,-125,-110,-124,-109,33,7,-26,77,-71,-118,-114,-114,-115,-124,-118,-126,-116,-17,31,-44,42,-34,-101,-97,-99,-91,-97,-101,-124,-106,84,5,-21,20,-1,-117,-113,-114,-116,-124,-117,-126,-116,42,65,-65,5,2,-117,-117,-100,-120,-117,-80,-118,-117,-92,-123,-119,-75,-123,-125,-121,-110,-127,-126,-119,-115,-119,-110,-43,-62,-21,-127,-127,-127,1,16,-66,-72,-114,-43,-87,24,-15,-127,-127,-126,-126,-126,-126,-126,-127,-127,-126,-126,-126,-127,-126,-127,-127,-127,-127,-127,-126,-127,-127,-126,-127,-127,-127,-127,-127,-117,-126,-126,-127,-127,-126,-126,-124,-119,-127,-127,-125,-119,-127,-114,-119,-117,-117,-120,-120,-114,-119,-120,-120,-122,-122,-120,-125,-124,-115,-126,-127,-127,-113,-119,-121,-60,-85,-75,-66,10,41,58,18,-23,-73,-115,-79,-120,-84,-116,-127,-127,-126,-126,-126,-125,-125,-127,-127,-126,-126,-125,-127,-126,-127,-127,-127,-127,-127,-126,-127,-127,-127,-127,-126,-127,-127,-126,-126,-127,-127,-127,-127,-126,-127,-127,-126,-127,-126,-127,-127,-127,-104,-102,-116,-115,-104,-121,-110,-105,-119,-115,-112,-123,-111,-120,-117,-105,-126,-125,-127,-111,-106,-118,0,26,-32,-127,-119,-118,24,-8,56,-51,-88,-50,-100,-62,-100,-126,-126,-126,-126,-125,-125,-125,-125,-126,-126,-125,-125,-126,-126,-124,-126,-127,-126,-126,-125,-126,-125,-125,-127,-126,-125,-125,-126,-127,-127,-127,-127,-127,-126,-126,-126,-127,-127,-127,-126,-127,-127,-100,-90,-92,-99,-120,-100,-121,-111,-22,-127,-62,1,-49,-114,-114,-113,-118,-114,-114,-126,-117,-62,-127,-5,-33,-89,-98,-101,-97,-104,-119,-98,-123,-101,23,-127,-6,-60,-96,-113,-115,-114,-116,-115,-113,-126,-114,-30,-127,9,-42,-89,1,21,-105,35,-91,35,-7 };
    memcpy(ram8, preprocessed_inp_vec8, *ROM16); }    //copy preprocessed inputs to the start of ram8 

void read_op_vec_frm_ram8_tail(int8_t *ram8) {
    int8_t computed_op_vec8[*(ROM16 + 1)];
    memcpy(computed_op_vec8, ram8 + *ROM16 + *(ROM16 + 2) - *(ROM16 + 1), *(ROM16 + 1)); }  //copy values from ram8's tail to computed_op_vec8

void deep_net_inference(       int8_t *ram8) {
    int8_t  const static ROM8[] = {-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-125,-124,-124,-124,-124,-124,-124,-124,-124,-124,-124,-124,-124,-124,-124,-124,-124,-123,-123,-123,-123,-123,-123,-123,-123,-123,-123,-123,-123,-123,-122,-122,-122,-122,-122,-122,-122,-122,-122,-122,-122,-121,-121,-121,-121,-121,-121,-121,-121,-121,-120,-120,-120,-120,-120,-120,-120,-120,-120,-119,-119,-119,-119,-119,-119,-119,-118,-118,-118,-118,-118,-118,-118,-117,-117,-117,-117,-117,-117,-116,-116,-116,-116,-116,-115,-115,-115,-115,-115,-115,-114,-114,-114,-114,-113,-113,-113,-113,-113,-112,-112,-112,-112,-111,-111,-111,-111,-110,-110,-110,-110,-109,-109,-109,-109,-108,-108,-108,-107,-107,-107,-107,-106,-106,-106,-105,-105,-105,-104,-104,-104,-103,-103,-103,-102,-102,-101,-101,-101,-100,-100,-100,-99,-99,-98,-98,-97,-97,-97,-96,-96,-95,-95,-94,-94,-93,-93,-93,-92,-92,-91,-91,-90,-90,-89,-89,-88,-88,-87,-86,-86,-85,-85,-84,-84,-83,-82,-82,-81,-81,-80,-79,-79,-78,-78,-77,-76,-76,-75,-74,-74,-73,-72,-72,-71,-70,-70,-69,-68,-67,-67,-66,-65,-65,-64,-63,-62,-61,-61,-60,-59,-58,-58,-57,-56,-55,-54,-54,-53,-52,-51,-50,-49,-48,-48,-47,-46,-45,-44,-43,-42,-41,-41,-40,-39,-38,-37,-36,-35,-34,-33,-32,-31,-30,-29,-29,-28,-27,-26,-25,-24,-23,-22,-21,-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,29,30,31,32,33,34,35,36,37,38,39,40,41,41,42,43,44,45,46,47,48,48,49,50,51,52,53,54,54,55,56,57,58,58,59,60,61,61,62,63,64,65,65,66,67,67,68,69,70,70,71,72,72,73,74,74,75,76,76,77,78,78,79,79,80,81,81,82,82,83,84,84,85,85,86,86,87,88,88,89,89,90,90,91,91,92,92,93,93,93,94,94,95,95,96,96,97,97,97,98,98,99,99,100,100,100,101,101,101,102,102,103,103,103,104,104,104,105,105,105,106,106,106,107,107,107,107,108,108,108,109,109,109,109,110,110,110,110,111,111,111,111,112,112,112,112,113,113,113,113,113,114,114,114,114,115,115,115,115,115,115,116,116,116,116,116,117,117,117,117,117,117,118,118,118,118,118,118,118,119,119,119,119,119,119,119,120,120,120,120,120,120,120,120,120,121,121,121,121,121,121,121,121,121,122,122,122,122,122,122,122,122,122,122,122,123,123,123,123,123,123,123,123,123,123,123,123,123,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126};
    int16_t const    *ROM16_ptr = ROM16 + 2;
    int8_t              *nr_ptr = ram8 + *ROM16 - 1;  //-1 nullifies the first pre-increment
    int16_t       static count16;
    while (    *++ROM16_ptr != -32768) { count16  =          *ROM16_ptr;
        while (*++ROM16_ptr != -32768) { count16 += *(ram8 + *ROM16_ptr); }
        while (*++ROM16_ptr != -32768) { count16 -= *(ram8 + *ROM16_ptr); }
        if (     count16 <   0) { *++nr_ptr = -127; }
        else if (count16 > 656) { *++nr_ptr =  127; }
        else {                    *++nr_ptr = *(count16 + ROM8); } } }

int main() {
    int8_t ram8[ *ROM16 + *(ROM16 + 2) ];
    while (1) {                                       //get inputs, write them to ram8, run forward pass, read outputs from ram8
        copy_inp_vec_to_ram8_head(ram8);
        deep_net_inference(       ram8);
        read_op_vec_frm_ram8_tail(ram8); }
    return 0; }
    
Click here to download this code