Files
templates/tools/firmware-build/fpga/vivado.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

57 lines
4.1 KiB
Tcl

# Находит общий код независимо от рабочего каталога Vivado.
source [file join [file dirname [info script]] common.tcl]
# Объединяет запуск и контроль результата в одну прерываемую при ошибке операцию.
if {[catch {
# Принимает project.xpr, config.json, output, top.bit, язык и необязательный python.exe.
fw::init $argv vivado
# Открывает проект с его part, top, XDC и настройками реализации.
open_project $fw::settings(project)
# Берёт активную реализацию, а не предполагает стандартное имя impl_1.
set implementation [current_run -implementation]
# Синтез выбирается по родителю реализации, даже если в GUI активен другой synth run.
set synthesis [get_property PARENT $implementation]
# Файловый набор принадлежит именно синтезу выбранной реализации.
set sources [get_property SRCSET [get_runs $synthesis]]
# Генерирует паспорт до запуска синтеза; повторное увеличение в hooks проекта не требуется.
fw::prepare
# Регистрирует только один вариант HDL в правильном наборе исходников.
add_files -fileset $sources -norecurse $fw::settings(hdl)
# Обновляет порядок компиляции для нового модуля или VHDL entity.
update_compile_order -fileset $sources
# Сбрасывает реализацию перед синтезом, чтобы не использовать прежнюю размещённую схему.
reset_run $implementation
# Полный синтез обязателен при новом паспорте даже в ручном режиме номера версии.
reset_run $synthesis
# Запускает синтез с настройками проекта.
launch_runs $synthesis
# Ожидает завершения дочернего процесса до проверки результата.
wait_on_run $synthesis
# Ожидание само по себе не означает успех; 100% проверяется отдельно.
if {[get_property PROGRESS [get_runs $synthesis]] ne "100%"} {
# Не запускает реализацию при отказе синтеза.
error "Vivado synthesis failed"
# Заканчивает проверку синтеза.
}
# Включает write_bitstream, который обычная реализация по умолчанию не выполняет.
launch_runs $implementation -to_step write_bitstream
# Ждёт записи .bit перед вызовом общего post-build.
wait_on_run $implementation
# Проверяет завершение полной цепочки генерации файла программирования.
if {[get_property PROGRESS $implementation] ne "100%"} {
# Отказ маршрутизации, DRC или BitGen блокирует архивирование.
error "Vivado implementation/bitstream failed"
# Завершает проверку реализации.
}
# Упаковывает именно ожидаемый .bit после успешной сборки.
fw::finish
# Завершает работу с сохранёнными настройками проекта.
close_project
# Ошибка любого шага передаётся внешнему вызывающему процессу.
} message]} {
# Сохраняет исходное сообщение САПР или общего генератора в журнале.
puts stderr $message
# Возвращает отказ внешней сборке или CI.
exit 1
# Заканчивает обработку ошибок.
}