Project

General

Profile

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одержит не менее двух ссылок на родительские узлы и ровно одну ссылку на дочерний узел.