I would like to transform a C for loop
into a for..generate statement in VHDL.
Here is the monster:
for (j = J; j+d < (2 << g); j += 2*d)
My steps so far:
j
to k
to avoid trouble with J
for (k = J; k+d < (2 << g); k += 2*d)
2 << g
is replaced by 1 << (g+1)
for (k = J; k+d < (1 << (g+1)); k += 2*d)
1 << (g+1)
is replaced by 2**(g+1)
for (k = J; k+d < (2**(g+1)); k += 2*d)
j+d <= (2**g)-1
for (k = J; k+d <= (2**(g+1))-1; k += 2*d)
j <= (2**(g+1))-d-1
for (k = J; k <= (2**(g+1))-d-1; k += 2*d)
VHDL Code so far:
-- outer loops
genK : for k in J to (2**(g+1))-d-1 generate
begin
-- more generate loops ...
end generate;
How can I transform k += 2*d
?
The complete odd-even mergesort algorithm can be found at that SO question.
My next steps:
for (k = 0; k <= (2**(g+1))-J-d-1; k += 2*d)
2*d
, but the generate loop has 1
. So it must be normalized to 1
, by dividing. k
must be renamed to kk
:for (kk = 0; kk <= ((2**(g+1))-J-d-1) / (2*d); kk++)
k
can be restored in the loop:k = kk * 2*d + J
VHDL Code so far:
-- outer loops
genK : for kk in 0 to ((2**(g+1))-J-d-1) / (2*d) generate
constant k : NATURAL := (kk * 2 * d) + J;
begin
-- more generate loops ...
end generate;
How about something like:
genK : for k in J to (2**(g+1))-d-1 generate
begin
gen2d : if ((k - J) mod (2 * d)) = 0 generate
-- stuff
end generate gen2d;
end generate;