Подключи ISE, Vivado и Quartus к общему итератору версии и HDL-паспорту. Проверяй новый bit/sof до создания manifest, SHA-256 и архива выпуска. Добавь установку локальных команд ISE, инструкции переноса и регрессионные проверки успешных и прерванных сборок.
77 lines
6.0 KiB
Tcl
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]
|
|
# Завершает контроль готового образа.
|
|
}
|