@guildofweavers/air-assembly
Advanced tools
Comparing version 0.2.6 to 0.3.0
@@ -173,3 +173,3 @@ declare module '@guildofweavers/air-assembly' { | ||
addInputRegister(scope: string, binary: boolean, parentIdx?: number, steps?: number, offset?: number): void; | ||
addInputRegister(scope: string, binary: boolean, master?: InputRegisterMaster, steps?: number, offset?: number): void; | ||
addMaskRegister(sourceIdx: number, inverted: boolean): void; | ||
@@ -273,6 +273,12 @@ addCyclicRegister(values: bigint[] | PrngSequence): void; | ||
readonly offset : number; | ||
readonly parent? : number; | ||
readonly master? : InputRegisterMaster; | ||
readonly steps? : number; | ||
} | ||
export type InputRegisterRelation = 'childof' | 'peerof'; | ||
export interface InputRegisterMaster { | ||
readonly index : number; | ||
readonly relation : InputRegisterRelation; | ||
} | ||
export interface MaskRegister extends StaticRegister { | ||
@@ -279,0 +285,0 @@ readonly source : number; |
@@ -50,12 +50,15 @@ "use strict"; | ||
} | ||
addInputRegister(scope, binary, parentIdx, steps, offset) { | ||
addInputRegister(scope, binary, master, steps, offset) { | ||
const registerIdx = this.staticRegisterCount; | ||
utils_1.validate(registerIdx === this._inputRegisters.length, errors.inputRegOutOfOrder()); | ||
let rank = 0; | ||
if (typeof parentIdx === 'number') { | ||
const parent = this._inputRegisters[parentIdx]; | ||
utils_1.validate(parent, errors.invalidInputParentIndex(registerIdx, parentIdx)); | ||
utils_1.validate(parent instanceof registers_1.InputRegister, errors.inputParentNotInputReg(registerIdx, parentIdx)); | ||
utils_1.validate(!parent.isLeaf, errors.inputParentIsLeafReg(registerIdx, parentIdx)); | ||
rank = parent.rank + 1; | ||
if (master) { | ||
const relation = master.relation; | ||
const masterReg = this._inputRegisters[master.index]; | ||
utils_1.validate(relation === 'peerof' || relation === 'childof', errors.invalidInputMasterRel(registerIdx, relation)); | ||
; | ||
utils_1.validate(masterReg, errors.invalidInputMasterIndex(registerIdx, master.index)); | ||
utils_1.validate(masterReg instanceof registers_1.InputRegister, errors.inputMasterNotInputReg(registerIdx, master.index)); | ||
utils_1.validate(!masterReg.isLeaf, errors.inputMasterIsLeafReg(registerIdx, master.index)); | ||
rank = (relation === 'peerof' ? masterReg.rank : masterReg.rank + 1); | ||
} | ||
@@ -68,3 +71,3 @@ else { | ||
} | ||
const register = new registers_1.InputRegister(scope, rank, binary, parentIdx, steps, offset); | ||
const register = new registers_1.InputRegister(scope, rank, binary, master, steps, offset); | ||
this._inputRegisters.push(register); | ||
@@ -173,4 +176,4 @@ this._staticRegisters.push(register); | ||
registers.delete(register); | ||
register = register.parent !== undefined | ||
? this._inputRegisters[register.parent] | ||
register = register.master !== undefined | ||
? this._inputRegisters[register.master.index] | ||
: undefined; | ||
@@ -195,5 +198,6 @@ } | ||
inputCycleTooBig: (c, t) => `input cycle length (${c}) cannot be greater than trace cycle length (${t})`, | ||
invalidInputParentIndex: (r, s) => `invalid parent for input register ${r}: register ${s} is undefined`, | ||
inputParentNotInputReg: (r, s) => `invalid parent for input register ${r}: register ${s} is not an input register`, | ||
inputParentIsLeafReg: (r, s) => `invalid parent for input register ${r}: register ${s} is a leaf register`, | ||
invalidInputMasterIndex: (r, s) => `invalid master for input register ${r}: register ${s} is undefined`, | ||
invalidInputMasterRel: (r, p) => `invalid master for input register ${r}: '${p}' is not a valid relation`, | ||
inputMasterNotInputReg: (r, s) => `invalid master for input register ${r}: register ${s} is not an input register`, | ||
inputMasterIsLeafReg: (r, s) => `invalid master for input register ${r}: register ${s} is a leaf register`, | ||
danglingInputRegisters: (d) => `cycle length for input registers ${d.join(', ')} is not defined`, | ||
@@ -200,0 +204,0 @@ maskRegOutOfOrder: () => `mask registers cannot be preceded by cyclic registers`, |
@@ -120,3 +120,3 @@ "use strict"; | ||
e.params.forEach((p, i) => { | ||
fnContext.info.param[i] = this.visit(p, fnContext); | ||
fnContext.info.param[i] = this.visit(p, ctx); | ||
}); | ||
@@ -123,0 +123,0 @@ // analyze statements |
@@ -111,3 +111,3 @@ "use strict"; | ||
rank: register.rank, | ||
parent: register.parent, | ||
parent: findInputParentIndex(register, component), | ||
secret: register.secret, | ||
@@ -128,2 +128,10 @@ binary: register.binary, | ||
} | ||
function findInputParentIndex(register, component) { | ||
let index; | ||
while (register.master) { | ||
index = register.master.index; | ||
register = component.staticRegisters[register.master.index]; | ||
} | ||
return index; | ||
} | ||
//# sourceMappingURL=generator.js.map |
@@ -24,3 +24,4 @@ "use strict"; | ||
exports.Binary = chevrotain_1.createToken({ name: "Binary", pattern: /binary/, longer_alt: exports.Identifier }); | ||
exports.Parent = chevrotain_1.createToken({ name: "Parent", pattern: /parent/, longer_alt: exports.Identifier }); | ||
exports.ChildOf = chevrotain_1.createToken({ name: "ChildOf", pattern: /childof/, longer_alt: exports.Identifier }); | ||
exports.PeerOf = chevrotain_1.createToken({ name: "PeerOf", pattern: /peerof/, longer_alt: exports.Identifier }); | ||
exports.Steps = chevrotain_1.createToken({ name: "Steps", pattern: /steps/, longer_alt: exports.Identifier }); | ||
@@ -84,4 +85,4 @@ exports.Shift = chevrotain_1.createToken({ name: "Shift", pattern: /shift/, longer_alt: exports.Identifier }); | ||
exports.Export, exports.Registers, exports.Constraints, exports.Init, | ||
exports.Module, exports.Field, exports.Prime, exports.Const, exports.Static, exports.Input, exports.Secret, exports.Public, exports.Binary, exports.Parent, exports.Steps, exports.Shift, exports.Cycle, | ||
exports.Prng, exports.Sha256, exports.Mask, exports.Inverted, exports.Function, exports.Transition, exports.Evaluation, exports.Result, exports.Param, exports.Local, | ||
exports.Module, exports.Field, exports.Prime, exports.Const, exports.Static, exports.Input, exports.Secret, exports.Public, exports.Binary, exports.ChildOf, exports.PeerOf, exports.Steps, exports.Shift, | ||
exports.Cycle, exports.Prng, exports.Sha256, exports.Mask, exports.Inverted, exports.Function, exports.Transition, exports.Evaluation, exports.Result, exports.Param, exports.Local, | ||
exports.Scalar, exports.Vector, exports.Matrix, | ||
@@ -88,0 +89,0 @@ exports.Get, exports.Slice, exports.BinaryOp, exports.Add, exports.Sub, exports.Mul, exports.Div, exports.Exp, exports.Prod, exports.UnaryOp, exports.Neg, exports.Inv, |
@@ -172,8 +172,11 @@ "use strict"; | ||
const binary = this.OPTION1(() => this.CONSUME(lexer_1.Binary)) ? true : false; | ||
const parent = this.OPTION2(() => { | ||
const master = this.OPTION2(() => { | ||
this.CONSUME2(lexer_1.LParen); | ||
this.CONSUME(lexer_1.Parent); | ||
const relation = this.OR2([ | ||
{ ALT: () => this.CONSUME(lexer_1.ChildOf).image }, | ||
{ ALT: () => this.CONSUME(lexer_1.PeerOf).image } | ||
]); | ||
const index = this.SUBRULE1(this.integerLiteral); | ||
this.CONSUME2(lexer_1.RParen); | ||
return index; | ||
return { index, relation }; | ||
}); | ||
@@ -195,3 +198,3 @@ const steps = this.OPTION3(() => { | ||
this.CONSUME1(lexer_1.RParen); | ||
this.ACTION(() => component.addInputRegister(scope, binary, parent, steps, offset)); | ||
this.ACTION(() => component.addInputRegister(scope, binary, master, steps, offset)); | ||
}); | ||
@@ -198,0 +201,0 @@ this.maskRegister = this.RULE('maskRegister', (component) => { |
@@ -10,7 +10,7 @@ "use strict"; | ||
// -------------------------------------------------------------------------------------------- | ||
constructor(scope, rank, binary, parent, steps, offset = 0) { | ||
constructor(scope, rank, binary, master, steps, offset = 0) { | ||
super(); | ||
utils_1.validate(scope === 'public' || scope === 'secret', errors.inputScopeInvalid(scope)); | ||
utils_1.validate(rank > 0, errors.inputRankTooSmall()); | ||
utils_1.validate(rank === 1 || parent !== undefined, errors.inputRankInvalid(rank)); | ||
utils_1.validate(rank === 1 || master !== undefined, errors.inputRankInvalid(rank)); | ||
if (steps !== undefined) { | ||
@@ -23,3 +23,3 @@ utils_1.validate(utils_1.isPowerOf2(steps), errors.stepsNotPowerOf2()); | ||
this.offset = offset; | ||
this.parent = parent; | ||
this.master = master; | ||
this.steps = steps; | ||
@@ -30,3 +30,3 @@ } | ||
get isRoot() { | ||
return (this.parent === undefined); | ||
return (this.master === undefined); | ||
} | ||
@@ -40,7 +40,7 @@ get isLeaf() { | ||
const scope = this.secret ? 'secret' : 'public'; | ||
const parent = this.parent === undefined ? '' : ` (parent ${this.parent})`; | ||
const master = this.master ? ` (${this.master.relation} ${this.master.index})` : ''; | ||
const binary = this.binary ? ' binary' : ''; | ||
const offset = this.offset === 0 ? '' : ` (shift ${this.offset})`; | ||
const steps = (this.steps !== undefined) ? ` (steps ${this.steps})` : ''; | ||
return `(input ${scope}${binary}${parent}${steps}${offset})`; | ||
return `(input ${scope}${binary}${master}${steps}${offset})`; | ||
} | ||
@@ -53,3 +53,3 @@ } | ||
inputScopeInvalid: (s) => `input register scope '${s}' is not valid`, | ||
inputRankInvalid: (r) => `invalid input register rank: register of rank ${r} has no parent`, | ||
inputRankInvalid: (r) => `invalid input register rank: register of rank ${r} has no master`, | ||
inputRankTooSmall: () => `input register rank must be greater than 0`, | ||
@@ -56,0 +56,0 @@ stepsNotPowerOf2: () => `input register cycle length must be a power of 2` |
{ | ||
"name": "@guildofweavers/air-assembly", | ||
"version": "0.2.6", | ||
"version": "0.3.0", | ||
"description": "A low-level language for encoding Algebraic Intermediate Representation of computations", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
239550
4442