The following example illustrates how one might describe a ROM array using relaxed template arguments.
template <> <pbool VAL>
defproc ROMcell(...) { ... }
template <pint X, Y> <pbool V[X][Y]>
defproc ROMarray(...) {
ROMcell<> x[X][Y]; // <> is optional
// can't reference x[i][j].member yet
// because instance types are incomplete
(i:X:
(j:Y: x[i][j] <V[i][j]> (...); )
)
// from here, may reference x[i][j].member
}
ROMarray <2,3>
a <{{false,true,false},
{true,false,true}}>;
This following example shows how one would declare an array of sources (like for a test environment):
template <pint N>
defchan e1of (...) {...}
template <pint N> <pint M; pint V[M]>
defproc source_e1of (e1of<N> c) {...}
e1of<4> C[10];
source_e1of<4> CS[10]; // instances' types are incomplete
CS[0] <1, {2}> (C[0]); // can complete types and connect
CS[1] <3, {2,0,1}> (C[1]);
CS[2] <2, {1,0}> (C[2]);
...
We could have also declared the array of sources with sparse instantiation, as long as the strict template arguments match:
source_e1of<4> CS[0..0];
// this determines the entire collection's strict parameters
// but sets the relaxed parameters for only the indexed range
CS[0]<1, {2}>(C[0]);
// This binds the relaxed template parameters and connects ports.
source_e1of<4> CS[1..1];
CS[1]<3, {2,0,1}>(C[1]);
source_e1of<4> CS[2..2];
CS[2]<2, {1,0}>(C[2]);
...
[TODO: write section on connection examples]