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@. |