mirror of
https://github.com/arnaucube/circom.git
synced 2026-02-06 18:56:40 +01:00
Allows pass signal arrays to a function
This commit is contained in:
@@ -59,8 +59,9 @@ class CodeBuilderC {
|
||||
this.ops.push({op: "SETSIGNAL", component, signal, value});
|
||||
}
|
||||
|
||||
getSignal(dLabel, component, signal) {
|
||||
this.ops.push({op: "GETSIGNAL", dLabel, component, signal});
|
||||
getSignal(dLabel, component, signal, n) {
|
||||
if (typeof(n) == "undefined") n=1;
|
||||
this.ops.push({op: "GETSIGNAL", dLabel, component, signal, n});
|
||||
}
|
||||
|
||||
copyN(dLabel, offset, src, n) {
|
||||
@@ -181,7 +182,7 @@ class CodeBuilderC {
|
||||
} else if (o.op == "SETSIGNAL") {
|
||||
code.push(`ctx->setSignal(__cIdx, ${ref2src(o.component)}, ${ref2src(o.signal)}, ${ref2src(o.value)});`);
|
||||
} else if (o.op == "GETSIGNAL") {
|
||||
code.push(`ctx->getSignal(__cIdx, ${ref2src(o.component)}, ${ref2src(o.signal)}, ${o.dLabel});`);
|
||||
code.push(`ctx->multiGetSignal(__cIdx, ${ref2src(o.component)}, ${ref2src(o.signal)}, ${o.dLabel}, ${o.n});`);
|
||||
} else if (o.op == "COPYN") {
|
||||
const oS = ref2src(o.offset);
|
||||
const dLabel = (oS != "0") ? (o.dLabel + "+" + oS) : o.dLabel;
|
||||
|
||||
@@ -412,6 +412,42 @@ module.exports = function buildRuntime(module, builder) {
|
||||
|
||||
}
|
||||
|
||||
function buildMultiGetSignal() {
|
||||
const f = module.addFunction("multiGetSignal");
|
||||
f.addParam("cIdx", "i32");
|
||||
f.addParam("pR", "i32");
|
||||
f.addParam("component", "i32");
|
||||
f.addParam("signal", "i32");
|
||||
f.addParam("n", "i32");
|
||||
f.addLocal("i", "i32");
|
||||
|
||||
const c = f.getCodeBuilder();
|
||||
|
||||
f.addCode(
|
||||
c.setLocal("i", c.i32_const(0)),
|
||||
c.block(c.loop(
|
||||
c.br_if(1, c.i32_eq(c.getLocal("i"), c.getLocal("n"))),
|
||||
c.call(
|
||||
"getSignal",
|
||||
c.getLocal("cIdx"),
|
||||
c.i32_add(
|
||||
c.getLocal("pR"),
|
||||
c.i32_mul(
|
||||
c.getLocal("i"),
|
||||
c.i32_const(builder.sizeFr)
|
||||
)
|
||||
),
|
||||
c.getLocal("component"),
|
||||
c.i32_add(
|
||||
c.getLocal("signal"),
|
||||
c.getLocal("i")
|
||||
)
|
||||
),
|
||||
c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))),
|
||||
c.br(0)
|
||||
))
|
||||
);
|
||||
}
|
||||
|
||||
function buildSetSignal() {
|
||||
const f = module.addFunction("setSignal");
|
||||
@@ -847,6 +883,7 @@ module.exports = function buildRuntime(module, builder) {
|
||||
|
||||
buildGetSignal();
|
||||
buildSetSignal();
|
||||
buildMultiGetSignal();
|
||||
|
||||
buildComponentStarted();
|
||||
buildComponentFinished();
|
||||
@@ -867,6 +904,7 @@ module.exports = function buildRuntime(module, builder) {
|
||||
module.exportFunction("getFrLen");
|
||||
module.exportFunction("getSignalOffset32");
|
||||
module.exportFunction("setSignal");
|
||||
module.exportFunction("multiGetSignal");
|
||||
module.exportFunction("getPWitness");
|
||||
module.exportFunction("Fr_toInt");
|
||||
module.exportFunction("getPRawPrime");
|
||||
|
||||
@@ -62,8 +62,9 @@ class CodeBuilderWasm {
|
||||
this.ops.push({op: "SETSIGNAL", component, signal, value});
|
||||
}
|
||||
|
||||
getSignal(dLabel, component, signal) {
|
||||
this.ops.push({op: "GETSIGNAL", dLabel, component, signal});
|
||||
getSignal(dLabel, component, signal, n) {
|
||||
if (typeof n == "undefined") n=1;
|
||||
this.ops.push({op: "GETSIGNAL", dLabel, component, signal, n});
|
||||
}
|
||||
|
||||
copyN(dLabel, offset, src, n) {
|
||||
@@ -251,11 +252,12 @@ class CodeBuilderWasm {
|
||||
} else if (o.op == "GETSIGNAL") {
|
||||
code.push(
|
||||
c.call(
|
||||
"getSignal",
|
||||
"multiGetSignal",
|
||||
c.getLocal("cIdx"),
|
||||
this.fnBuilder._getPtr(c, o.dLabel),
|
||||
this.fnBuilder._deRefInt(c, o.component),
|
||||
this.fnBuilder._deRefInt(c, o.signal)
|
||||
this.fnBuilder._deRefInt(c, o.signal),
|
||||
c.i32_const(o.n)
|
||||
)
|
||||
);
|
||||
} else if (o.op == "COPYN") {
|
||||
|
||||
Reference in New Issue
Block a user