11'use strict' ;
22
3- const memmap = require ( 'vcd2/lib/memmap.js' ) ;
4- // const initState = require('vcd2/lib/init-state.js');
3+ const { StyleModule} = require ( 'style-mod' ) ;
4+ const stringify = require ( 'onml/stringify.js' ) ;
5+ // const memmap = require('vcd2/lib/memmap.js');
56const addWasmMemoryViews = require ( 'vcd2/lib/add-wasm-memory-views.js' ) ;
6- // const traceGlPages = require('./trace-gl-pages.js');
7+
8+ const {
9+ createCodeMirrorState,
10+ mountCodeMirror6
11+ } = require ( 'waveql' ) ;
12+
13+ const {
14+ domContainer,
15+ pluginRenderValues,
16+ pluginRenderTimeGrid,
17+ keyBindo,
18+ mountTree,
19+ getElement,
20+ // getListing,
21+ // // renderMenu,
22+ // // mountCodeMirror5,
23+ genKeyHandler,
24+ genOnWheel,
25+ themeAll,
26+ helpPanel
27+ } = require ( '@wavedrom/doppler' ) ;
28+
29+ const pkg = require ( '../package.json' ) ;
30+ const appContext = require ( './app-context.js' ) ;
731const vcdromWorkerUri = require ( '../vcdrom-worker.uri.json' ) ;
832const base64JsBlob = require ( './base64-js-blob.js' ) ;
33+ const dropZone = require ( './drop-zone.js' ) ;
34+ const pluginLocalStore = require ( './plugin-local-store.js' ) ;
35+ const fileInUrl = require ( './file-in-url.js' ) ;
36+ const getFullWaveQL = require ( './get-full-wave-ql.js' ) ;
37+ const parseTimescale = require ( './parse-time-scale.js' ) ;
938
10- global . VCDrom = async ( ) => {
11- // need to be true
12- console . log ( { crossOriginIsolated : window . crossOriginIsolated } ) ;
39+ const genWasmMemory = ( $ ) => async ( e ) => {
40+ console . log ( 'rx: wasmMemory' ) ;
41+ $ . memory = e . data . data ;
42+ addWasmMemoryViews ( $ ) ;
43+ $ . state . vcdParserReady = true ;
44+ } ;
1345
14- document . body . innerHTML = '<div id="container"></div>' ;
15- const container = document . getElementById ( 'container' ) ;
16- const urlSearchParams = new URLSearchParams ( window . location . search ) ;
46+ const genEnddefinitions = ( $ ) => async ( e ) => {
47+ console . log ( 'rx: enddefinitions' ) ;
48+ const { data} = e . data ;
49+ $ . enddefinitions = data ;
50+ $ . state . vcdDefinitionsParsed = true ;
51+ console . log ( data ) ;
52+ } ;
1753
18- const vcdWorker = new Worker ( base64JsBlob ( vcdromWorkerUri ) ) ;
54+ const genStats = ( /* $, statBar */ ) => async ( /* e */ ) => {
55+ console . log ( 'rx: stats' ) ;
56+ // const {data} = e.data;
57+ // if ($.enddefinitions) {
58+ // const timescaleString = $.enddefinitions.timescale;
59+ // const m = timescaleString.trim().match(/^(\d+)\s*(\w+)$/);
60+ // const time = $.memI64[memmap.time] * BigInt(m[1]);
61+ // // statBar.innerHTML =
62+ // // data.totalLength.toLocaleString() + ' Byte, '
63+ // // + time.toLocaleString() + ' ' + m[2];
64+ // } else {
65+ // // statBar.innerHTML = data.totalLength.toLocaleString();
66+ // }
67+ } ;
68+
69+ const genLoadVcdDone = ( ) => async ( ) => {
70+ console . log ( 'rx: loadVcdDone' ) ;
71+ // traceGlPages($);
72+ } ;
1973
20- const $ = { } ; // empty state
74+ const installHandlers = ( $ , vcdWorker , rootDiv ) => {
75+
76+ rootDiv . innerHTML = '' ;
2177
2278 const handlers = {
23- wasmMemory : async ( e ) => {
24- console . log ( 'wasmMemory' ) ;
25- $ . memory = e . data . data ;
26- addWasmMemoryViews ( $ ) ;
27- for ( const [ key , value ] of urlSearchParams ) {
28- if ( key === 'vcd' ) { // ...:8080/?vcd=foo.vcd
29- console . log ( window . location ) ;
30- vcdWorker . postMessage ( {
31- cmd : 'loadVcd' ,
32- data : value
33- } ) ;
34- break ;
35- }
36- }
37- } ,
38- enddefinitions : async ( e ) => {
39- $ . enddefinitions = e . data . data ;
40- console . log ( e . data ) ;
41- } ,
42- stats : async ( ) => {
43- if ( $ . enddefinitions ) {
44- const timescaleString = $ . enddefinitions . timescale ;
45- const m = timescaleString . trim ( ) . match ( / ^ ( \d + ) \s * ( \w + ) $ / ) ;
46- const time = $ . memI64 [ memmap . time ] * BigInt ( m [ 1 ] ) ;
47- container . innerHTML = time . toLocaleString ( ) + ' ' + m [ 2 ] ;
48- } else {
49- container . innerHTML = '0' ;
50- }
51- } ,
52- loadVcdDone : async ( ) => {
53- // traceGlPages($);
54- }
79+ wasmMemory : genWasmMemory ( $ ) ,
80+ enddefinitions : genEnddefinitions ( $ ) ,
81+ stats : genStats ( $ , rootDiv ) ,
82+ loadVcdDone : genLoadVcdDone ( )
5583 } ;
5684
5785 vcdWorker . onmessage = async ( e ) => {
@@ -68,8 +96,126 @@ global.VCDrom = async () => {
6896 await handler ( e ) ;
6997 } ;
7098
99+ $ . sub . set . after ( 'vcdParserReady' , async ( ) => {
100+ const vcdUrl = fileInUrl ( [ 'vcd' ] ) ;
101+ const waveqlUrl = fileInUrl ( [ 'waveql' ] ) ;
102+
103+ if ( ! vcdUrl ) {
104+ rootDiv . innerHTML = stringify ( dropZone ( { width : 2048 , height : 2048 } ) ) ;
105+ return ;
106+ }
107+
108+ // DOM elements
109+ const cnt1 = domContainer ( {
110+ elemento : mountTree . defaultElemento ,
111+ layers : mountTree . defaultLayers ,
112+ renderPlugins : [
113+ pluginRenderTimeGrid ,
114+ pluginRenderValues ,
115+ pluginLocalStore
116+ ] ,
117+ pluginRightPanel : ( elo ) => {
118+ elo . rightPanel . innerHTML = stringify ( helpPanel . mlPanel ( keyBindo , pkg . version ) ) ;
119+ }
120+ } ) ;
121+ rootDiv . appendChild ( cnt1 . pstate . container ) ;
122+
123+ const updater = ( /* str */ ) => {
124+ // console.log('updater');
125+ // deso.waveql = str;
126+ // vscode.postMessage({
127+ // kind: 'waveql.update',
128+ // text: str
129+ // });
130+ } ;
131+
132+ const deso = {
133+ hasHistory : true ,
134+ // isRO: true,
135+ wires : { body : [ ] } ,
136+ view : [ ] ,
137+ chango : { } ,
138+ listing : [ ] ,
139+ render : ( ) => { console . log ( 'dummy render' ) ; } ,
140+ updater
141+ } ;
142+
143+ const restartCm = ( ) => {
144+ cnt1 . pstate . waveql = deso . waveql ;
145+ deso . wires = $ . enddefinitions . wires ;
146+ deso . timescale = parseTimescale ( $ . enddefinitions . timescale ) ;
147+ console . log ( $ . enddefinitions ) ;
148+ cnt1 . start ( deso ) ;
149+ deso . render ( ) ;
150+ cm . view . dispatch ( { changes : {
151+ from : 0 , to : cm . view . state . doc . length , insert : deso . waveql
152+ } } ) ;
153+ cm . view . setState ( createCodeMirrorState (
154+ deso ,
155+ cnt1 . pstate
156+ ) ) ;
157+ } ;
158+
159+ if ( waveqlUrl ) {
160+ const resp = await fetch ( waveqlUrl ) ;
161+ const text = await resp . text ( ) ;
162+ deso . waveql = text ;
163+ $ . sub . set . after ( 'vcdDefinitionsParsed' , async ( ) => {
164+ console . log ( 'sub.set.after: waveqlUrl -> deso.vcdDefinitionsParsed' ) ;
165+ restartCm ( ) ;
166+ } ) ;
167+ } else {
168+ $ . sub . set . after ( 'vcdDefinitionsParsed' , async ( ) => {
169+ console . log ( 'sub.set.after: vcdDefinitionsParsed' ) ;
170+ const text = getFullWaveQL ( $ . enddefinitions . wires ) ;
171+ deso . waveql = text ;
172+ restartCm ( ) ;
173+ } ) ;
174+ }
175+
176+ const cmState = createCodeMirrorState (
177+ deso ,
178+ cnt1 . pstate
179+ ) ;
180+
181+ const cm = mountCodeMirror6 (
182+ cmState ,
183+ cnt1 . elo . waveqlPanel ,
184+ deso ,
185+ cnt1 . pstate
186+ ) ;
187+ cnt1 . elo . container . addEventListener ( 'keydown' , genKeyHandler . genKeyHandler ( rootDiv , cnt1 . pstate , deso , cm , keyBindo ) ) ;
188+ cnt1 . elo . container . addEventListener ( 'wheel' , genOnWheel ( rootDiv , cnt1 . pstate , deso , cm , keyBindo ) ) ;
189+ cm . view . focus ( ) ;
190+
191+
192+ // cnt1.start(deso);
193+ if ( vcdUrl ) {
194+ vcdWorker . postMessage ( { cmd : 'loadVcd' , data : vcdUrl } ) ;
195+ }
196+ } ) ;
197+
71198 vcdWorker . postMessage ( { cmd : 'loadWasm' } ) ;
199+ } ;
200+
201+ global . VCDrom = async ( divName ) => {
202+ const { crossOriginIsolated} = window ;
203+ if ( ! crossOriginIsolated ) {
204+ console . error ( { crossOriginIsolated} ) ;
205+ }
206+
207+ console . log ( pkg . name , pkg . version ) ;
208+ const rootDiv = getElement ( divName ) ;
209+
210+ const themeAllMod = new StyleModule ( themeAll ) ;
211+ StyleModule . mount ( document , themeAllMod ) ;
212+
213+ const vcdWorker = new Worker ( base64JsBlob ( vcdromWorkerUri ) ) ;
214+ const $ = appContext ( ) ;
215+
216+ installHandlers ( $ , vcdWorker , rootDiv ) ;
72217
73218} ;
74219
75220/* eslint-env browser */
221+ /* eslint no-console: 0 */
0 commit comments