Project

General

Profile

Intermediate Representation » History » Revision 6

Revision 5 (Sergey Smolov, 10/11/2013 04:55 PM) → Revision 6/11 (Sergey Smolov, 10/22/2013 03:37 PM)

h1. Intermediate Representation 

 В данном разделе представлена структура внутреннего представления(ВП) HDL-описаний.  
 Построение ВП выполняется на начальном этапе статического анализа HDL-кода.  
 ВП является исходным для извлечения охраняемых действий. 
 С точки зрения архитектуры ВП состоит из трех подсистем: 
  собственно представления конструкций исходного кода, компонентов связывания с исходным кодом и модели памяти. 

 h2. Представление исходного кода 

 Базовым элементом ВП исходного кода является модуль @Module@.  
 Модуль содержит строковое имя и два набора - набор процессов и набор экземпляров модулей. 

 
 Процесс @Process@ содержит список чувствительности и соответствующий граф потока управления.  
 Семантика процесса следующая - процесс постоянно находится в состоянии ожидания до тех пор, пока не происходит событие, находящееся в списке чувствительности.  
 Как только такое событие происходит, процесс осуществляет выполнение всех инструкций, которые содержатся в его графе потока управления. 
 На множестве процессов задается отношение частичного порядка вида "happens before".  
 Это отношение задает порядок выполнения разных процессов при возникновении общего события в их списках чувствительности.  
 Отношение задется только в том случае, когда процессы (теоретически) имеют зависимость по данным. 
 В текущей версии ВП данное отношение реализовано как множества ссылок на входящие и исходящие зависимости для каждого модуля. 

 Экземпляр модуля @Instance@ содержит собственно модуль, строковое имя данного экземпляра модуля, а также набор связок. 

 
 Связка @Binding@ представляет собой способ передачи экземпляру модуля конкретных выражений вместо определенных переменных модуля.  
 Связка содержит собственно внутреннюю переменную @MVariable@ и сопоставляемое ей выражение(тип выражения @ISyntaxElement@, см. документацию к библиотеке Java Constraint Solver API). 

 
 Переменная @MVariable@ содержит строковое имя, тип (в настоящее время поддерживаются типы integer, real, boolean и битовые векторы) и указатель на её местоположение в памяти @ILocation@. 

 
 Список чувствительности процесса @SensitivityList@ содержит набор событий. 
 Событие @Event@ определяется типом и соответствующей переменной с указанным поддиапазоном. 
 Тип события @EEventType@ определяет, каким фронтом сигнала данное событие инициируется.  
 возбуждается. Возможные варианты - передний фронт(POSEDGE), задний фронт(NEGEDGE), либо оба одновременно(ANYEDGE). 

 любой из них(ANYEDGE). 
 Переменная с указанным поддиапазоном @RangedVariable@ содержит собственно переменную и её поддиапазон.  
 Семантика поддиапазона @Range@ следующая: событие может происходить не только при изменении значения всего сигнала, но и некоторого его подмассива.  
 Границы этого подмассива и определяются поддиапазоном.  
 Поддиапазон содержит два числа, задающих соответственно левую и правую границы подмассива. 

 
 Граф потока управления @ControlFlowGraph@ представляет собой ориентированный граф, вершины которого имеют тип @Node@, а ребра имеют тип @Link@.  
 Если в исходном коде исполнение инструкции A предшествовало исполнению инструкции B, 
  и между ними ни одна другая инструкция не выполнялась, то в графе потока управления будет существовать ребро из A в B.  

  
 @Node@ - базовый класс для различных узлов.  
 Любой класс данного типа содержит указатель на родительский класс (для корневой вершины он будет равен null), 
  а также класс описания расположения соответствующей инструкции в исходном коде (@CodeLocation@). 

 
 Наследниками класса @Node@ являются: 

 # граф потока управления @ControlFlowGraph@. 

 
 # базовый блок @BasicBlock@.  
 Содержит только одну входную и одную выходную дуги.  
 Также содержит набор утверждений @Statement@.  
 Утверждение - это базовый класс, наследником которого является присваивание @Assignment@.  
 Присваивание содержит набор более элементарных объектов @Substitution@.  
 Элементы присваивания содержат переменную с указанным поддиапазоном @RangedVariable@ 
  и присваиваемое ей выражение (@Operation@, см. документацию к библиотеке Java Constraint Solver API). 

 
 # условный оператор @Switch@.  
 Содержит только одну входную дугу и, возможно, более чем одну выходную дугу. 
  Также включает в себя набор условий типа @Operation@ (см. документацию к библиотеке Java Constraint Solver API).  

  
 # оператор слияния @Merge@. 
  Является обратным к условному оператору. 
  Содержит, возможно, более одной входной дуги и ровно одну выходную дугу. 

 h2. Подсистема компонентов связывания с исходным кодом 

 Описание расположения @CodeLocation@ содержит полное имя @QFileName@ файла, 
  где расположена соответствующая структура исходного кода (инструкция, модуль или что-то иное); 
  также содержит отображение диапазонов номеров строк в сами строки @CodeLineMap@. 

 
 Полное имя @QFileName@ является оберткой вокруг строкового имени, содержащего абсолютный путь к файлу. 

 
 Отображение @CodeLineMap@ содержит набор пар вида <диапазон строк @CodeLineRegion@, контейнер соответствующих строк @CodeLineContainer@. 

 @CodeLineContainer@> 
 Диапазон строк @CodeLineRegion@ содержит два номера, называемых левым и правым индексами. 

 
 Контейнер строк @CodeLineContainer@ содержит набор строк кода. 

 h2. Подсистема модели памяти 

 Цель создания модели памяти заключается в необходимости имитировать исполнение ВП на конкретных данных (например, для исполнения тестовых последовательностей). Основным компонентом здесь является память @Memory@, которая представляет собой массив ячеек типа @Bit@. Каждая ячейка имеет номер и содержимое. Для заполнения ячеек памятью используется механизм извлечения подмассива ячеек, такой подмассив имеет тип @Location@. Предполагается, что у каждой переменной ВП @MVariable@ имеется свой подмассив ячеек памяти @Location@.