arnaucube
arnaucube/circomPublic Self-hosted repository
circom/c/calcwit.h
c/calcwit.hRaw
 1#ifndef CIRCOM_CALCWIT_H
 2#define CIRCOM_CALCWIT_H
 3
 4#include "circom.h"
 5
 6class Circom_CalcWit {
 7
 8#ifdef SANITY_CHECK
 9    bool *signalAssigned;
10#endif
11
12    // componentStatus -> For each component
13    // >0 Signals required to trigger
14    // == 0 Component triggered
15    int *inputSignalsToTrigger;
16
17    BigInt *signalValues;
18
19    Circom_Circuit *circuit;
20
21
22
23    void triggerComponent(int newCIdx);
24    void calculateWitness(void *input, void *output);
25
26
27public:
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