diff --git a/apps/website/src/data/blog/bodies/a-measurement-number-needs-a-passport.ts b/apps/website/src/data/blog/bodies/a-measurement-number-needs-a-passport.ts new file mode 100644 index 0000000000..ab0243d329 --- /dev/null +++ b/apps/website/src/data/blog/bodies/a-measurement-number-needs-a-passport.ts @@ -0,0 +1,137 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + kind: 'p', + text: '[Measured] A number is not a comparison until its measurement passport travels with it. Our isolated GFTernary decoder measured 66 LUT at 974.66 MHz on a Xilinx Artix-7 XC7A200T on the ALINX AX7203 board.' + }, + { + kind: 'p', + text: 'The result came from the open flow recorded in the source: Yosys 0.65, nextpnr-xilinx 1743d0f and Icarus Verilog 13.0; the reported figure is the median of five seeds, with DSP inference disabled. This is an isolated decoder, not a complete inference system.' + }, + { + kind: 'h', + text: 'The baseline belongs on the same line' + }, + { + kind: 'p', + text: 'The same source records a bare-wire baseline on the same part: 112 LUT at 827.81 MHz. The 66-LUT result is therefore a property of this decoder, this downstream register and this synthesis flow. It is not a claim that a ternary datapath has a universal area advantage.' + }, + { + kind: 'table', + head: ['Passport field', 'Recorded value'], + rows: [ + ['Part and board', 'Xilinx Artix-7 XC7A200T; ALINX AX7203'], + ['Flow', 'Yosys 0.65; nextpnr-xilinx 1743d0f; Icarus Verilog 13.0'], + ['Statistic', 'Median of five seeds'], + ['DSP inference', 'Disabled'], + ['Baseline', 'Bare wire on the same part: 112 LUT at 827.81 MHz'], + ['Measured object', 'Isolated GFTernary decoder, not a system'], + ] + }, + { + kind: 'h', + text: 'A second measurement limits the first' + }, + { + kind: 'p', + text: '[Measured] An APoT sweep in the same project produced 130, 380, 230 and 384 LUT at shift widths 2 through 5. The sequence is non-monotone. That makes a small gap between two synthesis points unsafe as a general area claim; a single logic-synthesis count is not a substitute for a post-route or device-level comparison.' + }, + { + kind: 'h', + text: 'What the receipt proves' + }, + { + kind: 'ul', + items: [ + 'It records one reproducible isolated-decoder result: 66 LUT at 974.66 MHz on the named FPGA part and open toolchain.', + 'It records a same-part baseline, so the reader can see what was compared rather than only the headline number.', + 'It records the non-monotone APoT sweep instead of smoothing away an inconvenient tool behaviour.' + ] + }, + { + kind: 'h', + text: 'What it does not prove' + }, + { + kind: 'ul', + items: [ + 'We have no own tokens-per-second measurement on AX7203 or another board in this post.', + 'An isolated decoder is not a complete model, memory system, prefill path or decode path.', + 'The result is not a cross-device characterisation and does not compare a takum implementation in the same flow.', + 'No claim about an ASIC, fabricated die, power or system throughput follows from these LUT and frequency figures.' + ] + }, + { + kind: 'p', + text: 'For an engineer, the practical rule is simple: put the part, board, toolchain, seed statistic, disabled features, same-part baseline and measured object next to every hardware number. Without those fields, a tok/s headline cannot be reproduced or fairly compared.' + } +] + +export const ruBody: Block[] = [ + { + kind: 'p', + text: '[Измерено] Число ещё не является сравнением, пока рядом с ним не опубликован паспорт замера. Для изолированного декодера GFTernary измерено 66 LUT при 974,66 МГц на Xilinx Artix-7 XC7A200T на плате ALINX AX7203.' + }, + { + kind: 'p', + text: 'В исходнике зафиксирован открытый поток: Yosys 0.65, nextpnr-xilinx 1743d0f и Icarus Verilog 13.0; приведена медиана пяти seed, инференс DSP выключен. Это изолированный декодер, а не законченная система инференса.' + }, + { + kind: 'h', + text: 'Базовая линия должна стоять в той же строке' + }, + { + kind: 'p', + text: 'Тот же источник даёт базовую линию голого провода на той же части: 112 LUT при 827,81 МГц. Поэтому результат 66 LUT — свойство этого декодера, downstream-регистра и этого потока синтеза. Это не заявление об универсальном преимуществе троичного датапути по площади.' + }, + { + kind: 'table', + head: ['Поле паспорта', 'Зафиксированное значение'], + rows: [ + ['Часть и плата', 'Xilinx Artix-7 XC7A200T; ALINX AX7203'], + ['Поток', 'Yosys 0.65; nextpnr-xilinx 1743d0f; Icarus Verilog 13.0'], + ['Статистика', 'Медиана пяти seed'], + ['Инференс DSP', 'Выключен'], + ['Базовая линия', 'Голый провод на той же части: 112 LUT при 827,81 МГц'], + ['Измеряемый объект', 'Изолированный декодер GFTernary, не система'], + ] + }, + { + kind: 'h', + text: 'Второй замер ограничивает первый' + }, + { + kind: 'p', + text: '[Измерено] Развёртка APoT в том же проекте дала 130, 380, 230 и 384 LUT при ширинах сдвига от 2 до 5. Последовательность немонотонна. Поэтому небольшую разницу между двумя точками синтеза нельзя превращать в общее заявление о площади; один логический синтез не заменяет сравнение после разводки или на устройстве.' + }, + { + kind: 'h', + text: 'Что подтверждает квитанция' + }, + { + kind: 'ul', + items: [ + 'Один воспроизводимый результат для изолированного декодера: 66 LUT при 974,66 МГц на названной FPGA и открытом тулчейне.', + 'Базовая линия на той же части, чтобы читатель видел не только заголовочное число, но и объект сравнения.', + 'Немонотонная APoT-развёртка, опубликованная без сглаживания неудобного поведения инструмента.' + ] + }, + { + kind: 'h', + text: 'Чего это не доказывает' + }, + { + kind: 'ul', + items: [ + 'Собственного измерения токенов в секунду на AX7203 или другой плате в этом посте нет.', + 'Изолированный декодер не является полной моделью, системой памяти, prefill-трактом или decode-трактом.', + 'Это не многоугловая характеризация и не сравнение реализации takum в том же потоке.', + 'Из LUT и частоты нельзя выводить заявления об ASIC, изготовленном кристалле, мощности или пропускной способности системы.' + ] + }, + { + kind: 'p', + text: 'Практическое правило для инженера простое: рядом с каждым аппаратным числом указывать часть, плату, тулчейн, статистику seed, выключенные функции, базовую линию на той же части и измеряемый объект. Без этих полей заголовок tok/s нельзя воспроизвести или честно сравнить.' + } +] diff --git a/apps/website/src/data/blog/index.ts b/apps/website/src/data/blog/index.ts index bf668e65c7..586dfbb3be 100644 --- a/apps/website/src/data/blog/index.ts +++ b/apps/website/src/data/blog/index.ts @@ -2,6 +2,35 @@ import type { PostMeta } from './types' /** Индекс блога: список и метаданные без тяжёлых тел публикаций. */ export const postsIndex: PostMeta[] = [ + { + slug: 'a-measurement-number-needs-a-passport', + title: 'A measurement number needs its passport', + summary: '[Measured] An isolated GFTernary decoder is recorded at 66 LUT and 974.66 MHz on an Artix-7 XC7A200T, with its toolchain, seed statistic and same-part baseline. The receipt does not claim tokens per second or system throughput.', + date: '2026-09-13', + readingMinutes: 6, + tags: ['FPGA', 'Measurement', 'Reproducibility', 'GFTernary'], + receipts: [ + { label: 'Canonical source: gHashTag/trinity tnf.ts at commit 453fe953', href: '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/gHashTag/trinity/blob/453fe953372db51052e007334b69c9dbed595218/apps/website/src/content/tnf.ts' }, + { label: 'Source commit: website measurement passport and toolchain receipt', href: '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/gHashTag/trinity/commit/453fe953372db51052e007334b69c9dbed595218' }, + ], + openQuestions: [ + 'The post records an isolated decoder, not tokens per second, end-to-end inference, power, memory bandwidth or a full model.', + 'The result is tied to one FPGA family and one open flow; cross-device and vendor-flow comparisons were not performed here.', + 'A same-flow takum implementation was not synthesised beside this decoder.', + 'The non-monotone APoT sweep is a warning about the measurement flow, not a model of all FPGA implementations.' + ], + published: true, + ru: { + title: 'Аппаратному числу нужен паспорт замера', + summary: '[Измерено] Для изолированного декодера GFTernary зафиксированы 66 LUT и 974,66 МГц на Artix-7 XC7A200T, вместе с тулчейном, статистикой seed и базовой линией на той же части. Квитанция не заявляет токены в секунду или пропускную способность системы.', + openQuestions: [ + 'В посте записан изолированный декодер, а не токены в секунду, сквозной инференс, мощность, полоса памяти или целая модель.', + 'Результат относится к одной семье FPGA и одному открытому потоку; сравнения между устройствами и с вендорским потоком здесь не проводились.', + 'Реализация takum в том же потоке рядом с декодером не синтезировалась.', + 'Немонотонная APoT-развёртка предупреждает о свойствах потока замера, а не является моделью всех реализаций на FPGA.' + ] + } + }, { slug: 'the-fpga-row-was-corrected', title: 'The FPGA row was corrected before it became evidence', diff --git a/apps/website/src/data/blog/posts.ts b/apps/website/src/data/blog/posts.ts index 6865f8e7ea..cb4c3163b9 100644 --- a/apps/website/src/data/blog/posts.ts +++ b/apps/website/src/data/blog/posts.ts @@ -10,6 +10,7 @@ import { body as body_one_saturation_rule_five_artefacts, ruBody as ruBody_one_s import { body as body_ninety_tests_were_unreachable, ruBody as ruBody_ninety_tests_were_unreachable } from './bodies/ninety-tests-were-unreachable' import { body as body_four_languages_one_tri_extension, ruBody as ruBody_four_languages_one_tri_extension } from './bodies/four-languages-one-tri-extension' import { body as body_the_fpga_row_was_corrected, ruBody as ruBody_the_fpga_row_was_corrected } from './bodies/the-fpga-row-was-corrected' +import { body as body_a_measurement_number_needs_a_passport, ruBody as ruBody_a_measurement_number_needs_a_passport } from './bodies/a-measurement-number-needs-a-passport' import type { Post, PostBody } from './types' import { body as body_the_only_stable_speed_belonged_to_the_tool, ruBody as ruBody_the_only_stable_speed_belonged_to_the_tool } from './bodies/the-only-stable-speed-belonged-to-the-tool' import { body as body_queen_review_lifecycle_queues, ruBody as ruBody_queen_review_lifecycle_queues } from './bodies/queen-review-lifecycle-queues' @@ -71,6 +72,7 @@ import { body as body_real_value_in_integer_container, ruBody as ruBody_real_val import { body as body_one_commit_nine_workflow_outcomes, ruBody as ruBody_one_commit_nine_workflow_outcomes } from './bodies/one-commit-nine-workflow-outcomes' const bodies: Record = { + 'a-measurement-number-needs-a-passport': { body: body_a_measurement_number_needs_a_passport, ruBody: ruBody_a_measurement_number_needs_a_passport }, 'the-fpga-row-was-corrected': { body: body_the_fpga_row_was_corrected, ruBody: ruBody_the_fpga_row_was_corrected }, 'signal-health-self-run32': { body: body_signal_health_self_run32, ruBody: ruBody_signal_health_self_run32 }, 'queen-phone-orientation-gate': { body: body_queen_phone_orientation_gate, ruBody: ruBody_queen_phone_orientation_gate },