circuitRF Reference Guide

harmonicaRF

Interactive harmonic load-pull on a single device, at the speed of a mouse drag.

What it is

harmonicaRF answers one question, continuously, while your mouse is moving:

If I terminate this device like this at f₀, 2f₀, 3f₀ … on both the source and the load side, what is the current generator actually doing, and what does it cost me in power and efficiency?

Every other tool in this space is a post-process: set up a sweep, wait, read a static contour. harmonicaRF runs harmonic balance during the drag, so the relationship between a termination and the loadline is felt rather than inferred. The second thing that makes it different is that the intrinsic plane is the primary view — wherever it is meaningful you are shown the voltage and current of the current generator, not of the package terminals, because that is the plane a designer reasons in when inventing a termination strategy.

What it is not, stated plainly so you reach for the right tool:

It opens from circuitRF's Tools menu, works with or without a workspace open, and also ships as a standalone binary for people who want the instrument and nothing else.

Active load-pull, before you touch the bench

Used deliberately, harmonicaRF is an on-wafer active load-pull simulator.

An active load-pull bench synthesises the reflection it presents by injecting a signal back at the DUT, which is what makes harmonic terminations reachable at all on-wafer. It is also a bench on which it is entirely possible to present a device a termination that destroys it — or to walk probes across a wafer for hours collecting points that were never going to be interesting.

The practical argument for exploring first, in a tool that runs at frame rate:

None of this replaces the measurement. It decides what the measurement should be.

The circuit it solves

One signal path, fixed:

                       ┌─────────── embedding stack ──────────┐
  SourceTuner ─ s2p_in ─┐                                   ┌─ s2p_out ─ LoadTuner
                        ├─ s4p / s6p (1,2 outer · 3,4/5,6 DUT) ┤
                        └─ lumped package ─ DUT ─ package ────┘

Every element of the embedding is optional and any combination is legal. The cascade order is fixed, outside in: s2p → s4p/s6p → lumped → DUT.

Terminations are per harmonic band. A marker on a Smith chart is a band's termination: S1/L1 are the source and load fundamentals and are always present; S2/L2, S3/L3 … are added and removed from the Markers menu. A band with no marker is terminated in a near-short (1e-6 Ω), which is worth knowing before you conclude that the third harmonic does nothing on your device. DC is not a marker: bias is an ideal choke and DC block, so band 0 is a hard short to the supply.

Markers are linked across charts — a marker belongs to the circuit, not to a plot, so moving L2 on the power chart moves it on the efficiency chart in the same frame.

Supported DUT models

The source is always grounded. A two-port device is used as it is; a three-port device has its source port grounded — so there are only ever two termination planes and two marker families. (The source is grounded at the package plane, which is why a shared source lead Rs/Ls shows up in the source-side intrinsic impedance.)

DUT What it is
Native FET Any of the five large-signal models — Angelov, Curtice, Curtice cubic, Materka, Statz. Choose the law, then edit the model's own parameters in the strip.
SDD Drain-current (and gate-current) equations you type, in the standard expression language. Two-port (_v1 = Vgs, _v2 = Vds) or three-port, which adds the source terminal against ground as _v3. Optional Cgs, Cdg, Cds across the device's own terminals, each either linear or a polynomial C(V).
External model A compiled Verilog-A .osdi, or a part from a vendor kit through the device worker — see PDK integration. You must name which internal node is the intrinsic gate and drain and which pin is the source: nothing can guess that, so until it is answered the intrinsic glyphs and the loadline stay empty rather than plausibly wrong.
Diode A two-terminal built-in, for teaching and for the degenerate cases.

Load one with File ▸ Set DUT…, or drag a part in from the circuitRF Library palette when a workspace is open. Refresh DUT re-reads a model that changed on disk.

The DUT is embedded in the same s2p/s4p/s6p/lumped stack described above, so a bare die and a packaged part are the same document with a different embedding.

The interface

harmonicaRF 37 Γ points · 0 holes · Full P-3dB Power (dBm) Fundamental Load Plane, Z0=80Ω 1 0.5 2 5 10 1 -1 0.2 -0.2 0.5 -0.5 2 -2 5 -5 10 -10 L3 L2 L1 P-3dB Efficiency (%) Fundamental Load Plane, Z0=80Ω 1 0.5 2 5 10 1 -1 0.2 -0.2 0.5 -0.5 2 -2 5 -5 10 -10 L3 L2 L1 0 20 40 60 80 100 120 0 0.2 0.4 0.6 0.8 1 Loadline Vds (V) Ids (A) intrinsic 4 8 12 16 20 24 28 32 36 40 12 13 14 15 16 17 Power Sweep Pout (dBm) Gain (dB) 0.692 12.6 24.5 36.4 48.3 60.2 Efficiency (%) Vgs (V): -3.050 Idq (mA): 49.1 Vds (V): 48 Freq (GHz): 2 HB Order: 3 P-xdB (dB): 3 Z0 ( Ω): 80 rgs ( Ω): 0 Cgs (pF): 0.00 Cdg (pF): 0.00 Cds (pF): 0.00 P-3dB Pout (dBm): 40.65 Eff (%): 65.7 PAE (%): 63.4 Gain (dB): 14.47 Gp (dB): 14.47 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 17.681 γ: 0.000 ∠ — MXP 1f0 ZL1=82.4-j0.0 Ω Pout (dBm): 40.63 Eff (%): 66.4 PAE (%): 64.1 Gain (dB): 14.60 Gp (dB): 14.60 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 17.402 γ: 0.000 ∠ — MXE 1f0 ZL1=136.5-j0.0 Ω Pout (dBm): 39.17 Eff (%): 69.8 PAE (%): 68.2 Gain (dB): 16.20 Gp (dB): 16.20 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 11.824 γ: 0.000 ∠ — Source: Load ZL1 ( Ω): 80.000+j0.000 ZL2 ( Ω): 0.000+j0.000 ZL3 ( Ω): 0.000+j0.000 Intrinsic VDS (V) DC: 48.000+j0.000 1f0: -43.125-j0.000 2f0: -0.000+j0.000 3f0: 0.000-j0.000 Intrinsic IDS (A) DC: 0.364+j0.000 1f0: 0.539+j0.000 2f0: 0.151+j0.000 3f0: -0.109-j0.000 harmonicaRF 37 Γ points · 0 holes · Full P-3dB Power (dBm) Fundamental Load Plane, Z0=80Ω 1 0.5 2 5 10 1 -1 0.2 -0.2 0.5 -0.5 2 -2 5 -5 10 -10 L3 L2 L1 P-3dB Efficiency (%) Fundamental Load Plane, Z0=80Ω 1 0.5 2 5 10 1 -1 0.2 -0.2 0.5 -0.5 2 -2 5 -5 10 -10 L3 L2 L1 0 20 40 60 80 100 120 0 0.2 0.4 0.6 0.8 1 Loadline Vds (V) Ids (A) intrinsic 4 8 12 16 20 24 28 32 36 40 12 13 14 15 16 17 Power Sweep Pout (dBm) Gain (dB) 0.692 12.6 24.5 36.4 48.3 60.2 Efficiency (%) Vgs (V): -3.050 Idq (mA): 49.1 Vds (V): 48 Freq (GHz): 2 HB Order: 3 P-xdB (dB): 3 Z0 ( Ω): 80 rgs ( Ω): 0 Cgs (pF): 0.00 Cdg (pF): 0.00 Cds (pF): 0.00 P-3dB Pout (dBm): 40.65 Eff (%): 65.7 PAE (%): 63.4 Gain (dB): 14.47 Gp (dB): 14.47 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 17.681 γ: 0.000 ∠ — MXP 1f0 ZL1=82.4-j0.0 Ω Pout (dBm): 40.63 Eff (%): 66.4 PAE (%): 64.1 Gain (dB): 14.60 Gp (dB): 14.60 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 17.402 γ: 0.000 ∠ — MXE 1f0 ZL1=136.5-j0.0 Ω Pout (dBm): 39.17 Eff (%): 69.8 PAE (%): 68.2 Gain (dB): 16.20 Gp (dB): 16.20 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 11.824 γ: 0.000 ∠ — Source: Load ZL1 ( Ω): 80.000+j0.000 ZL2 ( Ω): 0.000+j0.000 ZL3 ( Ω): 0.000+j0.000 Intrinsic VDS (V) DC: 48.000+j0.000 1f0: -43.125-j0.000 2f0: -0.000+j0.000 3f0: 0.000-j0.000 Intrinsic IDS (A) DC: 0.364+j0.000 1f0: 0.539+j0.000 2f0: 0.151+j0.000 3f0: -0.109-j0.000
harmonicaRF on its default document: power and efficiency contours on the load plane, the loadline, the power sweep, and the readout strip.

Four panels and a strip:

Vgs (V): -3.050 Idq (mA): 49.1 Vds (V): 48 Freq (GHz): 2 HB Order: 3 P-xdB (dB): 3 Z0 ( Ω): 80 rgs ( Ω): 0 Cgs (pF): 0.00 Cdg (pF): 0.00 Cds (pF): 0.00 P-3dB Pout (dBm): 40.65 Eff (%): 65.7 PAE (%): 63.4 Gain (dB): 14.47 Gp (dB): 14.47 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 17.681 γ: 0.000 ∠ — MXP 1f0 ZL1=82.4-j0.0 Ω Pout (dBm): 40.63 Eff (%): 66.4 PAE (%): 64.1 Gain (dB): 14.60 Gp (dB): 14.60 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 17.402 γ: 0.000 ∠ — MXE 1f0 ZL1=136.5-j0.0 Ω Pout (dBm): 39.17 Eff (%): 69.8 PAE (%): 68.2 Gain (dB): 16.20 Gp (dB): 16.20 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 11.824 γ: 0.000 ∠ — Source: Load ZL1 ( Ω): 80.000+j0.000 ZL2 ( Ω): 0.000+j0.000 ZL3 ( Ω): 0.000+j0.000 Intrinsic VDS (V) DC: 48.000+j0.000 1f0: -43.125-j0.000 2f0: -0.000+j0.000 3f0: 0.000-j0.000 Intrinsic IDS (A) DC: 0.364+j0.000 1f0: 0.539+j0.000 2f0: 0.151+j0.000 3f0: -0.109-j0.000 Vgs (V): -3.050 Idq (mA): 49.1 Vds (V): 48 Freq (GHz): 2 HB Order: 3 P-xdB (dB): 3 Z0 ( Ω): 80 rgs ( Ω): 0 Cgs (pF): 0.00 Cdg (pF): 0.00 Cds (pF): 0.00 P-3dB Pout (dBm): 40.65 Eff (%): 65.7 PAE (%): 63.4 Gain (dB): 14.47 Gp (dB): 14.47 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 17.681 γ: 0.000 ∠ — MXP 1f0 ZL1=82.4-j0.0 Ω Pout (dBm): 40.63 Eff (%): 66.4 PAE (%): 64.1 Gain (dB): 14.60 Gp (dB): 14.60 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 17.402 γ: 0.000 ∠ — MXE 1f0 ZL1=136.5-j0.0 Ω Pout (dBm): 39.17 Eff (%): 69.8 PAE (%): 68.2 Gain (dB): 16.20 Gp (dB): 16.20 Zin ( Ω): 50.000+j0.000 AM/PM: -180.0° Pdc (W): 11.824 γ: 0.000 ∠ — Source: Load ZL1 ( Ω): 80.000+j0.000 ZL2 ( Ω): 0.000+j0.000 ZL3 ( Ω): 0.000+j0.000 Intrinsic VDS (V) DC: 48.000+j0.000 1f0: -43.125-j0.000 2f0: -0.000+j0.000 3f0: 0.000-j0.000 Intrinsic IDS (A) DC: 0.364+j0.000 1f0: 0.539+j0.000 2f0: 0.151+j0.000 3f0: -0.109-j0.000
The readout strip: settings on the left, then the source and load markers, then the grid's best-power and best-efficiency summaries.

The strip is deliberately dense: small text, no section titles, no decoration. Every element has a tooltip, and all of it is selectable text, so any readout can be copied straight out.

Interaction: dragging and editing

The two gestures that matter

Markers are dragged. Click a marker on either Smith chart and drag it: the terminations, the contours behind it, the loadline and every readout update while your hand is moving.

Configuration is double-clicked. Double-click any settings value in the readout strip to edit it in place. Enter commits, Escape reverts.

More precisely:

Preset terminations — B, J, J* and F, F⁻¹

Markers ▸ Preset Terminations writes a whole class of load terminations in one gesture:

Preset Shortcut What it writes at the intrinsic plane
Class B Ctrl+B / ⌘B f₀ at Z0; every harmonic above it a near-short.
Class J Ctrl+J / ⌘J f₀ at Z0·(1 − j0.5); 2f₀ at Z0·j·3π·0.5/8 (reactive); 3f₀ and above a near-short.
Class J* Ctrl+Shift+J / ⌘⇧J The complex conjugate of Class J, band by band — same magnitudes, opposite reactance sign.
Class F Ctrl+F / ⌘F f₀ at 2·Z0/√3; even harmonics shorted, odd harmonics open.
Class F⁻¹ Ctrl+Shift+F / ⌘⇧F f₀ at (√2/2)·Z0 / (½ − 8/9π²); even harmonics open, odd harmonics shorted — the inverse arrangement.

Three things a user needs to know about them:

  1. They are intrinsic targets, and Z0 means R_opt. The presets are written against the document's own Z0, which is what makes them meaningful — set Z0 to the device's optimum resistance (Display ▸ Set Z0…) before applying one, or you are asking for a Class-F termination around the wrong load. The tool transforms them out to the terminal plane for you.
  2. A "short" is Z0/100 and an "open" is Z0·100, not a mathematical zero and infinity. At Z0 = 50 Ω that is 0.5 Ω and 5 kΩ — |Γ| = 0.980 either way, which is a short and an open for every practical purpose, while leaving the solver a well-scaled problem. An eleven-orders-of-magnitude termination makes the contour raster around that band degenerate; this does not.
  3. A preset writes only the bands you have markers for. Add L2 and L3 first if you want a Class-F arrangement to have anywhere to put its harmonics. Bands with no marker stay at the unmarked near-short.

When to reach for which: B is the reference case and the sanity check. J / J* buy you Class-B efficiency over a wider bandwidth by trading fundamental reactance against a reactive second harmonic — useful when a real matching network cannot hold a short at 2f₀ anyway. F and F⁻¹ are the harmonic-tuned high-efficiency arrangements; which of the two suits a device depends on whether its current or its voltage waveform is the one you can shape, and comparing them here — two keystrokes apart — is exactly the comparison this tool exists to make cheap.

The termination values come from:

Sharma, T. (2018). Modelling and Design Methodology of Higher-Efficiency Harmonic Tuned Power Amplifiers for 5G Applications (Doctoral thesis, University of Calgary). https://prism.ucalgary.ca/handle/1880/106695

harmonicaRF documents carry their own menu set — notably no Simulate menu, because it is always simulating. On macOS these appear in the system menu bar; elsewhere they are in the window.

Menu What is in it
File New · Open .charm · Save · Save As · Set DUT… · Refresh DUT · Import/Export .gam · Export Data · Export Testbench… · Close
Edit Undo · Redo · Settings…
Markers Source Bands · Load Bands (add or remove a band's marker) · Preset Terminations · Add Load Marker (Ctrl+A) · Add Source Marker
Display Contour plane (load/source) · contour harmonic · efficiency metric (DE/PAE) · loadline plane (intrinsic/extrinsic) · contour levels (5/10/20) · iso-line labels · grid points · Power Sweep… · Set Z0…
Grid Grid preset (3 × 12, 5 × 12, 7 × 16) · Reset grid · Import/Export .gam
Help This page.

The .charm document, and getting results out

A harmonicaRF document saves as .charm — the DUT, the embedding, the bias, the terminations and markers, the grid, the settings, and your panel layout. A DUT can be embedded in the document or referenced, so a .charm is either self-contained or tracks a model that keeps changing, whichever you need.

Three ways out:

Edit Display unlocks the panel layout: add, move, resize and delete plots and readouts, change text size and alignment, and add a trace of anything in the published DataSet. Lock it again and the layout is yours; it is saved in the .charm.