Control Flow Graph representation » History » Version 21
Sergey Smolov, 12/12/2014 05:45 PM
1 | 1 | Mikhail Chupilko | h1. Control Flow Graph representation |
---|---|---|---|
2 | |||
3 | В данном разделе содержится описание внутреннего представления HDL-описаний на основе графа потока управления (control flow graph, CFG). В дальнейшем представление будет именоваться CFG-моделью. |
||
4 | |||
5 | Классом верхнего уровня CFG-модели является *@CFGModel@*. @CFGModel@ содержит набор модулей @Module@, никак не связанных между собой. |
||
6 | |||
7 | 9 | Sergey Smolov | Модуль *@Module@* содержит строковое имя, строковое имя конкретного экземпляра (непустое при инстанцировании) модуля, набор вложенных модулей @Module@, набор процессов @Process@. |
8 | 1 | Mikhail Chupilko | |
9 | 12 | Sergey Smolov | Процесс *@Process@* содержит список чувствительности @EventList@ и граф потока управления @Cfg@. Процесс может иметь "начальный" (initial) тип. Процессы начального типа имеют пустой список чувствительности. |
10 | Если процесс "начального" типа, то он выполняется однократно, прочие процессы выполняются "вечно" - содержащиеся в них последовательности инструкций начинают выполняться каждый раз, когда возникает событие из соответствующих списков чувствительности. |
||
11 | 1 | Mikhail Chupilko | |
12 | Список чувствительности *@EventList@* содержит неупорядоченный набор событий @Event@ (возможно пустой). |
||
13 | |||
14 | Событие *@Event@* описывается типом события @EventType@ и переменной @RangedVariable@, для которой и наступает событие. |
||
15 | Представлены следующие типы событий *@EventType@*: передний фронт @POSITIVE_EDGE@, задний фронт @NEGATIVE_EDGE@, произвольный фронт @ANY_EDGE@. |
||
16 | |||
17 | 9 | Sergey Smolov | Переменная с указанным поддиапазоном *@RangedVariable@* содержит переменную @NodeVariable@ (см. документацию к библиотеке Fortress) и её поддиапазон @Range@. |
18 | Поле пользовательских данных переменной @NodeVariable@ содержит дескриптор данных *@VariableData@*. |
||
19 | |||
20 | Дескриптор данных содержит: |
||
21 | * указатель на местоположение переменной в памяти @ILocation@; |
||
22 | 15 | Sergey Smolov | * тип переменной *@VariableType@* (представлены следующие типы: входной сигнал @IN@, выходной сигнал @OUT@, сквозной сигнал @INOUT@, внутренняя переменная @REG@, константа @CONST@). |
23 | 9 | Sergey Smolov | |
24 | 1 | Mikhail Chupilko | Поддиапазон *@Range@* содержит два числа, задающих соответственно левую и правую границы подмассива. |
25 | |||
26 | Процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности. |
||
27 | Как только такое событие происходит, процесс осуществляет выполнение всех инструкций, которые содержатся в его графе потока управления. |
||
28 | |||
29 | 7 | Sergey Smolov | На множестве процессов задается отношение частичного порядка вида "happens before". |
30 | 1 | Mikhail Chupilko | Отношение задает порядок выполнения разных процессов при возникновении общего события в их списках чувствительности. |
31 | 7 | Sergey Smolov | Отношение задается только в том случае, когда процессы (теоретически) имеют зависимость по данным. |
32 | 1 | Mikhail Chupilko | В CFG-модели данное отношение реализовано как множества ссылок на входящие и исходящие зависимости для каждого процесса. |
33 | 6 | Sergey Smolov | С помощью методов @getParentProcesses()@ и @getChildProcesses()@ для фиксированного процесса можно определить предшествующие ему и последующие процессы соответственно. |
34 | 1 | Mikhail Chupilko | |
35 | Граф потока управления *@Cfg@* - это набор узлов *@CfgNode@*. Между узлами могут быть определены связи "родитель <-> ребенок". Если узел A является родителем узла B, то это означает, что поток управления сначала попадает в узел A, а потом в узел B. |
||
36 | В общем случае допускается наличие нескольких родительских и нескольких дочерних узлов, но для каждого из типов узлов могут бть введены дополнительные ограничения. |
||
37 | Все типы узлов указаны в перечислимом типе *@CfgNodeType@*: |
||
38 | @CFG@ - граф потока управления |
||
39 | 4 | Sergey Smolov | @SOURCE@ - стартовый узел графа потока управления типа *@Source@*, не содержит ссылок на родительские узлы, содержит ровно одну ссылку на дочерний узел |
40 | 13 | Sergey Smolov | @SINK@ - конечный узел графа потока управления типа *@Sink@*, не содержит ссылок на дочерние узлы, может иметь несколько ссылок на родительский узел |
41 | 1 | Mikhail Chupilko | @NODE@ - узел неопределенного типа |
42 | @BASIC_BLOCK@ - узел базового блока типа @BasicBlock@, |
||
43 | 19 | Sergey Smolov | @CASE@ - узел условия типа @Case@ |
44 | 1 | Mikhail Chupilko | @SWITCH@ - узел ветвления типа @Switch@ |
45 | @MERGE@ - узел типа @Merge@ |
||
46 | @INSTANCE@ - узел типа @Instance@ |
||
47 | @PROCESS@ - узел типа @Process@ |
||
48 | @MODULE@ - узел типа @Module@ |
||
49 | |||
50 | Часть узлов уже была рассмотрена выше. |
||
51 | |||
52 | базовый блок *@BasicBlock@* |
||
53 | 18 | Sergey Smolov | Содержит ровно одну ссылку на родительский узел и список инструкций присваивания. Присваивания являются объектами класса @Assignment@. |
54 | 16 | Sergey Smolov | Присваивания, находящиеся в одном базовом блоке, выполняются в том порядке, в котором они хранятся в списке. |
55 | 18 | Sergey Smolov | *@Assignment@* - это набор переменных с указанным поддиапазоном (возможно пустым, что соответствует переменной целиком) @RangedVariable@ и присваиваемое их конкатенации выражение @Node@. |
56 | Присваивание может быть неблокирующим (concurrent) или блокирующим. |
||
57 | 1 | Mikhail Chupilko | |
58 | ветвление *@Switch@* |
||
59 | 17 | Sergey Smolov | Cодержит ровно одну ссылку на родительский узел и не менее двух ссылок на дочерние узлы. Дочерние узлы имеют тип @Case@. |
60 | 20 | Sergey Smolov | Ветвление содержит либо нетривиальное выражение типа @Node@, либо событие типа @Event@. Если ветвление является "событийным", то оно может иметь только один дочерний узел типа @Case@. |
61 | 1 | Mikhail Chupilko | |
62 | условие *@Case@* |
||
63 | 14 | Sergey Smolov | Cодержит ровно одну ссылку на родительский узел и ровно одну ссылку на дочерний узел, а также набор допустимых значений. Каждое значение имеет тип @NodeValue@. |
64 | 20 | Sergey Smolov | Значения соответствуют выражению, хранящемуся в родительском узле ветвления. Подразумевается, что если выполнение пошло через данный @Case@-узел, то выражение из родительского @Switch@-узла приняло какое-то из допустимых значений дочернего узла. |
65 | 1 | Mikhail Chupilko | |
66 | 11 | Sergey Smolov | оператор слияния *@Merge@* |
67 | 13 | Sergey Smolov | Является обратным к условному оператору. Cодержит не менее двух ссылок на родительские узлы и ровно одну ссылку на дочерний узел. |