From eff53c0d923fdae2b7cf25f67c8cc55b6ca288e6 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sat, 31 Aug 2019 17:17:20 -0400 Subject: [PATCH] verilog: made $readmem a lot faster --- src/platform/verilog.ts | 35 +++++++++++++++++++++++++++++------ src/worker/verilator2js.ts | 4 ++++ src/worker/workermain.ts | 23 ----------------------- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/platform/verilog.ts b/src/platform/verilog.ts index 0f9bdd74..839afdb3 100644 --- a/src/platform/verilog.ts +++ b/src/platform/verilog.ts @@ -3,9 +3,9 @@ import { Platform, BasePlatform } from "../baseplatform"; import { PLATFORMS, setKeyboardFromMap, AnimationTimer, RasterVideo, Keys, makeKeycodeMap, getMousePos, KeyFlags } from "../emu"; import { SampleAudio } from "../audio"; -import { safe_extend, clamp } from "../util"; +import { safe_extend, clamp, byteArrayToString } from "../util"; import { WaveformView, WaveformProvider, WaveformMeta } from "../waveform"; -import { setFrameRateUI } from "../ui"; +import { setFrameRateUI, current_project } from "../ui"; declare var Split; @@ -67,7 +67,7 @@ export var vl_finished = false; export var vl_stopped = false; export function VL_UL(x) { return x|0; } -export function VL_ULL(x) { return x|0; } +//export function VL_ULL(x) { return x|0; } export function VL_TIME_Q() { return (new Date().getTime())|0; } /// Return true if data[bit] set @@ -121,9 +121,32 @@ export function VL_RAND_RESET_I(bits) { return 0 | Math.floor(Math.random() * (1 export function VL_RANDOM_I(bits) { return 0 | Math.floor(Math.random() * (1<> 0) & 0xff); + barr.push((filename[i] >> 8) & 0xff); + barr.push((filename[i] >> 16) & 0xff); + barr.push((filename[i] >> 24) & 0xff); + } + barr = barr.filter(x => x != 0); // ignore zeros + barr.reverse(); // reverse it + var strfn = byteArrayToString(barr); // convert to string + // parse hex/binary file + var strdata = current_project.getFile(strfn) as string; + if (strdata == null) throw "Could not $readmem '" + strfn + "'"; + var data = strdata.split('\n').filter(s => s !== '').map(s => parseInt(s, ishex ? 16 : 2)); + console.log('$readmem', ishex, strfn, data.length); + // copy into destination array + if (memp === null) throw "No destination array to $readmem " + strfn; + if (memp.length < data.length) throw "Destination array too small to $readmem " + strfn; + for (i=0; i { - code = compileReadmemStmts(code, errors); code = compileInlineASM(code, platform, step, errors, asmlines); return code; }