Intermediate Representation » History » Revision 9
« Previous |
Revision 9/11
(diff)
| Next »
Sergey Smolov, 10/23/2013 11:47 AM
Intermediate Representation¶
В данном разделе представлена структура внутреннего представления(ВП) HDL-описаний.
Построение ВП выполняется на начальном этапе статического анализа HDL-кода.
ВП является исходным для извлечения охраняемых действий.
С точки зрения архитектуры ВП состоит из трех подсистем:
собственно представления конструкций исходного кода, компонентов связывания с исходным кодом и модели памяти.
Представление исходного кода¶
Базовым элементом ВП исходного кода является модуль Module
.
Модуль содержит строковое имя и два набора - набор процессов и набор экземпляров модулей.
Процесс Process
содержит список чувствительности и соответствующий граф потока управления.
Семантика процесса следующая - процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности.
Как только такое событие происходит, процесс осуществляет выполнение всех инструкций, которые содержатся в его графе потока управления.
На множестве процессов задается отношение частичного порядка вида "happens before".
Это отношение задает порядок выполнения разных процессов при возникновении общего события в их списках чувствительности.
Отношение задается только в том случае, когда процессы (теоретически) имеют зависимость по данным.
В текущей версии ВП данное отношение реализовано как множества ссылок на входящие и исходящие зависимости для каждого модуля.
Экземпляр модуля Instance
содержит собственно модуль, строковое имя данного экземпляра модуля, а также набор связок.
Связка Binding
представляет собой способ передачи экземпляру модуля конкретных выражений вместо определенных переменных модуля.
Связка содержит собственно внутреннюю переменную MVariable
и сопоставляемое ей выражение(тип выражения ISyntaxElement
, см. документацию к библиотеке Java Constraint Solver API).
Переменная MVariable
содержит строковое имя, тип (в настоящее время поддерживаются типы integer, real, boolean и битовые векторы) и указатель на её местоположение в памяти ILocation
.
Список чувствительности процесса SensitivityList
содержит набор событий.
Событие Event
определяется типом и соответствующей переменной с указанным поддиапазоном.
Тип события EEventType
определяет, каким фронтом сигнала данное событие инициируется.
Возможные варианты - передний фронт(POSITIVE_EDGE), задний фронт(NEGATIVE_EDGE), либо оба одновременно(BOTH_EDGE).
Переменная с указанным поддиапазоном RangedVariable
содержит собственно переменную и её поддиапазон.
Семантика поддиапазона Range
следующая: событие может происходить не только при изменении значения всего сигнала, но и некоторого его подмассива.
Границы этого подмассива и определяются поддиапазоном.
Поддиапазон содержит два числа, задающих соответственно левую и правую границы подмассива.
Граф потока управления ControlFlowGraph
представляет собой ориентированный граф, вершины которого имеют тип Node
, а ребра имеют тип Link
.
Если в исходном коде исполнение инструкции A предшествовало исполнению инструкции B,
и между ними ни одна другая инструкция не выполнялась, то в графе потока управления будет существовать ребро из A в B.
Node
- базовый класс для различных узлов.
Любой класс данного типа содержит указатель на родительский класс (для корневой вершины он будет равен null),
а также класс описания расположения соответствующей инструкции в исходном коде (CodeLocation
).
Наследниками класса Node
являются:
- граф потока управления
ControlFlowGraph
.
- базовый блок
BasicBlock
.
Содержит только одну входную и одную выходную дуги.
Также содержит набор утвержденийStatement
.
Утверждение - это базовый класс, наследником которого является присваиваниеAssignment
.
Присваивание содержит набор более элементарных объектовSubstitution
.
Элементы присваивания содержат переменную с указанным поддиапазономRangedVariable
и присваиваемое ей выражение (Operation
, см. документацию к библиотеке Java Constraint Solver API).
- условный оператор
Switch
.
Содержит только одну входную дугу и, возможно, более чем одну выходную дугу.
Также включает в себя набор условий типаOperation
(см. документацию к библиотеке Java Constraint Solver API).
- оператор слияния
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