Control Flow Graph representation » History » Revision 24
« Previous |
Revision 24/29
(diff)
| Next »
Sergey Smolov, 04/02/2015 07:02 PM
Control Flow Graph representation¶
В данном разделе содержится описание внутреннего представления HDL-описаний на основе графа потока управления (control flow graph, CFG). В дальнейшем представление будет именоваться CFG-моделью.
Классом верхнего уровня CFG-модели является CFGModel
. CFGModel
содержит набор модулей Module
, никак не связанных между собой.
Модуль Module
содержит строковое имя, строковое имя конкретного экземпляра (непустое при инстанцировании) модуля, набор вложенных модулей Module
, набор процессов Process
.
Процесс Process
содержит список чувствительности EventList
и множество вершин CfgNode
, называемое графом потока управления. Процесс может иметь "начальный" (initial) тип. Процессы начального типа имеют пустой список чувствительности.
Если процесс "начального" типа, то он выполняется однократно, прочие процессы выполняются "вечно" - содержащиеся в них последовательности инструкций начинают выполняться каждый раз, когда возникает событие из соответствующих списков чувствительности.
Список чувствительности EventList
содержит неупорядоченный набор событий Event
(возможно пустой).
Событие Event
описывается типом события EventType
и переменной RangedVariable
, для которой и наступает событие.
Представлены следующие типы событий EventType
: передний фронт POSITIVE_EDGE
, задний фронт NEGATIVE_EDGE
, произвольный фронт ANY_EDGE
.
Переменная с указанным поддиапазоном RangedVariable
содержит переменную NodeVariable
(см. документацию к библиотеке Fortress) и её поддиапазон Range
.
Поле пользовательских данных переменной NodeVariable
содержит дескриптор данных VariableData
.
- тип переменной
VariableType
(представлены следующие типы: входной сигналIN
, выходной сигналOUT
, сквозной сигналINOUT
, внутренняя переменнаяREG
).
Поддиапазон Range
содержит два числа, задающих соответственно левую и правую границы подмассива.
Процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности.
Как только такое событие происходит, процесс осуществляет выполнение инструкций, которые содержатся в его графе потока управления.
Между CfgNode
узлами, находящимися в Process
процессе, могут быть определены связи "родитель <-> ребенок". Если узел A является родителем узла B, то это означает, что поток управления сначала попадает в узел A, а потом в узел B.
В общем случае допускается наличие нескольких родительских и нескольких дочерних узлов, но для каждого из типов узлов могут бть введены дополнительные ограничения.
Все типы узлов указаны в перечислимом типе CfgNodeType
:SOURCE
- стартовый узел графа потока управления типа Source
, содержит ссылку на родительский узел Process
, содержит ровно одну ссылку на дочерний узелSINK
- конечный узел графа потока управления типа Sink
, не содержит ссылок на дочерние узлы, содержит ровно одну ссылку на родительский узелBASIC_BLOCK
- узел базового блока типа BasicBlock
CASE
- узел условия типа Case
SWITCH
- узел ветвления типа Switch
MERGE
- узел типа Merge
PROCESS
- узел типа Process
(не может быть вершиной в Process
, относится к типу CfgModelNode
)MODULE
- узел типа Module
(не может быть вершиной в Process
, относится к типу CfgModelNode
)
Часть узлов уже была рассмотрена выше.
базовый блок BasicBlock
Может быть неблокирующим (concurrent) или блокирующим.
Содержит ровно одну ссылку на родительский узел и список инструкций присваивания. Присваивания являются объектами класса Assignment
.
Присваивания, находящиеся в одном базовом блоке, выполняются в том порядке, в котором они хранятся в списке.Assignment
- это переменная с указанным поддиапазоном (возможно пустым, что соответствует переменной целиком) RangedVariable
и присваиваемое ей выражение Node
.
ветвление Switch
Cодержит ровно одну ссылку на родительский узел и не менее одной ссылки на дочерние узлы. Дочерние узлы имеют тип Case
.
Ветвление содержит либо нетривиальное выражение типа Node
, либо событие типа Event
. Если ветвление является "событийным", то оно может иметь только один дочерний узел типа Case
.
условие Case
Cодержит ровно одну ссылку на родительский узел типа Switch
и ровно одну ссылку на дочерний узел, а также набор допустимых значений. Каждое значение имеет тип NodeValue
.
Значения соответствуют выражению, хранящемуся в родительском узле ветвления. Подразумевается, что если выполнение пошло через данный Case
-узел, то выражение из родительского Switch
-узла приняло какое-то из допустимых значений дочернего узла.
оператор слияния Merge
Является обратным к условному оператору. Cодержит не менее двух ссылок на родительские узлы и ровно одну ссылку на дочерний узел.
Updated by Sergey Smolov over 9 years ago · 29 revisions