![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Polygon UsageBoost , ,Layout Versus Schematic TutorialВ этом руководстве мы реализуем приложение проверки макета игрушки VLSI. В VLSI CAD важным этапом проектирования является проверка выписки, которая проверяет, что физическая планировка, нарисованная дизайнерами масок и автоматизированными инструментами, реализует логическую схему, указанную инженерами-конструкторами. Физическая компоновка моделируется как полигоны на слоях, которые используются для печати компоновки на кремниевой пластине во время производства. Гораздо лучше найти ошибки в физическом дизайне, прежде чем тратить миллионы долларов на подготовку литографических масок и запускать много тестовых пластин. Реальные форматы файлов компоновки являются двоичными и часто сжимаются и представляют собой сложенную иерархическую модель компоновки, где группа полигонов может быть сгруппирована в ячейку и инстанцирована как группа в другие ячейки. Для этого учебника мы предполагаем упрощенный формат файла макета ascii без иерархии дизайна, который мы назвали бы "flat" на жаргоне VLSI. Точно так же мы предполагаем плоский, асциевый логический схематический формат файла сетки. Сеть — это электрическое соединение в схеме. Целью учебного пособия по проверке макета является разбор этих двух форматов файлов, применение операций геометрии, предоставляемых Boost. Полигон на данных компоновки для создания логической схемы, которая представляет то, что реализовано в физической компоновке, а затем сравнивает схему ввода с сгенерированной схемой, чтобы определить, являются ли они одинаковыми. Во-первых, давайте определим некоторые объекты, которые нам понадобятся в дизайне нашего приложения для проверки макета игрушек: Прямоугольник: Ось-параллельный прямоугольник со слоем, связанным Далее давайте определим последовательность операций, выполняемых нашим макетом игрушек, по сравнению со схематическим приложением: Parse Layout: прямоугольники и многоугольники компоновки потока в базу данных компоновки и штифты компоновки потока в базу данных подключения Для тестирования нашего приложения мы будем извлекать отдельные логические вентили. Логический вентиль — это несколько транзисторов, которые работают вместе для выполнения определенной логической функции. Логические функции включают в себя обычно понимаемые логические операции Boolean, такие как Boolean AND, OR, XOR и INVERT. Также часто используются NAND и NOR, которые являются соответственно операциями AND и OR с последующей операцией INVERT. Затвор NAND может быть реализован в семействе схем CMOS с четырьмя транзисторами. Затвор NAND имеет два входа и один выход. Каждый вход идет на два транзистора, один транзистор p-типа и один транзистор n-типа. "p" означает положительный, а "n" — отрицательный. Когда транзистор p-типа находится на нем, он вытягивает выход до того же напряжения, что и источник напряжения. Когда транзистор n-типа находится на нем, выход тянет вниз к тому же напряжению, что и земля. Процесс создания транзистора p-типа начинается с "допинга" кремниевой подложки для создания материала n-типа. Эта область материала n-типа будет называться слоем NWELL в наших тестовых данных. В области NWELL область p-диффузии создается путем дальнейшего легирования кремния для создания материала p-типа. Эта область материала p-типа будет называться PDIFF в наших тестовых данных. Через середину области PDIFF выращиваются полосы поликремния, которые создают проводящие линии над областью диффузии. Область поликремниевого материала в наших тестовых данных будет называться ПОЛИ. Под некоторыми из этих поликремниевых линий тонкий слой оксида кремния обеспечивает изоляцию, но позволяет полю напряжения поликремния взаимодействовать с диффузией. Каждая из этих изолированных поликремниевых линий является "воротом" транзистора. В наших тестовых данных область ворот будет называться GATE. Когда напряжение на затворе такое же, как и наземное напряжение, транзистор p-типа является "on" и может передавать ток от источника напряжения на выход . Поликремниевые линии, которые не изолированы, создают электрические соединения с транзистором для выходных сигналов и напряжения источника. Транзистор n-типа отличается от p-типа тем, что его диффузия представляет собой материал n-типа за пределами области NWELL. Ток может проходить от выхода к земле, когда напряжение на вратах транзистора n-типа находится на уровне напряжения источника. Над слоем поликремния находится слой изолятора из оксида кремния с вырезанными из него отверстиями, которые заполняются металлом. Эти заполненные металлом отверстия называются сквозняками, и мы будем называть этот слой VIA0 в наших тестовых данных. Поверх VIA0 находится слой металлических полигонов с изолятором оксида кремния между ними. Эти металлические полигоны являются проводами, и мы будем называть их METAL1 в наших тестовых данных. Пин-коды в наших тестах будут на METAL1. В затворе NAND два транзистора n-типа сконфигурированы последовательно, что означает, что выход одного является источником входного напряжения другого. Только если оба транзистора n-типа затвора NAND являются "on", выход будет соединен с землей, что означает логический "ложный". Два транзистора p-типа в затворе NAND сконфигурированы параллельно. Если любой вход в затвор NAND является логическим "ложным", транзистор p-типа, к которому он подключен, будет "on", а выход затвора будет логическим "истинным", потому что транзистор подключит его к источнику напряжения. Диаграмма ниже является примером того, как ворота NAND могут быть выложены и не нарисованы в масштабе для какой-либо реальной технологической технологии. Диффузионный материал предназначен для вырезания под затворным материалом с помощью операции Boolean NOT и представлен в виде твердых стержней под затворами транзисторов только для удобства рисования. Ниже приведен файл компоновки ввода для вышеупомянутой компоновки NAND gate, прямоугольный формат XL XH YL YH: Прямоугольник 0 60 24 48 NWELL Ниже приведен логический схематический файл сетевого списка для вышеуказанной схемы NAND-шлюза: Pin OUTPUT Человек может посмотреть на эту схему и сравнить ее с нарисованной компоновкой ворот NAND выше, чтобы убедиться, что нарисованная компоновка соответствует тому, что схема говорит за несколько секунд. Если вы сделаете это сейчас, вы, вероятно, найдете транзисторы p и n-типа и проследите связь входов и мощности с терминалами транзисторов, а затем с выходом. Поскольку в наши дни на одном чипе порядка миллиарда транзисторов, нам нужно идти намного быстрее, чем люди могут проверить макет и сделать меньше ошибок. Использование операций набора полигонов и извлечение соединения полигонов, обеспечиваемое Boost. Полигон позволит автоматизировать идентификацию транзисторов и отслеживание соединений. Основываясь на этом анализе производительности Boost.Polygon, мы можем ожидать, что эта методология легко масштабируется до миллиона блоков ворот на стандартных рабочих станциях и произвольно больших конструкциях с достаточной системной памятью. Начнем с реализации некоторых структур данных для нашего приложения. struct layout_rectangle { Наш прямоугольник компоновки хорош и минимален, достаточно просто хранить его данные. Определяется в layout_rectangle.hpp. Далее давайте реализуем штифт компоновки аналогичным образом. struct layout_pin { Наш значок компоновки определен в layout_pin.hpp. Теперь давайте определим объект базы данных макета и заполним его из наших парсированных данных макета в layout_database.hpp. typedef std::map Нам не нужно вставлять значки в базу данных макета, потому что она ничего не знает о подключении, только геометрию. Однако нам нужно что-то знать о подключении, чтобы сравнить схему с макетом, поэтому нам нужно определить нашу базу данных подключения и некоторые логические объекты. Сначала мы определяем объект для логического устройства в device.hpp. Поскольку мы ленивы, этот объект выполняет двойную функцию в качестве штифта и обоих типов транзистора. Традиционный объектно-ориентированный дизайн может объявить базовый класс с виртуальным деструктором и вывести из него каждое устройство. Поскольку мы не платим по строке кода, давайте просто сделаем вещи простыми. структурное устройство { Теперь давайте определим объект схематической базы данных в schematic_database.hpp и заполним его из наших парсированных схематических данных. struct schematic_database{ Наша схематическая база данных - это просто вектор устройств, которые связаны с сетями по имени через их терминалы и карта сетевого имени для набора индекса устройства в вектор, который завершает граф, связывая сети со своими устройствами. Учитывая устройства и их терминальные сети, мы легко создаем отображение из сетей в устройства с помощью операции extract_netlist. Теперь мы готовы приступить к работе по извлечению нашего макета в производную схематическую базу данных. Однако сначала нам нужно построить физическую базу данных связи с геометрией в ней, прежде чем мы сможем построить логическую базу данных связи из макета. Мы определяем простую базу данных подключения в connectivity_database.hpp как карту сетевого имени для базы данных геометрии макета, подключенной к этой сети, и заполняем ее базой данных макета и пин-данными. typedef std::map //данная макет_база данных, мы заполняем базу данных связи Эта функция многопользовательской базы данных является нашим первым реальным использованием Boost. Полигон в нашем приложении. Здесь мы делаем булевы (полигональный набор) операции на слоях компоновки, чтобы объединить слои PDIFF и NDIFF и отрезать слой GATE от результата, например. Мы подключаем макет, начиная с штифтов, и прокладываем путь вниз по стеку слоя до уровня транзистора. В равной степени хорошо работать над стеком слоев или соединять вещи в любом порядке, на самом деле, но этот способ создает меньше внутренних временных сетей, которые необходимо объединить, когда соединения между ними будут обнаружены позже. Макет подключения к функции уровня, используемой выше, должен быть реализован, прежде чем мы сможем заполнить нашу базу данных подключения. inline void connect_layout_to_layer(connectivity_database connbsp; &nb ++i) { Компоновка подключения к функции слоя использует функцию извлечения соединения Boost. Полион для построения графа подключения для полигонов на входном наборе полигонов и в базе данных подключения на заданном уровне. Затем он находит полигоны, связанные с существующими сетями, в базе данных подключения через графовый обход и вставляет их в базу данных подключения. Наконец, полигоны, которые не были подключены к существующим сетям, вставляются в базу данных подключения на автоматически генерируемых внутренних сетевых именах. Вставка подключенного компонента в базу данных подключения обрабатывается рекурсивным обходом графа подключения, который мы реализуем далее. inline void populate_connected_component typedef boost::polygon::connectivity_extraction_90 Этот алгоритм слоя экстракта создает граф связи между полигонами во входном наборе полигонов и полигонами в заданном слое базы данных соединений. Он используется для формирования связи между транзисторами и их терминальными сетями в функции извлечения определенного типа транзистора. Острая пустота extract_device_type(std::vector Мы добавляем транзисторы к вектору устройств с их терминалами, заполненными сетевыми именами, извлеченными из базы данных подключения. Терминалы транзисторов соединены через уровни POLY и DIFF, где DIFF содержит как PDIFF, так и NDIFF. Соединение со слоем POLY является затвором транзистора, в то время как соединения с DIFF по обе стороны канала транзистора являются источником и стоком. Мы можем использовать это для извлечения транзисторов p- и n-типа. Процедура извлечения устройств позволяет использовать Boost. Полигоновые булевые операции на данных компоновки, когда мы исключаем материал GATE по NDIFF, который также не по NWELL, чтобы извлечь наши транзисторы n-типа. Мы также используем операцию "взаимодействие" на полигоне, которая реализуется с точки зрения извлечения соединения и сохраняет все полигоны многоугольника, которые касаются или перекрывают многоугольники из другого многоугольника. Теперь, когда у нас есть вектор устройств, мы можем построить схематическую базу данных, назвав функцию extract_netlist. Затем мы можем сравнить извлеченную схему из схемы, прочитанной в файле, с функциями, определенными в compare_schematics.hpp. Поскольку сравнение двух схем не имеет геометрического аспекта, мы не будем вдаваться в эту процедуру здесь, в учебнике, и перейдем к интеграции всех этих процедур, определенных в extract.cpp, чтобы построить макет к схематическому алгоритму сравнения. bool compare_files (std::string layout_file, std::string schematic_file) { int main (int argc, char **argv) { > lvs Это завершает наш учебник о том, как построить простой макет для схематического приложения проверки на основе Boost. Возможности библиотеки полигона. Реализация этого приложения сделала много упрощающих предположений, которые недействительны в реальном мире, и жестко закодировала много вещей, которые необходимо настроить в реальном приложении проверки макета. Тем не менее, это дает представление о том, как использовать Boost. Полигон для решения реальных задач и указывает в направлении того, как реальное приложение может использовать Boost. Полигон.
Статья Polygon Usage раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |