Project

General

Profile

Intermediate Representation » History » Version 11

Sergey Smolov, 05/13/2014 05:18 PM

1 11 Sergey Smolov
h1. Control flow graph representation
2 1 Sergey Smolov
3 11 Sergey Smolov
В данном разделе содержится описание внутреннего представления HDL-описаний на основе графа потока управления (control flow graph, CFG). В дальнейшем представление будет именоваться CFG-моделью.
4 1 Sergey Smolov
5 11 Sergey Smolov
CFG-модель состоит из трех подсистем:
6
* представления конструкций исходного кода
7
* компонентов связывания с исходным кодом
8
* модели памяти
9 1 Sergey Smolov
10 11 Sergey Smolov
h2. Представление конструкций исходного кода
11 1 Sergey Smolov
12 11 Sergey Smolov
Классом верхнего уровня CFG-модели является *@CFGModel@*. @CFGModel@ содержит набор модулей @Module@, никак не связанных между собой.
13
14
Модуль *@Module@* содержит строковое имя и три набора  - набор вложенных модулей @Module@, набор процессов @Process@ и набор экземпляров модулей @Instance@.
15
16
Процесс *@Process@* содержит список чувствительности @EventList@ и граф потока управления @Cfg@.
17
18
Список чувствительности *@EventList@* содержит неупорядоченный набор событий @Event@ (возможно пустой). 
19
20
Событие *@Event@* описывается типом события @EventType@ и переменной @RangedVariable@, для которой и наступает событие.
21
Представлены следующие типы событий *@EventType@*: передний фронт @POSITIVE_EDGE@, задний фронт @NEGATIVE_EDGE@, произвольный фронт @ANY_EDGE@.
22
23
Переменная с указанным поддиапазоном *@RangedVariable@* содержит переменную @MVariable@ и её поддиапазон @Range@.  
24
Поддиапазон *@Range@* содержит два числа, задающих соответственно левую и правую границы подмассива.
25
26
Процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности. 
27 1 Sergey Smolov
Как только такое событие происходит, процесс осуществляет выполнение всех инструкций, которые содержатся в его графе потока управления.
28 11 Sergey Smolov
29 1 Sergey Smolov
На множестве процессов задается отношение частичного порядка вида "happens before". 
30 11 Sergey Smolov
Отношение задает порядок выполнения разных процессов при возникновении общего события в их списках чувствительности. 
31 1 Sergey Smolov
Отношение задается только в том случае, когда процессы (теоретически) имеют зависимость по данным.
32 11 Sergey Smolov
В CFG-модели данное отношение реализовано как множества ссылок на входящие и исходящие зависимости для каждого процесса.
33
С помощью методов @getParentProcesses()@ и @getChildProcesses()@ для фиксированного процесса можно определить предшествующие ему и последующие процессы соответственно.
34 1 Sergey Smolov
35 11 Sergey Smolov
Экземпляр модуля *@Instance@* содержит сам модуль @Module@, строковое имя данного экземпляра модуля, а также набор связей типа @Binding@.
36 1 Sergey Smolov
37 11 Sergey Smolov
Связь *@Binding@* - это способ присваивания переменным модуля определенных выражений.
38
Связь содержит внутреннюю переменную @MVariable@ и сопоставляемое ей выражение типа @Node@. 
39
*@Node@* - базовый класс для выражений, переменных и значений ( см. документацию к библиотеке Fortress).
40 1 Sergey Smolov
41 11 Sergey Smolov
Переменная *@MVariable@* содержит строковое имя, тип данных (в настоящее время поддерживаются типы integer, real, boolean и битовые векторы фиксированной длины) и ассоциированные с ней данные @MVariableData@.
42
Имя и тип переменной помещены в объекте *@Variable@* (см. документацию к библиотеке Fortress).
43
Ассоциированные с переменной данные *@MVariableData@* содержат:
44
* указатель на местоположение переменной в памяти @ILocation@;
45
* тип переменной *@EVariableType@* (представлены следующие типы: входной сигнал @IN_SIGNAL@, выходной сигнал @OUT_SIGNAL@, сквозной сигнал @INOUT_SIGNAL@, внутренняя переменная @REGISTER@, константа @CONSTANT@);
46
* флаг isDefined - булевская переменная (если @TRUE@, то в данной конструкции переменная используется, иначе читается)
47 1 Sergey Smolov
48 11 Sergey Smolov
Граф потока управления *@Cfg@* - это набор узлов *@CfgNode@*. Между узлами могут быть определены связи "родитель <-> ребенок". Если узел A является родителем узла B, то это означает, что поток управления сначала попадает в узел A, а потом в узел B.
49
В общем случае допускается наличие нескольких родительских и нескольких дочерних узлов, но для каждого из типов узлов могут бть введены дополнительные ограничения.
50
Все типы узлов указаны в перечислимом типе *@CfgNodeType@*:
51
@CFG@ - граф потока управления
52
@SOURCE@ - стартовый узел графа потока управления типа @SourceNode@, не содержит ссылок на родительские узлы, содержит ровно одну ссылку на дочерний узел
53
@SINK@ - конечный узел графа потока управления типа @SinkNode@, не содержит ссылок на дочерние узлы, содержит ровно одну ссылку на родительский узел
54
@NODE@ - узел неопределенного типа
55
@ASSERT@ - узел типа @Assertion@, не содержит ссылок на дочерние узлы, содержит ровно одну ссылку на родительский узел
56
@BASIC_BLOCK@ - узел базового блока типа @BasicBlock@, 
57
@CONDITION@ - узел условия типа @Condition@
58
@SWITCH@ - узел ветвления типа @Switch@
59
@MERGE@ - узел типа @Merge@
60
@INSTANCE@ - узел типа @Instance@
61
@PROCESS@ - узел типа @Process@
62
@MODULE@ - узел типа @Module@
63 6 Sergey Smolov
64 11 Sergey Smolov
Часть узлов уже была рассмотрена выше.
65 1 Sergey Smolov
66 11 Sergey Smolov
базовый блок *@BasicBlock@* 
67
Содержит ровно одну ссылку на родительский узел и ровно одну ссылку на дочерний узел, а также множественное присваивание @Assignment@.
68
Множественное присваивание *@Assignment@* - это набор утверждений @Statement@. Наследниками класса @Statement@ являются присваивание @AssignStatement@ и задержка @WaitStatement@.
69
Присваивание содержит набор элементарных присваиваний @Substitution@. 
70
Элементарное присваивание *@Substitution@* содержит переменную с указанным поддиапазоном @RangedVariable@ и присваиваемое ей выражение @Node@.
71
Задержка *@WaitStatement@* содержит событие @Event@, при наступлении которого продолжается выполнение.
72 7 Sergey Smolov
73 11 Sergey Smolov
ветвление *@Switch@* 
74
Cодержит ровно одну ссылку на родительский узел и не менее двух ссылок на дочерние узлы. Дочерние узлы имеют тип @Condition@.
75 6 Sergey Smolov
76 11 Sergey Smolov
условие *@Condition@*
77
Cодержит ровно одну ссылку на родительский узел и ровно одну ссылку на дочерний узел, а также условие типа @Node@.
78 3 Sergey Smolov
79 11 Sergey Smolov
оператор слияния *@Merge@*
80
Является обратным к условному оператору. Cодержит не менее двух ссылок на родительские узлы и ровно одну ссылку на дочерний узел.
81 1 Sergey Smolov
82 11 Sergey Smolov
исключение *@Assert@*
83
Содержит ровно одну ссылку на родительский узел, а также условие, по выполнении которого выбрасывается исключение. Условие имеет тип @Node@ (см. документацию к библиотеке Fortress). 
84 1 Sergey Smolov
85
h2. Подсистема компонентов связывания с исходным кодом
86
87 11 Sergey Smolov
*Важно*: подсистема не реализована, присутствует в проекте в виде заготовки.
88 1 Sergey Smolov
89 11 Sergey Smolov
Описание расположения *@CodeLocation@* содержит полное имя @QFileName@ файла, где расположена соответствующая структура исходного кода (инструкция, модуль или что-то иное); также содержит отображение диапазонов номеров строк в сами строки @CodeLineMap@.
90 1 Sergey Smolov
91 11 Sergey Smolov
Полное имя *@QFileName@* является оберткой вокруг строкового имени, содержащего абсолютный путь к файлу.
92 1 Sergey Smolov
93 11 Sergey Smolov
Отображение *@CodeLineMap@* содержит набор пар вида <диапазон строк @CodeLineRegion@, контейнер соответствующих строк @CodeLineContainer@>.
94 1 Sergey Smolov
95 11 Sergey Smolov
Диапазон строк *@CodeLineRegion@* содержит два номера, называемых левым и правым индексами.
96 1 Sergey Smolov
97 11 Sergey Smolov
Контейнер строк *@CodeLineContainer@* содержит набор строк кода.
98
99 1 Sergey Smolov
h2. Подсистема модели памяти
100
101 11 Sergey Smolov
*Важно*: подсистема не реализована, присутствует в проекте в виде заготовки.
102
103
Цель создания модели памяти заключается в необходимости имитировать исполнение ВП на конкретных данных (например, для исполнения тестовых последовательностей). Основным компонентом здесь является память *@Memory@*, которая представляет собой массив ячеек типа *@Bit@*. Каждая ячейка имеет номер и содержимое. Для заполнения ячеек памятью используется механизм извлечения подмассива ячеек, такой подмассив имеет тип *@Location@*. Предполагается, что у каждой переменной ВП @MVariable@ имеется свой подмассив ячеек памяти @Location@.