package gates import ( "fmt" "regexp" "strconv" "github.com/consensys/gnark/frontend" gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks" ) var constantGateRegex = regexp.MustCompile("ConstantGate { num_consts: (?P[0-9]+) }") func deserializeConstantGate(parameters map[string]string) Gate { // Has the format "ConstantGate { num_consts: 2 }" numConsts, hasNumConsts := parameters["numConsts"] if !hasNumConsts { panic("Missing field num_consts in ConstantGate") } numConstsInt, err := strconv.Atoi(numConsts) if err != nil { panic("Invalid num_consts field in ConstantGate") } return NewConstantGate(uint64(numConstsInt)) } type ConstantGate struct { numConsts uint64 } func NewConstantGate(numConsts uint64) *ConstantGate { return &ConstantGate{ numConsts: numConsts, } } func (g *ConstantGate) Id() string { return fmt.Sprintf("ConstantGate { num_consts: %d }", g.numConsts) } func (g *ConstantGate) ConstInput(i uint64) uint64 { if i > g.numConsts { panic("Invalid constant index") } return i } func (g *ConstantGate) WireOutput(i uint64) uint64 { if i > g.numConsts { panic("Invalid wire index") } return i } func (g *ConstantGate) EvalUnfiltered( api frontend.API, glApi gl.Chip, vars EvaluationVars, ) []gl.QuadraticExtensionVariable { constraints := []gl.QuadraticExtensionVariable{} for i := uint64(0); i < g.numConsts; i++ { constraints = append(constraints, glApi.SubExtension(vars.localConstants[g.ConstInput(i)], vars.localWires[g.WireOutput(i)])) } return constraints }