feat: smart Xilinx version scanning — pick newest, log all versions

_version discovery:
- _scan_xilinx_root() collects ALL versions under Vitis/*/bin/ and Vivado/*/bin/
- _parse_version_tuple() semantic version comparison (2023.2 > 2018.3)
- Defaults to newest version, Vitis preferred over Vivado for same version
- _find_executable() search order: PATH → legacy vitis_path → scan xilinx_root → common paths

_version reporting:
- _get_tool_version(): tries -version flag first, falls back to path parsing
- _version_from_path(): extracts version from install path (e.g., .../Vitis/2023.2/bin/xsct → 2023.2)
- Step 1 logs each tool with version: ✓ xsct: /path [v2023.2]
- If multiple versions found, lists all: xsct versions found: 2023.2 (Vitis), 2018.3 (Vivado)

Cross-platform:
- Handles Windows path separators via Path()
- Expanded common Windows install paths
This commit is contained in:
2026-06-11 14:56:40 +08:00
parent 475042c85c
commit 21acc16c8c
2 changed files with 197 additions and 61 deletions
+15 -1
View File
@@ -767,19 +767,33 @@ class MainWindow(ctk.CTk):
# Check Vitis/Vivado tools
self._log_message(" Checking Vitis/Vivado tools...")
if self._config.xilinx_path:
self._log_message(f" Xilinx root: {self._config.xilinx_path}")
result = check_vitis(self._config)
status_dict = get_tool_status_dict(result)
for tool_name, tool_info in status_dict["tools"].items():
if tool_info["found"]:
ver_info = f" [v{tool_info['version']}]" if tool_info.get("version") else ""
alias_note = f" (via {tool_info['alias']})" if tool_info.get("alias") and tool_info["alias"] != tool_name else ""
self._log_message(f"{tool_name}: {tool_info['path']}{alias_note}")
self._log_message(f"{tool_name}: {tool_info['path']}{ver_info}{alias_note}")
else:
self._log_message(f"{tool_name}: {tool_info['error']}")
if result.is_ready:
self._vitis_status.configure(text="Vitis: Ready", text_color=SUCCESS_COLOR)
self._log_message(" Vitis/Vivado tools available")
# Report all found versions for diagnostics
if self._config.xilinx_path:
try:
from vitis_checker import get_all_found_versions
for t in ("xsct", "program_flash", "bootgen"):
vers = get_all_found_versions(self._config.xilinx_path, t)
if len(vers) > 1:
ver_list = ", ".join(f"{v} ({p})" for v, p in vers)
self._log_message(f" {t} versions found: {ver_list}")
except Exception:
pass
else:
self._vitis_status.configure(text="Vitis: Partial", text_color=WARNING_COLOR)
self._log_message(f" Issues: {'; '.join(result.errors)}")