
Bsl drv v1
jackw01/scanlight
A better light source for scanning color negative film

G350-inspired Linux handheld carrier designed in tscircuit, with Pi Zero 2 W host and integrated power/audio/front controls
Index is an open-source printed circuit board by Abse2001, from the Abse2001/g350-linux-handheld repository on GitHub, published under the MIT licence. It is a 4-layer board of 100 × 124 mm with 157 parts on 52 nets, routed with 689 tracks and 148 vias.
It belongs with the computers and single-board computers boards of this library.
The current requirement is a Linux computer built directly on the handheld PCB. Revision B is an external-Pi carrier and does not meet that requirement. Do not order its files for the integrated-computer design. That redesign is not fabrication-ready; see docs/INTEGRATED_HOST.md. Revision B's checks below apply only to the existing carrier.
Custom tscircuit handheld PCB, revision B. A complete Raspberry Pi Zero 2 W is the Linux/GPU host, connected through a hand-drawn J8 interface and mechanical layout in lib/PiZero2W.tsx. The Pi's proprietary computer circuitry is not recreated here. No complete SBC PCB design is imported.
The four-layer, 100 × 124 mm carrier includes eleven front switches, an MCP23017, a MAX98357A speaker amplifier, a BQ24074 battery charger with load sharing, a TPS61023 5 V boost supply, a MAX17048 fuel gauge and an AP2112 3.3 V display regulator. It has no analog sticks or rear buttons. J_LCD is assembled on top and faces the display interior for ribbon insertion. Individual active devices, switches, the USB-C and FPC connectors, the display regulator and the inductor were imported using tsci import --use-exact-footprint from JLCPCB.
This is a G350-inspired custom handheld, not a replacement PCB that fits the stock G350 shell. The selected SPI display is 480 × 320 in landscape, rather than the stock G350's 640 × 480 display. The Raspberry Pi provides its CPU, GPU, RAM, Wi-Fi and microSD boot storage.

Download the Revision B Gerbers, order status and schematic preview.
The project pins the latest tscircuit version found on 2026-10-02: 0.0.2715. Always use the local CLI:
npm ci
npm run typecheck
npx --no-install tsci check source index.circuit.tsx
npx --no-install tsci check pin_specification index.circuit.tsx
npx --no-install tsci check netlist index.circuit.tsx
npx --no-install tsci check schematic-placement index.circuit.tsx
npx --no-install tsci check placement index.circuit.tsx
npx --no-install tsci check routing-difficulty index.circuit.tsx
npx --no-install tsci build index.circuit.tsx --autorouter-debug --autorouter-dump-srj all --pcb-png --schematic-png --kicad-project > checks/build.log 2>&1
npm run compact:circuit
npx --no-install tsci check shorts dist/index/circuit.json --mode gerber --layer all > checks/shorts.log
npm run check:kicad
npm run fabricationThe wide manual power feeds use the outer layers; the autorouter can use all four copper layers. Manual SPI/display-control and selected button tracks use inner1, with MISO, I2C clock and charging-status branches on inner2; ground pours surround them on all four layers. Routing uses the local tscircuit autorouter with explicit CONTROLS, POWER and DISPLAY_AUDIO phases, reserving I2C/control escapes before broad supplies and then display/audio signals. The switching-node route, charger exposed-pad ground connection, charger setting/status escapes, USB and battery feeds, battery thermistor connection, boost feedback/enable connections, amplifier/button-controller/fuel-gauge bypass connections, Pi and button-controller supply branches, wide amplifier/boost input feeds, button-controller reset, amplifier mode/enable connections, LCD supply/select/reset/backlight/touch-IRQ and inner-layer SPI/control connections, I2C clock, UP/SELECT/MENU paths and LEFT input escape, charging indication, status pull-up feeds, gauge I2C branches and I2S clock/data connections are drawn manually. Check results and release limitations are recorded in checks/ and fabrication/STATUS.md.
lib/PhasedAutorouter.ts uses the installed tscircuit package's latest local solver in each phase, treats completed earlier phases as fixed copper obstacles and makes through-hole terminals accessible from all four layers. Inner signal paths retain their actual layers in the routing obstacles, with blind/buried vias disabled and full-depth via spans checked before release. ConservativeTraceObstacles.ts compacts overlapping trace samples into conservative envelopes; pads, holes, vias and fine-pitch escapes stay unchanged, and the original obstacle coverage is verified in checks/router-obstacles.log. ThroughSignalVia.ts adds the inner access ports omitted when core 0.0.2043 constructs a via before its board parent; the physical vias remain full-depth and their spans are checked in the exported board. Ground returns use filled zones and stitching vias. Short copper contacts inside GND pads explicitly identify the plane net to tscircuit's trace connectivity check; independent KiCad connectivity verifies the physical ground return. Width transitions are explicitly encoded so the native clearance checker and KiCad export evaluate the same segment widths. The helper rejects failed routes; final connectivity and shorts checks qualify the resulting copper. The top assembly side has three fiducials with copper keepouts around their mask openings. All carrier components, including every harness header and the USB-C/FPC connectors, are fitted on top. Bottom copper remains available for routing; it has no component placements. Component reference text is retained in the assembly data; the PCB silk uses clear connector and control labels. The USB connector silk outline is inset from the routed board edge; its imported copper footprint is unchanged.
The release exporter requires a successful three-phase build, a fresh all-layer shorts result and an independent KiCad report with zero violations, zero warnings and zero unconnected items. prepare-kicad-library.py exports the exact project footprints through KiCad’s native serializer into a local tscircuit.pretty library and writes fp-lib-table. It checks that all physical board records are unchanged while assigning distinct library identities. The final DRC validates those local footprints. The checks use KiCad 10 and its pcbnew Python module; the installed macOS runtime is detected automatically. Set G350_KICAD_PYTHON for a different interpreter with that module. prepare-kicad.mjs restores the fiducial keepouts' declared placement allowance, which the current converter drops. The keepouts still exclude tracks, vias and copper pours. It restores the full through-via span declared in Circuit JSON when the converter duplicates inner-layer transitions, removes the resulting identical duplicate vias and assigns distinct priorities to touching ground-zone outlines and asks KiCad to discard disconnected copper islands when refilling zones. The switching-node pour keeps priority over the surrounding ground.
Production Gerbers are plotted from the independently checked and refilled KiCad conversion of the tscircuit board. Gerbers, separate plated/non-plated drills and supplier-verified CPL placements all use the lower-left bounding corner as their origin. The release verifier compares actual Gerber pad flashes, plated/non-plated drills and every exported KiCad track with the tscircuit model. fabrication/SHA256SUMS identifies the released files. See fabrication/STATUS.md before ordering.
The tscircuit registry limits individual uploads, so large STEP models are distributed there as lossless .step.gz files. Run npm run restore:models after downloading that repository to restore the local KiCad and imported component models; the command verifies the original release checksums. GitHub also includes the uncompressed models. Circuit JSON is compacted before final checks without changing any parsed values. The Gerbers and assembly files are identical in both repositories.
Manufacturing targets green solder mask, 1 oz outer copper and standard 0.5 oz inner copper. Pad-sized mask openings follow JLCPCB's current 1:1 mask capability; fiducials retain their larger explicit openings. Visible labels are at least 1 mm high. Through-hole spacing is checked against a conservative 0.45 mm minimum. These limits follow the JLCPCB rigid-board capabilities.
SavedRouting.ts retains the actual three-phase Pipeline 9 routes after manual clearance corrections to the DOWN fanout, A-button bridge and CC1 path. It reuses a phase only when the SHA256 of its complete routing input and both pinned tool versions match; changed designs run the live autorouter. Earlier-phase routes and ground contacts remain preserved. routing/initial-autorouter-run.log records the original solver run and its subsequently corrected geometry errors; checks/build.log and the final independent checks qualify the release. The manual reset and I2S frame-clock paths also include clearance corrections. No draft route-cache bypass remains.
The qualified release includes bom-jlcpcb.csv and pnp-jlcpcb.csv for SMD assembly, plus bom-manual.csv for the through-hole headers, external modules, cables and mounting hardware. Fit all unshrouded harness headers on the top side.
The LCD and Pi share the top assembly side. Select insulating standoff heights from the actual Pi, carrier components, GPIO headers and display stack; leave microSD insertion/removal and USB pigtail access. The Pi mounting pattern is 58 × 23 mm, with four 2.75 mm holes. Use insulating M2.5 nylon hardware and a numbered GPIO ribbon. The custom enclosure, stacked-part clearances and antenna performance require a physical fit check. Keep battery wiring short and use wire rated for at least 3 A. Power the Pi through the carrier GPIO header. The carrier's back has no component bodies; through-hole solder joints and copper remain there.
The selected module is 92.44 × 61 mm in landscape, with a 480 × 320 active display. The carrier width is 100 mm to accommodate it. Its host supply is a separate 3.3 V rail from AP2112; this keeps the module's input logic and I2C pull-ups at Pi-compatible levels. Typical manufacturer-stated module current is about 63 mA; the LDO dissipates about 0.11 W at that load. This does not qualify the enclosure's thermal behavior.
| J_LCD FPC pin | Module signal | Pi BCM GPIO / connection |
|---|---|---|
| 1 | VCC | V_LCD3V3, 3.3 V only |
| 2 | LCD_BL | 23 |
| 3 | GND | GND |
| 4 | SCLK | 11 |
| 5 | MOSI | 10 |
| 6 | MISO | 9 |
| 7 | LCD_D/C | 22 |
| 8 | LCD_RST | 27 |
| 9 | LCD_CS | 8 |
| 10 | SD_CS | 3.3 V, unused card deselected |
| 11 | NC | Open |
| 12 | Reserved, marked NC in module schematic | Open |
| 13 | TP_SCL | 3 / shared I2C |
| 14 | TP_SDA | 2 / shared I2C |
| 15 | TP_INT | 25 |
| 16–18 | NC | Open |
| Connector anchors | Mechanical shell | GND |
Do not use a stock display setup that assigns backlight to GPIO18: this design uses GPIO18 for I2S BCLK. Install a display driver supporting ST7796S and the above custom pin assignments. FT6336U touch shares the I2C bus at address 0x38; the button and battery daemon does not implement touch. The manufacturer's schematic marks host FPC pin 12 NC, so it stays open; touch uses the module's power-on reset. Display and touch driver bring-up have not been tested on hardware. The module's microSD slot is not used; boot storage remains on the Pi. Full-frame SPI transfers limit refresh rate: 480 × 320 × 16-bit pixels require 2.46 Mbit per frame, giving a theoretical 13 frames/s at a 32 MHz SPI clock before overhead. Measure the chosen driver and games during bring-up.
Boot storage is the microSD card in the Pi Zero 2 W's existing holder. It is part of the external Pi module; the carrier does not duplicate an electrically unavailable SDIO interface on J8. Keep that holder accessible in the enclosure. The display module's separate card holder remains unused.
For the first installation, fit a blank microSD card, a charged protected battery and the verified data-only Pi USB pigtail. With the handheld off, connect the carrier USB-C to a computer using a data-capable cable. Start Raspberry Pi's official rpiboot on the computer with its mass-storage-gadget64 image, then switch the handheld on. The Pi's USB device boot runs a temporary installer in RAM and exposes the card to the computer. Use Raspberry Pi Imager to select Raspberry Pi Zero 2 W, the desired compatible Linux image and that exposed card; check the target size before writing. After verification, eject the card/device, power the handheld off and then restart to boot the installed card.
The Pi normally tries the SD card first. A bootable installed card therefore prevents this blank-card USB provisioning path from being selected. For recovery, shut down, remove the card and reimage it in a card reader, or make its boot partition unbootable before a USB reinstallation. There is no dedicated forced-USB-recovery input on this Pi module. Never export the running root filesystem as writable USB mass storage.
After building the official usbboot tools on the computer, run this from their source directory before switching the handheld on:
sudo ./rpiboot -d mass-storage-gadget64On the installed Pi, enable dtoverlay=dwc2,dr_mode=peripheral under [all] in /boot/firmware/config.txt, then reboot. Install python3-gpiozero, copy software/usb-gadget.sh to /usr/local/sbin/g350-usb-gadget with executable permissions and software/usb_power.py to /usr/local/lib/g350/. Copy the two g350-usb-*.service files into /etc/systemd/system/, run systemctl daemon-reload, and enable both services plus serial-getty@ttyGS0.service. The shared connector then provides a USB serial login and controlled USB500 charging. The prototype gadget identifiers and software must be reviewed for a production product. Display, audio and button setup are separate from OS flashing.
These procedures follow Raspberry Pi USB device boot and the official USB provisioning tool. They have not been exercised on an assembled G350 prototype.
Enable I2C and I2S on the Pi. MCP23017 uses address 0x20, MAX17048 uses 0x36. Pi J8 already provides I2C pull-ups to 3.3 V. The buttons use GPA0–GPA6 and GPB0–GPB3; Y is GPB3. GPA7/GPB7 stay unconnected and are configured as outputs, following the current Microchip datasheet. software/handheld.py provides a Linux uinput gamepad from the eleven front controls; it also reads battery voltage and charge state. Run it as a system service only after initial bring-up. Do not enable a competing kernel MCP23017 driver while using this daemon.
I2S: GPIO18 BCLK, GPIO19 LRCLK, GPIO21 data output. GPIO26 enables the amplifier; the amplifier uses its left channel at 6 dB gain. software/asound.conf mixes both input channels equally into the left output. Copy it only after identifying the I2S ALSA device on the Pi.
One USB-C connector carries both 5 V charging power and USB 2.0 data. Its two independent 5.1 kΩ CC resistors identify a sink; no USB PD is negotiated. The data lines use the exact JLCPCB USBLC6-2SC6 ESD footprint and connect to the Pi through J_USB_LINK. USB VBUS powers only the charger and the ESD reference, not the Pi USB plug. The carrier's boost supplies the Pi through J8.
BQ24074 EN1 and EN2 have external pull-downs, selecting USB100 (at most 100 mA) at power-on. GPIO24/J8 pin 18 controls EN1; GPIO16/J8 pin 36 controls EN2. The included USB serial gadget advertises 500 mA, and software/usb_power.py selects USB500 only after that gadget reaches the configured state. It selects input suspend on a suspended connection. Because the Pi's USB VBUS is isolated, the service uses USB_GOOD_N on GPIO12/J8 pin 32 to bind the gadget only when actual USB input power is present and unbind it when that power disappears. Without these services, including initial rpiboot installation or connection to a wall charger with no data enumeration, the input remains limited to 100 mA. Charging is nominally 270 mA when the input/system budget permits; a nominal 9.07-hour timer remains. The battery may discharge while playing or during installation, so begin USB provisioning with a charged, protected battery. USB enumeration, disconnect detection, suspend timing, signal integrity and charging behavior still require hardware validation.
The boost target is 4.992 V (0.6 × (1 + 732k/100k)). Begin with a 1 A total 5 V load ceiling, an 8 Ω speaker and restrained volume. Validate regulator ripple, load transients, temperature, charging behavior and battery protection before increasing loads. The fuel gauge is a monitor; the battery pack must provide hardware over-discharge/over-current protection.
Bring up with a current-limited bench supply and no Pi or LCD connected. Check for resistance between rails, verify 5 V and charge current, then test a dummy load and OFF control. Connect the Pi next, verify 3.3 V and I2C addresses, then add display, buttons and speaker. No assembled prototype has been tested.
Original project source is MIT licensed. Vendor component models and drawings retain their respective rights.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 1 | tscircuit:g350_mechanical_7dc12d8002e68cbf7c71b9020436013d | ||
| 1 | tscircuit:g350_mechanical_502d20f643c49f16375c1d362af39b56 | ||
| 1 | tscircuit:g350_mechanical_4c136e803344d7414d62e2fe31f562c3 | ||
| 1 | tscircuit:g350_mechanical_173ad2003efebb616ac7b73e148e29dd | ||
| 1 | tscircuit:g350_mechanical_3cca962849331808559b99e862041bc8 | ||
| 1 | tscircuit:g350_mechanical_774ae8c02e44d95f2c2b648279645d9d | ||
| 1 | tscircuit:g350_mechanical_59c6ecc04fff85df063a07825c7394e3 | ||
| 1 | tscircuit:g350_mechanical_2cd810204299229f585a351e6e1b479d | ||
| 1 | tscircuit:g350_mechanical_4b33d1c05591a7615fef7d026a4d52a3 | ||
| 1 | tscircuit:g350_mechanical_5e31fa7a009337fa5d0b8a864555b2fa | ||
| 1 | tscircuit:g350_mechanical_271ac4681a4219f85b9ef85863042948 | ||
| 1 | tscircuit:g350_mechanical_1c41598039f833e16fce3ebe1994b15d | ||
| 1 | tscircuit:g350_mechanical_64d7726c2a306ef446c7afac484031b4 | ||
| 1 | tscircuit:g350_mechanical_08d713c0768132010a26883e7531bd83 | ||
| 1 | tscircuit:g350_mechanical_7ae5c08078b1bda06c493bc05fe0b9e0 | ||
| 1 | tscircuit:g350_mechanical_16f4a6202cb5b89f4276cb1e5837dd9d | ||
| 1 | tscircuit:g350_mechanical_0bd7a2e07380a2e10d27175e72312e63 | ||
| 1 | tscircuit:g350_mechanical_28f5ac0057b20e3f27a63782590182bd | ||
| 1 | tscircuit:g350_mechanical_4e553ad80cf85c78346481e875c16048 | ||
| 1 | tscircuit:g350_mechanical_5ad291002485b4c15c22057e23364043 | ||
| 1 | tscircuit:g350_mechanical_658cea601b1acfdf643d75e21c6a445d | ||
| 1 | tscircuit:g350_mechanical_2b4594c437ae16a444169884507f1a64 | ||
| 1 | tscircuit:g350_mechanical_1ea571c02903476133611d023dbef2a3 | ||
| 1 | tscircuit:g350_mechanical_79ac686006fb51df785cf3e2084ac65d | ||
| 1 | tscircuit:g350_mechanical_6f83ba72280c478e4063b672572c4b8e | ||
| 1 | tscircuit:g350_mechanical_2e1d96183a8617f846ee99d853571bb8 | ||
| 1 | tscircuit:g350_mechanical_4a0a79003faca35f354ecdbe2af0f81d | ||
| 1 | tscircuit:g350_mechanical_54a590c005caad21603aeb024554d71d | ||
| 1 | tscircuit:g350_mechanical_12f762ea55789b16421766ea26589716 | ||
| 1 | tscircuit:g350_mechanical_535e87403d9d74c127dc6242121b4fc3 | ||
| 1 | tscircuit:g350_mechanical_5309ee6c5f72704c6bdaf22c7843740c | ||
| 1 | tscircuit:g350_mechanical_24488a20763cd4df37cee0621a256a5d | ||
| 1 | tscircuit:g350_mechanical_330a3f404d9d7aff31bacac24eecef7d | ||
| 1 | tscircuit:g350_mechanical_405e3ac04abc10615519e6025f77bba3 | ||
| 1 | tscircuit:g350_mechanical_67bfaee018e80b5f66703a621a377fdd | ||
| 1 | tscircuit:g350_mechanical_68c15ecc399fdeb423fee3cc7e6259b4 | ||
| 1 | tscircuit:g350_mechanical_6c6d168e78d5986e7ac1e5b26e5963d2 | ||
| 1 | tscircuit:g350_mechanical_4590e672043408123d28d64e7e85b4ae | ||
| 1 | tscircuit:g350_mechanical_6d22d3da60ba51fa5451d01a47e94e3a | ||
| 1 | tscircuit:g350_mechanical_38ed92627a4a70c24458b0de02fbd27e | ||
| 1 | tscircuit:g350_mechanical_4fddb506189248fa7efdb906168dbb06 | ||
| 1 | tscircuit:g350_mechanical_7965eb340db578f45dfaf94c36549474 | ||
| 1 | tscircuit:g350_mechanical_7a8b3ee0201b00ff3a553ce26b3a853d | ||
| 1 | tscircuit:g350_mechanical_0b9949921801cb72246a4d5230d2cf32 | ||
| 1 | tscircuit:g350_mechanical_5be1d5e024c5e45f5a926162261558dd | ||
| 1 | tscircuit:g350_mechanical_2c5d6e4021ff989f17a1c2fe0d43ed5d | ||
| 1 | tscircuit:g350_mechanical_42c3ca406b47eb011953a04238a0aa7d | ||
| 1 | tscircuit:g350_mechanical_504f5d741b6114cc78ee78f40d3e06b4 | ||
| 1 | tscircuit:g350_mechanical_3de9924042be27ff3c9a1dc2440d9c7d | ||
| 1 | tscircuit:g350_mechanical_48e4b000534285a15da05b4267fe30e3 | ||
| 1 | tscircuit:g350_mechanical_4b08715809ab92f837b14b68790e29c8 | ||
| 1 | tscircuit:g350_mechanical_04a51060110d92401d76142029de9600 | ||
| 1 | tscircuit:g350_mechanical_318a99804f1d20bf303b2502506c953d | ||
| 1 | tscircuit:g350_mechanical_34a222265a65bf3a16925f66787581fa | ||
| 1 | tscircuit:g350_mechanical_5db7e3c00347a5df572898024e672a1d | ||
| 1 | tscircuit:g350_mechanical_6e134a64263c435c45742ee44edb5edc | ||
| 1 | tscircuit:g350_mechanical_4cc2cd32559e704e08005232659f14b2 | ||
| 1 | tscircuit:g350_mechanical_26ba992868177788568baa18152ecbb8 | ||
| 1 | tscircuit:g350_mechanical_188f7ca459ec5b0464b6c69c2359e83c | ||
| 1 | tscircuit:g350_mechanical_342a7a08602513b80b8b5e88773bd0c8 | ||
| 1 | tscircuit:g350_mechanical_08b5d53e03b2aca2101b2e821c83b062 | ||
| 1 | tscircuit:g350_mechanical_5640e24449d860643d6fde8431075ca4 | ||
| 1 | tscircuit:g350_mechanical_765b7ac07f46af9f74e8d9fe6a8b045d | ||
| 1 | tscircuit:g350_mechanical_157764801fd53a212a330fc23490e563 | ||
| 1 | tscircuit:g350_mechanical_35717a446cefc33c0f5100bc4e4dc1c4 | ||
| 1 | tscircuit:g350_mechanical_7cf5d8e0114566a05a6b0ba039e48220 | ||
| 1 | tscircuit:g350_mechanical_140d345c2075b63c2cde381c3946b9fc | ||
| 1 | tscircuit:g350_mechanical_00cc84886ae3edb8296ba0084244d238 | ||
| 1 | tscircuit:g350_mechanical_1710d3a0684772211860481e66f7fda3 | ||
| 1 | tscircuit:g350_mechanical_33b335985b54abc815a372d879646e88 | ||
| 1 | tscircuit:g350_mechanical_3a4ca1b8235220c87f0f1cb821705a38 | ||
| 1 | tscircuit:g350_mechanical_05ea26200fd6ec5f2597fede3b59115d | ||
| 1 | tscircuit:g350_mechanical_480707603245f4e11c84e26206c3cfe3 | ||
| 1 | tscircuit:g350_mechanical_519150505df9d2306a62541076cad5f0 | ||
| 1 | tscircuit:g350_mechanical_312e9d54102e410c518b1f6c6d180234 | ||
| 1 | tscircuit:g350_mechanical_66a129e070feff817b5cd5227a45553d | ||
| 1 | tscircuit:g350_mechanical_46829eae782082f236c3a4920a9939ce | ||
| 1 | tscircuit:g350_mechanical_775c9dc02e33245f2c3d19827952a89d | ||
| 1 | tscircuit:g350_mechanical_694cd88c5ce456ac507bd4cc441352ec | ||
| 1 | tscircuit:g350_mechanical_75fdcc8869954aa85d2cc8c850c446e8 |
The 80 most common of 157 parts.
It measures 100 × 124 mm and has 4 copper layers, 1.6 mm thick.
157 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Abse2001/g350-linux-handheld repository on GitHub, at the commit this page was made from: the board is fabrication/kicad/index.kicad_pcb and its schematic fabrication/kicad/index.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

jackw01/scanlight
A better light source for scanning color negative film

brickbots/PiFinder
A plate solving telescope finder based around a Raspberry PI and RPI HQ Camera

keycard-tech/keycard-shell
Modular, fully open hardware wallet


will127534/ShutterEye
A simple camera board using SC910GS 1" 4K@30fps global shutter sensor

calithameridi/corevus
High-flexibility, low-cost mechatronics controller for 3D printers

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…
