circom/c/calcwit.h
c/calcwit.hRaw
1#ifndef CIRCOM_CALCWIT_H
2#define CIRCOM_CALCWIT_H
3
4#include "circom.h"
5#include "fr.h"
6#include <mutex>
7#include <condition_variable>
8
9#define NMUTEXES 128
10
11class Circom_CalcWit {
12
13#ifdef SANITY_CHECK
14 bool *signalAssigned;
15#endif
16
17 // componentStatus -> For each component
18 // >0 Signals required to trigger
19 // == 0 Component triggered
20 // == -1 Component finished
21 int *inputSignalsToTrigger;
22 std::mutex *mutexes;
23 std::condition_variable *cvs;
24
25 std::mutex printf_mutex;
26
27 FrElement *signalValues;
28
29
30 void triggerComponent(int newCIdx);
31 void calculateWitness(void *input, void *output);
32
33 void syncPrintf(const char *format, ...);
34
35
36public:
37 Circom_Circuit *circuit;
38
39// Functions called by the circuit
40 Circom_CalcWit(Circom_Circuit *aCircuit);
41 ~Circom_CalcWit();
42
43 int getSubComponentOffset(int cIdx, u64 hash);
44 Circom_Sizes getSubComponentSizes(int cIdx, u64 hash);
45 int getSignalOffset(int cIdx, u64 hash);
46 Circom_Sizes getSignalSizes(int cIdx, u64 hash);
47
48 void getSignal(int currentComponentIdx, int cIdx, int sIdx, PFrElement value);
49 void setSignal(int currentComponentIdx, int cIdx, int sIdx, PFrElement value);
50
51 void checkConstraint(int currentComponentIdx, PFrElement value1, PFrElement value2, char const *err);
52
53 void log(PFrElement value);
54
55 void finished(int cIdx);
56 void join();
57
58
59// Public functions
60 inline void setInput(int idx, PFrElement val) {
61 setSignal(0, 0, circuit->wit2sig[idx], val);
62 }
63 inline void getWitness(int idx, PFrElement val) {
64 Fr_copy(val, &signalValues[circuit->wit2sig[idx]]);
65 }
66
67 void reset();
68
69};
70
71
72
73#endif // CIRCOM_CALCWIT_H