Project

General

Profile

Actions

Control Flow Graph representation

В данном разделе содержится описание внутреннего представления HDL-описаний на основе графа потока управления (control flow graph, CFG). В дальнейшем представление будет именоваться CFG-моделью.

Классом верхнего уровня CFG-модели является CFGModel. CFGModel содержит набор модулей Module, никак не связанных между собой.

Модуль Module содержит строковое имя, строковое имя конкретного экземпляра (непустое при инстанцировании) модуля, набор вложенных модулей Module, набор процессов Process.

Процесс Process содержит строковое имя, список чувствительности EventList и множество вершин ProcessNode, называемое графом потока управления. Процесс может иметь "начальный" (initial) тип. Процессы начального типа имеют пустой список чувствительности.
Если процесс "начального" типа, то он выполняется однократно, прочие процессы выполняются "вечно" - содержащиеся в них последовательности инструкций начинают выполняться каждый раз, когда возникает событие из соответствующих списков чувствительности.

Список чувствительности EventList содержит неупорядоченный набор событий Event (возможно пустой).

Событие Event описывается типом события EventType и переменной RangedVariable, для которой и наступает событие.
Представлены следующие типы событий EventType: передний фронт POSITIVE_EDGE, задний фронт NEGATIVE_EDGE, произвольный фронт ANY_EDGE.

Переменная с указанным поддиапазоном RangedVariable содержит переменную NodeVariable (см. документацию к библиотеке Fortress) и её поддиапазон Range.
Поле пользовательских данных переменной NodeVariable содержит дескриптор данных VariableDescriptor.

Дескриптор данных содержит:
  • тип переменной VariableType (представлены следующие типы: входной сигнал IN, выходной сигнал OUT, сквозной сигнал INOUT, внутренняя переменная REG).

Поддиапазон Range содержит два числа, задающих соответственно левую и правую границы подмассива.

Процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности.
Как только такое событие происходит, процесс осуществляет выполнение инструкций, которые содержатся в его графе потока управления.

Между ProcessNode узлами, находящимися в 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 3 years ago · 29 revisions