gf180: add metal density fill rules (fill.json)#4311
Conversation
The gf180 platform had no metal density fill: it shipped FILL_CELLS (std-cell filler) but no FILL_CONFIG, so OpenROAD's density_fill step inserted nothing. gf180mcu's density deck enforces ">30% metal coverage per layer, die-wide" (rules M2.4 / M3.4 / M5.4 / ...), which a sparse design cannot meet without metal fill. Add flow/platforms/gf180/fill.json (Metal1-Metal5) and point FILL_CONFIG at it. Layer/datatype numbers match the platform's own KLayout layer properties (Metal1 34/0 ... Metal5 81/0; fill geometry on the *_Dummy datatype 4). Fill shape sizes use a 3-size pattern [2.0, 1.0, 0.5] alternating H/V; Metal5 uses a tighter space_to_fill (0.5) because the top routing layer carries the PDN stripes and leaves less fillable area. This is opt-in and does not change any existing result: USE_FILL still defaults to 0, so density_fill remains a no-op unless a (chip/top-level) design sets USE_FILL=1. Block / hard-macro builds keep USE_FILL=0 so fill is inserted once, die-wide, at chip level rather than per block. Verified with OpenROAD density_fill -rules on a routed gf180mcu design: rules parse and fill inserts on Metal1-Metal5 with no errors. Signed-off-by: Serge Rabyking <s.rabykin@gmail.com>
There was a problem hiding this comment.
Code Review
This pull request introduces metal density fill rules for the gf180 platform by adding a new fill.json configuration file and referencing it in config.mk. Feedback suggests increasing the minimum fill size and spacing for Metal5 from 0.5 to 0.6 to ensure compatibility with both the 9K and 11K thick metal options and prevent DRC violations.
| "width": [2.00, 1.00, 0.5], | ||
| "height": [2.00, 1.00, 0.5], | ||
| "space_to_fill": 0.5, | ||
| "space_to_non_fill": 0.5 |
There was a problem hiding this comment.
The current minimum fill size and spacing of 0.5 for Metal5 is valid for the default 9K thick metal option (KVALUE=9, where min width/spacing is 0.44 um). However, the gf180 platform also supports the 11K thick metal option (KVALUE=11), which has a minimum width and spacing requirement of 0.6 um. Using 0.5 will result in DRC violations (rules MT.1 and MT.2) when KVALUE=11 is selected.
Changing the minimum size and spacing to 0.6 makes these rules robust and compatible with both 9K and 11K metal stack options without significantly impacting density fill coverage.
| "width": [2.00, 1.00, 0.5], | |
| "height": [2.00, 1.00, 0.5], | |
| "space_to_fill": 0.5, | |
| "space_to_non_fill": 0.5 | |
| "width": [2.00, 1.00, 0.6], | |
| "height": [2.00, 1.00, 0.6], | |
| "space_to_fill": 0.6, | |
| "space_to_non_fill": 0.6 |
|
Thanks for the review. I looked into the Metal5
|
|
Update after checking the primary spec (GF180MCU DRM) rather than relying on the open KLayout deck:
So I'm reworking |
Summary
The
gf180platform shippedFILL_CELLS(std-cell filler) but no metal density fill: there was noFILL_CONFIG, so thedensity_fillstep (6_1_fill) inserted nothing. gf180mcu's density deck enforces ">30% metal coverage per layer, die-wide" (rulesM2.4/M3.4/M5.4/ ...), which sparse designs cannot meet without metal fill.This adds
flow/platforms/gf180/fill.json(Metal1–Metal5) and pointsFILL_CONFIGat it.Details
flow/platforms/gf180/KLayout/gf180mcu.lyp):Metal1 34/0…Metal5 81/0, with fill geometry placed on the*_Dummydatatype4(Metal1_Dummy 34/4…).[2.0, 1.0, 0.5]alternating H/V direction.Metal5uses a tighterspace_to_fill(0.5) because the top routing layer carries the PDN stripes and leaves less fillable area.Opt-in / no behavior change
USE_FILLstill defaults to0, sodensity_fillremains a no-op and no existing design's results change. A chip/top-level design opts in withUSE_FILL=1. Metal fill is intentionally a chip-level (die-wide) step — block / hard-macro builds keepUSE_FILL=0so fill is inserted once at the top, not per block.Verification
Ran OpenROAD
density_fill -rules flow/platforms/gf180/fill.jsonon a routed gf180mcu design: the rules parse and fill inserts cleanly on Metal1–Metal5 (non-metal/via layers skipped as expected), no errors. On the source design this took the failing density-DRC count to zero and brought all of M1–M5 above the 30% coverage floor.Note: per
docs/contrib/GettingInvolved.md, a new platform feature ideally ships with a design that exercises it. This PR keeps the change as opt-in platform capability only (so CI metrics are unaffected); enablingUSE_FILL=1on a gf180 CI design + regenerating its golden metrics can follow as a separate change.