Browse Source

Optimize number of getSignalOffset and getSignalSizes

feature/witness_bin
Jordi Baylina 4 years ago
parent
commit
a8d597d8c5
No known key found for this signature in database GPG Key ID: 7480C80C1BE43112
2 changed files with 43 additions and 7 deletions
  1. +2
    -0
      src/c_build.js
  2. +41
    -7
      src/c_gen.js

+ 2
- 0
src/c_build.js

@ -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}`);

+ 41
- 7
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";
}
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 @@ function genGetSignalSizes(ctx, cIdxRef, label) {
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) {

Loading…
Cancel
Save