Skip to content

Synthesize your design

RustSys reads synthesizable SystemVerilog, elaborates hierarchy and parameters, optimizes a bit-level logic network, and maps it to cells from your Liberty libraries. Its output is flat structural Verilog plus an optional JSON report.

Specify the design explicitly

rustsys --threads 4 synth \
  --top chip_top \
  -I rtl/include -D FEATURE=1 -P WIDTH=32 \
  --lib cells.lib \
  --out .work/chip_mapped.v \
  --report .work/chip.json \
  rtl/types_pkg.sv rtl/datapath.sv rtl/chip_top.sv

List packages before modules that use them. Repeat -I, -D, -P and --lib when needed. SYNTHESIS is predefined unless --no-predefined-macros is given. If --top is omitted, RustSys requires an unambiguous module that no other module instantiates.

Keep the same source files, macros, parameters, libraries and semantic options when checking. Recording a run and passing check synth --from-run avoids copying that configuration manually.

Use EZ130 cells on IHP SG13G2

The optional EZ130 8T v1.1 library targets IHP SG13G2 130 nm. The benchmark pins TT, 1.20 V and 25°C, plus the download and Liberty checksums. From the repository root:

(
  ulimit -v 2097152
  timeout 120s python3 verification/benchmarks/open-hardware/fetch_additional_pdks.py
)
mkdir -p .work
rustsys --threads 16 synth --top counter --goal area --effort medium \
  --lib target/pdk/ez130_8t_tt_1p20v_25c.lib \
  --out .work/counter_ez130.v --report .work/counter_ez130.json \
  verification/fixtures/synthetic/synth/rtl/counter/counter.sv

The Python helper downloads library data; synthesis runs in the native Rust CLI. Keep the exact Liberty file with the result. See library provenance and the benchmark page.

EZ130 v1.1 has a documented tie-cell driver-type conflict between Liberty and the vendor Verilog models. The benchmark verification workflow certifies an explicit functional supplement for these two cells; the native checker keeps rejecting unmodeled strength/high-impedance attributes in an unadapted library. Read the cell-model scope when reproducing its LEC results.

Choose the mapping tradeoff

Option Effect
--goal delay Prioritize estimated delay; the default.
--goal area Prioritize total cell area.
--effort low, medium, high Control optimization/search effort; medium is the default.
--delay-relax 0.1 Permit relative delay growth during area recovery.
--dont-use '*_x8' Exclude a cell name or quoted glob; repeat as needed.

Higher effort can take substantially longer. Compare netlist quality together with end-to-end time and peak memory. The report records the requested and effective priority-cut counts and the mapping cut-storage budget; large designs may use fewer cuts to stay within that budget.

Inspect cell use and unused-library reasons:

rustsys show .work/chip.json --section cells --sort area_total --reverse --limit 20
rustsys show .work/chip.json --section unused
rustsys show .work/chip.json --section phases

Keep arbitrary initial states

By default, state starts arbitrarily and state elements are preserved. Do not add --after-reset or --uninitialized-dont-care to an arbitrary-initial-state comparison. These flags deliberately change the contract: the former requires a reset sequence, and the latter permits choices for otherwise unspecified initial state. See equivalence scopes.

Likewise, --assume-full-case and --assume-parallel-case change the semantics of annotated case statements. The default retains ordinary priority behavior, even when an annotation suggests a synthesis assumption. Every enabled assumption belongs in the report and proof record.

Other input formats

The positional source extension selects BLIF (.blif), AIGER (.aag, .aig) or RTL. A run uses one format; AIGER takes a single file. A structural netlist is explicitly selected with --gate-netlist and its cell library with --gate-lib.

rustsys synth --lib cells.lib --out .work/adder.v adder.aig
rustsys synth --lib new_cells.lib --gate-netlist mapped.v \
  --gate-lib old_cells.lib --out .work/remapped.v

BLIF and AIGER can declare initial values. Their default --initial-values reset represents those values through a generated asynchronous initialization port. Review that interface rather than treating it as an implicit reset assumption. --initial-values arbitrary omits implementation of declared initial values and emits a warning. See the complete input-format contract.

Use the output

Keep the mapped Verilog, exact Liberty files and check report together. The emitted cell instances need the matching simulation models for gate-level simulation. Placement, routing, clock-tree synthesis, parasitic extraction, STA and DRC are downstream tasks; a successful synthesis command does not establish those results.

Add load-aware timing refinement when appropriate, then check equivalence for the final exported file.