|
|
const Readable = require("stream").Readable;
module.exports = function buildSyms(ctx) { const rs = Readable();
let it = new ComponentIt(ctx, 0, "main");
let counter = 0;
rs._read = function() { const actual = it.current(); if (actual == null ) { rs.push(null); return; }
let s=actual.offset; while (ctx.signals[s].e >= 0) s = ctx.signals[s].e; let wId = ctx.signals[s].id; if (typeof(wId) == "undefined") wId=-1; rs.push(`${actual.offset},${wId},${actual.cIdx},${actual.name}\n`);
it.next(); counter ++; if ((ctx.verbose)&&(counter%10000 == 0)) console.log("Symbols saved: "+counter); };
return rs; };
class SignalIt { constructor (ctx, offset, prefix, cIdx) { this.ctx = ctx; this.offset = offset; this.prefix = prefix; this.cur = 0; this.cIdx = cIdx; }
next() { this.cur = 1;
return this.current(); }
current() { if (this.cur == 0) { return {offset: this.offset, name: this.prefix, cIdx: this.cIdx}; } } }
class ArrayIt { constructor (ctx, type, sizes, offset, prefix, cIdx) { if (sizes.length == 0) { if (type == "S") { return new SignalIt(ctx, offset, prefix, cIdx); } else { return new ComponentIt(ctx, offset, prefix); } }
this.ctx = ctx; this.type = type; this.sizes = sizes; this.offset = offset; this.prefix = prefix; this.cIdx = cIdx;
this.subIt = null; this.cur = 0;
this.subArrSize = 1;
for (let i=1; i<sizes.length; i++) { this.subArrSize *= sizes[i]; }
this._loadSubIt();
}
_loadSubIt() { if (this.cur < this.sizes[0]) { this.subIt = new ArrayIt(this.ctx, this.type, this.sizes.slice(1), this.offset + this.cur*this.subArrSize, this.prefix + "[" + this.cur + "]", this.cIdx); } }
next() { if (this.subIt) { const res = this.subIt.next(); if (res == null) { this.subIt = null; this.cur++; this._loadSubIt(); } }
return this.current();
}
current() { if (this.subIt) { return this.subIt.current(); } else { return null; } } }
class ComponentIt { constructor (ctx, idxComponent, prefix) { this.ctx = ctx; this.idxComponent = idxComponent; this.prefix = prefix; this.names = Object.keys(ctx.components[idxComponent].names.o);
this.subIt = null; this.cur = 0; this._loadSubIt();
}
_loadSubIt() { if (this.cur < this.names.length) { const entrie = this.ctx.components[this.idxComponent].names.o[this.names[this.cur]]; this.subIt = new ArrayIt(this.ctx, entrie.type, entrie.sizes, entrie.offset, this.prefix + "." + this.names[this.cur], this.idxComponent); } }
next() { if (this.subIt) { const res = this.subIt.next(); if (res == null) { this.subIt = null; this.cur++; this._loadSubIt(); } }
return this.current(); }
current() { if (this.subIt) { return this.subIt.current(); } else { return null; } } }
|