circom/src/utils.js
src/utils.jsRaw
1const fnv = require("fnv-plus");
2
3module.exports.ident =ident;
4
5module.exports.extractSizes =extractSizes;
6module.exports.flatArray = flatArray;
7module.exports.csArr = csArr;
8module.exports.accSizes = accSizes;
9module.exports.fnvHash = fnvHash;
10module.exports.sameSizes = sameSizes;
11module.exports.isDefined = isDefined;
12module.exports.accSizes2Str = accSizes2Str;
13module.exports.setUint64 = setUint64;
14
15function ident(text) {
16 if (typeof text === "string") {
17 let lines = text.split("\n");
18 for (let i=0; i<lines.length; i++) {
19 if (lines[i]) lines[i] = " "+lines[i];
20 }
21 return lines.join("\n");
22 } else if (Array.isArray(text)) {
23 for (let i=0; i<text.length; i++ ) {
24 text[i] = ident(text[i]);
25 }
26 return text;
27 }
28}
29
30function extractSizes (o) {
31 if (! Array.isArray(o)) return [];
32 return [o.length, ...extractSizes(o[0])];
33}
34
35function flatArray(a) {
36 var res = [];
37 fillArray(res, a);
38 return res;
39
40 function fillArray(res, a) {
41 if (Array.isArray(a)) {
42 for (let i=0; i<a.length; i++) {
43 fillArray(res, a[i]);
44 }
45 } else {
46 res.push(a);
47 }
48 }
49}
50
51// Input [1,2,3]
52// Returns " ,1 ,2, 3"
53function csArr(_arr) {
54 let S = "";
55 const arr = _arr || [];
56 for (let i=0; i<arr.length; i++) {
57 S = " ,"+arr[i];
58 }
59 return S;
60}
61
62function accSizes(_sizes) {
63 const sizes = _sizes || [];
64 const accSizes = [1, 0];
65 for (let i=sizes.length-1; i>=0; i--) {
66 accSizes.unshift(accSizes[0]*sizes[i]);
67 }
68 return accSizes;
69}
70
71function fnvHash(str) {
72 return fnv.hash(str, 64).hex();
73}
74
75function sameSizes(s1, s2) {
76 if (!Array.isArray(s1)) return false;
77 if (!Array.isArray(s2)) return false;
78 if (s1.length != s2.length) return false;
79 for (let i=0; i<s1.length; i++) {
80 if (s1[i] != s2[i]) return false;
81 }
82 return true;
83}
84
85function isDefined(v) {
86 return ((typeof(v) != "undefined")&&(v != null));
87}
88
89function accSizes2Str(sizes) {
90 if (sizes.length == 2) return "";
91 return `[${sizes[0]/sizes[1]}]`+accSizes2Str(sizes.slice(1));
92}
93
94function setUint64(buffV, o, n) {
95 const sLSB = n >>> 0;
96 const sMSB = (n - sLSB) / 0x100000000;
97 buffV.setUint32(o, sLSB , true);
98 buffV.setUint32(o+4, sMSB , true);
99}
100
101
102
103
104