Разбор
TRANVIEW
Просмотрщик Nutmeg RAW для SPICE TRAN при жёстком бюджете памяти
Задача
SPICE TRAN-симуляции пишут Nutmeg RAW — бинарные файлы с десятками и сотнями миллионов точек на сигнал. Типичные GUI-просмотрщики либо грузят файл целиком, либо тормозят на масштабировании и синхронизации осей.
Конкурс «Траектория САПР» (номинация МИЭТ «Визуализация результатов моделирования в условиях ограниченных ресурсов») требовал интерактивно смотреть TRAN-результаты при жёстком бюджете ОЗУ: файлы в десятки гигабайт нельзя целиком держать в памяти. Нужен был viewer, который читает Nutmeg RAW потоково через seek+read и укладывается в лимит — а не грузит весь массив в RAM.
Архитектура и I/O
Файл не мапится в память и не индексируется в отдельные индексы на диске — чтение идёт через seek+read по бинарной схеме Nutmeg RAW. Общий слой I/O обслуживает все сигналы: LRU-кэш блоков, дедупликация параллельных запросов к одному блоку, настраиваемые RAM-бюджеты.
Флаг --strictmem обнуляет кэши и помогает воспроизводимо проверять поведение под лимитами. Сжатие блоков — zstd и lz4 — уменьшает объём данных в RAM без потери точности исходных сэмплов.
- seek+read по Nutmeg RAW, без mmap и без внешних индексов
- LRU-кэш блоков и дедупликация параллельных чтений
- zstd / lz4 для сжатия блоков в RAM
- --strictmem: принудительное обнуление кэшей
Как рисуется длинный сигнал
Файл слишком большой, чтобы сразу читать все точки. Сначала рисуется грубый набросок: программа быстро пробегает видимый кусок кусками по 4 KB (по желанию — плотнее, по 4 MB), чтобы форма волны появилась сразу. Потом строится нормальная детализация под текущий зум. Если вы уже сдвинули или приблизили график, фоновый расчёт отменяется — интерфейс не ждёт устаревший результат.
Чтобы ужать миллионы точек до ширины экрана, считаются минимумы и максимумы на отрезках (SIMD: AVX2, SSE4.1 или NEON — что есть на процессоре). Есть и другие режимы сглаживания контура. Готовые куски линии кэшируются в сжатом виде.
- Грубый набросок (4 KB) → плотнее (4 MB) → детальный LOD
- Ускорение на SIMD: AVX2, SSE4.1, NEON
- Доп. режимы контура: LTTB / LTTB+ / Catmull-Rom
- Фоновый расчёт отменяется при смене вида
UX и конкурс
Интерфейс на eframe/egui с несколькими синхронизированными осциллограммами через egui_plot. Можно сравнивать сигналы, смотреть разбивку памяти по кэшам и быстро переключаться между файлами без полной перезагрузки данных в RAM.
Команда Kizil (НИУ МИЭТ) заняла 1-е место в номинации «Визуализация результатов моделирования в условиях ограниченных ресурсов» на «Траектория САПР». Сборки проверялись под musl/glibc и aarch64.
Стек и инструменты
Основной стек: Rust, eframe, egui, egui_plot, rayon, zstd, lz4. Окно, меню и осциллограммы рисуются через egui — без Qt/GTK. Бэкенд графики подбирается сам: Vulkan, OpenGL или программный рендер на слабом железе.
Утилита gen генерирует тестовые осциллограммы Nutmeg RAW для нагрузочных прогонов и регрессий. Кросс-сборки покрывают Linux x86_64/aarch64 под musl и glibc.
- Rust · eframe · egui · egui_plot
- rayon · zstd · lz4
- gen — генератор тестовых RAW
- Cross: musl / glibc, aarch64