Intermediate Representation » History » Version 9
Sergey Smolov, 10/23/2013 11:47 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 | 9 | Sergey Smolov | Возможные варианты - передний фронт(POSITIVE_EDGE), задний фронт(NEGATIVE_EDGE), либо оба одновременно(BOTH_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@. |