Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
[alias]
xtask = "run --package xtask --quiet --"

[net]
git-fetch-with-cli = true
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,5 @@ __pycache__/
*.swo
/.cex
/cecmiter.aig

HANDOFF.md
39 changes: 39 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,30 @@ The format follows the "Keep a Changelog" convention; versions follow semantic v
where the user's service manager accepts transient scopes, a memory limit; `verify pdk` runs
every synthesis and check step in such a scope (`RUSTEDA_VERIFY_MEMORY_MAX`,
`RUSTEDA_VERIFY_TIMEOUT_S`, `RUSTEDA_VERIFY_NO_SCOPE`).
- Shared crates converged with those of the suite's timing tool: both repositories vendor the
same 209 shared files with the same `verification/shared.sha256`, and `cargo xtask shared diff`
finds no difference. From the timing tool's side this adds:
- `rusteda import --spef FILE --spef-corner NAME` (repeatable, paired in order) with the budgets
`--max-spef-mib`, `--max-rc-nets`, `--max-rc-nodes`, `--max-rc-elements` and
`--max-rc-name-mib`: bounded detailed RC import into the `parasitics` table through the new
reader `rusteda_formats::spef` (plain or gzip sources, `T0071` to `T0074`), and a warning
`T0140` when a later import drops that table (RCLI-REQ-0070 to RCLI-REQ-0076,
`docs/specs/rusteda-cli/spef.md`);
- `rusteda_workspace::edits`: netlist edit files `rusteda.edits.v1` and their application;
- `rusteda_compute::rc` (effective-capacitance driver and wire waveform models) and prepared
per-arc values (`ArcValues`) in the timing kernel interface, unchanged for callers that pass
none (COMPUTE-REQ-0030), and `rc::gate_detail_with_resistance`: the bounded charge solve
and waveform of `rc::gate_detail` for a caller-supplied driver resistance, with
`rc::gate_detail` unchanged bit for bit;
- the Liberty pin attributes `min_pulse_width_high`, `min_pulse_width_low` and `min_period`
on `Pin` instead of ignored (LIBERTY-REQ-0049), and the compiled library format `LIBERTY` v4
that carries them (WS-REQ-0117): a cached v3 `.rlib` is compiled again from its `.lib`;
- `set_propagated_clock` and `unset_propagated_clock` are typed constraints kept in
`CONSTR v1` (SDC-REQ-0070) instead of error `D0010`; `rustsys -w <WS> opt-timing` reports
`set_propagated_clock` with warning `S0535` as clock propagation that its ideal-clock
estimate does not model;
- `rusteda show` reports `drv_status: "unchecked"` and `null` design-rule counts for a timing
summary without `drv_status` (RCLI-REQ-0023).

### Changed
- The README now leads with CLI and agent workflows, recorded runs, structured output, and
Expand All @@ -87,6 +111,21 @@ The format follows the "Keep a Changelog" convention; versions follow semantic v
- The checker rejects `wand`, `wor`, `triand`, `trior`, `tri0`, `tri1`, `trireg` and
`interconnect` nets, logic ports declared `supply0` or `supply1`, and driven supply nets
(`C0105`); an undriven supply net is a constant.
- `rusteda_workspace::sta` reads timing tables of format versions 1 and 2 (`STA` v2 stores
endpoint rows, corners and path-chain nodes at full width; WS-REQ-0126, WS-REQ-0127,
WS-REQ-0134), so `opt-timing` and `resize` read the tables that the suite's timing tool
commits; `StaTableBuilder` writes version 2 with `null` design-rule counts and
`drv_status: "unchecked"` (WS-REQ-0135, WS-REQ-0137).
- The warning `D0021` of a design-rule constraint now reads "recorded in CONSTR v1; the analysis
that reads it reports whether it is checked".
- Debug builds of `rusteda import --netlist` check the fast flat reader against the full reader
(structural or extended) on small inputs.
- The 64 MiB budget of the full netlist reader, for a netlist that the streaming reader cannot
take, is the option `rusteda import --max-netlist-ast-mib` (default 64, RCLI-REQ-0024); its
`V0300` error names the budget and the option.
- `rusteda-formats` lists SPEF among its formats; the external-simulator oracle tests of
`rusteda-compute` (ignored by default) read `RUSTEDA_SPICE_SIMULATOR`,
`RUSTEDA_RC_ORACLE_WORKSPACE` and `RUSTEDA_RC_WIRE_WORKSPACE`.

### Fixed
- The README, the user guide, the synthesis specification (SYNTH-REQ-0516), the roadmap and ADRs
Expand Down
21 changes: 19 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ RustSys is one of the tools of RustEDA, a suite of electronic design automation
share their core crates and a disk workspace. This file holds the rules that every change follows:
the eight engineering rules of RustEDA, the rules of this repository, ownership and hand-over
between work items, and the checks to run before sending a change. The phases of the suite and
their work items are in the [roadmap](docs/roadmap.md).
their work items are in the [scope](https://lab-emi.github.io/RustEDA/verification/).

Instruction files for coding agents, such as `AGENTS.md`, stay local and are never committed; this
file is the tracked statement of the rules.
Expand Down Expand Up @@ -193,7 +193,7 @@ the lab checks them:

## Ownership and hand-over

Work is divided into work items (see the [roadmap](docs/roadmap.md)), each with its specification,
Work is divided into work items (see the [scope](https://lab-emi.github.io/RustEDA/verification/)), each with its specification,
its acceptance criteria and the paths it owns.

- Every path has one owner at a time. A work item edits only the paths it owns, plus minimal
Expand Down Expand Up @@ -235,3 +235,20 @@ cargo xtask verify pdk --require
- The body explains what changed and why, in terms of specifications and tests.
- Contributions are accepted under the Developer Certificate of Origin: sign off every commit
(`git commit -s`).


### Canonical first-party foundation (2026-10-25)

The four shared library implementations and the workspace CLI implementation are owned by
lab-emi/RustEDA-Common, the public first-party foundation. Workspace dependencies and Cargo.lock
pin one exact revision over HTTPS; no GitHub credentials are required. The local rusteda-cli package is a
product adapter and retains its package version in command output and revision history.

This supersedes the legacy requirement to copy shared implementation files between tool
repositories, and is the sole first-party exception to the crates.io-only source policy.
Third-party package versions, licenses and source restrictions are unchanged. Shared specification
and automation manifests still require deliberate updates. Canonical core tests run in the
foundation repository; product adapters and engines retain their local tests.

Cross-repository validation uses the pinned foundation source. The historical public main
branch retains its existing build policy until a reviewed migration is merged.
66 changes: 66 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 9 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,16 @@ authors = ["RustSys contributors"]
repository = "https://github.com/lab-emi/RustSys"

[workspace.dependencies]
rusteda-core = { path = "crates/core/rusteda-core" }
rusteda-workspace = { path = "crates/core/rusteda-workspace" }
rusteda-compute = { path = "crates/core/rusteda-compute" }
rusteda-formats = { path = "crates/formats/rusteda-formats" }
rusteda-core = { git = "https://github.com/lab-emi/RustEDA-Common.git", rev = "c96ef1520ab08b40e48ed7643002b5c06ad13e07" }
rusteda-workspace = { git = "https://github.com/lab-emi/RustEDA-Common.git", rev = "c96ef1520ab08b40e48ed7643002b5c06ad13e07" }
rusteda-compute = { git = "https://github.com/lab-emi/RustEDA-Common.git", rev = "c96ef1520ab08b40e48ed7643002b5c06ad13e07" }
rusteda-formats = { git = "https://github.com/lab-emi/RustEDA-Common.git", rev = "c96ef1520ab08b40e48ed7643002b5c06ad13e07" }
rustsys = { path = "crates/engines/rustsys" }
rustsys-check = { path = "crates/verify/rustsys-check" }
rustsys-fixtures = { path = "crates/verify/rustsys-fixtures" }
rustsys-defects = { path = "crates/verify/rustsys-defects" }
rusteda-cli = { path = "crates/apps/rusteda-cli" }
rusteda-cli-shared = { package = "rusteda-cli-common", git = "https://github.com/lab-emi/RustEDA-Common.git", rev = "c96ef1520ab08b40e48ed7643002b5c06ad13e07" }
clap = { version = "=4.6.7", default-features = false, features = ["std", "derive", "help", "usage", "error-context", "color", "suggestions"] }
clap_complete = { version = "=4.6.11", default-features = false }
# Terminal size for the progress line of the command line. `windows`: crossterm does not compile
Expand All @@ -29,6 +30,10 @@ crossterm = { version = "=0.29.0", default-features = false, features = ["window
serde = { version = "=1.0.228", features = ["derive"] }
# float_roundtrip: the decimal text of a stored f64 parses back to the same value.
serde_json = { version = "=1.0.149", features = ["float_roundtrip"] }
# Gzip sources of the SPEF reader (pure-Rust backend).
flate2 = { version = "=1.1.10", default-features = false, features = ["rust_backend"] }
# Unix open flags of the SPEF import.
libc = "=0.2.189"
thiserror = "=2.0.18"
rayon = "=1.12.0"
rustc-hash = "=2.1.2"
Expand Down
Loading