Multiple slot selector working
This commit is contained in:
@@ -16,7 +16,8 @@
|
|||||||
{ "command": "modelsim.toggleWaveMode", "title": "Toggle Wave Debug Mode" }
|
{ "command": "modelsim.toggleWaveMode", "title": "Toggle Wave Debug Mode" }
|
||||||
],
|
],
|
||||||
"keybindings": [
|
"keybindings": [
|
||||||
{ "command": "modelsim.addWaveUnderCursor", "key": "ctrl+w" },
|
{ "command": "modelsim.addWaveUnderCursor", "key": "ctrl+w", "args": { "mode": "auto" } },
|
||||||
|
{ "command": "modelsim.addWaveUnderCursor", "key": "ctrl+e", "args": { "mode": "set" } },
|
||||||
{ "command": "modelsim.toggleWaveMode", "key": "ctrl+alt+m" },
|
{ "command": "modelsim.toggleWaveMode", "key": "ctrl+alt+m" },
|
||||||
{ "command": "modelsim.zoomInWave", "key": "ctrl+alt+u" }
|
{ "command": "modelsim.zoomInWave", "key": "ctrl+alt+u" }
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ const lastHoverByDoc = new Map<string, { pos: vscode.Position; at: number }>();
|
|||||||
const HOVER_FRESH_MS = 2000;
|
const HOVER_FRESH_MS = 2000;
|
||||||
|
|
||||||
// Hold MANY instance paths per module name, e.g. queue_slot -> ["/test/...[0]", "/test/...[1]", ...]
|
// Hold MANY instance paths per module name, e.g. queue_slot -> ["/test/...[0]", "/test/...[1]", ...]
|
||||||
let moduleTree: Record<string, string[]> = {};
|
let moduleTree: Record<string, { module: string[], last: number }> = {};
|
||||||
|
|
||||||
let waveMode = false;
|
let waveMode = false;
|
||||||
let statusItem: vscode.StatusBarItem;
|
let statusItem: vscode.StatusBarItem;
|
||||||
@@ -170,7 +170,7 @@ export function activate(context: vscode.ExtensionContext) {
|
|||||||
const cmd_2 = vscode.commands.registerCommand('modelsim.toggleWaveMode', async () => {
|
const cmd_2 = vscode.commands.registerCommand('modelsim.toggleWaveMode', async () => {
|
||||||
toggleWaveMode();
|
toggleWaveMode();
|
||||||
});
|
});
|
||||||
const cmd = vscode.commands.registerCommand('modelsim.addWaveUnderCursor', async () => {
|
const cmd = vscode.commands.registerCommand('modelsim.addWaveUnderCursor', async (args?: { mode?: string }) => {
|
||||||
if (waveMode) {
|
if (waveMode) {
|
||||||
|
|
||||||
const editor = vscode.window.activeTextEditor;
|
const editor = vscode.window.activeTextEditor;
|
||||||
@@ -219,7 +219,7 @@ export function activate(context: vscode.ExtensionContext) {
|
|||||||
const modName = path.basename(editor.document.fileName, path.extname(editor.document.fileName));
|
const modName = path.basename(editor.document.fileName, path.extname(editor.document.fileName));
|
||||||
|
|
||||||
let instancePaths =
|
let instancePaths =
|
||||||
moduleTree[modName] ?? moduleTree[modName.toLowerCase()];
|
moduleTree[modName].module ?? moduleTree[modName.toLowerCase()].module;
|
||||||
if (!instancePaths || instancePaths.length === 0) {
|
if (!instancePaths || instancePaths.length === 0) {
|
||||||
console.log(
|
console.log(
|
||||||
`No instance paths found for module "${modName}". ` +
|
`No instance paths found for module "${modName}". ` +
|
||||||
@@ -228,15 +228,49 @@ export function activate(context: vscode.ExtensionContext) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Add the token for every instance of this module (dedupe paths just in case)
|
// Add the token for every instance of this module (dedupe paths just in case)
|
||||||
instancePaths = Array.from(new Set(instancePaths)).map(p => p.replace(/\/+/g, '/'));
|
instancePaths = Array.from(new Set(instancePaths)).map(p => p.replace(/\/+/g, '/'));
|
||||||
|
|
||||||
let ok = true;
|
const mode = args?.mode ?? 'auto';
|
||||||
for (const p of instancePaths) {
|
|
||||||
const cmd = `quietly add wave -noupdate ${p}/${tokenText}`.replace(/\/+/g, '/');
|
let instance_num = moduleTree[modName].last ?? moduleTree[modName.toLowerCase()].last;
|
||||||
const res = await sendAndAwait(sharedDir, cmd, timeoutMs);
|
if (instancePaths.length > 1 && mode === 'set') {
|
||||||
ok = ok && !!res;
|
const input_num = await vscode.window.showInputBox({
|
||||||
|
title: 'Enter a number',
|
||||||
|
prompt: 'This number will be used by the action.',
|
||||||
|
placeHolder: moduleTree[modName].last !== undefined ? `Press Enter to reuse ${moduleTree[modName].last}` : 'e.g. 42',
|
||||||
|
value: moduleTree[modName].last !== undefined ? String(moduleTree[modName].last) : '',
|
||||||
|
ignoreFocusOut: true,
|
||||||
|
validateInput: (value) => {
|
||||||
|
if (value.trim() === '') return null; // allow Enter to reuse last
|
||||||
|
const n = Number(value);
|
||||||
|
if (!Number.isInteger(n)) return 'Please enter an integer.';
|
||||||
|
if (n < 0) return 'Please enter a non-negative integer.';
|
||||||
|
// optionally cap it
|
||||||
|
if (n > 10000) return 'That’s too large (max 10000).';
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (input_num === undefined) {
|
||||||
|
// User hit Esc — do nothing
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty input means reuse last (if any)
|
||||||
|
instance_num = (input_num.trim() === '' || Number(input_num) >= moduleTree[modName].module.length) && moduleTree[modName].last !== undefined ? moduleTree[modName].last : Number(input_num);
|
||||||
|
|
||||||
|
moduleTree[modName].last = instance_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let ok = true;
|
||||||
|
// for (const p of instancePaths) {
|
||||||
|
const cmd = `quietly add wave -noupdate \{${instancePaths[instance_num]}/${tokenText}\}`.replace(/\/+/g, '/');
|
||||||
|
console.log(cmd);
|
||||||
|
const res = await sendAndAwait(sharedDir, cmd, timeoutMs);
|
||||||
|
ok = ok && !!res;
|
||||||
ok = ok && !!(await sendAndAwait(sharedDir, 'update', timeoutMs));
|
ok = ok && !!(await sendAndAwait(sharedDir, 'update', timeoutMs));
|
||||||
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
@@ -355,7 +389,7 @@ async function requestModuleTree(
|
|||||||
sharedDir: string,
|
sharedDir: string,
|
||||||
topScope: string,
|
topScope: string,
|
||||||
timeoutMs: number
|
timeoutMs: number
|
||||||
): Promise<Record<string, string[]>> {
|
): Promise<Record<string, { module: string[], last: number }>> {
|
||||||
const tree: Record<string, string[]> = {};
|
const tree: Record<string, string[]> = {};
|
||||||
const payload = `get_module_tree ${topScope}`;
|
const payload = `get_module_tree ${topScope}`;
|
||||||
console.log("Requesting ModuleTree");
|
console.log("Requesting ModuleTree");
|
||||||
@@ -365,7 +399,7 @@ async function requestModuleTree(
|
|||||||
const text = (await res) ?? "";
|
const text = (await res) ?? "";
|
||||||
console.log("Module Hierarchy: ", text)
|
console.log("Module Hierarchy: ", text)
|
||||||
const rx = /\{([^}]+?)\s+\(([^)]+)\)\}/g; // {<path> (<type>)}
|
const rx = /\{([^}]+?)\s+\(([^)]+)\)\}/g; // {<path> (<type>)}
|
||||||
const moduleTree: Record<string, string[]> = {};
|
const moduleTree: Record<string, { module: string[], last: number }> = {};
|
||||||
|
|
||||||
let m: RegExpExecArray | null;
|
let m: RegExpExecArray | null;
|
||||||
while ((m = rx.exec(text))) {
|
while ((m = rx.exec(text))) {
|
||||||
@@ -386,7 +420,7 @@ async function requestModuleTree(
|
|||||||
// .map(seg => (seg.startsWith("u_") ? seg : "u_" + seg))
|
// .map(seg => (seg.startsWith("u_") ? seg : "u_" + seg))
|
||||||
// .join("/");
|
// .join("/");
|
||||||
|
|
||||||
(moduleTree[modType] ??= []).push(rawPath);
|
((moduleTree[modType] ??= { module: [], last: 0 }).module).push(rawPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(moduleTree);
|
console.log(moduleTree);
|
||||||
|
|||||||
Reference in New Issue
Block a user