T27.AI

Блог

Квитанции и печати покрытия через радиосеть

2026-08-19 · 21 мин чтения

Байты прошли два радиоскачка между четырьмя платами и пришли байт-в-байт, а печать покрытия, пересчитанная независимо в трёх точках, сошлась во всех трёх. Что это доказывает, чего не доказывает, на чём всё это сделано и где серийные радиостанции откровенно впереди.

MeshDePINVerifiable computeZynqopenXC7

Четыре одноплатных радиоузла на столе, одна подсеть, 2,4 ГГц. Байты ушли с первой платы, прошли два радиопрыжка и пришли на четвёртую без единой ошибки. В трёх точках этого пути печать покрытия пересчитывалась независимо, и все три сошлись: 0x9DBE2510. Это весь результат, и дальше речь о том, чего он стоит.

Что здесь на троичной логике и как далеко это дошло

Троичность здесь -- это одна конкретная схема, и назвать её стоит раньше всего остального: двухбитный код веса, где 01 выбирает +x, 10 выбирает -x, а всё прочее -- ноль. Умножение превращается в смену знака, умножитель исчезает, дальше работает обычное дерево сумматоров. На этом единственном примитиве держатся согласованный фильтр на 8 отводов, 63-отводный приёмник ПСП, систолическая плитка и небольшой классификатор, все веса которого равны -1, 0 или +1.

Это же слово в том же репозитории носит и вторая, никак не связанная вещь. У формата GF-T экспонента «уравновешенно-троичная» лишь в том смысле, что её пространство кодов содержит 3^Et значений, отцентрованных смещением. В железе пересчёт экспоненты -- это a_off + b_off + carry - BIAS, обычное двоичное сложение. Ни один трит нигде не материализуется. Троичными называются обе вещи, а троичной схемой является только первая.

УзелЧто в нём троичногоНаивысший достигнутый статусЧем подтверждено
Проба троичного узлаСам примитив: процессор подаёт отсчёт и двухбитный вес, матрица отвечает +x, -x или 0Работал в матрице платы 19 августа 2026: якорь 0x47C0, пульс идёт, ответы +42, -42, 0, 0, +127, -127 для кодов 01, 10, 00, 11 -- бит в битresults/ps7_probe_silicon_2026-08-19.log, получен в тот же день
Согласованный фильтр на 8 отводовОтводы со знаковым выбором; код синхронизации использует все три символа, два отвода из восьми нулевыеРаботал в матрице Zynq XC7Z020 на реальном записанном эфире: 256 из 256 бит в битresults/cstream2.log, ветвь feat/own-rtl-in-radio-path
63-отводный приёмник ПСП63 отвода со знаковым выбором в уравновешенном дереве сумматоров, ни одного блока DSP48E1 по построениюРаботал в матрице: 256 из 256 бит в бит, с отрицательными контролями и двумя неисправностями, внесёнными в сам битстрим и упавшими ровно как предсказаноresults/pn63_success.log, negative_controls.log, bitstream_mutants.log, та же ветвь
Систолическая плитка и классификаторТот же примитив; в файле весов классификатора ровно три кода и ничего сверхСинтезировано: 527 таблиц, 45 цепочек переноса, 165 триггеров и ни одной ячейки DSP48E1yosys synth_xilinx на tern_corr8_stream, перезапущено, а не переписано
Арифметика GF-T в RTLПространство кодов экспоненты в 3^Et значений; само сложение двоичноеПромоделировано и синтезировано: 16-битное умножение -- 1 DSP48E1, 47 таблиц, 18 цепочек переносаfpga/gft/SYNTH_RESULTS.md, воспроизведено
GF-T на кремнииТот же формат, исполняемый на Artix-7Не доказано. Заявлено подробно, но ни лога размещения, ни битстрима, ни захвата UART нет ни в одной ветвиdocs/VERIFIABLE_COMPUTE.md утверждает; fpga/gft/SYNTH_RESULTS.md пишет, что трассировка и загружаемый битстрим не доказаны

С последней строкой было хуже, чем просто пробел, когда страница вышла впервые: один документ сообщал, что движки прошиты в плату, другой в том же каталоге -- что загружаемый битстрим не доказан. Верным одновременно это быть не могло. Исправление написано и открыто публично: запрос на слияние tri-net 382 переводит утверждение в разряд результатов моделирования и называет четыре артефакта, которые закроют вопрос, -- файл ограничений с заполненными выводами, лог трассировки с именем верхнего модуля, полученный из него битстрим и транскрипт прошивки с чтением кода кристалла. Приведённые числа вопрос решить и не могли: это те же эталонные векторы, что лежат в стендах моделирования.

Эта строка -- не цитата из старого журнала. Она получена по ходу написания страницы, на плате, стоящей на столе: цепочка JTAG отдаёт код кристалла 0x23727093, тот самый XC7Z020, о котором говорит страница, а после загрузки матрица ответила якорем 0x47C0, который отличает наш образ от вендорского. Первая попытка перезагрузила плату -- запись битстрима, пока radio-DMA в середине транзакции, вешает процессор, и заканчивает это только сторожевой таймер, -- поэтому теперь загрузка сначала разбирает шину: снять потоки отсчётов, отвязать ядра радиотракта, отвязать оба движка DMA, опустить Ethernet из матрицы и только затем писать. Обычная перезагрузка вернула вендорский образ и радио, поэтому такую проверку и можно было себе позволить.

Что это такое на самом деле

Это не продукт, который можно купить. Это открытый репозиторий -- один крейт на Rust под Apache-2.0 -- и журнал измерений на железе, которое любой может заказать, записанный так, чтобы посторонний мог их повторить. Что делает код: перегоняет байты между радиоузлами и на каждом прыжке выпускает подписанную квитанцию о том, какой узел сколько байт пронёс и в какую эпоху.

Железо -- четыре платы Puzhi P201Mini, на каждой Zynq-7020 и радиотракт AD9361, плюс одна ALINX AX7203 на XC7A200T для арифметики на стенде. Платы вы покупаете сами, здесь ничего не продаётся.

Проверяемое утверждение узкое, и оно бухгалтерское, а не радиотехническое: когда байт пересекает сеть независимых радиоузлов, может ли сеть выдать запись о том, кто его нёс, которую третья сторона проверит, не доверяя ни одному из них?

На чём это сделано

STACK: what the node is made of, bottom to top gold = vendor part, vendor tool, or not proven HOST SW OPEN Rust crate trios-mesh, edition 2021, Apache-2.0 107 .t27 specs -> gen/rust, gen/c, gen/zig MESH OPEN ETX + WMEWMA routing (-sim), 10.42.0.0/24, TTL 8 link = UDP-over-Ethernet stand-in (Transport) SEAL OPEN ChaCha20-Poly1305 AEAD, X25519 + HKDF-SHA256 Ed25519 + SHA-256; epoch_seal = mix32 checksum RADIO LINK OPEN host-side DBPSK, 768 kHz subcarrier, 63-bit PN AD9361 via iio_writedev / iio_readdev, 2.4 GHz NUMERICS OPEN SPEC GF-T4/8/16/32, balanced-ternary exponent ladder GF16 [s:1][e:6][m:9] bias 31, host model only PS / ARM LINUX VENDOR BOOT dual Cortex-A9 ARM Linux; armv7 musl binaries AD9361 control over IIO sysfs (LO, bw, RSSI) PL FABRIC OPEN RTL not loaded ternary weights, 2 bits: 01->+x, 10->-x, 0 DSP gft16_mul = 1 DSP48E1 + 47 LUT + 18 CARRY4 BENCH SILICON VENDOR PART Xilinx Artix-7, part xc7a200tfbg484-2 ALINX AX7203; 740 DSP48E1, 134,600 6-LUTs NODE SILICON VENDOR PART Xilinx Zynq-7020, part xc7z020clg400-1 AD9361 on the same Puzhi P201/P203 Mini board NOT PROVEN No bitstream of the project's own has ever been configured into a Zynq Mini PL. GF-T: no place-and-route, no timing closure, no on-silicon run claimed. The OTA link ran host-side. PS BOOT: VENDOR BOOT.BIN + FSBL from Xilinx bootgen (PetaLinux 2020.2) or Puzhi image BITSTREAM FLOW: OPEN yosys synth_xilinx -> nextpnr-xilinx -> prjxray fasm2frames -> xc7frames2bit in regymm/openxc7; no Vivado iverilog TB, openocd JTAG
Снизу вверх: узел стоит на вендорском кремнии (xc7z020clg400-1 с AD9361, на стенде xc7a200tfbg484-2), а всё, что выше, — открытое: крейт trios-mesh на Rust поверх 107 спецификаций t27, печать ChaCha20-Poly1305, меш по метрике ETX и битстрим, собранный связкой yosys, nextpnr-xilinx и xc7frames2bit без Vivado. Вендор обязателен только в двух местах — сами микросхемы и загрузочный образ PS от Xilinx bootgen; слой фабрики существует лишь как RTL, потому что ни один собственный битстрим ни разу не был залит в PL, и именно поэтому радиоканал работал целиком на стороне хоста.
СлойЧто это в действительностиГде исполняетсяАртефакт
Плата узлаPuzhi P201Mini: Zynq-7020, кристалл xc7z020clg400-1, два ядра Cortex-A9 и матрица класса Artix, рядом трансивер AD9361Четыре штуки в одной подсетиtools/jtag-bootstrap/README.md
Плата стендаALINX AX7203: Artix-7, кристалл xc7a200tfbg484-2, 740 блоков DSP48E1 и 134 600 шестивходовых таблицСтол, отдельно от радиоузловfpga/gft/gft_alu_ax7203.xdc
РадиотрактAnalog Devices AD9361, управляется из ARM-Linux через интерфейс IIO -- гетеродин, полоса, частота дискретизации, уровень сигналаВ Linux узла, не в матрицеtools/ad9361_config.rs
Поток битстрима -- открытая частьyosys synth_xilinx, затем nextpnr-xilinx, затем prjxray fasm2frames и xc7frames2bit в контейнере openXC7. Vivado в этом пути нет нигдеНа хосте, в Dockerfpga/ternary/ps7/build/run_openxc7.sh
Загрузка -- всё ещё вендорскаяBOOT.BIN и FSBL берутся из Xilinx bootgen через PetaLinux либо из фирменного образа платы. Поток для матрицы открыт, цепочка загрузки под ним -- нетНа хосте, при подготовке карты памятиdocs/LOCAL_FLASH.md
Программная частьОдин крейт на Rust, trios-mesh, редакция 2021, Apache-2.0: 10 805 строк в src/ и 432 тестовых блока. Над ним 107 спецификаций t27, порождающих Rust, C и ZigКросс-сборка armv7 musl, исполняется на Cortex-A9Cargo.toml, tri-facts.json
Тот канал, что реально пронёс байтыМодем DBPSK на поднесущей 768 кГц с 63-битной ПСП-преамбулой и разностным детектором, к AD9361 через iio_writedev и iio_readdevПрограммно на ARM узла, без единого нашего битстрима в матрицеsmoke/DEPIN_OTA_CLOSED_2026-07-18.md
Шифрование сеансаChaCha20-Poly1305, ключ из рукопожатия X25519 через HKDF-SHA256, направленный счётчик, окно защиты от повтора на 64 кадра, смена ключа каждые 2^20 кадровARM узла и хостsrc/crypto.rs
КвитанцииПодписи Ed25519, проверяемые по открытому ключу исполнителя; дайджесты SHA-256 и объединение в дерево МерклаARM узла и хостsrc/bin/trinet_a2a_node.rs
Печать покрытияepoch_seal: три круга 32-битного перемешивателя со сдвигом и сложением плюс циклический сдвиг. Связывает личность, эпоху и число байт в одно 32-битное словоНа узлах во время прогонов ретрансляцииspecs/tri_depin.t27
МаршрутизацияМетрика ETX с оценкой доставки WMEWMA, подсеть 10.42.0.0/24, время жизни пакета 8. Помечена как -sim, проверяется на хосте. Рабочий демон использует UDP поверх Ethernet вместо радиоканалаТесты на хосте, демон на узлахsrc/routing.rs, src/bin/trios_meshd.rs
Арифметика в матрицеGF-T, лестница чисел с плавающей точкой и троичным порядком. Шестнадцатибитный умножитель синтезируется в 1 DSP48E1, 47 таблиц и 18 цепочек переносаНастоящий кремний AX7203, ответы по UARTfpga/gft/SYNTH_RESULTS.md

Две строки этой таблицы стоит прочитать дважды. Поток битстрима действительно открыт -- образ матрицы не производит ни один вендорский инструмент, -- но цепочка загрузки под ним по-прежнему вендорская, и утверждать обратное было бы самой лёгкой ложью на этой странице. И модем, который реально нёс байты, работал программно на ядре ARM: ни один наш битстрим никогда не был загружен в матрицу узла.

Печать -- это контрольная сумма, а не хеш

epoch_seal -- это три круга 32-битного перемешивателя. Он работает на ключе и связывает личность, эпоху и число байт, поэтому совпадение печати у двух свидетелей -- довод в пользу того, что они учли один и тот же трафик. Но это не криптографический хеш, ширина всего 32 бита, и в комментарии самой спецификации сказано, что для настоящих расчётов печать следовало бы ещё и подписывать. Трафик сеанса защищён отдельно, через ChaCha20-Poly1305; печать -- учётный дайджест сверху, и он слабее.

Что именно измерено

TWO-HOP RADIO RELAY, 2026-07-18 -- one seal value, three comparison points3 x Puzhi P201Mini: Zynq-7020 (xc7z020clg400-1) + AD9361, ARM Linux, no PL bitstream loadedNODE .13Puzhi P201MiniZynq-7020 + AD9361origin, TXNODE .12Puzhi P201MiniZynq-7020 + AD9361relay: otarelayNODE .10Puzhi P201MiniZynq-7020 + AD9361receiver: otarxsetHOP 1 -- air2.4 GHz ISMDBPSK 768 kHzHOP 2 -- air2.4 GHz ISMDBPSK 768 kHzSEAL POINT 1 (origin)0x9DBE2510distinct = 4SEAL POINT 2 (hop-1)0x9DBE2510distinct = 4SEAL POINT 3 (hop-2)0x9DBE2510distinct = 4 (x3)====Same value at all three points: the payload set crossed two radio hops bit-exact.seal = epoch_seal(acc, total_bytes, node_key, epoch) -- 3 x mix32 + rotl32 into a 32-bit worda keyed checksum, not a cryptographic hash; computed in software on each Cortex-A9, no PLstore-and-forward, time-separated hops on one shared channel; relay path ran on the nodes, no host in the loop
Печать пересчитана независимо в трёх точках -- на источнике .13, на ретрансляторе .12 после первого прыжка и на приёмнике .10 после второго -- и всюду равна 0x9DBE2510: набор из четырёх полезных нагрузок прошёл оба радиопрыжка побитово без изменений. Чего это совпадение не доказывает -- авторства: epoch_seal это 32-битная контрольная сумма на ключе, а не подпись, и считалась она программно на Cortex-A9 каждой платы, без прошивки в самой ПЛИС.
ПрогонРезультатПри каких условияхЗаписано в
Два радиопрыжка, .13 -> .12 -> .10Печать покрытия 0x9DBE2510 одинакова во всех трёх точках; 4 различных полезных нагрузки на первом прыжкеОдин общий канал 2,4 ГГц, накопить-и-передать, прыжки разнесены во времени, а не одновременныDEPIN_2HOP_RELAY_2026-07-18.md
Два прыжка с упорядоченным сообщением в 31 байт6 из 6 кусков на обоих прыжках; печать 0x37A9A9F6 одинакова у источника, ретранслятора и приёмникаФиксированная тестовая строка в циклическом буфереDEPIN_MSG_RELAY_2026-07-18.md
Два прыжка, работающие одновременно5 из 5 кусков на ретрансляторе при работающем собственном передатчике; печать 0xE0AA4F5D одинакова в трёх точкахРазнос приёма и передачи 50 МГц на одном AD9361 в режиме FDDDEPIN_FDD_PIPELINE_2026-07-18.md
Три прыжка, .13 -> .12 -> .11 -> .10Пик корреляции 1,000, 0,998, 0,998; ошибок 0 из 128 на каждом прыжке, с первой попытки на каждомПередаёт один в один момент времени; захват повторялся до чистогоDEPIN_RELAY3_RTI_2026-07-19.md
Четыре узла, один передатчик, три свидетеляВсе три свидетеля независимо насчитали 8 различных кадров и одну и ту же печать 0xCDB1F3B1Каждый свидетель слушал эфир сам и учитывал то, что услышалDEPIN_STREAMING_4NODE_2026-07-18.md
Восемь байт по воздуху, замкнутый циклПик корреляции 1,000, ошибок 0 из 64, нагрузка восстановлена точно -- дваждыКадр 8 байт, гетеродин передачи 2400 МГц при усилении -10 дБDEPIN_OTA_CLOSED_2026-07-18.md
Развёртка по мощности передачи-10 дБ: 0 ошибок из 64. -20 дБ: 0 из 64. -30 дБ: 0 из 64. -40 дБ: 34 из 64 -- канал рвётсяУсиление -- это настройка AD9361 в дБ, а не излучаемая мощностьDEPIN_RADIO_RECEIPT_2026-07-18.md
Насколько разнести два канала на одном кристалле50 МГц и 20 МГц: чисто. 15 МГц и 13 МГц: на части кусков печать не сходитсяОграничение аналоговое; сужение цифрового фильтра приёма не помоглоDEPIN_FDD_SWEEP_LIVE_2026-07-18.md
Захват на 16 мегабайт, демодуляция офлайн815 кадров, 748 чистых (92%), 6520 байт, одна квитанцияОколо 136 мс эфира; примерно 3 с обработки на ARM. Один прогон, без повторовDEPIN_STREAMING_4NODE_2026-07-18.md
Зачем понадобилось отслеживание кадровФиксированная сетка: 0 чистых из 819. Кварцы двух плат на 30,72 МГц расходятся примерно на 10 миллионных долейКонтрольное условие, которое заменило отслеживание по захваченной позицииDEPIN_STREAMING_4NODE_2026-07-18.md
Арифметика на настоящем кремнии5 из 5 умножений GF-T16 и 3 из 3 скалярных произведений совпали побитово с образцом на хостеAX7203, поток openXC7, ответы по UARTdocs/VERIFIABLE_COMPUTE.md
Враждебные случаи на защищённом каналеОтклонены 5 негативов: подмена задания, подмена результата, повтор счётчика, перестановка операндов и слепой ретрансляторНастоящий AEAD, заголовок маршрутизации как связанные данныеdocs/VERIFIABLE_COMPUTE.md

Дефект, который нашёл прогон

Первая попытка первого прыжка дала не 0x9DBE2510, а 0x7ACD8A11 -- и не из четырёх различных нагрузок, а из пяти: один кадр пришёл с битовыми ошибками, прошёл порог корреляции 0,9 и раскодировался в нагрузку, которой никто не передавал. Печать сделала ровно то, ради чего она нужна: не сошлась. После этого добавили фильтр по большинству среди повторных копий и повторяли прогон, пока три точки не совпали.

Вот эту часть и стоит хранить. Схема учёта, которая никогда не расходится сама с собой, попросту не проверена; эта разошлась, расхождение довели до конкретной слабости декодера, и в журнале записаны и сбой, и починка.

Короче всего это описывается словом «бухгалтер»

Уберите радио -- останется учёт. Каждый узел ведёт нарастающий счёт пронесённых байт, связывает его со своей личностью и с эпохой и подписывает результат. Второй узел, слышавший тот же трафик, независимо получает тот же дайджест. Расчёт после этого -- арифметика по записям, которые могут сверить несколько сторон, а не заявление того, кому принадлежит базовая станция.

Поэтому самое интересное в двухпрыжковой ретрансляции -- не байты. Это три независимых пересчёта одного числа тремя машинами, которые друг с другом не сговаривались.

Где это нужно в гражданском обороте

СитуацияЧто доказывает квитанцияУ кого есть причина платить
Кому-то платят за покрытие там, где его никто не проверяет: сельский ретранслятор, кампус, зданиеЧто трафик действительно прошёл через этот узел в эту эпоху, и это подтверждают соседи, которые его тоже слышалиТот, кто финансирует покрытие и сегодня вынужден верить оператору на слово
Сеть датчиков выставляет счёт за доставленные данныеСколько байт дошло до дальнего конца, а не сколько было отправлено в надеждеТот, кому выставляют счёт
Подрядчик заявляет, что канал работал в период аварииПоэпохные счётчики от нескольких свидетелей, которые один оператор подделать в одиночку не можетСтраховщики и тот, кто писал условие об уровне обслуживания
Вычисление выполняется на устройстве, которое вам не принадлежитЧто возвращённый ответ соответствует подписанному обязательству по входным данным и ходу вычисленияТот, кто платит за вычисления

Ни одно из этого не является внедрением. Никакой расчётный контракт нигде не развёрнут, и покупателя ни на что из перечисленного сегодня нет. Это те ситуации, под которые ставились измерения.

Кто ещё есть на этом рынке

КтоЧто продаётЧего не даётВ чём отличие здесь
Persistent Systems, MPU5Боевая MIMO-радиостанция; предел по паспорту до 150 Мбит/с, криптомодуль по FIPS 140-2 уровня 2Ни описания сигнала, ни спецификации маршрутизации, ни векторов соответствияЗдесь договор о канале -- файл в репозитории под Apache-2.0
Silvus, StreamCasterСобственный MIMO-сигнал, 100+ Мбит/с, средняя задержка 7 мс в полосе 20 МГцНи опубликованной спецификации, ни векторов соответствия, ни ценыНаибольшая показанная сеть здесь -- четыре узла; три из них независимо учли один и тот же эфир
Rajant, Kinetic MeshЗапатентованная маршрутизация второго уровня без корневого узла, сотни Мбит/с на радиоБазовая реализация способна, но не сертифицированаКриптография здесь -- ChaCha20-Poly1305 с X25519, описана в репозитории и не сертифицирована никем: гарантия слабее, и об этом сказано прямо
Doodle Labs, Mesh RiderЭкономичные многодиапазонные радиостанции для дронов; NASA измерила 37,9 / 5,6 / 1,2 / 0,3 Мбит/с на одном-четырёх прыжкахШифрование и внутренности маршрутизации не опубликованыЗдесь байты пережили два прыжка без ошибок при совпавшей печати, но пропускная способность ни на одном числе прыжков не измерялась вовсе
MeshtasticОткрытая LoRa-сеть, 0,3-300 кбит/с, AES-256 программно, десятки километровНи широкой полосы, ни слоя учёта и вознагражденияШирокая полоса 2,4 ГГц и слой квитанций -- против несопоставимо меньшей и куда менее зрелой экосистемы
openwifi / open-sdrПолностью открытый Verilog для 802.11 с физическим уровнем OFDM прямо в матрице ПЛИСНе сетевой по природе; целится в потребительский стандартБлижайший открытый конкурент, и он впереди там, где это важнее всего: его физический уровень работает в матрице. Наш работал программно на ARM
AREDNСвободная прошивка, превращающая серийные маршрутизаторы в сеть 2,4/5 ГГц, 5-50 кмНи своего сигнала, ни слоя учёта и подтвержденияВпереди по зрелости и числу развёрнутых узлов -- репозиторий сам записывает это себе в недостатки
Helium и похожие токен-сетиВознаграждение операторам точек в токенах плюс разгрузка трафика операторов связиУчастие не привязано к конкретному подтверждённому устройствуЗдесь три свидетеля независимо получили одну и ту же печать покрытия из эфира, который каждый слышал сам

Эту таблицу стоит читать по проигрышам. По пропускной способности, задержке, дальности, зрелости экосистемы и сертификации серийные радиостанции впереди с разрывом, который не назовёшь близким, а openwifi впереди по единственной оси открытого железа, которая важнее прочих. Отличие здесь узкое: слой учёта, договор о канале в виде файла, а не строчки в паспорте, и журнал, где отказы записаны наравне с удачами.

Чего мы не утверждаем

Дорожная карта и к чему присоединяется партнёр

ROADMAP - spec to fabric: three stages measured, the fourth not done solid = done, artefact named | dashed gold = not done, no date claimed 1 2 3 4 1 SPEC + HOST DONE (counts re-run) 107 .t27 specs -> gen/rust, gen/c, gen/zig 432 #[test] blocks 10,805 lines in src/ crate trios-mesh, Rust edition 2021, Apache-2.0 router/modem/gf16: -sim -> tri-facts.json 2 ON THE NODE (ARM) DONE (on device) armv7l Cortex-A9, RC=0 ChaCha20-Poly1305 seal, 534,604 B static binary run 2026-07-01 OTA: DBPSK, 768 kHz sub- carrier, 63-bit PN, via AD9361 at 2.4 GHz ISM 2026-07-18, no PL loaded -> smoke/M1_RESULTS.md 3 BITSTREAM BUILT DONE (file on disk) yosys 0.62 -> nextpnr- xilinx -> fasm2frames -> xc7frames2bit ps7_tern.bit 4,045,670 B part xc7z020clg400-1 yosys stat gft16_mul: 1 DSP48E1, 47 LUT, 18 CARRY4 -> REPRODUCTION.log 4 IN THE FABRIC NOT DONE - no date - no bitstream of our own has ever been configured into the PL of a Puzhi Mini - NOT proven: place-and- route, timing closure (Fmax), a loadable bitstream - GF-T on silicon: no UART log, no .bit and no run record - IDCODE 0x13636093: no JTAG scan log - PS boot chain still vendor: BOOT.BIN+FSBL from Xilinx bootgen -> ps7/FIRST_LOAD.md Everything measured so far ran on the host or on the node ARM, with no PL bitstream loaded. ps7_tern.bit exists on disk and has never been configured into the PL of a Puzhi Mini.
Три этапа из четырёх подкреплены названным артефактом и измерением: спецификации и тесты на хосте, запуск ChaCha20-Poly1305 с RC=0 на Cortex-A9 самого узла и радиоканал DBPSK через AD9361, а также битстрим на 4 045 670 байт, собранный открытым потоком yosys → xc7frames2bit. У четвёртого нет ничего: файл .bit лежит на диске, но его ни разу не загружали в PL, — значит, о работе в самой ПЛИС этот путь пока не свидетельствует.
  1. Измерить пропускную способность по-настоящему: хронометраж передачи известной нагрузки на одном прыжке, затем на двух и трёх, с указанием часов и методики. Пока этого нет, на первый вопрос любого покупателя ответа не существует.
  2. Завести наш модем в матрицу, а не на ядро ARM. Открытый поток битстрима уже собирает образы под этот кристалл; ни один наш образ в узел ещё не загружали.
  3. Подписывать печать покрытия, как того и требует собственная спецификация, чтобы на неё можно было опереть расчёт.
  4. Собрать больше четырёх узлов и вынести их куда-нибудь, кроме одного стола.

Партнёр, присоединяющийся сейчас, присоединяется к дисциплине измерений, а не к сети. Что есть в наличии -- это инструмент: железо, которое любой может купить, поток сборки без вендорской лицензии на пути к матрице, и журнал, где отказы записаны с той же тщательностью, что и результаты.

Чего это не решает

Пруфы

Каждая цифра выше измерена, и рядом с ней названы её пределы.