In order to work in Xyce, several things in the BSIM SOI 4.6.1 code
needed modification.  These are documented here:


- Xyce/ADMS now supports the $port_connected function to specify
  optional nodes, and as of Xyce 7.2 we are supporting the BSIM-SOI
  4.6.1 in 5-, 6-, and 7- node configurations.  However, some of these
  configurations do not work correctly when SOIMOD=2.  In SOIMOD=2,
  the P and B body tie nodes are unused.

  The BSIM group has attempted to make the unused nodes collapse to
  ground in this case, but Xyce cannot collapse externally specified
  nodes to ground.  While it would possible for Xyce simply to
  ignore contributions to such nodes *as if* they had been collapsed
  to ground, doing so frequently leads to singular matrices and severe
  convergence problems.  Finally, the pattern of node collapse in the
  BSIM-SOI makes it very difficult for Xyce/ADMS to support both the
  normal internal node collapses and the collapse of optional nodes to
  ground.  For these reasons, Xyce will instead emit a fatal error message 
  and instruct the user to remove the unused external nodes when SOIMOD=2.

  When SHMOD=0 (self-heating off) and a temperature node is provided
  on the instance line, there is a similar problem --- specifying
  TNODEOUT=1 and SHMOD=0 will therefore also cause a fatal error to be
  emitted with instructions to remove the unused external node.

  Further, Xyce cannot support the TNODEOUT option of the BSIM-SOI when
  when fewer than 7 nodes are specified.  It will exit with a fatal error
  message explaining the problem.

  These changes from the original BSIM-SOI code are isolated in the
  sections of the source code conditional on "$port_connected."

- Several parameters designated as "instance" type in the Verilog-A
  source are also designated "Model" in the BSIM SOI documentation.
  These parameters have been given additional attributes to allow Xyce
  to treat them as both model and instance parameters.  If the model
  parameter is given and the instance not given, the instance
  parameter's value is set from the model parameter.  If the instance
  parameter is given, it is used as given.

- Bias-independent code has been wrapped in an ADMS-specific
  "@(initial_instance)" pseudo-event.  Doing so assures that this code
  is only executed when necessary --- at code initialization or
  whenever an instance or model parameter changes as part of a .STEP
  analysis.  As a consequence of this change, a line of code setting
  "DevTemp" to the ambient temperature needed to be duplicated both in
  the initial_instance and main body of the code.

- Explicit use of a multiplicity factor has been introduced.  Xyce
  does not have implicit multiplicity for devices, and requires that
  every device implement it explicitly.

- Several contributions contained both static and dynamic (ddt())
  terms, which ADMS and Xyce/ADMS mishandle.  These contributions were
  broken up into separate static-only and dynamic-only contributions.

- A number of model and instance parameters were defined with no
  parameter range, but in fact the model would behave badly if they
  were ever negative.  Appropriate ranges of either (0:inf) (excluding
  zero) or [0:inf) (including zero) were attached to these parameters.  This
  will result in Xyce emitting warnings if parameters are set outside these
  ranges.  Simulation will likely fail, but at least the user will know what
  they did wrong.

- A number of model and instance parameters were defined with no
  parameter range, but in fact the model divides by them and would
  behave badly if they were ever zero.  Appropriate ranges of either
  (0:inf) or [1:inf) were attached to these parameters.  This will
  result in Xyce emitting warnings if parameters are set outside these
  ranges.  Simulation will likely fail, but at least the user will
  know what they did wrong.

