Intermediate Representation » History » Version 4
Sergey Smolov, 10/11/2013 04:54 PM
1 | 1 | Sergey Smolov | h1. Intermediate Representation |
---|---|---|---|
2 | |||
3 | В данном разделе представлена структура внутреннего представления(ВП) HDL-описаний. Построение ВП выполняется на начальном этапе статического анализа HDL-кода. ВП является исходным для извлечения охраняемых действий. |
||
4 | С точки зрения архитектуры ВП состоит из трех подсистем: собственно представления конструкций исходного кода, компонентов связывания с исходным кодом и модели памяти. |
||
5 | |||
6 | h2. Представление исходного кода |
||
7 | |||
8 | Базовым элементом ВП исходного кода является модуль @Module@. Модуль содержит строковое имя и два набора - набор процессов и набор экземпляров модулей. |
||
9 | Процесс @Process@ содержит список чувствительности и соответствующий граф потока управления. Семантика процесса следующая - процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности. Как только такое событие происходит, процесс осуществляет выполнение всех инструкций, которые содержатся в его графе потока управления. |
||
10 | Экземпляр модуля @Instance@ содержит собственно модуль, строковое имя данного экземпляра модуля, а также набор связок. |
||
11 | Связка @Binding@ представляет собой способ передачи экземпляру модуля конкретных выражений вместо определенных переменных модуля. Связка содержит собственно внутреннюю переменную @MVariable@ и сопоставляемое ей выражение(тип выражения @ISyntaxElement@, см. документацию к библиотеке Java Constraint Solver API). |
||
12 | 4 | Sergey Smolov | Переменная @MVariable@ содержит строковое имя, тип (в настоящее время поддерживаются типы integer, real, boolean и битовые векторы) и указатель на её местоположение в памяти @ILocation@. |
13 | Список чувствительности процесса @SensitivityList@ содержит набор событий. |
||
14 | 1 | Sergey Smolov | Событие @Event@ определяется типом и соответствующей переменной с указанным поддиапазоном. |
15 | Тип события @EEventType@ определяет, каким фронтом сигнала данное событие возбуждается. Возможные варианты - передний фронт(POSEDGE), задний фронт(NEGEDGE), либо любой из них(ANYEDGE). |
||
16 | Переменная с указанным поддиапазоном @RangedVariable@ содержит собственно переменную и её поддиапазон. |
||
17 | Семантика поддиапазона @Range@ следующая: событие может происходить не только при изменении значения всего сигнала, но и некоторого его подмассива. Границы этого подмассива и определяются поддиапазоном. Поддиапазон содержит два числа, задающих соответственно левую и правую границы подмассива. |
||
18 | Граф потока управления @ControlFlowGraph@ представляет собой ориентированный граф, вершины которого имеют тип @Node@, а ребра имеют тип @Link@. Если в исходном коде исполнение инструкции A предшествовало ивыполнению инструкции B, и между ними ни одна другая инструкция не выполнялась, то в графе потока управления будет существовать ребро из A в B. |
||
19 | @Node@ - базовый класс для различных узлов. Любой класс данного типа содержит указатель на родительский класс (для корневой вершины он будет равен null), а также класс описания расположения соответствующей инструкции в исходном коде (@CodeLocation@). |
||
20 | Наследниками класса @Node@ являются: |
||
21 | |||
22 | # граф потока управления @ControlFlowGraph@. |
||
23 | # базовый блок @BasicBlock@. Содержит только одну входную и одную выходную дуги. Также содержит набор утверждений @Statement@. Утверждение - это базовый класс, наследником которого является присваивание @Assignment@. Присваивание содержит набор более элементарных объектов @Substitution@. Элементы присваивания содержат переменную с указанным поддиапазоном @RangedVariable@ и присваиваемое ей выражение (@Operation@, см. документацию к библиотеке Java Constraint Solver API). |
||
24 | # условный оператор @Switch@. Содержит только одну входную дугу и, возможно, более чем одну выходную дугу. Также включает в себя набор условий типа @Operation@ (см. документацию к библиотеке Java Constraint Solver API). |
||
25 | # оператор слияния @Merge@. Является обратным к условному оператору. Содержит, возможно, более одной входной дуги и ровно одну выходную дугу. |
||
26 | |||
27 | h2. Подсистема компонентов связывания с исходным кодом |
||
28 | |||
29 | 2 | Sergey Smolov | Описание расположения @CodeLocation@ содержит полное имя @QFileName@ файла, где расположена соответствующая структура исходного кода (инструкция, модуль или что-то иное); также содержит отображение диапазонов номеров строк в сами строки @CodeLineMap@. |
30 | Полное имя @QFileName@ является оберткой вокруг строкового имени, содержащего абсолютный путь к файлу. |
||
31 | Отображение @CodeLineMap@ содержит набор пар вида <диапазон строк @CodeLineRegion@, контейнер соответствующих строк @CodeLineContainer@> |
||
32 | Диапазон строк @CodeLineRegion@ содержит два номера, называемых левым и правым индексами. |
||
33 | Контейнер строк @CodeLineContainer@ содержит набор строк кода. |
||
34 | |||
35 | 1 | Sergey Smolov | h2. Подсистема модели памяти |
36 | 3 | Sergey Smolov | |
37 | Цель создания модели памяти заключается в необходимости имитировать исполнение ВП на конкретных данных (например, для исполнения тестовых последовательностей). Основным компонентом здесь является память @Memory@, которая представляет собой массив ячеек типа @Bit@. Каждая ячейка имеет номер и содержимое. Для заполнения ячеек памятью используется механизм извлечения подмассива ячеек, такой подмассив имеет тип @Location@. Предполагается, что у каждой переменной ВП @MVariable@ имеется свой подмассив ячеек памяти @Location@. |