Files
templates/tools/firmware-build/fpga/common.tcl
T
Andrey 62c0492bfd feat(firmware-build): Добавь сборку и паспорта проектов ПЛИС
Подключи ISE, Vivado и Quartus к общему итератору версии и HDL-паспорту. Проверяй новый bit/sof до создания manifest, SHA-256 и архива выпуска.

Добавь установку локальных команд ISE, инструкции переноса и регрессионные проверки успешных и прерванных сборок.
2026-10-23 14:16:21 +03:00

77 lines
6.0 KiB
Tcl

# Общие процедуры совместимы с Tcl 8.5 старых ISE; пути передаются списками без eval.
namespace eval fw {
# Определяет Python-инструмент относительно поставки, а не текущего каталога САПР.
variable helper [file normalize [file join [file dirname [info script]] identity.py]]
# Закрывает пространство имён, не меняя глобальные команды САПР.
}
# Проверяет общие аргументы до открытия проекта и резервирования версии.
proc fw::init {arguments toolchain} {
# Объявляет настройки сценария в общем пространстве имён.
variable settings
# Пять обязательных аргументов и необязательный путь к python.exe.
if {[llength $arguments] < 5 || [llength $arguments] > 6} {
# Неверная команда не должна расходовать номер версии.
error "Usage: project config output image verilog|vhdl ?python?"
# Завершает проверку количества аргументов.
}
# Имена полей определяют одинаковый порядок аргументов всех трёх сценариев.
foreach name {project config output image} value [lrange $arguments 0 3] {
# Нормализует пути до перехода в каталог проекта.
set settings($name) [file normalize $value]
# Заканчивает обработку четырёх путей.
}
# Сохраняет выбранный HDL, чтобы в проект не попали две реализации одного модуля.
set settings(language) [lindex $arguments 4]
# Принимает только языки, поддержанные генератором паспорта.
if {[lsearch -exact {verilog vhdl} $settings(language)] < 0} {
# Останавливает сборку при опечатке в языке.
error "Expected verilog or vhdl"
# Заканчивает проверку выбранного языка.
}
# По умолчанию использует Python 3 из PATH, без аргументов командной оболочки.
set settings(python) python
# Полный путь позволяет обойти Python старой версии, встроенный в САПР.
if {[llength $arguments] == 6} {
# Делает путь python.exe абсолютным без раскрытия Windows junction до последующего cd.
set settings(python) [file join [pwd] [lindex $arguments 5]]
# Завершает выбор интерпретатора.
}
# Передаёт генератору имя формата нативного результата.
set settings(toolchain) $toolchain
# Разделяет генерируемые исходники и архивы внутри каталога конфигурации.
set settings(generated) [file join $settings(output) generated]
# Выбирает расширение только одного подключаемого HDL-файла.
set extension [expr {$settings(language) eq "verilog" ? "v" : "vhd"}]
# Имя модуля совпадает в Verilog и VHDL и известно верхнему уровню проекта.
set settings(hdl) [file join $settings(generated) firmware_identity.$extension]
# Проверяет наличие проектного файла до запуска САПР.
if {![file isfile $settings(project)] || ![file isfile $settings(config)]} {
# JSON создаётся пользователем из примера, чтобы не выпустить изделие с чужим именем.
error "Project or firmware identity config does not exist"
# Завершает проверку обязательных файлов.
}
# Зависимые исходники и ограничения проекта разрешаются относительно его каталога.
cd [file dirname $settings(project)]
# Заканчивает инициализацию путей и языка.
}
# Резервирует версию один раз до любых шагов синтеза.
proc fw::prepare {} {
# Получает проверенные аргументы текущего запуска.
variable settings
# Получает абсолютный путь общего генератора.
variable helper
# exec передаёт каждый путь отдельно; stderr остаётся в журнале САПР, ненулевой код вызывает Tcl error.
puts [exec $settings(python) $helper prepare --repository [file dirname $settings(project)] --config $settings(config) --output $settings(generated) --image $settings(image) --toolchain $settings(toolchain) --language $settings(language) 2>@stderr]
# Завершает подготовку паспорта.
}
# Упаковывает результат только после успешного возврата полного flow.
proc fw::finish {} {
# Использует те же пути, что и pre-build данного запуска.
variable settings
# Выбирает тот же Python-инструмент, который создавал паспорт.
variable helper
# Генератор проверяет обновление файла, SHA-256 и архивную копию; ошибка блокирует успешное завершение Tcl.
puts [exec $settings(python) $helper finish --metadata [file join $settings(generated) firmware_identity.json] --output [file join $settings(output) firmware] 2>@stderr]
# Завершает контроль готового образа.
}