arnaucube
arnaucube/circomPublic Self-hosted repository
Optimize number of getSignalOffset and getSignalSizes
Jordi Baylina jordi@baylina.cat
Tue, 28 Jan 2020 15:17:47 +0100
commit

a8d597d8c53f56460704f1740dc13adca64d19f8

parent

3a9766a008de824bbbfc97fd7974e9488c2dfa5b

2 files changed, 43 insertions(+), 7 deletions(-)

jump to
M src/c_build.js → src/c_build.js

@@ -162,6 +162,8 @@ ctx.uniqueNames = Object.assign({},ctx.globalNames);

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}`);
M src/c_gen.js → src/c_gen.js

@@ -55,7 +55,7 @@ if (v.type == "BIGINT") {

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 @@ return sizesRef;

} 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 @@ s = cIdx.label;

} else { s = "__cIdx"; } - ctx.code += `${offset.label} = ctx->getSignalOffset(${s}, 0x${h}LL /* ${label} */);\n`; + 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 @@ } else {

s = "__cIdx"; } const h = utils.fnvHash(label); - ctx.code += `${sizes.label} = ctx->getSignalSizes(${s}, 0x${h}LL /* ${label} */);\n`; - return sizesRef; + 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 refSizes; } function genSetSignal(ctx, cIdxRef, sIdxRef, valueRef) {