Project

General

Profile

Intermediate Representation » History » Version 10

Sergey Smolov, 10/23/2013 11:48 AM

1 1 Sergey Smolov
h1. Intermediate Representation
2
3 6 Sergey Smolov
В данном разделе представлена структура внутреннего представления(ВП) HDL-описаний. 
4
Построение ВП выполняется на начальном этапе статического анализа HDL-кода. 
5
ВП является исходным для извлечения охраняемых действий.
6
С точки зрения архитектуры ВП состоит из трех подсистем:
7
 собственно представления конструкций исходного кода, компонентов связывания с исходным кодом и модели памяти.
8 1 Sergey Smolov
9
h2. Представление исходного кода
10
11 6 Sergey Smolov
Базовым элементом ВП исходного кода является модуль @Module@. 
12
Модуль содержит строковое имя и два набора - набор процессов и набор экземпляров модулей.
13
14
Процесс @Process@ содержит список чувствительности и соответствующий граф потока управления. 
15
Семантика процесса следующая - процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности. 
16
Как только такое событие происходит, процесс осуществляет выполнение всех инструкций, которые содержатся в его графе потока управления.
17
На множестве процессов задается отношение частичного порядка вида "happens before". 
18
Это отношение задает порядок выполнения разных процессов при возникновении общего события в их списках чувствительности. 
19 8 Sergey Smolov
Отношение задается только в том случае, когда процессы (теоретически) имеют зависимость по данным.
20 6 Sergey Smolov
В текущей версии ВП данное отношение реализовано как множества ссылок на входящие и исходящие зависимости для каждого модуля.
21
22 1 Sergey Smolov
Экземпляр модуля @Instance@ содержит собственно модуль, строковое имя данного экземпляра модуля, а также набор связок.
23 6 Sergey Smolov
24
Связка @Binding@ представляет собой способ передачи экземпляру модуля конкретных выражений вместо определенных переменных модуля. 
25
Связка содержит собственно внутреннюю переменную @MVariable@ и сопоставляемое ей выражение(тип выражения @ISyntaxElement@, см. документацию к библиотеке Java Constraint Solver API).
26
27 1 Sergey Smolov
Переменная @MVariable@ содержит строковое имя, тип (в настоящее время поддерживаются типы integer, real, boolean и битовые векторы) и указатель на её местоположение в памяти @ILocation@.
28 6 Sergey Smolov
29 1 Sergey Smolov
Список чувствительности процесса @SensitivityList@ содержит набор событий.
30
Событие @Event@ определяется типом и соответствующей переменной с указанным поддиапазоном.
31 6 Sergey Smolov
Тип события @EEventType@ определяет, каким фронтом сигнала данное событие инициируется. 
32 10 Sergey Smolov
Возможные варианты - передний фронт(POSITIVE_EDGE), задний фронт(NEGATIVE_EDGE), либо оба одновременно.
33 6 Sergey Smolov
34 1 Sergey Smolov
Переменная с указанным поддиапазоном @RangedVariable@ содержит собственно переменную и её поддиапазон. 
35 6 Sergey Smolov
Семантика поддиапазона @Range@ следующая: событие может происходить не только при изменении значения всего сигнала, но и некоторого его подмассива. 
36
Границы этого подмассива и определяются поддиапазоном. 
37
Поддиапазон содержит два числа, задающих соответственно левую и правую границы подмассива.
38
39
Граф потока управления @ControlFlowGraph@ представляет собой ориентированный граф, вершины которого имеют тип @Node@, а ребра имеют тип @Link@. 
40
Если в исходном коде исполнение инструкции A предшествовало исполнению инструкции B,
41
 и между ними ни одна другая инструкция не выполнялась, то в графе потока управления будет существовать ребро из A в B. 
42
43
@Node@ - базовый класс для различных узлов. 
44
Любой класс данного типа содержит указатель на родительский класс (для корневой вершины он будет равен null),
45
 а также класс описания расположения соответствующей инструкции в исходном коде (@CodeLocation@).
46
47 1 Sergey Smolov
Наследниками класса @Node@ являются:
48
49
# граф потока управления @ControlFlowGraph@.
50
51 6 Sergey Smolov
# базовый блок @BasicBlock@. 
52
Содержит только одну входную и одную выходную дуги. 
53
Также содержит набор утверждений @Statement@. 
54
Утверждение - это базовый класс, наследником которого является присваивание @Assignment@. 
55
Присваивание содержит набор более элементарных объектов @Substitution@. 
56
Элементы присваивания содержат переменную с указанным поддиапазоном @RangedVariable@
57
 и присваиваемое ей выражение (@Operation@, см. документацию к библиотеке Java Constraint Solver API).
58
59
# условный оператор @Switch@. 
60
Содержит только одну входную дугу и, возможно, более чем одну выходную дугу.
61
 Также включает в себя набор условий типа @Operation@ (см. документацию к библиотеке Java Constraint Solver API). 
62
63
# оператор слияния @Merge@.
64
 Является обратным к условному оператору.
65
 Содержит, возможно, более одной входной дуги и ровно одну выходную дугу.
66
67 1 Sergey Smolov
h2. Подсистема компонентов связывания с исходным кодом
68
69 6 Sergey Smolov
Описание расположения @CodeLocation@ содержит полное имя @QFileName@ файла,
70
 где расположена соответствующая структура исходного кода (инструкция, модуль или что-то иное);
71
 также содержит отображение диапазонов номеров строк в сами строки @CodeLineMap@.
72
73 2 Sergey Smolov
Полное имя @QFileName@ является оберткой вокруг строкового имени, содержащего абсолютный путь к файлу.
74 6 Sergey Smolov
75 7 Sergey Smolov
Отображение @CodeLineMap@ содержит набор пар вида <диапазон строк @CodeLineRegion@, контейнер соответствующих строк @CodeLineContainer@>.
76 6 Sergey Smolov
77 2 Sergey Smolov
Диапазон строк @CodeLineRegion@ содержит два номера, называемых левым и правым индексами.
78 6 Sergey Smolov
79 1 Sergey Smolov
Контейнер строк @CodeLineContainer@ содержит набор строк кода.
80 3 Sergey Smolov
81
h2. Подсистема модели памяти
82 1 Sergey Smolov
83
Цель создания модели памяти заключается в необходимости имитировать исполнение ВП на конкретных данных (например, для исполнения тестовых последовательностей). Основным компонентом здесь является память @Memory@, которая представляет собой массив ячеек типа @Bit@. Каждая ячейка имеет номер и содержимое. Для заполнения ячеек памятью используется механизм извлечения подмассива ячеек, такой подмассив имеет тип @Location@. Предполагается, что у каждой переменной ВП @MVariable@ имеется свой подмассив ячеек памяти @Location@.