The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

   spice - interface calls for parsing spice netlst.

SYNOPSIS

   use spice ;
   spiceInit ( $file ) ;
      #returns 0 if initilization is successful and >0 otherwise.
      #check $spice::error in case of failure.

DESCRIPTION

CALLING spice.pm ROUTINES

   This package only cares about m, R, C, X, and subckts.
   spice-decks are ignored.

   This priliminary version of spice supports following subroutine
   calls-

   @subckt = getTopSubckts ( ) ;
      returns a list of subckts, top in the hierarchy.

   @subcktList = getSubcktList ( ) ;
      returns a list of subckts present in the netlist.

   $subcktDefn = getSubckt ( $subckt ) ;
      returns a string containing the definition of subckt.

   getResistors ( $subckt ) ;
      returns a hash containing the name and value of Resistors.

   getCapacitors ( $subckt ) ;
      returns a hash containing the name and value of capacitors.

   getTransistors ( $subckt ) ;
      returns a hash of transitor names and their types. i.e. n or p.

   getInstances ( $subckt ) ;
      returns a hash of instantion name and their subckt names.

ERROR HANDLING

   All these subroutines return a value less than 0 upon failure.

   you may want to check following strings for the reason-
   $spice::error
   $spice::warn

   You may want to set $spice::verbose to 1, for a detailed message on
   the standard output.

APPLICATION

This release o Extracting the hierarchy. o Traversing the netlist. o Creating html document for an easy naviagation of netlist. o any other appication, which requires netlist specific information.

Future release Current version does not support more than one netlist open at a time. Future version, (Object Oriented Design) shall support this feature. It can help developing the following applications- o Comparing two spice netlists. o extracting the netlist difference.

Here is the code of traversing the netlist-

use spice ; $spice::verbose = 0 ;

my $spiceFile ; my $subckt ;

if ( $#ARGV < 0 ) { while (1) { print "Enter spice file:" ; $spiceFile = <STDIN>; chop $spiceFile ; last if ( length $spiceFile ) } print "Enter subckt name(default-top):" ; $subckt = <STDIN>; chop $subckt ; } else { $spiceFile = $ARGV[0] ; $subckt = $ARGV[1] ; }

my $init ; $init = spiceInit ( $spiceFile ) ; if ( $init == "-1" ) { print "$spice::error\n" ; exit 0 ; }

my @subckts ; ($subckt) ? ( @subckts = ( $subckt) ) : ( @subckts = getTopSubckts() ) ;

foreach $subckt ( @subckts ) { traverseHier ( $subckt, 0 ) ; }

sub traverseHier ( ) { my ( $node, $count ) = @_ ; my $i ; for ($i=0; $i<$count; $i++ ) { print "\t" ; } $count = $count + 1; print "$count.$node\n" ; my %subckts = getInstances ($node) ; my @children = values %subckts ; @children = removeDup ( @children ) ; undef %subckts ; if ( $#children < 0 ) { return ; } my $child ; foreach $child ( @children ) { traverseHier ( $child, $count ) ; } return ; }

sub removeDup { my ( @list ) = @_ ; my $part ; my %hash = ( ) ; foreach $part ( @list ) { $part =~ s/\s+//g ; $hash{$part} = 1 if ( length ( $part ) ) ; } @list = keys %hash ; return @list ; }

exit 0 ;

INTERNALS

   The netlist is parsed in two simple phases. First phase requires
   opening a temporary file, which is deleted soon after creating
   the data-structures. This was done to manage unusually large
   netlist, to reduce on run time memory requirements. (With earlier
   implementation, where I do not write any tmp files, I came across
   a testcase, which took huge memory to build the internal data
   structures.)

   You may have problems running the scripts using this package in the
   directories, where you do not have write permission. Please set
   $spice::tmpFile variable to a file name with absolute path, where
   you have write permissions.

   Top level instances are stored in a hypothetical subcircuit called
   B<top>. If you need to change this subcircuit name, please set the
   variable $spice::topSubckt to the name you desire.

LIMITATION

   As mentioned earlier, this package only cares about the circuit
   elements like Resistors, Capacitors and Transistors along with
   subcircuit deinition and instances. Everything else is ignored.

   user can open only one file at a time. Future version shall
   support opening more tha one netlist at a time.

AUTHOR

Rohit Sharma, srohit@cpan.org