circuitRF Reference Guide

Yield

Give values a tolerance, mark which goals are specs, and find out how many builds of the design meet them — and which ones do not.

What the Yield panel does

The Yield panel (View ▸ Panels ▸ Yield, tabbed behind the Optimizer) runs the focused schematic many times — once per trial — with each toleranced value drawn afresh from its distribution, and counts how many trials meet the specs. It follows the focused schematic the same way Tuning and the Optimizer do.

To find which values are worth a tolerance before counting anything, start with the Sensitivity panel: it ranks what moves each spec in a handful of simulations, and its Run Yield on these brings you here.

Everything you set here — tolerances, correlations, which goals are specs, the run settings, the corners — is saved with the schematic, marks it changed and can be undone, one step per change. A run and its trial table are not: they belong to the session. A run never changes the schematic's values.

The five modes

The five buttons at the top choose what ▶ does:

Mode What a run reports
Monte Carlo The spread of every measurement and goal value over the trials. No pass or fail.
Yield The fraction of trials meeting every spec, with its confidence interval, overall and per spec.
Corners Every enabled corner evaluated once — or, with MC at each corner, a Monte Carlo at each.
Centering The designable values moved to where the most trials meet the specs, then checked on fresh trials.
DOE A design of experiments: which values move each spec and measurement, and how they interact.

Monte Carlo or Yield? A Monte Carlo answers how much does it vary — the spread of every measurement, whether or not anything is a spec. A Yield run answers how many pass, and needs at least one goal used as a spec. Both draw the same trials from the same seed, so a Yield run's spread is the Monte Carlo's.

Tolerances

A tolerance lives on the same entry as a value's tuning range and its optimizer flag: one row per value, in all three panels. A tolerance can be added three ways, and all three do the same thing:

A new tolerance is a Gaussian at ± 5 % for 3σ (a uniform ± 5 % on a whole-number value), with tuning and optimizing left off. Each row shows:

Column
Check Draw this value in every trial. Unticked, the tolerance is kept but the value stays at its nominal.
Distribution Gaussian, Uniform, Lognormal or Discrete. A whole-number value takes Uniform or Discrete only.
Spread How wide — see Writing a spread.
Nominal The schematic's value, in its unit.
Share After Contributions: this value's share of the spread of the selected spec.

⋮ ▸ Remove tolerance deletes the distribution and any correlation naming the value.

An edit the design cannot run is refused on the spot, with the same sentence circuitrf check prints for it — a lognormal on a value that is not positive, a Gaussian on a whole number, tolerances on both a rectangular and a polar part of one complex value. A complex value takes tolerances on its real and imaginary parts, or on its magnitude and phase.

Writing a spread

Type into the Spread box and press Enter:

You type Means
± 2 % Within 2 % of the nominal. On a Gaussian, at 3σ unless you say otherwise.
± 2 % at 2σ A Gaussian whose ± 2 % is two standard deviations.
σ 1 Ω A Gaussian or lognormal with a standard deviation of 1 Ω.
45 … 55 Ω Uniform between 45 Ω and 55 Ω (... works too).
4 … 8 by 2 Discrete: 4, 6 or 8, equally likely.
σ 2 %, trunc 3σ A Gaussian cut off at ± 3σ — drawn from the truncated distribution, never clipped.

A percentage follows the nominal when the nominal moves; an absolute value does not. An absolute value must be in the value's own kind of unit — a capacitance in pF, nF or F, say; ± 3 pF on a resistor is refused. A range needs Uniform or Discrete, a σ needs Gaussian or Lognormal, and a step needs Discrete: choose the distribution first. sigma may be written for σ.

Correlations

Correlations… (the link button) opens a grid of every toleranced value. Type a correlation coefficient ρ, between −1 and 1, above the diagonal; the cell below mirrors it. A set of correlations that cannot all hold at once is shown with the nearest set that can — which is what a run uses.

Kit statistics

A kit can carry its own spread: model parameters written as distributions, which every ordinary simulation reads at their nominal and a trial draws. Most kits keep them in a statistical section of their corner library — chosen in the Analyses panel's corner picker like any other corner (a stat section beside tt and ss, say). With it chosen, a Monte Carlo draws the kit's statistics as well as your own tolerances.

When the design's kits carry statistics, a Kit statistics row appears: Process (one draw per trial, shared by every device) and Mismatch (a draw per device per trial) can be switched off independently — to see how much of the spread each one causes. When a kit offers a statistical section that is not selected, Choose a corner… opens the corner picker in the Analyses panel. How a kit writes its statistics is in PDK authoring.

Library parts

A library part can carry its own spread: its model's values written as distributions. A Library parts group lists each placed part whose model has one, with every spread shown in the panel's own notation (C0 ± 5 % at 3σ). Each part draws once per placed instance. Untick a part to hold its own tolerances at nominal while every other spread keeps drawing; the statistics line records the parts held as nominalparts=TSTCAP,TSTRES. A part's draws are mismatch draws, so the Kit statistics' Mismatch switch holds them too.

A tolerance you add to a part's value in the Variables list (tol=part) is separate, and works as before.

Specs

A spec is a goal. Every goal is listed with its Use: two ticks, the same ones the Optimizer's goal row shows.

Ticked Reads
Opt only Opt The optimizer meets it; the yield and the Sensitivity panel ignore it.
Sensitivity / Yield only Sens/Yield The yield counts it and the Sensitivity panel ranks it; the optimizer ignores it.
Both All Every one of them — the default.

The last tick cannot be cleared: a goal nothing uses is one with Enabled off. A common way to work: centre the design with the optimizer against tight goals, then loosen copies of them, ticked Sensitivity / Yield only, for the yield analysis. Goals are written in the Optimizer; the pencil (Edit goals…) takes you there with the selected goal. After a run each spec shows its own yield and interval.

Run settings

Collapsed to one line (500 trials · seed 1 · random · target 95 %); the chevron opens them.

Setting
Trials How many. With auto-stop, the most it will run. Default 100.
Seed The same seed draws the same trials, on any machine. The dice picks a new one.
Sampling random; lhs (Latin hypercube — needs the trial count up front, so not with auto-stop); sobol (low-discrepancy).
Target % The yield the design should reach.
Confidence % Of the interval around the yield. Default 95.
Auto-stop Stop once the interval lies wholly above or below the target — after 50 trials at least.
Did not evaluate A trial that did not converge: Fail counts it as a fail; Warn leaves it out of the yield. Either way it is listed.
Save Which trials keep their full sweeps: auto, scalars, all, or the first N.
Parallel How many trials run at once.

Running, pausing and reading the yield

▶ starts the run; ⏸ finishes the trials in flight and holds, and pressing it again carries on exactly as if it had never paused; ■ stops and keeps every trial already finished. The header shows trials done, elapsed time and an estimate of the time left. In Yield mode the readout shows the yield, its interval as a bar with the target marked on it, and how many trials did not evaluate. Every open Data Display holding the result follows the run live, with a Yield chip.

Reading the yield. The yield is the fraction of trials that met every spec, and the interval around it is where the true yield lies, at the chosen confidence, given only that many trials: 86.4 % [83.1 %, 89.3 %] from 500 trials. The interval narrows with the square root of the trial count — four times the trials for half the width. The target is met when the yield is at or above it; when the interval still straddles the target, the trial count cannot tell the two apart, and more trials, or Auto-stop, will. With Auto-stop on, the run ends as soon as the interval lies wholly on one side of the target, so a design far from the target stops early and one close to it runs to the trial limit.

Trials that did not evaluate. A trial whose simulation did not converge has no value to judge. By default it counts as a fail, because a part that does not simulate is rarely a part that works; with Did not evaluate: Warn it is left out of the count instead. Either way the count is shown beside the yield and every such trial is listed in the table with the reason.

The result is written beside the schematic as <name>.yield.npy — the same file circuitrf yield writes for the same schematic and seed, byte for byte.

The trial table

During and after a run, one row per trial: its number, pass or fail, the spec it is tightest on and its margin there, or why it did not evaluate. Sort by trial or by margin (tightest first); the funnel shows fails only. Selecting a row highlights that trial in every plot of the result, and picking a trial on a plot selects its row. Right-click a row for:

Contributions (the bar-chart button) ranks, once, which toleranced values drive the selected spec, and fills each variable's Share bar. With correlated tolerances a fitted share can come out above 100 % or below 0; the bar shows it between 0 and 100 %.

The yield display

Open yield display (the chart button, also offered once at the end of the first run) creates a Data Display beside the result, <name>.yield.cdd, or brings it forward if it exists. It holds, for each spec, every trial's curve coloured pass and fail with the nominal and the spec's limits; a histogram of each spec's worst value with its limits; a yield sensitivity over the value that drives the first spec most; and the statistics table. Every plot is an ordinary one: change it as you would any other — see the Data Display.

After Corners with MC at each corner, the display is <name>.yield.corners.cdd, with one tab per corner holding these plots for that corner's trials, and it opens on the corner with the lowest yield. A corner run without Monte Carlo has no trials, so the button is disabled and its tooltip says so.

The figures below are the shipped example's bandpass filter (The example), 500 trials at its saved seed. Each spec's trials come first, every trial's curve drawn grey when it passes and red when it fails, the failures on top so none is hidden, with the nominal design and the spec's limit over them:

circuitRF - Data Display BandpassYield.yield circuitRF 0.9 1 1.1 -2 -1.6 -1.2 -0.8 -0.4 0 PassbandSpec ≥ -1 PassbandSpec: trials freq (GHz) SP1.S(2,1) dB20 — 432 pass · 68 fail circuitRF - Data Display BandpassYield.yield circuitRF 0.9 1 1.1 -2 -1.6 -1.2 -0.8 -0.4 0 PassbandSpec ≥ -1 PassbandSpec: trials freq (GHz) SP1.S(2,1) dB20 — 432 pass · 68 fail
The passband spec's 500 trials coloured by pass, zoomed to the passband: passes grey, the 68 failures red and drawn on top, the nominal in the trace's own colour and the -1 dB limit dashed across the band.

Then each spec's worst value as a histogram, with the limit as a dashed line. Read it for how far the bulk of the trials sits from the limit, and on which side the tail lies:

circuitRF - Data Display BandpassYield.yield circuitRF -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 0 20 40 60 80 PassbandSpec ≥ -1 PassbandSpec: worst value bin (dB) -32 -30 -28 -26 -24 -22 0 10 20 30 40 50 60 70 StopHighSpec ≤ -22 StopHighSpec: worst value bin (dB) circuitRF - Data Display BandpassYield.yield circuitRF -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 0 20 40 60 80 PassbandSpec ≥ -1 PassbandSpec: worst value bin (dB) -32 -30 -28 -26 -24 -22 0 10 20 30 40 50 60 70 StopHighSpec ≤ -22 StopHighSpec: worst value bin (dB)
Each spec's worst value as a histogram, with its limit. The passband spec straddles its limit, which is where its yield is lost; the high stop band sits 9 dB clear of its own.

And the statistics table — mean, σ, the extremes, percentiles and Cpk of each spec's worst value:

circuitRF - Data Display BandpassYield.yield circuitRF quantity statistics.mean statistics.sigma statistics.min statistics.max statistics.median statistics.p1 statistics.p99 goal:PassbandSpec:worst -0.7804 0.1944 -1.637 -0.4743 -0.7319 -1.32 -0.5061 goal:StopHighSpec:worst -31.15 0.322 -32.01 -30.06 -31.14 -31.83 -30.48 quantity statistics.skew statistics.kurtosis statistics.cpk statistics.sigma_to_limit statistics.yield statistics.lower statistics.upper goal:PassbandSpec:worst -1.064 0.975 0.3765 1.13 0.864 0.8308 0.8928 goal:StopHighSpec:worst 0.03398 -0.3488 9.472 28.42 1 0.9926 1 circuitRF - Data Display BandpassYield.yield circuitRF quantity statistics.mean statistics.sigma statistics.min statistics.max statistics.median statistics.p1 statistics.p99 goal:PassbandSpec:worst -0.7804 0.1944 -1.637 -0.4743 -0.7319 -1.32 -0.5061 goal:StopHighSpec:worst -31.15 0.322 -32.01 -30.06 -31.14 -31.83 -30.48 quantity statistics.skew statistics.kurtosis statistics.cpk statistics.sigma_to_limit statistics.yield statistics.lower statistics.upper goal:PassbandSpec:worst -1.064 0.975 0.3765 1.13 0.864 0.8308 0.8928 goal:StopHighSpec:worst 0.03398 -0.3488 9.472 28.42 1 0.9926 1
The statistics table: one row per spec's worst value, one column per statistic. Split in two here to fit the page; in the display it is one table.

Which plot answers which question

Every plot below is on a trace card's Statistics button, over any trace of the result — see Monte Carlo statistics and trials for the menus. It is the bar-chart button under the card's remove button:

Spec lines + Trace Freq GHz SP1 S trial X Fam Fix freq (GHz) X Fam Fix i (port) X Fam Fix 2 j (port) X Fam Fix 1 vs X dB20 dB20(SP1.S[~, :, 2, 1]) 1.00 1.50 Autoscale Spec lines + Trace Freq GHz SP1 S trial X Fam Fix freq (GHz) X Fam Fix i (port) X Fam Fix 2 j (port) X Fam Fix 1 vs X dB20 dB20(SP1.S[~, :, 2, 1]) 1.00 1.50 Autoscale
The trace card of a trace over a Monte Carlo result. The bar-chart button under the remove button is Statistics: histogram, CDF, normal quantile, yield sensitivity, colour by, envelope and scatter.
Question Plot
How is a spec's worst value spread, and how far is it from the limit? Histogram of goal:<spec>:worst, with the limit as a dashed line
What fraction of parts land below a value? CDF — read the yield at any limit straight off it
Is the spread Gaussian, or does a tail reach further? Normal Quantile — a straight line when it is Gaussian
Which nominal would give more yield? Yield Sensitivity vs a value — the yield in each bin of that value; the nominal sits best under the tallest bars
Where across the band do parts fail? The trials as a family, Colour By ▸ Pass / Fail
What does the band look like across thousands of trials? Envelope (P1–P99, say) with Show Curves off
Does one value drive a spec, and in which direction? Scatter vs that value, with Fit Line
Which values matter most? Contributions — each value's share, largest first

Yield Sensitivity vs a value bins the trials by that value and shows the yield in each bin, with the number of trials per bin on the right axis. Bins at the edges hold few trials, so read their yield loosely:

circuitRF - Data Display BandpassYield.yield circuitRF 24p 24.2p 24.4p 24.6p 24.8p 0 1.67 20 15 40 28.3 60 41.7 80 55 100 68.3 Yield vs C1.C bin (F) bin circuitRF - Data Display BandpassYield.yield circuitRF 24p 24.2p 24.4p 24.6p 24.8p 0 1.67 20 15 40 28.3 60 41.7 80 55 100 68.3 Yield vs C1.C bin (F) bin
Yield sensitivity: the yield in each bin of C1.C's drawn value (bars, left axis) and the trials in each bin (right axis).

With thousands of trials an Envelope reads better than the curves themselves — here the band 98 % of built filters fall inside, around the median, with Show Curves off:

circuitRF - Data Display BandpassYield.yield circuitRF 0.9 1 1.1 -2 -1.6 -1.2 -0.8 -0.4 0 PassbandSpec ≥ -1 PassbandSpec: P1–P99 envelope freq (GHz) SP1.S(2,1) dB20 — 432 pass · 68 fail circuitRF - Data Display BandpassYield.yield circuitRF 0.9 1 1.1 -2 -1.6 -1.2 -0.8 -0.4 0 PassbandSpec ≥ -1 PassbandSpec: P1–P99 envelope freq (GHz) SP1.S(2,1) dB20 — 432 pass · 68 fail
The same trials as a P1-P99 envelope around their median, with the curves turned off: the band that 98 % of built filters fall inside.

A contribution is a straight-line fit. When a spec gets worse whichever way a value moves — a filter's passband edge as a resonator is detuned either way, say — the fit explains little (a low R² in the label) and the shares say little; the scatter shows the shape.

Corners

In Corners mode the panel lists the schematic's corners — name, enabled, the kit sections, the temperature and the values each binds; a statistical corner shows the trial it replays. Generate… builds corners from every combination of the kit sections you tick, the temperatures and the values you type, and shows how many before it writes them. ▶ evaluates every enabled corner and shows a grid of corner × spec: the margin in each cell, failing cells red, each spec's worst corner in bold. With MC at each corner, the grid shows each spec's yield at each corner instead.

A library part's corners. A part whose model declares corners — its min and max, say — offers them in two places. On the placed part, the Parameter Editor's Corner chooses one for that instance; a value you set on the same instance still wins, and its row reads overrides corner min. In a bench corner, part:<part number>=<corner> sets the corner of every instance of that part, as parts from one lot, overriding each instance's own choice:

corner slow temp=85 part:TSTCAP=max

Generate… lists each placed part with corners as an axis, a tick box per corner, crossed with everything else. With MC at each corner, a part whose corner the corner sets holds its own tolerances at nominal there — the corner is its limit — while every other spread draws.

A statistical corner replays one trial. Save as corner… on a trial's row (or on a plot) makes a corner that applies that trial's draws — the offset of each toleranced value from its nominal, and the kit's draws — around whatever the design's values are now, so it follows the design as you tune it. Save the worst trial of a run as a corner, and the optimizer can design against it.

Optimizing and tuning across corners

The Optimizer can meet every goal at every corner at once: set Corners in its settings to all, or to names. Each point it tries then costs one simulation per corner, and each goal names the corner that binds it. In Tuning, Evaluate at moves the sliders' simulations to one corner, so you can tune where the design is worst.

A goal met at a corner with no margin is met there only at the corner's nominal: the parts' tolerances still push about half of the builds below it. Run MC at each corner after optimizing to see that corner's yield, and give the goal margin where it binds.

Centering

Centering moves the values you let the Optimizer move — those with Opt ticked, within their ranges — to wherever the most trials meet the specs, while their tolerances move with them. The list shows each such value with its range and its tolerance beside it, and the toleranced values that stay put.

Every position the search tries is judged on the same set of trials, so two positions differ by the design and not by luck. The chart beside the status line is the best yield found at each iteration. At the end, the starting values and the centred ones are each run on the same set of fresh trials, and the panel shows both: start yield [interval] → centred yield [interval]. That pair — never the search's own figure — is the result. If the two intervals overlap, the gain is not resolved at that many trials; raise Verify to settle it.

A value set to a standard series (E6, E24, E96 and so on) is searched continuously, and its centred value then lands on the series: the search tries the series values either side of where it stopped and keeps whichever scores best. The trials around it still vary continuously within its tolerance, as a real part does. After Stop the value stays where the search left it.

The digits button beside Send to Tuning sets how many significant figures the centred values show. Lock in, Push and Send to Tuning keep them to the same figures. It is the same setting as the Tuning and Optimizer panels' digits, saved with the schematic.

The chevron opens the centering settings: the search method, the trials each position is judged on, the trials of the final check, the iteration and simulation limits, and Surrogate. With quadratic, each position costs a dozen simulations or so instead of one per trial: circuitRF fits each spec to a smooth curve through a few runs and counts the yield on the curve. It is much faster with a handful of toleranced values and specs that change gently, and it never decides the answer — the final check is still simulated. When the curve fits a spec poorly for three iterations running, the search goes back to simulating every trial and says so.

When it finishes, Lock in keeps the centred values as a preset, Push writes them into the schematic (one undo step), and Send to Tuning loads them into the Tuning sliders.

Design of experiments

DOE runs the schematic at a planned set of combinations of a few values — its factors — and works out which of them move each spec and measurement, and how they interact. The factors are the values with Opt ticked, each set to the low and high ends of its range, or — with Factors: tolerances — the toleranced values, each set to its nominal ± k σ: a quick look at which tolerances matter, in a handful of runs instead of a Monte Carlo.

Before you run, the panel lists the factors with the letter each is called by, their low, centre and high values, and how many runs the design takes. The chevron chooses the design:

Design Use it for
Full factorial A few factors (up to 10): every combination of low and high.
Fractional More factors in fewer runs. IV keeps each value's own effect apart from the interactions; V keeps the interactions apart from each other too.
Plackett–Burman Screening many factors (up to 23) in 12, 20 or 24 runs.
Composite (ccf) A curved model of a few factors — to find where the specs are best met.

Centre points add runs at the middle of every range; they show whether a response curves. A simulation gives the same answer every time, so nothing is repeated and the order does not matter.

After a run, the Effects list shows, for the chosen spec or measurement, each value's effect — how much it changes from low to high — and each pair's interaction, largest first. Effects in bold are larger than the noise level estimated from the small ones. A fractional or Plackett–Burman design cannot tell some effects apart; those are listed beside the effect they are mixed with, and its tooltip has the full list. The display button opens, for each spec, the effects as bars with the noise level as a line, the response at each value's low, centre and high, and the strongest interaction.

A good order is Plackett–Burman first to find the few values that matter, then Composite on just those. Model optimum (crosshair) then searches the fitted model for where the specs are best met inside the ranges, and checks that point with one real simulation — the panel shows what the model predicted beside what the simulation gave. Send to Tuning loads the point into the Tuning sliders; Send to Optimizer makes it where the Optimizer's next run starts.

The example

File ▸ New ▸ Examples ▸ Yield, Corners and Centering is a workspace with one bench per part of this page, each run taking a second or two: a bandpass filter estimated against specs loosened from its optimizer goals, with its one-click yield display saved; an amplifier with six generated temperature and supply corners and a statistical corner, failing hot at low supply until it is optimized across all of them; a bias divider centred from 73 % to 99 %; and an amplifier and spiral inductor, both Touchstone blocks, for the Sensitivity panel. Its README walks through each with the numbers a run gives.

From the command line, and from an agent

Everything the panel runs, circuitrf yield runs too — yield mc, yield estimate, yield corners, yield center (with --surrogate quadratic), yield doe and yield trial — and an agent runs the same through MCP. See the command line and AI agents.