sonobe-playground/circuit/utils/pixels.circom
circuit/utils/pixels.circomRaw
1pragma circom 2.0.0;
2include "../node_modules/circomlib/circuits/bitify.circom";
3include "../node_modules/circomlib/circuits/mux1.circom";
4include "../node_modules/circomlib/circuits/comparators.circom";
5
6template Decompressor(){
7 signal input in;
8 signal output out[10][3];
9
10 component toBits = Num2Bits(240);
11 component toNum[10][3];
12
13 toBits.in <== in;
14
15 for (var i=0; i<10; i++) {
16 for (var j=0; j<3; j++) {
17 toNum[i][j] = Bits2Num(8);
18 toNum[i][j].in[0] <== toBits.out[i*24+j*8];
19 toNum[i][j].in[1] <== toBits.out[i*24+j*8+1];
20 toNum[i][j].in[2] <== toBits.out[i*24+j*8+2];
21 toNum[i][j].in[3] <== toBits.out[i*24+j*8+3];
22 toNum[i][j].in[4] <== toBits.out[i*24+j*8+4];
23 toNum[i][j].in[5] <== toBits.out[i*24+j*8+5];
24 toNum[i][j].in[6] <== toBits.out[i*24+j*8+6];
25 toNum[i][j].in[7] <== toBits.out[i*24+j*8+7];
26 out[i][j] <== toNum[i][j].out;
27 }
28 }
29}
30
31template DecompressorKernel(kernel_size){
32 signal input in;
33 signal output out[kernel_size][kernel_size];
34
35 component toBits = Num2Bits(kernel_size*kernel_size*9); // 8-bit value, 1-bit sign
36 component toNum[kernel_size][kernel_size];
37 component selector[kernel_size][kernel_size];
38
39 toBits.in <== in;
40
41 for (var i=0; i<kernel_size; i++) {
42 for (var j=0; j<kernel_size; j++) {
43 toNum[i][j] = Bits2Num(8);
44 toNum[i][j].in[0] <== toBits.out[i*kernel_size*9+j*9];
45 toNum[i][j].in[1] <== toBits.out[i*kernel_size*9+j*9+1];
46 toNum[i][j].in[2] <== toBits.out[i*kernel_size*9+j*9+2];
47 toNum[i][j].in[3] <== toBits.out[i*kernel_size*9+j*9+3];
48 toNum[i][j].in[4] <== toBits.out[i*kernel_size*9+j*9+4];
49 toNum[i][j].in[5] <== toBits.out[i*kernel_size*9+j*9+5];
50 toNum[i][j].in[6] <== toBits.out[i*kernel_size*9+j*9+6];
51 toNum[i][j].in[7] <== toBits.out[i*kernel_size*9+j*9+7];
52
53 var value = toNum[i][j].out; // value
54 var sign = toBits.out[i*kernel_size*9+j*9+8]; // sign
55
56 selector[i][j] = Mux1();
57 selector[i][j].c[0] <== value;
58 selector[i][j].c[1] <== 0 - value;
59 selector[i][j].s <== sign;
60
61 out[i][j] <== selector[i][j].out;
62 }
63 }
64}
65
66
67template DecompressorGrey(){
68 signal input in;
69 signal output out[10];
70
71 component toBits = Num2Bits(240);
72 component toNum[10];
73
74 toBits.in <== in;
75
76 for (var i=0; i<10; i++) {
77 var j=0;
78 toNum[i] = Bits2Num(8);
79 toNum[i].in[0] <== toBits.out[i*24];
80 toNum[i].in[1] <== toBits.out[i*24+1];
81 toNum[i].in[2] <== toBits.out[i*24+2];
82 toNum[i].in[3] <== toBits.out[i*24+3];
83 toNum[i].in[4] <== toBits.out[i*24+4];
84 toNum[i].in[5] <== toBits.out[i*24+5];
85 toNum[i].in[6] <== toBits.out[i*24+6];
86 toNum[i].in[7] <== toBits.out[i*24+7];
87 out[i] <== toNum[i].out;
88 }
89}
90
91
92template CompressorCrop(){
93 signal input in[10];
94 signal output out;
95
96 component toNum = Bits2Num(240);
97 component toBits[10];
98
99 for (var i=0; i<10; i++) {
100 toBits[i] = Num2Bits(24);
101 toBits[i].in <== in[i];
102 for (var j=0; j<24; j++) {
103 toNum.in[i*24+j] <== toBits[i].out[j];
104 }
105 }
106 out <== toNum.out;
107}
108
109template DecompressorCrop(){
110 signal input in;
111 signal output out[10];
112
113 component decomp = DecompressorGrey();
114
115 decomp.in <== in;
116 out <== decomp.out;
117}
118
119template CropInfoDecompressor(){
120
121 signal input in;
122 signal output row_index;
123 signal output x;
124 signal output y;
125
126 component toBits = Num2Bits(36);
127 component toNumX = Bits2Num(12);
128 component toNumY = Bits2Num(12);
129 component toNumIndex = Bits2Num(12);
130
131 toBits.in <== in;
132 for (var i=0; i<12; i++) {
133 toNumX.in[i] <== toBits.out[i];
134 toNumY.in[i] <== toBits.out[i+12];
135 toNumIndex.in[i] <== toBits.out[i+24];
136 }
137
138 x <== toNumX.out;
139 y <== toNumY.out;
140 row_index <== toNumIndex.out;
141}
142
143
144template Test () {
145 signal input sig1;
146 signal input sig2;
147
148 component decom = Decompressor();
149 decom.in <== sig1;
150 sig2 === decom.out[2][2];
151}
152
153// component main = Test();