Overview

Sensitivity can be calculated from a solution of the adjoint system, see “Computer Methods for Circuit Analysis and Design (Vlach and Singhal)”.

Essentially, an (infinitesimal) change in a parameter p can be thought as a (infinitesimal) current injected into the network. an observable can be thought as a function f of the voltage vector v. if f is linear, then, ignoring the offset, it can be written as a scalar product s=< F, v >=<F, Gi>=<G^t^-1 F, i> with some vector F. but then df/dp=<G^t^-1 F, di/dp>

now fix an observable, compute G^t^-1 F (use BSMATRIX::fbsubt), then visit the components that depend on a parameter, get the injected current and evaluate the scalar product. the result is the sensitivity of the observable wrt the parameter…

In gnucap spice mode it may look like this:

include netlist.ckt
.print dc v(nodes)
.dc
.print sens R(R1) W(MN1)
.sens v(node0) v(node1)

calculates the sensitivities of node voltages with respect to device parameters.

Implementation

the .sens command is similar to the ac command. it expects a dc operation point to be computed already. It loads the acx matrix and does an lu decomposition. then for all outputs it solves the adjoint system using Gennadys fbsubt() and iterates the probelist. the solution is stored in double _sim→_sens[numberofnodes].

devices need to provide a XPROBE sens_probe_ext(string) const for this to work. this function uses the adjacent values from sim→_sens.

there's a “sens” command in gnucap-sim, http://git.savannah.gnu.org/cgit/gnucap/gnucap-plugins.git/log/?h=sim. it uses ad hoc modified components exploring the usefulness of the probe rework. needs more thought before porting upstream.

- need new probe semantics, but output rework is not ready yet - parameter sensitivities (derivatives for expressions are not implemented) - need “parameter probes” to maintain spice command semantics.