Project

General

Profile

Actions

Intermediate Representation » History » Revision 6

« Previous | Revision 6/11 (diff) | Next »
Sergey Smolov, 10/22/2013 03:37 PM


Intermediate Representation

В данном разделе представлена структура внутреннего представления(ВП) HDL-описаний.
Построение ВП выполняется на начальном этапе статического анализа HDL-кода.
ВП является исходным для извлечения охраняемых действий.
С точки зрения архитектуры ВП состоит из трех подсистем:
собственно представления конструкций исходного кода, компонентов связывания с исходным кодом и модели памяти.

Представление исходного кода

Базовым элементом ВП исходного кода является модуль Module.
Модуль содержит строковое имя и два набора - набор процессов и набор экземпляров модулей.

Процесс Process содержит список чувствительности и соответствующий граф потока управления.
Семантика процесса следующая - процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности.
Как только такое событие происходит, процесс осуществляет выполнение всех инструкций, которые содержатся в его графе потока управления.
На множестве процессов задается отношение частичного порядка вида "happens before".
Это отношение задает порядок выполнения разных процессов при возникновении общего события в их списках чувствительности.
Отношение задется только в том случае, когда процессы (теоретически) имеют зависимость по данным.
В текущей версии ВП данное отношение реализовано как множества ссылок на входящие и исходящие зависимости для каждого модуля.

Экземпляр модуля Instance содержит собственно модуль, строковое имя данного экземпляра модуля, а также набор связок.

Связка Binding представляет собой способ передачи экземпляру модуля конкретных выражений вместо определенных переменных модуля.
Связка содержит собственно внутреннюю переменную MVariable и сопоставляемое ей выражение(тип выражения ISyntaxElement, см. документацию к библиотеке Java Constraint Solver API).

Переменная MVariable содержит строковое имя, тип (в настоящее время поддерживаются типы integer, real, boolean и битовые векторы) и указатель на её местоположение в памяти ILocation.

Список чувствительности процесса SensitivityList содержит набор событий.
Событие Event определяется типом и соответствующей переменной с указанным поддиапазоном.
Тип события EEventType определяет, каким фронтом сигнала данное событие инициируется.
Возможные варианты - передний фронт(POSEDGE), задний фронт(NEGEDGE), либо оба одновременно(ANYEDGE).

Переменная с указанным поддиапазоном RangedVariable содержит собственно переменную и её поддиапазон.
Семантика поддиапазона Range следующая: событие может происходить не только при изменении значения всего сигнала, но и некоторого его подмассива.
Границы этого подмассива и определяются поддиапазоном.
Поддиапазон содержит два числа, задающих соответственно левую и правую границы подмассива.

Граф потока управления ControlFlowGraph представляет собой ориентированный граф, вершины которого имеют тип Node, а ребра имеют тип Link.
Если в исходном коде исполнение инструкции A предшествовало исполнению инструкции B,
и между ними ни одна другая инструкция не выполнялась, то в графе потока управления будет существовать ребро из A в B.

Node - базовый класс для различных узлов.
Любой класс данного типа содержит указатель на родительский класс (для корневой вершины он будет равен null),
а также класс описания расположения соответствующей инструкции в исходном коде (CodeLocation).

Наследниками класса Node являются:

  1. граф потока управления ControlFlowGraph.
  1. базовый блок BasicBlock.
    Содержит только одну входную и одную выходную дуги.
    Также содержит набор утверждений Statement.
    Утверждение - это базовый класс, наследником которого является присваивание Assignment.
    Присваивание содержит набор более элементарных объектов Substitution.
    Элементы присваивания содержат переменную с указанным поддиапазоном RangedVariable
    и присваиваемое ей выражение (Operation, см. документацию к библиотеке Java Constraint Solver API).
  1. условный оператор Switch.
    Содержит только одну входную дугу и, возможно, более чем одну выходную дугу.
    Также включает в себя набор условий типа Operation (см. документацию к библиотеке Java Constraint Solver API).
  1. оператор слияния Merge.
    Является обратным к условному оператору.
    Содержит, возможно, более одной входной дуги и ровно одну выходную дугу.

Подсистема компонентов связывания с исходным кодом

Описание расположения CodeLocation содержит полное имя QFileName файла,
где расположена соответствующая структура исходного кода (инструкция, модуль или что-то иное);
также содержит отображение диапазонов номеров строк в сами строки CodeLineMap.

Полное имя QFileName является оберткой вокруг строкового имени, содержащего абсолютный путь к файлу.

Отображение CodeLineMap содержит набор пар вида <диапазон строк CodeLineRegion, контейнер соответствующих строк CodeLineContainer.

Диапазон строк CodeLineRegion содержит два номера, называемых левым и правым индексами.

Контейнер строк CodeLineContainer содержит набор строк кода.

Подсистема модели памяти

Цель создания модели памяти заключается в необходимости имитировать исполнение ВП на конкретных данных (например, для исполнения тестовых последовательностей). Основным компонентом здесь является память Memory, которая представляет собой массив ячеек типа Bit. Каждая ячейка имеет номер и содержимое. Для заполнения ячеек памятью используется механизм извлечения подмассива ячеек, такой подмассив имеет тип Location. Предполагается, что у каждой переменной ВП MVariable имеется свой подмассив ячеек памяти Location.

Updated by Sergey Smolov about 11 years ago · 11 revisions