vscode plugin rework
This commit is contained in:
parent
6ec03a5ca3
commit
fc855547a8
45
lib/get-vcd.js
Normal file
45
lib/get-vcd.js
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const maxChunkLength = 1 << 17; // Number.MAX_SAFE_INTEGER; // 5e6; // 300000; // 1 << 23;
|
||||||
|
|
||||||
|
const getVcd = async (readers, content, inst) => {
|
||||||
|
const r = readers.find(reader => reader.ext === 'vcd');
|
||||||
|
if (r) {
|
||||||
|
// console.log('VCD', r);
|
||||||
|
document.title = r.baseName;
|
||||||
|
content.innerHTML = '<div class="wd-progress">LOADING...</div>';
|
||||||
|
let total = 0;
|
||||||
|
outerLoop:
|
||||||
|
for (let i = 0; i < 1e5; i++) {
|
||||||
|
const { done, value } = await r.reader.read();
|
||||||
|
|
||||||
|
if (done && (value === undefined)) {
|
||||||
|
// console.log('the end');
|
||||||
|
inst.end();
|
||||||
|
break outerLoop;
|
||||||
|
}
|
||||||
|
const len = value.length;
|
||||||
|
for (let j = 0; j < len; j += maxChunkLength) {
|
||||||
|
const value1 = value.slice(j, j + maxChunkLength);
|
||||||
|
const len1 = value1.length;
|
||||||
|
total += len1;
|
||||||
|
|
||||||
|
// const vh = u8toStr(value1.slice(0, 100));
|
||||||
|
// const vt = u8toStr(value1.slice(-100));
|
||||||
|
// console.log({len1, done, total, vh, vt});
|
||||||
|
|
||||||
|
content.innerHTML = '<div class="wd-progress">' + total.toLocaleString() + '</div>';
|
||||||
|
if (done && ((j + maxChunkLength) >= len)) {
|
||||||
|
// console.log('last chunk');
|
||||||
|
inst.end(value1);
|
||||||
|
break outerLoop;
|
||||||
|
}
|
||||||
|
inst.write(value1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = getVcd;
|
||||||
|
|
||||||
|
/* eslint-env browser */
|
95
lib/vcd-pipe-deso.js
Normal file
95
lib/vcd-pipe-deso.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
'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);
|
||||||
|
});
|
||||||
|
};
|
File diff suppressed because one or more lines are too long
BIN
out/vcd.wasm
BIN
out/vcd.wasm
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user