circom/c/calcwit.h
c/calcwit.hRaw
1#ifndef CIRCOM_CALCWIT_H
2#define CIRCOM_CALCWIT_H
3
4#include "circom.h"
5#include "zqfield.h"
6
7class Circom_CalcWit {
8
9#ifdef SANITY_CHECK
10 bool *signalAssigned;
11#endif
12
13 // componentStatus -> For each component
14 // >0 Signals required to trigger
15 // == 0 Component triggered
16 int *inputSignalsToTrigger;
17
18 BigInt *signalValues;
19
20 Circom_Circuit *circuit;
21
22 void triggerComponent(int newCIdx);
23 void calculateWitness(void *input, void *output);
24
25
26public:
27 ZqField *field;
28 int cIdx;
29// Functions called by the circuit
30 Circom_CalcWit(Circom_Circuit *aCircuit);
31 ~Circom_CalcWit();
32
33 int getSubComponentOffset(int cIdx, u64 hash);
34 Circom_Sizes getSubComponentSizes(int cIdx, u64 hash);
35 int getSignalOffset(int cIdx, u64 hash);
36 Circom_Sizes getSignalSizes(int cIdx, u64 hash);
37
38 PBigInt allocBigInts(Circom_Sizes sizes);
39 void freeBigInts(PBigInt bi, Circom_Sizes sizes);
40
41 void getSignal(int cIdx, int sIdx, PBigInt value);
42 void setSignal(int cIdx, int sIdx, PBigInt value);
43
44 void checkConstraint(PBigInt value1, PBigInt value2, char const *err);
45
46
47// Public functions
48 inline void setInput(int idx, PBigInt val) {
49 setSignal(0, circuit->wit2sig[idx], val);
50 }
51 inline void getWitness(int idx, PBigInt val) {
52 mpz_set(*val, signalValues[circuit->wit2sig[idx]]);
53 }
54
55 void reset();
56
57};
58
59
60
61#endif // CIRCOM_CALCWIT_H