package gates
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
|
|
"github.com/consensys/gnark/frontend"
|
|
"github.com/succinctlabs/gnark-plonky2-verifier/field"
|
|
)
|
|
|
|
var constantGateRegex = regexp.MustCompile("ConstantGate { num_consts: (?P<numConsts>[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, qeAPI *field.QuadraticExtensionAPI, vars EvaluationVars) []field.QuadraticExtension {
|
|
constraints := []field.QuadraticExtension{}
|
|
|
|
for i := uint64(0); i < g.numConsts; i++ {
|
|
constraints = append(constraints, qeAPI.SubExtension(vars.localConstants[g.ConstInput(i)], vars.localWires[g.WireOutput(i)]))
|
|
}
|
|
|
|
return constraints
|
|
}
|