Project

General

Profile

Actions

Intermediate Representation » History » Revision 3

« Previous | Revision 3/11 (diff) | Next »
Sergey Smolov, 09/12/2013 03:34 PM


Intermediate Representation

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

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

Базовым элементом ВП исходного кода является модуль Module. Модуль содержит строковое имя и два набора - набор процессов и набор экземпляров модулей.
Процесс Process содержит список чувствительности и соответствующий граф потока управления. Семантика процесса следующая - процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности. Как только такое событие происходит, процесс осуществляет выполнение всех инструкций, которые содержатся в его графе потока управления.
Экземпляр модуля 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.
  2. базовый блок BasicBlock. Содержит только одну входную и одную выходную дуги. Также содержит набор утверждений Statement. Утверждение - это базовый класс, наследником которого является присваивание Assignment. Присваивание содержит набор более элементарных объектов Substitution. Элементы присваивания содержат переменную с указанным поддиапазоном RangedVariable и присваиваемое ей выражение (Operation, см. документацию к библиотеке Java Constraint Solver API).
  3. условный оператор Switch. Содержит только одну входную дугу и, возможно, более чем одну выходную дугу. Также включает в себя набор условий типа Operation (см. документацию к библиотеке Java Constraint Solver API).
  4. оператор слияния 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