W elcome to
Fintronic USA

#### Third party tools integrated with FinSim(Specman, Denali, Debussy, Undertow, Vera, VirSim, HDL Score, Comet, Meteor, NelSim, Pivot, DeskPOD, @Designer 2.1)

Inverting a 4,000,000x4,000,000 sparse matrix in Verilog

This example works on FinSim 10_07_197 and subsequent versions.

This example inverts a simple sparse matrice of 4,000,000x4,000,000 elements of type real twice, uses two norm system functions to measure it and displays all non-zero values on one line and one column.

On a laptop with Intel core i7 at 2.4GHz this example run in 1.29 seconds.

```module top;
parameter integer size = 4000000;
real      MReal1 [size-1 : 0][size-1 : 0];
real      MRInv [size-1 : 0][size-1 : 0];
integer   found, lin, col, idx;
integer   i;
real      r, max, sum;

initial begin
/* declaring sparse matrices */
\$ToSparse(MReal1);
\$ToSparse(MRInv);

/* initializing matrice to be inverted*/
\$Diag(MReal1, 2, 1, 7.0);
/* \$Diag(MReal1, 2, 1, 7.0) is a more efficient version of the code below:
for (i = 0; i < size/2; i++)
begin
MReal1[2*i][i] = 7.0;
end
for (i = 0; i < size; i++)
begin
MReal1[i][i] = 1.0;
end
*/
/*inverting matrix */
MRInv = MReal1 **(-1);
MRInv = MRInv **(-1);

lin = 4*size/10;
\$display("displaying all non-zero values on line %d\n", lin);
idx = -1;
found = \$SpReadNextNzElemInLine(MRInv, lin, col, idx, r);
while (found) begin
\$display("MRInv[%d][%d]=%e\n", lin, col, r);
found = \$SpReadNextNzElemInLine(MRInv, lin, col, idx, r);
end

col = 2*size/10;
\$display("displaying all non-zero values on column %d\n", col);
lin = -1;
found = \$SpReadNextNzElemInCol(MRInv, lin, col, r);
while (found) begin
\$display("MRInv[%d][%d]=%e\n", lin, col, r);
found = \$SpReadNextNzElemInCol(MRInv, lin, col, r);
end

\$display("********displaying norms and distances*********\n");
max = \$VpNormAbsMax(MRInv);
sum = \$VpNormAbsSum(MRInv);
\$display("max=%e, sum=%e\n", max, sum);
end
endmodule // top
```