mirror of
https://github.com/arnaucube/circom.git
synced 2026-02-06 18:56:40 +01:00
Optimize number of getSignalOffset and getSignalSizes
This commit is contained in:
@@ -162,6 +162,8 @@ function buildCode(ctx) {
|
||||
ctx.refs = [];
|
||||
ctx.fileName = ctx.templates[ctx.components[i].template].fileName;
|
||||
ctx.filePath = ctx.templates[ctx.components[i].template].filePath;
|
||||
ctx.getSignalSizesCache = {};
|
||||
ctx.getSignalOffsetCache = {};
|
||||
|
||||
for (let p in ctx.components[i].params) {
|
||||
if (ctx.scopes[0][p]) return ctx.throwError(`Repeated parameter at ${ctx.components[i].template}: ${p}`);
|
||||
|
||||
44
src/c_gen.js
44
src/c_gen.js
@@ -55,7 +55,7 @@ function instantiateRef(ctx, refId, initValue) {
|
||||
for (let i=0; i<initValue.length; i++) {
|
||||
if (utils.isDefined(initValue[i])) {
|
||||
const idConstant = ctx.addConstant(initValue[i]);
|
||||
ctx.code += `Fr_copy(&(${v.label}[${i}]), ctx->circuit->constants +${idConstant});\n`;
|
||||
ctx.codeHeader += `Fr_copy(&(${v.label}[${i}]), ctx->circuit->constants +${idConstant});\n`;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -537,6 +537,18 @@ function genGetSubComponentSizes(ctx, cIdxRef, label) {
|
||||
}
|
||||
|
||||
function genGetSigalOffset(ctx, cIdxRef, label) {
|
||||
|
||||
let constCIdx = null;
|
||||
if (cIdxRef>=0) {
|
||||
const cIdx = ctx.refs[cIdxRef];
|
||||
if (utils.isDefined(cIdx.value)) {
|
||||
constCIdx = cIdx.value.toString()+"_"+label;
|
||||
}
|
||||
} else {
|
||||
constCIdx = "_cIdx_"+label;
|
||||
}
|
||||
if (constCIdx && ctx.getSignalOffsetCache[constCIdx]) return ctx.getSignalOffsetCache[constCIdx];
|
||||
|
||||
const refOffset = newRef(ctx, "INT", "_sigIdx");
|
||||
const offset = ctx.refs[refOffset];
|
||||
instantiateRef(ctx, refOffset);
|
||||
@@ -549,14 +561,31 @@ function genGetSigalOffset(ctx, cIdxRef, label) {
|
||||
} else {
|
||||
s = "__cIdx";
|
||||
}
|
||||
if (constCIdx) {
|
||||
ctx.codeHeader += `${offset.label} = ctx->getSignalOffset(${s}, 0x${h}LL /* ${label} */);\n`;
|
||||
ctx.getSignalOffsetCache[constCIdx] = refOffset;
|
||||
} else {
|
||||
ctx.code += `${offset.label} = ctx->getSignalOffset(${s}, 0x${h}LL /* ${label} */);\n`;
|
||||
}
|
||||
return refOffset;
|
||||
}
|
||||
|
||||
function genGetSignalSizes(ctx, cIdxRef, label) {
|
||||
const sizesRef = newRef(ctx, "SIZES", "_sigSizes");
|
||||
const sizes = ctx.refs[sizesRef];
|
||||
instantiateRef(ctx, sizesRef);
|
||||
let constCIdx = null;
|
||||
if (cIdxRef>=0) {
|
||||
const cIdx = ctx.refs[cIdxRef];
|
||||
if (utils.isDefined(cIdx.value)) {
|
||||
constCIdx = cIdx.value.toString()+"_"+label;
|
||||
}
|
||||
} else {
|
||||
constCIdx = "_cIdx_"+label;
|
||||
}
|
||||
if (constCIdx && ctx.getSignalSizesCache[constCIdx]) return ctx.getSignalSizesCache[constCIdx];
|
||||
|
||||
|
||||
const refSizes = newRef(ctx, "SIZES", "_sigSizes");
|
||||
const sizes = ctx.refs[refSizes];
|
||||
instantiateRef(ctx, refSizes);
|
||||
|
||||
let s;
|
||||
if (cIdxRef>=0) {
|
||||
@@ -566,8 +595,13 @@ function genGetSignalSizes(ctx, cIdxRef, label) {
|
||||
s = "__cIdx";
|
||||
}
|
||||
const h = utils.fnvHash(label);
|
||||
if (constCIdx) {
|
||||
ctx.codeHeader += `${sizes.label} = ctx->getSignalSizes(${s}, 0x${h}LL /* ${label} */);\n`;
|
||||
ctx.getSignalSizesCache[constCIdx] = refSizes;
|
||||
} else {
|
||||
ctx.code += `${sizes.label} = ctx->getSignalSizes(${s}, 0x${h}LL /* ${label} */);\n`;
|
||||
return sizesRef;
|
||||
}
|
||||
return refSizes;
|
||||
}
|
||||
|
||||
function genSetSignal(ctx, cIdxRef, sIdxRef, valueRef) {
|
||||
|
||||
Reference in New Issue
Block a user