An autonomous agent starts with a single microring modulator and gradually builds complexity to reach a 4-channel WDM transceiver at 25 GBd PAM-4.
The earlier posts in this series targeted the device layer: the agent designed broadband 1×2 splitters, cleared routing DRC violations, retraced the modulator trade-off curve, and tuned RF-loaded modulators. In this post, we look at system level autonomous design. The agent assembles the full schematic of a 4-channel WDM CPO transceiver, runs circuit simulations, and pushes the design through architectural stage gates to a working 200 Gbps PAM-4 link. The loop never touches FDTD; everything happens at the netlist and behavioral-model layer.
Working at one layer at a time is how EDA flows handle complexity. Transistors abstract to logic cells, cells abstract to RTL, RTL abstracts to architecture. Each level hides the layer below behind a behavioral model so the optimizer can move quickly at the level that matters. Photonic system design works the same way: at the circuit level, an MRM is a transfer function and an ng, not a thousand FDTD voxels. That abstraction lets the agent run a full PAM-4 link in seconds and iterate on the architecture instead of the device.
Device-level design has well understood trade-offs. System level design adds cascade asymmetries, channel-to-channel interactions, and twenty parameters that move at once. CPO transceivers sit squarely in this space: four to sixteen wavelengths share one bus, each ring filters every downstream channel, and one drive-amplitude choice ripples through eye opening, extinction ratio, crosstalk, and insertion loss.
The loop is the same six-step shape we described in the modulator post: read the journal, cite a paper, edit one file, simulate, log, keep or revert. The single editable file is design.py. Module-level constants set the photonic parameters; an integer STAGE switch chooses the topology (1, 1+drop, N=2, N=4). PhotonForge builds the netlist from those constants, runs the frequency-domain S-matrix, and a time-domain stepper drives PAM-4 through each ring modulator into a photodiode.
What makes this practical at the system level is the PDA SDK: the same JSON schema defines a PhotonForge component in Python and in the cloud GUI, so the agent edits Python and the cloud canvas updates with zero translation code. A Playwright browser MCP drives photonforge.simulation.cloud after each kept iteration, screenshots the new schematic, and archives it for the progression GIF. The agent sees what it built before trusting the simulation.
Every ring in the schematic is the same abstract model: imaginary coupling κ, propagation loss, group index ng, and a length L that fixes the FSR. In the frequency domain, the model returns the standard add-drop transfer matrix from coupled-mode theory [6]. In the time domain, the same model becomes a delay-line ring buffer: the bus field circulates through the ring once per round trip with a coupling matrix applied at the coupler. The modulator's electro-optic response is a depletion-junction Δn(V) with a single-pole RC bandwidth limit. No FDTD, no mesh.
The agent never starts at the 4-channel design. It walks a roadmap, advancing only when the current stage passes its binary spec.
| Stage | Topology | Components | Gate | First-pass iter |
|---|---|---|---|---|
| 0 | 1 laser → MRM → PD | 3 | eye ≥ 0.25, ER ≥ 6 dB | 2 |
| 1 | + fiber + drop ring | 5 | + IL ≤ 10 dB | 3 |
| 2 | scale to N=2 + mux | 10 | + XT ≤ −15 dB | 7 |
| 3 | scale to N=4 WDM | 18 | per-ch eye ≥ 0.20 | 50 |
Stages 0–2 each cleared their gate within one or two iterations. The framework had useful priors baked in: imaginary-κ ring coupling, integer-m resonance ordering for both engines, and a delay-cell floor that catches under-sampled rings before they crash the time stepper.
The first eye is a textbook microring failure. Equally spaced drive voltages do not give equally spaced optical levels because the through-port intensity is Lorentzian, not linear. The agent runs a one-off DC sweep, fits the steady-state VRX response, inverts it, and writes four predistorted V levels to pam4_levels.tsv [3]. Loading those levels alone opens the eye.
The first N=2 iteration delivers a worst-case channel crosstalk of −20 dB with no tuning, well below the −15 dB gate. One small per-channel detune handles the residual eye asymmetry between the two channels.
By Stage 3 the frequency-domain spec passes by a wide margin: every channel's insertion loss is under 1 dB and worst-of-six crosstalk sits at −20 dB. The time-domain eye, however, is asymmetric across channels. Each microring adds dispersion and absorbs a fraction of every wavelength on the bus near its resonance, so a downstream ring sees an input that the upstream rings have already filtered and group-delayed. The first ring on the bus sees a clean signal; the last sees the bus that every other ring has shaped. Cascaded-microring filter studies make this concrete [5]. Uniform parameter changes cannot fix an asymmetric problem.
The agent applies the per-channel detune trick used in production WDM transceivers, where each ring's resonance is heater-trimmed to a different offset that compensates for its cascade position [4]: MRM_DETUNE_PER_CH_HZ = [−10, +5, +25, +45] GHz, monotonically increasing because downstream channels carry more cumulative cascade distortion. All four extinction ratios pass; the worst eye sits at 0.16, just below the 0.20 gate.
Pure parameter tuning runs out of room at iter 16. The agent stays on the eye-open metric for thirty more iterations, trying drop-ring coupling, laser power, drive rise time, PD bandwidth, and every uniform knob the journal carries, without breaking the 0.16 plateau. The cascade group-delay limit at L=15 µm is structural.
Then the agent widens the channel spacing from 800 to 1200 GHz. This breaks at L=15 µm because the channel span (3.6 THz) eats 76% of the FSR (4.76 THz) and adjacent MRM resonances start overlapping other channels. The fix is structural: shorten the ring to L=10 µm. FSR jumps to 7.14 THz, span drops to 50% of FSR, and the agent can chase the eye opening on the new architecture. At iter 50 it lands a worst-of-four eye of 0.201, the first v5 config to clear the headline spec.
| iter 16 (L=15, 800 GHz) | iter 50 (L=10, 1200 GHz) | |
|---|---|---|
| Eye worst | 0.16 (gate 0.20) | 0.20 |
| ER worst | 6.4 dB (gate 6) | 1.6 dB |
| IL worst | 0.8 dB | 0.7 dB |
| Crosstalk | −20.3 dB | −20.5 dB |
Two competing designs surface. L=15 µm passes everything except eye open; L=10 µm passes the eye but trades it for extinction ratio because the shorter ring has 3× less perimeter for index change. The agent surfaces a clean trade-off curve in a regime where pure intuition would have missed the structural fork.
None of the moves the agent made were original. Predistortion is in Sun JLT 2020 [3], cascade trim is the published thermal-tuning pattern for cascaded microring transceivers [4], the L vs ER trade-off is in every microring textbook. The point is that the agent found them in the right order, motivated each one with a citation, and ran the circuit simulation that confirmed or rejected the direction. The behavioral abstraction lets a system level loop compress what is normally days of human iteration into a single overnight run, with a paper-grounded journal you can read after.
The same scaffold extends in several directions. Push to 50 GBd PAM-4 for 400 Gbps aggregate. Drop the cascade for a parallel splitter-based topology so every channel sees the same bus. Add receiver-side equalization (a digital CTLE that mirrors real CPO RX). Co-optimize the device layer alongside, so when the agent decides L=10 µm is right, a child loop calls a 3D mode solver to confirm the coupler κ at the new geometry. Each extension is one more parameter set on the same loop, with the PDA SDK keeping the Python design and the cloud schematic in sync the whole way.