The logic analyzer that 2026-08-08-hardcut-plan Tasks 8–10 depend on is in hand — a Logic-24M-8CH FX2LP/Saleae clone bought 2026-08-08, arrived 2026-08-11 — and this note records both the instrument itself (it was never written down as an owned item) and the macOS capture toolchain decision made on 2026-08-29: sigrok-cli + Surfer, explicitly not PulseView.
For Agents
Device: generic Cypress CY7C68013A (FX2LP) 8-channel / 24 MHz Saleae clone. sigrok driver = fx2lafw. No capture memory — it streams over USB 2.0.
Toolchain:brew install sigrok-cli surfer. Capture to VCD with sigrok-cli, view in Surfer. PulseView does not exist for Apple Silicon — see below.
Two things that will bite you: the FX2 firmware blob is not in Homebrew and must be dropped into ~/.local/share/sigrok-firmware/ by hand; and 24 MHz silently drops samples — use 1 MHz for this project.
Used by:Task 9: Hardware-in-the-loop verification step 4, the run-cap assertion on real hardware.
Open question:Saleae Logic 2 is NOT ruled out — the clone reports the original Saleae Logic’s USB ID (0x0925/0x3881) and Saleae still nominally supports it. Untested. Try it at the bench before assuming sigrok is the only path — but sigrok remains the recommendation for the run-cap assertion either way.
Not for bus protocol decoding — this project captures raw digital ignition timing only.
VID 0x0925 / PID 0x3881 — the EEPROM reports the exact USB ID of the original 2008-era Saleae Logic. That is what “Saleae kompatibilis” on the listing means: it impersonates that specific device
the fake ECM spark command; the reference clock for everything else
IGf (emulator)
bench emulator ESP32 GPIO 5
igniter feedback, active-low, 200 µs after each IGt falling edge
D
main ESP32 GPIO 15
what the firmware asks for
Q
74HC74 pin 5 (1Q)
what the hardware allows — drives the shunt FET
node A
the IGt line at the shunt drain
the actual result the igniter sees
Two assertions are what the instrument exists to prove, and both are safety-critical:
No run of suppressed events ever exceeds MAX_CONSECUTIVE_CUTS = 5 — capture 10 s at r 6400, export, count. This is the test that protects the fuel supply (Task 9: Hardware-in-the-loop verification step 4, re-verified against a real igniter at Task 10 step 5).
Q only ever changes coincident with IGt’s falling edge — D may move at any time and must not propagate until the next falling edge. This is the flip-flop interlock that makes the engine-destroying mid-dwell bug physically unreachable (The Engine-Destroying Bug, Made Physically Unreachable).
Decision: sigrok, via sigrok-cli + Surfer — not PulseView
Verified on macOS / Apple Silicon, 2026-08-29.
This is the right tool for this job, and the fallback that definitely works
It is not “the only thing that can drive the device” — Open Question: Saleae Logic 2 — untested, try it first may well work too and has a far nicer UI. The recommendation stands on its own merits regardless of how that test goes: the load-bearing task here is proving that the gate never moves while IGt is high across ~10,000 events, and that is an assertion over a VCD file, not something anyone should be doing by eye in a GUI.
brew install sigrok-cli surfer
Component
Version
arm64 status
sigrok-cli
0.7.2
✅ native arm64 Homebrew bottle, through arm64_tahoe
libsigrok
0.5.2
✅ native arm64 bottle
libsigrokdecode
0.5.3
✅ native arm64 bottle
surfer
0.7.0
✅ bottled in homebrew-core — modern Rust waveform viewer, reads VCD / FST / GHW
PulseView
—
❌ does not exist on this platform
sigrok-firmware-fx2lafw
0.1.7
❌ not in Homebrew — manual install, see gotcha below
Why PulseView is off the table
Not in Homebrew at all.brew search pulseview returns only pulseaudio; the formula API 404s.
sigrok.org’s macOS nightly DMGs are dead links — both PulseView-NIGHTLY.dmg and sigrok-cli-NIGHTLY.dmg return HTTP 404.
The sigrok wiki’s Mac page was last edited July 2023 and still says “64bit x86 only”.
Upstream sigrok is not dead — libsigrok and pulseview both have commits from Nov 2025 — but there has been no release since 2020 and no macOS binary at all.
So the GUI half of sigrok is unavailable, while the library and CLI half is healthy and natively bottled. Splitting the job — sigrok-cli captures → VCD → Surfer views — recovers the whole workflow with maintained, native software.
Other software considered
Recorded so this is not re-litigated later. Saleae Logic 2 is deliberately not in this table — it is an open question, not a rejection; see the next section.
Option
Verdict
Why
DSView (DreamSourceLab)
❌
Targets DSLogic hardware. Latest release v1.3.0, 2023-07-18, a single DSView-v1.3.0.dmg, x86 only
ngscopeclient (scopehal)
⏳ Revisit later — the one to watch
The genuinely modern, GPU-accelerated option. v0.2.2 released 2026-08-20 with a native ngscopeclient-0.2.2-Darwin-arm.dmg, supports Apple Silicon GPUs. But it has no fx2lafw driver — open requests at scopehal#270 (fx2lafw) and scopehal#16 (Saleae), with nobody working on either
Open Question: Saleae Logic 2 — untested, try it first
Status: UNTESTED. Settle this at the bench in 60 seconds — do not record it as decided in either direction
The device has never been plugged into Logic 2. An earlier version of this note called it a “dead end” on the grounds that modern Saleae software rejects non-Saleae hardware. That was wrong and has been retracted — see below. Logic 2 is native arm64 with the best UI in the category, so if it takes, it is worth having.
Why it plausibly works:
The clone’s EEPROM reports VID 0x0925 / PID 0x3881 — the original Saleae Logic’s own USB ID. Confirmed in libsigrok, src/hardware/fx2lafw/api.c:
whose comment lists six known clones filed under that same ID: EE Electronics ESLA100, Robomotic MiniLogic, Robomotic BugLogic 3, MCU123, Hantek 6022BL (in LA mode), Instrustar ISDS205X (in LA mode).
The FX2 has no flash. Firmware loads into RAM over USB at plug-in, so whichever host software connects first uploads its own — which is exactly why one board can be driven by either Saleae’s software or sigrok, with no modification and nothing to undo.
Saleae’s own docs still claim support for this ID:“The original Logic device is supported on all releases, including the original Windows-only software, versions 1.0.0 through 1.0.34.” (source)
The clone-resistance that genuinely exists applies to Saleae’s newer hardware revisions (Oct 2022+), not to the original Logic’s USB ID.
Two real caveats — neither a technical block, and the call is the user’s:
This is a bare FX2 wearing the ID, not the original board. Whether Logic 2’s firmware-upload and streaming handshake actually completes against it is unverified, and community reports are mixed.
Saleae’s EULA restricts the software to Saleae-manufactured hardware. A licensing question, not a capability one.
Related — Logic 1.x is deprecated, and don't bother
Last version 1.2.40, macOS build Logic-1.2.40-MacOS.dmg, OS X 10.8+ and Intel-only — it would need Rosetta. Its Decoded Protocols Panel was removed in that very version. (older releases) If Logic 2 does not take the device, the answer is sigrok-cli, not Logic 1.x.
Gotchas
The FX2 firmware is not in Homebrew, and the device is useless without it
The CY7C68013A has no onboard flash. Its firmware is uploaded over USB on every single plug-in, and brew does not ship it — there is no sigrok-firmware-fx2lafw formula. Until the blob is in place, sigrok-cli --scan finds nothing usable.
curl -LO https://sigrok.org/download/binary/sigrok-firmware-fx2lafw/sigrok-firmware-fx2lafw-bin-0.1.7.tar.gzmkdir -p ~/.local/share/sigrok-firmwaretar -xzf sigrok-firmware-fx2lafw-bin-0.1.7.tar.gz --strip-components=1 \ -C ~/.local/share/sigrok-firmwarels ~/.local/share/sigrok-firmware/fx2lafw-saleae-logic.fw # the one this clone needs
Where libsigrok looks, confirmed by reading src/resource.c, in order:
$SIGROK_FIRMWARE_DIR
$SIGROK_FIRMWARE_PATH
g_get_user_data_dir()/sigrok-firmware → ~/.local/share/sigrok-firmware on macOS
the system data dirs
Path 3 is why ~/.local/share/sigrok-firmware/ is the right home for it and needs no env var.
Do not capture at 24 MHz — use 1 MHz. The device has no memory and drops samples silently
This clone has zero capture RAM. It streams straight over USB 2.0 bulk at 1 byte per sample — all 8 channels packed into that byte regardless of how many are enabled, so disabling channels buys you nothing.
24 MHz = 24 MB/s, right at the practical USB 2.0 bulk ceiling. When it overruns it drops samples without saying so — the capture just quietly lies.
For ignition timing that headroom is pointless anyway. A 4-cylinder at 6000 r/min fires ≈200 sparks/second and IGt dwell is in the millisecond range. 1 MHz gives 1 µs resolution at 1 MB/s — roughly 1000× finer than anything here needs, with enormous margin, and cheap enough that minutes-long captures are trivial.
Capture Shape
The intended workflow. Not yet run against the device — hardcut is parked with no code written and the bench rig is not set up, so this is the shape to start from, not a verified transcript.
VCD is the right export format precisely because it is what Surfer reads, and because a text VCD can also be counted by script — which is how the “no run longer than 5” assertion should actually be checked, rather than by eye.
Related
hardcut — project entry point; Tasks 8–9 are what this instrument exists for