diff --git a/src/c_build.js b/src/c_build.js index a6768ff..b1a1a42 100644 --- a/src/c_build.js +++ b/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}`); diff --git a/src/c_gen.js b/src/c_gen.js index a8eb393..623d8cc 100644 --- a/src/c_gen.js +++ b/src/c_gen.js @@ -55,7 +55,7 @@ function instantiateRef(ctx, refId, initValue) { for (let i=0; icircuit->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) {