arnaucube
arnaucube/sonobe-playgroundPublic Self-hosted repository
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();