From 0bceea98f85d0de581750d600a2204515692eb86 Mon Sep 17 00:00:00 2001 From: Serge Rabyking Date: Thu, 25 Jun 2026 13:28:26 +0200 Subject: [PATCH] gf180: add metal density fill rules (fill.json) on the dummy datatype 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 / MT.3), which a sparse design cannot meet without metal fill. Add flow/platforms/gf180/fill.json (Metal1-Metal5) and point FILL_CONFIG at it. Two details matter for gf180mcu correctness: - Fill is emitted as rectangular STRIPES (2.0um in the constrained axis, extended along each layer's routing channel), not squares. Square 2.0um tiles waste a gap on all four sides and top out ~18% coverage, leaving Metal5 below the 30% floor; stripes only pay the gap at channel ends and reach ~30-60%. Geometry follows DRM section 13.3 dummy rules: min dimension 2.0um (DM.1), fill-to-fill 1.0um (DM.2, >=0.98), fill-to- circuit-metal 2.0um (DM.3). In the default 5LM_1TM stack Metal5 is the thick top metal (MT.4 min area 0.5625um^2); 2.0um stripes give >=4um^2. - Density fill streams to the foundry dummy-metal datatype 4 (the Metal*_Dummy layers), not datatype 0. The edi2gds layermaps mapped Metal1..Metal5 FILL/FILLOPC to datatype 0, which merges dummy fill with drawn circuit metal. Because fill is spaced 2.0um away from real metal, each shape is an electrically floating island; on the drawn datatype LVS extraction would flag it as metal on no net. Routing FILL/FILLOPC to datatype 4 keeps the fill distinguishable and LVS-clean. Opt-in and no change to existing results: USE_FILL still defaults to 0, so density_fill stays a no-op unless a chip/top-level design sets USE_FILL=1. Block/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 stripe fill inserts on Metal1-Metal5 with no errors; per- layer fill-only coverage 24-29% (plus drawn routing) clears the 30% floor. Known limitation: in the 6LM_1TM stack Metal5 is a thin intermediate layer and MetalTop (GDS 53) is the thick top; this fill.json fills Metal1-5 only, so 6LM MetalTop is not yet filled. Signed-off-by: Serge Rabyking --- flow/platforms/gf180/config.mk | 4 + flow/platforms/gf180/fill.json | 78 +++++++++++++++++++ .../gf180mcu_5LM_1TM_9K_7t_edi2gds.layermap | 20 ++--- .../gf180mcu_6LM_1TM_9K_7t_edi2gds.layermap | 20 ++--- .../gf180mcu_5LM_1TM_9K_9t_edi2gds.layermap | 20 ++--- .../gf180mcu_6LM_1TM_9K_9t_edi2gds.layermap | 20 ++--- 6 files changed, 122 insertions(+), 40 deletions(-) create mode 100644 flow/platforms/gf180/fill.json diff --git a/flow/platforms/gf180/config.mk b/flow/platforms/gf180/config.mk index d4fea42f7f..a8af3d4184 100644 --- a/flow/platforms/gf180/config.mk +++ b/flow/platforms/gf180/config.mk @@ -32,6 +32,10 @@ export FILL_CELLS ?= gf180mcu_fd_sc_mcu$(TRACK_OPTIO gf180mcu_fd_sc_mcu$(TRACK_OPTION)$(POWER_OPTION)__fill_2 \ gf180mcu_fd_sc_mcu$(TRACK_OPTION)$(POWER_OPTION)__fill_1 +# Metal density fill rules (OpenROAD density_fill). Applied at chip level +# only when USE_FILL=1; macro/block builds leave USE_FILL=0 (the default). +export FILL_CONFIG ?= $(PLATFORM_DIR)/fill.json + export TIE_CELL = gf180mcu_fd_sc_mcu$(TRACK_OPTION)$(POWER_OPTION)__filltie export ENDCAP_CELL = gf180mcu_fd_sc_mcu$(TRACK_OPTION)$(POWER_OPTION)__endcap export RC_FILE = $(PLATFORM_DIR)/setRC.tcl diff --git a/flow/platforms/gf180/fill.json b/flow/platforms/gf180/fill.json new file mode 100644 index 0000000000..a208c0c5be --- /dev/null +++ b/flow/platforms/gf180/fill.json @@ -0,0 +1,78 @@ +{ + "layers" : { + "Metal1" : { + "layer": 34, + "name": "Metal1", + "dir": "H", + "datatype": 0, + "space_to_outline": 5, + "non-opc": { + "datatype": 4, + "width": [12.00, 6.00, 3.00, 2.00], + "height": [2.00, 2.00, 2.00, 2.00], + "space_to_fill": 1.0, + "space_to_non_fill": 2.0 + } + }, + + "Metal2" : { + "layer": 36, + "name": "Metal2", + "dir": "V", + "datatype": 0, + "space_to_outline": 5, + "non-opc": { + "datatype": 4, + "width": [2.00, 2.00, 2.00, 2.00], + "height": [12.00, 6.00, 3.00, 2.00], + "space_to_fill": 1.0, + "space_to_non_fill": 2.0 + } + }, + + "Metal3" : { + "layer": 42, + "name": "Metal3", + "dir": "H", + "datatype": 0, + "space_to_outline": 5, + "non-opc": { + "datatype": 4, + "width": [12.00, 6.00, 3.00, 2.00], + "height": [2.00, 2.00, 2.00, 2.00], + "space_to_fill": 1.0, + "space_to_non_fill": 2.0 + } + }, + + "Metal4" : { + "layer": 46, + "name": "Metal4", + "dir": "V", + "datatype": 0, + "space_to_outline": 5, + "non-opc": { + "datatype": 4, + "width": [2.00, 2.00, 2.00, 2.00], + "height": [12.00, 6.00, 3.00, 2.00], + "space_to_fill": 1.0, + "space_to_non_fill": 2.0 + } + }, + + "Metal5" : { + "layer": 81, + "name": "Metal5", + "dir": "H", + "datatype": 0, + "space_to_outline": 5, + "non-opc": { + "datatype": 4, + "width": [12.00, 6.00, 3.00, 2.00], + "height": [2.00, 2.00, 2.00, 2.00], + "space_to_fill": 1.0, + "space_to_non_fill": 2.0 + } + } + } +} diff --git a/flow/platforms/gf180/gds/7t/gf180mcu_5LM_1TM_9K_7t_edi2gds.layermap b/flow/platforms/gf180/gds/7t/gf180mcu_5LM_1TM_9K_7t_edi2gds.layermap index d690d3ffe0..0239c803aa 100755 --- a/flow/platforms/gf180/gds/7t/gf180mcu_5LM_1TM_9K_7t_edi2gds.layermap +++ b/flow/platforms/gf180/gds/7t/gf180mcu_5LM_1TM_9K_7t_edi2gds.layermap @@ -6,8 +6,8 @@ Metal1 NET 34 0 Metal1 SPNET 34 0 Metal1 PIN 34 0 Metal1 LEFPIN 34 0 -Metal1 FILL 34 0 -Metal1 FILLOPC 34 0 +Metal1 FILL 34 4 +Metal1 FILLOPC 34 4 Metal1 VIA 34 0 Metal1 VIAFILL 34 0 Metal1 VIAFILLOPC 34 0 @@ -31,8 +31,8 @@ Metal2 NET 36 0 Metal2 SPNET 36 0 Metal2 PIN 36 0 Metal2 LEFPIN 36 0 -Metal2 FILL 36 0 -Metal2 FILLOPC 36 0 +Metal2 FILL 36 4 +Metal2 FILLOPC 36 4 Metal2 VIA 36 0 Metal2 VIAFILL 36 0 Metal2 VIAFILLOPC 36 0 @@ -56,8 +56,8 @@ Metal3 NET 42 0 Metal3 SPNET 42 0 Metal3 PIN 42 0 Metal3 LEFPIN 42 0 -Metal3 FILL 42 0 -Metal3 FILLOPC 42 0 +Metal3 FILL 42 4 +Metal3 FILLOPC 42 4 Metal3 VIA 42 0 Metal3 VIAFILL 42 0 Metal3 VIAFILLOPC 42 0 @@ -81,8 +81,8 @@ Metal4 NET 46 0 Metal4 SPNET 46 0 Metal4 PIN 46 0 Metal4 LEFPIN 46 0 -Metal4 FILL 46 0 -Metal4 FILLOPC 46 0 +Metal4 FILL 46 4 +Metal4 FILLOPC 46 4 Metal4 VIA 46 0 Metal4 VIAFILL 46 0 Metal4 VIAFILLOPC 46 0 @@ -106,8 +106,8 @@ Metal5 NET 81 0 Metal5 SPNET 81 0 Metal5 PIN 81 0 Metal5 LEFPIN 81 0 -Metal5 FILL 81 0 -Metal5 FILLOPC 81 0 +Metal5 FILL 81 4 +Metal5 FILLOPC 81 4 Metal5 VIA 81 0 Metal5 VIAFILL 81 0 Metal5 VIAFILLOPC 81 0 diff --git a/flow/platforms/gf180/gds/7t/gf180mcu_6LM_1TM_9K_7t_edi2gds.layermap b/flow/platforms/gf180/gds/7t/gf180mcu_6LM_1TM_9K_7t_edi2gds.layermap index 67b85e06c1..1c60f62d19 100755 --- a/flow/platforms/gf180/gds/7t/gf180mcu_6LM_1TM_9K_7t_edi2gds.layermap +++ b/flow/platforms/gf180/gds/7t/gf180mcu_6LM_1TM_9K_7t_edi2gds.layermap @@ -6,8 +6,8 @@ Metal1 NET 34 0 Metal1 SPNET 34 0 Metal1 PIN 34 0 Metal1 LEFPIN 34 0 -Metal1 FILL 34 0 -Metal1 FILLOPC 34 0 +Metal1 FILL 34 4 +Metal1 FILLOPC 34 4 Metal1 VIA 34 0 Metal1 VIAFILL 34 0 Metal1 VIAFILLOPC 34 0 @@ -31,8 +31,8 @@ Metal2 NET 36 0 Metal2 SPNET 36 0 Metal2 PIN 36 0 Metal2 LEFPIN 36 0 -Metal2 FILL 36 0 -Metal2 FILLOPC 36 0 +Metal2 FILL 36 4 +Metal2 FILLOPC 36 4 Metal2 VIA 36 0 Metal2 VIAFILL 36 0 Metal2 VIAFILLOPC 36 0 @@ -56,8 +56,8 @@ Metal3 NET 42 0 Metal3 SPNET 42 0 Metal3 PIN 42 0 Metal3 LEFPIN 42 0 -Metal3 FILL 42 0 -Metal3 FILLOPC 42 0 +Metal3 FILL 42 4 +Metal3 FILLOPC 42 4 Metal3 VIA 42 0 Metal3 VIAFILL 42 0 Metal3 VIAFILLOPC 42 0 @@ -81,8 +81,8 @@ Metal4 NET 46 0 Metal4 SPNET 46 0 Metal4 PIN 46 0 Metal4 LEFPIN 46 0 -Metal4 FILL 46 0 -Metal4 FILLOPC 46 0 +Metal4 FILL 46 4 +Metal4 FILLOPC 46 4 Metal4 VIA 46 0 Metal4 VIAFILL 46 0 Metal4 VIAFILLOPC 46 0 @@ -106,8 +106,8 @@ Metal5 NET 81 0 Metal5 SPNET 81 0 Metal5 PIN 81 0 Metal5 LEFPIN 81 0 -Metal5 FILL 81 0 -Metal5 FILLOPC 81 0 +Metal5 FILL 81 4 +Metal5 FILLOPC 81 4 Metal5 VIA 81 0 Metal5 VIAFILL 81 0 Metal5 VIAFILLOPC 81 0 diff --git a/flow/platforms/gf180/gds/9t/gf180mcu_5LM_1TM_9K_9t_edi2gds.layermap b/flow/platforms/gf180/gds/9t/gf180mcu_5LM_1TM_9K_9t_edi2gds.layermap index d690d3ffe0..0239c803aa 100755 --- a/flow/platforms/gf180/gds/9t/gf180mcu_5LM_1TM_9K_9t_edi2gds.layermap +++ b/flow/platforms/gf180/gds/9t/gf180mcu_5LM_1TM_9K_9t_edi2gds.layermap @@ -6,8 +6,8 @@ Metal1 NET 34 0 Metal1 SPNET 34 0 Metal1 PIN 34 0 Metal1 LEFPIN 34 0 -Metal1 FILL 34 0 -Metal1 FILLOPC 34 0 +Metal1 FILL 34 4 +Metal1 FILLOPC 34 4 Metal1 VIA 34 0 Metal1 VIAFILL 34 0 Metal1 VIAFILLOPC 34 0 @@ -31,8 +31,8 @@ Metal2 NET 36 0 Metal2 SPNET 36 0 Metal2 PIN 36 0 Metal2 LEFPIN 36 0 -Metal2 FILL 36 0 -Metal2 FILLOPC 36 0 +Metal2 FILL 36 4 +Metal2 FILLOPC 36 4 Metal2 VIA 36 0 Metal2 VIAFILL 36 0 Metal2 VIAFILLOPC 36 0 @@ -56,8 +56,8 @@ Metal3 NET 42 0 Metal3 SPNET 42 0 Metal3 PIN 42 0 Metal3 LEFPIN 42 0 -Metal3 FILL 42 0 -Metal3 FILLOPC 42 0 +Metal3 FILL 42 4 +Metal3 FILLOPC 42 4 Metal3 VIA 42 0 Metal3 VIAFILL 42 0 Metal3 VIAFILLOPC 42 0 @@ -81,8 +81,8 @@ Metal4 NET 46 0 Metal4 SPNET 46 0 Metal4 PIN 46 0 Metal4 LEFPIN 46 0 -Metal4 FILL 46 0 -Metal4 FILLOPC 46 0 +Metal4 FILL 46 4 +Metal4 FILLOPC 46 4 Metal4 VIA 46 0 Metal4 VIAFILL 46 0 Metal4 VIAFILLOPC 46 0 @@ -106,8 +106,8 @@ Metal5 NET 81 0 Metal5 SPNET 81 0 Metal5 PIN 81 0 Metal5 LEFPIN 81 0 -Metal5 FILL 81 0 -Metal5 FILLOPC 81 0 +Metal5 FILL 81 4 +Metal5 FILLOPC 81 4 Metal5 VIA 81 0 Metal5 VIAFILL 81 0 Metal5 VIAFILLOPC 81 0 diff --git a/flow/platforms/gf180/gds/9t/gf180mcu_6LM_1TM_9K_9t_edi2gds.layermap b/flow/platforms/gf180/gds/9t/gf180mcu_6LM_1TM_9K_9t_edi2gds.layermap index 67b85e06c1..1c60f62d19 100755 --- a/flow/platforms/gf180/gds/9t/gf180mcu_6LM_1TM_9K_9t_edi2gds.layermap +++ b/flow/platforms/gf180/gds/9t/gf180mcu_6LM_1TM_9K_9t_edi2gds.layermap @@ -6,8 +6,8 @@ Metal1 NET 34 0 Metal1 SPNET 34 0 Metal1 PIN 34 0 Metal1 LEFPIN 34 0 -Metal1 FILL 34 0 -Metal1 FILLOPC 34 0 +Metal1 FILL 34 4 +Metal1 FILLOPC 34 4 Metal1 VIA 34 0 Metal1 VIAFILL 34 0 Metal1 VIAFILLOPC 34 0 @@ -31,8 +31,8 @@ Metal2 NET 36 0 Metal2 SPNET 36 0 Metal2 PIN 36 0 Metal2 LEFPIN 36 0 -Metal2 FILL 36 0 -Metal2 FILLOPC 36 0 +Metal2 FILL 36 4 +Metal2 FILLOPC 36 4 Metal2 VIA 36 0 Metal2 VIAFILL 36 0 Metal2 VIAFILLOPC 36 0 @@ -56,8 +56,8 @@ Metal3 NET 42 0 Metal3 SPNET 42 0 Metal3 PIN 42 0 Metal3 LEFPIN 42 0 -Metal3 FILL 42 0 -Metal3 FILLOPC 42 0 +Metal3 FILL 42 4 +Metal3 FILLOPC 42 4 Metal3 VIA 42 0 Metal3 VIAFILL 42 0 Metal3 VIAFILLOPC 42 0 @@ -81,8 +81,8 @@ Metal4 NET 46 0 Metal4 SPNET 46 0 Metal4 PIN 46 0 Metal4 LEFPIN 46 0 -Metal4 FILL 46 0 -Metal4 FILLOPC 46 0 +Metal4 FILL 46 4 +Metal4 FILLOPC 46 4 Metal4 VIA 46 0 Metal4 VIAFILL 46 0 Metal4 VIAFILLOPC 46 0 @@ -106,8 +106,8 @@ Metal5 NET 81 0 Metal5 SPNET 81 0 Metal5 PIN 81 0 Metal5 LEFPIN 81 0 -Metal5 FILL 81 0 -Metal5 FILLOPC 81 0 +Metal5 FILL 81 4 +Metal5 FILLOPC 81 4 Metal5 VIA 81 0 Metal5 VIAFILL 81 0 Metal5 VIAFILLOPC 81 0