Design a 9.4 GHz T/R module from Claude Code¶
A transmit/receive module for an X-band marine radar, designed by one HTTP call, with real parts and a real bill of materials — then a second call that changes the answer.
Every figure on this page came back from the live API on 2026-09-08. Nothing here is illustrative.
You need: an internet connection. No account, no API key, no sign-up. The design engines are open.
The call¶
curl -X POST https://api.pcbgenerator.com/api/tr-module/design \
-H "Content-Type: application/json" \
-d '{
"frequencyGhz": 9.4,
"targetOutputPowerDbm": 40,
"application": "radar",
"transmitDutyCyclePercent": 10
}'
200 in 7.6 s, 16.5 KB back. Two required fields: a frequency, and a transmit
power. Everything else is optional and every optional thing you leave out is
disclosed rather than assumed — which turns out to be the interesting part.
What comes back¶
It picked a topology and said why:
tr_switch— "A single transmit/receive switch is the smallest and cheapest way to share one antenna, and suits a high duty cycle. It costs insertion loss in BOTH paths, so it degrades transmit power and receive noise figure together, and the transmit power must stay inside the switch's rating."
It also records the alternative it rejected (circulator_limiter) and why, so the
choice is auditable rather than magic.
Then a complete module — 15 catalogue parts across three groups:
| Parts | |
|---|---|
| Shared | QPC2040 (the T/R switch) |
| Transmit | HMC465 driver → QPA2811 PA → ABF-9G+ output filter → SMA-J-P-H-ST-EM1 |
| Receive | TGL2209-SM limiter → HMC8412 LNA → B095MB1S image filter → CMD183C4 mixer → ADF5611 LO → CBP2-1090C+ IF filter → PHA-23LN+ IF amp → HMC1119 DSA, on RO3003-50ohm-MS |
needsPartFlags: [] — every slot filled from the catalogue. Nothing invented.
Headline numbers:
| Figure | Value |
|---|---|
| Transmit, as built | 40.65 dBm (target 40) |
| Receive gain | 25.65 dB |
| Receive noise figure | 2.597 dB |
| Shared-path insertion loss | 1.035 dB |
| Delivered at the antenna | 39.615 dBm |
| Receive NF at the antenna | 3.632 dB |
| Total dissipation | 5.18 W across 12 heat sources |
| BOM | 29 lines, 43 items, $939.99 (15 of 29 priced) |
Note sharedPathLoss.fedBack: false. The switch's loss is stated beside the
as-designed figures, not folded back into them — the chains were not silently
re-run against a target you never gave.
The part worth reading¶
Thirteen warnings came back. They are not boilerplate. Three examples.
It caught a problem. The receive budget's verdict is lna_compressed — the
LNA is overdriven by 1.05 dB during transmit:
"HMC8412 compresses at 3.50 dBm input, below the 4.95 dBm incident on this branch. It was RANKED on compression headroom against every other LNA covering this band, but that is one criterion among several and it did not decide this slot: 5 of the 33 LNAs here that declare a computable input P1dB stay out of compression at this level (highest 8.50 dBm, HMC463LP5E), and each lost on the combined score. During a transmit pulse the receiver is deaf, not damaged; whether that matters depends on recovery before the first range bin, which the timing budget answers when a PRF and pulse width are stated."
That is a finding, a census of the alternatives, an engineering judgement about severity, and the input that would settle it.
It told you a part isn't doing its job.
"TGL2209-SM never conducts on this branch: it starts limiting at 20.90 dBm and the incident power is 4.95 dBm… No limiter covering this band clamps low enough to change that: the lowest onset the catalog offers here is 17.70 dBm (ADL8201)."
It separated what it verified from what it didn't. Three parts got a variant of:
"…is within its 41.0 dBm average rating (32.5 dBm average at 10% duty), but each pulse peaks at 42.5 dBm and the filing states no peak/pulse rating. The average is fine; the peak is UNVERIFIED — check the datasheet for a pulse rating."
And the thermal model declines to attribute heat it cannot source, in
analysis.unresolved:
"the mixer (CMD183C4) draws no supply rail and dissipates the local-oscillator drive it absorbs; neither the drive it requires nor the power the local oscillator delivers survives into this design, so that heat is not attributed to any part on this board"
A 5.18 W total that says which heat it could not account for is worth more than a tidier number that quietly absorbs it.
Now tell it about the antenna¶
The switch verdict came back safe — 40.65 dBm against a 44.5 dBm rating,
3.85 dB of margin. But look at the disclosure attached to it:
"No antenna return loss was supplied, so the load QPC2040 drives is unknown… Its record also declares
abs_max_3to1_vswr_85c_dbm= 43.00 dBm… against that rating this design's 40.65 dBm is -2.35 dB of stress and the verdict would bemarginalrather thansafe."
So state the match. Add one field:
| Without | With antennaReturnLossDb: 6.0 |
|
|---|---|---|
| Governing rating | abs_max_pulsed_85c_dbm 44.5 dBm |
abs_max_3to1_vswr_85c_dbm 43.0 dBm |
| Stress | −3.85 dB | −2.35 dB |
| Verdict | safe |
marginal |
Same design, same parts, same transmit power. The engine had the more binding
rating the whole time and told you it was holding it back, because applying it
without knowing the load would have over-derated a matched design. One input, and
a safe verdict becomes an honest marginal.
Only 1 of 94 T/R switches in the catalogue declares that 3:1 VSWR rating. The one this design selected is that one.
From inside Claude Code¶
Nothing special is required — Claude Code can call this with curl in Bash. A
prompt that works:
Design a 9.4 GHz T/R module for a marine radar, 40 dBm transmit, 10% duty cycle, by POSTing to
https://api.pcbgenerator.com/api/tr-module/design. Read thewarningsandbudgetsin the response and tell me what I need to decide.
Three things make this behave well as an agent tool:
- One call, one complete answer. No job id, no polling, no session. If a second call needs a figure from the first, the agent carries it.
- Refusals name the missing field.
POSTwith{}and you get422 {"detail": "frequencyGhz is required to design a T/R module"}— an agent can act on that instead of guessing. - The disclosures are written to be read by a model. They state the finding, the evidence, and the input that would resolve it — which is what stops an agent narrating a clean summary over a compressed LNA.
The full endpoint list, rate limits and grounding contract are on the API reference for LLMs. This endpoint is rate-limited to 15 requests/minute per IP.
What it will not do¶
- It will not invent a part. An unfillable slot is named in
needsPartFlagsand left empty. - It will not check numbers you supply. Figures in the request are computed faithfully whether or not anyone said them. Pass through what your user actually stated.
- It will not evaluate a timing budget you did not ask for. Without a PRF and
pulse width, the
timingbudget is absent entirely — not null, not a guess. - It will not decide for you.
lna_compressedandmarginalare handed back as findings, with the evidence, for you to rule on.