Assembly-level Design Kit for heterogeneous chiplet integration. The ADK lives one abstraction layer above all PDKs: it owns the rules and tooling that govern how chiplets are placed and connected on an interposer. The interposer and the chiplet dies remain ordinary PDKs.
Warning
ADK is currently a preview release only!
v0.2.0. The KLayout assembly DRC, its runner, the KiCad DRU generator, and the
IHP interposer adapter are implemented and exercised by the regression suite.
Two independent rule axes, each driven by a PDK adapter:
- Assembly placement (
ASM.*): courtyard clearance and collision between chiplet boundaries on the interposer. Always on; selected with--interposer-adapter. - Interconnect (
IXN.*): bump-to-bump pitch and spacing for the attachment layer (CuPillar, solder bump, microbump). Optional; selected with--interconnect-adapter.
Both axes are interposer-agnostic: the deck consumes abstract layer names that an adapter maps to PDK-specific fabrication layers. Chiplet boundaries are not read from a fab layer; they come from a boundary manifest sidecar.
- KLayout assembly DRC deck, split into per-axis rule decks under
klayout/drc/rule_decks/(placement and interconnect). - Boundary-manifest model: the DRC obtains chiplet boundaries from a
<design>.boundaries.jsonsidecar, not from the GDS. Seedocs/boundary_manifest.md. - Interposer and interconnect adapter mechanisms under
pdk_adapters/, bridging abstract ADK inputs to PDK-specific fabrication layers. - OpenROAD 3Dblox exporter (
openroad/chiplet2dbx.py) that derives a geometric.3dbv/.3dbxview from a finalized.chipletassembly so OpenROAD'scheck_3dbloxcan lint the assembly geometry. - Shared layer, rule-parameter, and interconnect registries in
config/, with JSON Schemas underconfig/schema/. - KiCad DRU generator. It covers
ASM.b(courtyard_clearance);ASM.ais left to KiCad's native courtyard collision check andASM.e/ASM.fare post-layout only. It is a partial mirror of the KLayout deck, not a full one. - Stub directories for future ADK domains:
thermal/,power/,timing/.
checks/ Manifest-level checks (pads_vs_pillars)
config/ Layer, rule-param, interconnect registries + schema/
klayout/ DRC deck (adk_assembly.drc), runner, rule_decks/, macros/
kicad/ KiCad DRU generator and templates
openroad/ chiplet2dbx exporter (.chiplet -> 3Dblox)
pdk_adapters/ interposer/ and interconnect/ adapters per PDK
vendor/ Vendored chiplet_format_io reference reader
thermal/ power/ timing/ Reserved for future ADK domains (README stubs only)
tests/ Regression fixtures and golden references
By default the runner requires a <design>.boundaries.json manifest next to the
GDS; it is auto-discovered and validated before the deck runs. The manifest is
emitted by the producer (hyp_to_gds / blackbox_chiplet).
python klayout/drc/run_drc.py \
--path <design.gds> \
--interposer-adapter intm4tm2 \
--run_dir /tmp/adk_drcAdd the interconnect axis with an interconnect adapter:
python klayout/drc/run_drc.py \
--path <design.gds> \
--interposer-adapter intm4tm2 \
--interconnect-adapter ihp_cupillar \
--run_dir /tmp/adk_drcOther flags: --manifest to point at a non-default sidecar,
--interconnect-methods to scope IXN checks per attachment method, --topcell
(auto-detected if omitted), --threads, --run_mode (tiling/deep/flat),
and --report. Pass --legacy-exchange0 to check a pre-migration GDS that
carries boundaries on the exchange0 fab layer instead of a manifest.
The --interposer-adapter flag selects which adapter under
pdk_adapters/interposer/ satisfies the contract; --interconnect-adapter
selects one under pdk_adapters/interconnect/. Each accepts a shortname or an
explicit .drc path. Every adapter MUST declare the abstract inputs documented
in docs/adapter_contract.md; the deck validates this before evaluating rules.
python checks/pads_vs_pillars.py --chiplet <design.chiplet> \
--pillars <assembly>.pillars.json \
[--pins U1=chiplets/die_a.pins.json ...] [--gds-pads U2 ...] \
[--tolerance-um 1.0] [--json report.json] [--strict]Transforms each die's pad centers through its .chiplet placement
(position, rotation, flip-chip mirror) and matches them against the as-drawn
pillar centers in the pillar manifest, by pin name where available and by
nearest-unique fallback otherwise. Exit codes: 0 clean, 1 findings, 2
usage/validation errors. See checks/README.md.
python openroad/chiplet2dbx.py --chiplet <design.chiplet> --out-dir build/3dblox \
[--pins U1=chiplets/die_a.pins.json ...]Produces <name>.3dbv (black-box ChipletDefs), <name>.3dbx (the placed
assembly) and one minimal technology LEF per .chiplet technology. In
OpenROAD, read_3dbx <name>.3dbx loads the assembly and runs the
check_3dblox geometry linter. With per-die --pins lists (the
*.pins.json artifact gds_to_kicad extracts from a die's GDS or footprint)
the affected dies also get a .bmap bump map plus a per-method bump macro
LEF rendered by the interconnect PDK's manifest-driven generator
(INTERCONNECT_PDK_ROOT or sibling checkout), which activates the linter's
bump-alignment check. The export stays lossy by declaration (no artwork,
no parasitics); the mapping conventions follow the chiplet-spec
interoperability appendix, and the .chiplet file stays the authoritative
placement source.
Apache 2.0; see LICENSE.