circomlib/circuits/mux4.circom
circuits/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}