gnark-plonky2-verifier/plonk/gates/gates.go
plonk/gates/gates.goRaw
1package gates
2
3import (
4 "fmt"
5 "regexp"
6
7 "github.com/consensys/gnark/frontend"
8 gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
9)
10
11type Gate interface {
12 Id() string
13 EvalUnfiltered(
14 api frontend.API,
15 glApi gl.GoldilocksApi,
16 vars EvaluationVars,
17 ) []gl.QuadraticExtensionVariable
18}
19
20var gateRegexHandlers = map[*regexp.Regexp]func(parameters map[string]string) Gate{
21 aritheticGateRegex: deserializeArithmeticGate,
22 aritheticExtensionGateRegex: deserializeExtensionArithmeticGate,
23 baseSumGateRegex: deserializeBaseSumGate,
24 constantGateRegex: deserializeConstantGate,
25 cosetInterpolationGateRegex: deserializeCosetInterpolationGate,
26 exponentiationGateRegex: deserializeExponentiationGate,
27 mulExtensionGateRegex: deserializeMulExtensionGate,
28 noopGateRegex: deserializeNoopGate,
29 poseidonGateRegex: deserializePoseidonGate,
30 poseidonMdsGateRegex: deserializePoseidonMdsGate,
31 publicInputGateRegex: deserializePublicInputGate,
32 randomAccessGateRegex: deserializeRandomAccessGate,
33 reducingExtensionGateRegex: deserializeReducingExtensionGate,
34 reducingGateRegex: deserializeReducingGate,
35}
36
37func GateInstanceFromId(gateId string) Gate {
38 for regex, handler := range gateRegexHandlers {
39 matches := regex.FindStringSubmatch(gateId)
40 if matches != nil {
41 parameters := make(map[string]string)
42 for i, name := range regex.SubexpNames() {
43 if i != 0 && name != "" {
44 parameters[name] = matches[i]
45 }
46 }
47
48 if matches != nil {
49 return handler(parameters)
50 }
51 }
52 }
53 panic(fmt.Sprintf("Unknown gate ID %s", gateId))
54}