The simulation concept is divided into two steps:
After the basic part of the configuration is finished, the boundaries have to be tested since their condition values must have different signs. Note the optional argument maxCount of the frequency stepping function. It is now set to , which forces the simulator to give additional information on the stepping and which restricts each voltage step to three frequency steps being the minimal conditional simulation.
Thus, the boundaries as defined in tables lower and higher of each voltage step can be tested. After each step the simulator gives detailed information on the steps, for example
Conditional Stepping Information: Interval [ 1.500e+08, 2.000e+08] Values = [ 3.257e-01, -4.488e-03]
and in case of invalid boundaries a similar error message, for example
#### mmnt: Invalid range for step condition (count=1) #### mmnt: Interval [ 1.000e+06, 4.000e+06 ] #### mmnt: Values = [ 4.150e+00, 2.893e-01]
Obviously, the only remedy for these errors is adjusting the boundaries. In case of the extraction as presented in this work the first condition value must be positive (lower frequency means higher ), the second one must be negative. If both conditional values are positive, the frequencies should be increased, in case of the opposite, they should be decreased. Note, performance is directly proportional to the narrowness of the boundaries.
A useful feature to speed up the configuration process is to adapt the start index value that should always be the index of the (latest) erroneous index. For example, indices 0 and are processed successfully, but index fails, the start index should be set to :
index = step(2, <Number of Steps n>, 1);
If the complete simulation is done, the start index should be reset to 0 and the maxCount argument should be set to a higher value, for example . Then, the simulation can be restarted again. Due to the narrow and tested boundaries it will be both fast, successful and as accurate as in the fourth argument of the stepping function given.
Conditional stepping has been extended by an automatic adaptation for the boundaries. Since it can be generally employed for several applications, for example threshold voltage extraction, the automatic adaptation is implemented as an input-deck-based feature (see Section B.4).
The example demonstrates the setup for the cut-off frequency extraction by conditional stepping (see also Appendix B.3).
index = step(0, 10, 1); vbtbl = [0.74, 0.76, 0.78, 0.80, 0.82, 0.84, 0.86, 0.87, 0.88, 0.90, 0.92]; lower = [1, 32, 15, 12, 3, 5, 20, 29, 29, 0.5, 0.5]; upper = [2, 35, 45, 13, 4, 9, 40, 30, 30, 10, 10] Vb = ~vbtbl[~index];
In order to step these three arrays simultaneously, it is necessary to introduce an index variable which is actually stepped. By using this index, the base voltage is then obtained by subscripting the vbtbl array. The Solve section of the input-deck should look like this:
Solve { ac = yes; +lb = ~lower[~index] * 1 Hz; // lower boundary +ub = ~upper[~index] * 1 Hz; // upper boundary frequency = stepCond(lb, ub, ~Curve.Response.beta - 1.0, 1e-2, maxCount = 3); }
The Curve section of the input-deck contains the calculation of variable beta:
Curve { file = "sim_out_ft.crv"; Response { +ic = abs(output("Device", "I", "C", ac = yes)); +ib = abs(output("Device", "I", "B", ac = yes)); +beta = ic/(ib + 1e-300A); } }
It is important to note that the currents are zero while the simulator is initialized. To prevent a division by zero, a very small and thus negligible current is added to the numerator in the beta assignment.