2016-02-09 2 views
2

Я пытаюсь создать динамически выраженные вложенные операторы генерации, поэтому люди, не являющиеся прошивками, могут изменять значения констант.Создание неограниченного асимметричного массива массивов

Я хочу создать нечто вроде векторов C++, которые во время компиляции будут иметь определенный размер и содержать целочисленные константы. Например, я хотел бы 2D-вектор, который выглядит следующим образом:

a = < <1,2> , <1,3> , <3,4,5> > 

Так что я могу получить доступ к нему так:

a[0,0] = 5 
a[1,0] = 3 
a[2,1] = 1 

До сих пор я попытался это:

type int_array is array (integer range<>) of integer; 
type int_array_array is array (integer range<>, integer range<>) of integer; 

constant nOuter : positive := 2; 
constant nInner : int_array := (2 , 2 , 3); 
constant vals : int_array_array(nOuter - 1 downto 0 , ???) := ((1,2) , (1,3) , (3,4,5)); 

I «Не совсем уверен, как это будет написано, или если это возможно?

Идея, которого я мог бы создать динамически размера блоков, как это:

nOuters: for i in 0 to nOuters -1 generate: 
    nInners: for j in 0 to nInner(i) generate: 
     nVals: for inner k in 0 to vals(i,j) -1 generate: 
+1

Если вам это нужно для синтеза, это невозможно сделать, поскольку массивы должны быть исправлены во время разработки. Все подэлементы должны быть одного размера. Ваши варианты включают вставку фиктивных значений или сохранение строк в записи и использование функции для «индексации» в нее. Однако, если вам нужна только эта симуляция для моделирования, можно создавать произвольные структуры данных с использованием динамически распределенных типов доступа, в том числе гетерогенных массивов. –

+0

Я понимаю, что они должны быть исправлены во время разработки, но я думаю, что просто невозможно сделать асимметричные массивы. Мне просто придется использовать фиктивные переменные, как в моем ответе ниже. – fiz

ответ

0

Моя дрянная решение добавить еще одну константу:

constant nMaxInner : positive := 3; 

constant vals : int_array_array(nOuter - 1 downto 0 , nMaxInner - 1 downto 0) := ((0,1,2) , (0,1,3) , (3,4,5)); 

Но это не элегантно.

Смежные вопросы