Разбор

TCAD Viewer

Просмотрщик 2D TCAD-структур: поля на сетке, разрезы и графики в одном окне

Задача

Результаты 2D TCAD — это кусок прибора на треугольной сетке: области материалов (кремний, оксид и т.д.), границы между ними и поля вроде концентрации или потенциала. Их нужно быстро открывать и смотреть без тяжёлых коммерческих программ.

В задании просили привычные форматы TCAD (STR, TIF, TDR и др.), клик по элементам сетки, цветовые шкалы, линии уровня, разрезы с графиками и всё это в одном окне с панелями, которые можно переставлять.

Файлы и сетка

Открывает 2D-структуры STR, TIF, MSH и одномерные данные TDR, PLX, CSV. Можно сохранить обратно в STR, TIF, MSH, TDR. Парсер сам собирает области, границы и значения на элементах — без лишних промежуточных форматов.

Spatial hash здесь — простая сетка ячеек поверх модели: каждый треугольник лежит в одной или нескольких ячейках. Клик или разрез смотрят только соседние ячейки, а не миллионы треугольников подряд. Без этого каждый клик был бы медленным.

  • Импорт: STR, TIF, MSH
  • 1D-данные: TDR, PLX, CSV
  • Экспорт: STR, TIF, MSH, TDR
  • Быстрый клик и разрез — сетка ячеек (spatial hash)

Отрисовка полей

Картинка поля рисуется на GPU (wgpu). Форма сетки лежит отдельно от значений: когда переключаешь концентрацию на потенциал, треугольники не собираются заново — обновляются только числа. Цвет считается на видеокарте; сглаживание (MSAA) можно менять на лету — для этого я патчил egui-wgpu (раздел ниже).

Линии уровня строятся по треугольникам параллельно (rayon). Есть режим «поверхность»: значение поля поднимает точки по высоте. Области материалов и границы рисуются поверх поля своими контурами.

  • Сетка отдельно, значения поля — отдельно
  • Цвет на GPU
  • Патч egui-wgpu — смена сглаживания на лету
  • Линии уровня и режим поверхности

Как я патчил egui-wgpu

В настройках TCAD Viewer можно включить или выключить сглаживание картинки — и окно не должно перезапускаться. В обычном egui-wgpu уровень сглаживания (MSAA: 1× или 4×) задаётся один раз при открытии окна; потом библиотека его уже не меняет.

Я скопировал исходники egui-wgpu в папку проекта и сказал Cargo брать эту копию вместо crates.io. В библиотеку добавил вызов «хочу такой-то MSAA»: он не ломает текущий кадр, а ставит отметку. В начале следующего кадра egui-wgpu сам пересобирает то, что нужно для нового сглаживания, и заново собирает только отрисовку интерфейса — шрифты и уже загруженные картинки UI не сбрасывает.

Со стороны TCAD Viewer порядок такой: обновить свой рендер под новый MSAA, пересобрать отрисовку сетки и поля, вызвать request_msaa. Ниже — готовый патч к egui-wgpu 0.34.2 с crates.io: можно скачать и наложить на чистые исходники.

  • Проблема: в стоковой библиотеке MSAA только при старте
  • Решение: своя копия egui-wgpu и смена на следующем кадре
  • Шрифты и картинки UI при этом не перезагружаются

Как это выглядит в коде

// Settings: user picked MSAA 4×
egui_wgpu::request_msaa(4);

// Next frame inside egui-wgpu:
// rebuild MSAA buffers, keep UI textures

// TCAD Viewer also rebuilds its own
// mesh/field GPU pipelines for 4×

Разрезы и шкалы

Разрез — линия по структуре: вдоль неё снимаются значения и уходят в боковые 1D-графики (egui_plot с правками под TCAD). Можно держать несколько разрезов и сравнивать профили рядом.

Для графиков есть линейная шкала и логарифмические варианты, в том числе такие, что нормально ведут себя около нуля и при смене знака поля — это часто бывает у границ материалов. Шкалу можно сменить без повторной загрузки файла.

  • Несколько разрезов с 1D-графиками
  • Линейная и логарифмические шкалы
  • Корректное поведение около нуля и смены знака

Чем сделано

Написано на Rust. Окно и панели — egui (eframe, egui_dock), графики — egui_plot с правками, отрисовка сетки и полей — wgpu. Тяжёлые расчёты по сетке идут параллельно через rayon. Раскладку панелей можно менять, она помнится в сессии.

Собран под задание по 2D-визуализации: форматы TCAD, инспекция на сетке и разрезы — без коммерческих просмотрщиков вроде INSPECT / SVisual.

  • Rust · egui · egui_dock
  • egui_plot (с правками) · wgpu
  • rayon для расчётов по сетке
  • Патч egui-wgpu — сглаживание на лету

← К проектам