Разбор

TRANVIEW

Просмотрщик Nutmeg RAW для SPICE TRAN при жёстком бюджете памяти

WASM-сборка в браузере: меню «Примеры» → инвертор / импульс / осциллятор. WebGL.

Открыть демо на весь экран →

Задача

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

Открыть демо → Скачать tranview.zip ↓ Новость МИЭТ → ← К проектам