Skip to content

Commit 6aa09f2

Browse files
authored
Merge pull request #11 from distributed-lab/fix/unary-sub
Fix bug with incorrect handle of unary sub operator
2 parents 5d1639a + 80bd23c commit 6aa09f2

File tree

5 files changed

+61
-5
lines changed

5 files changed

+61
-5
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@distributedlab/circom-parser",
33
"description": "Circom circuit parser built with ANTLR4",
4-
"version": "0.2.2",
4+
"version": "0.2.3",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",
77
"files": [

src/utils/ExpressionHelper.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,10 @@ class ExpressionVisitor extends ExtendedCircomVisitor<CircomValueType | null> {
248248
return firstExpression ? 0n : 1n;
249249
case CircomParser.BNOT:
250250
return ~firstExpression;
251-
case CircomParser.SUB:
252-
return -firstExpression;
251+
}
252+
253+
if (operationType == CircomParser.SUB && ctx.expression(1) == null) {
254+
return -firstExpression;
253255
}
254256

255257
const secondExpression = this.visit(ctx.expression(1));

test/circom-template-inputs-visitor.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,41 @@ describe("Circom Template Inputs Visitor", () => {
169169
expect(visitor.templateInputs.out.type).to.equal("output");
170170
expect(visitor.templateInputs.out.dimension).to.deep.equal([]);
171171
});
172+
173+
it("should analyse the BigModNonEqual.circom circuit", () => {
174+
const data = getData("BigModNonEqual.circom");
175+
176+
const visitor = new CircomTemplateInputsVisitor(
177+
"BigModNonEqual.circom",
178+
data.templates[data.mainComponentInfo.templateName!].context,
179+
buildVariableContext(
180+
data.templates[data.mainComponentInfo.templateName!].parameters,
181+
data.mainComponentInfo.parameters,
182+
),
183+
);
184+
185+
visitor.startParse();
186+
187+
console.log(visitor.templateInputs);
188+
189+
expect(visitor.errors.length).to.equal(0);
190+
191+
expect(visitor.templateInputs.base.type).to.equal("input");
192+
expect(visitor.templateInputs.base.dimension).to.deep.equal([6]);
193+
194+
expect(visitor.templateInputs.modulus.type).to.equal("input");
195+
expect(visitor.templateInputs.modulus.dimension).to.deep.equal([4]);
196+
197+
expect(visitor.templateInputs.dummy.type).to.equal("input");
198+
expect(visitor.templateInputs.dummy.dimension).to.deep.equal([]);
199+
200+
expect(visitor.templateInputs.div.type).to.equal("output");
201+
expect(visitor.templateInputs.div.dimension).to.deep.equal([3]);
202+
203+
expect(visitor.templateInputs.mod.type).to.equal("output");
204+
expect(visitor.templateInputs.mod.dimension).to.deep.equal([4]);
205+
206+
expect(visitor.templateInputs.another.type).to.equal("output");
207+
expect(visitor.templateInputs.another.dimension).to.deep.equal([4]);
208+
});
172209
});

test/data/BigModNonEqual.circom

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
pragma circom 2.1.8;
2+
3+
template BigModNonEqual(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER_MODULUS){
4+
var CHUNK_NUMBER_DIV = CHUNK_NUMBER_BASE - CHUNK_NUMBER_MODULUS + 1;
5+
6+
var SOME_RANDOM = -CHUNK_NUMBER_BASE + 10;
7+
8+
signal input base[CHUNK_NUMBER_BASE];
9+
signal input modulus[CHUNK_NUMBER_MODULUS];
10+
signal input dummy;
11+
12+
signal output div[CHUNK_NUMBER_DIV];
13+
signal output mod[CHUNK_NUMBER_MODULUS];
14+
signal output another[SOME_RANDOM];
15+
}
16+
17+
component main = BigModNonEqual(64, 6, 4);

0 commit comments

Comments
 (0)