arnaucube
arnaucube/circomlibPublic Self-hosted repository
circomlib/circuit/mux4.circom
circuit/mux4.circomRaw
  1
  2
  3
  4
  5template MultiMux4(n) {
  6    signal input c[n][16];  // Constants
  7    signal input s[4];   // Selector
  8    signal output out[n];
  9
 10    signal a3210[n];
 11    signal a321[n];
 12    signal a320[n];
 13    signal a310[n];
 14    signal a32[n];
 15    signal a31[n];
 16    signal a30[n];
 17    signal a3[n];
 18
 19    signal a210[n];
 20    signal a21[n];
 21    signal a20[n];
 22    signal a10[n];
 23    signal a2[n];
 24    signal a1[n];
 25    signal a0[n];
 26    signal a[n];
 27
 28    // 4 constrains for the intermediary variables
 29    signal  s10;
 30    s10 <== s[1] * s[0];
 31    signal  s20;
 32    s20 <== s[2] * s[0];
 33    signal  s21;
 34    s21 <== s[2] * s[1];
 35    signal s210;
 36    s210 <==  s21 * s[0];
 37
 38
 39    for (var i=0; i<n; i++) {
 40
 41        a3210[i] <==  ( c[i][15]-c[i][14]-c[i][13]+c[i][12] - c[i][11]+c[i][10]+c[i][ 9]-c[i][ 8]
 42                       -c[i][ 7]+c[i][ 6]+c[i][ 5]-c[i][ 4] + c[i][ 3]-c[i][ 2]-c[i][ 1]+c[i][ 0] ) * s210;
 43         a321[i] <==  ( c[i][14]-c[i][12]-c[i][10]+c[i][ 8] - c[i][ 6]+c[i][ 4]+c[i][ 2]-c[i][ 0] ) * s21;
 44         a320[i] <==  ( c[i][13]-c[i][12]-c[i][ 9]+c[i][ 8] - c[i][ 5]+c[i][ 4]+c[i][ 1]-c[i][ 0] ) * s20;
 45         a310[i] <==  ( c[i][11]-c[i][10]-c[i][ 9]+c[i][ 8] - c[i][ 3]+c[i][ 2]+c[i][ 1]-c[i][ 0] ) * s10;
 46          a32[i] <==  ( c[i][12]-c[i][ 8]-c[i][ 4]+c[i][ 0] ) * s[2];
 47          a31[i] <==  ( c[i][10]-c[i][ 8]-c[i][ 2]+c[i][ 0] ) * s[1];
 48          a30[i] <==  ( c[i][ 9]-c[i][ 8]-c[i][ 1]+c[i][ 0] ) * s[0];
 49           a3[i] <==  ( c[i][ 8]-c[i][ 0] );
 50
 51         a210[i] <==  ( c[i][ 7]-c[i][ 6]-c[i][ 5]+c[i][ 4] - c[i][ 3]+c[i][ 2]+c[i][ 1]-c[i][ 0] ) * s210;
 52          a21[i] <==  ( c[i][ 6]-c[i][ 4]-c[i][ 2]+c[i][ 0] ) * s21;
 53          a20[i] <==  ( c[i][ 5]-c[i][ 4]-c[i][ 1]+c[i][ 0] ) * s20;
 54          a10[i] <==  ( c[i][ 3]-c[i][ 2]-c[i][ 1]+c[i][ 0] ) * s10;
 55           a2[i] <==  ( c[i][ 4]-c[i][ 0] ) * s[2];
 56           a1[i] <==  ( c[i][ 2]-c[i][ 0] ) * s[1];
 57           a0[i] <==  ( c[i][ 1]-c[i][ 0] ) * s[0];
 58            a[i] <==  ( c[i][ 0] )
 59
 60          out[i] <== ( a3210[i] + a321[i] + a320[i] + a310[i] + a32[i] + a31[i] + a30[i] + a3[i] ) * s[3] +
 61                     (  a210[i] +  a21[i] +  a20[i] +  a10[i] +  a2[i] +  a1[i] +  a0[i] +  a[i] );
 62
 63/*
 64        out[i] <== (  s210 * ( c[i][15]-c[i][14]-c[i][13]+c[i][12] - c[i][11]+c[i][10]+c[i][ 9]-c[i][ 8]
 65                              -c[i][ 7]+c[i][ 6]+c[i][ 5]-c[i][ 4] + c[i][ 3]-c[i][ 2]-c[i][ 1]+c[i][ 0] ) +
 66                       s21 * ( c[i][14]-c[i][12]-c[i][10]+c[i][ 8] - c[i][ 6]+c[i][ 4]+c[i][ 2]-c[i][ 0] ) +
 67                       s20 * ( c[i][13]-c[i][12]-c[i][ 9]+c[i][ 8] - c[i][ 5]+c[i][ 4]+c[i][ 1]-c[i][ 0] ) +
 68                       s10 * ( c[i][11]-c[i][10]-c[i][ 9]+c[i][ 8] - c[i][ 3]+c[i][ 2]+c[i][ 1]-c[i][ 0] ) +
 69                      s[2] * ( c[i][12]-c[i][ 8]-c[i][ 4]+c[i][ 0] ) +
 70                      s[1] * ( c[i][10]-c[i][ 8]-c[i][ 2]+c[i][ 0] ) +
 71                      s[0] * ( c[i][ 9]-c[i][ 8]-c[i][ 1]+c[i][ 0] ) +
 72                             ( c[i][ 8]-c[i][ 0] ) ) * s[3]  +
 73                (     s210 * ( c[i][ 7]-c[i][ 6]-c[i][ 5]+c[i][ 4] - c[i][ 3]+c[i][ 2]+c[i][ 1]-c[i][ 0] ) +
 74                       s21 * ( c[i][ 6]-c[i][ 4]-c[i][ 2]+c[i][ 0] ) +
 75                       s20 * ( c[i][ 5]-c[i][ 4]-c[i][ 1]+c[i][ 0] ) +
 76                       s10 * ( c[i][ 3]-c[i][ 2]-c[i][ 1]+c[i][ 0] ) +
 77                      s[2] * ( c[i][ 4]-c[i][ 0] ) +
 78                      s[1] * ( c[i][ 2]-c[i][ 0] ) +
 79                      s[0] * ( c[i][ 1]-c[i][ 0] ) +
 80                             ( c[i][ 0] ));
 81
 82*/
 83    }
 84}
 85
 86template Mux4() {
 87    var i;
 88    signal input c[16];  // Constants
 89    signal input s[4];   // Selector
 90    signal output out;
 91
 92    component mux = MultiMux4(1);
 93
 94    for (i=0; i<16; i++) {
 95        mux.c[0][i] <== c[i];
 96    }
 97
 98    for (i=0; i<4; i++) {
 99      s[i] ==> mux.s[i];
100    }
101
102    mux.out[0] ==> out;
103}