Вирішив написати свою мову апаратного синтезу, для Maincraft і що з цього вийшло



Мені завжди було цікаво, як люди роблять в іграх складні інженерні конструкції, і завжди хотілося спробувати повторити. Дуже давно я побачив ролик на YouTube про те, як один чоловік побудував процесор на редстоуне. І вирішив спробувати: чим я гірший? Тоді я зібрав кілька прототипів окремих елементів і зрозумів, що це завдання мені не по плечу. До цього часу я трохи освоїв Verilog. Народилася думка: чому ніхто не намагався використовувати мови апаратного синтезу для побудови складних логічних схем в minecraft? Трохи заглибившись у різні форуми, я не знайшов жодної схожої утиліти, а свій процесор на редстоуне дуже хотілося. Довелося взятися за написання компілятора самому. Що з цього вийшло-читайте під катом.

Проект вийшов дуже великий за обсягом з цього, його довелося розбити на окремі етапи:

Етап 1: Вивчити, як працюють великі продукти синтезу мікроелектроніки, і ЗА для розробки на пліс.
Етап 2: Провести зворотну інженерію формату зберігання нетлистов в популярних продуктах для роботи з ПЛІС.
Етап 3: Зробити свою реалізацію елементів ПЛІС (LUT осередків, тригерів)
Етап 4: Зробити свій трасувальник нетлистов, для minecraft.
Етап 5: Раптово довелося писати симулятор редстоуна для спрощення процесу налагодження, без нього у мене процес подальшої розробки сильно забуксував.
Етап 6: Розробити спрощений синтаксис мови для апаратного синтезу.
Етап 7: Написати компілятор.

Отже, приступимо. Для початку я випробував кілька синтезують компіляторів Verilog, самим вдалим вибором виявився Qartus II, так як підтримує кілька мов синтезу, таких як Verilog VHDL. Є хороша графічна середовище для візуального моделювання, є можливість візуалізації нетлистов, є можливість вивантажити проміжні нетлисты в удобоваримом вигляді.

Першою утилітою у мене вийшла програма для конвертації файлів у форматі VQM у спрощений формат MNET. VQM являє собою описувач осередків, тригерів, їх параметрів, схеми з'єднання. У свою чергу MNEТ — це простий список нодів мережі і з'єднань між ними. Після довелося шукати спосіб подальшої декомпозиції до рівня гейтів, так як реалізація навіть однієї універсальної 16-бітної осередку LUT вийшла занадто громіздкою. Такий спосіб швидко знайшовся в особі логічного оптимізатора espresso. І всього за кілька днів я порахував бібліотеку всіх можливих реалізацій 65 536 логічних комірок.

Потім я почав малювати окремі гейти в середовищі Minecraft, для чого зробив простенький текстовий формат зберігання binhl, в якому зберігаються всі входи і виходи нода і пошарова реалізація редсоун схеми. Також знайшов спосіб завантаження редстоун схем в Minecraft через worldedit допомогою javaScript. Написавши коду-генератор для конвертації схем, я приступив до написання однієї з найбільш складних частин проекту — трасувальникові.

Завдань у трассировщика дві: розміщення елементів і розміщення сполук. Розміщувати елементи дещо складніше, ніж здається на перший погляд, так як від їх стану залежить довжина сполук і перетинів поміж сполуками а, отже, кількість шарів в схемі. Я випробував безліч варіантів і зупинився на наступному алгоритмі: розміщуємо порти введення виведення, далі розміщуємо елемент, який має найбільше зв'язків до вже розміщених елементів, переходимо до наступного елементу, поки не розмістимо всі. Потім простір розбиваємо на шари по 3 блоки, в яких розміщуємо з'єднання між гейт. З'єднання розміщуються за допомогою модифікованого A-Star алгоритму, де після розміщення кожного з'єднання оновлюється маска. Також, з-за особливостей редстоуна в маинкрафт, максимальна довжина з'єднання не повинна перевищувати 16 блоків, що викликає додаткові складності у правилах розміщення з'єднань.

І тут сталася несподіванка: виявилося, що налагоджувати подібну систему вкрай складно. Довелося приступити до написання симулятора редстоуна, щоб зробити набір автоматичних тестів роботи всіх елементів системи. Емулятор я побудував на основі клітинного автомата, де будується матриця всіх елементів, у якій кожен елемент дивиться на сусідні і в залежності від правил змінює свій стан. Після написання емулятора процес налагодження та розробки пішов швидше.



Після того як у мене вийшло стабільно збирати редстоун схеми з VQM, я приступив до написання власне синтезу мови, за основу я взяв Verilog і трохи спростив його для зручності використання в minecraft. Для написання компілятора я взяв відомий лексер і компілятор компіляторів COCO/R. Зробив опис синтаксису в розширеній формі Бекуса-Наура, зібрав першу версію компілятора.

За підсумками я зрозумів, що розробити досить складний проект поодинці можливо, але це вимагає величезного терпіння і бажання вивчати нове. Зараз займаюся працюй над компілятором, оптимізацією, та документацією про те, як цим всім користуватися.

Ось невеличке відео:



Посилання на GitHub

Джерело: Хабрахабр
  • avatar
  • 0

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.