W elcome to
Fintronic USA

redball.gif (326 bytes)About Fintronic USA

redball.gif (326 bytes)Main announcements

redball.gif (326 bytes)What's new at Fintronic

redball.gif (326 bytes)What our customers are saying...

redball.gif (326 bytes)Support for SystemC

redball.gif (326 bytes)Support for Verilog 2001

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

home.htmlProductsSupportEvaluateContact

Inverting a 240,000x240,000 sparse matrix in Verilog


This example works on FinSim 10_07_15 and subsequent versions.

This example inverts a simple sparse matrice of 240,000 x 240,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 single Intel i3 processor running at 2.3GHz this example run in 7 seconds.

module top;
  parameter integer size = 240000;
  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*/
    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


© Copyright 1999-2011, Fintronic USA, Inc.   All rights reserved.