diff --git a/doc/ngspice.texi b/doc/ngspice.texi
index ab5923b30..d4870e568 100644
--- a/doc/ngspice.texi
+++ b/doc/ngspice.texi
@@ -5037,8 +5037,8 @@ loaded. Currently valid resources are:
General Form:
@example
- save [all | output ...]
- .save [all | output ...]
+ save [all | allv | alli | output ...]
+ .save [all | allv | alli | output ...]
@end example
@@ -5049,11 +5049,16 @@ node is traced or plotted (see below) it is also saved. For backward
compatibility, if there are no save commands given, all outputs are
saved.
-When the keyword "all" appears in the save command, all default values
-(node voltages and voltage source currents) are saved in addition to any
-other values listed.
-
+When the keyword "all" or the keyword "allv", appears in the save command,
+all node voltages, voltage source currents and inductor currents are saved
+in addition to any other values listed. If the keyword "alli" appears in
+the save command, all devices currents are saved.
+Note: the current implementation saves only the currents of devices which
+ have internal nodes, i.e. MOSFETs with non zero RD and RS; BJTs with
+ non-zero RC, RB and RE; DIODEs with non-zero RS; etc. Resistor and
+ capacitor currents are not saved with this option. These deficiencies
+ will be addressed in a later revision.
@node Sens, Set, Save, Commands
@subsection Sens*: Run a sensitivity analysis
diff --git a/src/frontend/ChangeLog b/src/frontend/ChangeLog
index 3927215f3..dbd30e98e 100644
--- a/src/frontend/ChangeLog
+++ b/src/frontend/ChangeLog
@@ -1,3 +1,152 @@
+2001-02-07 Paolo Nenzi
+
+ * outitf.c: From a message Alan sento to the mailing list:
+ ---------- Forwarded message ----------
+ Date: Tue, 6 Feb 2001 11:11:56 -0000
+ From: "Gillespie, Alan"
+ Reply-To: ng-spice-devel@ieee.ing.uniroma1.it
+ To: "Ng-Spice-Devel (E-mail)"
+ Subject: [ng-spice-devel] Reference variable update in interactive mode
+
+
+ I've tweaked outitf.c so that the reference variable value
+ is updated to the screen in interactive mode. I forgot to
+ save the old version first, though, so I couldn't do a diff,
+ so I'm just attaching the whole new outitf.c file. Also, I've
+ updated the documentation as follows :-
+
+
+
+ Modifications to "outitf.c"
+ ---------------------------
+
+ A number of modifications have been applied to outitf.c in
+ order to achieve the following "improvements" :-
+
+ 1) Spice3, by default, saved all node voltages, including
+ nodes internal to the devices. These extra nodes add
+ dramatically to the amount of data saved, but don't add
+ significantly to the useful information about the circuit.
+ So, instead of saving these nodes, a "hack" has been
+ introduced which checks a new spice option, and either
+ discards the internal node, or saves some device currents
+ instead.
+
+ 2) During long simulations, spice would sit "staring back
+ blankly", giving no clue as to how well the simulation
+ was, or wasn't, proceeding. In order to give a little
+ more feedback, another "hack", in the data writing routine,
+ writes the value of the reference variable to the error
+ stream, which is usually the screen. In order to minimize
+ the CPU time "wasted" doing this, the routine will only
+ reprint the value if more than a quarter of a second since
+ the last screen update. The result is that this feedback
+ adds no significant extra time to performance of the
+ simulation.
+
+ 3) The original file writing routines used to write each data
+ value to the file individually. A buffering scheme was added,
+ which collects each row of data in a buffer, and the writes
+ the whole buffer in one call. This gave a significant
+ performance improvement (up to 20%) on HPUX, with all currents
+ saved in large circuits, although there was no significant
+ difference on Windows 95. The improvement has not been
+ measured on Linux.
+
+ 4) A check was added to make sure the file write was successful.
+ Spice3 could easily fill the hard disk, but would continue to
+ churn away, producing no more useful data. Now it will exit
+ gracefully. I can't remember why I thought this was important,
+ but at least it means that a PC with power management will be
+ able to power down after a long overnight simulation has
+ ceased to produce any more useful data.
+
+ Changes
+ -------
+ The routine beginPlot is called at the beginning of the simulation
+ to select which nodes and variables will be saved. The first
+ modification is at the point where it checks the "save" list. This
+ is the list of tokens attached to the .save lines read from the
+ spice source file. The routine now checks for "allv" and "alli"
+ as well as "all". "allv" is treated as a synonym for "all". If
+ "all" or "allv" is found, then a saveall flag is set, and if "alli"
+ is found then a new savealli flag is set.
+
+ Next, the addDataDesc routine is called for every variable to be
+ saved. This is done by stepping through an array called dataNames[].
+ I'm not quite sure where this array comes from, but it was quite
+ easy to add an if statement to stop it calling addDataDesc if
+ dataNames[i] points to a string containing any of the following -
+
+ #internal
+ #source
+ #drain
+ #collector
+ #emitter
+ #base
+
+ That seems to catch all the internal device nodes.
+ The next addition is a new pass through the dataNames[] array
+ specifically looking for those strings. (This pass is only performed
+ if the savealli flag has been set). When one of the strings is found,
+ a bunch of if-then-else statements creates a corresponding string
+ which is submitted to the add addSpecialDesc routine. This saves the
+ relevant device current. Note that since mosfets have only two
+ internal nodes, but four terminal currents, and bipolars have three
+ internal nodes and four terminal currents, some internal nodes have
+ to save more than one terminal current.
+
+ This last change is a clumsy hack, and only works if the devices in
+ question actually have internal nodes. Resistors and capacitors, for
+ instance, never have internal nodes, and so their terminal currents
+ will not cannot be saved with the .save alli card. Also, any bipolar,
+ mosfet or diodes with zero valued parasitic resistances (rd, rs, rc,
+ rb, re) will not be allocated internal nodes, and so their terminal
+ currents will not be saved by this hack, either.
+
+ Further down outitf.c, the OUTpData routine is called whenever a
+ new row of data is ready to be written to file. Near the top of this,
+ the reference variable is written to file separately from the rest of
+ the variables. This is a convenient point for a couple of statements
+ which check the elapsed time since the last update, and write the
+ reference value to stderr if it's time. Slightly further down the
+ routine is the section for writing data to a "plot", i.e. retaining
+ it in memory. A similar statement or two writes the reference value
+ to the screen for this case, i.e. interactive mode. At the end of the
+ OUTpData routine, a new check has been added to see if there was an
+ error writing to the rawfile. If so, the shouldstop flag is set to
+ TRUE, and the simulation will abort.
+
+ Scanning down outitf.c, the next modification is in the fileInit
+ routine. The first statement initialises the lastclock variable.
+ This is used later when deciding if it's time to write the reference
+ value to the screen.
+
+ Next, the fileInit_pass2 routine writes the name strings to the start
+ of the rawfile. At the end of this routine there is now a statement
+ which checks if this will be a binary rawfile, and if so, it allocates
+ a row buffer of the correct length.
+
+ The fileStartPoint routine seems to be called before each row of data
+ is written, and so this is a convenient point to reset the buffer
+ pointer to zero.
+
+ The fileAddRealValue and fileAddComplexValue routines now simply write
+ the relevant values to the buffer, and increment the buffer pointer.
+ Previously they called the fwrite library routine to actually write
+ the data. If the rawfile is not a binary one, however, they just write
+ the text as before.
+
+ The fileEndPoint routine was previously empty. Now it actually calls
+ fwrite to write the whole buffer to the file (if it's a binary file).
+
+ Finally the fileEnd routine prints the total number of data points to
+ the screen, and de-allocates the row buffer (if it was a binary
+ rawfile).
+
+ Congratulations to whoever put these dummy routines in in the first
+ place, since that allowed the buffering to be added very easily.
+
2001-01-23 Paolo Nenzi
* subckt.c: added some code (very, very experimental)
diff --git a/src/ngspice.txt b/src/ngspice.txt
index 8588c7500..83cdc5395 100644
--- a/src/ngspice.txt
+++ b/src/ngspice.txt
@@ -4670,12 +4670,19 @@ TEXT: H traced or plotted (see below) it is also saved. For
TEXT: H backward compatibility, if there are no save commands
TEXT: H given, all outputs are saved.
TEXT: H
-TEXT: H When the keyword "all" appears in the save command,
-TEXT: H all default values (node voltages and voltage source
-TEXT: H currents) are saved in addition to any other values
-TEXT: H listed.
-TEXT: H
-TEXT: H
+TEXT: H When the keyword "all" or the keyword "allv", appears in
+TEXT: H the save command, all node voltages, voltage source
+TEXT: H currents and inductor currents are saved in addition to
+TEXT: H any other values listed. If the keyword "alli" appears
+TEXT: H in the save command, all devices currents are saved.
+TEXT: H
+TEXT: H Note: the current implementation saves only the currents
+TEXT: H of devices which have internal nodes, i.e. MOSFETs
+TEXT: H with non zero RD and RS; BJTs with non-zero RC, RB
+TEXT: H and RE; DIODEs with non-zero RS; etc. Resistor and
+TEXT: H capacitor currents are not saved with this option.
+TEXT: H These deficiencies will be addressed in a later
+TEXT: H revision.
SUBJECT: Sens
TITLE: Sens*: Run a sensitivity analysis