The above rules regarding vector assignments have consequences when vectors are passed as parameters to modules. For example, suppose we have a module:
MODULE foo(x) { INPUT x : array 1..0 of boolean; ... }Suppose we create an instance of ``foo'' as follows:
bar : foo(y);This is equivalent to:
bar.x : array 1..0 of boolean; bar.x := y; ...
The meaning of this depends on whether ``y'' is big-endian or little endian. If ``y'' is declared in the same order as ``bar.x'':
y : array 1..0 of boolean;then we have
bar.x[1] := y[1]; bar.x[0] := y[0];
On the other hand, if ``y'' is in the opposite order:
y : array 0..1 of boolean;then
bar.x[1] := y[0]; bar.x[0] := y[1];
That is, passing a ``big-endian'' array to a ``little-endian'' parameter, results in a reversal of the index order of the elements. What remains constant is the value as a binary number.
Note that as a result of the above rules for vector assignment, inputs may be truncated, or zero-extended. For example, if we instantiate ``foo'' as follows:
bar : foo([0,1,0]);the effect will be
bar.x[1] := 1; bar.x[0] := 0;since the vector [0,1,0] will be truncated to [1,0]. On the other hand,
bar : foo([1]);will give us
bar.x[1] := 0; bar.x[0] := 1;since the integer 1 will be coerced to the vector [0,1].
The same remarks apply to outputs. That is, suppose we have a module
MODULE zip(y) { OUTPUT y : array 1..0 of boolean; ... }An instance
bar : zip(x);is equivalent to
bar.y : array 1..0 of boolean; x := bar.y;
This means that if ``x'' has length shorter than ``bar.y'', then ``x'' will get the low order bits of ``bar.y''. Similarly, if ``x'' is longer, then it will get ``bar.y'' extended with zeros. If ``x'' is an array declared in the opposite order to ``bar.y'', then ``x'' will get ``bar.y'' reversed, and so on.