chiark / gitweb /
genspic
authorianmdlvl <ianmdlvl>
Wed, 24 Mar 2004 23:53:41 +0000 (23:53 +0000)
committerianmdlvl <ianmdlvl>
Wed, 24 Mar 2004 23:53:41 +0000 (23:53 +0000)
debian/changelog
scripts/Makefile
scripts/genspic2gnuplot [new file with mode: 0755]
scripts/gnucap2genspic [new file with mode: 0755]
scripts/gnucap2gnuplot

index 6e47097bd7fa32a6a95de7411884af430fac9027..5ff5150591d0ef726ef8b315a8840e5fb6fb7a08 100644 (file)
@@ -1,5 +1,6 @@
 chiark-utils (4.0.99.0.6) unstable; urgency=low
 
+  * gnucap2gnuplot split with new genspic intermediate format.
   * gnucap2gnuplot script.
 
  --
index 0d47c5f7b4ec4f13df528a007ac09e344b4fe4b3..9a465f0b7c89f875cd3cac9b7eab37e655ae8fd7 100644 (file)
@@ -21,7 +21,7 @@
 
 include ../settings.make
 
-SCRIPTS=       palm-datebook-reminders gnucap2gnuplot
+SCRIPTS=       palm-datebook-reminders gnucap2genspic genspic2gnuplot
 MANPAGES1=     palm-datebook-reminders
 
 CSCRIPTS=      named-conf
diff --git a/scripts/genspic2gnuplot b/scripts/genspic2gnuplot
new file mode 100755 (executable)
index 0000000..86df13e
--- /dev/null
@@ -0,0 +1,128 @@
+#!/usr/bin/perl
+#   genspic2gnuplot - Copyright 2004 Ian Jackson - see below
+#
+# Reads a `genspic' file on stdin.  Takes exactly one arg, <pfx>.
+#
+# Produces various output files:
+#  <pfx>.gnuplots.sh                     run this to display results
+#  <pfx>,<Kind><N>.gnuplot-cmd           gnuplot script for displaying:
+#  <pfx>,<Kind><N>-<M>.gnuplot-data      gnuplot-format input data
+#  <pfx>,gnuplot-fifo                    working fifo for .gnuplots.sh
+# where
+#  <Kind> is Freq or Time (according to the type of analysis)
+#  <N>    is the count, starting at 0, of which report this is from gnucap
+#  <M>    is the individual column of Y data
+#
+# Limitations
+#
+#  There's no easy way to mess with the gnuplot settings.
+#
+#  This whole scheme is very clumsy.  There should be a driver program
+#  with command-line option parsing.
+
+# This program and its documentation are free software; you can
+# redistribute them and/or modify them under the terms of the GNU
+# General Public License as published by the Free Software Foundation;
+# either version 2, or (at your option) any later version.
+# 
+# This program and its documentation are distributed in the hope that
+# they will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.  See the GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+die unless @ARGV==1;
+die if $ARGV[0] =~ m/^\-/;
+
+($ofb)= @ARGV;
+$sof= "$ofb.gnuplots.sh";
+open A, "> $sof" or die $!;
+system 'chmod','+x',"$sof"; $? and die $?;
+print A <<END
+#!/bin/sh
+set -e
+fi=$ofb,gnuplot-fifo
+rm -f \$fi
+mkfifo -m 600 \$fi
+END
+    or die $!;
+
+for (;;) {
+    ($c,@s)= split /\s+/, <STDIN>;
+print STDERR ">$c< >@s<\n";
+    if ($c eq 'S') {
+       ($cplot,$logy2,@columns) = @s;
+       unshift @columns, 'x:';
+       @mmm= map { s/^(\w+)\:// or die; $1; } @columns;
+       open S, "> $ofb,$cplot.gnuplot-cmd" or die $!;
+       print S <<END
+set data style linespoints
+set title '$cplot'
+END
+        or die $!;
+       print S "set logscale xy\n" or die $! if $logy2;
+       print S "set y2tics autofreq\n" or die $! if grep { $_ eq 'y2' } @mmm;
+       undef %min;
+       undef %max;
+       for ($yn=1; $yn<=$#columns; $yn++) {
+           open "O$yn", "> $ofb,$cplot-$yn.gnuplot-data" or die $!;
+       }
+    } elsif ($c eq 'T') {
+       die unless @mmm;
+       die if @s;
+       foreach $mmm (keys %min) {
+           print S "set ${mmm}range [$min{$mmm}:$max{$mmm}]\n" or die $!;
+       }
+       $sep= "plot ";
+       for ($yn=1; $yn<=$#columns; $yn++) {
+           close "O$yn" or die $!;
+           $mmm[$yn] =~ m/^y2?$/ or die "$mmm[$yn]";
+           $axes= $mmm[$yn]; $axes =~ s/^y$/y1/;
+           $yoff= 1-$yn;
+           print S "$sep\\\n".
+               " '$ofb,$cplot-$yn.gnuplot-data'".
+                   " axes x1$axes title '$columns[$yn]'"
+                       or die $!;
+           $sep= ',';
+       }
+       print S "\n\npause -1\n" or die $!;
+       close S or die $!;
+       print A "  gnuplot $ofb,$cplot.gnuplot-cmd <\$fi &\n" or die $!;
+       @mmm=@columns=();
+    } elsif ($c eq 'D') {
+       die unless @mmm;
+       @numbers= @s;
+print STDERR "$#numbers $#columns.\n";
+       die unless @numbers == @columns;
+       for ($yn=0; $yn<=$#columns; $yn++) {
+           $_= $numbers[$yn];
+           $mmm= $mmm[$yn];
+           $min{$mmm}= $_ unless exists($min{$mmm}) && $min{$mmm} <= $_;
+           $max{$mmm}= $_ unless exists($max{$mmm}) && $max{$mmm} >= $_;
+           if ($yn) {
+               printf {"O$yn"} "%s %s\n", $numbers[0], $_
+                   or die $!;
+           }
+       }
+    } elsif ($c eq 'F') {
+       last;
+    } else {
+       die;
+    }
+}
+
+print A <<END
+exec 3>\$fi
+printf 'hit return to quit: '
+read
+exec 3>&-
+END
+    or die $!;
+close A or die $!;
+
+print ": generated ; $sof\n" or die $!;
+
+# $Id: genspic2gnuplot,v 1.1 2004-03-24 23:53:41 ianmdlvl Exp $
diff --git a/scripts/gnucap2genspic b/scripts/gnucap2genspic
new file mode 100755 (executable)
index 0000000..d7eed1e
--- /dev/null
@@ -0,0 +1,109 @@
+#!/usr/bin/perl
+#   gnucap2genspic - Copyright 2004 Ian Jackson - see below
+#
+# Reads the output from gnucap and outputs a `genspic' file
+# for use with genspic2gnuplot.  Takes no arguments or options.
+#
+# Limitations
+#
+#  Only Freq (.AC) and Time (.TRAN) plots have been tested.  If
+#   other types go wrong they can probably be fixed by adding code for
+#   them to startplot().
+#
+#  Displaying voltages and currents on the same .TRAN graph won't work
+#   well because they currently have to have the same Y scale.  This
+#   could be fixed by assigning carefully to $mmm in startplot().
+#
+#  This whole scheme is very clumsy.  There should be a driver program
+#  with command-line option parsing.
+
+# This program and its documentation are free software; you can
+# redistribute them and/or modify them under the terms of the GNU
+# General Public License as published by the Free Software Foundation;
+# either version 2, or (at your option) any later version.
+# 
+# This program and its documentation are distributed in the hope that
+# they will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.  See the GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+die if @ARGV;
+
+%facttimes= qw(f 1e-15
+              p 1e-12
+              n 1e-9
+              u 1e-6
+              m 1e-3
+              K 1e3
+              Meg 1e6
+              G 1e9
+              T 1e12);
+
+sub startplot () {
+    $logy2= 0;
+    for ($yn=1; $yn<=$#columns; $yn++) {
+       $mmm[$yn]= 'y';
+    }
+    if ($kind eq 'Freq') {
+       $logy2= 1;
+       for ($yn=1; $yn<=$#columns; $yn++) {
+           die unless $columns[$yn] =~ m/.*([MP])\(\d+\)$/i;
+           $mmm[$yn]= 'y2' if uc $1 eq 'P';
+       }
+    }
+    printf "S %s %d", $cplot, $logy2 or die $!;
+    for ($yn=1; $yn<=$#columns; $yn++) {
+       printf " %s:%s", $mmm[$yn], $columns[$yn] or die $!;
+    }
+    print "\n" or die $!;
+}
+sub endplot () {
+    return unless defined $kind;
+    print "T\n" or die $!;
+}
+
+$readahead= <STDIN>;
+for (;;) {
+    $linesofar= $readahead;
+    for (;;) {
+       $readahead= <STDIN>;
+       last unless $readahead =~ s/^\+//;
+       die unless length $linesofar;
+       $linesofar =~ s/\n$//;
+       $linesofar .= $readahead;
+    }
+    $_= $linesofar;
+    last unless length;
+    s/\s+$//;
+    
+    if (m/^\#(\w+)/) {
+       endplot();
+       $kind= $1;
+       @columns= split /\s+/;
+       $cplot= $kind.($counter{$kind}++);
+       startplot();
+       next;
+    } elsif (!defined $kind) {
+       next;
+    } elsif (s/^\s+//) {
+       @numbers= split /\s+/;
+       map {
+           if (m/^(\-?\d+\.\d*)([A-Za-z]+)$/) {
+               die "factor $2" unless exists $facttimes{$2};
+               $_= $1*$facttimes{$2};
+           }
+       } @numbers;
+       print "D @numbers\n" or die $!;
+    } else {
+       die "$_ ?";
+    }
+}
+die "no plots" unless defined $kind;
+endplot();
+print "F\n" or die $!;
+
+# $Id: gnucap2genspic,v 1.1 2004-03-24 23:53:41 ianmdlvl Exp $
index 7e97b498b008ca27915e2d962bb5ea247fd0eece..d9fc7118d3857eba29c1353de0fe7bdb8de3a4ed 100755 (executable)
@@ -1,56 +1,4 @@
 #!/usr/bin/perl
-# This is gnucap2gnuplot, which is Copyright 2004 Ian Jackson.
-# It's a script to postprocess the output from gnucap and then run gnuplot.
-#
-# gnucap2gnuplot and its documentation are free software; you can
-# redistribute them and/or modify them under the terms of the GNU
-# General Public License as published by the Free Software Foundation;
-# either version 2, or (at your option) any later version.
-# 
-# gnucap2gnuplot and its documentation are distributed in the hope that
-# they will be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-# PURPOSE.  See the GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-# usage:
-#    gnucap2gnuplot [<options>] input-file
-#
-# Input file should be a .cir file (will be put through gnucap)
-#  or an output file from gnucap.
-#
-# Produces various output files:
-#  <input-file>.gnuplots.sh                     run this to display results
-#  <input-file>,<Kind><N>.gnuplot-cmd           gnuplot script for displaying:
-#  <input-file>,<Kind><N>-<M>.gnuplot-data      gnuplot-format input data
-#  <input-file>,gnuplot-fifo                    working fifo for .gnuplots.sh
-# where
-#  <Kind> is Freq or Time (according to the type of analysis)
-#  <N>    is the count, starting at 0, of which report this is from gnucap
-#  <M>    is the individual column of Y data
-#
-# Options
-#   -g          do run gnucap     ) default is run gnucap
-#   -G          don't run gnucap  )  if input file ends in .cir
-#   -o<prefix>  use <prefix> instead of <input-file> in output filenames
-# If the input file is `-' then you may not specify -g and must use -o.
-#
-# Limitations
-#
-#  Only Freq (.AC) and Time (.TRAN) plots have been tested.  If
-#   other types go wrong they can probably be fixed by adding code for
-#   them to startplot().
-#
-#  Displaying voltages and currents on the same .TRAN graph won't work
-#   well because they currently have to have the same Y scale.  This
-#   could be fixed by assigning carefully to $mmm in startplot().
-#
-#  It's a bit clumsy.
-#
-#  There's no easy way to mess with the gnuplot settings.
 
 sub fail ($) { die "gnucap2gnuplot: $_[0]\n"; }
 
@@ -80,131 +28,6 @@ if (@ARGV) {
     fail("you must specify -o... when running from stdin") unless defined $ofb;
 }
 
-%facttimes= qw(f 1e-15
-              p 1e-12
-              n 1e-9
-              u 1e-6
-              m 1e-3
-              K 1e3
-              Meg 1e6
-              G 1e9
-              T 1e12);
-
-$sof= "$ofb.gnuplots.sh";
-open A, "> $sof" or die $!;
-system 'chmod','+x',"$sof"; $? and die $?;
-print A <<END
-#!/bin/sh
-set -e
-fi=$ofb,gnuplot-fifo
-rm -f \$fi
-mkfifo -m 600 \$fi
-END
-    or die $!;
-sub startplot () {
-    open S, "> $ofb,$cplot.gnuplot-cmd" or die $!;
-    print S <<END
-set data style linespoints
-set title '$cplot'
-END
-        or die $!;
-    $mmm[0]= 'x';
-    for ($yn=1; $yn<=$#columns; $yn++) {
-       $mmm[$yn]= 'y';
-    }
-    undef %min;
-    undef %max;
-    if ($kind eq 'Freq') {
-       for ($yn=1; $yn<=$#columns; $yn++) {
-           die unless $columns[$yn] =~ m/.*([MP])\(\d+\)$/;
-           $mmm[$yn]= 'y2' if $1 eq 'P';
-       }
-       print S "set logscale xy\nset y2tics autofreq\n" or die $!;
-    }
-    for ($yn=1; $yn<=$#columns; $yn++) {
-       open "O$yn", "> $ofb,$cplot-$yn.gnuplot-data" or die $!;
-    }
-}
-sub endplot () {
-    return unless defined $kind;
-    foreach $mmm (keys %min) {
-       print S "set ${mmm}range [$min{$mmm}:$max{$mmm}]\n" or die $!;
-    }
-    $sep= "plot ";
-    for ($yn=1; $yn<=$#columns; $yn++) {
-       close "O$yn" or die $!;
-       $mmm[$yn] =~ m/^y2?$/ or die "$mmm[$yn]";
-       $axes= $mmm[$yn]; $axes =~ s/^y$/y1/;
-       $yoff= 1-$yn;
-       print S "$sep\\\n".
-           " '$ofb,$cplot-$yn.gnuplot-data'".
-               " axes x1$axes title '$columns[$yn]'"
-           or die $!;
-       $sep= ',';
-    }
-    print S "\n\npause -1\n" or die $!;
-    close S or die $!;
-    print A "  gnuplot $ofb,$cplot.gnuplot-cmd <\$fi &\n" or die $!;
-    $kind= undef;
-}
-
-$readahead= <STDIN>;
-for (;;) {
-    $linesofar= $readahead;
-    for (;;) {
-       $readahead= <STDIN>;
-       last unless $readahead =~ s/^\+//;
-       die unless length $linesofar;
-       $linesofar =~ s/\n$//;
-       $linesofar .= $readahead;
-    }
-    $_= $linesofar;
-    last unless length;
-    s/\s+$//;
-    
-    if (m/^\#(\w+)/) {
-       endplot();
-       $kind= $1;
-       @columns= split /\s+/;
-       $cplot= $kind.($counter{$kind}++);
-       startplot();
-       next;
-    } elsif (!defined $kind) {
-       next;
-    } elsif (s/^\s+//) {
-       @numbers= split /\s+/;
-       die unless @numbers == @columns;
-       for ($yn=0; $yn<=$#columns; $yn++) {
-           $_= $numbers[$yn];
-           if (m/^(\-?\d+\.\d*)([A-Za-z]+)$/) {
-               die "factor $2" unless exists $facttimes{$2};
-               $_= $1*$facttimes{$2};
-               $numbers[$yn]= $_;
-           }
-           $mmm= $mmm[$yn];
-           $min{$mmm}= $_ unless exists($min{$mmm}) && $min{$mmm} <= $_;
-           $max{$mmm}= $_ unless exists($max{$mmm}) && $max{$mmm} >= $_;
-           if ($yn) {
-               printf {"O$yn"} "%s %s\n", $numbers[0], $_
-                   or die $!;
-           }
-       }
-    } else {
-       die "$_ ?";
-    }
-}
-die "no plots" unless defined $kind;
-endplot();
-print A <<END
-exec 3>\$fi
-printf 'hit return to quit: '
-read
-exec 3>&-
-END
-    or die $!;
-close A or die $!;
-$?=0; close STDIN; $? and fail("gnucap failed (code $?)");
 $sof= "./$sof" unless $sof =~ m,/,;
-print ": generated ; $sof\n" or die $!;
 
-# $Id: gnucap2gnuplot,v 1.3 2004-03-24 01:00:50 ianmdlvl Exp $
+# $Id: gnucap2gnuplot,v 1.4 2004-03-24 23:53:41 ianmdlvl Exp $