digital-vcd-parser/lib/vcd-pipe-deso.js
Aliaksei Chapyzhenka fc855547a8 vscode plugin rework
2024-01-21 21:29:39 -08:00

96 lines
2.0 KiB
JavaScript

'use strict';
const parseTimescale = require('./parse-time-scale.js');
const MAX_SAFE_INTEGER = BigInt(Number.MAX_SAFE_INTEGER);
const numberOrString = val => {
if (val < MAX_SAFE_INTEGER) {
return Number(val);
}
return '0x' + val.toString(16);
};
const gcd = (a, b) => {
if (a === undefined) {
return b;
}
let r;
while (b !== 0) {
r = a % b;
a = b;
b = r;
}
return (a < 0) ? -a : a;
};
const tNorm = o => {
const {tgcd, chango} = o;
o.t0 /= tgcd;
o.time /= tgcd;
Object.keys(chango).map(key => {
const {wave} = chango[key];
wave.map(e => {
e[0] /= tgcd;
});
});
const exp = Math.log10(tgcd) |0;
if (exp > 0) {
const scale = Math.pow(10, exp);
const tgcd1 = tgcd / scale;
if (tgcd1 === (tgcd1 |0)) {
o.tgcd = tgcd1;
o.timescale += exp;
}
}
return o;
};
module.exports = async (deso, inst, done) => {
const chango = {};
let tgcd;
deso.chango = chango;
deso.view = [];
const onAnyChange = (id, time, cmd, value, mask) => {
// console.log(id, time, cmd, value, mask);
const time53 = Number(time);
tgcd = gcd(tgcd, time53);
chango[id] = chango[id] || {wave: []};
if (cmd >= 14 && cmd <= 28) {
chango[id].kind = 'bit';
chango[id].wave.push([time53, cmd - 14]);
} else {
chango[id].kind = 'vec';
const point = [time53, numberOrString(value)];
if (mask !== 0n) {
point.push(numberOrString(mask));
}
chango[id].wave.push(point);
}
};
const t0 = Date.now();
inst.on('$enddefinitions', () => {
// console.log('$enddefinitions');
Object.assign(deso.wires, inst.info.wires);
deso.timescale = parseTimescale(inst.info.timescale);
});
inst.change.any(onAnyChange);
inst.on('finish', () => {
console.log((Date.now() - t0) / 1000);
deso.tgcd = tgcd;
deso.t0 = (inst.info.t0 || 0);
// console.log(inst.getTime());
deso.time = Number(inst.getTime());
tNorm(deso);
done(deso);
});
};