arnaucube
arnaucube/circomPublic Self-hosted repository
Merge branch 'master' into c_build
Jordi Baylina jordi@baylina.cat
Wed, 04 Dec 2019 22:13:55 +0100
commit

1e3d1235cbb8054d5791e605c1a723de706bb081

parent

0be08d67b0264ff59eef4c84baa95cda84670caf

4 files changed, 98 insertions(+), 50 deletions(-)

jump to
M README.md → README.md

@@ -177,7 +177,7 @@ out[1] * (out[0] - 1) === 0

. . . - out[n+e-1] * (out[n+e-1] - 1) == 0 + out[n+e-1] * (out[n+e-1] - 1) === 0 */
M package-lock.json → package-lock.json

@@ -1,6 +1,6 @@

{ "name": "circom", - "version": "0.0.34", + "version": "0.0.35", "lockfileVersion": 1, "requires": true, "dependencies": {
M package.json → package.json

@@ -1,6 +1,6 @@

{ "name": "circom", - "version": "0.0.34", + "version": "0.0.35", "description": "Language to generate logic circuits", "main": "index.js", "directories": {
M src/exec.js → src/exec.js

@@ -183,24 +183,6 @@ }

return res; } -function setScope(ctx, name, selectors, value) { - let l = getScopeLevel(ctx, name); - if (l==-1) l= ctx.scopes.length-1; - - if (selectors.length == 0) { - ctx.scopes[l][name] = value; - } else { - setScopeArray(ctx.scopes[l][name], selectors); - } - - function setScopeArray(a, sels) { - if (sels.length == 1) { - a[sels[0].value] = value; - } else { - setScopeArray(a[sels[0]], sels.slice(1)); - } - } -} function getScope(ctx, name, selectors) {

@@ -229,7 +211,7 @@ }

} for (let i=ctx.scopes.length-1; i>=0; i--) { - if (ctx.scopes[i][name]) return select(ctx.scopes[i][name], sels); + if (ctx.scopes[i][name]) return select(ctx.scopes[i][name].value, sels); } return null;

@@ -250,6 +232,52 @@ return res;

} } +function getScopeRef(ctx, name, selectors) { + + const sels = []; + if (selectors) { + for (let i=0; i< selectors.length; i++) { + const idx = exec(ctx, selectors[i]); + if (ctx.error) return; + + if (idx.type != "NUMBER") return error(ctx, selectors[i], "expected a number"); + sels.push( idx.value.toJSNumber() ); + } + } + + + function select(v, s, t) { + s = s || []; + if (s.length == 0) return [v, sels, t]; + return select(v[s[0]], s.slice(1), t); + } + + for (let i=ctx.scopes.length-1; i>=0; i--) { + if (ctx.scopes[i][name]) return select(ctx.scopes[i][name].value, sels, ctx.scopes[i][name].type); + } + return [null, [], ""]; +} + + +function setScopeRef(ctx, name, sels, value) { + let l = getScopeLevel(ctx, name); + if (l==-1) l= ctx.scopes.length-1; + + if (sels.length == 0) { + ctx.scopes[l][name].value = value; + } else { + setScopeArray(ctx.scopes[l][name].value, sels); + } + + function setScopeArray(a, sels) { + if (sels.length == 1) { + a[sels[0]] = value; + } else { + setScopeArray(a[sels[0]], sels.slice(1)); + } + } +} + function getScopeLevel(ctx, name) { for (let i=ctx.scopes.length-1; i>=0; i--) { if (ctx.scopes[i][name]) return i;

@@ -273,11 +301,14 @@ return error(ctx, ast, "Name already exists: "+ast.name);

} scope[ast.name] = { type: "TEMPLATE", - params: ast.params, - block: ast.block, - fileName: ctx.fileName, - filePath: ctx.filePath, - scopes: copyScope(ctx.scopes) + value: { + type: "TEMPLATE", + params: ast.params, + block: ast.block, + fileName: ctx.fileName, + filePath: ctx.filePath, + scopes: copyScope(ctx.scopes) + } }; ctx.templates[ast.name] = { block: ast.block,

@@ -294,11 +325,14 @@ }

ctx.functionParams[ast.name] = ast.params; scope[ast.name] = { type: "FUNCTION", - params: ast.params, - block: ast.block, - fileName: ctx.fileName, - filePath: ctx.filePath, - scopes: copyScope(ctx.scopes) + value: { + type: "FUNCTION", + params: ast.params, + block: ast.block, + fileName: ctx.fileName, + filePath: ctx.filePath, + scopes: copyScope(ctx.scopes) + } }; ctx.functions[ast.name] = { block: ast.block,

@@ -327,8 +361,11 @@ const cIdx = ctx.addComponent(ast.name.name, sizes);

scope[ast.name.name] = { type: "COMPONENT", - sizes: sizes, - cIdx: Array.isArray(cIdx) ? cIdx[0] : cIdx + value: { + type: "COMPONENT", + sizes: sizes, + cIdx: Array.isArray(cIdx) ? cIdx[0] : cIdx + } }; return {

@@ -412,7 +449,10 @@ if (template.params.length != paramValues.length) return error(ctx, fn, "Invalid number of parameters: " + templateName);

const scope = {}; for (let i=0; i< template.params.length; i++) { - scope[template.params[i]] = paramValues[i]; + scope[template.params[i]] = { + type: "VARIABLE", + value: paramValues[i] + }; ctx.components[cIdx].params[template.params[i]] = extractValue(paramValues[i]); }

@@ -466,7 +506,10 @@ ctx.scopes = oldScopes.slice(0, scopeLevel+1);

const scope = {}; for (let i=0; i< fnc.params.length; i++) { - scope[fnc.params[i]] = paramValues[i]; + scope[fnc.params[i]] = { + type: "VARIABLE", + value: paramValues[i] + }; } ctx.fileName = fnc.fileName;

@@ -535,8 +578,11 @@ // ctx.components[ctx.currentComponent].signals.push(i);

} scope[ast.name.name] = { type: "SIGNAL", - sizes: sizes, - sIdx: sIdx[0] + value: { + type: "SIGNAL", + sizes: sizes, + sIdx: sIdx[0] + } }; return { type: "VARIABLE",

@@ -560,12 +606,15 @@ if (size.type != "NUMBER") return error(ctx, ast.name.selectors[i], "expected a number");

sizes.push( size.value.toJSNumber() ); } - scope[ast.name.name] = iterateSelectors(ctx, sizes, "", function() { - return { - type: "NUMBER", - value: bigInt(0) - }; - }); + scope[ast.name.name] = { + type: "VARIABLE", + value: iterateSelectors(ctx, sizes, "", function() { + return { + type: "NUMBER", + value: bigInt(0) + }; + }) + }; return { type: "VARIABLE",

@@ -702,21 +751,20 @@ if (ctx.error) return;

} else { v = ast.values[0]; } - const num = getScope(ctx, v.name, v.selectors); + const [num, sels, typ] = getScopeRef(ctx, v.name, v.selectors); if (ctx.error) return; if ((typeof(num) != "object")||(num == null)) return error(ctx, ast, "Variable not defined"); - if (num.type == "COMPONENT") return execInstantiateComponet(ctx, v, ast.values[1]); + if (typ == "COMPONENT") return execInstantiateComponet(ctx, v, ast.values[1]); if (ctx.error) return; - if ((num.type == "SIGNAL")&&(ast.op == "=")) return error(ctx, ast, "Cannot assign to a signal with `=` use <-- or <== ops"); - if ((["NUMBER", "COMPONENT"].indexOf(num.type) >= 0 )&&(ast.op != "=")) return error(ctx, ast, `Cannot assign to a var with ${ast.op}. use = op`); + if ((typ == "SIGNAL")&&(ast.op == "=")) return error(ctx, ast, "Cannot assign to a signal with `=` use <-- or <== ops"); + if ((["NUMBER", "COMPONENT"].indexOf(typ) >= 0 )&&(ast.op != "=")) return error(ctx, ast, `Cannot assign to a var with ${ast.op}. use = op`); const res = exec(ctx, ast.values[1]); if (ctx.error) return; - Object.assign(num, res); -// setScope(ctx, v.name, v.selectors, res); + setScopeRef(ctx, v.name, sels, res); return v; }