update the Nim parser too

This commit is contained in:
Balazs Komuves 2025-11-13 20:11:31 +01:00
parent 1289d9b7ad
commit fbe833d515
No known key found for this signature in database
GPG Key ID: F63B7AEF18435562
3 changed files with 49 additions and 4 deletions

View File

@ -86,9 +86,14 @@ type
CircuitInputs* = seq[(string, SignalDescription)] CircuitInputs* = seq[(string, SignalDescription)]
Prime* = object
primeNumber*: BigUInt
primeName*: string
GraphMetaData* = object GraphMetaData* = object
witnessMapping*: WitnessMapping witnessMapping*: WitnessMapping
inputSignals*: CircuitInputs inputSignals*: CircuitInputs
prime*: Prime
Graph* = object Graph* = object
nodes*: seq[Node[uint32]] nodes*: seq[Node[uint32]]

View File

@ -195,17 +195,46 @@ proc parseCircuitInput(buf: openArray[byte], p: var int): (string, SignalDescrip
p = nextp p = nextp
return (name,desc) return (name,desc)
proc parsePrime(buf: openArray[byte], p: var int): Prime =
# prime number (BigUInt)
let fld1 = buf.parseProtoField(p, LEN)
assert( fld1 == 3 , "expecting protobuf field id 3")
let len1 = buf.parseVarInt(p)
let nextp1 = p + len1
# protobuf is stupid, it's like triple wrapped
let fld1b = buf.parseProtoField(p, LEN)
assert( fld1b == 1 , "expecting protobuf field id 1")
let len1b = buf.parseVarInt(p)
var bytes: seq[byte] = newSeq[byte](len1b)
for i in 0..<len1b: bytes[i] = buf[p+i]
let number = BigUInt(bytes: bytes)
p = nextp1
# prime name (string)
let fld2 = buf.parseProtoField(p, LEN)
assert( fld2 == 4 , "expecting protobuf field id 4")
let len2 = buf.parseVarInt(p)
let nextp2 = p + len2
let bs = buf[p..<p+len2]
let name = bytesToString(bs)
p = nextp2
return Prime(primeNumber: number, primeName: name)
proc parseMeta(buf: openArray[byte]): GraphMetaData = proc parseMeta(buf: openArray[byte]): GraphMetaData =
var p: int = 0 var p: int = 0
let mapping = buf.parseWitnessMapping(p) let mapping = buf.parseWitnessMapping(p)
var entries: seq[(string, SignalDescription)] = newSeq[(string, SignalDescription)](0) var entries: seq[(string, SignalDescription)] = newSeq[(string, SignalDescription)](0)
while(p < buf.len): while(p < buf.len and buf[p]==0x12):
let entry = buf.parseCircuitInput(p) let entry = buf.parseCircuitInput(p)
entries.add(entry) entries.add(entry)
return GraphMetaData(witnessMapping: WitnessMapping(mapping: mapping), inputSignals: entries) let prime = buf.parsePrime(p)
return GraphMetaData(witnessMapping: WitnessMapping(mapping: mapping), inputSignals: entries, prime: prime)
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------

View File

@ -1,4 +1,7 @@
import circom_witnessgen/field
# import circom_witnessgen/div_mod
import circom_witnessgen/load import circom_witnessgen/load
import circom_witnessgen/input_json import circom_witnessgen/input_json
import circom_witnessgen/witness import circom_witnessgen/witness
@ -12,6 +15,13 @@ const wtns_file: string = "../tmp/nim3.wtns"
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
#[
when isMainModule:
debugDivMod()
# divModSanityCheck()
]#
when isMainModule: when isMainModule:
echo "loading in " & input_file echo "loading in " & input_file
@ -20,8 +30,9 @@ when isMainModule:
echo "loading in " & graph_file echo "loading in " & graph_file
let gr = loadGraph(graph_file) let gr = loadGraph(graph_file)
# echo $gr echo $gr
echo "generating witness" echo "generating witness"
let wtns = generateWitness( gr, inp ) let wtns = generateWitness( gr, inp )
exportWitness(wtns_file, wtns) exportWitness(wtns_file, wtns)