Original notes for Plaf. The current implementation is slightly different.
[info]
name = "Circuit Foo"
size = 4096 # k = 12
[columns.witness]
w0 = {}
w1 = {}
w2 = { phase = 2 } # dictionary allows adding extra properties to witness columns
[columns.fixed]
q0 = {}
q1 = {}
q2 = {}
q3 = {}
[constraints.poly]
"gate 1" = "q0 * ((w0 - 0) * (w0 - 1))"
"gate 2" = "q1 * (w0 - w1)"
"gate 3" = "q2 * w0 * w1 * w2"
"gate 4" = "q3 * (w1[1] = w0[0])"
[constraints.lookup]
"lookup 1" = [["w0", "w1"], ["w2[0]", "w2[1]"]]
"lookup 2" = [["w0", "w0 + w1"], ["w2 + w2", "q0 * w2"]]
[[constraints.copy]]
columns = ["w0", "w1"]
offsets = [[0, 10], [1, 11], [2, 12]]
[[constraints.copy]]
columns = ["w0", "w2"]
offsets = [[0, 1], [2, 3], [4, 5]]
It's just CSV, where values can be in decimal (with "-" to negate), hex (with "0x" prefix) The first line contains the column names, the rest are values. which can be skipped to mean unassigned (0).
Why CSV? Because it's the simplest text format to encode table values, and it can be easily imported into sqlite to explore big tables.
w0,w1,w2
12,0x4,-1
,,33
12345,88,0x124
q0,q1,q2,q3
,,,1
1,1,
1,,,