Программное обеспечение САПР, как и любое другое ПО, предназначено для обработки информации (данных). Данные, с которыми имеет дело любой компонент ПО (подпрограмма, программа, пакет программ), могут быть входные, выходные и промежуточные.
Входные и выходные данные всегда расположены вне тела данного программного компонента [в оперативной (ОП) или внешней (ВП) памяти].
Промежуточные данные могут располагаться либо в области ОП, занимаемой программной единицей, либо вне ее (в том числе и на внешних носителях).
Если какие-либо данные являются одновременно и входными, и выходными, то их называют модифицируемыми данными (рис. 1.1). В общем случае входные данные 1 подготавливаются пользователем или, являются результатом работы раннее выполненных программных единиц. Выходные данные 2 могут предназначаться пользователю или (и) для последующей программной обработки.
Простые типы данных. Структуры данных, обрабатываемых ПО САПР, чрезвычайно разнообразны. Поэтому эффективная
реализация методов и алгоритмов автоматизированного проектирования (АП) требует глубокого знания основных способов представления данных в ЭВМ.
Примечание. Под структурой данных понимают типы и взаимосвязи элементов.
Простыми типами данных, представленными в современных языках программирования, являются: 1) ЦЕЛОЕ, 2) ВЕЩЕСТВЕННОЕ, 3) БУЛЕВО (ЛОГИЧЕСКОЕ), 4) СТРОКА, 5) УКАЗАТЕЛЬ. В большинстве ЭВМ эти типы данных — «встроенные», т. е. имеются машинные команды, непосредственно их обрабатывающие.
Данные типа ЦЕЛОЕ и ВЕЩЕСТВЕННОЕ описывают десятичные числа (как положительные, так и отрицательные) и различаются способом представления в ЭВМ.
Примечание. В большинстве современных ЭВМ операции над данными типа ЦЕЛОЕ выполняются значительно быстрее, чем над данными типа ВЕЩЕСТВЕННОЕ. Особенно существенна разница в быстродействии для тех микро- и мини-ЭВМ, у которых отсутствуют машинные команды арифметики с плавающей точкой.
Диапазоны представления чисел данными этих типов ограничены; кроме того, конечная длина разрядной сетки ЭВМ обусловливает наличие погрешности отображения вещественных чисел. Эти обстоятельства необходимо всегда учитывать при программировании обработки данных вещественного типа с большим разбросом порядков.
Примечание. Неприятности, связанные с ограниченной длиной разрядной сетки ЭВМ, на практике устраняются либо представлением вещественных чисел в особых машинных форматах («удвоенной», «учетверенной» точности), либо специальным построением числовых алгоритмов (примером может служить алгоритм решения системы линейных алгебраических уравнений с выбором «ведущего элемента»).
Данные типа БУЛЕВО (ЛОГИЧЕСКОЕ) предназначены для описания двоичных (булевых) величин. Это могут быть либо одиночные биты (разряды) с возможными значениями «истина» или «ложь», либо цепочки битов. Данные этого типа обычно используются для управления ходом вычислительного процесса в программах и в качестве значений логических выражений флажков условий. В ПО структурного синтеза данными этого типа описываются многие свойства проектируемых объектов. Операции над данными типа БУЛЕВО (И, ИЛИ, НЕ и др.) — наиболее быстрые.
К данным типа СТРОКА относятся любые тексты, составленные из допустимого для данной ЭВМ набора литер. В этот набор обычно входят символы естественных языков, десятичные цифры и ряд специальных символов. Каждая литера данных типа СТРОКА представляется в ЭВМ последовательностью битов, определяемой принятым для данной ЭВМ стандартом. Литеры, составляющие текст, обычно располагаются в смежных участках памяти в прямом порядке. Данные типа СТРОКА могут иметь фиксированную или переменную длину (ограниченную некоторым пределом).
Данные типа УКАЗАТЕЛЬ (ССЫЛКА) предназначены для ссылки на элементы данных в тех случаях, когда невозможно использование имен элементов данных. Физически они представляют собой адрес указываемых данных или содержат информацию, позволяющую этот адрес вычислить. Основное назначение данных типа УКАЗАТЕЛЬ — предоставление программисту на алгоритмических языках высокого уровня средств для создания сложных структур данных.
Основные структуры данных. Вструктурах данных находят свое отражение отношения, связывающие между собой отдельные элементы данных, обрабатываемых каким-либо программным компонентом. Рассмотрим основные структуры данных (константа, переменная, массив, запись, таблица, фрейм, стек, очередь, список, дерево).
Элементарными (вырожденными) структурами данных являются константа и переменная.
Константа характеризуется фиксированными именем, типом и значением.
Переменная имеет фиксированные имя и тип, но переменное значение.
Массив — конечное множество переменных единого фиксированного типа, объединенных единым фиксированным именем. Ссылка на отдельные переменные массива осуществляется посредством имени массива и одного или нескольких индексов. Важное свойство массивов — возможность прямого доступа к его элементам, обеспечивающая высокую скорость обработки. Эта структура находит широкое применение, например, в ПО подсистем машинной графики и диалогового взаимодействия человека и ЭВМ.
Примечание. Одно- и двумерные массивы позволяют непосредственно отобразить в ЭВМ вектора и матрицы. Однако представление больших разреженных матриц в виде двумерных массивов влечет
за собой неоправданные потери памяти и машинного времени из-за необходимости хранения и обработки большого количества нулевых элементов. Поэтому для представления разреженных матриц в ЭВМ необходимо использовать иные структуры данных.
Требование обязательной однородности всех элементов массива (т. е. одинаковости типа всех переменных, составляющих массив) часто неудобно для представления данных, обрабатываемых ПО САПР.
Запись — структура данных, позволяющая группировать данные различных типов. Запись состоит из ряда поименованных полей, каждое поле определяется как переменная, массив или запись более низкого уровня иерархии, обладающая своими полями.
Пример записи. Одной из основных конструкций входного языка ПО схемотехнического проектирования является описание элемента эквивалентной схемы. Такая конструкция может иметь следующий вид [1]: С15 (6, 8) = 1. 5 МКФ,
С — имя элемента (емкость), 15 — его номер, 6 и 8—номера узлов подключения, 1.5 — параметр элемента; символы МКФ указывают единицу измерения параметра.
Для внутреннего представления этой информации, содержащей данные различных типов, наиболее удобной структурой является запись. Для нашего примера используя нотацию, близкую к нотации языка ПЛ/1, запись можно определить следующим образом:
1 элемент — схемы
2 идентификатор
3 имя СТРОКА (3)
3 номер ЦЕЛОЕ
2 узлы
3 нач — узел ЦЕЛОЕ
3 кон—узел ЦЕЛОЕ
2 параметр
3 значение ВЕЩЕСТВЕННОЕ
3 размерность СТРОКА (3)
Доступ к информации, содержащейся в записи, осуществляется с помощью составных имен. Так, составное имя «элемент — схемы, идентификатор» позволяет ссылаться на запись, состоящую из полей имени и номера элемента. Имя «элемент — схемы, параметр, значение» идентифицирует переменную типа ВЕЩЕСТВЕННОЕ. На рис. 1.2 показано размещение записи в памяти ЭВМ. (она занимает там сплошной участок).
Т а б л и ц а — объединение структур данных типа запись. Таблица аналогична двумерному массиву, но ее столбцы могут иметь различные типы.
Фрейм — структура данных для представления знаний в конкретных предметных областях. Подобно записи, фрейм состоит из отдельных полей (ячеек), заполненных содержа тельными понятиями предметной области. Поля фрейма связаны между собой отношениями, реализованными обычно в виде отдельных процедур.
Пример фрейма. Для представления знаний о витой пружине в САПР машиностроения может использоваться фрейм ПРУЖИНА. Поля этого фрейма — диаметр и шаг намотки пружины, диаметр проволоки, количество витков, свойства материала проволоки и др. Отношениями в этом фрейме будут уравнения, составляющие математическую модель пружины. Фреймы ПРУЖИНА, ШТОК, РЫЧАГ и др., объединенные в сеть, составляют модель предметной области САПР машиностроения.
В теории программирования фрейм называют абстрактным типом данных.
Все рассмотренные выше структуры данных характеризуются сплошным расположением в памяти ЭВМ. Это часто неудобно из-за необходимости заранее фиксировать размер области оперативной памяти, отводимой под размещение этих структур. В большинстве случаев этот , размер априорно неизвестен и определяется только в процессе выполнения программ. Поэтому более универсальны структуры данных, ориентированные на цепное представление в памяти ЭВМ. К ним относятся стек, очередь, линейный список, дерево и др. Объединение записей в эти структуры осуществляется с помощью переменных типа УКАЗАТЕЛЬ, размещаемых в полях записей.
Стек характеризуется последовательной организацией и возможностью доступа только с одного края цепочки записей, называемого вершиной стека. Возможная физическая реализация стека в памяти ЭВМ показана на рис. 1.3, а. В нижнем поле каждой записи располагается указатель на следующую запись стека, указатель
Рис. 1.3
в последней записи пуст. Основными операциями над стеком являются ЧИТАТЬ ВЕРШИНУ, ДОБАВИТЬ (рис. 1.3,6) и УДАЛИТЬ (рис. 1.3, в). В стеке реализуется принцип обработки «последним пришел — первым ушел». Наиболее широко в ПО САПР стековая организация данных используется при трансляции входных языков и при управлении ОП.
Очередь — линейная последовательность записей, связанных указателями, но доступ к ее записям осуществляется с начала и конца (рис. 1.4, а). Добавлять записи можно только в конец очереди (рис. 1,4,6), а читать и удалять записи — только с начала очереди (удаляют самую старую запись) (рис. 1.4,в). Обработка данных
Рис. 1.4. Представление очереди (а) и операции над очередью ДОБАВИТЬ (б) и УДАЛИТЬ (в)
в очереди строится по принципу «первым пришел — первым ушел». Эта структура часто используется для обмена данными между программными компонентами процессоров входных языков САПР. Объединение отдельных записей в очередь — это один из самых распространенных способов организации данных во внешней памяти ЭВМ.
Линейный список — наиболее универсальная структура данных, в нем доступна для чтения и удаления любая запись, более того, новая запись может быть включена между двумя любыми соседними записями списка. На рис. 1.5, а показана физическая реализация двунаправленного линейного списка. Встречное направление указателей позволяет осуществить в таком списке поиск записей с обеих сторон.
Во многих алгоритмах САПР требуется упорядочение записей по какому-либо параметру. Линейный список дает возможность реализовывать алгоритмы сортировки (упорядочения) без физического перемещения записей в ОП только путем соответствующей корректировки указателей. В этой структуре легко осуществляются операции удаления и включения новых записей без нарушения упорядоченности списка (рис. 1.5,6, в). В отдельных приложениях для повышения скорости обработки необходимо упорядочение записей более чем по одному параметру (в этом случае возможно, не перемещая и не дублируя записи, организовать еще несколько списков, добавляя в записи новые поля с соответствующими указателями) .