added help for verilog waveform viewer

This commit is contained in:
Steven Hugg committed 2026-09-17 23:38:37 +02:00
1 parent 52d34f080a
commit 4024aeadd9
5 files changed
+62 -3

No files matched your search

+29
View File
@@ -0,0 +1,29 @@
# Waveform Viewer
The Verilog platform shows a waveform trace below the emulator screen,
with one row per exposed signal. **Click** to give the waveform viewer
keyboard focus.
If the CRT is active, the waveform viewer is hidden by default, below the CRT frame.
You can **click and drag** its frame border up from the bottom of the screen.
## Which signals appear
The trace shows every scalar/vector `logic` signal from the flattened
design: top-level ports and internal registers and wires from every
submodule, not just the top level. These are omitted:
- Non-logic types (arrays, memories)
- Internal simulator temporaries (names starting with `__V`)
- If the design drives video output (it has `vsync`, `hsync`, and `rgb`
signals), `clk` and `reset`
Multi-bit signals will display their hex or decimal values on top of the waveforms when zoomed in.
## Mouse actions
- **Click** on the trace to move the selection cursor to that clock.
- **Click and drag** to scrub through the trace.
- **Scroll horizontally** to pan left/right.
- For input signals (other than `clk` or `reset`) **click** its row to change its
value at the current clock.
+5 -2
View File
@@ -30,7 +30,7 @@ import { AssetEditorView } from "./views/asseteditor";
import { isMobileDevice } from "./views/baseviews";
import { AddressHeatMapView, BinaryFileView, BreakpointsView, MemoryMapView, MemoryView, ProbeLogView, ProbeSymbolView, RasterStackMapView, ScanlineIOView, VRAMMemoryView } from "./views/debugviews";
import { DisassemblerView, HeaderView, ListingView, PC_LINE_LOOKAHEAD, SourceEditor, setUppercaseOnly } from "./views/editors";
import { HELP_TOPICS, HelpView, helpTopicForView } from "./views/helpview";
import { HELP_TOPICS, HelpView, elementHelpTopicForFocus, helpTopicForView } from "./views/helpview";
import { CallStackView, DebugBrowserView } from "./views/treeviews";
import { ProjectWindows } from "./windows";
import { setupSplits, showTab } from "./layout";
@@ -1861,8 +1861,11 @@ function setupDebugControls() {
// Going through the hash means Back returns to the previous view.
function showContextHelp() {
if (!projectWindows) return;
// widgets embedded outside ProjectWindows (e.g. the Verilog waveform
// viewer) register their own topic; prefer that when it has focus
var elId = elementHelpTopicForFocus();
var isEditor = projectWindows.getActive() instanceof SourceEditor;
var id = helpTopicForView(projectWindows.getActiveID(), isEditor);
var id = elId || helpTopicForView(projectWindows.getActiveID(), isEditor);
var hash = '#help/' + id;
if (window.location.hash === hash) {
projectWindows.createOrShow(hash);
+1 -1
View File
@@ -985,7 +985,7 @@ export class BreakpointsView implements ProjectView {
.attr('placeholder', 'address or symbol (e.g. $8000, mainloop)')
.val(editing && editing.bp.type == 'address' ? editing.bp.target : '');
const condInput = $('<input type="text" class="bp-input" spellcheck="false"/>')
.attr('placeholder', 'condition (e.g. A == $20, #scanline > 222)')
.attr('placeholder', 'condition (e.g. A>=$20, #scanline==222)')
.val(editing ? editing.bp.condition || '' : '');
const submit = $('<button class="btn btn-default btn-xs bp-submit"/>').text(editing ? 'Save' : 'Add');
const cancel = $('<button class="btn btn-default btn-xs bp-submit"/>').text('Cancel');
+25
View File
@@ -25,6 +25,7 @@ import buildDirectivesMd from "../../docs/build-directives.md";
import toolchainsMd from "../../docs/toolchains.md";
import assetHeadersMD from "../../docs/asset-headers.md";
import embeddingIdeMd from "../../docs/embedding-ide.md";
import verilogWaveformMd from "../../docs/verilog-waveform.md";
// Help is a normal ProjectView so it reuses ProjectWindows (tabs, hash
// routing, the window list). The registry and renderHelpBody() below are
@@ -59,6 +60,7 @@ export const HELP_TOPICS: HelpTopic[] = [
{ id: "toolchains", title: "Toolchains & Platforms", html: toolchainsMd },
{ id: "asset-headers", title: "Asset Headers", html: assetHeadersMD },
{ id: "embedding-ide", title: "Embedding the IDE", html: embeddingIdeMd },
{ id: "verilog-waveform", title: "Waveform Viewer", html: verilogWaveformMd },
];
const HELP_BY_ID: { [id: string]: HelpTopic } = {};
@@ -106,6 +108,29 @@ export function helpTopicForView(viewId: string, isEditor: boolean): string {
return (viewId && VIEW_HELP[viewId]) || "index";
}
// Widgets embedded directly in a platform's UI (not a ProjectWindows tab,
// e.g. the Verilog waveform viewer alongside the emulator screen) register
// their container + topic id here so F1 can find them while focused.
let elementHelpTopics: { div: HTMLElement; id: string }[] = [];
export function registerElementHelpTopic(div: HTMLElement, id: string) {
elementHelpTopics.push({ div, id });
}
export function unregisterElementHelpTopic(div: HTMLElement) {
elementHelpTopics = elementHelpTopics.filter((eh) => eh.div !== div);
}
// topic id for the currently focused element-scoped widget, if any
export function elementHelpTopicForFocus(): string | null {
const ae = document.activeElement;
if (!ae) return null;
for (const eh of elementHelpTopics) {
if (eh.div.contains(ae)) return eh.id;
}
return null;
}
// Turn relative Markdown links ("foo.md") into internal help routes
// ("#help/foo") so clicks stay in the IDE. Absolute links open in a new tab.
function rewriteHelpLinks(root: HTMLElement) {
+2
View File
@@ -1,6 +1,7 @@
import { Toolbar } from "./toolbar";
import { registerElementShortcuts, Shortcut } from "./shortcutbar";
import { registerElementHelpTopic } from "./views/helpview";
import { VirtualList } from "../common/vlist";
import DOMPurify from "dompurify";
@@ -54,6 +55,7 @@ export class WaveformView {
// bar's focus tracking (see shortcutbar.ts)
this.parent.addEventListener('mousedown', (e) => { e.preventDefault(); this.parent.focus(); });
registerElementShortcuts(this.parent, () => this.getShortcuts());
registerElementHelpTopic(this.parent, 'verilog-waveform');
this.recreate();
}