Spiral inductors, interdigital capacitors, baluns, resonators, phase shifters for impedance matching, DC blocking, and bias tees. TRIGGER: user asks to design or create a spiral inductor, interdigital capacitor, balun, resonator, phase shifter, or other passive RF component. Invoke BEFORE writing code — class names and property patterns are non-obvious. SKIP: filter design (use matlab-design-pcb-filter), coupler/splitter design (use matlab-design-pcb-coupler), transmission line design (use matlab-design-pcb-txline), EM analysis (use matlab-analyze-em), material setup only (use matlab-manage-pcb-material).
npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-design-pcb-passive
matlab-design-pcb-txlinematlab-design-pcb-filtermatlab-design-pcb-couplermatlab-manage-pcb-materialmatlab-analyze-emmatlab-manage-pcb-material — set up substrate and conductormemoryEstimate(obj, fc, 'RetainMesh', true) — inspect auto-mesh density before committing to a full solvematlab-analyze-em — validate S-parameters → matlab-optimize-pcb-design — tune dimensions → matlab-integrate-pcb-circuit — cascade into circuit| Task | Code |
|------|------|
| Spiral inductor | ind = spiralInductor |
| Interdigital capacitor | cap = interdigitalCapacitor |
| Extract inductance | L = inductance(ind, freq) |
| Extract capacitance | C = capacitance(cap, freq, DeEmbed=true) |
| Behavioral S-params | S = sparameters(obj, freq, Behavioral=true) |
| Ring resonator | r = design(resonatorRing, freq) |
| Split-ring (custom) | r = resonatorSplitRingCustom |
| Split-ring (square) | r = resonatorSplitRingSquare |
| Coupled-line balun | b = balunCoupledLine |
| Marchand balun | b = balunMarchand |
| Phase shifter | ps = design(phaseShifter, freq, PhaseShift=90) |
| Radial stub | stub = stubRadialShunt |
| Optimize | optimize(obj, freq, ...) |
ind = spiralInductor;
ind.SpiralShape = 'Square'; % 'Square' | 'Circle' | 'Hexagon' | 'Octagon'
ind.InnerDiameter = 5e-4;
ind.Width = 2.5e-4;
ind.Spacing = 2.5e-4;
ind.NumTurns = 4;
ind.Height = 1.016e-3; % Must be a cumulative substrate layer boundary
ind.GroundPlaneLength = 5.6e-3;
ind.GroundPlaneWidth = 5.6e-3;
ind = spiralInductor;
ind.Substrate = dielectric('Name', {'Silicon','SiO2'}, ...
'EpsilonR', [11.9, 4.1], 'LossTangent', [0.005, 0], ...
'Thickness', [300e-6, 3e-6]);
ind.Height = 303e-6; % Signal trace at top of stack
| Shape | Q-Factor | Notes |
|-------|----------|-------|
| 'Circle' | Highest | Best electrical performance |
| 'Octagon' | High | Close to circular; easier to fabricate |
| 'Hexagon' | Moderate | Compromise |
| 'Square' | Lowest | Easiest to manufacture; current crowding at corners |
Smaller Height increases capacitive coupling to ground, reducing inductance, Q-factor, and self-resonant frequency. Account for this when the PCB stackup constrains Height.
L = inductance(ind, 600e6); % Scalar frequency → scalar (H)
L = inductance(ind, linspace(100e6, 1e9, 30)); % Vector → vector
At SRF, parasitic capacitance resonates with inductance — impedance peaks, then the inductor behaves as a capacitor. Design so the operating band stays below SRF/3 to SRF/2.
freq = linspace(100e6, 10e9, 201);
L = inductance(ind, freq);
% Sign change: L > 0 (inductive) → L < 0 (capacitive) at SRF
show(ind)
current(ind, 600e6)
charge(ind, 600e6)
[E, H] = EHfields(ind, 4e9, [0; 0; 1]);
cap = interdigitalCapacitor;
cap.NumFingers = 4;
cap.FingerLength = 0.0137;
cap.FingerWidth = 3.16e-4;
cap.FingerSpacing = 3e-4;
cap.FingerEdgeGap = 3.41e-4;
cap.TerminalStripWidth = 5e-4;
cap.PortLineWidth = 1.9e-3;
cap.PortLineLength = 3e-3;
cap.Height = 7.87e-4;
C = capacitance(cap, 5e9); % Raw
C = capacitance(cap, 5e9, DeEmbed=true); % De-embedded
C = capacitance(cap, 5e9, DeEmbed=true, IncludeParasitics=true); % With parasitics
Both spiralInductor and interdigitalCapacitor support fast behavioral models:
S = sparameters(ind, freq, Behavioral=true); % ~instant
S = sparameters(cap, freq, Behavioral=true);
Use for initial exploration; switch to full-wave (Behavioral=false, the default) for validation. Before a full-wave solve, always check mesh density:
memoryEstimate(ind, fc, 'RetainMesh', true); % Check auto-mesh before full-wave
sp = sparameters(ind, freq, 'SweepOption', 'interp');
resonatorRing is a microstrip ring resonator coupled to two feed lines via a gap.
r = resonatorRing;
r.RingRadiusOuter = 0.01;
r.RingWidth = 4e-3;
r.CouplingGap = 1e-3;
r.PortLineLength = 0.01;
r.PortLineWidth = 5e-3;
r.Height = 1.6e-3;
r.GroundPlaneWidth = 0.04;
r = design(resonatorRing, 1.8e9); % 50 Ω default
r = design(resonatorRing, 2.5e9, Z0=75); % 75 Ω
Two object types: resonatorSplitRingCustom (pluggable shape) and resonatorSplitRingSquare (pre-configured square).
r = resonatorSplitRingCustom;
sr = splitRing(Type="Hexagon", NumRings=3);
sr.SplitSide = [2 3 5];
r.Resonator = sr;
r.FeedType = 'Tapped'; % 'Tapped' (default) or 'Coupled'
r.PortLineLength = 0.01;
r.PortLineWidth = 7.5e-4;
r.Height = 8.13e-4;
r = resonatorSplitRingSquare;
r.RingLengthInner = 3.6e-3;
r.RingWidth = 5e-4;
r.RingSpacing = 3e-4;
r.SplitGap = 5e-4;
r.CouplingGap = 2.5e-4;
r.NumResonator = 5;
r.ResonatorSpacing = 4e-3;
For the full splitRing shape property table, CSRR ground-plane etching, and SIW integration patterns, see references/resonators-detail.md.
balunCoupledLine is a 3-section coupled-line balun (balanced-to-unbalanced converter).
b = balunCoupledLine;
b.NumCoupledLineSection = 3;
b.CoupledLineLength = 0.0153;
b.CoupledLineWidth = 4e-4;
b.CoupledLineSpacing = 1.4e-4;
b.OutputLineLength = 0.0124;
b.OutputLineWidth = 1.53e-4;
b.OutputLineSpacing = 0.011;
b.Height = 1.3e-3;
balunCoupledLine has no design() method. Use designCoupledLine, designOutputLine, designUncoupledLine for section-by-section sizing from impedance targets. See references/resonators-detail.md for the full API.
balunMarchand is a broadband balun using λ/4 coupled-line sections.
bm = balunMarchand;
bm.CoupledLineLength = 0.0178;
bm.CoupledLineWidth = 3e-3;
bm.CoupledLineSpacing = 1.5e-4;
bm.OutputLineLength = 0.016;
bm.OutputLineWidth = 2.9e-4;
bm.Height = 1.6e-3;
No design() method. Set dimensions manually or use optimize().
phaseShifter is a Schiffman-type phase shifter using coupled-line sections.
ps = design(phaseShifter, 1.8e9); % Default phase shift
ps = design(phaseShifter, 1.8e9, PhaseShift=90); % 90° phase shift
ps.NumSections = 1;
ps.PortLineLength = 0.01;
ps.PortLineWidth = 5e-3;
ps.Height = 1.6e-3;
ps.SectionShape = ubendRightAngle; % Default U-bend shape
stubRadialShunt creates a single- or double-radial stub shunt. Radial stubs provide wideband short-circuit behavior compared to rectangular stubs.
stub = stubRadialShunt;
stub.StubType = "Single"; % "Single" (default) or "Double"
stub.OuterRadius = 8.5e-3;
stub.InnerRadius = 1.2e-3;
stub.Angle = 90; % Range [5, 175] degrees
stub.PortLineWidth = 2.5e-3;
stub.PortLineLength = 0.0137;
stub.Height = 1.6e-3;
For double-stub vector property configuration, see references/resonators-detail.md.
Wrap passive components in pcbElement for RF Toolbox circuit assembly:
ckt = circuit;
c1 = interdigitalCapacitor;
c2 = interdigitalCapacitor(NumFingers=3);
p = pcbElement(c2, 'Behavioral', false);
add(ckt, [1 2 0 0], c1);
add(ckt, [2 3 0 0], p);
setports(ckt, [1 0], [3 0]);
S = sparameters(ckt, 8e9);
All objects in this skill support optimize():
ind = spiralInductor(NumTurns=3);
optimize(ind, linspace(1e9, 3e9, 11), ...
'Properties', {'Width', 'Spacing', 'InnerDiameter'}, ...
'LowerBound', [1e-4, 1e-4, 3e-4], ...
'UpperBound', [5e-4, 5e-4, 1e-3], ...
'Objective', 'maximizeBandwidth');
All objects follow the same pattern — set Thickness before assigning to the component:
sub = dielectric('FR4', 'Teflon');
sub.Thickness = [1.6e-3, 0.8e-3];
obj.Substrate = sub;
obj.Height = 0.8e-3; % Must match a cumulative layer boundary
sparameters(obj, freq, 'SweepOption', 'interp') for MoM solves. Direct sweeps solve at every frequency point individually and are significantly slower.memoryEstimate(obj, fc, 'RetainMesh', true) before sparameters(). If memory is excessive, coarsen: mesh(obj, 'MaxEdgeLength', lambda/6). See matlab-analyze-em for full mesh inspection workflow.design() for inductors/capacitors. spiralInductor and interdigitalCapacitor have no design() method. Set dimensions manually or use optimize().DeEmbed=true, extracted capacitance includes feed line contributions.'Square', 'Circle', 'Hexagon', 'Octagon'.10. GroundPlane dimensions. Keep ground plane ≥ 2× the component footprint to avoid truncating fringing fields.
11. No design() for baluns. balunCoupledLine and balunMarchand have no design() method. Use section-design functions or optimize().
12. No design() for split-ring resonators. Only resonatorRing supports design().
13. splitRing is a shape, not a component. Cannot be analyzed directly — attach to resonatorSplitRingCustom or embed in a pcbComponent.
14. PhaseShift units are degrees. The PhaseShift parameter in design(phaseShifter, ...) is degrees, not radians.
15. stubRadialShunt has no design() method. Set dimensions manually or use optimize().
14. Polygonal SplitSide defaults may be invalid. Hexagons require SplitSide from {2, 3, 5, 6}. Always set explicitly for polygonal types with multiple rings.
matlab-manage-pcb-material — Substrate and conductor setupmatlab-analyze-em — S-parameters, fields, mesh controlmatlab-optimize-pcb-design — optimize() syntax, objectives, solversmatlab-integrate-pcb-circuit — pcbElement circuit integrationmatlab-design-pcb-filter — SIW filters can embed split-ring resonatorsmatlab-assemble-pcb-layout — Custom CSRR structures via pcbComponent + Boolean opsmatlab-design-pcb-coupler — Related coupled-line structures----
Copyright 2026 The MathWorks, Inc.
Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementing any feature or bugfix, before writing implementation code
Use when you have a spec or requirements for a multi-step task, before touching code
Use when creating new skills, editing existing skills, or verifying skills work before deployment
Use when writing or improving README files. Not all READMEs are the same — provides templates and guidance matched to your audience and project type.
| Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.
Official Opentrons Protocol API for OT-2 and Flex robots. Use when writing protocols specifically for Opentrons hardware with full access to Protocol API v2 features. Best for production Opentrons protocols, official API compatibility. For multi-vendor automation or broader equipment control use pylabrobot.
Take matlab/matlab-design-pcb-passive from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.