Release Notes — v2.0

HeteroSTA3D v2.0

Release date: 2026-05-16

Highlights

  • First-class C interface for incremental flows. v1.x focused on file-based whole-design runs; v2 adds the netlist topology / cell-sizing / batch-read APIs needed to drive HeteroSTA3D from an external optimizer.
  • Multi-corner parallelism. Pass dc_name="all" to extract_rc_from_placement, update_delay, update_arrivals to fan out across CPU threads or GPU per-thread default streams.
  • Netlist sharing across corners. heterosta3d_set_netlistdb lets all corners reuse a single NetlistDB — corner 0 takes ownership of the original; corners 1..N-1 each get an internally-cloned copy automatically. Memory and load time scale ~1x instead of ~Nx.
  • Transparent 3D die routing via cell-name suffixes. Cells named *_top / *_bottom route to the matching die's liberty automatically. The 3D-pin mask is rebuilt internally; no extra plumbing required.
  • New sizing_demo. An end-to-end incremental cell-sizing example that exercises the optimizer-style loop: batch_update_celltypes → extract_rc → update_delay → update_arrivals → report_wns_tns.
  • Conventions block in every public header. Index domains, pin_rf encoding, num_cells semantics, set_netlistdb ownership, CPU/GPU memory rules — all documented at the top of heterosta3d.h and mirrored in the API Reference.

New release APIs

Full reference in API Reference.

API Use
heterosta3d_reset Clear timing+netlist+SDC for all corners; keep liberty libraries
heterosta3d_set_netlistdb Install a NetlistDB shared across all delay corners
heterosta3d_batch_update_celltypes Broadcast a per-cell cell-type list across all corners (cell sizing)
heterosta3d_zero_slew Zero-initialize input port slews before reading SDC
heterosta3d_batch_read_sdc Read multiple SDC files for one corner in one call
heterosta3d_get_num_of_pins / _get_num_of_nets Netlist scalar queries
heterosta3d_get_pin2net Pin-to-net mapping (host or device pointer)
heterosta3d_get_net2pin_start / _get_net2pin_items Net-to-pin CSR (host or device pointer)
heterosta3d_ignore_net Mark a net as ignored for placement RC extraction
heterosta3d_query_pin_direction Pin direction (input/output/unknown)
heterosta3d_internal_get_celltype_of_pin Read-back the cell type currently assigned to a pin's cell

Bug fixes

  • Multi-corner set_netlistdb was UB. Earlier behavior passed the same pointer to every corner, which caused a double-free on shutdown. Now corner 0 takes ownership and corners 1..N-1 each get an internally-cloned independent NetlistDB.
  • batch_update_celltypes silent no-op when num_cells was wrong. The internal cell array includes the top-level module as cell 0, so the correct size is (leaf-cells + 1). The function's return value (uintptr_t cells_changed) now lets callers detect a size mismatch (returns 0) instead of failing silently.

Behavior changes vs v1.1

  • heterosta3d_get_num_of_pins / _of_nets signature change. v1.1 examples called these with a dc_name argument; the netlist is shared across corners so the parameter has been removed. Drop the dc_name argument from any callsites.
  • heterosta3d_lookup_pin signature change. Same reason; the trailing dc_name argument was dropped.
  • heterosta3d_get_pin2net signature change. The trailing const char *dc_name is replaced by bool use_cuda — match it to where you read the pointer (host vs. device).
  • 3D SPEF / RC extraction refinements. HBT (Hybrid Bonding Terminal) modeling and the prefix-sum kernel inside extract_rc_from_placement were rewritten; per-net RC values should match v1.1 within numerical tolerance.

APIs removed from the release surface

These were in v1.1 but are now dev-only and stripped from the release header and .so. Calling them against v2 will fail to link.

  • heterosta3d_get_net_arc_delay
  • heterosta3d_dump_paths_max_to_file_with_place_info

If you have a legitimate use case for either, contact us so we can re-evaluate.

Upgrade checklist (v1.1 → v2.0)

  1. Replace heterosta3d_get_num_of_pins(sta, dc_name) with heterosta3d_get_num_of_pins(sta) (same for _get_num_of_nets).
  2. Update heterosta3d_lookup_pin(sta, name, dc_name) to heterosta3d_lookup_pin(sta, name).
  3. Update heterosta3d_get_pin2net(sta, dc_name) to heterosta3d_get_pin2net(sta, use_cuda) — choose false if you read the array from host code, true if from a CUDA kernel.
  4. If you were creating one NetlistDB per corner via heterosta3d_read_netlist, consider building it once and using heterosta3d_set_netlistdb to share — saves memory and respects the new ownership rules.
  5. If your design uses many corners, replace per-corner loops with dc_name="all" where applicable.
  6. If you called heterosta3d_get_net_arc_delay or heterosta3d_dump_paths_max_to_file_with_place_info, refactor to use the public reporting APIs (heterosta3d_report_wns_tns_max/min, heterosta3d_dump_paths_max_to_file, etc.) and let us know about your use case.
  7. Re-run your timing reports and confirm WNS/TNS values are within tolerance.
  8. Update your license environment variables; v1.x licenses are not interchangeable with v2.x.