惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
V
V2EX
C
Check Point Blog
GbyAI
GbyAI
D
Docker
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
T
Troy Hunt's Blog
博客园 - Franky
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Security Blog
Microsoft Security Blog
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学
The Cloudflare Blog
S
SegmentFault 最新的问题
Latest news
Latest news
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
I
InfoQ
博客园 - 【当耐特】
NISL@THU
NISL@THU
A
About on SuperTechFans
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Scott Helme
Scott Helme
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
Security Latest
Security Latest
V
Vulnerabilities – Threatpost
Security Archives - TechRepublic
Security Archives - TechRepublic
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
IT之家
IT之家
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
SecWiki News
SecWiki News
大猫的无限游戏
大猫的无限游戏
S
Security Affairs
The Register - Security
The Register - Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
L
LINUX DO - 热门话题
T
Tor Project blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Одна DRC-дека, три техпроцесса и двенадцать неверных гипотез
Григорий Фисенко · 2026-06-25 · via Все публикации подряд на Хабре

Средний

9 мин

711

Как мы поверили в «универсальность» движка и почти не стали её проверять

Мы были уверены, что наш DRC-движок универсален.

На SKY130 он совпадал с эталонным KLayout до последнего нарушения: тесты зелёные, расхождения нулевые, поведение стабильное от прогона к прогону. Из этого казалось очевидным, что движок применим к любому техпроцессу. Он же просто исполняет правила из деки и ничего не знает про конкретную фабрику.

Мы эту мысль не проверили. Мы в неё поверили. И это разные вещи, как выяснилось.

Сначала контекст

Мы небольшой командой пишем на Rust редактор топологий микросхем и к нему верификатор. Команда - четыре человека(недавно присоеденился еще один разработчик) человека, я CTO, направляю архитектуру и принимаю решения, в том числе те неправильные, о которых пойдёт речь. Верификатор делает четыре вещи: DRC, LVS, проверку антенн и экстракцию паразитов. Здесь - только про DRC, потому что вся история крутилась вокруг него.

Расшифрую, чтобы дальше не спотыкаться. DRC - это проверка топологии на соответствие правилам фабрики. У каждого техпроцесса есть свой свод правил: минимальная ширина проводника, минимальный зазор между фигурами, на сколько металл должен накрывать переходное отверстие, и так далее - сотни правил. Дизайнер рисует топологию, прогоняет через DRC, и тот говорит, где зазор меньше нормы. Без чистого DRC чип не примут на фабрику. Сам свод правил называется декой, и для каждого процесса она своя.

Мы писали движок на открытом SkyWater SKY130. На нём всё совпадало с эталоном. Отсюда и взялась опасная мысль:

Если движок исполняет правила, значит он должен работать на любой деке.

Звучит логично. Только проверять это никто не сел.

Что значит «универсальный» на самом деле

Первое, на чём мы споткнулись, - на определении. Что именно надо доказать?

Напрашивается простой ответ: «движок считает все правила деки». Мы чуть не пошли этим путём, и хорошо, что остановились. Потому что «считает все правила» - мусорная метрика.

Деку можно импортировать на сто процентов и при этом считать неправильно. Можно показать красивое «224 из 224 правила обработано» и тихо ошибаться на каждом третьем. Количество импортированных правил вообще ничего не говорит о правильности.

Правильное определение оказалось другим:

Движок корректен, если он совпадает с эталоном KLayout на одной и той же геометрии - нарушение к нарушению.

Эталон у нас один: бинарник KLayout, открытого инструмента, который в индустрии считается референсным. Мы прогоняем нашу проверку и проверку KLayout на одной топологии с одной декой и сравниваем нарушение к нарушению. Совпало - хорошо. Не совпало - у нас либо лишнее срабатывание, либо пропущенное. Это единственная метрика, которая нас интересовала.

Инвариант, который не даёт ошибаться тихо

Ещё одно правило мы ввели с самого начала, и не жалею ни секунды:

Ни одно правило деки не имеет права исчезнуть молча.

Каждое правило при импорте попадает в одну из трёх корзин: либо посчитано, либо честно помечено «не поддержано, причина такая-то», либо помечено «в этом контексте неприменимо». Третьего не дано. Если правило просто пропало где-то по дороге, не попав ни в одну корзину, - это баг, а не «приемлемое упрощение».

Зачем так строго. Молчаливый пропуск - худшее, что может сделать верификатор. Лишнее срабатывание дизайнер увидит и проигнорирует. А пропущенное нарушение он не увидит никогда - и узнает о нём, когда чип вернётся с фабрики неработающим. Инструмент, который тихо проглатывает правила, опаснее отсутствия инструмента: с отсутствием ты хотя бы знаешь, что проверки нет.

Дальше станет видно, зачем этот инвариант понадобился. Он поймал нас за руку буквально на втором техпроцессе.

Перепись: три техпроцесса вместо одного

Раз цель - совпадение с эталоном на произвольном процессе, надо было выйти за пределы SKY130. Взяли три открытых техпроцесса: тот же SKY130, GlobalFoundries 180 нм и SiGe-процесс от IHP.

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

Перепись сразу опрокинула моё «всё перенесётся с одного процесса на другой».

Диагонали: то, что движок не видел вообще

Почти вся топология микросхем прямоугольная: проводники идут строго по горизонтали и вертикали. Но не вся. На GlobalFoundries в защитных кольцах встречаются диагонали под 45 градусов - фигуры в форме ромбов и восьмиугольников.

И когда мы это измерили, выяснилось, что движок молча терял всю геометрию под углом.

Он не ошибался в расчёте. Он просто не видел диагональные грани - как будто их нет. На прямоугольной топологии это не вылезало никогда, потому что там диагоналей нет. А стоило подсунуть GlobalFoundries с его ромбами - и проверка тихо пропускала целый класс фигур.

Это был ровно тот молчаливый пропуск, которого мы поклялись не допускать. Только мы про него не знали, пока не измерили на втором процессе. Инвариант не предотвратил баг - он сделал его видимым, как только мы прогнали GF180.

Почему диагонали нельзя было «добавить сверху»

Первая реакция - расширить существующую модель, обобщить прямоугольную логику на углы.

Не сработало. Каждая попытка «обобщить» проверенный прямоугольный путь его ломала. Чинишь диагонали - разваливается то, что работало для прямых углов.

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

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

Сама история с диагоналями заняла много раундов и тянет на отдельную статью. Если коротко - почти каждый раунд начинался с уверенной гипотезы «вот сейчас одним куском закроем», и измерение её опровергало. Я насчитал больше десятка таких за всю кампанию. Не потому что плохо думали - а потому что геометрия и деки разных процессов ведут себя не так, как подсказывает интуиция.

SKY130: где 100% оказывается иллюзией

На SKY130, где мы выросли, история получилась поучительная в другую сторону. Тут движок и так считал хорошо - но «хорошо» надо было превратить в число.

Разложили деку по полочкам. Всего 224 правила. Из них 12 - проверки уплотнительного кольца по краю кристалла, той самой защитной рамки вокруг чипа. В обычном тестовом блоке этой рамки нет, она появляется только на финальной сборке. Этим 12 правилам в нашем контексте проверять физически нечего: они не «не работают», им просто нечего ловить. Честный учёт требует вынести их за скобки - не «мы их не считаем», а «в этом контексте неприменимо».

Остаётся 212 применимых правил. На старте мы покрывали 204 из них. Дальше - про оставшиеся восемь, в них вся соль.

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

Итог - 210 из 212, то есть 99,1 процента применимых правил. Последние два - узкая конструкция, которая упирается не в геометрию, а в стопку мелких возможностей разборщика, которых пока нет. Закрыть можно, но это работа, непропорциональная ради двух правил. Мы честно записали её в потолок, а не сделали вид, что её нет.

И вот тут принципиальное. У нас 99,1 процента, а не 100. Я специально не стал натягивать до ста.

Любой, кто работал с верификацией, знает: «100 процентов на чужой деке» означает либо враньё, либо что вы не тестировали по-настоящему. Честные 99,1 с тремя названными исключениями - 12 неприменимы, два упираются в импорт, плюс граница метода ниже - вызывают больше доверия, чем круглая цифра без оговорок. Потолок, который ты можешь назвать поимённо, - это доказательство того, что ты в материале, а не недоделка.

Дырки на настоящей геометрии

Маленький эпизод, который мне нравится как иллюстрация.

Часть правил DRC работает с дырками в фигурах: в большом куске металла вырезано отверстие, надо проверить его площадь. У нас такие правила были покрыты тестами - но синтетическими. Мы сами рисовали фигуру с дыркой и проверяли на ней.

Синтетический тест доказывает, что код в принципе работает. Он не доказывает, что код работает на настоящей геометрии настоящего чипа. Разница иногда болезненная.

Нашли в реальном блоке Caravel небольшой кусок на 85 килобайт, где есть десяток настоящих отверстий в металле ровно на нужном слое. Заморозили на нём эталон KLayout, прогнали нашу проверку.

Шесть отверстий из восьми. Два пропустили.

Первый порыв - расстроиться. Но разобрались, и оказалось интересно: два пропущенных существуют только тогда, когда чип «расплющен» в единый слой без иерархии. Это отдельный известный класс задач - расхождение между послойной обработкой и расплющенной, - и к самому механизму работы с дырками отношения не имеет. То есть наша работа с дырками на настоящей геометрии подтвердилась (шесть отверстий, ноль ложных срабатываний – чего синтетика показать не могла в принципе), а заодно мы точно, числом, измерили границу: вот эти два мы не видим, и вот почему.

Это повторяющийся сюжет всей работы. Измерение почти всегда даёт не «всё совпало», а конкретное число с конкретной границей. И это полезнее зелёной галочки.

IHP: когда дека перестаёт быть набором правил

С SiGe-процессом от IHP вышла самая отрезвляющая часть, и она лучше всего показывает, зачем вообще нужна перепись.

На двух первых процессах дека - более или менее плоский список правил, который разборщик читает. Дека IHP устроена принципиально иначе. Это не список правил. Это программа на Ruby: три тысячи строк с циклами, условиями, собственными классами и конфигом, который подгружается на лету. Наш разборщик такое не читает в принципе - он рассчитан на плоское описание, а тут полноценный язык программирования.

Мы измерили честно, что это значит, и разложили на две планки.

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

Вторая планка - полный промышленный свод правил IHP. И тут честный ответ: это отдельный большой проект, не доработка. Минимум треть деки по-настоящему завязана на логику Ruby - вычисляемые параметры, классы-обработчики, поведение, которое нельзя развернуть статически. Чтобы это поддержать, нужен либо интерпретатор Ruby, либо переписывание этих обработчиков. Масштаб отдельного продукта, и я не стал притворяться, что это «ещё немного допилить».

Зачем так подробно про то, чего мы пока не сделали? Затем, что в этом и смысл переписи. Я мог бы сказать «поддерживаем три процесса» и формально не соврать - на учебном уровне это правда для всех трёх. Но честная картина другая: на двух процессах мы близки к полному совпадению с эталоном, на третьем есть рабочая учебная планка и измеренный по стоимости путь к полной. Это не так звонко, как «поддерживаем всё». Зато правда, и под ней я готов подписаться перед любым, кто откроет инструмент и проверит.

Что я как CTO из этого вынес

Кампания заняла прилично времени, и почти каждый раунд начинался с гипотезы, которую измерение потом опровергало. Больше десятка таких. Отсюда выводы, по убыванию важности.

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

Импортировано – не значит правильно. Самая коварная метрика в верификации - процент покрытия деки. Можно затащить все правила и считать неправильно. Значение имеет только совпадение с эталоном на конкретной геометрии, нарушение к нарушению. Остальное - самоуспокоение.

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

Молчаливый пропуск – это баг, а не упрощение. Каждое правило обязано попасть в одну из трёх корзин. Правило, исчезнувшее без следа, - не «приемлемая аппроксимация», а пропущенное нарушение, которое вернётся с фабрики неработающим чипом. Инвариант мы держим насквозь, и он не раз ловил нас за руку – в первый раз ровно на диагоналях GF180.

Новый класс геометрии нельзя обобщать задним числом. Каждый раз, когда мы пытались «обобщить» существующий код под новую геометрию, мы ломали проверенное. Правильный путь - отдельный канал поверх рабочего, включающийся только там, где нужен, оставляющий старое нетронутым до бита. Проверенное и непроверенное нельзя собирать в одну кучу.

Если совсем коротко: мы не доказали, что движок «поддерживает всё». Мы доказали другое, и оно мне нравится больше. Движок не привязан к процессу, на котором мы его писали: он совпадает с эталоном на трёх разных техпроцессах, на прямоугольной геометрии и на диагональной, без молчаливых потерь. А там, где у него есть граница, мы можем назвать её поимённо и сказать, сколько стоит её сдвинуть.

Самое неприятное в этой истории - не сами ошибки. А то, что почти ни одна из них не была видна до измерения.


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