Skip to content

Supply rails and tie cells: pinned PDK data

This investigation reads only LEF/Liberty data from the existing Ciel PDK tree at revision f6eeac7dad085ffcc829ccfd721f7b4ce39edcf7. It reads no reference implementation. Sources are the same full sky130_fd_sc_hd and gf180mcu_fd_sc_mcu7t5v0 files recorded by fixtures/pdk/local-real-pdks.json. All dimensions below are microns in the source; multiply exactly by the selected DBU per micron. Existing workspaces use 1000 for Sky130 and 2000 for GF180.

Data Sky130 HD GF180 MCU 7-track
Site unithd, 0.460 × 2.720 GF018hv5v_mcu_sc7, 0.560 × 3.920
Primary power pin / layer VPWR / met1 VDD / Metal1
Primary ground pin / layer VGND / met1 VSS / Metal1
N-oriented lower rail ground: y −0.240 … +0.240 ground: y −0.300 … +0.300
N-oriented upper rail power: y 2.480 … 2.960 power: y 3.620 … 4.220
Body power / nwell VPB / nwell VNW / Nwell
Body ground / pwell VNB / pwell VPW / Pwell

The primary rail rectangles of the inspected ordinary, tie and filler masters span x = 0 … master width. Some GF180 pins also have narrower fingers; those fingers are not a replacement for the full-width rail. The Liberty pg_type labels primary supply pins separately from nwell/pwell bias pins. Merely attaching a bias pin to a net does not establish a well tie/contact or latch-up compliance.

Sky130's sky130_fd_sc_hd__conb_1 is 1.380 × 2.720. Its Liberty output HI has function 1, and LO has function 0. Both are ordinary signal outputs; constant consumers should connect to their respective signal nets, while the cell's supply pins connect to supply nets. GF180 uses two masters, each 2.240 × 3.920: gf180mcu_fd_sc_mcu7t5v0__tieh has output Z, function 1; gf180mcu_fd_sc_mcu7t5v0__tiel has output ZN, function 0. Maximum fanout, capacitance, transition and physical tie-cell spacing remain separate constraints.

The smallest filler is sky130_fd_sc_hd__fill_1 (0.460 wide) or gf180mcu_fd_sc_mcu7t5v0__fill_1 (0.560 wide). Sky130 also has 2/4/8-site fillers; GF180 has 2/4/8/16/32/64-site fillers. Their rail geometry permits closing the occupied row's horizontal rail gaps. Filler selection does not replace tapcells, well-tie insertion, detailed routing or foundry DRC.

For FS placement, x is translated unchanged and a local y coordinate becomes placed_y + master_height - local_y, where placed_y is the oriented bounding box's lower edge. A rectangle's lower/upper y bounds exchange under that mirror. Thus consecutive N/FS rows have matching primary polarity at their shared edge; two adjacent N rows place different supply rails against each other. The external OpenDB checker must verify the export's origin/location convention independently.

Fixed vias for a later strap connection

The Sky130 fixed via M1M2_PR has cut layer via rectangle (−0.075, −0.075) … (+0.075, +0.075), met1 (−0.160, −0.130) … (+0.160, +0.130), and met2 (−0.130, −0.160) … (+0.130, +0.160). GF180 fixed Via1_HV has cut layer Via1 ±0.130 square, Metal1 (−0.190, −0.130) … (+0.190, +0.130), and Metal2 (−0.140, −0.190) … (+0.140, +0.190). The GF180 file records 4.500 ohms for that via. These are geometry facts, not an extracted resistance model or DRC approval for any proposed wire width/placement. The selected primary rail bands contain the via's first-metal enclosure when centered at the row edge.

Validator resource and coverage contract (before implementation)

The rail validator receives immutable selected masters, explicit N/FS cell placements and declared rows. It transforms primary pin rectangles, forms sorted horizontal intervals at the top/bottom row edges, checks their union over each occupied row span and checks shared-boundary polarity. It reports exact gaps and mismatches. It does not enumerate electrical paths, route a grid, or infer body connections. Only rectangles strictly straddling the edge provide rail coverage; polygons on the selected rail layer are explicitly unsupported in this slice.

Default hard caps: 250,000 cells/masters, 100,000 rows, 250,000 inspected primary pin shapes, 1,000,000 transformed rail intervals, 64,000,000 bounded work units, and 256 diagnostics. At roughly 64 bytes/interval with capacity growth, intervals use <128 MB; cached master profiles and placement/row lookup buffers add <64 MB; row rail summaries add <16 MB. One geometry scope, no timing corners, no per-worker copies, and two test workers give a conservative <512 MiB run estimate. Tiny unit fixtures retain <8 KiB each excluding runtime. Sorting is charged conservatively before execution; scans count explicit work. Exceeding any cap returns a typed budget diagnostic. Use the repository's 8 GiB virtual-address and 180-second wall guards plus /usr/bin/time -v for tests. The external checker is independent and must validate both PDKs and negative polarity/gap controls.

Local validator verification

Five focused unit cases passed: alternating N/FS common rail bands; an N/N shared-boundary polarity fault; an internal gap repaired by adding a filler; a wrong orientation/missing supply pin; and explicit work/interval/shape budget exhaustion. cargo clippy -p rustroad-core --all-targets -- -D warnings passed. These are small synthetic tests, not independent PDK or signoff evidence. The separate external checker owns the dual-PDK physical comparison and planted-defect acceptance.