Блог
[только программные вердикты; 570 спек из 1811 ещё требуют собственных исправлений] t27c теперь хранит печать рядом с каждой проверенной спекой и повторно использует её вердикт, пока не изменились сама спека, её импорты, сгенерированный код, инструменты тестов и конфигурация. На master t27c frontier повторно использует 1241 спеку из 1811 — 9 октября было 2; аудит за раунд перепроверяет одну такую спеку из 16, и четыре раунда расхождений не нашли.

В t27 около 1800 спек, и проверить одну — значит скомпилировать её и прогнать её тесты. Большинство спек между двумя коммитами не меняется, но каждая проверка начиналась с нуля. С 9 октября t27c хранит рядом с каждой проверенной спекой печать (seal) и использует её вердикт повторно, если ничего, от чего он зависит, не изменилось. Сейчас на master так повторно используются 1241 спека из 1811; два дня назад — 2.
Вердикт — это факт о спеке, о спеках, которые она импортирует, о коде, который t27c для неё сгенерировал, об инструментах, прогнавших тесты, и о конфигурации. Печать v2 записывает каждую из этих частей, а t27c frontier обходит граф импортов и для каждой спеки отвечает: REUSE или первая часть, которая отличается. Инструменты судятся по результату, а не по версии: если изменение компилятора оставило сгенерированный код спеки байт в байт прежним, её вердикт остаётся в силе.
| Шаг | Повторно | PR |
|---|---|---|
| Печать v2 и t27c frontier | 2 из 1712 | t27#8110 |
| Две спеки-узла, которые импортируют все остальные (types, constants) | 424 из 1743 | t27#8177, t27#8209 |
| Новая печать для каждой спеки, чьи тесты проходят | 1115 из 1751 | t27#8372 |
frontier правильно читает use a::b::Item и спеки без module | 1151 | t27#8385 |
t27c frontier --reseal: перепечатка одной командой | 1173 | t27#8392, t27#8554 |
| Спеки, которые проходили, но их просто ни разу не запечатали | 1241 из 1811 | t27#8700 |
Шесть исправлений перевода t27 в Zig (t27#8415, t27#8418, t27#8566, t27#8617, t27#8636, t27#8667) провели каждое от 2 до 9 спек мимо одной ошибки компиляции. Каждое измерено по всем .t27 в репозитории, и каждое в том же pull request заново запечатало спеки, которые сдвинуло. Один #8667 изменил сгенерированный код 173 спек; 74 из них, которые уже проходили, прогнаны до и после — с одинаковым результатом.
t27c seal --save отказывается заменить проходящую печать на печать спеки, которая не компилируется, если это не сделано намеренно (t27#8577). Регрессия — не перепечатка.t27c frontier --audit за раунд заново прогоняет одну повторно используемую спеку из 16 и отравляет печать, если результат расходится (t27#8559). Четыре раунда 10 октября прогнали 259 вердиктов; все совпали.Та же идея работает на кремнии. Агент рядом с каждой платой (t27#8155) заменяет управление платой по сети: кристалл C, прогнанный для R3-3 через USB/IP, занял около 2,5 часа, а первый прогон агента, на кристалле A, — 42 секунды. Кэш битстрима (t27#8296) сокращает повторную сборку с 39 секунд до 4–5, причём каждое десятое попадание пересобирается и сравнивается байт в байт. Плата по-прежнему работает каждый раз; повторно используется только сборка.
Повторный вердикт хорош ровно настолько, насколько полно его печать записывает входы: вход, которого она не называет, или тест, проходящий случайно, останутся незамеченными — поэтому аудит постоянно перепроверяет выборку. 570 спек из 1811 всё ещё не используются повторно, и большинству нужны собственные исправления, а не новые инструменты. Дважды за эту работу pull request слился с красной проверкой, которую сам и вызвал (t27#8415, t27#8667); оба раза её исправили следующими PR (t27#8418, t27#8672).
Поработаем вместе
Я аудирую RTL и строю независимые побитово точные модели, затем провожу результат через синтез и, когда это полезно, проверяю на плате Artix-7. Первый модуль проверки — бесплатно.