Skip to content

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 be marginal rather than safe."

So state the match. Add one field:

  -d '{ … , "antennaReturnLossDb": 6.0 }'
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 the warnings and budgets in the response and tell me what I need to decide.

Three things make this behave well as an agent tool:

  1. 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.
  2. Refusals name the missing field. POST with {} and you get 422 {"detail": "frequencyGhz is required to design a T/R module"} — an agent can act on that instead of guessing.
  3. 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 needsPartFlags and 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 timing budget is absent entirely — not null, not a guess.
  • It will not decide for you. lna_compressed and marginal are handed back as findings, with the evidence, for you to rule on.