v0.1.0
First numbered release. Metal (macOS/Apple Silicon) is the shipped
distribution target; CUDA and HIP remain source-build until their CI
runners land (ADR 0018).
Added
-
X-source debugging:
jacquard xsources+netlist-graph xroots
(#98). A two-command workflow to answer "why does signal S read X under
cosim --xprop?" as a static query instead of a trace→guess→re-run loop.
jacquard xsources <netlist> --config c.json -o xsources.jsonstatically
enumerates every X-source — unreset/reset DFF Q outputs, SRAM read ports,
and (with--config) undriven primary inputs — as a schema-versioned JSON
manifest, names resolved through netlistdb (no GPU required).
netlist-graph xroots <netlist> <signal> --xsources xsources.jsonthen
reverse-reachability-walks the signal's cone (through DFF data pins,
skipping clock/reset), intersects with the manifest, and reports the nearest
X-source frontier classified by kind;--emit-tracewrites a
--trace-signalslist for a confirming--xproprun. DFF/SRAM sources
resolve by driving-cell instance, so jacquard's net-name canonicalisation
doesn't break the round-trip. Full guide:docs/x-debugging.md. The cosim
GPIO-index parser (parse_gpio_index) is now shared with thexsources
driven-set computation so the two stay consistent. -
Multi-corner support (WS2.4, commits
5822343/530bb36/
59fde04).opensta-to-iraccepts--liberty NAME=PATHto attach
Liberty files to named PVT corners (bare paths still go to a
"default" corner). The Tcl driver runsdefine_corners+ per-scene
read_liberty -corner, emits one record per (key, corner), and the
Rust builder dedupes them into IR records carrying
multi-TimingValuevectors. Consumer side: new--timing-corner <NAME>flag onjacquard simselects the corner index from
ir.corners()at load time; defaults to corner 0 when unset. Single-
corner data continues to work unchanged. -
--timing-report <path.json>end-of-run structured timing report
(commit58a7a04). Schema-versioned (schema_version = "1.0.0",
additive-only per ADR 0008's stability contract). Contains per-cycle
violation list, per-word aggregates, top-10 worst-slack rankings per
kind, run metadata, and aggregate stats. Sample fixture at
tests/timing_ir/sample_reports/two_violations.json. Schema and
consumer guide live insrc/timing_report.rsand
docs/timing-violations.md. -
--timing-summaryhuman-readable text summary on stdout
(commit44e70a0). Independent of--timing-report; either or both
can be set, the report is built once and routed to the requested
outputs. -
Symbolic violation messages: setup/hold violation lines now name
the offending DFFs (top/cpu/regs[7][bit 22] [word=42]) instead of
bare state-word indices (commit0432d9a). The[word=N]suffix is
preserved for grep/tooling. NewWordSymbolMapinsrc/flatten.rs
built once at sim startup. -
OpenSTA detection + version check (WS-RH.1, commit
c9c393b).
When--sdfis requested but OpenSTA is missing, too old, or fails
to probe, Jacquard now hard-fails with a remediation message instead
of silently dropping timing data. Newer-than-tested versions warn but
proceed. Tested against OpenSTA3.1.0
(vendored atvendor/opensta/). -
--timing-reportviolations cap: per-cycleviolationsarray is
capped at 100k records by default (~8 MB JSON). Override with
--timing-report-max-violations <N>;0disables the cap.
stats.violations_truncatedrecords overflow. Setup/hold totals
and worst-slack rankings always reflect every observed event. -
Pillar B Stages 1+2 (commits
c403cc8,6767c3e):ClockArrival
IR records emitted byopensta-to-ir; per-DFF capture-side clock
arrival folded into setup/hold checks withDFFConstraint::clock_arrival_ps.
Closes the main per-flop skew accuracy lever ahead of Phase 2. -
opensta-to-irgolden-IR regression corpus (WS4, commits
90558bb/6997096/9e25bc2): seed entryaigpdk_dff_chaincovers
all four IR record types; runner + regen helper + CI hookup in place. -
GF180MCU power-pin + wired-filler shortcuts in
GF180MCULeafPins::direction_of. Phase 6 left two gaps that only
surfaced on real post-P&R chip-top netlists (gf180mcu-project- template/ wafer.space LibreLane flow): (1) Verilog cell models
declare power asinout VDD, VSS;, butbuild.rsonly parses
input/output— so the generated pin table lacked VDD/VSS
entries, panicking on the first.VDD(...)wired in
antenna/endcap/fillcap/etc.; (2)cor/fill*/dvdd/dvss
etc. were assumed to instantiate with empty port lists, but real
netlists wire all four power pins on every filler instance. New
short-circuit ahead of the pin-table lookup: any pin named
VDD/VSS/VNW/VPW/VPB/VNB/VPWR/VGND/DVDD/DVSS/
AVDD/AVSSresolves toDirection::I(constant external
driver — the enum has noInout), and any pin on a known filler
cell falls through to the same. Three new tests in
gf180mcu::testscover the power-pin shortcut, the wired-filler
shortcut, and a realistic chip-top fixture matching the
gf180mcu-project-templatenetlist shape. Advances Phase 7 of
the GF180MCU enablement plan from "synthetic fixtures only" to
"real wafer.space post-P&R netlists parse end-to-end". -
Config-driven AHB/APB bus transaction tracing for
cosim
(ADR 0013). Declare buses insim_config.json(bus_traces) and write
decoded transactions to CSV via--bus-trace-csv. APB3 is supported
(GPU captures raw beats, the CPU runs the protocol FSM); AHB-Lite /
AHB5 are planned. Validated bytests/apb_trace/. See
docs/bus-tracing.md. -
Prebuilt-binary distribution groundwork (ADR 0018): the Metal
binary now embeds its kernel library so a downloaded binary is
relocatable, andcargo binstallmetadata is in place. GitHub
Releases + a Homebrew tap (macOS/Metal) follow. -
netlist-graph drivers --data-only(#100): on sequential cells,
follow the data (D) pin only and skip clock/set/reset/enable pins,
so tracing a register stays on the data path instead of diving into
the clock and reset distribution trees. -
Selective X-propagation (
--xprop, #95) for bothsimand
cosim(ADR 0016). Uninitialised state — power-up DFFs, undriven
primary input pads, and uninitialised SRAM — propagates asxthrough
the design and into the output VCD instead of silently reading as0.
X is seeded only at genuine X-sources: a prior seed-template bug
cleared the X-mask over DFF-Q feedback reads, so X never originated and
any sequential design ran two-state. Undriven primary inputs read X in
cosim; SRAM writes and preloads clear the per-cell X-mask shadow.
End-to-end CI guards live intests/xprop_cosim/. See ADR 0016 and
docs/plans/cosim-xprop.md.
Changed
- ADR 0006 amended 2026-05-02 (commit
a4b1c81): subprocess
invocation of user-installed OpenSTA from the shipped runtime is now
permitted, provided OpenSTA is not bundled and not linked into the
Jacquard binary. Phase 3 (native Rust SDF→IR) is no longer release-
gating. Background: GPL-3 § 5 ("aggregate") and FSF subprocess/IPC
doctrine. process_eventsAPI: now takes aReportingCtx<'_>bundle
(word_resolver+violation_observer) instead of two separate
optional callbacks. Default callers passReportingCtx::default().- Hand-rolled SDF parser deleted (WS3 phase 3.4, commit
9b2eb00):
--sdfnow subprocessesopensta-to-ir, which produces timing IR
consumed byload_timing_from_ir. The IR path (--timing-ir) is the
canonical input. - CLI flag rename (pre-release, no compatibility alias): cosim
--timing-vcd <PATH>→--output-vcd <PATH>(the output VCD —
functional by default, timed when--timing-ir/SDF is supplied), and
sim--timing-vcd→--timed. Fixes a misnomer that steered pre-PnR
functional users away from the one flag they needed.
Fixed
cosimwarns when the positional netlist argument differs from the
config'snetlist_path(the positional wins; logs no longer silently
describe a different netlist than the one running).- Progress logging no longer floods single-tick runs — it now fires once
per ~100k-edge window regardless of batch mode. - Tracing docs corrected: traced nets land in
--output-vcdonly (not
--stimulus-vcd), and the stale "forces single-tick mode" help text
removed (VCD capture uses a GPU ring buffer, preserving batched
dispatch). netlist-graph coneno longer stops at driven internal nets and
mislabels them[primary input](#99). Inverting/tie output pins
(ZN,LO,HI,QN,CO, …) were misclassified as cell inputs,
so their output nets had no driver edge and looked undriven. The cone
now follows them, and a genuinely undriven internal net is flagged
[undriven — X-source]distinctly from a real top-level port; constant
tie-cell outputs (sky130conb_1) are labeled[constant: …].netlist-graphregister detection (_is_register) now recognises
reset/set/scan flop variants (sky130dfrtp/dfstp/dfbbn/sdf*,
gf180dffrnq/latrnq), not just the plain DFF, by matching the
functional cell name after the library prefix.
Deprecated / Removed
- ADR 0003 (OpenTimer as primary STA) superseded 2026-05-01
(commitd002bde). OpenSTA-out-of-process is the sole STA path. src/sdf_parser.rsremoved (WS3 phase 3.4); replaced byopensta-to-ir.
Documentation
- New:
docs/release-process.md— lightweight release procedure. - Updated:
docs/why-jacquard.md— output-interface section now
describes shipped surface; deferred items moved to "Still on the
wishlist". - Updated:
docs/usage.md— § Timing-Aware Simulation describes
--timing-irvs--sdfpaths plus OpenSTA version requirements. - Updated:
docs/timing-violations.md— new § Text Summary and
§ Structured JSON Report. - Plan files:
docs/plans/post-phase-0-roadmap.mdtracks current
workstreams; Phase 0 / Phase 1 closed. - New:
docs/bus-tracing.mdanddocs/signal-tracing.md— user guides
for the two cosim observability features (decoded transactions vs. raw
nets). ADR 0018 +docs/plans/distribution.mdcover the install model.
Known limitations
--timing-reportand--timing-summaryare wired only into the
Metal sim path. The CUDA, HIP, and cosim paths detect violations on
the GPU but do not yet route them throughprocess_events. Tracked
as a follow-up.- The per-cycle
violationsarray in--timing-reportis capped at
100k records by default (override via--timing-report-max-violations).
Setup/hold totals + worst-slack always reflect every observed event;
only the per-cycle list is bounded. worst_slackranking is populated only from observed violation
events. Closest-to-violation tracking on a run that passed timing
needs GPU-side near-miss instrumentation; deferred.- Bidirectional pads under
--xpropresolve to conservative X when the
output enable is deasserted; the precise tristate-mux read
(Y = OE ? A : external) is deferred (#96). - Timed output (sim
--timed/ cosim--output-vcdwith timing data)
routes violations throughprocess_eventsonly on the Metal sim path.
CUDA / HIP detect violations on the GPU but don't currently route
them; the JSON / text outputs only fire on Metal today.