/** * Vivado 配置管理 * 功能:读取和验证 Vivado 配置 * 依赖:vscode */ import * as vscode from 'vscode'; import * as fs from 'fs'; import * as path from 'path'; export interface VivadoConfig { enabled: boolean; executablePath: string; workingDir: string; } /** * 获取 Vivado 配置 */ export function getVivadoConfig(): VivadoConfig | null { // 优先读取项目配置 const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; if (workspaceFolder) { const projectConfigPath = path.join( workspaceFolder.uri.fsPath, '.vscode', 'ic-coder-vivado.json' ); if (fs.existsSync(projectConfigPath)) { const content = fs.readFileSync(projectConfigPath, 'utf-8'); return JSON.parse(content).vivado; } } // 读取全局配置 const config = vscode.workspace.getConfiguration('ic-coder'); const vivadoConfig = config.get('vivado'); if (vivadoConfig) { return vivadoConfig; } // 自动检测 Vivado return autoDetectVivado(); } /** * 验证配置 */ export function validateConfig(config: VivadoConfig): string | null { if (!config.enabled) { return 'Vivado 未启用'; } if (!fs.existsSync(config.executablePath)) { return `Vivado 可执行文件不存在: ${config.executablePath}`; } return null; } /** * 解析工作目录 */ export function resolveWorkingDir(workingDir: string): string { const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; if (workspaceFolder) { return workingDir.replace('${workspaceFolder}', workspaceFolder.uri.fsPath); } return workingDir; } /** * 自动检测 Vivado */ function autoDetectVivado(): VivadoConfig | null { const drives = ['C', 'D', 'E', 'F', 'G']; for (const drive of drives) { const vivadoDir = `${drive}:\\Xilinx\\Vivado`; if (!fs.existsSync(vivadoDir)) { continue; } // 读取所有版本目录 const versions = fs.readdirSync(vivadoDir) .filter(v => fs.statSync(path.join(vivadoDir, v)).isDirectory()) .sort() .reverse(); // 最新版本在前 for (const version of versions) { const p = path.join(vivadoDir, version, 'bin', 'vivado.bat'); if (fs.existsSync(p)) { const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; return { enabled: true, executablePath: p, workingDir: workspaceFolder ? path.join(workspaceFolder.uri.fsPath, 'vivado_projects') : `${drive}:\\vivado_projects` }; } } } return null; }