Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Polygon Usage

Boost , ,

Layout Versus Schematic Tutorial

В этом руководстве мы реализуем приложение проверки макета игрушки VLSI.   В VLSI CAD важным этапом проектирования является проверка выписки, которая проверяет, что физическая планировка, нарисованная дизайнерами масок и автоматизированными инструментами, реализует логическую схему, указанную инженерами-конструкторами.   Физическая компоновка моделируется как полигоны на слоях, которые используются для печати компоновки на кремниевой пластине во время производства.   Гораздо лучше найти ошибки в физическом дизайне, прежде чем тратить миллионы долларов на подготовку литографических масок и запускать много тестовых пластин.

Реальные форматы файлов компоновки являются двоичными и часто сжимаются и представляют собой сложенную иерархическую модель компоновки, где группа полигонов может быть сгруппирована в ячейку и инстанцирована как группа в другие ячейки.   Для этого учебника мы предполагаем упрощенный формат файла макета ascii без иерархии дизайна, который мы назвали бы "flat" на жаргоне VLSI.   Точно так же мы предполагаем плоский, асциевый логический схематический формат файла сетки.   Сеть — это электрическое соединение в схеме.   Целью учебного пособия по проверке макета является разбор этих двух форматов файлов, применение операций геометрии, предоставляемых Boost. Полигон на данных компоновки для создания логической схемы, которая представляет то, что реализовано в физической компоновке, а затем сравнивает схему ввода с сгенерированной схемой, чтобы определить, являются ли они одинаковыми.

Во-первых, давайте определим некоторые объекты, которые нам понадобятся в дизайне нашего приложения для проверки макета игрушек:

Прямоугольник: Ось-параллельный прямоугольник со слоем, связанным
Пин Лэйаут: Ось-параллельный прямоугольник со слоем и сеткой (электрический сигнал) имя, связанное
База данных Layout: Ассоциативный контейнер имени слоя для набора полигонов
База данных Connectivity: Ассоциативный контейнер сетевого имени для макета базы данных
Физическое устройство: определенное геометрическое расположение на нескольких слоях с одной или более входной сетью и одной выходной сетью
Логическая сеть: названный графовый узел
Логическое устройство: неназванный графовый узел с типом устройства
Логический пин: Специальная сеть, которая определяет вход или выход для схемы
Схематическая база данных: Граф, состоящий из сетей и логических устройств

Далее давайте определим последовательность операций, выполняемых нашим макетом игрушек, по сравнению со схематическим приложением:

Parse Layout: прямоугольники и многоугольники компоновки потока в базу данных компоновки и штифты компоновки потока в базу данных подключения
Экстрактная связь: Добавление многоугольников из базы данных макета в базу данных подключения посредством физического прикосновения или перекрытия
Экстрактные устройства: Заполните схематическую базу данных логическими устройствами на основе физических устройств, идентифицированных в геометрии компоновки, и извлеките их терминалы из базы данных подключения
Extract Net List: полный граф, представленный в схематической базе данных, полученной из макета
Схема парса: Поток логических сетей, устройств и контактов в схематическую базу данных
Сравните схемы: Оценить, эквивалентна ли извлеченная схематическая база данных входной схематической базе данных и выходному результату

Для тестирования нашего приложения мы будем извлекать отдельные логические вентили. Логический вентиль — это несколько транзисторов, которые работают вместе для выполнения определенной логической функции. Логические функции включают в себя обычно понимаемые логические операции 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
Прямоугольник 3 57 32 43 PDIFF
Прямоугольник 3 57 5 5 16 NDIFF
Прямоугольник 5 7 0 17 17 POLY
Прямоугольник 29 31 31 31 48 POLY
Прямоугольник 17 19 19 4 4 17 GATE
Прямоугольник 41 19 43 4 17 GATE
Прямоугольник 41 7 0 2 2 VIA0
Прямоугольник 5 7 0 2 2 VIA0
Прямоугольник 5 7 0 23 28 30 VIA0
Прямоугольник 5 31 23 28 30 VIA0
Прямоугольник 53 31 23 18 20 VIA0
Прямоугольник 53 60 0 2 METAL1
Прямоугольник 0 60 0 28 30 METAL1
Пин 29 31 23 25 METAL1 INPUT1

Пин 29 31 46 48 METAL1 VDD
Пин 29 31 18 20 METAL1 INPUT2 Пин 29 31 18

Ниже приведен логический схематический файл сетевого списка для вышеуказанной схемы NAND-шлюза:

Pin OUTPUT
Pin INPUT1
Pin INPUT2
Pin VDD
Pin GND
PTRANS VDD INPUT1 OUTPUT
Устройство PTRANS VDD INPUT2 OUTPUT
Устройство NTRANS GND INPUT1 NET1
Устройство NTRANS NET1 INPUT2 OUTPUT

Человек может посмотреть на эту схему и сравнить ее с нарисованной компоновкой ворот NAND выше, чтобы убедиться, что нарисованная компоновка соответствует тому, что схема говорит за несколько секунд.   Если вы сделаете это сейчас, вы, вероятно, найдете транзисторы p и n-типа и проследите связь входов и мощности с терминалами транзисторов, а затем с выходом.   Поскольку в наши дни на одном чипе порядка миллиарда транзисторов, нам нужно идти намного быстрее, чем люди могут проверить макет и сделать меньше ошибок.   Использование операций набора полигонов и извлечение соединения полигонов, обеспечиваемое Boost. Полигон позволит автоматизировать идентификацию транзисторов и отслеживание соединений. Основываясь на этом анализе производительности Boost.Polygon, мы можем ожидать, что эта методология легко масштабируется до миллиона блоков ворот на стандартных рабочих станциях и произвольно больших конструкциях с достаточной системной памятью. Начнем с реализации некоторых структур данных для нашего приложения.

struct layout_rectangle {
  int xl, yl, xh, yh;
  std::string layer;
};

Наш прямоугольник компоновки хорош и минимален, достаточно просто хранить его данные.   Определяется в layout_rectangle.hpp. Далее давайте реализуем штифт компоновки аналогичным образом.

struct layout_pin {
  int xl, yl, xh, yh;
  std::string layer;
  std::string net;
};

Наш значок компоновки определен в layout_pin.hpp.  Теперь давайте определим объект базы данных макета и заполним его из наших парсированных данных макета в layout_database.hpp.

typedef std::map > layout_database

//map the layout rectangle data type to the boost::polygon::rectangle_concept
  template < rectangle>
    interal_type;
    интервал_type;
    Rectangle& Rectangle&              Rectangle.xl;   yh;
 

Геометрия_concept { typedef rectangle_concept type; };

//вставьте прямоугольники макета в базу данных макета
inline void popul_layout_database(layout_database& layout, std::vector& rects) {
  for(std::size_t i = 0; i < rects.size(); ++i) {
    layout[rects[i].layer].insert(rects[i]);
  }
}

Нам не нужно вставлять значки в базу данных макета, потому что она ничего не знает о подключении, только геометрию.   Однако нам нужно что-то знать о подключении, чтобы сравнить схему с макетом, поэтому нам нужно определить нашу базу данных подключения и некоторые логические объекты.   Сначала мы определяем объект для логического устройства в device.hpp.  Поскольку мы ленивы, этот объект выполняет двойную функцию в качестве штифта и обоих типов транзистора.   Традиционный объектно-ориентированный дизайн может объявить базовый класс с виртуальным деструктором и вывести из него каждое устройство.   Поскольку мы не платим по строке кода, давайте просто сделаем вещи простыми.

структурное устройство {
  std::string type;
  std::vector terminals;
};

Теперь давайте определим объект схематической базы данных в schematic_database.hpp и заполним его из наших парсированных схематических данных.

struct schematic_database{
  std::vector devices;
  std::map > nets;

//given a vector of devices popul the map of devices index
inline void extract_netlist (std::map >>>>>>>>>>>                        std::vect ++i) {
     for(std::size_t j = 0; j <устройства[i].terminals.size(); ++j) {
        //создать ассоциацию между сетевым именем и устройством id
         .insert(nets[devices[i].terminals[i].terminals[j].end(), i);
    }
  

Наша схематическая база данных - это просто вектор устройств, которые связаны с сетями по имени через их терминалы и карта сетевого имени для набора индекса устройства в вектор, который завершает граф, связывая сети со своими устройствами.   Учитывая устройства и их терминальные сети, мы легко создаем отображение из сетей в устройства с помощью операции extract_netlist.   Теперь мы готовы приступить к работе по извлечению нашего макета в производную схематическую базу данных.   Однако сначала нам нужно построить физическую базу данных связи с геометрией в ней, прежде чем мы сможем построить логическую базу данных связи из макета.   Мы определяем простую базу данных подключения в connectivity_database.hpp как карту сетевого имени для базы данных геометрии макета, подключенной к этой сети, и заполняем ее базой данных макета и пин-данными.

typedef std::map connectivity_database;

//map layout pin data type to boost::polygon::rectangle_concept
  template < pin> struct rectangle_traits< _pin> typedef int_type;
   интервал_type;
   интервал_type;
     static inline interval_type get(const layout_pin& pin, orientation_2d orient)
                

//данная макет_база данных, мы заполняем базу данных связи
inline void population_connectivity_database(connectivity_database&connectivity,
                        std::vector&; pins, layout_database& layout::polygon;
  using namespace boost::polygon::operators;
  for(std::size_t i = 0; i < ++i) {
   Connection [pins[i].net][pins[i];
 int internal_net_suffix = 0;
 insp;nbsp_to_layer;;   //connect metal1;
                                  //Обратите внимание, что я составил название слоя DIFF для комбинированных P и NDIFF
 connectout_to_layer; "connectivity, diff_not_gate, "DIFF"                                          //любым многоугольникам, не связанным с штифтами, присваиваются внутренние сетевые имена
}

Эта функция многопользовательской базы данных является нашим первым реальным использованием Boost. Полигон в нашем приложении.   Здесь мы делаем булевы (полигональный набор) операции на слоях компоновки, чтобы объединить слои PDIFF и NDIFF и отрезать слой GATE от результата, например.   Мы подключаем макет, начиная с штифтов, и прокладываем путь вниз по стеку слоя до уровня транзистора.   В равной степени хорошо работать над стеком слоев или соединять вещи в любом порядке, на самом деле, но этот способ создает меньше внутренних временных сетей, которые необходимо объединить, когда соединения между ними будут обнаружены позже.   Макет подключения к функции уровня, используемой выше, должен быть реализован, прежде чем мы сможем заполнить нашу базу данных подключения.

inline void connect_layout_to_layer(connectivity_database connbsp;                                            &nb ++i) {
    ce.insert [i];
  }
 std::vector > graph(), std::set());
  ce.extract(graph);
  std::vector: polygon_color() + net_ids.size(), 0);
  // для каждой сети в net_ids заселить подключенный компонент с net
 =0; node_id< net_ids.size(); ++node_id; population_connected_component(connectivity, polygons, polygon_color, node_id,
    polygon_id_offset, net_ids[node_id], net_ids,
    net_prefix, layout_layer;
  }
  // для каждого полигона_color, который имеет нулевую заселённость, соединённый компонент с net_prefix + net_suffix++
  for(std::size_t i = 0; i < polygons.size(); ++i) {
    if(polygon_color[i + polygon_id_offset] == 0) {
      std::stringstream::in | std::stringstream::out;
           
     ss >> internal_net;
           population_connected_component(connectivity, polygons, polygon_color,graph,
       i + polygon_id_offset,
       полигон_id_offset, internal_net, net_ids,
      net_prefix, layout_layer;
    }
}

Компоновка подключения к функции слоя использует функцию извлечения соединения Boost. Полион для построения графа подключения для полигонов на входном наборе полигонов и в базе данных подключения на заданном уровне.   Затем он находит полигоны, связанные с существующими сетями, в базе данных подключения через графовый обход и вставляет их в базу данных подключения.   Наконец, полигоны, которые не были подключены к существующим сетям, вставляются в базу данных подключения на автоматически генерируемых внутренних сетевых именах.   Вставка подключенного компонента в базу данных подключения обрабатывается рекурсивным обходом графа подключения, который мы реализуем далее.

inline void populate_connected_component
(connectivity_database&connection, std::vector& polygons,
 std::vector polygon_color, std::vector >&graph,
 std::size_t polygon_id_offset, std::string>std::vector>& net_ids, std::string net_prefix,
   layout_layer) {
    Return;
  polygon_color[node_id] = 1;
 _id_offset && net_ids[node_id]!= net) {
     //merge nets in connectivity database
   std::string net2 = net;
    If(net.compare(0, net_pre 0) {
            std:
                                    &nb   Теперь, когда у нас есть наша база данных подключения, извлеченная из штифтов до транзисторов, нам нужно извлечь наши транзисторы и установить связь между транзисторными терминалами и сетями в нашей базе данных подключения.   Для начала рассмотрим транзисторы с функциями, определенными в extract_devices.hpp.

typedef boost::polygon::connectivity_extraction_90 connectivity_extraction;
inline std::vector > ce, std::vector_extraction& net_ids,
            database                     &nb ++i) {
    ce.insert(polygons[i]);
  }
  std::vector > graph(polygons.size() + net_ids.size(), std::set());
  returngraph;
}

Этот алгоритм слоя экстракта создает граф связи между полигонами во входном наборе полигонов и полигонами в заданном слое базы данных соединений.   Он используется для формирования связи между транзисторами и их терминальными сетями в функции извлечения определенного типа транзистора.

Острая пустота extract_device_type(std::vectorустройства, connectivity_device                                            &nb ++i) {
    tmp_devices[i - net_ids_diff.size()].type = type;
     tmp_devices[i - net_ids_diff.size()].terminals = std::vector(3, std::string());
        Itr!= graph_diff[i].end(); ++j) {
           tmp_devices[i] - net_ids_diff.size()].terminals[0] = net_ids_diff[*itr];
        tmp_devices[i] - net_ids_diff.size()].terminals[2] = net_ids_diff[*itr];
              tmp_devices[i] - net_ids_diff.size()].terminals = std::vector(3, std::string());
               }
        Itr!= graph_poly[i].end();++itr, ++j) {
           tmp_devices[i] - net_ids_diff.size()].terminals[1] = net_ids_poly[*itr];
             tmp_devices[i] - net_ids_poly.size()]. Терминалы = std::vector(3, std::string());
       }
  }

  devices.insert(devices.end(), tmp_devices.begin(), tmp_devices.end());
}

Мы добавляем транзисторы к вектору устройств с их терминалами, заполненными сетевыми именами, извлеченными из базы данных подключения. Терминалы транзисторов соединены через уровни POLY и DIFF, где DIFF содержит как PDIFF, так и NDIFF.   Соединение со слоем POLY является затвором транзистора, в то время как соединения с DIFF по обе стороны канала транзистора являются источником и стоком.   Мы можем использовать это для извлечения транзисторов p- и n-типа.

//заселяет вектор устройств на основе данных подключения и компоновки
inline void extract_devices (std::vector устройства, connectivity_database&connection,
                    nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;      nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp

Процедура извлечения устройств позволяет использовать Boost. Полигоновые булевые операции на данных компоновки, когда мы исключаем материал GATE по NDIFF, который также не по NWELL, чтобы извлечь наши транзисторы n-типа.   Мы также используем операцию "взаимодействие" на полигоне, которая реализуется с точки зрения извлечения соединения и сохраняет все полигоны многоугольника, которые касаются или перекрывают многоугольники из другого многоугольника. Теперь, когда у нас есть вектор устройств, мы можем построить схематическую базу данных, назвав функцию extract_netlist.   Затем мы можем сравнить извлеченную схему из схемы, прочитанной в файле, с функциями, определенными в compare_schematics.hpp.  Поскольку сравнение двух схем не имеет геометрического аспекта, мы не будем вдаваться в эту процедуру здесь, в учебнике, и перейдем к интеграции всех этих процедур, определенных в extract.cpp, чтобы построить макет к схематическому алгоритму сравнения.

bool compare_files (std::string layout_file, std::string schematic_file) {
  sin(schematic_file.c_str());
  std:

  std::vector rects;
  parse_layout(rects, pins,lin);

 schematic_database reference_schematic;
  parse_schematic_database(reference_schematic, sin);

  layout_database layout;

  connectivity_database connectivity;
  populate_connectivity_database(connectivity, pins, layout);

  schematic_database schematic;
  std::vector&устройства = schematic.devices;
  for(std::size_t i = 0; i < pins.size(); ++i) {
    devices.push_back(device());
    devices.back().type = "PIN";
 push_back(pins[i].net);
  extract_devices(devices, connectivity, layout);
  extract_netlist(schematic.nets, devices);
  return compare_schematic(reference_schematic, schematic);

int main (int argc, char **argv) {
      std:
      использование: " < << argv[0] < " "   bool result = Compar_files(argv[1], argv[2]);
    std::"     возвращение 1;       ;
  возвращение 0;

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

> lvs
использование: lvs
> lvs nand.layout nand.chematic
Макет соответствует схематическому.
> lvs nand_short.layout nand.schematic
Планировка не соответствует схематическому.
> lvs nand.layout or.schematic
Планировка не соответствует схематическому.
> lvs nor.layout nor.schematic
Макет соответствует схематическому.
> lvs nor.layout nand.schematic
Планировка не соответствует схематике.

Это завершает наш учебник о том, как построить простой макет для схематического приложения проверки на основе Boost. Возможности библиотеки полигона.   Реализация этого приложения сделала много упрощающих предположений, которые недействительны в реальном мире, и жестко закодировала много вещей, которые необходимо настроить в реальном приложении проверки макета.   Тем не менее, это дает представление о том, как использовать Boost. Полигон для решения реальных задач и указывает в направлении того, как реальное приложение может использовать Boost. Полигон.

Copyright: Авторское право © Intel Corporation 2008-2010.
License: Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

Статья Polygon Usage раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 09:53:12/0.034927129745483/1