From d4e009d857344abbd0dcb84682948685c5e4d5c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 11:24:07 +0000 Subject: [PATCH 001/202] build(deps): bump peter-evans/create-pull-request from 7 to 8 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7 to 8. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v7...v8) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/github-actions-cron-update-OR.yml | 2 +- .github/workflows/github-actions-cron-update-yosys.yml | 2 +- .github/workflows/github-actions-update-rules.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/github-actions-cron-update-OR.yml b/.github/workflows/github-actions-cron-update-OR.yml index 1784acb15e..5ed3468030 100644 --- a/.github/workflows/github-actions-cron-update-OR.yml +++ b/.github/workflows/github-actions-cron-update-OR.yml @@ -24,7 +24,7 @@ jobs: git pull - if: "steps.remote-update.outputs.has_update != ''" name: Create Draft PR - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@v8 with: token: ${{ github.token }} signoff: true diff --git a/.github/workflows/github-actions-cron-update-yosys.yml b/.github/workflows/github-actions-cron-update-yosys.yml index 11bab5fe55..7f9f947eda 100644 --- a/.github/workflows/github-actions-cron-update-yosys.yml +++ b/.github/workflows/github-actions-cron-update-yosys.yml @@ -28,7 +28,7 @@ jobs: git checkout ${latesttag} - if: "steps.remote-update.outputs.has_update != ''" name: Create Draft PR - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@v8 with: token: ${{ github.token }} signoff: true diff --git a/.github/workflows/github-actions-update-rules.yml b/.github/workflows/github-actions-update-rules.yml index 6f85145a7d..930a280480 100644 --- a/.github/workflows/github-actions-update-rules.yml +++ b/.github/workflows/github-actions-update-rules.yml @@ -58,7 +58,7 @@ jobs: git push origin "HEAD:refs/pull/${{ github.event.client_payload.branch }}/head" - if: "steps.remote-update.outputs.has_update == 'true' && github.event.client_payload.branch == 'master'" name: Create Draft PR - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@v8 with: token: ${{ github.token }} signoff: true From 4a1659e6e363048751b5720876e0e4eb9885b0f7 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Sat, 14 Feb 2026 21:41:57 +0000 Subject: [PATCH 002/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 6975124cf2..4c20895a9c 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 6975124cf258e3be0db86bd2e59246b7f0e9f0c7 +Subproject commit 4c20895a9c675c97737a3dfe28253638e780f2e6 From ebf2615cdcb7b1497132baf3faf2d1e211990fc0 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Sat, 14 Feb 2026 22:05:13 +0000 Subject: [PATCH 003/202] add report_design_area to every stage Signed-off-by: Augusto Berndt --- flow/scripts/detail_route.tcl | 2 ++ flow/scripts/fillcell.tcl | 2 ++ flow/scripts/global_place_skip_io.tcl | 2 ++ flow/scripts/io_placement.tcl | 2 ++ flow/scripts/macro_place.tcl | 2 ++ flow/scripts/pdn.tcl | 2 ++ flow/scripts/tapcell.tcl | 2 ++ 7 files changed, 14 insertions(+) diff --git a/flow/scripts/detail_route.tcl b/flow/scripts/detail_route.tcl index e38a03089c..2cf4010628 100644 --- a/flow/scripts/detail_route.tcl +++ b/flow/scripts/detail_route.tcl @@ -77,6 +77,8 @@ if { ![design_is_routed] } { error "Design has unrouted nets." } +report_design_area + # Don't report metrics as we have not extracted parasitics, which will happen # in final so there is no need to repeat it here. diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index ba4b96912e..a2aa5d9439 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -8,6 +8,8 @@ if { [env_var_exists_and_non_empty FILL_CELLS] } { log_cmd filler_placement $::env(FILL_CELLS) check_placement +report_design_area + orfs_write_db $::env(RESULTS_DIR)/5_3_fillcell.odb } else { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb diff --git a/flow/scripts/global_place_skip_io.tcl b/flow/scripts/global_place_skip_io.tcl index 550df07fb6..ec5afc18a4 100644 --- a/flow/scripts/global_place_skip_io.tcl +++ b/flow/scripts/global_place_skip_io.tcl @@ -13,4 +13,6 @@ if { [env_var_exists_and_non_empty FLOORPLAN_DEF] } { {*}[env_var_or_empty GLOBAL_PLACEMENT_ARGS] } +report_design_area + orfs_write_db $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb diff --git a/flow/scripts/io_placement.tcl b/flow/scripts/io_placement.tcl index 0ec25dc545..93e2314a5e 100644 --- a/flow/scripts/io_placement.tcl +++ b/flow/scripts/io_placement.tcl @@ -16,3 +16,5 @@ if { } else { log_cmd exec cp $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb $::env(RESULTS_DIR)/3_2_place_iop.odb } + +report_design_area diff --git a/flow/scripts/macro_place.tcl b/flow/scripts/macro_place.tcl index 302dd7b9c7..5f77644c24 100644 --- a/flow/scripts/macro_place.tcl +++ b/flow/scripts/macro_place.tcl @@ -4,5 +4,7 @@ load_design 2_1_floorplan.odb 2_1_floorplan.sdc source $::env(SCRIPTS_DIR)/macro_place_util.tcl +report_design_area + orfs_write_db $::env(RESULTS_DIR)/2_2_floorplan_macro.odb write_macro_placement $::env(RESULTS_DIR)/2_2_floorplan_macro.tcl diff --git a/flow/scripts/pdn.tcl b/flow/scripts/pdn.tcl index 977fe71f1e..0d21d0e681 100644 --- a/flow/scripts/pdn.tcl +++ b/flow/scripts/pdn.tcl @@ -18,4 +18,6 @@ foreach net [$block getNets] { } } +report_design_area + orfs_write_db $::env(RESULTS_DIR)/2_4_floorplan_pdn.odb diff --git a/flow/scripts/tapcell.tcl b/flow/scripts/tapcell.tcl index cbd4ede9fc..7937dfcae9 100644 --- a/flow/scripts/tapcell.tcl +++ b/flow/scripts/tapcell.tcl @@ -9,4 +9,6 @@ if { [env_var_exists_and_non_empty TAPCELL_TCL] } { cut_rows } +report_design_area + orfs_write_db $::env(RESULTS_DIR)/2_3_floorplan_tapcell.odb From 295407b9a548f59ef7c873681c06a1a716496f16 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Thu, 19 Feb 2026 11:53:01 +0000 Subject: [PATCH 004/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 4c20895a9c..1b9f97fe24 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 4c20895a9c675c97737a3dfe28253638e780f2e6 +Subproject commit 1b9f97fe24e494f1f0afb12e2c5da95da3bf0641 From bedfbdc4798aabfa69fea9c85a1edf93f787ce54 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Thu, 19 Feb 2026 20:01:38 +0000 Subject: [PATCH 005/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 84ab1533a0..b97d5aa75f 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 84ab1533a0ac76d492e2a0e246d2e77e1e358873 +Subproject commit b97d5aa75f94d8a00d08d1c6b3dd40589133f248 From b9035da7c7081fff9451394e8bc3e6e9d6a0600f Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Fri, 27 Feb 2026 20:01:10 +0000 Subject: [PATCH 006/202] checkout submodule to master Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index b97d5aa75f..93cb34c5d4 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit b97d5aa75f94d8a00d08d1c6b3dd40589133f248 +Subproject commit 93cb34c5d4faafea180de896c4d631cddb5c56bf From bbdf61c40b75b667040ffd6134f4fc13dd7de404 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Fri, 27 Feb 2026 20:18:40 +0000 Subject: [PATCH 007/202] fix lint Signed-off-by: Augusto Berndt --- flow/scripts/fillcell.tcl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index a2aa5d9439..4fd5b4240e 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -8,9 +8,9 @@ if { [env_var_exists_and_non_empty FILL_CELLS] } { log_cmd filler_placement $::env(FILL_CELLS) check_placement -report_design_area - orfs_write_db $::env(RESULTS_DIR)/5_3_fillcell.odb } else { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb } + +report_design_area \ No newline at end of file From 24e6fd4f2d0d9ad743de76938982d55bae4b8ef3 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Fri, 27 Feb 2026 20:20:31 +0000 Subject: [PATCH 008/202] fix lint Signed-off-by: Augusto Berndt --- flow/scripts/fillcell.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index 4fd5b4240e..0d8767c797 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -13,4 +13,4 @@ if { [env_var_exists_and_non_empty FILL_CELLS] } { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb } -report_design_area \ No newline at end of file +report_design_area From fb59744a74ed36d6d174b9c322a4e41535464a64 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Mon, 2 Mar 2026 23:37:32 +0000 Subject: [PATCH 009/202] master version Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index b984a8d7e8..ad20cea649 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit b984a8d7e869745a923bf28037b373a3a6488a17 +Subproject commit ad20cea64902c65d53c317e1484c457955ca8f3f From d3ee55d5b776522d7386ddcb101f59bd54d55923 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Mon, 2 Mar 2026 23:37:50 +0000 Subject: [PATCH 010/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index ad20cea649..a84da87c40 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit ad20cea64902c65d53c317e1484c457955ca8f3f +Subproject commit a84da87c4016dc2673fdf8fd10264c819346573e From 5706afe490be7f0639f5054e4aef32f011fc938c Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Tue, 3 Mar 2026 14:54:15 +0000 Subject: [PATCH 011/202] master version Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index a84da87c40..9bccae44b2 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit a84da87c4016dc2673fdf8fd10264c819346573e +Subproject commit 9bccae44b256ae455773ec00a730fb8aa08692c3 From 9cf8a89af5b10c39a985573cd96862da5d3916cc Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Tue, 3 Mar 2026 15:31:18 +0000 Subject: [PATCH 012/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 9bccae44b2..332075920c 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 9bccae44b256ae455773ec00a730fb8aa08692c3 +Subproject commit 332075920c1268dcf5f95bfb84b95ee61ba02045 From 8f0b874b9b2f434832183b06c35f9bc52f025f85 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Tue, 3 Mar 2026 17:03:27 +0000 Subject: [PATCH 013/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 332075920c..4d82f35ca7 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 332075920c1268dcf5f95bfb84b95ee61ba02045 +Subproject commit 4d82f35ca7a9cbb6cf634a83ee1ceb5fe8a6d96b From 4995414b9e222e83a0e3c457b89b34e2c8dccaca Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Tue, 3 Mar 2026 21:02:23 +0000 Subject: [PATCH 014/202] master version Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 4d82f35ca7..f580417ddf 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 4d82f35ca7a9cbb6cf634a83ee1ceb5fe8a6d96b +Subproject commit f580417ddfc3a37d97c4e21ca66c840599f87d62 From eb12d45614ea765094642a8745a329257c49b9b4 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Tue, 3 Mar 2026 21:09:16 +0000 Subject: [PATCH 015/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index f580417ddf..d98a62c6ee 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit f580417ddfc3a37d97c4e21ca66c840599f87d62 +Subproject commit d98a62c6eefcbc940370c67f138827671a41c2e7 From 62d658b768e8bc68295bd3e0c48fd0eea77f1970 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 4 Mar 2026 11:01:06 +0900 Subject: [PATCH 016/202] design: Enable Kepler formal for gf12/bp_quad Signed-off-by: Jaehyun Kim --- flow/designs/gf12/bp_quad/config.mk | 2 -- 1 file changed, 2 deletions(-) diff --git a/flow/designs/gf12/bp_quad/config.mk b/flow/designs/gf12/bp_quad/config.mk index b76df07a43..5846c209b3 100644 --- a/flow/designs/gf12/bp_quad/config.mk +++ b/flow/designs/gf12/bp_quad/config.mk @@ -68,5 +68,3 @@ export MACRO_WRAPPERS = $(PLATFORM_DIR)/bp/wrappers/wrappers.tcl export PDN_TCL = $(PLATFORM_DIR)/cfg/pdn_grid_strategy_13m_9T.top.tcl export MACRO_PLACE_HALO = 7 7 - -export LEC_CHECK = 0 From 765547ad2308f4ca539ae8753546c9d8d68f1981 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 4 Mar 2026 11:19:55 +0900 Subject: [PATCH 017/202] design: Update gf12/bp_quad metrics from CI run | Metric | Old | New | Type | |--------------------------------------------|----------|----------|---------| | placeopt__design__instance__area | 1496173 | 1503890 | Failing | | placeopt__design__instance__count__stdcell | 1442363 | 1472164 | Failing | | cts__design__instance__count__setup_buffer | 125423 | 128014 | Failing | | cts__design__instance__count__hold_buffer | 125423 | 128014 | Failing | | cts__timing__setup__ws | -572.0 | -375.0 | Tighten | | cts__timing__setup__tns | -659000.0| -393000.0| Tighten | | globalroute__antenna_diodes_count | 0 | 1125 | Failing | | globalroute__timing__setup__ws | -117.0 | -223.0 | Failing | | globalroute__timing__setup__tns | -448.0 | -4160.0 | Failing | | globalroute__timing__hold__ws | -100.0 | -117.0 | Failing | | globalroute__timing__hold__tns | -400.0 | -519.0 | Failing | | detailedroute__route__wirelength | 24629256 | 26222976 | Failing | | detailedroute__antenna_diodes_count | 5 | 1131 | Failing | | finish__timing__setup__ws | -201.0 | -225.0 | Failing | | finish__timing__setup__tns | -1330.0 | -1730.0 | Failing | | finish__design__instance__area | 1523750 | 1534801 | Failing | Co-Authored-By: Claude Opus 4.6 Signed-off-by: Jaehyun Kim --- .../gf12/bp_quad/metadata-base-ok.json | 544 ++++++++++++++++++ flow/designs/gf12/bp_quad/rules-base.json | 32 +- 2 files changed, 560 insertions(+), 16 deletions(-) create mode 100644 flow/designs/gf12/bp_quad/metadata-base-ok.json diff --git a/flow/designs/gf12/bp_quad/metadata-base-ok.json b/flow/designs/gf12/bp_quad/metadata-base-ok.json new file mode 100644 index 0000000000..1e3e92d1f1 --- /dev/null +++ b/flow/designs/gf12/bp_quad/metadata-base-ok.json @@ -0,0 +1,544 @@ +{ + "constraints__clocks__count": 8, + "constraints__clocks__details": [ + "bp_clk: 2000.0000", + "io_master_clk: 1666.0000", + "router_clk: 1666.0000", + "sdi_a_clk: 3332.0000", + "sdi_b_clk: 3332.0000", + "sdo_a_tkn_clk: 3332.0000", + "sdo_b_tkn_clk: 3332.0000", + "tag_clk: 6666.0000" + ], + "cts__clock__skew__hold": 581.339, + "cts__clock__skew__setup": 463.129, + "cts__cpu__total": 11459.01, + "cts__design__core__area": 6758590.0, + "cts__design__die__area": 9000000.0, + "cts__design__instance__area": 1331960.0, + "cts__design__instance__area__cover": 1084610.0, + "cts__design__instance__area__macros": 771892, + "cts__design__instance__area__padcells": 1562400.0, + "cts__design__instance__area__stdcell": 560064, + "cts__design__instance__count": 1313807, + "cts__design__instance__count__cover": 269, + "cts__design__instance__count__hold_buffer": 208, + "cts__design__instance__count__macros": 200, + "cts__design__instance__count__padcells": 744, + "cts__design__instance__count__setup_buffer": 156, + "cts__design__instance__count__stdcell": 1312594, + "cts__design__instance__displacement__max": 27.247, + "cts__design__instance__displacement__mean": 0.0135, + "cts__design__instance__displacement__total": 18084.9, + "cts__design__instance__utilization": 0.197076, + "cts__design__instance__utilization__stdcell": 0.0935515, + "cts__design__io": 135, + "cts__design__rows": 36041, + "cts__design__rows__sc9mcpp84_12lp": 36041, + "cts__design__sites": 121359439, + "cts__design__sites__sc9mcpp84_12lp": 121359439, + "cts__design__violations": 0, + "cts__flow__errors__count": 0, + "cts__flow__warnings__count": 62, + "cts__flow__warnings__count__CTS-0041": 21, + "cts__flow__warnings__count__RSZ-0062": 1, + "cts__flow__warnings__count__STA-1551": 40, + "cts__flow__warnings__type_count": 3, + "cts__mem__peak": 14582444.0, + "cts__power__internal__total": 0.204627, + "cts__power__leakage__total": 0.00248766, + "cts__power__switching__total": 0.126006, + "cts__power__total": 0.333121, + "cts__route__wirelength__estimated": 19812200.0, + "cts__runtime__total": "55:42.92", + "cts__timing__drv__hold_violation_count": 0, + "cts__timing__drv__max_cap": 135, + "cts__timing__drv__max_cap_limit": -226.762, + "cts__timing__drv__max_fanout": 0, + "cts__timing__drv__max_fanout_limit": 30, + "cts__timing__drv__max_slew": 36755, + "cts__timing__drv__max_slew_limit": -51.5987, + "cts__timing__drv__setup_violation_count": 3787, + "cts__timing__fmax": 8688990000.0, + "cts__timing__fmax__clock__bp_clk": 439557000.0, + "cts__timing__fmax__clock__io_master_clk": 872909000.0, + "cts__timing__fmax__clock__router_clk": 842265000.0, + "cts__timing__fmax__clock__sdi_a_clk": 538964000.0, + "cts__timing__fmax__clock__sdi_b_clk": 529782000.0, + "cts__timing__fmax__clock__sdo_a_tkn_clk": 8688990000.0, + "cts__timing__fmax__clock__sdo_b_tkn_clk": 8564470000.0, + "cts__timing__fmax__clock__tag_clk": 323709000.0, + "cts__timing__hold__tns": 0, + "cts__timing__hold__ws": 0.00555112, + "cts__timing__setup__tns": -392298, + "cts__timing__setup__ws": -275.02, + "design__io__hpwl": 0, + "design__violations": 0, + "detailedplace__cpu__total": 1579.86, + "detailedplace__design__core__area": 6758590.0, + "detailedplace__design__die__area": 9000000.0, + "detailedplace__design__instance__area": 1307730.0, + "detailedplace__design__instance__area__cover": 1084610.0, + "detailedplace__design__instance__area__macros": 771892, + "detailedplace__design__instance__area__padcells": 1562400.0, + "detailedplace__design__instance__area__stdcell": 535833, + "detailedplace__design__instance__count": 1281356, + "detailedplace__design__instance__count__cover": 269, + "detailedplace__design__instance__count__macros": 200, + "detailedplace__design__instance__count__padcells": 744, + "detailedplace__design__instance__count__stdcell": 1280143, + "detailedplace__design__instance__displacement__max": 34.4355, + "detailedplace__design__instance__displacement__mean": 0.4265, + "detailedplace__design__instance__displacement__total": 547678, + "detailedplace__design__instance__utilization": 0.193491, + "detailedplace__design__instance__utilization__stdcell": 0.089504, + "detailedplace__design__io": 135, + "detailedplace__design__rows": 36041, + "detailedplace__design__rows__sc9mcpp84_12lp": 36041, + "detailedplace__design__sites": 121359439, + "detailedplace__design__sites__sc9mcpp84_12lp": 121359439, + "detailedplace__design__violations": 0, + "detailedplace__flow__errors__count": 0, + "detailedplace__flow__warnings__count": 40, + "detailedplace__flow__warnings__count__STA-1551": 40, + "detailedplace__flow__warnings__type_count": 1, + "detailedplace__mem__peak": 12529584.0, + "detailedplace__power__internal__total": 0.159596, + "detailedplace__power__leakage__total": 0.00245512, + "detailedplace__power__switching__total": 0.10972, + "detailedplace__power__total": 0.271771, + "detailedplace__route__wirelength__estimated": 19778000.0, + "detailedplace__runtime__total": "19:32.21", + "detailedplace__timing__drv__hold_violation_count": 1321, + "detailedplace__timing__drv__max_cap": 131, + "detailedplace__timing__drv__max_cap_limit": -226.762, + "detailedplace__timing__drv__max_fanout": 0, + "detailedplace__timing__drv__max_fanout_limit": 30, + "detailedplace__timing__drv__max_slew": 36600, + "detailedplace__timing__drv__max_slew_limit": -51.5406, + "detailedplace__timing__drv__setup_violation_count": 1947, + "detailedplace__timing__fmax": 8752090000.0, + "detailedplace__timing__fmax__clock__bp_clk": 424739000.0, + "detailedplace__timing__fmax__clock__io_master_clk": 780716000.0, + "detailedplace__timing__fmax__clock__router_clk": 849181000.0, + "detailedplace__timing__fmax__clock__sdi_a_clk": 458675000.0, + "detailedplace__timing__fmax__clock__sdi_b_clk": 449133000.0, + "detailedplace__timing__fmax__clock__sdo_a_tkn_clk": 8752090000.0, + "detailedplace__timing__fmax__clock__sdo_b_tkn_clk": 8735440000.0, + "detailedplace__timing__fmax__clock__tag_clk": 287948000.0, + "detailedplace__timing__hold__tns": -19338.4, + "detailedplace__timing__hold__ws": -58.5551, + "detailedplace__timing__setup__tns": -148518, + "detailedplace__timing__setup__ws": -354.387, + "detailedroute__antenna__violating__nets": 0, + "detailedroute__antenna__violating__pins": 0, + "detailedroute__antenna_diodes_count": 0, + "detailedroute__flow__errors__count": 0, + "detailedroute__flow__warnings__count": 124, + "detailedroute__flow__warnings__count__DRT-0120": 77, + "detailedroute__flow__warnings__count__DRT-0142": 5, + "detailedroute__flow__warnings__count__DRT-0625": 2, + "detailedroute__flow__warnings__count__STA-1551": 40, + "detailedroute__flow__warnings__type_count": 4, + "detailedroute__route__drc_errors": 0, + "detailedroute__route__drc_errors__iter__0": 476396, + "detailedroute__route__drc_errors__iter__1": 48103, + "detailedroute__route__drc_errors__iter__10": 581, + "detailedroute__route__drc_errors__iter__11": 466, + "detailedroute__route__drc_errors__iter__12": 345, + "detailedroute__route__drc_errors__iter__13": 255, + "detailedroute__route__drc_errors__iter__14": 245, + "detailedroute__route__drc_errors__iter__15": 222, + "detailedroute__route__drc_errors__iter__16": 184, + "detailedroute__route__drc_errors__iter__17": 407, + "detailedroute__route__drc_errors__iter__18": 191, + "detailedroute__route__drc_errors__iter__19": 102, + "detailedroute__route__drc_errors__iter__2": 23485, + "detailedroute__route__drc_errors__iter__20": 75, + "detailedroute__route__drc_errors__iter__21": 2, + "detailedroute__route__drc_errors__iter__22": 0, + "detailedroute__route__drc_errors__iter__3": 2167, + "detailedroute__route__drc_errors__iter__4": 1532, + "detailedroute__route__drc_errors__iter__5": 1196, + "detailedroute__route__drc_errors__iter__6": 1033, + "detailedroute__route__drc_errors__iter__7": 924, + "detailedroute__route__drc_errors__iter__8": 807, + "detailedroute__route__drc_errors__iter__9": 679, + "detailedroute__route__net": 1130739, + "detailedroute__route__net__special": 207, + "detailedroute__route__vias": 10804575, + "detailedroute__route__vias__multicut": 0, + "detailedroute__route__vias__singlecut": 10804575, + "detailedroute__route__wirelength": 22802588, + "detailedroute__route__wirelength__iter__0": 22840241, + "detailedroute__route__wirelength__iter__1": 22804889, + "detailedroute__route__wirelength__iter__10": 22802579, + "detailedroute__route__wirelength__iter__11": 22802614, + "detailedroute__route__wirelength__iter__12": 22802600, + "detailedroute__route__wirelength__iter__13": 22802604, + "detailedroute__route__wirelength__iter__14": 22802605, + "detailedroute__route__wirelength__iter__15": 22802605, + "detailedroute__route__wirelength__iter__16": 22802605, + "detailedroute__route__wirelength__iter__17": 22802629, + "detailedroute__route__wirelength__iter__18": 22802611, + "detailedroute__route__wirelength__iter__19": 22802609, + "detailedroute__route__wirelength__iter__2": 22801163, + "detailedroute__route__wirelength__iter__20": 22802602, + "detailedroute__route__wirelength__iter__21": 22802589, + "detailedroute__route__wirelength__iter__22": 22802588, + "detailedroute__route__wirelength__iter__3": 22802388, + "detailedroute__route__wirelength__iter__4": 22802456, + "detailedroute__route__wirelength__iter__5": 22802530, + "detailedroute__route__wirelength__iter__6": 22802546, + "detailedroute__route__wirelength__iter__7": 22802559, + "detailedroute__route__wirelength__iter__8": 22802565, + "detailedroute__route__wirelength__iter__9": 22802568, + "finish__clock__skew__hold": 502.977, + "finish__clock__skew__setup": 397.871, + "finish__cpu__total": 4256.23, + "finish__design__core__area": 6758590.0, + "finish__design__die__area": 9000000.0, + "finish__design__instance__area": 1334610.0, + "finish__design__instance__area__class__clock_buffer": 20140, + "finish__design__instance__area__class__clock_inverter": 2025.31, + "finish__design__instance__area__class__cover": 1084610.0, + "finish__design__instance__area__class__endcap_cell": 41844.4, + "finish__design__instance__area__class__fill_cell": 5309140.0, + "finish__design__instance__area__class__inverter": 1012.39, + "finish__design__instance__area__class__macro": 771892, + "finish__design__instance__area__class__multi_input_combinational_cell": 213519, + "finish__design__instance__area__class__pad": 1294300.0, + "finish__design__instance__area__class__pad_spacer": 268100, + "finish__design__instance__area__class__sequential_cell": 178781, + "finish__design__instance__area__class__tap_cell": 67023.9, + "finish__design__instance__area__class__tie_cell": 2901.3, + "finish__design__instance__area__class__timing_repair_buffer": 35466.3, + "finish__design__instance__area__cover": 1084610.0, + "finish__design__instance__area__macros": 771892, + "finish__design__instance__area__padcells": 1562400.0, + "finish__design__instance__area__stdcell": 562713, + "finish__design__instance__count": 1319548, + "finish__design__instance__count__class__clock_buffer": 20058, + "finish__design__instance__count__class__clock_inverter": 7775, + "finish__design__instance__count__class__cover": 269, + "finish__design__instance__count__class__endcap_cell": 72070, + "finish__design__instance__count__class__fill_cell": 3480699, + "finish__design__instance__count__class__inverter": 6951, + "finish__design__instance__count__class__macro": 200, + "finish__design__instance__count__class__multi_input_combinational_cell": 728454, + "finish__design__instance__count__class__pad": 311, + "finish__design__instance__count__class__pad_spacer": 433, + "finish__design__instance__count__class__sequential_cell": 230771, + "finish__design__instance__count__class__tap_cell": 117676, + "finish__design__instance__count__class__tie_cell": 14991, + "finish__design__instance__count__class__timing_repair_buffer": 119589, + "finish__design__instance__count__cover": 269, + "finish__design__instance__count__macros": 200, + "finish__design__instance__count__padcells": 744, + "finish__design__instance__count__stdcell": 1318335, + "finish__design__instance__utilization": 0.197468, + "finish__design__instance__utilization__stdcell": 0.0939939, + "finish__design__io": 135, + "finish__design__rows": 36041, + "finish__design__rows__sc9mcpp84_12lp": 36041, + "finish__design__sites": 121359439, + "finish__design__sites__sc9mcpp84_12lp": 121359439, + "finish__flow__errors__count": 0, + "finish__flow__warnings__count": 40, + "finish__flow__warnings__count__STA-1551": 40, + "finish__flow__warnings__type_count": 1, + "finish__mem__peak": 19923556.0, + "finish__power__internal__total": 0.204516, + "finish__power__leakage__total": 0.00248937, + "finish__power__switching__total": 0.125156, + "finish__power__total": 0.332162, + "finish__runtime__total": "34:14.62", + "finish__timing__drv__hold_violation_count": 1, + "finish__timing__drv__max_cap": 143, + "finish__timing__drv__max_cap_limit": -226.762, + "finish__timing__drv__max_fanout": 0, + "finish__timing__drv__max_fanout_limit": 30, + "finish__timing__drv__max_slew": 35691, + "finish__timing__drv__max_slew_limit": -24.2863, + "finish__timing__drv__setup_violation_count": 16, + "finish__timing__fmax": 8824440000.0, + "finish__timing__fmax__clock__bp_clk": 523822000.0, + "finish__timing__fmax__clock__io_master_clk": 1437950000.0, + "finish__timing__fmax__clock__router_clk": 965336000.0, + "finish__timing__fmax__clock__sdi_a_clk": 536310000.0, + "finish__timing__fmax__clock__sdi_b_clk": 542696000.0, + "finish__timing__fmax__clock__sdo_a_tkn_clk": 8824440000.0, + "finish__timing__fmax__clock__sdo_b_tkn_clk": 8529640000.0, + "finish__timing__fmax__clock__tag_clk": 315040000.0, + "finish__timing__hold__tns": -0.361822, + "finish__timing__hold__ws": -0.361822, + "finish__timing__setup__tns": -1326.46, + "finish__timing__setup__ws": -125.351, + "finish__timing__wns_percent_delay": -6.012022, + "finish_merge__cpu__total": 234.03, + "finish_merge__mem__peak": 9465324.0, + "finish_merge__runtime__total": "4:11.16", + "floorplan__cpu__total": 485.91, + "floorplan__design__core__area": 6758590.0, + "floorplan__design__die__area": 9000000.0, + "floorplan__design__instance__area": 1167960.0, + "floorplan__design__instance__area__cover": 1084610.0, + "floorplan__design__instance__area__macros": 754175, + "floorplan__design__instance__area__padcells": 1562400.0, + "floorplan__design__instance__area__stdcell": 413785, + "floorplan__design__instance__count": 1083846, + "floorplan__design__instance__count__cover": 269, + "floorplan__design__instance__count__macros": 200, + "floorplan__design__instance__count__padcells": 744, + "floorplan__design__instance__count__setup_buffer": 0, + "floorplan__design__instance__count__stdcell": 1082633, + "floorplan__design__instance__utilization": 0.172811, + "floorplan__design__instance__utilization__stdcell": 0.0689134, + "floorplan__design__io": 0, + "floorplan__design__rows": 4513, + "floorplan__design__rows__sc9mcpp84_12lp": 4513, + "floorplan__design__sites": 139686376, + "floorplan__design__sites__sc9mcpp84_12lp": 139686376, + "floorplan__flow__errors__count": 0, + "floorplan__flow__warnings__count": 42, + "floorplan__flow__warnings__count__EST-0027": 1, + "floorplan__flow__warnings__count__IFP-0028": 1, + "floorplan__flow__warnings__count__STA-1551": 40, + "floorplan__flow__warnings__type_count": 3, + "floorplan__mem__peak": 4654884.0, + "floorplan__power__internal__total": 0.159564, + "floorplan__power__leakage__total": 0.00244159, + "floorplan__power__switching__total": 0.108705, + "floorplan__power__total": 0.27071, + "floorplan__runtime__total": "4:38.69", + "floorplan__timing__fmax": 9463670000.0, + "floorplan__timing__fmax__clock__bp_clk": 807706000.0, + "floorplan__timing__fmax__clock__io_master_clk": 4858650000.0, + "floorplan__timing__fmax__clock__router_clk": 2493090000.0, + "floorplan__timing__fmax__clock__sdi_a_clk": 626838000.0, + "floorplan__timing__fmax__clock__sdi_b_clk": 626521000.0, + "floorplan__timing__fmax__clock__sdo_a_tkn_clk": 9463670000.0, + "floorplan__timing__fmax__clock__sdo_b_tkn_clk": 9463670000.0, + "floorplan__timing__fmax__clock__tag_clk": 297523000.0, + "floorplan__timing__hold__tns": -418662, + "floorplan__timing__hold__ws": -69.7168, + "floorplan__timing__setup__tns": 0, + "floorplan__timing__setup__ws": 72.813, + "flow__errors__count": 0, + "flow__warnings__count": 40, + "flow__warnings__count__MPL-0055": 2, + "flow__warnings__count__PDN-0110": 1001, + "flow__warnings__count__PDN-0195": 26, + "flow__warnings__count__PDN-1031": 1, + "flow__warnings__count__STA-1551": 40, + "flow__warnings__count__TAP-0014": 1, + "flow__warnings__count__TAP-0015": 1, + "flow__warnings__count__TAP-0016": 1, + "flow__warnings__count__TAP-0017": 1, + "flow__warnings__type_count": 1, + "globalplace__cpu__total": 29565.11, + "globalplace__design__core__area": 6758590.0, + "globalplace__design__die__area": 9000000.0, + "globalplace__design__instance__area": 1301380.0, + "globalplace__design__instance__area__cover": 1084610.0, + "globalplace__design__instance__area__macros": 771892, + "globalplace__design__instance__area__padcells": 1562400.0, + "globalplace__design__instance__area__stdcell": 529489, + "globalplace__design__instance__count": 1272818, + "globalplace__design__instance__count__cover": 269, + "globalplace__design__instance__count__macros": 200, + "globalplace__design__instance__count__padcells": 744, + "globalplace__design__instance__count__stdcell": 1271605, + "globalplace__design__instance__utilization": 0.192552, + "globalplace__design__instance__utilization__stdcell": 0.0884443, + "globalplace__design__io": 135, + "globalplace__design__rows": 36041, + "globalplace__design__rows__sc9mcpp84_12lp": 36041, + "globalplace__design__sites": 121359439, + "globalplace__design__sites__sc9mcpp84_12lp": 121359439, + "globalplace__flow__errors__count": 0, + "globalplace__flow__warnings__count": 51, + "globalplace__flow__warnings__count__GRT-0281": 4, + "globalplace__flow__warnings__count__RSZ-2005": 7, + "globalplace__flow__warnings__count__STA-1551": 40, + "globalplace__flow__warnings__type_count": 3, + "globalplace__mem__peak": 24444844.0, + "globalplace__power__internal__total": 0.159589, + "globalplace__power__leakage__total": 0.00244569, + "globalplace__power__switching__total": 0.109783, + "globalplace__power__total": 0.271817, + "globalplace__runtime__total": "2:56:49", + "globalplace__timing__fmax": 8632330000.0, + "globalplace__timing__fmax__clock__bp_clk": 302086000.0, + "globalplace__timing__fmax__clock__io_master_clk": 468081000.0, + "globalplace__timing__fmax__clock__router_clk": 848654000.0, + "globalplace__timing__fmax__clock__sdi_a_clk": 445342000.0, + "globalplace__timing__fmax__clock__sdi_b_clk": 403716000.0, + "globalplace__timing__fmax__clock__sdo_a_tkn_clk": 8599430000.0, + "globalplace__timing__fmax__clock__sdo_b_tkn_clk": 8632330000.0, + "globalplace__timing__fmax__clock__tag_clk": 287957000.0, + "globalplace__timing__hold__tns": -18864.5, + "globalplace__timing__hold__ws": -60.1563, + "globalplace__timing__setup__tns": -1867670.0, + "globalplace__timing__setup__ws": -1310.31, + "globalplace_io__cpu__total": 14.48, + "globalplace_io__mem__peak": 2978288.0, + "globalplace_io__runtime__total": "0:17.52", + "globalplace_skip_io__cpu__total": 13.27, + "globalplace_skip_io__mem__peak": 2222208.0, + "globalplace_skip_io__runtime__total": "0:15.95", + "globalroute__antenna__violating__nets": 0, + "globalroute__antenna__violating__pins": 0, + "globalroute__antenna_diodes_count": 0, + "globalroute__clock__skew__hold": 619.775, + "globalroute__clock__skew__setup": 499.657, + "globalroute__cpu__total": 24542.34, + "globalroute__design__core__area": 6758590.0, + "globalroute__design__die__area": 9000000.0, + "globalroute__design__instance__area": 1334610.0, + "globalroute__design__instance__area__cover": 1084610.0, + "globalroute__design__instance__area__macros": 771892, + "globalroute__design__instance__area__padcells": 1562400.0, + "globalroute__design__instance__area__stdcell": 562713, + "globalroute__design__instance__count": 1319548, + "globalroute__design__instance__count__cover": 269, + "globalroute__design__instance__count__hold_buffer": 23, + "globalroute__design__instance__count__macros": 200, + "globalroute__design__instance__count__padcells": 744, + "globalroute__design__instance__count__setup_buffer": 18, + "globalroute__design__instance__count__stdcell": 1318335, + "globalroute__design__instance__displacement__max": 5.952, + "globalroute__design__instance__displacement__mean": 0.007, + "globalroute__design__instance__displacement__total": 9569.14, + "globalroute__design__instance__utilization": 0.197468, + "globalroute__design__instance__utilization__stdcell": 0.0939939, + "globalroute__design__io": 135, + "globalroute__design__rows": 36041, + "globalroute__design__rows__sc9mcpp84_12lp": 36041, + "globalroute__design__sites": 121359439, + "globalroute__design__sites__sc9mcpp84_12lp": 121359439, + "globalroute__design__violations": 0, + "globalroute__flow__errors__count": 0, + "globalroute__flow__warnings__count": 4351, + "globalroute__flow__warnings__count__DRT-0120": 77, + "globalroute__flow__warnings__count__DRT-0142": 5, + "globalroute__flow__warnings__count__DRT-0625": 2, + "globalroute__flow__warnings__count__FLW-0010": 1, + "globalroute__flow__warnings__count__RSZ-0062": 1, + "globalroute__flow__warnings__count__RSZ-0066": 1, + "globalroute__flow__warnings__count__RSZ-0104": 1001, + "globalroute__flow__warnings__count__STA-1551": 40, + "globalroute__flow__warnings__type_count": 8, + "globalroute__global_route__vias": 122355, + "globalroute__global_route__wirelength": 26591486, + "globalroute__mem__peak": 67534512.0, + "globalroute__power__internal__total": 0.204377, + "globalroute__power__leakage__total": 0.00248937, + "globalroute__power__switching__total": 0.126957, + "globalroute__power__total": 0.333823, + "globalroute__route__net": 1124998, + "globalroute__route__net__special": 207, + "globalroute__route__wirelength__estimated": 19897500.0, + "globalroute__runtime__total": "2:23:14", + "globalroute__timing__clock__slack": "N/A", + "globalroute__timing__drv__hold_violation_count": 31, + "globalroute__timing__drv__max_cap": 135, + "globalroute__timing__drv__max_cap_limit": -226.762, + "globalroute__timing__drv__max_fanout": 0, + "globalroute__timing__drv__max_fanout_limit": 30, + "globalroute__timing__drv__max_slew": 36165, + "globalroute__timing__drv__max_slew_limit": -35.2588, + "globalroute__timing__drv__setup_violation_count": 147, + "globalroute__timing__fmax": 8401050000.0, + "globalroute__timing__fmax__clock__bp_clk": 471138000.0, + "globalroute__timing__fmax__clock__io_master_clk": 1042370000.0, + "globalroute__timing__fmax__clock__router_clk": 881813000.0, + "globalroute__timing__fmax__clock__sdi_a_clk": 547446000.0, + "globalroute__timing__fmax__clock__sdi_b_clk": 571803000.0, + "globalroute__timing__fmax__clock__sdo_a_tkn_clk": 8401050000.0, + "globalroute__timing__fmax__clock__sdo_b_tkn_clk": 8182710000.0, + "globalroute__timing__fmax__clock__tag_clk": 323599000.0, + "globalroute__timing__hold__tns": -118.895, + "globalroute__timing__hold__ws": -17.2091, + "globalroute__timing__setup__tns": -3757.95, + "globalroute__timing__setup__ws": -122.518, + "macro_place__wirelength": 28285600.0, + "placeopt__cpu__total": 1332.08, + "placeopt__design__core__area": 6758590.0, + "placeopt__design__die__area": 9000000.0, + "placeopt__design__instance__area": 1307730.0, + "placeopt__design__instance__area__cover": 1084610.0, + "placeopt__design__instance__area__macros": 771892, + "placeopt__design__instance__area__padcells": 1562400.0, + "placeopt__design__instance__area__stdcell": 535833, + "placeopt__design__instance__count": 1281356, + "placeopt__design__instance__count__cover": 269, + "placeopt__design__instance__count__macros": 200, + "placeopt__design__instance__count__padcells": 744, + "placeopt__design__instance__count__stdcell": 1280143, + "placeopt__design__instance__utilization": 0.193491, + "placeopt__design__instance__utilization__stdcell": 0.089504, + "placeopt__design__io": 135, + "placeopt__design__rows": 36041, + "placeopt__design__rows__sc9mcpp84_12lp": 36041, + "placeopt__design__sites": 121359439, + "placeopt__design__sites__sc9mcpp84_12lp": 121359439, + "placeopt__flow__errors__count": 0, + "placeopt__flow__warnings__count": 42, + "placeopt__flow__warnings__count__RSZ-0020": 1, + "placeopt__flow__warnings__count__RSZ-0095": 1, + "placeopt__flow__warnings__count__STA-1551": 40, + "placeopt__flow__warnings__type_count": 3, + "placeopt__mem__peak": 6938768.0, + "placeopt__power__internal__total": 0.159591, + "placeopt__power__leakage__total": 0.00245512, + "placeopt__power__switching__total": 0.109783, + "placeopt__power__total": 0.271829, + "placeopt__runtime__total": "12:19.78", + "placeopt__timing__drv__floating__nets": 2, + "placeopt__timing__drv__floating__pins": 52, + "placeopt__timing__drv__hold_violation_count": 1324, + "placeopt__timing__drv__max_cap": 131, + "placeopt__timing__drv__max_cap_limit": -226.762, + "placeopt__timing__drv__max_fanout": 0, + "placeopt__timing__drv__max_fanout_limit": 30, + "placeopt__timing__drv__max_slew": 36460, + "placeopt__timing__drv__max_slew_limit": -51.6793, + "placeopt__timing__drv__setup_violation_count": 2535, + "placeopt__timing__fmax": 8632330000.0, + "placeopt__timing__fmax__clock__bp_clk": 420998000.0, + "placeopt__timing__fmax__clock__io_master_clk": 773281000.0, + "placeopt__timing__fmax__clock__router_clk": 848654000.0, + "placeopt__timing__fmax__clock__sdi_a_clk": 457833000.0, + "placeopt__timing__fmax__clock__sdi_b_clk": 448330000.0, + "placeopt__timing__fmax__clock__sdo_a_tkn_clk": 8599430000.0, + "placeopt__timing__fmax__clock__sdo_b_tkn_clk": 8632330000.0, + "placeopt__timing__fmax__clock__tag_clk": 287957000.0, + "placeopt__timing__hold__tns": -19464.1, + "placeopt__timing__hold__ws": -60.1563, + "placeopt__timing__setup__tns": -203231, + "placeopt__timing__setup__ws": -375.307, + "run__flow__design": "bp_quad", + "run__flow__generate_date": "2026-03-03 18:57", + "run__flow__metrics_version": "Metrics_2.1.2", + "run__flow__openroad_commit": "N/A", + "run__flow__openroad_version": "26Q1-1544-g7683add10f", + "run__flow__platform": "gf12", + "run__flow__platform__capacitance_units": "1fF", + "run__flow__platform__current_units": "1uA", + "run__flow__platform__distance_units": "1um", + "run__flow__platform__power_units": "1pW", + "run__flow__platform__resistance_units": "1kohm", + "run__flow__platform__time_units": "1ps", + "run__flow__platform__voltage_units": "1v", + "run__flow__platform_commit": "1cb6d49d9a7562b0eb14786120ab7c08e104a5b6", + "run__flow__scripts_commit": "not a git repo", + "run__flow__uuid": "94844a45-9bdb-41c3-aedf-fd129fba5df0", + "run__flow__variant": "base", + "synth__cpu__total": 0.1, + "synth__design__instance__area__stdcell": "ERR", + "synth__design__instance__count__stdcell": "ERR", + "synth__mem__peak": 22016.0, + "synth__runtime__total": "0:00.28", + "total_time": "7:31:16.130000" +} \ No newline at end of file diff --git a/flow/designs/gf12/bp_quad/rules-base.json b/flow/designs/gf12/bp_quad/rules-base.json index 9f06523d88..424a10a695 100644 --- a/flow/designs/gf12/bp_quad/rules-base.json +++ b/flow/designs/gf12/bp_quad/rules-base.json @@ -4,11 +4,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1496173, + "value": 1503890, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 1442363, + "value": 1472164, "compare": "<=" }, "detailedplace__design__violations": { @@ -16,19 +16,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 125423, + "value": 128014, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 125423, + "value": 128014, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -572.0, + "value": -375.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -659000.0, + "value": -393000.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -40,27 +40,27 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 0, + "value": 1125, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -117.0, + "value": -223.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -448.0, + "value": -4160.0, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -100.0, + "value": -117.0, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -400.0, + "value": -519.0, "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 24629256, + "value": 26222976, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -72,15 +72,15 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 5, + "value": 1131, "compare": "<=" }, "finish__timing__setup__ws": { - "value": -201.0, + "value": -225.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1330.0, + "value": -1730.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -92,7 +92,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1523750, + "value": 1534801, "compare": "<=" } } \ No newline at end of file From adec395b61192c30c14c6edb9b15c1135155ccf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:26:28 +0000 Subject: [PATCH 018/202] Bump docker/login-action from 3 to 4 Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/github-actions-publish-docker-images.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/github-actions-publish-docker-images.yml b/.github/workflows/github-actions-publish-docker-images.yml index ef64cc8e30..4b4b667743 100644 --- a/.github/workflows/github-actions-publish-docker-images.yml +++ b/.github/workflows/github-actions-publish-docker-images.yml @@ -40,7 +40,7 @@ jobs: - name: Login to GitHub Container Registry (GHCR) if: github.event_name != 'pull_request' - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: gha @@ -78,7 +78,7 @@ jobs: - name: Login to GitHub Container Registry (GHCR) if: github.event_name != 'pull_request' - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: gha @@ -129,7 +129,7 @@ jobs: - name: Login to GitHub Container Registry (GHCR) if: github.event_name != 'pull_request' - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: gha From 4879a2c5526db7260bdb5525c10098f65a6e3f48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 11:26:18 +0000 Subject: [PATCH 019/202] Bump docker/setup-buildx-action from 3 to 4 Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/github-actions-publish-docker-images.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/github-actions-publish-docker-images.yml b/.github/workflows/github-actions-publish-docker-images.yml index ef64cc8e30..c79e0e740e 100644 --- a/.github/workflows/github-actions-publish-docker-images.yml +++ b/.github/workflows/github-actions-publish-docker-images.yml @@ -36,7 +36,7 @@ jobs: run: echo "IMAGE=ghcr.io/$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to GitHub Container Registry (GHCR) if: github.event_name != 'pull_request' @@ -74,7 +74,7 @@ jobs: echo "IMAGE_DEPS=ghcr.io/$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')-dev/${{ matrix.os[0] }}" >> $GITHUB_ENV - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to GitHub Container Registry (GHCR) if: github.event_name != 'pull_request' @@ -125,7 +125,7 @@ jobs: echo "NUM_THREADS=$(nproc)" >> $GITHUB_ENV - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to GitHub Container Registry (GHCR) if: github.event_name != 'pull_request' From 41a88b19c876abd20376583e5cc3e6f99600ec68 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Thu, 5 Mar 2026 13:00:56 +0000 Subject: [PATCH 020/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 1f44de5c23..97eed02706 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 1f44de5c231976d8ec020abc631ce5116bd26ac4 +Subproject commit 97eed027068c1d691de9d531bec3f683bc82f5d8 From bb1ed96a318a8988db122007f96a31fde752d553 Mon Sep 17 00:00:00 2001 From: arthurjolo Date: Thu, 5 Mar 2026 18:05:02 +0000 Subject: [PATCH 021/202] flow: change asap7/aes CORE_UTILIZATION from 40 to 70 Signed-off-by: arthurjolo --- flow/designs/asap7/aes/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/asap7/aes/config.mk b/flow/designs/asap7/aes/config.mk index 9dc285d86c..0d310cc6b8 100644 --- a/flow/designs/asap7/aes/config.mk +++ b/flow/designs/asap7/aes/config.mk @@ -8,7 +8,7 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint. export ABC_AREA = 1 -export CORE_UTILIZATION = 40 +export CORE_UTILIZATION = 70 export CORE_ASPECT_RATIO = 1 export CORE_MARGIN = 2 export PLACE_DENSITY = 0.65 From 6bb11d4d9a51055728caa3d92bceada434b8f892 Mon Sep 17 00:00:00 2001 From: arthurjolo Date: Thu, 5 Mar 2026 18:05:58 +0000 Subject: [PATCH 022/202] flow: change asap7/gcd CORE_UTILIZATION from 40 to 65 Signed-off-by: arthurjolo --- flow/designs/asap7/gcd/config.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/flow/designs/asap7/gcd/config.mk b/flow/designs/asap7/gcd/config.mk index 8bfb86c8e2..c98498e7a8 100644 --- a/flow/designs/asap7/gcd/config.mk +++ b/flow/designs/asap7/gcd/config.mk @@ -5,8 +5,9 @@ export DESIGN_NAME = gcd export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/$(DESIGN_NAME)/*.v)) export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/constraint.sdc -export DIE_AREA = 0 0 16.2 16.2 -export CORE_AREA = 1.08 1.08 15.12 15.12 +export CORE_UTILIZATION = 65 +export CORE_ASPECT_RATIO = 1 +export CORE_MARGIN = 0.5 # The goal of this design is to have a smoketest that builds quickly, # that said, this design will go through grt with a 0.99 placement density. export PLACE_DENSITY = 0.35 From 25b9be9f4e1829703f62ea4a1ff5f54896faf5d9 Mon Sep 17 00:00:00 2001 From: arthurjolo Date: Thu, 5 Mar 2026 19:19:39 +0000 Subject: [PATCH 023/202] flow: change sky130hd/ibex CORE_UTILIZATION from 45 to 50 Signed-off-by: arthurjolo --- flow/designs/sky130hd/ibex/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/sky130hd/ibex/config.mk b/flow/designs/sky130hd/ibex/config.mk index 8e4c3764b5..d2b3429777 100644 --- a/flow/designs/sky130hd/ibex/config.mk +++ b/flow/designs/sky130hd/ibex/config.mk @@ -15,7 +15,7 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint. # Adders degrade ibex setup repair export ADDER_MAP_FILE := -export CORE_UTILIZATION = 45 +export CORE_UTILIZATION = 50 export PLACE_DENSITY_LB_ADDON = 0.25 export TNS_END_PERCENT = 100 From 49381bab4275c081f8c1f9169ecf0b3bfb185899 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 11:25:59 +0000 Subject: [PATCH 024/202] Bump docker/build-push-action from 6 to 7 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6...v7) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/github-actions-publish-docker-images.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/github-actions-publish-docker-images.yml b/.github/workflows/github-actions-publish-docker-images.yml index ef64cc8e30..af3afdc5de 100644 --- a/.github/workflows/github-actions-publish-docker-images.yml +++ b/.github/workflows/github-actions-publish-docker-images.yml @@ -47,7 +47,7 @@ jobs: password: ${{ github.token }} - name: Build and export codespaces image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . push: true @@ -88,7 +88,7 @@ jobs: run: cp tools/OpenROAD/etc/DependencyInstaller.sh etc/InstallerOpenROAD.sh - name: Build and export dependencies image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: etc push: true @@ -136,7 +136,7 @@ jobs: password: ${{ github.token }} - name: Build and export ORFS image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . push: true From f79febda370e4495d7149056c99caeaf35d4beb9 Mon Sep 17 00:00:00 2001 From: arthurjolo Date: Fri, 6 Mar 2026 14:03:03 +0000 Subject: [PATCH 025/202] asap7/aes: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | synth__design__instance__area__stdcell | 1928.39 | 1920.0 | Tighten | | placeopt__design__instance__area | 2162 | 2049 | Tighten | | placeopt__design__instance__count__stdcell | 19594 | 19328 | Tighten | | cts__design__instance__count__setup_buffer | 1704 | 1681 | Tighten | | cts__design__instance__count__hold_buffer | 1704 | 1681 | Tighten | | cts__timing__setup__tns | -1100.0 | -226.0 | Tighten | | globalroute__timing__setup__tns | -2170.0 | -846.0 | Tighten | | detailedroute__route__wirelength | 72539 | 68021 | Tighten | | finish__timing__setup__ws | -42.2 | -39.9 | Tighten | | finish__timing__setup__tns | -825.0 | -357.0 | Tighten | | finish__design__instance__area | 2269 | 2149 | Tighten | Signed-off-by: arthurjolo --- flow/designs/asap7/aes/rules-base.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/flow/designs/asap7/aes/rules-base.json b/flow/designs/asap7/aes/rules-base.json index aee5cc07ed..4fbd47958b 100644 --- a/flow/designs/asap7/aes/rules-base.json +++ b/flow/designs/asap7/aes/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 1928.39, + "value": 1920.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 2162, + "value": 2049, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 19594, + "value": 19328, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 1704, + "value": 1681, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 1704, + "value": 1681, "compare": "<=" }, "cts__timing__setup__ws": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1100.0, + "value": -226.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2170.0, + "value": -846.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 72539, + "value": 68021, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -42.2, + "value": -39.9, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -825.0, + "value": -357.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 2269, + "value": 2149, "compare": "<=" } } \ No newline at end of file From ce8a506e7cd799063d7c7060f21a71f20675477d Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Fri, 6 Mar 2026 14:03:26 +0000 Subject: [PATCH 026/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index d98a62c6ee..f54bcafd20 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit d98a62c6eefcbc940370c67f138827671a41c2e7 +Subproject commit f54bcafd20e12f115fed08d0e6da3539e5e9c7ff From 317b125d3ad6b21183f2299454b03b9f5274b69d Mon Sep 17 00:00:00 2001 From: arthurjolo Date: Fri, 6 Mar 2026 14:04:11 +0000 Subject: [PATCH 027/202] asap7/gcd: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | placeopt__design__instance__area | 52 | 50 | Tighten | | placeopt__design__instance__count__stdcell | 531 | 473 | Tighten | | cts__design__instance__count__setup_buffer | 47 | 41 | Tighten | | cts__design__instance__count__hold_buffer | 46 | 41 | Tighten | | cts__timing__setup__ws | -53.6 | -38.0 | Tighten | | cts__timing__setup__tns | -281.0 | -119.0 | Tighten | | globalroute__timing__setup__ws | -64.0 | -47.4 | Tighten | | globalroute__timing__setup__tns | -439.0 | -290.0 | Tighten | | detailedroute__route__wirelength | 1352 | 1053 | Tighten | | finish__timing__setup__ws | -48.6 | -37.5 | Tighten | | finish__timing__setup__tns | -270.0 | -185.0 | Tighten | Signed-off-by: arthurjolo --- flow/designs/asap7/gcd/rules-base.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/flow/designs/asap7/gcd/rules-base.json b/flow/designs/asap7/gcd/rules-base.json index 5b577397e3..815558c3d0 100644 --- a/flow/designs/asap7/gcd/rules-base.json +++ b/flow/designs/asap7/gcd/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 52, + "value": 50, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 531, + "value": 473, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 47, + "value": 41, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 46, + "value": 41, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -53.6, + "value": -38.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -281.0, + "value": -119.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -64.0, + "value": -47.4, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -439.0, + "value": -290.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1352, + "value": 1053, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -48.6, + "value": -37.5, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -270.0, + "value": -185.0, "compare": ">=" }, "finish__timing__hold__ws": { From d30cc7a49c0e9cf21f55a04503a3f95307339cfa Mon Sep 17 00:00:00 2001 From: arthurjolo Date: Fri, 6 Mar 2026 14:05:43 +0000 Subject: [PATCH 028/202] sky130hd ibex: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | placeopt__design__instance__area | 169126 | 167557 | Tighten | | detailedroute__route__wirelength | 749863 | 728653 | Tighten | | finish__design__instance__area | 180708 | 179572 | Tighten | Signed-off-by: arthurjolo --- flow/designs/sky130hd/ibex/rules-base.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flow/designs/sky130hd/ibex/rules-base.json b/flow/designs/sky130hd/ibex/rules-base.json index 4be669d3f9..e36f0c7475 100644 --- a/flow/designs/sky130hd/ibex/rules-base.json +++ b/flow/designs/sky130hd/ibex/rules-base.json @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 169126, + "value": 167557, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 749863, + "value": 728653, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 180708, + "value": 179572, "compare": "<=" } } \ No newline at end of file From c8b1170719db8617652890ce7f59a78482f8ea0a Mon Sep 17 00:00:00 2001 From: Dhirenderchoudhary Date: Fri, 6 Mar 2026 18:33:54 +0530 Subject: [PATCH 029/202] Add systematic PRE/POST Tcl hooks for flow steps Signed-off-by: Dhirenderchoudhary --- docs/user/FlowVariables.md | 66 ++- flow/scripts/cts.tcl | 3 +- flow/scripts/density_fill.tcl | 3 + flow/scripts/detail_place.tcl | 3 + flow/scripts/detail_route.tcl | 3 +- flow/scripts/fillcell.tcl | 3 + flow/scripts/final_report.tcl | 3 + flow/scripts/floorplan.tcl | 3 +- flow/scripts/global_place.tcl | 3 + flow/scripts/global_place_skip_io.tcl | 3 + flow/scripts/global_route.tcl | 3 +- flow/scripts/io_placement.tcl | 3 + flow/scripts/macro_place.tcl | 3 + flow/scripts/pdn.tcl | 3 +- flow/scripts/repair_timing_post_place.tcl | 3 + flow/scripts/resize.tcl | 3 + flow/scripts/synth_odb.tcl | 3 + flow/scripts/tapcell.tcl | 3 + flow/scripts/util.tcl | 5 + flow/scripts/variables.yaml | 651 ++++++++++++++++++++++ 20 files changed, 767 insertions(+), 6 deletions(-) diff --git a/docs/user/FlowVariables.md b/docs/user/FlowVariables.md index 0ebd3722ef..60d61344fc 100644 --- a/docs/user/FlowVariables.md +++ b/docs/user/FlowVariables.md @@ -192,7 +192,39 @@ configuration file. | PLATFORM| Specifies process design kit or technology node to be used.| | | PLATFORM_TCL| Specifies a Tcl script with commands to run before loading design.| | | POST_CTS_TCL| Specifies a Tcl script with commands to run after CTS is completed.| | +| POST_DENSITY_FILL_TCL| Specifies a Tcl script with commands to run after density fill.| | +| POST_DETAIL_PLACE_TCL| Specifies a Tcl script with commands to run after detailed placement.| | +| POST_DETAIL_ROUTE_TCL| Specifies a Tcl script with commands to run after detailed route.| | +| POST_FILLCELL_TCL| Specifies a Tcl script with commands to run after fillcell insertion.| | +| POST_FINAL_REPORT_TCL| Specifies a Tcl script with commands to run after final report generation.| | +| POST_FLOORPLAN_TCL| Specifies a Tcl script with commands to run after floorplan is completed.| | +| POST_GLOBAL_PLACE_SKIP_IO_TCL| Specifies a Tcl script with commands to run after global placement (skip IO).| | +| POST_GLOBAL_PLACE_TCL| Specifies a Tcl script with commands to run after global placement.| | +| POST_GLOBAL_ROUTE_TCL| Specifies a Tcl script with commands to run after global route.| | +| POST_IO_PLACEMENT_TCL| Specifies a Tcl script with commands to run after IO placement.| | +| POST_MACRO_PLACE_TCL| Specifies a Tcl script with commands to run after macro placement.| | +| POST_PDN_TCL| Specifies a Tcl script with commands to run after PDN generation.| | +| POST_REPAIR_TIMING_POST_PLACE_TCL| Specifies a Tcl script with commands to run after post-place timing repair.| | +| POST_RESIZE_TCL| Specifies a Tcl script with commands to run after resize.| | +| POST_SYNTH_TCL| Specifies a Tcl script with commands to run after synthesis ODB generation.| | +| POST_TAPCELL_TCL| Specifies a Tcl script with commands to run after tapcell.| | +| PRE_CTS_TCL| Specifies a Tcl script with commands to run before CTS.| | +| PRE_DENSITY_FILL_TCL| Specifies a Tcl script with commands to run before density fill.| | +| PRE_DETAIL_PLACE_TCL| Specifies a Tcl script with commands to run before detailed placement.| | +| PRE_DETAIL_ROUTE_TCL| Specifies a Tcl script with commands to run before detailed route.| | +| PRE_FILLCELL_TCL| Specifies a Tcl script with commands to run before fillcell insertion.| | +| PRE_FINAL_REPORT_TCL| Specifies a Tcl script with commands to run before final report generation.| | +| PRE_FLOORPLAN_TCL| Specifies a Tcl script with commands to run before floorplan.| | +| PRE_GLOBAL_PLACE_SKIP_IO_TCL| Specifies a Tcl script with commands to run before global placement (skip IO).| | +| PRE_GLOBAL_PLACE_TCL| Specifies a Tcl script with commands to run before global placement.| | | PRE_GLOBAL_ROUTE_TCL| Specifies a Tcl script with commands to run before global route.| | +| PRE_IO_PLACEMENT_TCL| Specifies a Tcl script with commands to run before IO placement.| | +| PRE_MACRO_PLACE_TCL| Specifies a Tcl script with commands to run before macro placement.| | +| PRE_PDN_TCL| Specifies a Tcl script with commands to run before PDN generation.| | +| PRE_REPAIR_TIMING_POST_PLACE_TCL| Specifies a Tcl script with commands to run before post-place timing repair.| | +| PRE_RESIZE_TCL| Specifies a Tcl script with commands to run before resize.| | +| PRE_SYNTH_TCL| Specifies a Tcl script with commands to run before synthesis ODB generation.| | +| PRE_TAPCELL_TCL| Specifies a Tcl script with commands to run before tapcell.| | | PROCESS| Technology node or process in use.| | | PWR_NETS_VOLTAGES| Used for IR Drop calculation.| | | RCX_RULES| RC Extraction rules file path.| | @@ -261,7 +293,7 @@ configuration file. | SYNTH_NETLIST_FILES| Skips synthesis and uses the supplied netlist files. If the netlist files contains duplicate modules, which can happen when using hierarchical synthesis on indvidual netlist files and combining here, subsequent modules are silently ignored and only the first module is used.| | | SYNTH_OPT_HIER| Optimize constants across hierarchical boundaries.| | | SYNTH_REPEATABLE_BUILD| License to prune anything that makes builds less repeatable, typically used with Bazel to ensure that builds are bit-for-bit identical so that caching works optimally. Removes debug information that encodes paths, timestamps, etc.| 0| -| SYNTH_RETIME_MODULES| *This is an experimental option and may cause adverse effects.* *No effort has been made to check if the retimed RTL is logically equivalent to the non-retimed RTL.* List of modules to apply automatic retiming to. These modules must not get dissolved and as such they should either be the top module or be included in SYNTH_KEEP_MODULES. The main use case is to quickly identify if performance can be improved by manually retiming the input RTL. Retiming will treat module ports like register endpoints/startpoints. The objective function of retiming isn't informed by SDC, even the clock period is ignored. As such, retiming will optimize for best delay at potentially high register number cost. Automatic retiming can produce suboptimal results as its timing model is crude and it doesn't find the optimal distribution of registers on long pipelines. See OR discussion #8080.| | +| SYNTH_RETIME_MODULES| *This is an experimental option and may cause adverse effects.* *No effort has been made to check if the retimed RTL is logically equivalent to the non-retimed RTL.* List of modules to apply automatic retiming to. These modules must not get dissolved and as such they should either be the top module or be included in SYNTH_KEEP_MODULES. The main use case is to quickly identify if performance can be improved by manually retiming the input RTL. Retiming will treat module ports like register endpoints/startpoints. The objective function of retiming isn't informed by SDC, even the clock period is ignored. As such, retiming will optimize for best delay at potentially high register number cost. Automatic retiming can produce suboptimal results as its timing model is crude and it doesn't find the optimal distribution of registers on long pipelines. See OR discussion # 8080.| | | SYNTH_SLANG_ARGS| Additional arguments passed to the slang frontend during synthesis.| | | SYNTH_WRAPPED_ADDERS| Specify the adder modules that can be used for synthesis, separated by commas. The default adder module is determined by the first element of this variable.| | | SYNTH_WRAPPED_MULTIPLIERS| Specify the multiplier modules that can be used for synthesis, separated by commas. The default multiplier module is determined by the first element of this variable.| | @@ -291,6 +323,8 @@ configuration file. - [DFF_MAP_FILE](#DFF_MAP_FILE) - [LATCH_MAP_FILE](#LATCH_MAP_FILE) - [MIN_BUF_CELL_AND_PORTS](#MIN_BUF_CELL_AND_PORTS) +- [POST_SYNTH_TCL](#POST_SYNTH_TCL) +- [PRE_SYNTH_TCL](#PRE_SYNTH_TCL) - [SDC_FILE](#SDC_FILE) - [SDC_GUT](#SDC_GUT) - [SYNTH_ARGS](#SYNTH_ARGS) @@ -349,6 +383,14 @@ configuration file. - [PLACE_DENSITY](#PLACE_DENSITY) - [PLACE_DENSITY_LB_ADDON](#PLACE_DENSITY_LB_ADDON) - [PLACE_SITE](#PLACE_SITE) +- [POST_FLOORPLAN_TCL](#POST_FLOORPLAN_TCL) +- [POST_MACRO_PLACE_TCL](#POST_MACRO_PLACE_TCL) +- [POST_PDN_TCL](#POST_PDN_TCL) +- [POST_TAPCELL_TCL](#POST_TAPCELL_TCL) +- [PRE_FLOORPLAN_TCL](#PRE_FLOORPLAN_TCL) +- [PRE_MACRO_PLACE_TCL](#PRE_MACRO_PLACE_TCL) +- [PRE_PDN_TCL](#PRE_PDN_TCL) +- [PRE_TAPCELL_TCL](#PRE_TAPCELL_TCL) - [REMOVE_ABC_BUFFERS](#REMOVE_ABC_BUFFERS) - [ROUTING_LAYER_ADJUSTMENT](#ROUTING_LAYER_ADJUSTMENT) - [RTLMP_AREA_WT](#RTLMP_AREA_WT) @@ -408,6 +450,18 @@ configuration file. - [PLACE_DENSITY](#PLACE_DENSITY) - [PLACE_DENSITY_LB_ADDON](#PLACE_DENSITY_LB_ADDON) - [PLACE_PINS_ARGS](#PLACE_PINS_ARGS) +- [POST_DETAIL_PLACE_TCL](#POST_DETAIL_PLACE_TCL) +- [POST_GLOBAL_PLACE_SKIP_IO_TCL](#POST_GLOBAL_PLACE_SKIP_IO_TCL) +- [POST_GLOBAL_PLACE_TCL](#POST_GLOBAL_PLACE_TCL) +- [POST_IO_PLACEMENT_TCL](#POST_IO_PLACEMENT_TCL) +- [POST_REPAIR_TIMING_POST_PLACE_TCL](#POST_REPAIR_TIMING_POST_PLACE_TCL) +- [POST_RESIZE_TCL](#POST_RESIZE_TCL) +- [PRE_DETAIL_PLACE_TCL](#PRE_DETAIL_PLACE_TCL) +- [PRE_GLOBAL_PLACE_SKIP_IO_TCL](#PRE_GLOBAL_PLACE_SKIP_IO_TCL) +- [PRE_GLOBAL_PLACE_TCL](#PRE_GLOBAL_PLACE_TCL) +- [PRE_IO_PLACEMENT_TCL](#PRE_IO_PLACEMENT_TCL) +- [PRE_REPAIR_TIMING_POST_PLACE_TCL](#PRE_REPAIR_TIMING_POST_PLACE_TCL) +- [PRE_RESIZE_TCL](#PRE_RESIZE_TCL) - [ROUTING_LAYER_ADJUSTMENT](#ROUTING_LAYER_ADJUSTMENT) - [SKIP_REPORT_METRICS](#SKIP_REPORT_METRICS) - [TNS_END_PERCENT](#TNS_END_PERCENT) @@ -430,6 +484,7 @@ configuration file. - [MATCH_CELL_FOOTPRINT](#MATCH_CELL_FOOTPRINT) - [MAX_REPAIR_TIMING_ITER](#MAX_REPAIR_TIMING_ITER) - [POST_CTS_TCL](#POST_CTS_TCL) +- [PRE_CTS_TCL](#PRE_CTS_TCL) - [REMOVE_CELLS_FOR_EQY](#REMOVE_CELLS_FOR_EQY) - [REPORT_CLOCK_SKEW](#REPORT_CLOCK_SKEW) - [SETUP_REPAIR_SEQUENCE](#SETUP_REPAIR_SEQUENCE) @@ -453,6 +508,7 @@ configuration file. - [MAX_REPAIR_TIMING_ITER](#MAX_REPAIR_TIMING_ITER) - [MAX_ROUTING_LAYER](#MAX_ROUTING_LAYER) - [MIN_ROUTING_LAYER](#MIN_ROUTING_LAYER) +- [POST_GLOBAL_ROUTE_TCL](#POST_GLOBAL_ROUTE_TCL) - [PRE_GLOBAL_ROUTE_TCL](#PRE_GLOBAL_ROUTE_TCL) - [REPORT_CLOCK_SKEW](#REPORT_CLOCK_SKEW) - [ROUTING_LAYER_ADJUSTMENT](#ROUTING_LAYER_ADJUSTMENT) @@ -478,6 +534,10 @@ configuration file. - [MAX_REPAIR_ANTENNAS_ITER_DRT](#MAX_REPAIR_ANTENNAS_ITER_DRT) - [MAX_ROUTING_LAYER](#MAX_ROUTING_LAYER) - [MIN_ROUTING_LAYER](#MIN_ROUTING_LAYER) +- [POST_DETAIL_ROUTE_TCL](#POST_DETAIL_ROUTE_TCL) +- [POST_FILLCELL_TCL](#POST_FILLCELL_TCL) +- [PRE_DETAIL_ROUTE_TCL](#PRE_DETAIL_ROUTE_TCL) +- [PRE_FILLCELL_TCL](#PRE_FILLCELL_TCL) - [REPORT_CLOCK_SKEW](#REPORT_CLOCK_SKEW) - [ROUTING_LAYER_ADJUSTMENT](#ROUTING_LAYER_ADJUSTMENT) - [SKIP_ANTENNA_REPAIR_POST_DRT](#SKIP_ANTENNA_REPAIR_POST_DRT) @@ -491,6 +551,10 @@ configuration file. - [GND_NETS_VOLTAGES](#GND_NETS_VOLTAGES) - [MAX_ROUTING_LAYER](#MAX_ROUTING_LAYER) - [MIN_ROUTING_LAYER](#MIN_ROUTING_LAYER) +- [POST_DENSITY_FILL_TCL](#POST_DENSITY_FILL_TCL) +- [POST_FINAL_REPORT_TCL](#POST_FINAL_REPORT_TCL) +- [PRE_DENSITY_FILL_TCL](#PRE_DENSITY_FILL_TCL) +- [PRE_FINAL_REPORT_TCL](#PRE_FINAL_REPORT_TCL) - [PWR_NETS_VOLTAGES](#PWR_NETS_VOLTAGES) - [REPORT_CLOCK_SKEW](#REPORT_CLOCK_SKEW) - [ROUTING_LAYER_ADJUSTMENT](#ROUTING_LAYER_ADJUSTMENT) diff --git a/flow/scripts/cts.tcl b/flow/scripts/cts.tcl index 293206121d..13700382e0 100644 --- a/flow/scripts/cts.tcl +++ b/flow/scripts/cts.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "cts__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE CTS source $::env(SCRIPTS_DIR)/lec_check.tcl erase_non_stage_variables cts load_design 3_place.odb 3_place.sdc @@ -86,7 +87,7 @@ if { !$::env(SKIP_CTS_REPAIR_TIMING) } { report_metrics 4 "cts final" -source_env_var_if_exists POST_CTS_TCL +source_step_tcl POST CTS orfs_write_db $::env(RESULTS_DIR)/4_1_cts.odb orfs_write_sdc $::env(RESULTS_DIR)/4_cts.sdc diff --git a/flow/scripts/density_fill.tcl b/flow/scripts/density_fill.tcl index a0f45f7276..6ea31e4a7a 100644 --- a/flow/scripts/density_fill.tcl +++ b/flow/scripts/density_fill.tcl @@ -1,4 +1,5 @@ source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE DENSITY_FILL erase_non_stage_variables final load_design 5_route.odb 5_route.sdc @@ -13,3 +14,5 @@ if { $::env(USE_FILL) } { log_cmd exec cp $::env(RESULTS_DIR)/5_route.odb $::env(RESULTS_DIR)/6_1_fill.odb # There is no 5_route.v file to copy } + +source_step_tcl POST DENSITY_FILL diff --git a/flow/scripts/detail_place.tcl b/flow/scripts/detail_place.tcl index 2a0babb8d6..ce066e6511 100644 --- a/flow/scripts/detail_place.tcl +++ b/flow/scripts/detail_place.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "detailedplace__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE DETAIL_PLACE erase_non_stage_variables place load_design 3_4_place_resized.odb 2_floorplan.sdc @@ -38,4 +39,6 @@ if { $result != 0 } { report_metrics 3 "detailed place" true false +source_step_tcl POST DETAIL_PLACE + orfs_write_db $::env(RESULTS_DIR)/3_5_place_dp.odb diff --git a/flow/scripts/detail_route.tcl b/flow/scripts/detail_route.tcl index e38a03089c..68aa47c756 100644 --- a/flow/scripts/detail_route.tcl +++ b/flow/scripts/detail_route.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "detailedroute__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE DETAIL_ROUTE load_design 5_1_grt.odb 5_1_grt.sdc if { ![grt::have_routes] } { error "Global routing failed, run `make gui_grt` and load $::global_route_congestion_report \ @@ -69,7 +70,7 @@ if { utl::metric_int "antenna_diodes_count" -1 } -source_env_var_if_exists POST_DETAIL_ROUTE_TCL +source_step_tcl POST DETAIL_ROUTE check_antennas -report_file $env(REPORTS_DIR)/drt_antennas.log diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index ba4b96912e..6d56cc30a0 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -1,4 +1,5 @@ source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE FILLCELL erase_non_stage_variables route if { [env_var_exists_and_non_empty FILL_CELLS] } { load_design 5_2_route.odb 5_1_grt.sdc @@ -12,3 +13,5 @@ if { [env_var_exists_and_non_empty FILL_CELLS] } { } else { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb } + +source_step_tcl POST FILLCELL diff --git a/flow/scripts/final_report.tcl b/flow/scripts/final_report.tcl index 48b30b74ff..420034d7e4 100644 --- a/flow/scripts/final_report.tcl +++ b/flow/scripts/final_report.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "finish__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE FINAL_REPORT erase_non_stage_variables final load_design 6_1_fill.odb 6_1_fill.sdc @@ -68,3 +69,5 @@ report_metrics 6 "finish" if { [ord::openroad_gui_compiled] && [env_var_exists_and_non_empty DISPLAY] } { gui::show "source $::env(SCRIPTS_DIR)/save_images.tcl" false } + +source_step_tcl POST FINAL_REPORT diff --git a/flow/scripts/floorplan.tcl b/flow/scripts/floorplan.tcl index c439174bc5..69a99f2b9e 100644 --- a/flow/scripts/floorplan.tcl +++ b/flow/scripts/floorplan.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "floorplan__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE FLOORPLAN erase_non_stage_variables floorplan load_design 1_synth.odb 1_synth.sdc @@ -148,7 +149,7 @@ report_units report_units_metric report_metrics 2 "floorplan final" false false -source_env_var_if_exists POST_FLOORPLAN_TCL +source_step_tcl POST FLOORPLAN source_env_var_if_exists IO_CONSTRAINTS orfs_write_db $::env(RESULTS_DIR)/2_1_floorplan.odb diff --git a/flow/scripts/global_place.tcl b/flow/scripts/global_place.tcl index 6ef3df9a34..e7f92089e8 100644 --- a/flow/scripts/global_place.tcl +++ b/flow/scripts/global_place.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "globalplace__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE GLOBAL_PLACE erase_non_stage_variables place load_design 3_2_place_iop.odb 2_floorplan.sdc @@ -74,4 +75,6 @@ if { $::env(CLUSTER_FLOPS) } { report_metrics 3 "global place" false false +source_step_tcl POST GLOBAL_PLACE + orfs_write_db $::env(RESULTS_DIR)/3_3_place_gp.odb diff --git a/flow/scripts/global_place_skip_io.tcl b/flow/scripts/global_place_skip_io.tcl index 550df07fb6..e0eb0b078f 100644 --- a/flow/scripts/global_place_skip_io.tcl +++ b/flow/scripts/global_place_skip_io.tcl @@ -1,4 +1,5 @@ source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE GLOBAL_PLACE_SKIP_IO erase_non_stage_variables place load_design 2_floorplan.odb 2_floorplan.sdc @@ -13,4 +14,6 @@ if { [env_var_exists_and_non_empty FLOORPLAN_DEF] } { {*}[env_var_or_empty GLOBAL_PLACEMENT_ARGS] } +source_step_tcl POST GLOBAL_PLACE_SKIP_IO + orfs_write_db $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb diff --git a/flow/scripts/global_route.tcl b/flow/scripts/global_route.tcl index ba95205db6..ddc5e90c0b 100644 --- a/flow/scripts/global_route.tcl +++ b/flow/scripts/global_route.tcl @@ -6,7 +6,7 @@ load_design 4_cts.odb 4_cts.sdc # This proc is here to allow us to use 'return' to return early from this # file which is sourced proc global_route_helper { } { - source_env_var_if_exists PRE_GLOBAL_ROUTE_TCL + source_step_tcl PRE GLOBAL_ROUTE set res_aware "" append_env_var res_aware ENABLE_RESISTANCE_AWARE -resistance_aware 0 @@ -113,6 +113,7 @@ proc global_route_helper { } { source [file join $::env(SCRIPTS_DIR) "write_ref_sdc.tcl"] write_guides $::env(RESULTS_DIR)/route.guide + source_step_tcl POST GLOBAL_ROUTE orfs_write_db $::env(RESULTS_DIR)/5_1_grt.odb orfs_write_sdc $::env(RESULTS_DIR)/5_1_grt.sdc } diff --git a/flow/scripts/io_placement.tcl b/flow/scripts/io_placement.tcl index 0ec25dc545..29731bbafb 100644 --- a/flow/scripts/io_placement.tcl +++ b/flow/scripts/io_placement.tcl @@ -1,4 +1,5 @@ source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE IO_PLACEMENT erase_non_stage_variables place if { @@ -16,3 +17,5 @@ if { } else { log_cmd exec cp $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb $::env(RESULTS_DIR)/3_2_place_iop.odb } + +source_step_tcl POST IO_PLACEMENT diff --git a/flow/scripts/macro_place.tcl b/flow/scripts/macro_place.tcl index 302dd7b9c7..c2fdc21e30 100644 --- a/flow/scripts/macro_place.tcl +++ b/flow/scripts/macro_place.tcl @@ -1,8 +1,11 @@ source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE MACRO_PLACE erase_non_stage_variables floorplan load_design 2_1_floorplan.odb 2_1_floorplan.sdc source $::env(SCRIPTS_DIR)/macro_place_util.tcl +source_step_tcl POST MACRO_PLACE + orfs_write_db $::env(RESULTS_DIR)/2_2_floorplan_macro.odb write_macro_placement $::env(RESULTS_DIR)/2_2_floorplan_macro.tcl diff --git a/flow/scripts/pdn.tcl b/flow/scripts/pdn.tcl index 977fe71f1e..18a4822b50 100644 --- a/flow/scripts/pdn.tcl +++ b/flow/scripts/pdn.tcl @@ -1,11 +1,12 @@ source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE PDN erase_non_stage_variables floorplan load_design 2_3_floorplan_tapcell.odb 2_1_floorplan.sdc source $::env(PDN_TCL) pdngen -source_env_var_if_exists POST_PDN_TCL +source_step_tcl POST PDN # Check all supply nets set block [ord::get_db_block] diff --git a/flow/scripts/repair_timing_post_place.tcl b/flow/scripts/repair_timing_post_place.tcl index 88757727ea..5d43db8a02 100644 --- a/flow/scripts/repair_timing_post_place.tcl +++ b/flow/scripts/repair_timing_post_place.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "place_repair_timing__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE REPAIR_TIMING_POST_PLACE erase_non_stage_variables place load_design 3_5_place_dp.odb 3_place.sdc @@ -18,4 +19,6 @@ puts "Estimate parasitics" log_cmd estimate_parasitics -placement report_metrics 3 "place repair timing" true false +source_step_tcl POST REPAIR_TIMING_POST_PLACE + orfs_write_db $::env(RESULTS_DIR)/3_6_place_repair_timing.odb diff --git a/flow/scripts/resize.tcl b/flow/scripts/resize.tcl index b1d8ca5aa9..0738314da5 100644 --- a/flow/scripts/resize.tcl +++ b/flow/scripts/resize.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "placeopt__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE RESIZE erase_non_stage_variables place load_design 3_3_place_gp.odb 2_floorplan.sdc @@ -35,4 +36,6 @@ report_metrics 3 "resizer" true false puts "Instance count before $instance_count_before, after [sta::network_leaf_instance_count]" puts "Pin count before $pin_count_before, after [sta::network_leaf_pin_count]" +source_step_tcl POST RESIZE + orfs_write_db $::env(RESULTS_DIR)/3_4_place_resized.odb diff --git a/flow/scripts/synth_odb.tcl b/flow/scripts/synth_odb.tcl index ad56b542e8..a30278ff63 100644 --- a/flow/scripts/synth_odb.tcl +++ b/flow/scripts/synth_odb.tcl @@ -1,8 +1,11 @@ utl::set_metrics_stage "floorplan__{}" source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE SYNTH erase_non_stage_variables synth load_design 1_2_yosys.v 1_2_yosys.sdc +source_step_tcl POST SYNTH + orfs_write_db $::env(RESULTS_DIR)/1_synth.odb # Canonicalize 1_synth.sdc. The original SDC_FILE provided by # the user could have dependencies, such as sourcing util.tcl, diff --git a/flow/scripts/tapcell.tcl b/flow/scripts/tapcell.tcl index cbd4ede9fc..7a0b9abd56 100644 --- a/flow/scripts/tapcell.tcl +++ b/flow/scripts/tapcell.tcl @@ -1,4 +1,5 @@ source $::env(SCRIPTS_DIR)/load.tcl +source_step_tcl PRE TAPCELL erase_non_stage_variables floorplan load_design 2_2_floorplan_macro.odb 2_1_floorplan.sdc @@ -9,4 +10,6 @@ if { [env_var_exists_and_non_empty TAPCELL_TCL] } { cut_rows } +source_step_tcl POST TAPCELL + orfs_write_db $::env(RESULTS_DIR)/2_3_floorplan_tapcell.odb diff --git a/flow/scripts/util.tcl b/flow/scripts/util.tcl index 04b4d3727e..b1446e920d 100644 --- a/flow/scripts/util.tcl +++ b/flow/scripts/util.tcl @@ -192,6 +192,11 @@ proc source_env_var_if_exists { env_var } { } } +proc source_step_tcl { hook_type step_name } { + set env_var "${hook_type}_${step_name}_TCL" + source_env_var_if_exists $env_var +} + # Feature toggle for now, eventually the -hier option # will be default and this code will be deleted. proc hier_options { } { diff --git a/flow/scripts/variables.yaml b/flow/scripts/variables.yaml index 7fcc3fb9c4..d707f6b6d1 100644 --- a/flow/scripts/variables.yaml +++ b/flow/scripts/variables.yaml @@ -1313,6 +1313,657 @@ REMOVE_CELLS_FOR_LEC: String patterns directly passed to write_verilog -remove_cells <> for lec checks. type: string +ASAP7_USE_VT: + description: > + A space separated list of VT options to use with the ASAP7 standard cell library: + RVT, LVT, SLVT. + stages: + - All stages + default: RVT + Weight for violating the fixed outline constraint, meaning that all + clusters should be placed within the shape of their parent cluster. + default: 100.00 + stages: + - floorplan +RTLMP_BOUNDARY_WT: + description: > + Weight for the boundary or how far the hard macro clusters are from + boundaries. + default: 50.0 + stages: + - floorplan +RTLMP_NOTCH_WT: + description: > + Weight for the notch, or the existence of dead space that cannot be used + for placement and routing. + default: 50.0 + stages: + - floorplan +RTLMP_RPT_DIR: + description: > + Path to the directory where reports are saved. + stages: + - floorplan +RTLMP_FENCE_LX: + description: > + Defines the lower left X coordinate for the global fence bounding box in + microns. + default: 0.0 + stages: + - floorplan +RTLMP_FENCE_LY: + description: > + Defines the lower left Y coordinate for the global fence bounding box in + microns. + default: 0.0 + stages: + - floorplan +RTLMP_FENCE_UX: + description: > + Defines the upper right X coordinate for the global fence bounding box in + microns. + default: 0.0 + stages: + - floorplan +RTLMP_FENCE_UY: + description: > + Defines the upper right Y coordinate for the global fence bounding box in + microns. + default: 0.0 + stages: + - floorplan +RTLMP_ARGS: + description: > + Overrides all other RTL macro placer arguments. + stages: + - floorplan +GDS_ALLOW_EMPTY: + description: > + Single regular expression of module names of macros that have no .gds file + stages: + - final +RUN_SCRIPT: + description: > + Path to script to run from `make run`, python or tcl script detected by + .py or .tcl extension. +RUN_LOG_NAME_STEM: + description: > + Stem of the log file name, the log file will be named + `$(LOG_DIR)/$(RUN_LOG_NAME_STEM).log`. + default: run +YOSYS_FLAGS: + description: > + Flags to pass to yosys. + stages: + - synth + default: -v 3 +FOOTPRINT: + description: | + Custom footprint definition file for ICeWall-based floorplan initialization. Mutually exclusive with FLOORPLAN_DEF or DIE_AREA/CORE_AREA or CORE_UTILIZATION. + stages: + - floorplan +FOOTPRINT_TCL: + description: | + Specifies a Tcl script with custom footprint-related commands for floorplan setup. + stages: + - floorplan +FLOW_VARIANT: + description: > + Flow variant to use, used in the flow variant directory name. + default: base +RULES_JSON: + description: > + json files with the metrics baseline regression rules. + In the ORFS Makefile, this defaults to $DESIGN_DIR/rules-base.json, + but ORFS does not mandate the users source directory layout and + this can be placed elsewhere when the user sets up an ORFS + config.mk or from bazel-orfs. + stages: + - test +SKIP_ANTENNA_REPAIR_PRE_GRT: + default: 0 + description: > + Skips antenna repair pre-global routing. + stages: + - grt +SKIP_ANTENNA_REPAIR_POST_DRT: + default: 0 + description: > + Skips antenna repair post-detailed routing. + stages: + - route +SKIP_ANTENNA_REPAIR: + default: 0 + description: > + Skips antenna repair entirely. + stages: + - grt +SKIP_DETAILED_ROUTE: + default: 0 + description: > + Skips detailed route. + stages: + - route + - final +MAX_REPAIR_ANTENNAS_ITER_DRT: + default: 5 + description: > + Defines the maximum number of iterations post-detailed routing repair + antennas will run. + stages: + - route +MAX_REPAIR_ANTENNAS_ITER_GRT: + default: 5 + description: > + Defines the maximum number of iterations post global routing repair + antennas will run. + stages: + - grt +OPENROAD_HIERARCHICAL: + description: > + Feature toggle to enable to run OpenROAD in hierarchical mode, + otherwise considered flat. Will eventually be the default and + this option will be retired. + default: 0 + stages: + - All stages +MAX_REPAIR_TIMING_ITER: + description: > + Maximum number of iterations for repair setup and repair hold. + stages: + - cts + - floorplan + - grt + - place +NUM_CORES: + description: > + Passed to `openroad -threads $(NUM_CORES)`, defaults to numbers + of cores in system as determined by system specific code in Makefile, + `nproc` is tried first. + OpenROAD does not limit itself to this number of cores across + OpenROAD running instances, which can lead to overprovisioning + in contexts such as bazel-orfs where there could be many + routing, or place jobs running at the same time. + stages: + - All stages +KEEP_VARS: + description: > + Feature toggle to keep intermediate variables during the flow. + This is useful for the single-run flow, where all stages of the flow + are run in a single OpenROAD instance. + default: 0 + stages: + - All stages +WRITE_ODB_AND_SDC_EACH_STAGE: + description: > + Save out .sdc and .odb file after each stage, useful to disable + when using a single OpenROAD instance to run all stages of the flow. + stages: + - All stages + default: 1 +LEC_CHECK: + description: > + Perform a formal equivalence check between before and after netlists. + If this fails, report an issue to OpenROAD. + default: 0 + stages: + - cts +REMOVE_CELLS_FOR_LEC: + description: > + String patterns directly passed to write_verilog -remove_cells <> for + lec checks. + type: string +ASAP7_USE_VT: + description: > + A space separated list of VT options to use with the ASAP7 standard cell library: + RVT, LVT, SLVT. + stages: + - All stages + default: RVT +PRE_SYNTH_TCL: + description: | + Specifies a Tcl script with commands to run before synthesis ODB generation. + stages: + - synth +POST_SYNTH_TCL: + description: | + Specifies a Tcl script with commands to run after synthesis ODB generation. + stages: + - synth +PRE_FLOORPLAN_TCL: + description: | + Specifies a Tcl script with commands to run before floorplan. + stages: + - floorplan +POST_FLOORPLAN_TCL: + description: | + Specifies a Tcl script with commands to run after floorplan is completed. + stages: + - floorplan +PRE_MACRO_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run before macro placement. + stages: + - floorplan +POST_MACRO_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run after macro placement. + stages: + - floorplan +PRE_TAPCELL_TCL: + description: | + Specifies a Tcl script with commands to run before tapcell. + stages: + - floorplan +POST_TAPCELL_TCL: + description: | + Specifies a Tcl script with commands to run after tapcell. + stages: + - floorplan +PRE_PDN_TCL: + description: | + Specifies a Tcl script with commands to run before PDN generation. + stages: + - floorplan +POST_PDN_TCL: + description: | + Specifies a Tcl script with commands to run after PDN generation. + stages: + - floorplan +PRE_GLOBAL_PLACE_SKIP_IO_TCL: + description: | + Specifies a Tcl script with commands to run before global placement (skip IO). + stages: + - place +POST_GLOBAL_PLACE_SKIP_IO_TCL: + description: | + Specifies a Tcl script with commands to run after global placement (skip IO). + stages: + - place +PRE_IO_PLACEMENT_TCL: + description: | + Specifies a Tcl script with commands to run before IO placement. + stages: + - place +POST_IO_PLACEMENT_TCL: + description: | + Specifies a Tcl script with commands to run after IO placement. + stages: + - place +PRE_GLOBAL_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run before global placement. + stages: + - place +POST_GLOBAL_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run after global placement. + stages: + - place +PRE_RESIZE_TCL: + description: | + Specifies a Tcl script with commands to run before resize. + stages: + - place +POST_RESIZE_TCL: + description: | + Specifies a Tcl script with commands to run after resize. + stages: + - place +PRE_DETAIL_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run before detailed placement. + stages: + - place +POST_DETAIL_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run after detailed placement. + stages: + - place +PRE_REPAIR_TIMING_POST_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run before post-place timing repair. + stages: + - place +POST_REPAIR_TIMING_POST_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run after post-place timing repair. + stages: + - place +PRE_CTS_TCL: + description: | + Specifies a Tcl script with commands to run before CTS. + stages: + - cts +POST_CTS_TCL: + description: | + Specifies a Tcl script with commands to run after CTS is completed. + stages: + - cts +FASTROUTE_TCL: + description: | + Specifies a Tcl script with commands to run before FastRoute. +USE_FILL: + description: > + Whether to perform metal density filling. + default: 0 +SEAL_GDS: + description: | + Seal macro to place around the design. +ABSTRACT_SOURCE: + description: | + Which .odb file to use to create abstract + stages: + - generate_abstract +PRE_GLOBAL_ROUTE_TCL: + description: | + Specifies a Tcl script with commands to run before global route. + stages: + - grt +POST_GLOBAL_ROUTE_TCL: + description: | + Specifies a Tcl script with commands to run after global route. + stages: + - grt +PRE_DETAIL_ROUTE_TCL: + description: | + Specifies a Tcl script with commands to run before detailed route. + stages: + - route +POST_DETAIL_ROUTE_TCL: + description: | + Specifies a Tcl script with commands to run after detailed route. + stages: + - route +PRE_FILLCELL_TCL: + description: | + Specifies a Tcl script with commands to run before fillcell insertion. + stages: + - route +POST_FILLCELL_TCL: + description: | + Specifies a Tcl script with commands to run after fillcell insertion. + stages: + - route +PRE_DENSITY_FILL_TCL: + description: | + Specifies a Tcl script with commands to run before density fill. + stages: + - final +POST_DENSITY_FILL_TCL: + description: | + Specifies a Tcl script with commands to run after density fill. + stages: + - final +PRE_FINAL_REPORT_TCL: + description: | + Specifies a Tcl script with commands to run before final report generation. + stages: + - final +POST_FINAL_REPORT_TCL: + description: | + Specifies a Tcl script with commands to run after final report generation. + stages: + - final +GLOBAL_ROUTE_ARGS: + description: > + Replaces default arguments for global route. + stages: + - grt + default: -congestion_iterations 30 -congestion_report_iter_step 5 -verbose +MATCH_CELL_FOOTPRINT: + description: > + Enforce sizing operations to only swap cells that have the same layout + boundary. + stages: + - floorplan + - place + - cts + - route + default: 0 +RTLMP_MAX_LEVEL: + description: > + Maximum depth of the physical hierarchy tree. + default: 2 + stages: + - floorplan +RTLMP_MAX_INST: + description: > + Maximum number of standard cells in a cluster. If unset, rtl_macro_placer + will calculate a value based on the design attributes. + stages: + - floorplan +RTLMP_MIN_INST: + description: > + Minimum number of standard cells in a cluster. If unset, rtl_macro_placer + will calculate a value based on the design attributes. + stages: + - floorplan +RTLMP_MAX_MACRO: + description: > + Maximum number of macros in a cluster. If unset, rtl_macro_placer will + calculate a value based on the design attributes. + stages: + - floorplan +RTLMP_MIN_MACRO: + description: > + Minimum number of macros in a cluster. If unset, rtl_macro_placer will + calculate a value based on the design attributes. + stages: + - floorplan +RTLMP_MIN_AR: + description: > + Specifies the minimum aspect ratio (height/width). + default: 0.33 + stages: + - floorplan +RTLMP_AREA_WT: + description: > + Weight for the area of the current floorplan. + default: 0.1 + stages: + - floorplan +RTLMP_WIRELENGTH_WT: + description: > + Weight for half-perimiter wirelength. + default: 100.0 + stages: + - floorplan +RTLMP_OUTLINE_WT: + description: > + Weight for violating the fixed outline constraint, meaning that all + clusters should be placed within the shape of their parent cluster. + default: 100.00 + stages: + - floorplan +RTLMP_BOUNDARY_WT: + description: > + Weight for the boundary or how far the hard macro clusters are from + boundaries. + default: 50.0 + stages: + - floorplan +RTLMP_NOTCH_WT: + description: > + Weight for the notch, or the existence of dead space that cannot be used + for placement and routing. + default: 50.0 + stages: + - floorplan +RTLMP_RPT_DIR: + description: > + Path to the directory where reports are saved. + stages: + - floorplan +RTLMP_FENCE_LX: + description: > + Defines the lower left X coordinate for the global fence bounding box in + microns. + default: 0.0 + stages: + - floorplan +RTLMP_FENCE_LY: + description: > + Defines the lower left Y coordinate for the global fence bounding box in + microns. + default: 0.0 + stages: + - floorplan +RTLMP_FENCE_UX: + description: > + Defines the upper right X coordinate for the global fence bounding box in + microns. + default: 0.0 + stages: + - floorplan +RTLMP_FENCE_UY: + description: > + Defines the upper right Y coordinate for the global fence bounding box in + microns. + default: 0.0 + stages: + - floorplan +RTLMP_ARGS: + description: > + Overrides all other RTL macro placer arguments. + stages: + - floorplan +GDS_ALLOW_EMPTY: + description: > + Single regular expression of module names of macros that have no .gds file + stages: + - final +RUN_SCRIPT: + description: > + Path to script to run from `make run`, python or tcl script detected by + .py or .tcl extension. +RUN_LOG_NAME_STEM: + description: > + Stem of the log file name, the log file will be named + `$(LOG_DIR)/$(RUN_LOG_NAME_STEM).log`. + default: run +YOSYS_FLAGS: + description: > + Flags to pass to yosys. + stages: + - synth + default: -v 3 +FOOTPRINT: + description: | + Custom footprint definition file for ICeWall-based floorplan initialization. Mutually exclusive with FLOORPLAN_DEF or DIE_AREA/CORE_AREA or CORE_UTILIZATION. + stages: + - floorplan +FOOTPRINT_TCL: + description: | + Specifies a Tcl script with custom footprint-related commands for floorplan setup. + stages: + - floorplan +FLOW_VARIANT: + description: > + Flow variant to use, used in the flow variant directory name. + default: base +RULES_JSON: + description: > + json files with the metrics baseline regression rules. + In the ORFS Makefile, this defaults to $DESIGN_DIR/rules-base.json, + but ORFS does not mandate the users source directory layout and + this can be placed elsewhere when the user sets up an ORFS + config.mk or from bazel-orfs. + stages: + - test +SKIP_ANTENNA_REPAIR_PRE_GRT: + default: 0 + description: > + Skips antenna repair pre-global routing. + stages: + - grt +SKIP_ANTENNA_REPAIR_POST_DRT: + default: 0 + description: > + Skips antenna repair post-detailed routing. + stages: + - route +SKIP_ANTENNA_REPAIR: + default: 0 + description: > + Skips antenna repair entirely. + stages: + - grt +SKIP_DETAILED_ROUTE: + default: 0 + description: > + Skips detailed route. + stages: + - route + - final +MAX_REPAIR_ANTENNAS_ITER_DRT: + default: 5 + description: > + Defines the maximum number of iterations post-detailed routing repair + antennas will run. + stages: + - route +MAX_REPAIR_ANTENNAS_ITER_GRT: + default: 5 + description: > + Defines the maximum number of iterations post global routing repair + antennas will run. + stages: + - grt +OPENROAD_HIERARCHICAL: + description: > + Feature toggle to enable to run OpenROAD in hierarchical mode, + otherwise considered flat. Will eventually be the default and + this option will be retired. + default: 0 + stages: + - All stages +MAX_REPAIR_TIMING_ITER: + description: > + Maximum number of iterations for repair setup and repair hold. + stages: + - cts + - floorplan + - grt + - place +NUM_CORES: + description: > + Passed to `openroad -threads $(NUM_CORES)`, defaults to numbers + of cores in system as determined by system specific code in Makefile, + `nproc` is tried first. + OpenROAD does not limit itself to this number of cores across + OpenROAD running instances, which can lead to overprovisioning + in contexts such as bazel-orfs where there could be many + routing, or place jobs running at the same time. + stages: + - All stages +KEEP_VARS: + description: > + Feature toggle to keep intermediate variables during the flow. + This is useful for the single-run flow, where all stages of the flow + are run in a single OpenROAD instance. + default: 0 + stages: + - All stages +WRITE_ODB_AND_SDC_EACH_STAGE: + description: > + Save out .sdc and .odb file after each stage, useful to disable + when using a single OpenROAD instance to run all stages of the flow. + stages: + - All stages + default: 1 +LEC_CHECK: + description: > + Perform a formal equivalence check between before and after netlists. + If this fails, report an issue to OpenROAD. + default: 0 + stages: + - cts +REMOVE_CELLS_FOR_LEC: + description: > + String patterns directly passed to write_verilog -remove_cells <> for + lec checks. + type: string ASAP7_USE_VT: description: > A space separated list of VT options to use with the ASAP7 standard cell library: From 01233613834d4caea8c6d96f11e6264909d0bad8 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 6 Mar 2026 23:34:10 +0900 Subject: [PATCH 030/202] design: remove `metadata-base-ok.json` Signed-off-by: Jaehyun Kim --- .../gf12/bp_quad/metadata-base-ok.json | 544 ------------------ 1 file changed, 544 deletions(-) delete mode 100644 flow/designs/gf12/bp_quad/metadata-base-ok.json diff --git a/flow/designs/gf12/bp_quad/metadata-base-ok.json b/flow/designs/gf12/bp_quad/metadata-base-ok.json deleted file mode 100644 index 1e3e92d1f1..0000000000 --- a/flow/designs/gf12/bp_quad/metadata-base-ok.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "constraints__clocks__count": 8, - "constraints__clocks__details": [ - "bp_clk: 2000.0000", - "io_master_clk: 1666.0000", - "router_clk: 1666.0000", - "sdi_a_clk: 3332.0000", - "sdi_b_clk: 3332.0000", - "sdo_a_tkn_clk: 3332.0000", - "sdo_b_tkn_clk: 3332.0000", - "tag_clk: 6666.0000" - ], - "cts__clock__skew__hold": 581.339, - "cts__clock__skew__setup": 463.129, - "cts__cpu__total": 11459.01, - "cts__design__core__area": 6758590.0, - "cts__design__die__area": 9000000.0, - "cts__design__instance__area": 1331960.0, - "cts__design__instance__area__cover": 1084610.0, - "cts__design__instance__area__macros": 771892, - "cts__design__instance__area__padcells": 1562400.0, - "cts__design__instance__area__stdcell": 560064, - "cts__design__instance__count": 1313807, - "cts__design__instance__count__cover": 269, - "cts__design__instance__count__hold_buffer": 208, - "cts__design__instance__count__macros": 200, - "cts__design__instance__count__padcells": 744, - "cts__design__instance__count__setup_buffer": 156, - "cts__design__instance__count__stdcell": 1312594, - "cts__design__instance__displacement__max": 27.247, - "cts__design__instance__displacement__mean": 0.0135, - "cts__design__instance__displacement__total": 18084.9, - "cts__design__instance__utilization": 0.197076, - "cts__design__instance__utilization__stdcell": 0.0935515, - "cts__design__io": 135, - "cts__design__rows": 36041, - "cts__design__rows__sc9mcpp84_12lp": 36041, - "cts__design__sites": 121359439, - "cts__design__sites__sc9mcpp84_12lp": 121359439, - "cts__design__violations": 0, - "cts__flow__errors__count": 0, - "cts__flow__warnings__count": 62, - "cts__flow__warnings__count__CTS-0041": 21, - "cts__flow__warnings__count__RSZ-0062": 1, - "cts__flow__warnings__count__STA-1551": 40, - "cts__flow__warnings__type_count": 3, - "cts__mem__peak": 14582444.0, - "cts__power__internal__total": 0.204627, - "cts__power__leakage__total": 0.00248766, - "cts__power__switching__total": 0.126006, - "cts__power__total": 0.333121, - "cts__route__wirelength__estimated": 19812200.0, - "cts__runtime__total": "55:42.92", - "cts__timing__drv__hold_violation_count": 0, - "cts__timing__drv__max_cap": 135, - "cts__timing__drv__max_cap_limit": -226.762, - "cts__timing__drv__max_fanout": 0, - "cts__timing__drv__max_fanout_limit": 30, - "cts__timing__drv__max_slew": 36755, - "cts__timing__drv__max_slew_limit": -51.5987, - "cts__timing__drv__setup_violation_count": 3787, - "cts__timing__fmax": 8688990000.0, - "cts__timing__fmax__clock__bp_clk": 439557000.0, - "cts__timing__fmax__clock__io_master_clk": 872909000.0, - "cts__timing__fmax__clock__router_clk": 842265000.0, - "cts__timing__fmax__clock__sdi_a_clk": 538964000.0, - "cts__timing__fmax__clock__sdi_b_clk": 529782000.0, - "cts__timing__fmax__clock__sdo_a_tkn_clk": 8688990000.0, - "cts__timing__fmax__clock__sdo_b_tkn_clk": 8564470000.0, - "cts__timing__fmax__clock__tag_clk": 323709000.0, - "cts__timing__hold__tns": 0, - "cts__timing__hold__ws": 0.00555112, - "cts__timing__setup__tns": -392298, - "cts__timing__setup__ws": -275.02, - "design__io__hpwl": 0, - "design__violations": 0, - "detailedplace__cpu__total": 1579.86, - "detailedplace__design__core__area": 6758590.0, - "detailedplace__design__die__area": 9000000.0, - "detailedplace__design__instance__area": 1307730.0, - "detailedplace__design__instance__area__cover": 1084610.0, - "detailedplace__design__instance__area__macros": 771892, - "detailedplace__design__instance__area__padcells": 1562400.0, - "detailedplace__design__instance__area__stdcell": 535833, - "detailedplace__design__instance__count": 1281356, - "detailedplace__design__instance__count__cover": 269, - "detailedplace__design__instance__count__macros": 200, - "detailedplace__design__instance__count__padcells": 744, - "detailedplace__design__instance__count__stdcell": 1280143, - "detailedplace__design__instance__displacement__max": 34.4355, - "detailedplace__design__instance__displacement__mean": 0.4265, - "detailedplace__design__instance__displacement__total": 547678, - "detailedplace__design__instance__utilization": 0.193491, - "detailedplace__design__instance__utilization__stdcell": 0.089504, - "detailedplace__design__io": 135, - "detailedplace__design__rows": 36041, - "detailedplace__design__rows__sc9mcpp84_12lp": 36041, - "detailedplace__design__sites": 121359439, - "detailedplace__design__sites__sc9mcpp84_12lp": 121359439, - "detailedplace__design__violations": 0, - "detailedplace__flow__errors__count": 0, - "detailedplace__flow__warnings__count": 40, - "detailedplace__flow__warnings__count__STA-1551": 40, - "detailedplace__flow__warnings__type_count": 1, - "detailedplace__mem__peak": 12529584.0, - "detailedplace__power__internal__total": 0.159596, - "detailedplace__power__leakage__total": 0.00245512, - "detailedplace__power__switching__total": 0.10972, - "detailedplace__power__total": 0.271771, - "detailedplace__route__wirelength__estimated": 19778000.0, - "detailedplace__runtime__total": "19:32.21", - "detailedplace__timing__drv__hold_violation_count": 1321, - "detailedplace__timing__drv__max_cap": 131, - "detailedplace__timing__drv__max_cap_limit": -226.762, - "detailedplace__timing__drv__max_fanout": 0, - "detailedplace__timing__drv__max_fanout_limit": 30, - "detailedplace__timing__drv__max_slew": 36600, - "detailedplace__timing__drv__max_slew_limit": -51.5406, - "detailedplace__timing__drv__setup_violation_count": 1947, - "detailedplace__timing__fmax": 8752090000.0, - "detailedplace__timing__fmax__clock__bp_clk": 424739000.0, - "detailedplace__timing__fmax__clock__io_master_clk": 780716000.0, - "detailedplace__timing__fmax__clock__router_clk": 849181000.0, - "detailedplace__timing__fmax__clock__sdi_a_clk": 458675000.0, - "detailedplace__timing__fmax__clock__sdi_b_clk": 449133000.0, - "detailedplace__timing__fmax__clock__sdo_a_tkn_clk": 8752090000.0, - "detailedplace__timing__fmax__clock__sdo_b_tkn_clk": 8735440000.0, - "detailedplace__timing__fmax__clock__tag_clk": 287948000.0, - "detailedplace__timing__hold__tns": -19338.4, - "detailedplace__timing__hold__ws": -58.5551, - "detailedplace__timing__setup__tns": -148518, - "detailedplace__timing__setup__ws": -354.387, - "detailedroute__antenna__violating__nets": 0, - "detailedroute__antenna__violating__pins": 0, - "detailedroute__antenna_diodes_count": 0, - "detailedroute__flow__errors__count": 0, - "detailedroute__flow__warnings__count": 124, - "detailedroute__flow__warnings__count__DRT-0120": 77, - "detailedroute__flow__warnings__count__DRT-0142": 5, - "detailedroute__flow__warnings__count__DRT-0625": 2, - "detailedroute__flow__warnings__count__STA-1551": 40, - "detailedroute__flow__warnings__type_count": 4, - "detailedroute__route__drc_errors": 0, - "detailedroute__route__drc_errors__iter__0": 476396, - "detailedroute__route__drc_errors__iter__1": 48103, - "detailedroute__route__drc_errors__iter__10": 581, - "detailedroute__route__drc_errors__iter__11": 466, - "detailedroute__route__drc_errors__iter__12": 345, - "detailedroute__route__drc_errors__iter__13": 255, - "detailedroute__route__drc_errors__iter__14": 245, - "detailedroute__route__drc_errors__iter__15": 222, - "detailedroute__route__drc_errors__iter__16": 184, - "detailedroute__route__drc_errors__iter__17": 407, - "detailedroute__route__drc_errors__iter__18": 191, - "detailedroute__route__drc_errors__iter__19": 102, - "detailedroute__route__drc_errors__iter__2": 23485, - "detailedroute__route__drc_errors__iter__20": 75, - "detailedroute__route__drc_errors__iter__21": 2, - "detailedroute__route__drc_errors__iter__22": 0, - "detailedroute__route__drc_errors__iter__3": 2167, - "detailedroute__route__drc_errors__iter__4": 1532, - "detailedroute__route__drc_errors__iter__5": 1196, - "detailedroute__route__drc_errors__iter__6": 1033, - "detailedroute__route__drc_errors__iter__7": 924, - "detailedroute__route__drc_errors__iter__8": 807, - "detailedroute__route__drc_errors__iter__9": 679, - "detailedroute__route__net": 1130739, - "detailedroute__route__net__special": 207, - "detailedroute__route__vias": 10804575, - "detailedroute__route__vias__multicut": 0, - "detailedroute__route__vias__singlecut": 10804575, - "detailedroute__route__wirelength": 22802588, - "detailedroute__route__wirelength__iter__0": 22840241, - "detailedroute__route__wirelength__iter__1": 22804889, - "detailedroute__route__wirelength__iter__10": 22802579, - "detailedroute__route__wirelength__iter__11": 22802614, - "detailedroute__route__wirelength__iter__12": 22802600, - "detailedroute__route__wirelength__iter__13": 22802604, - "detailedroute__route__wirelength__iter__14": 22802605, - "detailedroute__route__wirelength__iter__15": 22802605, - "detailedroute__route__wirelength__iter__16": 22802605, - "detailedroute__route__wirelength__iter__17": 22802629, - "detailedroute__route__wirelength__iter__18": 22802611, - "detailedroute__route__wirelength__iter__19": 22802609, - "detailedroute__route__wirelength__iter__2": 22801163, - "detailedroute__route__wirelength__iter__20": 22802602, - "detailedroute__route__wirelength__iter__21": 22802589, - "detailedroute__route__wirelength__iter__22": 22802588, - "detailedroute__route__wirelength__iter__3": 22802388, - "detailedroute__route__wirelength__iter__4": 22802456, - "detailedroute__route__wirelength__iter__5": 22802530, - "detailedroute__route__wirelength__iter__6": 22802546, - "detailedroute__route__wirelength__iter__7": 22802559, - "detailedroute__route__wirelength__iter__8": 22802565, - "detailedroute__route__wirelength__iter__9": 22802568, - "finish__clock__skew__hold": 502.977, - "finish__clock__skew__setup": 397.871, - "finish__cpu__total": 4256.23, - "finish__design__core__area": 6758590.0, - "finish__design__die__area": 9000000.0, - "finish__design__instance__area": 1334610.0, - "finish__design__instance__area__class__clock_buffer": 20140, - "finish__design__instance__area__class__clock_inverter": 2025.31, - "finish__design__instance__area__class__cover": 1084610.0, - "finish__design__instance__area__class__endcap_cell": 41844.4, - "finish__design__instance__area__class__fill_cell": 5309140.0, - "finish__design__instance__area__class__inverter": 1012.39, - "finish__design__instance__area__class__macro": 771892, - "finish__design__instance__area__class__multi_input_combinational_cell": 213519, - "finish__design__instance__area__class__pad": 1294300.0, - "finish__design__instance__area__class__pad_spacer": 268100, - "finish__design__instance__area__class__sequential_cell": 178781, - "finish__design__instance__area__class__tap_cell": 67023.9, - "finish__design__instance__area__class__tie_cell": 2901.3, - "finish__design__instance__area__class__timing_repair_buffer": 35466.3, - "finish__design__instance__area__cover": 1084610.0, - "finish__design__instance__area__macros": 771892, - "finish__design__instance__area__padcells": 1562400.0, - "finish__design__instance__area__stdcell": 562713, - "finish__design__instance__count": 1319548, - "finish__design__instance__count__class__clock_buffer": 20058, - "finish__design__instance__count__class__clock_inverter": 7775, - "finish__design__instance__count__class__cover": 269, - "finish__design__instance__count__class__endcap_cell": 72070, - "finish__design__instance__count__class__fill_cell": 3480699, - "finish__design__instance__count__class__inverter": 6951, - "finish__design__instance__count__class__macro": 200, - "finish__design__instance__count__class__multi_input_combinational_cell": 728454, - "finish__design__instance__count__class__pad": 311, - "finish__design__instance__count__class__pad_spacer": 433, - "finish__design__instance__count__class__sequential_cell": 230771, - "finish__design__instance__count__class__tap_cell": 117676, - "finish__design__instance__count__class__tie_cell": 14991, - "finish__design__instance__count__class__timing_repair_buffer": 119589, - "finish__design__instance__count__cover": 269, - "finish__design__instance__count__macros": 200, - "finish__design__instance__count__padcells": 744, - "finish__design__instance__count__stdcell": 1318335, - "finish__design__instance__utilization": 0.197468, - "finish__design__instance__utilization__stdcell": 0.0939939, - "finish__design__io": 135, - "finish__design__rows": 36041, - "finish__design__rows__sc9mcpp84_12lp": 36041, - "finish__design__sites": 121359439, - "finish__design__sites__sc9mcpp84_12lp": 121359439, - "finish__flow__errors__count": 0, - "finish__flow__warnings__count": 40, - "finish__flow__warnings__count__STA-1551": 40, - "finish__flow__warnings__type_count": 1, - "finish__mem__peak": 19923556.0, - "finish__power__internal__total": 0.204516, - "finish__power__leakage__total": 0.00248937, - "finish__power__switching__total": 0.125156, - "finish__power__total": 0.332162, - "finish__runtime__total": "34:14.62", - "finish__timing__drv__hold_violation_count": 1, - "finish__timing__drv__max_cap": 143, - "finish__timing__drv__max_cap_limit": -226.762, - "finish__timing__drv__max_fanout": 0, - "finish__timing__drv__max_fanout_limit": 30, - "finish__timing__drv__max_slew": 35691, - "finish__timing__drv__max_slew_limit": -24.2863, - "finish__timing__drv__setup_violation_count": 16, - "finish__timing__fmax": 8824440000.0, - "finish__timing__fmax__clock__bp_clk": 523822000.0, - "finish__timing__fmax__clock__io_master_clk": 1437950000.0, - "finish__timing__fmax__clock__router_clk": 965336000.0, - "finish__timing__fmax__clock__sdi_a_clk": 536310000.0, - "finish__timing__fmax__clock__sdi_b_clk": 542696000.0, - "finish__timing__fmax__clock__sdo_a_tkn_clk": 8824440000.0, - "finish__timing__fmax__clock__sdo_b_tkn_clk": 8529640000.0, - "finish__timing__fmax__clock__tag_clk": 315040000.0, - "finish__timing__hold__tns": -0.361822, - "finish__timing__hold__ws": -0.361822, - "finish__timing__setup__tns": -1326.46, - "finish__timing__setup__ws": -125.351, - "finish__timing__wns_percent_delay": -6.012022, - "finish_merge__cpu__total": 234.03, - "finish_merge__mem__peak": 9465324.0, - "finish_merge__runtime__total": "4:11.16", - "floorplan__cpu__total": 485.91, - "floorplan__design__core__area": 6758590.0, - "floorplan__design__die__area": 9000000.0, - "floorplan__design__instance__area": 1167960.0, - "floorplan__design__instance__area__cover": 1084610.0, - "floorplan__design__instance__area__macros": 754175, - "floorplan__design__instance__area__padcells": 1562400.0, - "floorplan__design__instance__area__stdcell": 413785, - "floorplan__design__instance__count": 1083846, - "floorplan__design__instance__count__cover": 269, - "floorplan__design__instance__count__macros": 200, - "floorplan__design__instance__count__padcells": 744, - "floorplan__design__instance__count__setup_buffer": 0, - "floorplan__design__instance__count__stdcell": 1082633, - "floorplan__design__instance__utilization": 0.172811, - "floorplan__design__instance__utilization__stdcell": 0.0689134, - "floorplan__design__io": 0, - "floorplan__design__rows": 4513, - "floorplan__design__rows__sc9mcpp84_12lp": 4513, - "floorplan__design__sites": 139686376, - "floorplan__design__sites__sc9mcpp84_12lp": 139686376, - "floorplan__flow__errors__count": 0, - "floorplan__flow__warnings__count": 42, - "floorplan__flow__warnings__count__EST-0027": 1, - "floorplan__flow__warnings__count__IFP-0028": 1, - "floorplan__flow__warnings__count__STA-1551": 40, - "floorplan__flow__warnings__type_count": 3, - "floorplan__mem__peak": 4654884.0, - "floorplan__power__internal__total": 0.159564, - "floorplan__power__leakage__total": 0.00244159, - "floorplan__power__switching__total": 0.108705, - "floorplan__power__total": 0.27071, - "floorplan__runtime__total": "4:38.69", - "floorplan__timing__fmax": 9463670000.0, - "floorplan__timing__fmax__clock__bp_clk": 807706000.0, - "floorplan__timing__fmax__clock__io_master_clk": 4858650000.0, - "floorplan__timing__fmax__clock__router_clk": 2493090000.0, - "floorplan__timing__fmax__clock__sdi_a_clk": 626838000.0, - "floorplan__timing__fmax__clock__sdi_b_clk": 626521000.0, - "floorplan__timing__fmax__clock__sdo_a_tkn_clk": 9463670000.0, - "floorplan__timing__fmax__clock__sdo_b_tkn_clk": 9463670000.0, - "floorplan__timing__fmax__clock__tag_clk": 297523000.0, - "floorplan__timing__hold__tns": -418662, - "floorplan__timing__hold__ws": -69.7168, - "floorplan__timing__setup__tns": 0, - "floorplan__timing__setup__ws": 72.813, - "flow__errors__count": 0, - "flow__warnings__count": 40, - "flow__warnings__count__MPL-0055": 2, - "flow__warnings__count__PDN-0110": 1001, - "flow__warnings__count__PDN-0195": 26, - "flow__warnings__count__PDN-1031": 1, - "flow__warnings__count__STA-1551": 40, - "flow__warnings__count__TAP-0014": 1, - "flow__warnings__count__TAP-0015": 1, - "flow__warnings__count__TAP-0016": 1, - "flow__warnings__count__TAP-0017": 1, - "flow__warnings__type_count": 1, - "globalplace__cpu__total": 29565.11, - "globalplace__design__core__area": 6758590.0, - "globalplace__design__die__area": 9000000.0, - "globalplace__design__instance__area": 1301380.0, - "globalplace__design__instance__area__cover": 1084610.0, - "globalplace__design__instance__area__macros": 771892, - "globalplace__design__instance__area__padcells": 1562400.0, - "globalplace__design__instance__area__stdcell": 529489, - "globalplace__design__instance__count": 1272818, - "globalplace__design__instance__count__cover": 269, - "globalplace__design__instance__count__macros": 200, - "globalplace__design__instance__count__padcells": 744, - "globalplace__design__instance__count__stdcell": 1271605, - "globalplace__design__instance__utilization": 0.192552, - "globalplace__design__instance__utilization__stdcell": 0.0884443, - "globalplace__design__io": 135, - "globalplace__design__rows": 36041, - "globalplace__design__rows__sc9mcpp84_12lp": 36041, - "globalplace__design__sites": 121359439, - "globalplace__design__sites__sc9mcpp84_12lp": 121359439, - "globalplace__flow__errors__count": 0, - "globalplace__flow__warnings__count": 51, - "globalplace__flow__warnings__count__GRT-0281": 4, - "globalplace__flow__warnings__count__RSZ-2005": 7, - "globalplace__flow__warnings__count__STA-1551": 40, - "globalplace__flow__warnings__type_count": 3, - "globalplace__mem__peak": 24444844.0, - "globalplace__power__internal__total": 0.159589, - "globalplace__power__leakage__total": 0.00244569, - "globalplace__power__switching__total": 0.109783, - "globalplace__power__total": 0.271817, - "globalplace__runtime__total": "2:56:49", - "globalplace__timing__fmax": 8632330000.0, - "globalplace__timing__fmax__clock__bp_clk": 302086000.0, - "globalplace__timing__fmax__clock__io_master_clk": 468081000.0, - "globalplace__timing__fmax__clock__router_clk": 848654000.0, - "globalplace__timing__fmax__clock__sdi_a_clk": 445342000.0, - "globalplace__timing__fmax__clock__sdi_b_clk": 403716000.0, - "globalplace__timing__fmax__clock__sdo_a_tkn_clk": 8599430000.0, - "globalplace__timing__fmax__clock__sdo_b_tkn_clk": 8632330000.0, - "globalplace__timing__fmax__clock__tag_clk": 287957000.0, - "globalplace__timing__hold__tns": -18864.5, - "globalplace__timing__hold__ws": -60.1563, - "globalplace__timing__setup__tns": -1867670.0, - "globalplace__timing__setup__ws": -1310.31, - "globalplace_io__cpu__total": 14.48, - "globalplace_io__mem__peak": 2978288.0, - "globalplace_io__runtime__total": "0:17.52", - "globalplace_skip_io__cpu__total": 13.27, - "globalplace_skip_io__mem__peak": 2222208.0, - "globalplace_skip_io__runtime__total": "0:15.95", - "globalroute__antenna__violating__nets": 0, - "globalroute__antenna__violating__pins": 0, - "globalroute__antenna_diodes_count": 0, - "globalroute__clock__skew__hold": 619.775, - "globalroute__clock__skew__setup": 499.657, - "globalroute__cpu__total": 24542.34, - "globalroute__design__core__area": 6758590.0, - "globalroute__design__die__area": 9000000.0, - "globalroute__design__instance__area": 1334610.0, - "globalroute__design__instance__area__cover": 1084610.0, - "globalroute__design__instance__area__macros": 771892, - "globalroute__design__instance__area__padcells": 1562400.0, - "globalroute__design__instance__area__stdcell": 562713, - "globalroute__design__instance__count": 1319548, - "globalroute__design__instance__count__cover": 269, - "globalroute__design__instance__count__hold_buffer": 23, - "globalroute__design__instance__count__macros": 200, - "globalroute__design__instance__count__padcells": 744, - "globalroute__design__instance__count__setup_buffer": 18, - "globalroute__design__instance__count__stdcell": 1318335, - "globalroute__design__instance__displacement__max": 5.952, - "globalroute__design__instance__displacement__mean": 0.007, - "globalroute__design__instance__displacement__total": 9569.14, - "globalroute__design__instance__utilization": 0.197468, - "globalroute__design__instance__utilization__stdcell": 0.0939939, - "globalroute__design__io": 135, - "globalroute__design__rows": 36041, - "globalroute__design__rows__sc9mcpp84_12lp": 36041, - "globalroute__design__sites": 121359439, - "globalroute__design__sites__sc9mcpp84_12lp": 121359439, - "globalroute__design__violations": 0, - "globalroute__flow__errors__count": 0, - "globalroute__flow__warnings__count": 4351, - "globalroute__flow__warnings__count__DRT-0120": 77, - "globalroute__flow__warnings__count__DRT-0142": 5, - "globalroute__flow__warnings__count__DRT-0625": 2, - "globalroute__flow__warnings__count__FLW-0010": 1, - "globalroute__flow__warnings__count__RSZ-0062": 1, - "globalroute__flow__warnings__count__RSZ-0066": 1, - "globalroute__flow__warnings__count__RSZ-0104": 1001, - "globalroute__flow__warnings__count__STA-1551": 40, - "globalroute__flow__warnings__type_count": 8, - "globalroute__global_route__vias": 122355, - "globalroute__global_route__wirelength": 26591486, - "globalroute__mem__peak": 67534512.0, - "globalroute__power__internal__total": 0.204377, - "globalroute__power__leakage__total": 0.00248937, - "globalroute__power__switching__total": 0.126957, - "globalroute__power__total": 0.333823, - "globalroute__route__net": 1124998, - "globalroute__route__net__special": 207, - "globalroute__route__wirelength__estimated": 19897500.0, - "globalroute__runtime__total": "2:23:14", - "globalroute__timing__clock__slack": "N/A", - "globalroute__timing__drv__hold_violation_count": 31, - "globalroute__timing__drv__max_cap": 135, - "globalroute__timing__drv__max_cap_limit": -226.762, - "globalroute__timing__drv__max_fanout": 0, - "globalroute__timing__drv__max_fanout_limit": 30, - "globalroute__timing__drv__max_slew": 36165, - "globalroute__timing__drv__max_slew_limit": -35.2588, - "globalroute__timing__drv__setup_violation_count": 147, - "globalroute__timing__fmax": 8401050000.0, - "globalroute__timing__fmax__clock__bp_clk": 471138000.0, - "globalroute__timing__fmax__clock__io_master_clk": 1042370000.0, - "globalroute__timing__fmax__clock__router_clk": 881813000.0, - "globalroute__timing__fmax__clock__sdi_a_clk": 547446000.0, - "globalroute__timing__fmax__clock__sdi_b_clk": 571803000.0, - "globalroute__timing__fmax__clock__sdo_a_tkn_clk": 8401050000.0, - "globalroute__timing__fmax__clock__sdo_b_tkn_clk": 8182710000.0, - "globalroute__timing__fmax__clock__tag_clk": 323599000.0, - "globalroute__timing__hold__tns": -118.895, - "globalroute__timing__hold__ws": -17.2091, - "globalroute__timing__setup__tns": -3757.95, - "globalroute__timing__setup__ws": -122.518, - "macro_place__wirelength": 28285600.0, - "placeopt__cpu__total": 1332.08, - "placeopt__design__core__area": 6758590.0, - "placeopt__design__die__area": 9000000.0, - "placeopt__design__instance__area": 1307730.0, - "placeopt__design__instance__area__cover": 1084610.0, - "placeopt__design__instance__area__macros": 771892, - "placeopt__design__instance__area__padcells": 1562400.0, - "placeopt__design__instance__area__stdcell": 535833, - "placeopt__design__instance__count": 1281356, - "placeopt__design__instance__count__cover": 269, - "placeopt__design__instance__count__macros": 200, - "placeopt__design__instance__count__padcells": 744, - "placeopt__design__instance__count__stdcell": 1280143, - "placeopt__design__instance__utilization": 0.193491, - "placeopt__design__instance__utilization__stdcell": 0.089504, - "placeopt__design__io": 135, - "placeopt__design__rows": 36041, - "placeopt__design__rows__sc9mcpp84_12lp": 36041, - "placeopt__design__sites": 121359439, - "placeopt__design__sites__sc9mcpp84_12lp": 121359439, - "placeopt__flow__errors__count": 0, - "placeopt__flow__warnings__count": 42, - "placeopt__flow__warnings__count__RSZ-0020": 1, - "placeopt__flow__warnings__count__RSZ-0095": 1, - "placeopt__flow__warnings__count__STA-1551": 40, - "placeopt__flow__warnings__type_count": 3, - "placeopt__mem__peak": 6938768.0, - "placeopt__power__internal__total": 0.159591, - "placeopt__power__leakage__total": 0.00245512, - "placeopt__power__switching__total": 0.109783, - "placeopt__power__total": 0.271829, - "placeopt__runtime__total": "12:19.78", - "placeopt__timing__drv__floating__nets": 2, - "placeopt__timing__drv__floating__pins": 52, - "placeopt__timing__drv__hold_violation_count": 1324, - "placeopt__timing__drv__max_cap": 131, - "placeopt__timing__drv__max_cap_limit": -226.762, - "placeopt__timing__drv__max_fanout": 0, - "placeopt__timing__drv__max_fanout_limit": 30, - "placeopt__timing__drv__max_slew": 36460, - "placeopt__timing__drv__max_slew_limit": -51.6793, - "placeopt__timing__drv__setup_violation_count": 2535, - "placeopt__timing__fmax": 8632330000.0, - "placeopt__timing__fmax__clock__bp_clk": 420998000.0, - "placeopt__timing__fmax__clock__io_master_clk": 773281000.0, - "placeopt__timing__fmax__clock__router_clk": 848654000.0, - "placeopt__timing__fmax__clock__sdi_a_clk": 457833000.0, - "placeopt__timing__fmax__clock__sdi_b_clk": 448330000.0, - "placeopt__timing__fmax__clock__sdo_a_tkn_clk": 8599430000.0, - "placeopt__timing__fmax__clock__sdo_b_tkn_clk": 8632330000.0, - "placeopt__timing__fmax__clock__tag_clk": 287957000.0, - "placeopt__timing__hold__tns": -19464.1, - "placeopt__timing__hold__ws": -60.1563, - "placeopt__timing__setup__tns": -203231, - "placeopt__timing__setup__ws": -375.307, - "run__flow__design": "bp_quad", - "run__flow__generate_date": "2026-03-03 18:57", - "run__flow__metrics_version": "Metrics_2.1.2", - "run__flow__openroad_commit": "N/A", - "run__flow__openroad_version": "26Q1-1544-g7683add10f", - "run__flow__platform": "gf12", - "run__flow__platform__capacitance_units": "1fF", - "run__flow__platform__current_units": "1uA", - "run__flow__platform__distance_units": "1um", - "run__flow__platform__power_units": "1pW", - "run__flow__platform__resistance_units": "1kohm", - "run__flow__platform__time_units": "1ps", - "run__flow__platform__voltage_units": "1v", - "run__flow__platform_commit": "1cb6d49d9a7562b0eb14786120ab7c08e104a5b6", - "run__flow__scripts_commit": "not a git repo", - "run__flow__uuid": "94844a45-9bdb-41c3-aedf-fd129fba5df0", - "run__flow__variant": "base", - "synth__cpu__total": 0.1, - "synth__design__instance__area__stdcell": "ERR", - "synth__design__instance__count__stdcell": "ERR", - "synth__mem__peak": 22016.0, - "synth__runtime__total": "0:00.28", - "total_time": "7:31:16.130000" -} \ No newline at end of file From 19e4246409ac90c588c8755eafde0f37f025ad68 Mon Sep 17 00:00:00 2001 From: Dhirender Choudhary Date: Fri, 6 Mar 2026 20:08:16 +0530 Subject: [PATCH 031/202] Update FlowVariables.md Signed-off-by: Dhirender Choudhary --- docs/user/FlowVariables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/FlowVariables.md b/docs/user/FlowVariables.md index 60d61344fc..e90aee5375 100644 --- a/docs/user/FlowVariables.md +++ b/docs/user/FlowVariables.md @@ -293,7 +293,7 @@ configuration file. | SYNTH_NETLIST_FILES| Skips synthesis and uses the supplied netlist files. If the netlist files contains duplicate modules, which can happen when using hierarchical synthesis on indvidual netlist files and combining here, subsequent modules are silently ignored and only the first module is used.| | | SYNTH_OPT_HIER| Optimize constants across hierarchical boundaries.| | | SYNTH_REPEATABLE_BUILD| License to prune anything that makes builds less repeatable, typically used with Bazel to ensure that builds are bit-for-bit identical so that caching works optimally. Removes debug information that encodes paths, timestamps, etc.| 0| -| SYNTH_RETIME_MODULES| *This is an experimental option and may cause adverse effects.* *No effort has been made to check if the retimed RTL is logically equivalent to the non-retimed RTL.* List of modules to apply automatic retiming to. These modules must not get dissolved and as such they should either be the top module or be included in SYNTH_KEEP_MODULES. The main use case is to quickly identify if performance can be improved by manually retiming the input RTL. Retiming will treat module ports like register endpoints/startpoints. The objective function of retiming isn't informed by SDC, even the clock period is ignored. As such, retiming will optimize for best delay at potentially high register number cost. Automatic retiming can produce suboptimal results as its timing model is crude and it doesn't find the optimal distribution of registers on long pipelines. See OR discussion # 8080.| | +| SYNTH_RETIME_MODULES| *This is an experimental option and may cause adverse effects.* *No effort has been made to check if the retimed RTL is logically equivalent to the non-retimed RTL.* List of modules to apply automatic retiming to. These modules must not get dissolved and as such they should either be the top module or be included in SYNTH_KEEP_MODULES. The main use case is to quickly identify if performance can be improved by manually retiming the input RTL. Retiming will treat module ports like register endpoints/startpoints. The objective function of retiming isn't informed by SDC, even the clock period is ignored. As such, retiming will optimize for best delay at potentially high register number cost. Automatic retiming can produce suboptimal results as its timing model is crude and it doesn't find the optimal distribution of registers on long pipelines. See OR discussion #8080.| | | SYNTH_SLANG_ARGS| Additional arguments passed to the slang frontend during synthesis.| | | SYNTH_WRAPPED_ADDERS| Specify the adder modules that can be used for synthesis, separated by commas. The default adder module is determined by the first element of this variable.| | | SYNTH_WRAPPED_MULTIPLIERS| Specify the multiplier modules that can be used for synthesis, separated by commas. The default multiplier module is determined by the first element of this variable.| | From 8e7bc7cf29f5a5a8e398e9a32a96ce201763eb03 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Fri, 6 Mar 2026 16:49:00 +0000 Subject: [PATCH 032/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 97eed02706..f640d22cce 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 97eed027068c1d691de9d531bec3f683bc82f5d8 +Subproject commit f640d22ccea0b5023079f292d96a049c0ccc851e From 784cee9209c39a7d8acdac57193028cabc833c9c Mon Sep 17 00:00:00 2001 From: Jeff Ng Date: Fri, 6 Mar 2026 18:39:50 +0000 Subject: [PATCH 033/202] Changes to Rapidus design configs for PDK 0.3s Signed-off-by: Jeff Ng --- flow/designs/rapidus2hp/cva6/config.mk | 28 +++++++++---------- ...aint_0.3_6T.sdc => constraint_0.3s_6T.sdc} | 0 ...aint_0.3_8T.sdc => constraint_0.3s_8T.sdc} | 0 .../rapidus2hp/cva6/test/test_params.py | 14 +++++----- flow/designs/rapidus2hp/ethmac/config.mk | 2 +- .../rapidus2hp/ethmac/test/test_params.py | 12 ++++---- .../rapidus2hp/gcd/test/test_params.py | 10 +++---- .../hercules_idecode/test/test_params.py | 10 +++---- .../rapidus2hp/hercules_is_int/config.mk | 2 +- .../hercules_is_int/test/test_params.py | 12 ++++---- flow/designs/rapidus2hp/ibex/config.mk | 28 +++++++++---------- ...aint_0.3_6T.sdc => constraint_0.3s_6T.sdc} | 0 ...aint_0.3_8T.sdc => constraint_0.3s_8T.sdc} | 0 .../rapidus2hp/ibex/test/test_params.py | 16 +++++------ flow/designs/rapidus2hp/jpeg/config.mk | 22 +++++++-------- ...oder15_0.3.sdc => jpeg_encoder15_0.3s.sdc} | 0 .../rapidus2hp/jpeg/test/test_params.py | 14 +++++----- 17 files changed, 85 insertions(+), 85 deletions(-) rename flow/designs/rapidus2hp/cva6/{constraint_0.3_6T.sdc => constraint_0.3s_6T.sdc} (100%) rename flow/designs/rapidus2hp/cva6/{constraint_0.3_8T.sdc => constraint_0.3s_8T.sdc} (100%) rename flow/designs/rapidus2hp/ibex/{constraint_0.3_6T.sdc => constraint_0.3s_6T.sdc} (100%) rename flow/designs/rapidus2hp/ibex/{constraint_0.3_8T.sdc => constraint_0.3s_8T.sdc} (100%) rename flow/designs/rapidus2hp/jpeg/{jpeg_encoder15_0.3.sdc => jpeg_encoder15_0.3s.sdc} (100%) diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index 4a6682267d..7a7bbdebbf 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -94,31 +94,31 @@ export ADDITIONAL_LIBS += $(PLATFORM_DIR)/ram/lib/sacrls0g0d1p64x128m2b1w0c1p0d0 $(PLATFORM_DIR)/ram/lib/sacrls0g0d1p64x25m2b1w0c1p0d0i0s0cr0rr0rm4rw00ms0.lib -DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc -_0P2A_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_6T.sdc -_0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_8T.sdc -_0P15_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.15_8T.sdc -_0P3_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_6T.sdc -_0P3_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_8T.sdc +.DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc +._0P2A_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_6T.sdc +._0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_8T.sdc +._0P15_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.15_8T.sdc +._0P3S_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3s_6T.sdc +._0P3S_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3s_8T.sdc # Use $(if) to defer conditional eval until all makefiles are read export SDC_FILE = $(strip \ $(if $(filter 0.2a,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ - $(_0P2A_6T_SDC_FILE), \ - $(_0P2A_8T_SDC_FILE) \ + $(._0P2A_6T_SDC_FILE), \ + $(._0P2A_8T_SDC_FILE) \ ), \ $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h184_HST_45CPP,$(PLACE_SITE)), \ - $(_0P15_8T_SDC_FILE), \ - $(DEFAULT_SDC_FILE) \ + $(._0P15_8T_SDC_FILE), \ + $(.DEFAULT_SDC_FILE) \ ), \ - $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter 0.3s,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ - $(_0P3_6T_SDC_FILE), \ - $(_0P3_8T_SDC_FILE) \ + $(._0P3S_6T_SDC_FILE), \ + $(._0P3S_8T_SDC_FILE) \ ), \ - $(DEFAULT_SDC_FILE) \ + $(.DEFAULT_SDC_FILE) \ ) \ ) \ )) diff --git a/flow/designs/rapidus2hp/cva6/constraint_0.3_6T.sdc b/flow/designs/rapidus2hp/cva6/constraint_0.3s_6T.sdc similarity index 100% rename from flow/designs/rapidus2hp/cva6/constraint_0.3_6T.sdc rename to flow/designs/rapidus2hp/cva6/constraint_0.3s_6T.sdc diff --git a/flow/designs/rapidus2hp/cva6/constraint_0.3_8T.sdc b/flow/designs/rapidus2hp/cva6/constraint_0.3s_8T.sdc similarity index 100% rename from flow/designs/rapidus2hp/cva6/constraint_0.3_8T.sdc rename to flow/designs/rapidus2hp/cva6/constraint_0.3s_8T.sdc diff --git a/flow/designs/rapidus2hp/cva6/test/test_params.py b/flow/designs/rapidus2hp/cva6/test/test_params.py index 74639da262..4f0f353ba1 100755 --- a/flow/designs/rapidus2hp/cva6/test/test_params.py +++ b/flow/designs/rapidus2hp/cva6/test/test_params.py @@ -24,9 +24,9 @@ def setUp(self): def get_exp_sdc(self, place_site, pdk_version): """Returns the expected SDC file path""" - if pdk_version in ["", "0.2a", "0.3"]: + if pdk_version in ["", "0.2a", "0.3s"]: if pdk_version == "": - pdk_version = "0.3" + pdk_version = "0.3s" if place_site == "ra02h138_DST_45CPP": return os.path.join( self._design_full_dir, f"constraint_{pdk_version}_6T.sdc" @@ -41,9 +41,9 @@ def get_exp_sdc(self, place_site, pdk_version): return os.path.join(self._design_full_dir, "constraint.sdc") - def test_pdk_0p3_default(self): + def test_pdk_0p3s_default(self): """ - Tests PDK 0.3 + Tests PDK 0.3s """ pdk_version = "" @@ -109,12 +109,12 @@ def test_pdk_0p15(self): front_end=front_end, ) - def test_pdk_0p3(self): + def test_pdk_0p3s(self): """ - Tests PDK 0.3 + Tests PDK 0.3s """ - pdk_version = "0.3" + pdk_version = "0.3s" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: exp_sdc = self.get_exp_sdc(place_site, pdk_version) diff --git a/flow/designs/rapidus2hp/ethmac/config.mk b/flow/designs/rapidus2hp/ethmac/config.mk index a0491869dc..fe625b996e 100644 --- a/flow/designs/rapidus2hp/ethmac/config.mk +++ b/flow/designs/rapidus2hp/ethmac/config.mk @@ -17,7 +17,7 @@ export CORE_UTILIZATION = $(strip \ $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ 63, \ 65), \ - $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter 0.3s,$(RAPIDUS_PDK_VERSION)), \ 65, \ 70) \ )) diff --git a/flow/designs/rapidus2hp/ethmac/test/test_params.py b/flow/designs/rapidus2hp/ethmac/test/test_params.py index 2c3ed37ef2..c5480e72ab 100755 --- a/flow/designs/rapidus2hp/ethmac/test/test_params.py +++ b/flow/designs/rapidus2hp/ethmac/test/test_params.py @@ -28,12 +28,12 @@ def get_exp_util(self, place_site, pdk_version): if place_site == "ra02h138_DST_45CPP": return 63 return 65 - if pdk_version in ["", "0.3"]: + if pdk_version in ["", "0.3s"]: return 65 return 70 - def test_pdk_0p3_default(self): - """Tests PDK 0.3 Utilization""" + def test_pdk_0p3s_default(self): + """Tests PDK 0.3s Utilization""" pdk_version = "" for front_end in self._front_end_list: @@ -92,10 +92,10 @@ def test_pdk_0p15(self): front_end=front_end, ) - def test_pdk_0p3(self): - """Tests PDK 0.3 Utilization""" + def test_pdk_0p3s(self): + """Tests PDK 0.3s Utilization""" - pdk_version = "0.3" + pdk_version = "0.3s" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: exp_util = self.get_exp_util(place_site, pdk_version) diff --git a/flow/designs/rapidus2hp/gcd/test/test_params.py b/flow/designs/rapidus2hp/gcd/test/test_params.py index dfe28307b0..91de2b7063 100755 --- a/flow/designs/rapidus2hp/gcd/test/test_params.py +++ b/flow/designs/rapidus2hp/gcd/test/test_params.py @@ -32,9 +32,9 @@ def get_exp_util(self, place_site, pdk_version): return 43 return 45 - def test_pdk_0p3_default(self): + def test_pdk_0p3s_default(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ pdk_version = "" @@ -100,12 +100,12 @@ def test_pdk_0p15(self): front_end=front_end, ) - def test_pdk_0p3(self): + def test_pdk_0p3s(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ - pdk_version = "0.3" + pdk_version = "0.3s" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: exp_util = self.get_exp_util(place_site, pdk_version) diff --git a/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py b/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py index 6df51087ca..94a15fae3a 100755 --- a/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py +++ b/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py @@ -35,9 +35,9 @@ def get_exp_util(self, place_site, pdk_version, front_end): return 44 return 50 - def test_pdk_0p3_default(self): + def test_pdk_0p3s_default(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ pdk_version = "" @@ -103,12 +103,12 @@ def test_pdk_0p15(self): front_end=front_end, ) - def test_pdk_0p3(self): + def test_pdk_0p3s(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ - pdk_version = "0.3" + pdk_version = "0.3s" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: exp_util = self.get_exp_util(place_site, pdk_version, front_end) diff --git a/flow/designs/rapidus2hp/hercules_is_int/config.mk b/flow/designs/rapidus2hp/hercules_is_int/config.mk index 4e207a8168..ba4b8e7117 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/config.mk +++ b/flow/designs/rapidus2hp/hercules_is_int/config.mk @@ -28,7 +28,7 @@ export SYNTH_HIERARCHICAL ?= 0 # Use $(if) to defer conditional eval until all makefiles are read export CORE_UTILIZATION = $(strip \ - $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter 0.3s,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ $(if $(filter 14LM,$(LAYER_STACK_OPTION)), \ diff --git a/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py b/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py index 54422f0940..078f18ed83 100755 --- a/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py +++ b/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py @@ -24,7 +24,7 @@ def setUp(self): def get_exp_util(self, place_site, front_end, pdk_version, layer_stack): """Returns the expected value""" - if pdk_version in ["", "0.3"]: + if pdk_version in ["", "0.3s"]: if place_site == "ra02h138_DST_45CPP": if front_end in ["", "slang"]: if layer_stack == "14LM": @@ -48,9 +48,9 @@ def get_exp_util(self, place_site, front_end, pdk_version, layer_stack): return 30 return 52 - def test_pdk_0p3_default(self): + def test_pdk_0p3s_default(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ pdk_version = "" @@ -131,12 +131,12 @@ def test_pdk_0p15(self): layer_stack=layer_stack, ) - def test_pdk_0p3(self): + def test_pdk_0p3s(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ - pdk_version = "0.3" + pdk_version = "0.3s" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: for layer_stack in self._layer_stack_list: diff --git a/flow/designs/rapidus2hp/ibex/config.mk b/flow/designs/rapidus2hp/ibex/config.mk index 3a1b18e49e..b7c506bb99 100644 --- a/flow/designs/rapidus2hp/ibex/config.mk +++ b/flow/designs/rapidus2hp/ibex/config.mk @@ -23,28 +23,28 @@ export SYNTH_HDL_FRONTEND ?= slang ifeq ($(FLOW_VARIANT),pos_slack) export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_pos_slack.sdc else - DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc - _0P2A_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_6T.sdc - _0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_8T.sdc - _0P15_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.15.sdc - _0P3_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_6T.sdc - _0P3_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_8T.sdc + .DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc + ._0P2A_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_6T.sdc + ._0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_8T.sdc + ._0P15_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.15.sdc + ._0P3S_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3s_6T.sdc + ._0P3S_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3s_8T.sdc # Use $(if) to defer conditional eval until all makefiles are read export SDC_FILE = $(strip \ $(if $(filter 0.2a,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ - $(_0P2A_6T_SDC_FILE), \ - $(_0P2A_8T_SDC_FILE) \ + $(._0P2A_6T_SDC_FILE), \ + $(._0P2A_8T_SDC_FILE) \ ), \ $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ - $(_0P15_SDC_FILE), \ - $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(._0P15_SDC_FILE), \ + $(if $(filter 0.3s,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ - $(_0P3_6T_SDC_FILE), \ - $(_0P3_8T_SDC_FILE) \ + $(._0P3S_6T_SDC_FILE), \ + $(._0P3S_8T_SDC_FILE) \ ), \ - $(DEFAULT_SDC_FILE) \ + $(.DEFAULT_SDC_FILE) \ ) \ ) \ )) @@ -56,7 +56,7 @@ export CORE_UTILIZATION = $(strip \ 52, \ 65 \ ), \ - $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter 0.3s,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ 60, \ 65 \ diff --git a/flow/designs/rapidus2hp/ibex/constraint_0.3_6T.sdc b/flow/designs/rapidus2hp/ibex/constraint_0.3s_6T.sdc similarity index 100% rename from flow/designs/rapidus2hp/ibex/constraint_0.3_6T.sdc rename to flow/designs/rapidus2hp/ibex/constraint_0.3s_6T.sdc diff --git a/flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc b/flow/designs/rapidus2hp/ibex/constraint_0.3s_8T.sdc similarity index 100% rename from flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc rename to flow/designs/rapidus2hp/ibex/constraint_0.3s_8T.sdc diff --git a/flow/designs/rapidus2hp/ibex/test/test_params.py b/flow/designs/rapidus2hp/ibex/test/test_params.py index 9953c62ccd..3eba7f7f17 100755 --- a/flow/designs/rapidus2hp/ibex/test/test_params.py +++ b/flow/designs/rapidus2hp/ibex/test/test_params.py @@ -24,7 +24,7 @@ def setUp(self): def get_exp_util(self, place_site, pdk_version): """Returns the expected utilization""" - if pdk_version in ["", "0.3"]: + if pdk_version in ["", "0.3s"]: if place_site == "ra02h138_DST_45CPP": return 60 return 65 @@ -47,9 +47,9 @@ def get_exp_sdc(self, place_site, pdk_version): ) if pdk_version == "0.15": return os.path.join(self._design_full_dir, f"constraint_{pdk_version}.sdc") - if pdk_version in ["", "0.3"]: + if pdk_version in ["", "0.3s"]: if pdk_version == "": - pdk_version = "0.3" + pdk_version = "0.3s" if place_site == "ra02h138_DST_45CPP": return os.path.join( self._design_full_dir, f"constraint_{pdk_version}_6T.sdc" @@ -60,9 +60,9 @@ def get_exp_sdc(self, place_site, pdk_version): return os.path.join(self._design_full_dir, "constraint.sdc") - def test_pdk_0p3_default(self): + def test_pdk_0p3s_default(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ pdk_version = "" @@ -160,13 +160,13 @@ def test_pdk_0p15(self): front_end=front_end, ) - def test_pdk_0p3(self): + def test_pdk_0p3s(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ front_end = "" - pdk_version = "0.3" + pdk_version = "0.3s" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: exp_util = self.get_exp_util(place_site, pdk_version) diff --git a/flow/designs/rapidus2hp/jpeg/config.mk b/flow/designs/rapidus2hp/jpeg/config.mk index a41d2bcecc..f328b7b4b8 100644 --- a/flow/designs/rapidus2hp/jpeg/config.mk +++ b/flow/designs/rapidus2hp/jpeg/config.mk @@ -10,24 +10,24 @@ endif export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/$(DESIGN_NICKNAME)/*.v)) export VERILOG_INCLUDE_DIRS = $(DESIGN_HOME)/src/$(DESIGN_NICKNAME)/include -DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_7nm.sdc -_0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.2a_8T.sdc -_0P15_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.15_6T.sdc -_0P15_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.15_8T.sdc -_0P3_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.3.sdc +.DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_7nm.sdc +._0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.2a_8T.sdc +._0P15_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.15_6T.sdc +._0P15_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.15_8T.sdc +._0P3S_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.3s.sdc # Use $(if) to defer conditional eval until all makefiles are read export SDC_FILE = $(strip \ $(if $(and $(filter 0.2a,$(RAPIDUS_PDK_VERSION)),$(filter ra02h184_HST_45CPP,$(PLACE_SITE))), \ - $(_0P2A_8T_SDC_FILE), \ + $(._0P2A_8T_SDC_FILE), \ $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ - $(_0P15_6T_SDC_FILE), \ - $(_0P15_8T_SDC_FILE) \ + $(._0P15_6T_SDC_FILE), \ + $(._0P15_8T_SDC_FILE) \ ), \ - $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ - $(_0P3_SDC_FILE), \ - $(DEFAULT_SDC_FILE) \ + $(if $(filter 0.3s,$(RAPIDUS_PDK_VERSION)), \ + $(._0P3S_SDC_FILE), \ + $(.DEFAULT_SDC_FILE) \ ) \ ) \ )) diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3s.sdc similarity index 100% rename from flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3.sdc rename to flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3s.sdc diff --git a/flow/designs/rapidus2hp/jpeg/test/test_params.py b/flow/designs/rapidus2hp/jpeg/test/test_params.py index b04eed5eab..e964bb9f25 100755 --- a/flow/designs/rapidus2hp/jpeg/test/test_params.py +++ b/flow/designs/rapidus2hp/jpeg/test/test_params.py @@ -37,17 +37,17 @@ def get_exp_sdc(self, place_site, pdk_version): return os.path.join( self._design_full_dir, f"jpeg_encoder15_{pdk_version}_6T.sdc" ) - if pdk_version in ["", "0.3"]: + if pdk_version in ["", "0.3s"]: if pdk_version == "": - pdk_version = "0.3" + pdk_version = "0.3s" return os.path.join( self._design_full_dir, f"jpeg_encoder15_{pdk_version}.sdc" ) return os.path.join(self._design_full_dir, "jpeg_encoder15_7nm.sdc") - def test_pdk_0p3_default(self): + def test_pdk_0p3s_default(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ pdk_version = "" @@ -113,12 +113,12 @@ def test_pdk_0p15(self): front_end=front_end, ) - def test_pdk_0p3(self): + def test_pdk_0p3s(self): """ - Tests PDK 0.3 utilization + Tests PDK 0.3s utilization """ - pdk_version = "0.3" + pdk_version = "0.3s" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: exp_sdc = self.get_exp_sdc(place_site, pdk_version) From 15253fb10c11516b96e43e0bae2d28c35bd80e1d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 6 Mar 2026 19:25:48 +0000 Subject: [PATCH 034/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/asap7/swerv_wrapper/rules-base.json | 2 +- flow/designs/nangate45/ariane133/rules-base.json | 4 ++-- flow/designs/nangate45/swerv_wrapper/rules-base.json | 2 +- flow/designs/sky130hd/microwatt/rules-base.json | 4 ++-- flow/designs/sky130hs/aes/rules-base.json | 4 ++-- flow/designs/sky130hs/jpeg/rules-base.json | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/flow/designs/asap7/swerv_wrapper/rules-base.json b/flow/designs/asap7/swerv_wrapper/rules-base.json index 87721c47d8..cd48cb651c 100644 --- a/flow/designs/asap7/swerv_wrapper/rules-base.json +++ b/flow/designs/asap7/swerv_wrapper/rules-base.json @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -7230.0, + "value": -12900.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/ariane133/rules-base.json b/flow/designs/nangate45/ariane133/rules-base.json index 16ee72a7ef..0a6ee1d917 100644 --- a/flow/designs/nangate45/ariane133/rules-base.json +++ b/flow/designs/nangate45/ariane133/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -583.0, + "value": -610.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -649.0, + "value": -653.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index 099e50863b..f770aff558 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 3639180, + "value": 4377730, "compare": "<=" }, "detailedroute__route__drc_errors": { diff --git a/flow/designs/sky130hd/microwatt/rules-base.json b/flow/designs/sky130hd/microwatt/rules-base.json index 466cd2ae65..d91a4b5640 100644 --- a/flow/designs/sky130hd/microwatt/rules-base.json +++ b/flow/designs/sky130hd/microwatt/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -300.0, + "value": -311.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -72,7 +72,7 @@ "compare": "<=" }, "detailedroute__antenna__violating__nets": { - "value": 3, + "value": 5, "compare": "<=" }, "detailedroute__antenna_diodes_count": { diff --git a/flow/designs/sky130hs/aes/rules-base.json b/flow/designs/sky130hs/aes/rules-base.json index 3c5c70764f..a1fe05abc8 100644 --- a/flow/designs/sky130hs/aes/rules-base.json +++ b/flow/designs/sky130hs/aes/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2.99, + "value": -4.24, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.826, + "value": -1.71, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hs/jpeg/rules-base.json b/flow/designs/sky130hs/jpeg/rules-base.json index b02ae82360..418426dbef 100644 --- a/flow/designs/sky130hs/jpeg/rules-base.json +++ b/flow/designs/sky130hs/jpeg/rules-base.json @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 193, + "value": 200, "compare": "<=" }, "globalroute__timing__setup__ws": { From dbea26c08bebb8d4eaee925e0f0f60f0671cb6a8 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Wed, 4 Mar 2026 13:36:19 -0300 Subject: [PATCH 035/202] use Yosys 0.63 Signed-off-by: Eder Monteiro --- tools/yosys | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/yosys b/tools/yosys index 776b4d06a6..d3e297fcd4 160000 --- a/tools/yosys +++ b/tools/yosys @@ -1 +1 @@ -Subproject commit 776b4d06a649e5d07db74e3e0b19bd761f599e24 +Subproject commit d3e297fcd479247322f83d14f42b3556db7acdfb From 845e30e6aeafbf58d27c1539d196bf80d37151c4 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Fri, 6 Mar 2026 20:00:38 -0300 Subject: [PATCH 036/202] use latest OpenROAD Signed-off-by: Eder Monteiro --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index f640d22cce..138e57370c 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit f640d22ccea0b5023079f292d96a049c0ccc851e +Subproject commit 138e57370c9814b3bd0f510167f120f861d2bdf2 From 77ca15798d9f4a1261fdcb818f9e8cf1a4bbf2bf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 7 Mar 2026 02:20:48 +0000 Subject: [PATCH 037/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/asap7/swerv_wrapper/rules-base.json | 4 ++-- flow/designs/gf180/uart-blocks/rules-base.json | 2 +- .../ihp-sg13g2/i2c-gpio-expander/rules-base.json | 2 +- flow/designs/ihp-sg13g2/spi/rules-base.json | 2 +- flow/designs/nangate45/ariane133/rules-base.json | 12 ++++++------ flow/designs/nangate45/gcd/rules-base.json | 2 +- flow/designs/nangate45/ibex/rules-base.json | 2 +- flow/designs/nangate45/jpeg/rules-base.json | 6 +++--- flow/designs/nangate45/swerv/rules-base.json | 12 ++++++------ .../nangate45/swerv_wrapper/rules-base.json | 14 +++++++------- flow/designs/nangate45/tinyRocket/rules-base.json | 6 +++--- flow/designs/sky130hd/chameleon/rules-base.json | 2 +- flow/designs/sky130hd/gcd/rules-base.json | 4 ++-- flow/designs/sky130hd/jpeg/rules-base.json | 10 +++++----- flow/designs/sky130hd/microwatt/rules-base.json | 2 +- flow/designs/sky130hs/aes/rules-base.json | 2 +- flow/designs/sky130hs/ibex/rules-base.json | 4 ++-- 17 files changed, 44 insertions(+), 44 deletions(-) diff --git a/flow/designs/asap7/swerv_wrapper/rules-base.json b/flow/designs/asap7/swerv_wrapper/rules-base.json index cd48cb651c..c0a40d396b 100644 --- a/flow/designs/asap7/swerv_wrapper/rules-base.json +++ b/flow/designs/asap7/swerv_wrapper/rules-base.json @@ -88,11 +88,11 @@ "compare": ">=" }, "finish__timing__hold__ws": { - "value": -200.0, + "value": -332.0, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -125000.0, + "value": -545000.0, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/gf180/uart-blocks/rules-base.json b/flow/designs/gf180/uart-blocks/rules-base.json index 40b0e2f6c8..de20a48fd8 100644 --- a/flow/designs/gf180/uart-blocks/rules-base.json +++ b/flow/designs/gf180/uart-blocks/rules-base.json @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 17036, + "value": 21354, "compare": "<=" }, "detailedroute__route__drc_errors": { diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/rules-base.json b/flow/designs/ihp-sg13g2/i2c-gpio-expander/rules-base.json index a2aaf4d634..9a579e936f 100644 --- a/flow/designs/ihp-sg13g2/i2c-gpio-expander/rules-base.json +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 311335.1878, + "value": 358000.0, "compare": "<=" }, "constraints__clocks__count": { diff --git a/flow/designs/ihp-sg13g2/spi/rules-base.json b/flow/designs/ihp-sg13g2/spi/rules-base.json index 5c7cfd223e..8a15a24775 100644 --- a/flow/designs/ihp-sg13g2/spi/rules-base.json +++ b/flow/designs/ihp-sg13g2/spi/rules-base.json @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 3441, + "value": 3972, "compare": "<=" }, "detailedroute__route__drc_errors": { diff --git a/flow/designs/nangate45/ariane133/rules-base.json b/flow/designs/nangate45/ariane133/rules-base.json index 0a6ee1d917..6ad8080e09 100644 --- a/flow/designs/nangate45/ariane133/rules-base.json +++ b/flow/designs/nangate45/ariane133/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.509, + "value": -0.845, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -650.0, + "value": -1730.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.482, + "value": -0.852, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -610.0, + "value": -1770.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.516, + "value": -0.867, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -653.0, + "value": -1800.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/gcd/rules-base.json b/flow/designs/nangate45/gcd/rules-base.json index 90428cccbc..9660611774 100644 --- a/flow/designs/nangate45/gcd/rules-base.json +++ b/flow/designs/nangate45/gcd/rules-base.json @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 4515, + "value": 5236, "compare": "<=" }, "detailedroute__route__drc_errors": { diff --git a/flow/designs/nangate45/ibex/rules-base.json b/flow/designs/nangate45/ibex/rules-base.json index cb35d317ef..6bfd481475 100644 --- a/flow/designs/nangate45/ibex/rules-base.json +++ b/flow/designs/nangate45/ibex/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.546, + "value": -1.07, "compare": ">=" }, "globalroute__timing__hold__ws": { diff --git a/flow/designs/nangate45/jpeg/rules-base.json b/flow/designs/nangate45/jpeg/rules-base.json index 564a07b43e..fa5449e10f 100644 --- a/flow/designs/nangate45/jpeg/rules-base.json +++ b/flow/designs/nangate45/jpeg/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -39.2, + "value": -53.3, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -49.5, + "value": -64.8, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -36.9, + "value": -53.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/swerv/rules-base.json b/flow/designs/nangate45/swerv/rules-base.json index 1b0037aabe..1d6b11da14 100644 --- a/flow/designs/nangate45/swerv/rules-base.json +++ b/flow/designs/nangate45/swerv/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.387, + "value": -0.532, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -310.0, + "value": -357.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.416, + "value": -0.544, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -249.0, + "value": -380.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.398, + "value": -0.533, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -233.0, + "value": -375.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index f770aff558..c0864fad14 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.101, + "value": -0.267, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.402, + "value": -84.2, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.111, + "value": -0.246, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.534, + "value": -75.8, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 4377730, + "value": 5599467, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.138, + "value": -0.248, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.924, + "value": -87.5, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/tinyRocket/rules-base.json b/flow/designs/nangate45/tinyRocket/rules-base.json index b43b2952ec..49b0eefcca 100644 --- a/flow/designs/nangate45/tinyRocket/rules-base.json +++ b/flow/designs/nangate45/tinyRocket/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -17.1, + "value": -34.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -30.0, + "value": -47.4, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -28.5, + "value": -41.6, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/chameleon/rules-base.json b/flow/designs/sky130hd/chameleon/rules-base.json index 79dae8637f..584ddf2d44 100644 --- a/flow/designs/sky130hd/chameleon/rules-base.json +++ b/flow/designs/sky130hd/chameleon/rules-base.json @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 680445, + "value": 808834, "compare": "<=" }, "detailedroute__route__drc_errors": { diff --git a/flow/designs/sky130hd/gcd/rules-base.json b/flow/designs/sky130hd/gcd/rules-base.json index 197be97c8d..6e86e2fd3d 100644 --- a/flow/designs/sky130hd/gcd/rules-base.json +++ b/flow/designs/sky130hd/gcd/rules-base.json @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 8194, + "value": 9945, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 4986, + "value": 5797, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/jpeg/rules-base.json b/flow/designs/sky130hd/jpeg/rules-base.json index ed2cd5869b..4698f87333 100644 --- a/flow/designs/sky130hd/jpeg/rules-base.json +++ b/flow/designs/sky130hd/jpeg/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.605, + "value": -0.888, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -55.8, + "value": -145.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -153.0, + "value": -250.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 100, + "value": 125, "compare": "<=" }, "finish__timing__setup__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -60.6, + "value": -128.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/microwatt/rules-base.json b/flow/designs/sky130hd/microwatt/rules-base.json index d91a4b5640..2ea5194c86 100644 --- a/flow/designs/sky130hd/microwatt/rules-base.json +++ b/flow/designs/sky130hd/microwatt/rules-base.json @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 2095, + "value": 2337, "compare": "<=" }, "finish__timing__setup__ws": { diff --git a/flow/designs/sky130hs/aes/rules-base.json b/flow/designs/sky130hs/aes/rules-base.json index a1fe05abc8..025435c2ce 100644 --- a/flow/designs/sky130hs/aes/rules-base.json +++ b/flow/designs/sky130hs/aes/rules-base.json @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.244, + "value": -0.454, "compare": ">=" }, "globalroute__timing__setup__tns": { diff --git a/flow/designs/sky130hs/ibex/rules-base.json b/flow/designs/sky130hs/ibex/rules-base.json index 48fc308608..45e82b5a10 100644 --- a/flow/designs/sky130hs/ibex/rules-base.json +++ b/flow/designs/sky130hs/ibex/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -41.0, + "value": -88.3, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.4, + "value": -6.46, "compare": ">=" }, "finish__timing__hold__ws": { From 066c2ed238be8fdb33edc6a7f571d206fb3af0bf Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Sat, 7 Mar 2026 11:09:32 +0000 Subject: [PATCH 038/202] update private metrics Signed-off-by: Eder Monteiro --- flow/designs/gf12/ariane/rules-base.json | 6 +++--- flow/designs/gf12/ibex/rules-base.json | 2 +- .../designs/gf12/swerv_wrapper/rules-base.json | 8 ++++---- flow/designs/rapidus2hp/ethmac/rules-base.json | 8 ++++---- .../rapidus2hp/ethmac/rules-verific.json | 8 ++++---- flow/designs/rapidus2hp/gcd/rules-base.json | 18 +++++++++--------- flow/designs/rapidus2hp/gcd/rules-verific.json | 12 ++++++------ .../hercules_idecode/rules-base.json | 10 +++++----- .../rapidus2hp/hercules_is_int/rules-base.json | 10 +++++----- .../hercules_is_int/rules-verific.json | 6 +++--- .../designs/rapidus2hp/ibex/rules-verific.json | 10 +++++----- flow/designs/rapidus2hp/jpeg/rules-base.json | 10 +++++----- .../designs/rapidus2hp/jpeg/rules-verific.json | 10 +++++----- 13 files changed, 59 insertions(+), 59 deletions(-) diff --git a/flow/designs/gf12/ariane/rules-base.json b/flow/designs/gf12/ariane/rules-base.json index 25ac24d9df..30f8f24b2b 100644 --- a/flow/designs/gf12/ariane/rules-base.json +++ b/flow/designs/gf12/ariane/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -211.0, + "value": -208.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -38800.0, + "value": -716.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 3427852, + "value": 3948737, "compare": "<=" }, "detailedroute__route__drc_errors": { diff --git a/flow/designs/gf12/ibex/rules-base.json b/flow/designs/gf12/ibex/rules-base.json index 3b63acb1a4..bd5e360b32 100644 --- a/flow/designs/gf12/ibex/rules-base.json +++ b/flow/designs/gf12/ibex/rules-base.json @@ -24,7 +24,7 @@ "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 1570, + "value": 1752, "compare": "<=" }, "cts__timing__setup__ws": { diff --git a/flow/designs/gf12/swerv_wrapper/rules-base.json b/flow/designs/gf12/swerv_wrapper/rules-base.json index e504c37e34..be48a57243 100644 --- a/flow/designs/gf12/swerv_wrapper/rules-base.json +++ b/flow/designs/gf12/swerv_wrapper/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -84.0, + "value": -75.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -374.0, + "value": -300.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 2369199, + "value": 2737551, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -88,7 +88,7 @@ "compare": ">=" }, "finish__timing__hold__ws": { - "value": -84.1, + "value": -83.4, "compare": ">=" }, "finish__timing__hold__tns": { diff --git a/flow/designs/rapidus2hp/ethmac/rules-base.json b/flow/designs/rapidus2hp/ethmac/rules-base.json index 8a34279dbc..2bdda7ddf4 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-base.json +++ b/flow/designs/rapidus2hp/ethmac/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0283, + "value": -0.0361, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.363, + "value": -0.633, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.24, + "value": -1.07, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.24, + "value": -1.07, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/ethmac/rules-verific.json b/flow/designs/rapidus2hp/ethmac/rules-verific.json index 20792283ab..10b8d821ce 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-verific.json +++ b/flow/designs/rapidus2hp/ethmac/rules-verific.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 86788, + "value": 86754, "compare": "<=" }, "detailedplace__design__violations": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.435, + "value": -0.47, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.948, + "value": -1.23, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.948, + "value": -1.23, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/gcd/rules-base.json b/flow/designs/rapidus2hp/gcd/rules-base.json index f4110338d8..7631522ba4 100644 --- a/flow/designs/rapidus2hp/gcd/rules-base.json +++ b/flow/designs/rapidus2hp/gcd/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 29, + "value": 27, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 682, + "value": 637, "compare": "<=" }, "detailedplace__design__violations": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0193, + "value": -0.0286, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.586, + "value": -0.493, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0297, + "value": -0.0404, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.768, + "value": -0.904, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0297, + "value": -0.0404, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.768, + "value": -0.904, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 32, + "value": 31, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/gcd/rules-verific.json b/flow/designs/rapidus2hp/gcd/rules-verific.json index 4fc7cf9b46..acbd6f9acb 100644 --- a/flow/designs/rapidus2hp/gcd/rules-verific.json +++ b/flow/designs/rapidus2hp/gcd/rules-verific.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 690, + "value": 666, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 60, + "value": 58, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 60, + "value": 58, "compare": "<=" }, "cts__timing__setup__ws": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.206, + "value": -0.581, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.363, + "value": -1.01, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.363, + "value": -1.01, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json index c65a3a3682..f3e161ec3a 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -26.4, + "value": -16.6, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0644, + "value": -0.0792, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -203.0, + "value": -272.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0644, + "value": -0.0792, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -203.0, + "value": -272.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json index 86002e8f20..e468c98ef8 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -132.0, + "value": -142.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.105, + "value": -0.134, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -907.0, + "value": -1010.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.105, + "value": -0.134, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -907.0, + "value": -1010.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json b/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json index 7bada738bb..c3b6278e66 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -158.0, + "value": -179.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.106, + "value": -0.132, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -64,7 +64,7 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.106, + "value": -0.132, "compare": ">=" }, "finish__timing__setup__tns": { diff --git a/flow/designs/rapidus2hp/ibex/rules-verific.json b/flow/designs/rapidus2hp/ibex/rules-verific.json index 476841c423..6581cd35d2 100644 --- a/flow/designs/rapidus2hp/ibex/rules-verific.json +++ b/flow/designs/rapidus2hp/ibex/rules-verific.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 23391, + "value": 23278, "compare": "<=" }, "detailedplace__design__violations": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0239, + "value": -0.085, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.0951, + "value": -31.8, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0239, + "value": -0.0852, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.0951, + "value": -31.8, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/jpeg/rules-base.json b/flow/designs/rapidus2hp/jpeg/rules-base.json index a8328c9bca..b58c3748e4 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-base.json +++ b/flow/designs/rapidus2hp/jpeg/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -37.8, + "value": -51.1, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.106, + "value": -0.0983, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -106.0, + "value": -119.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.106, + "value": -0.0983, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -106.0, + "value": -119.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/jpeg/rules-verific.json b/flow/designs/rapidus2hp/jpeg/rules-verific.json index 09e284c6b6..48b4c99d64 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-verific.json +++ b/flow/designs/rapidus2hp/jpeg/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -43.9, + "value": -42.4, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0956, + "value": -0.113, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -120.0, + "value": -127.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0956, + "value": -0.113, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -120.0, + "value": -127.0, "compare": ">=" }, "finish__timing__hold__ws": { From 722a9ab8e702752ec40e2e4406db596a16248c85 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Sat, 7 Mar 2026 11:12:55 +0000 Subject: [PATCH 039/202] update nangate45/bp_multi Signed-off-by: Eder Monteiro --- flow/designs/nangate45/bp_multi_top/rules-base.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index 79678ddd70..7420ef17ff 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 570000.0, + "value": 568000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 580304, + "value": 580168, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 3700293, + "value": 4677863, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -262.0, + "value": -373.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 587157, + "value": 586999, "compare": "<=" } } \ No newline at end of file From 92cf968177182ff85de0f99abc92768025c617b8 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Thu, 5 Mar 2026 18:42:30 +0900 Subject: [PATCH 040/202] lec: fix cell filtering and update kepler-formal - Enhance find_physical_only_masters to auto-detect cells with no signal pins and no liberty cell (e.g., CDMMTYPE2 marker cells) - Add REMOVE_CELLS_FOR_LEC support to write_lec_verilog in lec_check.tcl - Update kepler-formal to 093a7b5 (fix for missing bus direction) Co-Authored-By: Claude Opus 4.6 Signed-off-by: Jaehyun Kim --- flow/scripts/lec_check.tcl | 8 ++++---- flow/scripts/util.tcl | 34 +++++++++++++++++++++++++++++++++- tools/kepler-formal | 2 +- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/flow/scripts/lec_check.tcl b/flow/scripts/lec_check.tcl index 9166092c21..c36b1a4a4a 100644 --- a/flow/scripts/lec_check.tcl +++ b/flow/scripts/lec_check.tcl @@ -1,9 +1,9 @@ proc write_lec_verilog { filename } { + set remove_cells [find_physical_only_masters] if { [env_var_exists_and_non_empty REMOVE_CELLS_FOR_LEC] } { - write_verilog -remove_cells $::env(REMOVE_CELLS_FOR_LEC) $::env(RESULTS_DIR)/$filename - } else { - write_verilog $::env(RESULTS_DIR)/$filename + lappend remove_cells {*}$::env(REMOVE_CELLS_FOR_LEC) } + write_verilog -remove_cells $remove_cells $::env(RESULTS_DIR)/$filename } proc write_lec_script { step file1 file2 } { @@ -25,7 +25,7 @@ proc run_lec_test { step file1 file2 } { # tclint-disable-next-line command-args eval exec $::env(KEPLER_FORMAL_EXE) --config $::env(OBJECTS_DIR)/${step}_lec_test.yml try { - set count [exec grep -c "Found difference" $::env(LOG_DIR)/${step}_lec_check.log]] + set count [exec grep -c "Found difference" $::env(LOG_DIR)/${step}_lec_check.log] } trap CHILDSTATUS {results options} { # This block executes if grep returns a non-zero exit code set count 0 diff --git a/flow/scripts/util.tcl b/flow/scripts/util.tcl index 04b4d3727e..af92dbe0c2 100644 --- a/flow/scripts/util.tcl +++ b/flow/scripts/util.tcl @@ -229,6 +229,27 @@ proc is_physical_only_master { master } { return 0 } +# Returns 1 if the master has no signal pins (only power/ground or none). +proc has_signal_pins { master } { + foreach mterm [$master getMTerms] { + set sig_type [$mterm getSigType] + if { $sig_type != "POWER" && $sig_type != "GROUND" } { + return 1 + } + } + return 0 +} + +# Returns 1 if the master has a corresponding liberty cell. +proc has_liberty_cell { master } { + set master_name [$master getName] + set lib_cells [get_lib_cells -quiet */$master_name] + if { $lib_cells == {} } { + return 0 + } + return 1 +} + # Finds all physical-only masters in the current database and # returns their names. proc find_physical_only_masters { } { @@ -237,8 +258,19 @@ proc find_physical_only_masters { } { set physical_only_masters [list] foreach lib $libs { foreach master [$lib getMasters] { + set master_name [$master getName] if { [is_physical_only_master $master] } { - lappend physical_only_masters [$master getName] + lappend physical_only_masters $master_name + continue + } + + # Consider cells with no signal pins and no liberty cell as physical-only + if { [has_liberty_cell $master] == 0 } { + if { [has_signal_pins $master] == 0 } { + lappend physical_only_masters $master_name + } else { + puts "Warning: master $master_name has signal pins but no liberty cell" + } } } } diff --git a/tools/kepler-formal b/tools/kepler-formal index 8d74eb30df..093a7b50e0 160000 --- a/tools/kepler-formal +++ b/tools/kepler-formal @@ -1 +1 @@ -Subproject commit 8d74eb30df93f2d73adf11b4a3438d5f34b95ce7 +Subproject commit 093a7b50e0070391233103e1d63c1c49310ecfd6 From 420804862e7a6b6c5e89c91eb4e9f95ae18e46c4 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 6 Mar 2026 09:11:21 +0900 Subject: [PATCH 041/202] update metric - nangate45/ariane133 Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/ariane133/rules-base.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/nangate45/ariane133/rules-base.json b/flow/designs/nangate45/ariane133/rules-base.json index 6ad8080e09..8e5071431f 100644 --- a/flow/designs/nangate45/ariane133/rules-base.json +++ b/flow/designs/nangate45/ariane133/rules-base.json @@ -99,4 +99,4 @@ "value": 840911, "compare": "<=" } -} \ No newline at end of file +} From 19b02d57651cf0b29c0d1dbb8dcc873105a32188 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 6 Mar 2026 17:14:37 +0900 Subject: [PATCH 042/202] Bump OR (dbNetwork::id() fix) Signed-off-by: Jaehyun Kim --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 138e57370c..4c7355151c 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 138e57370c9814b3bd0f510167f120f861d2bdf2 +Subproject commit 4c7355151ca35420a3d01ceed6a73149b2ae6a18 From 21ac0abff86850831ff14fde48275bd63c39c3fe Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 6 Mar 2026 22:34:44 +0900 Subject: [PATCH 043/202] update metrics for CI failures (PR #3957) Widen metric bounds (value * 1.1) to fix CI metric check failures. | Design | Metric | Old | Observed | New | |---------------------------------|-----------------------------------------|---------|-----------|---------| | nangate45/tinyRocket (base) | cts__timing__setup__tns | -17.1 | -17.2921 | -19.0 | | nangate45/tinyRocket (base) | globalroute__timing__setup__tns | -30.0 | -32.0924 | -35.3 | | nangate45/tinyRocket (base) | finish__timing__setup__tns | -28.5 | -29.0358 | -31.9 | | asap7/aes-block (base) | cts__timing__setup__tns | -3710 | -4682.05 | -5150 | | asap7/aes-block (base) | globalroute__timing__setup__tns | -3650 | -3904.8 | -4295 | | asap7/aes-block (base) | globalroute__timing__hold__ws | -22.5 | -23.5852 | -25.9 | | nangate45/bp_multi_top (base) | finish__timing__setup__tns | -262 | -264.507 | -291 | | sky130hd/chameleon (base) | globalroute__antenna_diodes_count | 188 | 198 | 218 | | sky130hd/microwatt (base) | cts__timing__setup__tns | -300 | -319.524 | -352 | | sky130hd/microwatt (base) | detailedroute__antenna__violating__nets | 3 | 5 | 6 | | rapidus2hp/cva6 (base) | cts__timing__setup__tns | -287 | -316.999 | -349 | | rapidus2hp/cva6 (verific) | globalroute__timing__setup__tns | -650 | -731.798 | -805 | | rapidus2hp/cva6 (verific) | finish__timing__setup__tns | -650 | -731.821 | -805 | Co-Authored-By: Claude Opus 4.6 Signed-off-by: Jaehyun Kim --- flow/designs/asap7/aes-block/rules-base.json | 6 +++--- flow/designs/rapidus2hp/cva6/rules-base.json | 2 +- flow/designs/rapidus2hp/cva6/rules-verific.json | 4 ++-- flow/designs/sky130hd/chameleon/rules-base.json | 2 +- flow/designs/sky130hd/microwatt/rules-base.json | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/flow/designs/asap7/aes-block/rules-base.json b/flow/designs/asap7/aes-block/rules-base.json index 3276e206cf..2655437a40 100644 --- a/flow/designs/asap7/aes-block/rules-base.json +++ b/flow/designs/asap7/aes-block/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -3710.0, + "value": -5150.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,11 +52,11 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -3650.0, + "value": -4295.0, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -22.5, + "value": -25.9, "compare": ">=" }, "globalroute__timing__hold__tns": { diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index eeecec3aa3..62e9aeca02 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -287.0, + "value": -349.0, "compare": ">=" }, "cts__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json index 10726859ca..8e942630c7 100644 --- a/flow/designs/rapidus2hp/cva6/rules-verific.json +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -650.0, + "value": -805.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -650.0, + "value": -805.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/chameleon/rules-base.json b/flow/designs/sky130hd/chameleon/rules-base.json index 584ddf2d44..3f105102ea 100644 --- a/flow/designs/sky130hd/chameleon/rules-base.json +++ b/flow/designs/sky130hd/chameleon/rules-base.json @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 188, + "value": 218, "compare": "<=" }, "globalroute__timing__setup__ws": { diff --git a/flow/designs/sky130hd/microwatt/rules-base.json b/flow/designs/sky130hd/microwatt/rules-base.json index 2ea5194c86..645fe7f97b 100644 --- a/flow/designs/sky130hd/microwatt/rules-base.json +++ b/flow/designs/sky130hd/microwatt/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -311.0, + "value": -352.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -72,7 +72,7 @@ "compare": "<=" }, "detailedroute__antenna__violating__nets": { - "value": 5, + "value": 6, "compare": "<=" }, "detailedroute__antenna_diodes_count": { @@ -99,4 +99,4 @@ "value": 5578282, "compare": "<=" } -} \ No newline at end of file +} From d33d31bf4a7dbe31bcaa6b3b00b0767bd6da477c Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sat, 7 Mar 2026 09:54:49 +0900 Subject: [PATCH 044/202] Bump OR - rebase dbNetwork fix onto master Update OR submodule to rebased commit (758a57d790) with clean history on top of OR master. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Jaehyun Kim --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 4c7355151c..758a57d790 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 4c7355151ca35420a3d01ceed6a73149b2ae6a18 +Subproject commit 758a57d790e547b34b0b18dfe615a2d4462f7ff2 From eb0ad2467007178ccff937b878eb76f3f6469cf7 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sat, 7 Mar 2026 16:25:45 +0900 Subject: [PATCH 045/202] flow: update metrics for private designs designs/rapidus2hp/cva6/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.138 | -0.111 | Tighten | | cts__timing__setup__tns | -349.0 | -245.0 | Tighten | | globalroute__timing__setup__ws | -0.255 | -0.282 | Failing | | finish__timing__setup__ws | -0.255 | -0.282 | Failing | designs/rapidus2hp/cva6/rules-verific.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.157 | -0.14 | Tighten | | cts__timing__setup__tns | -518.0 | -412.0 | Tighten | | globalroute__timing__setup__tns | -805.0 | -697.0 | Tighten | | finish__timing__setup__tns | -805.0 | -697.0 | Tighten | Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/cva6/rules-base.json | 8 ++++---- flow/designs/rapidus2hp/cva6/rules-verific.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index 62e9aeca02..565cae8744 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.138, + "value": -0.111, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -349.0, + "value": -245.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.255, + "value": -0.282, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -64,7 +64,7 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.255, + "value": -0.282, "compare": ">=" }, "finish__timing__setup__tns": { diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json index 8e942630c7..2835bf83b3 100644 --- a/flow/designs/rapidus2hp/cva6/rules-verific.json +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.157, + "value": -0.14, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -518.0, + "value": -412.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -805.0, + "value": -697.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -805.0, + "value": -697.0, "compare": ">=" }, "finish__timing__hold__ws": { From 8fca77e5616fe2b747d4fca251086ae81d636980 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sun, 8 Mar 2026 10:08:17 +0900 Subject: [PATCH 046/202] flow: update metrics for CI failures (PR #3957) designs/nangate45/swerv_wrapper/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.267 | -0.197 | Tighten | | cts__timing__setup__tns | -84.2 | -8.83 | Tighten | | globalroute__timing__setup__ws | -0.246 | -0.398 | Failing | | globalroute__timing__setup__tns | -75.8 | -7.17 | Tighten | | detailedroute__route__wirelength | 5599467 | 4491246 | Tighten | | finish__timing__setup__ws | -0.248 | -0.185 | Tighten | | finish__timing__setup__tns | -87.5 | -0.853 | Tighten | | finish__timing__hold__ws | -0.107 | -0.103 | Tighten | | finish__timing__hold__tns | -0.407 | -0.403 | Tighten | designs/rapidus2hp/cva6/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -245.0 | -243.0 | Tighten | | globalroute__timing__setup__ws | -0.282 | -0.261 | Tighten | | globalroute__timing__hold__tns | -0.108 | -0.1 | Tighten | | finish__timing__setup__ws | -0.282 | -0.261 | Tighten | | finish__timing__hold__tns | -0.108 | -0.1 | Tighten | designs/rapidus2hp/hercules_is_int/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -142.0 | -132.0 | Tighten | | globalroute__timing__setup__ws | -0.134 | -0.103 | Tighten | | globalroute__timing__setup__tns | -1010.0 | -898.0 | Tighten | | finish__timing__setup__ws | -0.134 | -0.103 | Tighten | | finish__timing__setup__tns | -1010.0 | -898.0 | Tighten | Signed-off-by: Jaehyun Kim --- .../nangate45/swerv_wrapper/rules-base.json | 18 +++++++++--------- flow/designs/rapidus2hp/cva6/rules-base.json | 10 +++++----- .../rapidus2hp/hercules_is_int/rules-base.json | 10 +++++----- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index c0864fad14..86f7a4ef96 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.267, + "value": -0.197, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -84.2, + "value": -8.83, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.246, + "value": -0.398, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -75.8, + "value": -7.17, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 5599467, + "value": 4491246, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,19 +80,19 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.248, + "value": -0.185, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -87.5, + "value": -0.853, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -0.107, + "value": -0.103, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.407, + "value": -0.403, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index 565cae8744..9daadda638 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -245.0, + "value": -243.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.282, + "value": -0.261, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -60,11 +60,11 @@ "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -0.108, + "value": -0.1, "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.282, + "value": -0.261, "compare": ">=" }, "finish__timing__setup__tns": { @@ -76,7 +76,7 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.108, + "value": -0.1, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json index e468c98ef8..d8884e943e 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -142.0, + "value": -132.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.134, + "value": -0.103, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1010.0, + "value": -898.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.134, + "value": -0.103, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1010.0, + "value": -898.0, "compare": ">=" }, "finish__timing__hold__ws": { From a383bc46d870dbe1288039a51bff7d624525c6ab Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sun, 8 Mar 2026 14:52:47 +0900 Subject: [PATCH 047/202] flow: fix over-tightened swerv_wrapper metrics Re-ran update_rules with pr-head artifacts to widen bounds that were over-tightened from pr-merge results. Manually kept globalroute__timing__setup__ws at -0.398 to cover both pr-head (-0.146) and pr-merge (-0.298) observations. designs/nangate45/swerv_wrapper/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -8.83 | -84.2 | Failing | | globalroute__timing__setup__ws | -0.246 | -0.398 | (kept) | | globalroute__timing__setup__tns | -7.17 | -75.8 | Failing | | detailedroute__route__wirelength | 4491246 | 5599467 | Failing | | finish__timing__setup__tns | -0.853 | -87.5 | Failing | Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/swerv_wrapper/rules-base.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index 86f7a4ef96..4903ef22db 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -8.83, + "value": -84.2, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -7.17, + "value": -75.8, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 4491246, + "value": 5599467, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,15 +84,15 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.853, + "value": -87.5, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -0.103, + "value": -0.1, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.403, + "value": -0.4, "compare": ">=" }, "finish__design__instance__area": { From f5589a31571c7a48b6f5b038c289e0d23e2c77f0 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Mon, 9 Mar 2026 11:34:18 +0000 Subject: [PATCH 048/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index f54bcafd20..39015bafe0 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit f54bcafd20e12f115fed08d0e6da3539e5e9c7ff +Subproject commit 39015bafe0c907afdfdc97635cd985f7514a672e From 07783e4c2121328dd675037fbc27e805d22837ce Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 6 Mar 2026 18:46:03 +0900 Subject: [PATCH 049/202] base Signed-off-by: Jaehyun Kim --- flow/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/flow/Makefile b/flow/Makefile index f18ca938d7..06d02a3f79 100644 --- a/flow/Makefile +++ b/flow/Makefile @@ -4,6 +4,7 @@ # Out of ORFS trees can have their own settings.mk. -include settings.mk + # ============================================================================== # Uncomment or add the design to run # ============================================================================== From c3342ecd94fdf712267432207a3ffb5281775d47 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 6 Mar 2026 18:50:02 +0900 Subject: [PATCH 050/202] Bump OR - insert_buffer name collision fix Signed-off-by: Jaehyun Kim --- flow/Makefile | 1 - tools/OpenROAD | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/flow/Makefile b/flow/Makefile index 06d02a3f79..f18ca938d7 100644 --- a/flow/Makefile +++ b/flow/Makefile @@ -4,7 +4,6 @@ # Out of ORFS trees can have their own settings.mk. -include settings.mk - # ============================================================================== # Uncomment or add the design to run # ============================================================================== diff --git a/tools/OpenROAD b/tools/OpenROAD index 758a57d790..dc4da4fafa 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 758a57d790e547b34b0b18dfe615a2d4462f7ff2 +Subproject commit dc4da4fafae9748412e0d569a47d4c7f690680ca From b4153033826cac7a43b7a8229bfe83f6d63d781a Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sat, 7 Mar 2026 00:07:17 +0900 Subject: [PATCH 051/202] flow: update metrics for public designs designs/nangate45/tinyRocket/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -17.1 | -19.0 | Failing | | globalroute__timing__setup__tns | -30.0 | -35.3 | Failing | | finish__timing__setup__tns | -28.5 | -31.9 | Failing | designs/asap7/aes-block/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -3710.0 | -5150.0 | Failing | | globalroute__timing__setup__tns | -3650.0 | -4295.0 | Failing | | globalroute__timing__hold__ws | -22.5 | -25.9 | Failing | designs/nangate45/ariane133/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__timing__setup__tns | -583.0 | -642.0 | Failing | designs/nangate45/bp_fe_top/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | finish__timing__hold__ws | 0.0 | -0.002 | Failing | | finish__timing__hold__tns | 0.0 | -0.003 | Failing | designs/nangate45/bp_multi_top/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | finish__timing__setup__tns | -262.0 | -291.0 | Failing | designs/sky130hd/chameleon/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__antenna_diodes_count | 188 | 218 | Failing | designs/sky130hd/microwatt/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -300.0 | -352.0 | Failing | | detailedroute__antenna__violating__nets | 3 | 6 | Failing | Co-Authored-By: Claude Opus 4.6 Signed-off-by: Jaehyun Kim --- flow/designs/asap7/aes-block/rules-base.json | 6 +- .../nangate45/bp_fe_top/rules-base.json | 202 +++++++++--------- .../nangate45/bp_multi_top/rules-base.json | 8 +- .../nangate45/tinyRocket/rules-base.json | 2 +- .../sky130hd/chameleon/rules-base.json | 2 +- 5 files changed, 110 insertions(+), 110 deletions(-) diff --git a/flow/designs/asap7/aes-block/rules-base.json b/flow/designs/asap7/aes-block/rules-base.json index 2655437a40..45208f8afe 100644 --- a/flow/designs/asap7/aes-block/rules-base.json +++ b/flow/designs/asap7/aes-block/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -5150.0, + "value": -5150, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -4295.0, + "value": -4295, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -99,4 +99,4 @@ "value": 7206, "compare": "<=" } -} \ No newline at end of file +} diff --git a/flow/designs/nangate45/bp_fe_top/rules-base.json b/flow/designs/nangate45/bp_fe_top/rules-base.json index f153c05337..c52caad8b7 100644 --- a/flow/designs/nangate45/bp_fe_top/rules-base.json +++ b/flow/designs/nangate45/bp_fe_top/rules-base.json @@ -1,102 +1,102 @@ { - "synth__design__instance__area__stdcell": { - "value": 241575.35, - "compare": "<=" - }, - "constraints__clocks__count": { - "value": 1, - "compare": "==" - }, - "placeopt__design__instance__area": { - "value": 244991, - "compare": "<=" - }, - "placeopt__design__instance__count__stdcell": { - "value": 38771, - "compare": "<=" - }, - "detailedplace__design__violations": { - "value": 0, - "compare": "==" - }, - "cts__design__instance__count__setup_buffer": { - "value": 3371, - "compare": "<=" - }, - "cts__design__instance__count__hold_buffer": { - "value": 3371, - "compare": "<=" - }, - "cts__timing__setup__ws": { - "value": -0.09, - "compare": ">=" - }, - "cts__timing__setup__tns": { - "value": -0.36, - "compare": ">=" - }, - "cts__timing__hold__ws": { - "value": 0.0, - "compare": ">=" - }, - "cts__timing__hold__tns": { - "value": 0.0, - "compare": ">=" - }, - "globalroute__antenna_diodes_count": { - "value": 0, - "compare": "<=" - }, - "globalroute__timing__setup__ws": { - "value": -0.09, - "compare": ">=" - }, - "globalroute__timing__setup__tns": { - "value": -1.23, - "compare": ">=" - }, - "globalroute__timing__hold__ws": { - "value": 0.0, - "compare": ">=" - }, - "globalroute__timing__hold__tns": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__route__wirelength": { - "value": 1912200, - "compare": "<=" - }, - "detailedroute__route__drc_errors": { - "value": 0, - "compare": "<=" - }, - "detailedroute__antenna__violating__nets": { - "value": 0, - "compare": "<=" - }, - "detailedroute__antenna_diodes_count": { - "value": 5, - "compare": "<=" - }, - "finish__timing__setup__ws": { - "value": -0.222, - "compare": ">=" - }, - "finish__timing__setup__tns": { - "value": -13.8, - "compare": ">=" - }, - "finish__timing__hold__ws": { - "value": 0.0, - "compare": ">=" - }, - "finish__timing__hold__tns": { - "value": 0.0, - "compare": ">=" - }, - "finish__design__instance__area": { - "value": 247483, - "compare": "<=" - } -} \ No newline at end of file + "synth__design__instance__area__stdcell": { + "value": 241575.35, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 1, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 244991, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 38771, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 3371, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 3371, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.09, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -0.36, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": 0.0, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": 0.0, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 0, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.09, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -1.23, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": 0.0, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": 0.0, + "compare": ">=" + }, + "detailedroute__route__wirelength": { + "value": 1912200, + "compare": "<=" + }, + "detailedroute__route__drc_errors": { + "value": 0, + "compare": "<=" + }, + "detailedroute__antenna__violating__nets": { + "value": 0, + "compare": "<=" + }, + "detailedroute__antenna_diodes_count": { + "value": 5, + "compare": "<=" + }, + "finish__timing__setup__ws": { + "value": -0.222, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -13.8, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.002, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.003, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 247483, + "compare": "<=" + } +} diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index 7420ef17ff..763b6d62f4 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 568000.0, + "value": 570000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 580168, + "value": 580304, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 586999, + "value": 587157, "compare": "<=" } -} \ No newline at end of file +} diff --git a/flow/designs/nangate45/tinyRocket/rules-base.json b/flow/designs/nangate45/tinyRocket/rules-base.json index 49b0eefcca..fcffced277 100644 --- a/flow/designs/nangate45/tinyRocket/rules-base.json +++ b/flow/designs/nangate45/tinyRocket/rules-base.json @@ -99,4 +99,4 @@ "value": 62486, "compare": "<=" } -} \ No newline at end of file +} diff --git a/flow/designs/sky130hd/chameleon/rules-base.json b/flow/designs/sky130hd/chameleon/rules-base.json index 3f105102ea..6511dac5ba 100644 --- a/flow/designs/sky130hd/chameleon/rules-base.json +++ b/flow/designs/sky130hd/chameleon/rules-base.json @@ -99,4 +99,4 @@ "value": 6493440, "compare": "<=" } -} \ No newline at end of file +} From 9fd0f5aa9b9973fea46332ffa1b7f6f2c57312a7 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sat, 7 Mar 2026 08:30:58 +0900 Subject: [PATCH 052/202] flow: fix rules-base.json indent to 4-space Co-Authored-By: Claude Opus 4.6 Signed-off-by: Jaehyun Kim --- .../nangate45/bp_fe_top/rules-base.json | 200 +++++++++--------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/flow/designs/nangate45/bp_fe_top/rules-base.json b/flow/designs/nangate45/bp_fe_top/rules-base.json index c52caad8b7..c4be1ed899 100644 --- a/flow/designs/nangate45/bp_fe_top/rules-base.json +++ b/flow/designs/nangate45/bp_fe_top/rules-base.json @@ -1,102 +1,102 @@ { - "synth__design__instance__area__stdcell": { - "value": 241575.35, - "compare": "<=" - }, - "constraints__clocks__count": { - "value": 1, - "compare": "==" - }, - "placeopt__design__instance__area": { - "value": 244991, - "compare": "<=" - }, - "placeopt__design__instance__count__stdcell": { - "value": 38771, - "compare": "<=" - }, - "detailedplace__design__violations": { - "value": 0, - "compare": "==" - }, - "cts__design__instance__count__setup_buffer": { - "value": 3371, - "compare": "<=" - }, - "cts__design__instance__count__hold_buffer": { - "value": 3371, - "compare": "<=" - }, - "cts__timing__setup__ws": { - "value": -0.09, - "compare": ">=" - }, - "cts__timing__setup__tns": { - "value": -0.36, - "compare": ">=" - }, - "cts__timing__hold__ws": { - "value": 0.0, - "compare": ">=" - }, - "cts__timing__hold__tns": { - "value": 0.0, - "compare": ">=" - }, - "globalroute__antenna_diodes_count": { - "value": 0, - "compare": "<=" - }, - "globalroute__timing__setup__ws": { - "value": -0.09, - "compare": ">=" - }, - "globalroute__timing__setup__tns": { - "value": -1.23, - "compare": ">=" - }, - "globalroute__timing__hold__ws": { - "value": 0.0, - "compare": ">=" - }, - "globalroute__timing__hold__tns": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__route__wirelength": { - "value": 1912200, - "compare": "<=" - }, - "detailedroute__route__drc_errors": { - "value": 0, - "compare": "<=" - }, - "detailedroute__antenna__violating__nets": { - "value": 0, - "compare": "<=" - }, - "detailedroute__antenna_diodes_count": { - "value": 5, - "compare": "<=" - }, - "finish__timing__setup__ws": { - "value": -0.222, - "compare": ">=" - }, - "finish__timing__setup__tns": { - "value": -13.8, - "compare": ">=" - }, - "finish__timing__hold__ws": { - "value": -0.002, - "compare": ">=" - }, - "finish__timing__hold__tns": { - "value": -0.003, - "compare": ">=" - }, - "finish__design__instance__area": { - "value": 247483, - "compare": "<=" - } + "synth__design__instance__area__stdcell": { + "value": 241575.35, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 1, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 244991, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 38771, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 3371, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 3371, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.09, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -0.36, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": 0.0, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": 0.0, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 0, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.09, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -1.23, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": 0.0, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": 0.0, + "compare": ">=" + }, + "detailedroute__route__wirelength": { + "value": 1912200, + "compare": "<=" + }, + "detailedroute__route__drc_errors": { + "value": 0, + "compare": "<=" + }, + "detailedroute__antenna__violating__nets": { + "value": 0, + "compare": "<=" + }, + "detailedroute__antenna_diodes_count": { + "value": 5, + "compare": "<=" + }, + "finish__timing__setup__ws": { + "value": -0.222, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -13.8, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.002, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.003, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 247483, + "compare": "<=" + } } From 9cd4d9d3b120165a712f6e1812b522e519bed323 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sat, 7 Mar 2026 14:59:38 +0900 Subject: [PATCH 053/202] flow: update metrics for private designs designs/rapidus2hp/cva6/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.138 | -0.101 | Tighten | | cts__timing__setup__tns | -287.0 | -205.0 | Tighten | | globalroute__timing__setup__tns | -575.0 | -584.0 | Failing | | finish__timing__setup__tns | -575.0 | -584.0 | Failing | designs/rapidus2hp/cva6/rules-verific.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.157 | -0.14 | Tighten | | cts__timing__setup__tns | -518.0 | -412.0 | Tighten | | globalroute__timing__setup__tns | -650.0 | -697.0 | Failing | | finish__timing__setup__tns | -650.0 | -697.0 | Failing | designs/rapidus2hp/hercules_is_int/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__timing__setup__ws | -0.105 | -0.104 | Tighten | | globalroute__timing__setup__tns | -907.0 | -1120.0 | Failing | | finish__timing__setup__ws | -0.105 | -0.104 | Tighten | | finish__timing__setup__tns | -907.0 | -1120.0 | Failing | Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/cva6/rules-base.json | 4 ++-- flow/designs/rapidus2hp/hercules_is_int/rules-base.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index 9daadda638..75d727b172 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -575.0, + "value": -584.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -575.0, + "value": -584.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json index d8884e943e..7fc1cc37f3 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -898.0, + "value": -1120.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -898.0, + "value": -1120.0, "compare": ">=" }, "finish__timing__hold__ws": { From 2849501cd2eb0dbe27d584a832350aaae492f17c Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sun, 8 Mar 2026 10:08:20 +0900 Subject: [PATCH 054/202] flow: update metrics for CI failures (PR #3959) designs/sky130hd/microwatt/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -2.6 | -2.1 | Tighten | | cts__timing__setup__tns | -352 | -224.0 | Tighten | | globalroute__antenna_diodes_count | 2531 | 1962 | Tighten | | globalroute__timing__setup__ws | -2.59 | -2.2 | Tighten | | globalroute__timing__setup__tns | -304.0 | -188.0 | Tighten | | detailedroute__antenna_diodes_count | 2337 | 2377 | Failing | | finish__timing__setup__ws | -2.22 | -1.38 | Tighten | | finish__timing__setup__tns | -183.0 | -30.8 | Tighten | | finish__timing__hold__tns | -46.5 | -18.9 | Tighten | designs/rapidus2hp/hercules_idecode/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__timing__setup__ws | -0.0792 | -0.0767 | Tighten | | globalroute__timing__setup__tns | -272.0 | -206.0 | Tighten | | finish__timing__setup__ws | -0.0792 | -0.0767 | Tighten | | finish__timing__setup__tns | -272.0 | -206.0 | Tighten | designs/rapidus2hp/hercules_idecode/rules-verific.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.0226 | -0.0456 | Failing | | cts__timing__setup__tns | -7.13 | -70.6 | Failing | | globalroute__timing__setup__ws | -0.0668 | -0.0831 | Failing | | globalroute__timing__setup__tns | -189.0 | -263.0 | Failing | | finish__timing__setup__ws | -0.0668 | -0.0831 | Failing | | finish__timing__setup__tns | -189.0 | -263.0 | Failing | Signed-off-by: Jaehyun Kim --- .../hercules_idecode/rules-base.json | 8 ++++---- .../hercules_idecode/rules-verific.json | 12 ++++++------ .../designs/sky130hd/microwatt/rules-base.json | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json index f3e161ec3a..5e68206ac5 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0792, + "value": -0.0767, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -272.0, + "value": -206.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0792, + "value": -0.0767, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -272.0, + "value": -206.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json index af3f451f7f..ba31c5e501 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0226, + "value": -0.0456, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -7.13, + "value": -70.6, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0668, + "value": -0.0831, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -189.0, + "value": -263.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0668, + "value": -0.0831, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -189.0, + "value": -263.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/microwatt/rules-base.json b/flow/designs/sky130hd/microwatt/rules-base.json index 645fe7f97b..8c048d2f23 100644 --- a/flow/designs/sky130hd/microwatt/rules-base.json +++ b/flow/designs/sky130hd/microwatt/rules-base.json @@ -28,7 +28,7 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -2.6, + "value": -2.1, "compare": ">=" }, "cts__timing__setup__tns": { @@ -44,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 2531, + "value": 1962, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -2.59, + "value": -2.2, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -304.0, + "value": -188.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -76,15 +76,15 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 2337, + "value": 2377, "compare": "<=" }, "finish__timing__setup__ws": { - "value": -2.22, + "value": -1.38, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -183.0, + "value": -30.8, "compare": ">=" }, "finish__timing__hold__ws": { @@ -92,11 +92,11 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -46.5, + "value": -18.9, "compare": ">=" }, "finish__design__instance__area": { "value": 5578282, "compare": "<=" } -} +} \ No newline at end of file From 72165d37afe809815dab730a83962113a9a9deaf Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Tue, 10 Mar 2026 12:47:06 +0900 Subject: [PATCH 055/202] ci: retrigger CI builds Signed-off-by: Jaehyun Kim From 58ff91aff6429bbc170178e3c693c28230cc83b4 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Tue, 10 Mar 2026 18:03:15 +0900 Subject: [PATCH 056/202] flow: widen hercules_is_int metric bounds for CI stability Update 3 metrics that consistently fail across CI builds #11 and #12: - cts__timing__setup__tns: -132.0 -> -156.0 (observed: -141.74) - globalroute__timing__setup__ws: -0.103 -> -0.134 (observed: -0.1216) - finish__timing__setup__ws: -0.103 -> -0.134 (observed: -0.1216) Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/hercules_is_int/rules-base.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json index 7fc1cc37f3..e7dc50c087 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -132.0, + "value": -156.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.103, + "value": -0.134, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -64,7 +64,7 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.103, + "value": -0.134, "compare": ">=" }, "finish__timing__setup__tns": { From 638b8445a6674326ba8e0ce7487aca4b35490ddc Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Tue, 10 Mar 2026 13:05:18 +0000 Subject: [PATCH 057/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 39015bafe0..f5b3eb41f1 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 39015bafe0c907afdfdc97635cd985f7514a672e +Subproject commit f5b3eb41f10301f4278e57b3653059a76e636c77 From 2e57e7f787be9f856499c8ebf55354a71d6fcebe Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Tue, 10 Mar 2026 16:10:35 +0000 Subject: [PATCH 058/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index f5b3eb41f1..636a7a9967 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit f5b3eb41f10301f4278e57b3653059a76e636c77 +Subproject commit 636a7a9967566b415be4f2dddbaf81af44e95074 From 9e8857934388da81484f0ed778dab969bf9ad4d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Sun, 8 Mar 2026 21:53:50 +0100 Subject: [PATCH 059/202] [slang] Automatically blackbox macros from ADDITIONAL_LIBS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When using the slang HDL frontend, macros defined in ADDITIONAL_LIBS liberty files were not automatically blackboxed. If the same module had a competing Verilog definition in the source files, slang would elaborate the Verilog version instead of using the liberty view. Fix by extracting cell names from ADDITIONAL_LIBS and passing them as --blackboxed-module arguments to slang, making the behavior consistent with the builtin Verilog frontend. Tested: asap7/uart with a fake ADDITIONAL_LIBS containing uart_tx: Confirmed slang blackboxes uart_tx from the liberty file instead of elaborating it from the Verilog source. asap7/cva6 (which uses slang and ADDITIONAL_LIBS with fakeram macros that also have .sv definitions in VERILOG_FILES): make DESIGN_CONFIG=designs/asap7/cva6/config.mk do-yosys-canonicalize Passes in ~5s with no errors. asap7/uart without ADDITIONAL_LIBS: Normal synthesis still passes (no regression). Fixes #3849 Co-Authored-By: Claude Opus 4.6 Signed-off-by: Øyvind Harboe --- flow/scripts/synth_preamble.tcl | 10 ++++++++++ flow/scripts/util.tcl | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/flow/scripts/synth_preamble.tcl b/flow/scripts/synth_preamble.tcl index d8f98c8f69..1ef2f2b4bf 100644 --- a/flow/scripts/synth_preamble.tcl +++ b/flow/scripts/synth_preamble.tcl @@ -63,6 +63,16 @@ proc read_design_sources { } { lappend slang_args -G "$key=$value" } + # Automatically blackbox macros from ADDITIONAL_LIBS so that + # any competing Verilog definitions in the source files are + # ignored in favor of the liberty view, consistent with the + # behavior of the builtin Verilog frontend. + if { [env_var_exists_and_non_empty ADDITIONAL_LIBS] } { + foreach m [get_liberty_cell_names $::env(ADDITIONAL_LIBS)] { + lappend slang_args --blackboxed-module "$m" + } + } + # Apply module blackboxing based on module names as they appear # in the input, that is before any module name mangling done # by elaboration and synthesis diff --git a/flow/scripts/util.tcl b/flow/scripts/util.tcl index af92dbe0c2..112b78239d 100644 --- a/flow/scripts/util.tcl +++ b/flow/scripts/util.tcl @@ -1,3 +1,18 @@ +# Extract cell names from liberty files by parsing "cell(...)" declarations +proc get_liberty_cell_names { lib_files } { + set cell_names [list] + foreach lib $lib_files { + set fid [open $lib r] + while { [gets $fid line] >= 0 } { + if { [regexp {^\s*cell\s*\(\s*"?([^")\s]+)"?\s*\)} $line -> cell_name] } { + lappend cell_names $cell_name + } + } + close $fid + } + return $cell_names +} + proc log_cmd { cmd args } { # log the command, escape arguments with spaces set log_cmd "$cmd[join [lmap arg $args { format " %s" [expr { [string match {* *} $arg] ? "\"$arg\"" : "$arg" }] }] ""]" ;# tclint-disable-line line-length From e3959503eb3bfd5868095d062d7c88d27b9be01c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Povi=C5=A1er?= Date: Tue, 10 Mar 2026 17:36:47 +0100 Subject: [PATCH 060/202] synth: Ask yosys for cell names rather than .lib parsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Povišer --- flow/scripts/synth_preamble.tcl | 2 +- flow/scripts/util.tcl | 16 +++------------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/flow/scripts/synth_preamble.tcl b/flow/scripts/synth_preamble.tcl index 1ef2f2b4bf..3edee2d454 100644 --- a/flow/scripts/synth_preamble.tcl +++ b/flow/scripts/synth_preamble.tcl @@ -68,7 +68,7 @@ proc read_design_sources { } { # ignored in favor of the liberty view, consistent with the # behavior of the builtin Verilog frontend. if { [env_var_exists_and_non_empty ADDITIONAL_LIBS] } { - foreach m [get_liberty_cell_names $::env(ADDITIONAL_LIBS)] { + foreach m [get_liberty_cell_names] { lappend slang_args --blackboxed-module "$m" } } diff --git a/flow/scripts/util.tcl b/flow/scripts/util.tcl index 112b78239d..e309cedad3 100644 --- a/flow/scripts/util.tcl +++ b/flow/scripts/util.tcl @@ -1,16 +1,6 @@ -# Extract cell names from liberty files by parsing "cell(...)" declarations -proc get_liberty_cell_names { lib_files } { - set cell_names [list] - foreach lib $lib_files { - set fid [open $lib r] - while { [gets $fid line] >= 0 } { - if { [regexp {^\s*cell\s*\(\s*"?([^")\s]+)"?\s*\)} $line -> cell_name] } { - lappend cell_names $cell_name - } - } - close $fid - } - return $cell_names +# Extract cell names +proc get_liberty_cell_names { } { + return [tee -q -s result.string select -list-mod =A:liberty_cell] } proc log_cmd { cmd args } { From bf9d3299b2fefab2a861e60982254d2d0b58c7b1 Mon Sep 17 00:00:00 2001 From: Pavan kumar Date: Wed, 11 Mar 2026 00:10:04 +0530 Subject: [PATCH 061/202] Add report_layer_rc to floorplan stage Call report_layer_rc in floorplan.tcl to log per-layer resistance and capacitance values. Placed alongside existing report_units calls since RC values are static across all flow stages. Resolves #2841 Signed-off-by: Pavan kumar --- flow/scripts/floorplan.tcl | 1 + 1 file changed, 1 insertion(+) diff --git a/flow/scripts/floorplan.tcl b/flow/scripts/floorplan.tcl index c439174bc5..154160a1ac 100644 --- a/flow/scripts/floorplan.tcl +++ b/flow/scripts/floorplan.tcl @@ -146,6 +146,7 @@ if { $::env(REMOVE_ABC_BUFFERS) } { puts "Default units for flow" report_units report_units_metric +report_layer_rc report_metrics 2 "floorplan final" false false source_env_var_if_exists POST_FLOORPLAN_TCL From 52cf309deb1322d490b2ee567a61d1d3932d9503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Tue, 10 Mar 2026 22:02:20 +0100 Subject: [PATCH 062/202] flow: only enable LEC_CHECK when kepler-formal is installed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit kepler-formal is primarily an OpenROAD/ORFS developer tool. End-users would typically run LEC transactionally at project completion, not in every CI run. Default LEC_CHECK to 0 when kepler-formal is not present to avoid hard failures in environments where it is not installed. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Øyvind Harboe --- flow/settings.mk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/flow/settings.mk b/flow/settings.mk index e824878e7f..413a40682c 100644 --- a/flow/settings.mk +++ b/flow/settings.mk @@ -1 +1,5 @@ -export LEC_CHECK ?= 1 +# Enable LEC (Logical Equivalence Check) only if kepler-formal is installed. +# kepler-formal is primarily an OpenROAD/ORFS developer tool, not an end-user +# tool. End-users would typically run LEC transactionally at project completion, +# not in every CI run where it wastes CI time. +export LEC_CHECK ?= $(if $(wildcard $(KEPLER_FORMAL_EXE)),1,0) From d236d5186c4efc82e83149232fe41b6af4a9a515 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Tue, 10 Mar 2026 22:51:01 +0000 Subject: [PATCH 063/202] update OR Signed-off-by: Augusto Berndt --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 636a7a9967..fe1aa0f9d0 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 636a7a9967566b415be4f2dddbaf81af44e95074 +Subproject commit fe1aa0f9d0254fac87b82c886c04ee1544e46885 From 90ab6ed2c24ebbac4654bd38ba81e40802613c89 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 11 Mar 2026 07:55:46 +0000 Subject: [PATCH 064/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/asap7/aes-block/rules-base.json | 2 +- flow/designs/nangate45/ariane133/rules-base.json | 2 +- flow/designs/nangate45/bp_fe_top/rules-base.json | 2 +- .../designs/nangate45/bp_multi_top/rules-base.json | 2 +- .../nangate45/mempool_group/rules-base.json | 14 +++++++------- flow/designs/nangate45/tinyRocket/rules-base.json | 2 +- flow/designs/sky130hd/chameleon/rules-base.json | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/flow/designs/asap7/aes-block/rules-base.json b/flow/designs/asap7/aes-block/rules-base.json index 45208f8afe..012f81c8e0 100644 --- a/flow/designs/asap7/aes-block/rules-base.json +++ b/flow/designs/asap7/aes-block/rules-base.json @@ -99,4 +99,4 @@ "value": 7206, "compare": "<=" } -} +} \ No newline at end of file diff --git a/flow/designs/nangate45/ariane133/rules-base.json b/flow/designs/nangate45/ariane133/rules-base.json index 8e5071431f..6ad8080e09 100644 --- a/flow/designs/nangate45/ariane133/rules-base.json +++ b/flow/designs/nangate45/ariane133/rules-base.json @@ -99,4 +99,4 @@ "value": 840911, "compare": "<=" } -} +} \ No newline at end of file diff --git a/flow/designs/nangate45/bp_fe_top/rules-base.json b/flow/designs/nangate45/bp_fe_top/rules-base.json index c4be1ed899..87db27968c 100644 --- a/flow/designs/nangate45/bp_fe_top/rules-base.json +++ b/flow/designs/nangate45/bp_fe_top/rules-base.json @@ -99,4 +99,4 @@ "value": 247483, "compare": "<=" } -} +} \ No newline at end of file diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index 763b6d62f4..56e5c9c67e 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -99,4 +99,4 @@ "value": 587157, "compare": "<=" } -} +} \ No newline at end of file diff --git a/flow/designs/nangate45/mempool_group/rules-base.json b/flow/designs/nangate45/mempool_group/rules-base.json index 48e089a5f2..aa57c0f78e 100644 --- a/flow/designs/nangate45/mempool_group/rules-base.json +++ b/flow/designs/nangate45/mempool_group/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 271098.37, + "value": 424000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 295108, + "value": 451188, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 163160, + "value": 198708, "compare": "<=" }, "detailedplace__design__violations": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -10300.0, + "value": -11900.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -11100.0, + "value": -14200.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 4029078, + "value": 5795200, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 303227, + "value": 461696, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/tinyRocket/rules-base.json b/flow/designs/nangate45/tinyRocket/rules-base.json index fcffced277..49b0eefcca 100644 --- a/flow/designs/nangate45/tinyRocket/rules-base.json +++ b/flow/designs/nangate45/tinyRocket/rules-base.json @@ -99,4 +99,4 @@ "value": 62486, "compare": "<=" } -} +} \ No newline at end of file diff --git a/flow/designs/sky130hd/chameleon/rules-base.json b/flow/designs/sky130hd/chameleon/rules-base.json index 6511dac5ba..3f105102ea 100644 --- a/flow/designs/sky130hd/chameleon/rules-base.json +++ b/flow/designs/sky130hd/chameleon/rules-base.json @@ -99,4 +99,4 @@ "value": 6493440, "compare": "<=" } -} +} \ No newline at end of file From ff0c9452a740136bbcb05d96cf2bc560f907adc3 Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Wed, 11 Mar 2026 11:02:54 +0000 Subject: [PATCH 065/202] only call report_design_area if design is loaded Signed-off-by: Augusto Berndt --- flow/scripts/fillcell.tcl | 2 +- flow/scripts/io_placement.tcl | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index 0d8767c797..533b19d5d5 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -8,9 +8,9 @@ if { [env_var_exists_and_non_empty FILL_CELLS] } { log_cmd filler_placement $::env(FILL_CELLS) check_placement + report_design_area orfs_write_db $::env(RESULTS_DIR)/5_3_fillcell.odb } else { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb } -report_design_area diff --git a/flow/scripts/io_placement.tcl b/flow/scripts/io_placement.tcl index 93e2314a5e..42ae23664a 100644 --- a/flow/scripts/io_placement.tcl +++ b/flow/scripts/io_placement.tcl @@ -11,10 +11,11 @@ if { -hor_layers $::env(IO_PLACER_H) \ -ver_layers $::env(IO_PLACER_V) \ {*}[env_var_or_empty PLACE_PINS_ARGS] + report_design_area + orfs_write_db $::env(RESULTS_DIR)/3_2_place_iop.odb write_pin_placement $::env(RESULTS_DIR)/3_2_place_iop.tcl } else { log_cmd exec cp $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb $::env(RESULTS_DIR)/3_2_place_iop.odb } -report_design_area From 6b1e25ad3c830549b759291aa51186303ea834ba Mon Sep 17 00:00:00 2001 From: Augusto Berndt Date: Wed, 11 Mar 2026 11:38:15 +0000 Subject: [PATCH 066/202] fix lint Signed-off-by: Augusto Berndt --- flow/scripts/fillcell.tcl | 1 - flow/scripts/io_placement.tcl | 1 - 2 files changed, 2 deletions(-) diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index 533b19d5d5..16e6d297a8 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -13,4 +13,3 @@ if { [env_var_exists_and_non_empty FILL_CELLS] } { } else { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb } - diff --git a/flow/scripts/io_placement.tcl b/flow/scripts/io_placement.tcl index 42ae23664a..61464cf237 100644 --- a/flow/scripts/io_placement.tcl +++ b/flow/scripts/io_placement.tcl @@ -18,4 +18,3 @@ if { } else { log_cmd exec cp $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb $::env(RESULTS_DIR)/3_2_place_iop.odb } - From bacd074031dd5840f7c51e85d151197ecb9cb678 Mon Sep 17 00:00:00 2001 From: Dhirenderchoudhary Date: Wed, 11 Mar 2026 17:19:27 +0530 Subject: [PATCH 067/202] flow: add systematic PRE/POST step Tcl hooks Signed-off-by: Dhirenderchoudhary --- flow/scripts/cts.tcl | 1 + flow/scripts/density_fill.tcl | 1 + flow/scripts/detail_place.tcl | 1 + flow/scripts/detail_route.tcl | 1 + flow/scripts/fillcell.tcl | 2 + flow/scripts/final_report.tcl | 3 + flow/scripts/floorplan.tcl | 1 + flow/scripts/global_place.tcl | 1 + flow/scripts/global_place_skip_io.tcl | 1 + flow/scripts/global_route.tcl | 2 + flow/scripts/io_placement.tcl | 2 + flow/scripts/macro_place.tcl | 1 + flow/scripts/pdn.tcl | 1 + flow/scripts/repair_timing_post_place.tcl | 1 + flow/scripts/resize.tcl | 1 + flow/scripts/synth_odb.tcl | 3 +- flow/scripts/tapcell.tcl | 1 + flow/scripts/util.tcl | 5 + flow/scripts/variables.yaml | 160 ++++++++++++++++++++++ 19 files changed, 187 insertions(+), 2 deletions(-) diff --git a/flow/scripts/cts.tcl b/flow/scripts/cts.tcl index 13700382e0..ab87411168 100644 --- a/flow/scripts/cts.tcl +++ b/flow/scripts/cts.tcl @@ -4,6 +4,7 @@ source_step_tcl PRE CTS source $::env(SCRIPTS_DIR)/lec_check.tcl erase_non_stage_variables cts load_design 3_place.odb 3_place.sdc +source_step_tcl PRE CTS # Clone clock tree inverters next to register loads # so cts does not try to buffer the inverted clocks. diff --git a/flow/scripts/density_fill.tcl b/flow/scripts/density_fill.tcl index 6ea31e4a7a..ffd2ee2202 100644 --- a/flow/scripts/density_fill.tcl +++ b/flow/scripts/density_fill.tcl @@ -2,6 +2,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE DENSITY_FILL erase_non_stage_variables final load_design 5_route.odb 5_route.sdc +source_step_tcl PRE DENSITY_FILL if { $::env(USE_FILL) } { set_propagated_clock [all_clocks] diff --git a/flow/scripts/detail_place.tcl b/flow/scripts/detail_place.tcl index ce066e6511..ba2ba88bdb 100644 --- a/flow/scripts/detail_place.tcl +++ b/flow/scripts/detail_place.tcl @@ -3,6 +3,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE DETAIL_PLACE erase_non_stage_variables place load_design 3_4_place_resized.odb 2_floorplan.sdc +source_step_tcl PRE DETAIL_PLACE source $::env(PLATFORM_DIR)/setRC.tcl diff --git a/flow/scripts/detail_route.tcl b/flow/scripts/detail_route.tcl index 68aa47c756..27000b7e15 100644 --- a/flow/scripts/detail_route.tcl +++ b/flow/scripts/detail_route.tcl @@ -2,6 +2,7 @@ utl::set_metrics_stage "detailedroute__{}" source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE DETAIL_ROUTE load_design 5_1_grt.odb 5_1_grt.sdc +source_step_tcl PRE DETAIL_ROUTE if { ![grt::have_routes] } { error "Global routing failed, run `make gui_grt` and load $::global_route_congestion_report \ in DRC viewer to view congestion" diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index 6d56cc30a0..3162ddd96d 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -3,12 +3,14 @@ source_step_tcl PRE FILLCELL erase_non_stage_variables route if { [env_var_exists_and_non_empty FILL_CELLS] } { load_design 5_2_route.odb 5_1_grt.sdc + source_step_tcl PRE FILLCELL set_propagated_clock [all_clocks] log_cmd filler_placement $::env(FILL_CELLS) check_placement + source_step_tcl POST FILLCELL orfs_write_db $::env(RESULTS_DIR)/5_3_fillcell.odb } else { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb diff --git a/flow/scripts/final_report.tcl b/flow/scripts/final_report.tcl index 420034d7e4..dbd4b243d6 100644 --- a/flow/scripts/final_report.tcl +++ b/flow/scripts/final_report.tcl @@ -3,6 +3,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE FINAL_REPORT erase_non_stage_variables final load_design 6_1_fill.odb 6_1_fill.sdc +source_step_tcl PRE FINAL_REPORT set_propagated_clock [all_clocks] @@ -64,6 +65,8 @@ report_cell_usage report_metrics 6 "finish" +source_step_tcl POST FINAL_REPORT + # Save a final image if openroad is compiled with the gui # and a display is available (skip on headless machines) if { [ord::openroad_gui_compiled] && [env_var_exists_and_non_empty DISPLAY] } { diff --git a/flow/scripts/floorplan.tcl b/flow/scripts/floorplan.tcl index 69a99f2b9e..8e29162377 100644 --- a/flow/scripts/floorplan.tcl +++ b/flow/scripts/floorplan.tcl @@ -3,6 +3,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE FLOORPLAN erase_non_stage_variables floorplan load_design 1_synth.odb 1_synth.sdc +source_step_tcl PRE FLOORPLAN proc report_unused_masters { } { set db [ord::get_db] diff --git a/flow/scripts/global_place.tcl b/flow/scripts/global_place.tcl index e7f92089e8..089abdbc0c 100644 --- a/flow/scripts/global_place.tcl +++ b/flow/scripts/global_place.tcl @@ -3,6 +3,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE GLOBAL_PLACE erase_non_stage_variables place load_design 3_2_place_iop.odb 2_floorplan.sdc +source_step_tcl PRE GLOBAL_PLACE set_dont_use $::env(DONT_USE_CELLS) diff --git a/flow/scripts/global_place_skip_io.tcl b/flow/scripts/global_place_skip_io.tcl index e0eb0b078f..6b89222a4d 100644 --- a/flow/scripts/global_place_skip_io.tcl +++ b/flow/scripts/global_place_skip_io.tcl @@ -2,6 +2,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE GLOBAL_PLACE_SKIP_IO erase_non_stage_variables place load_design 2_floorplan.odb 2_floorplan.sdc +source_step_tcl PRE GLOBAL_PLACE_SKIP_IO if { [env_var_exists_and_non_empty FLOORPLAN_DEF] } { puts "FLOORPLAN_DEF is set. Skipping global placement without IOs" diff --git a/flow/scripts/global_route.tcl b/flow/scripts/global_route.tcl index ddc5e90c0b..b647e009bf 100644 --- a/flow/scripts/global_route.tcl +++ b/flow/scripts/global_route.tcl @@ -112,6 +112,8 @@ proc global_route_helper { } { # Use make target update_sdc_clock to install the updated sdc. source [file join $::env(SCRIPTS_DIR) "write_ref_sdc.tcl"] + source_step_tcl POST GLOBAL_ROUTE + write_guides $::env(RESULTS_DIR)/route.guide source_step_tcl POST GLOBAL_ROUTE orfs_write_db $::env(RESULTS_DIR)/5_1_grt.odb diff --git a/flow/scripts/io_placement.tcl b/flow/scripts/io_placement.tcl index 29731bbafb..ba04d7fe59 100644 --- a/flow/scripts/io_placement.tcl +++ b/flow/scripts/io_placement.tcl @@ -8,10 +8,12 @@ if { ![env_var_exists_and_non_empty FOOTPRINT_TCL] } { load_design 3_1_place_gp_skip_io.odb 2_floorplan.sdc + source_step_tcl PRE IO_PLACEMENT log_cmd place_pins \ -hor_layers $::env(IO_PLACER_H) \ -ver_layers $::env(IO_PLACER_V) \ {*}[env_var_or_empty PLACE_PINS_ARGS] + source_step_tcl POST IO_PLACEMENT orfs_write_db $::env(RESULTS_DIR)/3_2_place_iop.odb write_pin_placement $::env(RESULTS_DIR)/3_2_place_iop.tcl } else { diff --git a/flow/scripts/macro_place.tcl b/flow/scripts/macro_place.tcl index c2fdc21e30..99c5ee2155 100644 --- a/flow/scripts/macro_place.tcl +++ b/flow/scripts/macro_place.tcl @@ -2,6 +2,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE MACRO_PLACE erase_non_stage_variables floorplan load_design 2_1_floorplan.odb 2_1_floorplan.sdc +source_step_tcl PRE MACRO_PLACE source $::env(SCRIPTS_DIR)/macro_place_util.tcl diff --git a/flow/scripts/pdn.tcl b/flow/scripts/pdn.tcl index 18a4822b50..abcbf1cc82 100644 --- a/flow/scripts/pdn.tcl +++ b/flow/scripts/pdn.tcl @@ -2,6 +2,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE PDN erase_non_stage_variables floorplan load_design 2_3_floorplan_tapcell.odb 2_1_floorplan.sdc +source_step_tcl PRE PDN source $::env(PDN_TCL) pdngen diff --git a/flow/scripts/repair_timing_post_place.tcl b/flow/scripts/repair_timing_post_place.tcl index 5d43db8a02..038ac96ccf 100644 --- a/flow/scripts/repair_timing_post_place.tcl +++ b/flow/scripts/repair_timing_post_place.tcl @@ -3,6 +3,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE REPAIR_TIMING_POST_PLACE erase_non_stage_variables place load_design 3_5_place_dp.odb 3_place.sdc +source_step_tcl PRE REPAIR_TIMING_POST_PLACE set_placement_padding -global \ -left $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) \ diff --git a/flow/scripts/resize.tcl b/flow/scripts/resize.tcl index 0738314da5..6201226a88 100644 --- a/flow/scripts/resize.tcl +++ b/flow/scripts/resize.tcl @@ -3,6 +3,7 @@ source $::env(SCRIPTS_DIR)/load.tcl source_step_tcl PRE RESIZE erase_non_stage_variables place load_design 3_3_place_gp.odb 2_floorplan.sdc +source_step_tcl PRE RESIZE log_cmd estimate_parasitics -placement diff --git a/flow/scripts/synth_odb.tcl b/flow/scripts/synth_odb.tcl index a30278ff63..1ec969cafb 100644 --- a/flow/scripts/synth_odb.tcl +++ b/flow/scripts/synth_odb.tcl @@ -1,11 +1,10 @@ utl::set_metrics_stage "floorplan__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE SYNTH erase_non_stage_variables synth load_design 1_2_yosys.v 1_2_yosys.sdc +source_step_tcl PRE SYNTH source_step_tcl POST SYNTH - orfs_write_db $::env(RESULTS_DIR)/1_synth.odb # Canonicalize 1_synth.sdc. The original SDC_FILE provided by # the user could have dependencies, such as sourcing util.tcl, diff --git a/flow/scripts/tapcell.tcl b/flow/scripts/tapcell.tcl index 7a0b9abd56..e1078c0d5c 100644 --- a/flow/scripts/tapcell.tcl +++ b/flow/scripts/tapcell.tcl @@ -3,6 +3,7 @@ source_step_tcl PRE TAPCELL erase_non_stage_variables floorplan load_design 2_2_floorplan_macro.odb 2_1_floorplan.sdc +source_step_tcl PRE TAPCELL if { [env_var_exists_and_non_empty TAPCELL_TCL] } { source $::env(TAPCELL_TCL) diff --git a/flow/scripts/util.tcl b/flow/scripts/util.tcl index b1446e920d..727a92ebfe 100644 --- a/flow/scripts/util.tcl +++ b/flow/scripts/util.tcl @@ -263,3 +263,8 @@ proc orfs_write_sdc { output_file } { } log_cmd write_sdc -no_timestamp $output_file } + +proc source_step_tcl { hook_type step_name } { + set env_var "${hook_type}_${step_name}_TCL" + source_env_var_if_exists $env_var +} diff --git a/flow/scripts/variables.yaml b/flow/scripts/variables.yaml index d707f6b6d1..e59f38466d 100644 --- a/flow/scripts/variables.yaml +++ b/flow/scripts/variables.yaml @@ -1032,6 +1032,166 @@ POST_CTS_TCL: Specifies a Tcl script with commands to run after CTS is completed. stages: - cts +POST_DENSITY_FILL_TCL: + description: | + Specifies a Tcl script with commands to run after density fill. + stages: + - final +POST_DETAIL_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run after detailed placement. + stages: + - place +POST_DETAIL_ROUTE_TCL: + description: | + Specifies a Tcl script with commands to run after detailed route. + stages: + - route +POST_FILLCELL_TCL: + description: | + Specifies a Tcl script with commands to run after fillcell insertion. + stages: + - route +POST_FINAL_REPORT_TCL: + description: | + Specifies a Tcl script with commands to run after final report generation. + stages: + - final +POST_FLOORPLAN_TCL: + description: | + Specifies a Tcl script with commands to run after floorplan is completed. + stages: + - floorplan +POST_GLOBAL_PLACE_SKIP_IO_TCL: + description: | + Specifies a Tcl script with commands to run after global placement (skip IO). + stages: + - place +POST_GLOBAL_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run after global placement. + stages: + - place +POST_GLOBAL_ROUTE_TCL: + description: | + Specifies a Tcl script with commands to run after global route. + stages: + - grt +POST_IO_PLACEMENT_TCL: + description: | + Specifies a Tcl script with commands to run after IO placement. + stages: + - place +POST_MACRO_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run after macro placement. + stages: + - floorplan +POST_PDN_TCL: + description: | + Specifies a Tcl script with commands to run after PDN generation. + stages: + - floorplan +POST_REPAIR_TIMING_POST_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run after post-place timing repair. + stages: + - place +POST_RESIZE_TCL: + description: | + Specifies a Tcl script with commands to run after resize. + stages: + - place +POST_SYNTH_TCL: + description: | + Specifies a Tcl script with commands to run after synthesis ODB generation. + stages: + - synth +POST_TAPCELL_TCL: + description: | + Specifies a Tcl script with commands to run after tapcell. + stages: + - floorplan +PRE_CTS_TCL: + description: | + Specifies a Tcl script with commands to run before CTS. + stages: + - cts +PRE_DENSITY_FILL_TCL: + description: | + Specifies a Tcl script with commands to run before density fill. + stages: + - final +PRE_DETAIL_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run before detailed placement. + stages: + - place +PRE_DETAIL_ROUTE_TCL: + description: | + Specifies a Tcl script with commands to run before detailed route. + stages: + - route +PRE_FILLCELL_TCL: + description: | + Specifies a Tcl script with commands to run before fillcell insertion. + stages: + - route +PRE_FINAL_REPORT_TCL: + description: | + Specifies a Tcl script with commands to run before final report generation. + stages: + - final +PRE_FLOORPLAN_TCL: + description: | + Specifies a Tcl script with commands to run before floorplan. + stages: + - floorplan +PRE_GLOBAL_PLACE_SKIP_IO_TCL: + description: | + Specifies a Tcl script with commands to run before global placement (skip IO). + stages: + - place +PRE_GLOBAL_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run before global placement. + stages: + - place +PRE_IO_PLACEMENT_TCL: + description: | + Specifies a Tcl script with commands to run before IO placement. + stages: + - place +PRE_MACRO_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run before macro placement. + stages: + - floorplan +PRE_PDN_TCL: + description: | + Specifies a Tcl script with commands to run before PDN generation. + stages: + - floorplan +PRE_REPAIR_TIMING_POST_PLACE_TCL: + description: | + Specifies a Tcl script with commands to run before post-place timing repair. + stages: + - place +PRE_RESIZE_TCL: + description: | + Specifies a Tcl script with commands to run before resize. + stages: + - place +PRE_SYNTH_TCL: + description: | + Specifies a Tcl script with commands to run before synthesis ODB generation. + stages: + - synth +PRE_TAPCELL_TCL: + description: | + Specifies a Tcl script with commands to run before tapcell. + stages: + - floorplan FASTROUTE_TCL: description: | Specifies a Tcl script with commands to run before FastRoute. From 8443baf2ab045d81bbd8b3ede2826f0f77947d2f Mon Sep 17 00:00:00 2001 From: Dhirenderchoudhary Date: Wed, 11 Mar 2026 17:23:16 +0530 Subject: [PATCH 068/202] flow: drop accidental variables.yaml duplication Signed-off-by: Dhirenderchoudhary --- flow/scripts/variables.yaml | 651 ------------------------------------ 1 file changed, 651 deletions(-) diff --git a/flow/scripts/variables.yaml b/flow/scripts/variables.yaml index e59f38466d..d2018d5baf 100644 --- a/flow/scripts/variables.yaml +++ b/flow/scripts/variables.yaml @@ -1473,657 +1473,6 @@ REMOVE_CELLS_FOR_LEC: String patterns directly passed to write_verilog -remove_cells <> for lec checks. type: string -ASAP7_USE_VT: - description: > - A space separated list of VT options to use with the ASAP7 standard cell library: - RVT, LVT, SLVT. - stages: - - All stages - default: RVT - Weight for violating the fixed outline constraint, meaning that all - clusters should be placed within the shape of their parent cluster. - default: 100.00 - stages: - - floorplan -RTLMP_BOUNDARY_WT: - description: > - Weight for the boundary or how far the hard macro clusters are from - boundaries. - default: 50.0 - stages: - - floorplan -RTLMP_NOTCH_WT: - description: > - Weight for the notch, or the existence of dead space that cannot be used - for placement and routing. - default: 50.0 - stages: - - floorplan -RTLMP_RPT_DIR: - description: > - Path to the directory where reports are saved. - stages: - - floorplan -RTLMP_FENCE_LX: - description: > - Defines the lower left X coordinate for the global fence bounding box in - microns. - default: 0.0 - stages: - - floorplan -RTLMP_FENCE_LY: - description: > - Defines the lower left Y coordinate for the global fence bounding box in - microns. - default: 0.0 - stages: - - floorplan -RTLMP_FENCE_UX: - description: > - Defines the upper right X coordinate for the global fence bounding box in - microns. - default: 0.0 - stages: - - floorplan -RTLMP_FENCE_UY: - description: > - Defines the upper right Y coordinate for the global fence bounding box in - microns. - default: 0.0 - stages: - - floorplan -RTLMP_ARGS: - description: > - Overrides all other RTL macro placer arguments. - stages: - - floorplan -GDS_ALLOW_EMPTY: - description: > - Single regular expression of module names of macros that have no .gds file - stages: - - final -RUN_SCRIPT: - description: > - Path to script to run from `make run`, python or tcl script detected by - .py or .tcl extension. -RUN_LOG_NAME_STEM: - description: > - Stem of the log file name, the log file will be named - `$(LOG_DIR)/$(RUN_LOG_NAME_STEM).log`. - default: run -YOSYS_FLAGS: - description: > - Flags to pass to yosys. - stages: - - synth - default: -v 3 -FOOTPRINT: - description: | - Custom footprint definition file for ICeWall-based floorplan initialization. Mutually exclusive with FLOORPLAN_DEF or DIE_AREA/CORE_AREA or CORE_UTILIZATION. - stages: - - floorplan -FOOTPRINT_TCL: - description: | - Specifies a Tcl script with custom footprint-related commands for floorplan setup. - stages: - - floorplan -FLOW_VARIANT: - description: > - Flow variant to use, used in the flow variant directory name. - default: base -RULES_JSON: - description: > - json files with the metrics baseline regression rules. - In the ORFS Makefile, this defaults to $DESIGN_DIR/rules-base.json, - but ORFS does not mandate the users source directory layout and - this can be placed elsewhere when the user sets up an ORFS - config.mk or from bazel-orfs. - stages: - - test -SKIP_ANTENNA_REPAIR_PRE_GRT: - default: 0 - description: > - Skips antenna repair pre-global routing. - stages: - - grt -SKIP_ANTENNA_REPAIR_POST_DRT: - default: 0 - description: > - Skips antenna repair post-detailed routing. - stages: - - route -SKIP_ANTENNA_REPAIR: - default: 0 - description: > - Skips antenna repair entirely. - stages: - - grt -SKIP_DETAILED_ROUTE: - default: 0 - description: > - Skips detailed route. - stages: - - route - - final -MAX_REPAIR_ANTENNAS_ITER_DRT: - default: 5 - description: > - Defines the maximum number of iterations post-detailed routing repair - antennas will run. - stages: - - route -MAX_REPAIR_ANTENNAS_ITER_GRT: - default: 5 - description: > - Defines the maximum number of iterations post global routing repair - antennas will run. - stages: - - grt -OPENROAD_HIERARCHICAL: - description: > - Feature toggle to enable to run OpenROAD in hierarchical mode, - otherwise considered flat. Will eventually be the default and - this option will be retired. - default: 0 - stages: - - All stages -MAX_REPAIR_TIMING_ITER: - description: > - Maximum number of iterations for repair setup and repair hold. - stages: - - cts - - floorplan - - grt - - place -NUM_CORES: - description: > - Passed to `openroad -threads $(NUM_CORES)`, defaults to numbers - of cores in system as determined by system specific code in Makefile, - `nproc` is tried first. - OpenROAD does not limit itself to this number of cores across - OpenROAD running instances, which can lead to overprovisioning - in contexts such as bazel-orfs where there could be many - routing, or place jobs running at the same time. - stages: - - All stages -KEEP_VARS: - description: > - Feature toggle to keep intermediate variables during the flow. - This is useful for the single-run flow, where all stages of the flow - are run in a single OpenROAD instance. - default: 0 - stages: - - All stages -WRITE_ODB_AND_SDC_EACH_STAGE: - description: > - Save out .sdc and .odb file after each stage, useful to disable - when using a single OpenROAD instance to run all stages of the flow. - stages: - - All stages - default: 1 -LEC_CHECK: - description: > - Perform a formal equivalence check between before and after netlists. - If this fails, report an issue to OpenROAD. - default: 0 - stages: - - cts -REMOVE_CELLS_FOR_LEC: - description: > - String patterns directly passed to write_verilog -remove_cells <> for - lec checks. - type: string -ASAP7_USE_VT: - description: > - A space separated list of VT options to use with the ASAP7 standard cell library: - RVT, LVT, SLVT. - stages: - - All stages - default: RVT -PRE_SYNTH_TCL: - description: | - Specifies a Tcl script with commands to run before synthesis ODB generation. - stages: - - synth -POST_SYNTH_TCL: - description: | - Specifies a Tcl script with commands to run after synthesis ODB generation. - stages: - - synth -PRE_FLOORPLAN_TCL: - description: | - Specifies a Tcl script with commands to run before floorplan. - stages: - - floorplan -POST_FLOORPLAN_TCL: - description: | - Specifies a Tcl script with commands to run after floorplan is completed. - stages: - - floorplan -PRE_MACRO_PLACE_TCL: - description: | - Specifies a Tcl script with commands to run before macro placement. - stages: - - floorplan -POST_MACRO_PLACE_TCL: - description: | - Specifies a Tcl script with commands to run after macro placement. - stages: - - floorplan -PRE_TAPCELL_TCL: - description: | - Specifies a Tcl script with commands to run before tapcell. - stages: - - floorplan -POST_TAPCELL_TCL: - description: | - Specifies a Tcl script with commands to run after tapcell. - stages: - - floorplan -PRE_PDN_TCL: - description: | - Specifies a Tcl script with commands to run before PDN generation. - stages: - - floorplan -POST_PDN_TCL: - description: | - Specifies a Tcl script with commands to run after PDN generation. - stages: - - floorplan -PRE_GLOBAL_PLACE_SKIP_IO_TCL: - description: | - Specifies a Tcl script with commands to run before global placement (skip IO). - stages: - - place -POST_GLOBAL_PLACE_SKIP_IO_TCL: - description: | - Specifies a Tcl script with commands to run after global placement (skip IO). - stages: - - place -PRE_IO_PLACEMENT_TCL: - description: | - Specifies a Tcl script with commands to run before IO placement. - stages: - - place -POST_IO_PLACEMENT_TCL: - description: | - Specifies a Tcl script with commands to run after IO placement. - stages: - - place -PRE_GLOBAL_PLACE_TCL: - description: | - Specifies a Tcl script with commands to run before global placement. - stages: - - place -POST_GLOBAL_PLACE_TCL: - description: | - Specifies a Tcl script with commands to run after global placement. - stages: - - place -PRE_RESIZE_TCL: - description: | - Specifies a Tcl script with commands to run before resize. - stages: - - place -POST_RESIZE_TCL: - description: | - Specifies a Tcl script with commands to run after resize. - stages: - - place -PRE_DETAIL_PLACE_TCL: - description: | - Specifies a Tcl script with commands to run before detailed placement. - stages: - - place -POST_DETAIL_PLACE_TCL: - description: | - Specifies a Tcl script with commands to run after detailed placement. - stages: - - place -PRE_REPAIR_TIMING_POST_PLACE_TCL: - description: | - Specifies a Tcl script with commands to run before post-place timing repair. - stages: - - place -POST_REPAIR_TIMING_POST_PLACE_TCL: - description: | - Specifies a Tcl script with commands to run after post-place timing repair. - stages: - - place -PRE_CTS_TCL: - description: | - Specifies a Tcl script with commands to run before CTS. - stages: - - cts -POST_CTS_TCL: - description: | - Specifies a Tcl script with commands to run after CTS is completed. - stages: - - cts -FASTROUTE_TCL: - description: | - Specifies a Tcl script with commands to run before FastRoute. -USE_FILL: - description: > - Whether to perform metal density filling. - default: 0 -SEAL_GDS: - description: | - Seal macro to place around the design. -ABSTRACT_SOURCE: - description: | - Which .odb file to use to create abstract - stages: - - generate_abstract -PRE_GLOBAL_ROUTE_TCL: - description: | - Specifies a Tcl script with commands to run before global route. - stages: - - grt -POST_GLOBAL_ROUTE_TCL: - description: | - Specifies a Tcl script with commands to run after global route. - stages: - - grt -PRE_DETAIL_ROUTE_TCL: - description: | - Specifies a Tcl script with commands to run before detailed route. - stages: - - route -POST_DETAIL_ROUTE_TCL: - description: | - Specifies a Tcl script with commands to run after detailed route. - stages: - - route -PRE_FILLCELL_TCL: - description: | - Specifies a Tcl script with commands to run before fillcell insertion. - stages: - - route -POST_FILLCELL_TCL: - description: | - Specifies a Tcl script with commands to run after fillcell insertion. - stages: - - route -PRE_DENSITY_FILL_TCL: - description: | - Specifies a Tcl script with commands to run before density fill. - stages: - - final -POST_DENSITY_FILL_TCL: - description: | - Specifies a Tcl script with commands to run after density fill. - stages: - - final -PRE_FINAL_REPORT_TCL: - description: | - Specifies a Tcl script with commands to run before final report generation. - stages: - - final -POST_FINAL_REPORT_TCL: - description: | - Specifies a Tcl script with commands to run after final report generation. - stages: - - final -GLOBAL_ROUTE_ARGS: - description: > - Replaces default arguments for global route. - stages: - - grt - default: -congestion_iterations 30 -congestion_report_iter_step 5 -verbose -MATCH_CELL_FOOTPRINT: - description: > - Enforce sizing operations to only swap cells that have the same layout - boundary. - stages: - - floorplan - - place - - cts - - route - default: 0 -RTLMP_MAX_LEVEL: - description: > - Maximum depth of the physical hierarchy tree. - default: 2 - stages: - - floorplan -RTLMP_MAX_INST: - description: > - Maximum number of standard cells in a cluster. If unset, rtl_macro_placer - will calculate a value based on the design attributes. - stages: - - floorplan -RTLMP_MIN_INST: - description: > - Minimum number of standard cells in a cluster. If unset, rtl_macro_placer - will calculate a value based on the design attributes. - stages: - - floorplan -RTLMP_MAX_MACRO: - description: > - Maximum number of macros in a cluster. If unset, rtl_macro_placer will - calculate a value based on the design attributes. - stages: - - floorplan -RTLMP_MIN_MACRO: - description: > - Minimum number of macros in a cluster. If unset, rtl_macro_placer will - calculate a value based on the design attributes. - stages: - - floorplan -RTLMP_MIN_AR: - description: > - Specifies the minimum aspect ratio (height/width). - default: 0.33 - stages: - - floorplan -RTLMP_AREA_WT: - description: > - Weight for the area of the current floorplan. - default: 0.1 - stages: - - floorplan -RTLMP_WIRELENGTH_WT: - description: > - Weight for half-perimiter wirelength. - default: 100.0 - stages: - - floorplan -RTLMP_OUTLINE_WT: - description: > - Weight for violating the fixed outline constraint, meaning that all - clusters should be placed within the shape of their parent cluster. - default: 100.00 - stages: - - floorplan -RTLMP_BOUNDARY_WT: - description: > - Weight for the boundary or how far the hard macro clusters are from - boundaries. - default: 50.0 - stages: - - floorplan -RTLMP_NOTCH_WT: - description: > - Weight for the notch, or the existence of dead space that cannot be used - for placement and routing. - default: 50.0 - stages: - - floorplan -RTLMP_RPT_DIR: - description: > - Path to the directory where reports are saved. - stages: - - floorplan -RTLMP_FENCE_LX: - description: > - Defines the lower left X coordinate for the global fence bounding box in - microns. - default: 0.0 - stages: - - floorplan -RTLMP_FENCE_LY: - description: > - Defines the lower left Y coordinate for the global fence bounding box in - microns. - default: 0.0 - stages: - - floorplan -RTLMP_FENCE_UX: - description: > - Defines the upper right X coordinate for the global fence bounding box in - microns. - default: 0.0 - stages: - - floorplan -RTLMP_FENCE_UY: - description: > - Defines the upper right Y coordinate for the global fence bounding box in - microns. - default: 0.0 - stages: - - floorplan -RTLMP_ARGS: - description: > - Overrides all other RTL macro placer arguments. - stages: - - floorplan -GDS_ALLOW_EMPTY: - description: > - Single regular expression of module names of macros that have no .gds file - stages: - - final -RUN_SCRIPT: - description: > - Path to script to run from `make run`, python or tcl script detected by - .py or .tcl extension. -RUN_LOG_NAME_STEM: - description: > - Stem of the log file name, the log file will be named - `$(LOG_DIR)/$(RUN_LOG_NAME_STEM).log`. - default: run -YOSYS_FLAGS: - description: > - Flags to pass to yosys. - stages: - - synth - default: -v 3 -FOOTPRINT: - description: | - Custom footprint definition file for ICeWall-based floorplan initialization. Mutually exclusive with FLOORPLAN_DEF or DIE_AREA/CORE_AREA or CORE_UTILIZATION. - stages: - - floorplan -FOOTPRINT_TCL: - description: | - Specifies a Tcl script with custom footprint-related commands for floorplan setup. - stages: - - floorplan -FLOW_VARIANT: - description: > - Flow variant to use, used in the flow variant directory name. - default: base -RULES_JSON: - description: > - json files with the metrics baseline regression rules. - In the ORFS Makefile, this defaults to $DESIGN_DIR/rules-base.json, - but ORFS does not mandate the users source directory layout and - this can be placed elsewhere when the user sets up an ORFS - config.mk or from bazel-orfs. - stages: - - test -SKIP_ANTENNA_REPAIR_PRE_GRT: - default: 0 - description: > - Skips antenna repair pre-global routing. - stages: - - grt -SKIP_ANTENNA_REPAIR_POST_DRT: - default: 0 - description: > - Skips antenna repair post-detailed routing. - stages: - - route -SKIP_ANTENNA_REPAIR: - default: 0 - description: > - Skips antenna repair entirely. - stages: - - grt -SKIP_DETAILED_ROUTE: - default: 0 - description: > - Skips detailed route. - stages: - - route - - final -MAX_REPAIR_ANTENNAS_ITER_DRT: - default: 5 - description: > - Defines the maximum number of iterations post-detailed routing repair - antennas will run. - stages: - - route -MAX_REPAIR_ANTENNAS_ITER_GRT: - default: 5 - description: > - Defines the maximum number of iterations post global routing repair - antennas will run. - stages: - - grt -OPENROAD_HIERARCHICAL: - description: > - Feature toggle to enable to run OpenROAD in hierarchical mode, - otherwise considered flat. Will eventually be the default and - this option will be retired. - default: 0 - stages: - - All stages -MAX_REPAIR_TIMING_ITER: - description: > - Maximum number of iterations for repair setup and repair hold. - stages: - - cts - - floorplan - - grt - - place -NUM_CORES: - description: > - Passed to `openroad -threads $(NUM_CORES)`, defaults to numbers - of cores in system as determined by system specific code in Makefile, - `nproc` is tried first. - OpenROAD does not limit itself to this number of cores across - OpenROAD running instances, which can lead to overprovisioning - in contexts such as bazel-orfs where there could be many - routing, or place jobs running at the same time. - stages: - - All stages -KEEP_VARS: - description: > - Feature toggle to keep intermediate variables during the flow. - This is useful for the single-run flow, where all stages of the flow - are run in a single OpenROAD instance. - default: 0 - stages: - - All stages -WRITE_ODB_AND_SDC_EACH_STAGE: - description: > - Save out .sdc and .odb file after each stage, useful to disable - when using a single OpenROAD instance to run all stages of the flow. - stages: - - All stages - default: 1 -LEC_CHECK: - description: > - Perform a formal equivalence check between before and after netlists. - If this fails, report an issue to OpenROAD. - default: 0 - stages: - - cts -REMOVE_CELLS_FOR_LEC: - description: > - String patterns directly passed to write_verilog -remove_cells <> for - lec checks. - type: string ASAP7_USE_VT: description: > A space separated list of VT options to use with the ASAP7 standard cell library: From a75f44c6fcce24fe37be450482132572c33d2085 Mon Sep 17 00:00:00 2001 From: Arthur Koucher Date: Tue, 10 Mar 2026 19:55:06 -0300 Subject: [PATCH 069/202] remove unused GPL related operations in correlation scripts Signed-off-by: Arthur Koucher --- flow/util/correlateRC.py | 12 +++++------- flow/util/write_net_rc.tcl | 3 --- flow/util/write_net_rc_script.tcl | 7 +------ 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/flow/util/correlateRC.py b/flow/util/correlateRC.py index 6c19f807f3..548a0abc2a 100755 --- a/flow/util/correlateRC.py +++ b/flow/util/correlateRC.py @@ -124,15 +124,13 @@ def makeDict(): data[design][netName] = { "type": tokens[1], - "gpl_res": float(tokens[2]), - "gpl_cap": float(tokens[3]), - "grt_res": float(tokens[4]), - "grt_cap": float(tokens[5]), - "rcx_res": float(tokens[6]), - "rcx_cap": float(tokens[7]), + "grt_res": float(tokens[2]), + "grt_cap": float(tokens[3]), + "rcx_res": float(tokens[4]), + "rcx_cap": float(tokens[5]), } - layer_lengths = [float(tok) for tok in tokens[8:]] + layer_lengths = [float(tok) for tok in tokens[6:]] for i, length in enumerate(layer_lengths): if length > 0: active_layers.add(i) diff --git a/flow/util/write_net_rc.tcl b/flow/util/write_net_rc.tcl index c9d083034a..fbe7c956fd 100644 --- a/flow/util/write_net_rc.tcl +++ b/flow/util/write_net_rc.tcl @@ -33,7 +33,6 @@ proc report_var_caps { var_name count } { } proc write_rc_csv { filename } { - upvar 1 gpl gpl_net_name_to_rc upvar 1 grt grt_net_name_to_rc upvar 1 rcx rcx_net_name_to_rc @@ -68,13 +67,11 @@ proc write_rc_csv { filename } { (!$use_drt_data || [$db_net getWire] ne "NULL") } { set net_name [get_full_name $net] - lassign $gpl_net_name_to_rc($net_name) gpl_net_res gpl_net_cap lassign $grt_net_name_to_rc($net_name) grt_net_res grt_net_cap lassign $rcx_net_name_to_rc($net_name) rcx_net_res rcx_net_cap set net_type [expr { [string equal $type "CLOCK"] ? "clock" : "signal" }] puts -nonewline $stream "[get_full_name $net],$net_type," puts -nonewline $stream [concat \ - [format "%.3e" $gpl_net_res] "," [format "%.3e" $gpl_net_cap] "," \ [format "%.3e" $grt_net_res] "," [format "%.3e" $grt_net_cap] "," \ [format "%.3e" $rcx_net_res] "," [format "%.3e" $rcx_net_cap]] set db_net [sta::sta_to_db_net $net] diff --git a/flow/util/write_net_rc_script.tcl b/flow/util/write_net_rc_script.tcl index a2815ce5a6..0b7cd71a55 100644 --- a/flow/util/write_net_rc_script.tcl +++ b/flow/util/write_net_rc_script.tcl @@ -3,16 +3,11 @@ load_design 6_final.odb 6_final.sdc source $::env(UTILS_DIR)/write_net_rc.tcl -estimate_parasitics -placement -record_wire_rc gpl - estimate_parasitics -global_routing record_wire_rc grt read_spef $::env(RESULTS_DIR)/6_final.spef record_wire_rc rcx -#compare_wire_rc 50 grt rcx - -# write gpl/grt/rcx rc file for correlateRC.py +# write grt/rcx rc file for correlateRC.py write_rc_csv $::env(RESULTS_DIR)/6_net_rc.csv From f83ab7c5b66167e5fcb35eca4471c678379066e5 Mon Sep 17 00:00:00 2001 From: Jorge Ferreira Date: Wed, 11 Mar 2026 16:03:44 +0000 Subject: [PATCH 070/202] chore: tuning asap7 swerv_wrapper for zero violations (CORE_UTILIZATION=25, PLACE_DENSITY=0.70, clk_period=1800) Signed-off-by: Jorge Ferreira --- flow/designs/asap7/swerv_wrapper/config.mk | 9 +++++---- flow/designs/asap7/swerv_wrapper/constraint.sdc | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/flow/designs/asap7/swerv_wrapper/config.mk b/flow/designs/asap7/swerv_wrapper/config.mk index 7316e10210..f31f62ed37 100644 --- a/flow/designs/asap7/swerv_wrapper/config.mk +++ b/flow/designs/asap7/swerv_wrapper/config.mk @@ -51,11 +51,13 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/swerv_wrapper/constraint.sdc export ADDITIONAL_LEFS = $(sort $(wildcard $(DESIGN_HOME)/$(PLATFORM)/swerv_wrapper/lef/*.lef)) export ADDITIONAL_LIBS = $(sort $(wildcard $(DESIGN_HOME)/$(PLATFORM)/swerv_wrapper/lib/*.lib)) -export DIE_AREA = 0 0 550 600 -export CORE_AREA = 5 5 545 595 +export CORE_UTILIZATION = 30 +# export DIE_AREA = 0 0 350 400 +# export CORE_AREA = 5 5 345 395 export IO_CONSTRAINTS = $(DESIGN_HOME)/$(PLATFORM)/swerv_wrapper/io.tcl -export PLACE_DENSITY_LB_ADDON = 0.20 +# export PLACE_DENSITY_LB_ADDON = 0.20 +export PLACE_DENSITY = 0.70 export ROUTING_LAYER_ADJUSTMENT = 0.2 @@ -63,4 +65,3 @@ export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 export LEC_CHECK = 0 - diff --git a/flow/designs/asap7/swerv_wrapper/constraint.sdc b/flow/designs/asap7/swerv_wrapper/constraint.sdc index 99e95e8e24..d01f656a06 100644 --- a/flow/designs/asap7/swerv_wrapper/constraint.sdc +++ b/flow/designs/asap7/swerv_wrapper/constraint.sdc @@ -2,7 +2,7 @@ current_design swerv_wrapper set clk_name core_clock set clk_port_name clk -set clk_period 1600 +set clk_period 1800 set clk_io_pct 0.2 set clk_port [get_ports $clk_port_name] From 2aed93a4a3c851525149cc6e9cec51c4bc05cd8b Mon Sep 17 00:00:00 2001 From: Dhirenderchoudhary Date: Thu, 12 Mar 2026 01:09:16 +0530 Subject: [PATCH 071/202] flow: remove duplicate PRE/POST hook calls Remove duplicate Signed-off-by: Dhirenderchoudhary Signed-off-by: Dhirenderchoudhary --- flow/scripts/cts.tcl | 1 - flow/scripts/density_fill.tcl | 1 - flow/scripts/detail_place.tcl | 1 - flow/scripts/detail_route.tcl | 1 - flow/scripts/fillcell.tcl | 2 -- flow/scripts/final_report.tcl | 3 --- flow/scripts/floorplan.tcl | 1 - flow/scripts/global_place.tcl | 1 - flow/scripts/global_place_skip_io.tcl | 1 - flow/scripts/global_route.tcl | 2 -- flow/scripts/io_placement.tcl | 2 -- flow/scripts/macro_place.tcl | 1 - flow/scripts/pdn.tcl | 1 - flow/scripts/repair_timing_post_place.tcl | 1 - flow/scripts/resize.tcl | 1 - flow/scripts/tapcell.tcl | 1 - 16 files changed, 21 deletions(-) diff --git a/flow/scripts/cts.tcl b/flow/scripts/cts.tcl index ab87411168..05f65e8958 100644 --- a/flow/scripts/cts.tcl +++ b/flow/scripts/cts.tcl @@ -1,6 +1,5 @@ utl::set_metrics_stage "cts__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE CTS source $::env(SCRIPTS_DIR)/lec_check.tcl erase_non_stage_variables cts load_design 3_place.odb 3_place.sdc diff --git a/flow/scripts/density_fill.tcl b/flow/scripts/density_fill.tcl index ffd2ee2202..8b1d019eab 100644 --- a/flow/scripts/density_fill.tcl +++ b/flow/scripts/density_fill.tcl @@ -1,5 +1,4 @@ source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE DENSITY_FILL erase_non_stage_variables final load_design 5_route.odb 5_route.sdc source_step_tcl PRE DENSITY_FILL diff --git a/flow/scripts/detail_place.tcl b/flow/scripts/detail_place.tcl index ba2ba88bdb..17c14e41bb 100644 --- a/flow/scripts/detail_place.tcl +++ b/flow/scripts/detail_place.tcl @@ -1,6 +1,5 @@ utl::set_metrics_stage "detailedplace__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE DETAIL_PLACE erase_non_stage_variables place load_design 3_4_place_resized.odb 2_floorplan.sdc source_step_tcl PRE DETAIL_PLACE diff --git a/flow/scripts/detail_route.tcl b/flow/scripts/detail_route.tcl index 27000b7e15..6f28d3cf94 100644 --- a/flow/scripts/detail_route.tcl +++ b/flow/scripts/detail_route.tcl @@ -1,6 +1,5 @@ utl::set_metrics_stage "detailedroute__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE DETAIL_ROUTE load_design 5_1_grt.odb 5_1_grt.sdc source_step_tcl PRE DETAIL_ROUTE if { ![grt::have_routes] } { diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index 3162ddd96d..6f21db38de 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -1,5 +1,4 @@ source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE FILLCELL erase_non_stage_variables route if { [env_var_exists_and_non_empty FILL_CELLS] } { load_design 5_2_route.odb 5_1_grt.sdc @@ -10,7 +9,6 @@ if { [env_var_exists_and_non_empty FILL_CELLS] } { log_cmd filler_placement $::env(FILL_CELLS) check_placement - source_step_tcl POST FILLCELL orfs_write_db $::env(RESULTS_DIR)/5_3_fillcell.odb } else { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb diff --git a/flow/scripts/final_report.tcl b/flow/scripts/final_report.tcl index dbd4b243d6..e1d8ca1ff0 100644 --- a/flow/scripts/final_report.tcl +++ b/flow/scripts/final_report.tcl @@ -1,6 +1,5 @@ utl::set_metrics_stage "finish__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE FINAL_REPORT erase_non_stage_variables final load_design 6_1_fill.odb 6_1_fill.sdc source_step_tcl PRE FINAL_REPORT @@ -72,5 +71,3 @@ source_step_tcl POST FINAL_REPORT if { [ord::openroad_gui_compiled] && [env_var_exists_and_non_empty DISPLAY] } { gui::show "source $::env(SCRIPTS_DIR)/save_images.tcl" false } - -source_step_tcl POST FINAL_REPORT diff --git a/flow/scripts/floorplan.tcl b/flow/scripts/floorplan.tcl index 8e29162377..55dfc4a7c4 100644 --- a/flow/scripts/floorplan.tcl +++ b/flow/scripts/floorplan.tcl @@ -1,6 +1,5 @@ utl::set_metrics_stage "floorplan__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE FLOORPLAN erase_non_stage_variables floorplan load_design 1_synth.odb 1_synth.sdc source_step_tcl PRE FLOORPLAN diff --git a/flow/scripts/global_place.tcl b/flow/scripts/global_place.tcl index 089abdbc0c..5ed29fc24e 100644 --- a/flow/scripts/global_place.tcl +++ b/flow/scripts/global_place.tcl @@ -1,6 +1,5 @@ utl::set_metrics_stage "globalplace__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE GLOBAL_PLACE erase_non_stage_variables place load_design 3_2_place_iop.odb 2_floorplan.sdc source_step_tcl PRE GLOBAL_PLACE diff --git a/flow/scripts/global_place_skip_io.tcl b/flow/scripts/global_place_skip_io.tcl index 6b89222a4d..74f6602b9b 100644 --- a/flow/scripts/global_place_skip_io.tcl +++ b/flow/scripts/global_place_skip_io.tcl @@ -1,5 +1,4 @@ source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE GLOBAL_PLACE_SKIP_IO erase_non_stage_variables place load_design 2_floorplan.odb 2_floorplan.sdc source_step_tcl PRE GLOBAL_PLACE_SKIP_IO diff --git a/flow/scripts/global_route.tcl b/flow/scripts/global_route.tcl index b647e009bf..ddc5e90c0b 100644 --- a/flow/scripts/global_route.tcl +++ b/flow/scripts/global_route.tcl @@ -112,8 +112,6 @@ proc global_route_helper { } { # Use make target update_sdc_clock to install the updated sdc. source [file join $::env(SCRIPTS_DIR) "write_ref_sdc.tcl"] - source_step_tcl POST GLOBAL_ROUTE - write_guides $::env(RESULTS_DIR)/route.guide source_step_tcl POST GLOBAL_ROUTE orfs_write_db $::env(RESULTS_DIR)/5_1_grt.odb diff --git a/flow/scripts/io_placement.tcl b/flow/scripts/io_placement.tcl index ba04d7fe59..9585ff754d 100644 --- a/flow/scripts/io_placement.tcl +++ b/flow/scripts/io_placement.tcl @@ -1,5 +1,4 @@ source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE IO_PLACEMENT erase_non_stage_variables place if { @@ -13,7 +12,6 @@ if { -hor_layers $::env(IO_PLACER_H) \ -ver_layers $::env(IO_PLACER_V) \ {*}[env_var_or_empty PLACE_PINS_ARGS] - source_step_tcl POST IO_PLACEMENT orfs_write_db $::env(RESULTS_DIR)/3_2_place_iop.odb write_pin_placement $::env(RESULTS_DIR)/3_2_place_iop.tcl } else { diff --git a/flow/scripts/macro_place.tcl b/flow/scripts/macro_place.tcl index 99c5ee2155..c12625878a 100644 --- a/flow/scripts/macro_place.tcl +++ b/flow/scripts/macro_place.tcl @@ -1,5 +1,4 @@ source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE MACRO_PLACE erase_non_stage_variables floorplan load_design 2_1_floorplan.odb 2_1_floorplan.sdc source_step_tcl PRE MACRO_PLACE diff --git a/flow/scripts/pdn.tcl b/flow/scripts/pdn.tcl index abcbf1cc82..25b8c66937 100644 --- a/flow/scripts/pdn.tcl +++ b/flow/scripts/pdn.tcl @@ -1,5 +1,4 @@ source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE PDN erase_non_stage_variables floorplan load_design 2_3_floorplan_tapcell.odb 2_1_floorplan.sdc source_step_tcl PRE PDN diff --git a/flow/scripts/repair_timing_post_place.tcl b/flow/scripts/repair_timing_post_place.tcl index 038ac96ccf..57db9ff55a 100644 --- a/flow/scripts/repair_timing_post_place.tcl +++ b/flow/scripts/repair_timing_post_place.tcl @@ -1,6 +1,5 @@ utl::set_metrics_stage "place_repair_timing__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE REPAIR_TIMING_POST_PLACE erase_non_stage_variables place load_design 3_5_place_dp.odb 3_place.sdc source_step_tcl PRE REPAIR_TIMING_POST_PLACE diff --git a/flow/scripts/resize.tcl b/flow/scripts/resize.tcl index 6201226a88..b26ea447e8 100644 --- a/flow/scripts/resize.tcl +++ b/flow/scripts/resize.tcl @@ -1,6 +1,5 @@ utl::set_metrics_stage "placeopt__{}" source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE RESIZE erase_non_stage_variables place load_design 3_3_place_gp.odb 2_floorplan.sdc source_step_tcl PRE RESIZE diff --git a/flow/scripts/tapcell.tcl b/flow/scripts/tapcell.tcl index e1078c0d5c..490aa7f0fe 100644 --- a/flow/scripts/tapcell.tcl +++ b/flow/scripts/tapcell.tcl @@ -1,5 +1,4 @@ source $::env(SCRIPTS_DIR)/load.tcl -source_step_tcl PRE TAPCELL erase_non_stage_variables floorplan load_design 2_2_floorplan_macro.odb 2_1_floorplan.sdc From 16c4106e3f0524a986778e40b2cd4e7ae9ca17db Mon Sep 17 00:00:00 2001 From: Dhirender Choudhary Date: Thu, 12 Mar 2026 01:10:58 +0530 Subject: [PATCH 072/202] Delete source_step_tcl procedure Remove unused source_step_tcl procedure. Signed-off-by: Dhirender Choudhary --- flow/scripts/util.tcl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/flow/scripts/util.tcl b/flow/scripts/util.tcl index 727a92ebfe..596c9aaed8 100644 --- a/flow/scripts/util.tcl +++ b/flow/scripts/util.tcl @@ -192,10 +192,6 @@ proc source_env_var_if_exists { env_var } { } } -proc source_step_tcl { hook_type step_name } { - set env_var "${hook_type}_${step_name}_TCL" - source_env_var_if_exists $env_var -} # Feature toggle for now, eventually the -hier option # will be default and this code will be deleted. From 425338b8504104e12b74b69b7dd0bc09beaf48ae Mon Sep 17 00:00:00 2001 From: Arthur Koucher Date: Wed, 11 Mar 2026 18:45:50 -0300 Subject: [PATCH 073/202] prepare correlateRC.py for regression model based on segments Signed-off-by: Arthur Koucher --- flow/util/correlateRC.py | 241 +++++++++++++++++++++------------------ 1 file changed, 129 insertions(+), 112 deletions(-) diff --git a/flow/util/correlateRC.py b/flow/util/correlateRC.py index 548a0abc2a..bced14e168 100755 --- a/flow/util/correlateRC.py +++ b/flow/util/correlateRC.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 -# Read grt/rcx capacitance/wire length files for multiple designs and -# use linear regression to fit layer capacitances to rcx net capacitances. -# Use ORFS 'make write_net_rc' to write cap files. +# Script for generating and comparing per-layer parasitics values. +# These values are used by set_layer_rc and will be the base +# values for the parasitics estimations across the flow. import os from sys import exit, stderr @@ -46,6 +46,13 @@ def parse_args(): default=False, help="Plot grt/rcx resistance differences", ) + parser.add_argument( + "--mode", + required=False, + choices=["net", "segment"], + default="net", + help="Input mode: 'net' for net-level RC (make write_net_rc), 'segment' for segment-level RC (make write_segment_rc)", + ) parser.add_argument( "rc_file", nargs="+", help="rc csv file written by make compare_rc" ) @@ -120,43 +127,47 @@ def makeDict(): continue tokens = line.strip().split(",") - netName = tokens[0] - - data[design][netName] = { - "type": tokens[1], - "grt_res": float(tokens[2]), - "grt_cap": float(tokens[3]), - "rcx_res": float(tokens[4]), - "rcx_cap": float(tokens[5]), - } - - layer_lengths = [float(tok) for tok in tokens[6:]] - for i, length in enumerate(layer_lengths): - if length > 0: - active_layers.add(i) - - data[design][netName]["layer_lengths"] = layer_lengths - data[design][netName]["routable_layer_lengths"] = [ - length - for i, length in enumerate(layer_lengths) - # ignore non-routable layers - if stack[i][1] - ] - data[design][netName]["wire_length"] = sum( - length - for i, length in enumerate(layer_lengths) - # ignore non-routable layers - if stack[i][1] - ) - data[design][netName]["grt_via_res"] = sum( - (length * stack[i][2]) - for i, length in enumerate(layer_lengths) - if not stack[i][1] - ) + + if args.mode == "segment": + pass + else: + netName = tokens[0] + + data[design][netName] = { + "type": tokens[1], + "grt_res": float(tokens[2]), + "grt_cap": float(tokens[3]), + "rcx_res": float(tokens[4]), + "rcx_cap": float(tokens[5]), + } + + layer_lengths = [float(tok) for tok in tokens[6:]] + for i, length in enumerate(layer_lengths): + if length > 0: + active_layers.add(i) + + data[design][netName]["layer_lengths"] = layer_lengths + data[design][netName]["routable_layer_lengths"] = [ + length + for i, length in enumerate(layer_lengths) + # ignore non-routable layers + if stack[i][1] + ] + data[design][netName]["wire_length"] = sum( + length + for i, length in enumerate(layer_lengths) + # ignore non-routable layers + if stack[i][1] + ) + data[design][netName]["grt_via_res"] = sum( + (length * stack[i][2]) + for i, length in enumerate(layer_lengths) + if not stack[i][1] + ) ################################################################ -if args.plot_cap: +if args.mode == "net" and args.plot_cap: # Compare the GRT cap estimate vs. OpenRCX SPEF cap diff_x = [] @@ -198,7 +209,7 @@ def makeDict(): ################################################################ -if args.plot_res: +if args.mode == "net" and args.plot_res: # Compare the GRT res estimate vs. OpenRCX SPEF res diff_x = [] @@ -241,96 +252,102 @@ def makeDict(): ################################################################ -# Use linear regression to find updated layer resistances. - -x = [] -y = [] -for design in data: - for net in data[design]: - rcx_res = data[design][net]["rcx_res"] - if rcx_res > 0: - x.append(data[design][net]["routable_layer_lengths"]) - y.append(rcx_res - data[design][net]["grt_via_res"]) - -x = np.array(x) -y = np.array(y) - -res_model = LinearRegression(fit_intercept=False).fit(x, y) -r_sq = res_model.score(x, y) -print("# Resistance coefficient of determination: {:.4f}".format(r_sq)) - -################################################################ - -# Use linear regression to find updated layer capacitances. - -x = [] -y = [] -for design in data: - for net in data[design]: - x.append(data[design][net]["routable_layer_lengths"]) - y.append(data[design][net]["rcx_cap"]) - -x = np.array(x) -y = np.array(y) - -cap_model = LinearRegression(fit_intercept=False).fit(x, y) -r_sq = cap_model.score(x, y) -print("# Capacitance coefficient of determination: {:.4f}".format(r_sq)) -print("# Updated layer resistance {}/um capacitance {}/um".format(res_unit, cap_unit)) - -routable_layers = [layer for layer in stack if layer[1]] -for i, layer in enumerate(routable_layers): - res_coeff = res_model.coef_[i] - cap_coeff = cap_model.coef_[i] - if res_coeff != 0.0 or cap_coeff != 0.0: - print( - "set_layer_rc -layer {} -resistance {:.5E} -capacitance {:.5E}".format( - layer[0], res_coeff / res_scale, cap_coeff / cap_scale - ) - ) - -################################################################ - +if args.mode == "net": + # Use linear regression to find updated layer resistances. -def generic_rc_fit(type_sieve): x = [] y = [] for design in data: for net in data[design]: - net_type = data[design][net]["type"] - wire_res = data[design][net]["rcx_res"] - wire_length = data[design][net]["wire_length"] - if net_type in type_sieve and wire_res != 0.0: - x.append([wire_length]) - y.append(wire_res) + rcx_res = data[design][net]["rcx_res"] + if rcx_res > 0: + x.append(data[design][net]["routable_layer_lengths"]) + y.append(rcx_res - data[design][net]["grt_via_res"]) + x = np.array(x) y = np.array(y) - wire_res_model = LinearRegression(fit_intercept=False).fit(x, y) - wire_res = wire_res_model.coef_[0] + + res_model = LinearRegression(fit_intercept=False).fit(x, y) + r_sq = res_model.score(x, y) + print("# Resistance coefficient of determination: {:.4f}".format(r_sq)) + + ################################################################ + + # Use linear regression to find updated layer capacitances. x = [] y = [] for design in data: for net in data[design]: - net_type = data[design][net]["type"] - if net_type in type_sieve: - wire_length = data[design][net]["wire_length"] - wire_cap = data[design][net]["rcx_cap"] - x.append([wire_length]) - y.append(wire_cap) + x.append(data[design][net]["routable_layer_lengths"]) + y.append(data[design][net]["rcx_cap"]) + x = np.array(x) y = np.array(y) - wire_cap_model = LinearRegression(fit_intercept=False).fit(x, y) - wire_cap = wire_cap_model.coef_[0] - return "-resistance {:.5E} -capacitance {:.5E}".format( - wire_res / res_scale, wire_cap / cap_scale + cap_model = LinearRegression(fit_intercept=False).fit(x, y) + r_sq = cap_model.score(x, y) + print("# Capacitance coefficient of determination: {:.4f}".format(r_sq)) + print( + "# Updated layer resistance {}/um capacitance {}/um".format(res_unit, cap_unit) ) + routable_layers = [layer for layer in stack if layer[1]] + for i, layer in enumerate(routable_layers): + res_coeff = res_model.coef_[i] + cap_coeff = cap_model.coef_[i] + if res_coeff != 0.0 or cap_coeff != 0.0: + print( + "set_layer_rc -layer {} -resistance {:.5E} -capacitance {:.5E}".format( + layer[0], res_coeff / res_scale, cap_coeff / cap_scale + ) + ) + + ################################################################ + + def generic_rc_fit(type_sieve): + x = [] + y = [] + for design in data: + for net in data[design]: + net_type = data[design][net]["type"] + wire_res = data[design][net]["rcx_res"] + wire_length = data[design][net]["wire_length"] + if net_type in type_sieve and wire_res != 0.0: + x.append([wire_length]) + y.append(wire_res) + x = np.array(x) + y = np.array(y) + wire_res_model = LinearRegression(fit_intercept=False).fit(x, y) + wire_res = wire_res_model.coef_[0] + + x = [] + y = [] + for design in data: + for net in data[design]: + net_type = data[design][net]["type"] + if net_type in type_sieve: + wire_length = data[design][net]["wire_length"] + wire_cap = data[design][net]["rcx_cap"] + x.append([wire_length]) + y.append(wire_cap) + x = np.array(x) + y = np.array(y) + wire_cap_model = LinearRegression(fit_intercept=False).fit(x, y) + wire_cap = wire_cap_model.coef_[0] + + return "-resistance {:.5E} -capacitance {:.5E}".format( + wire_res / res_scale, wire_cap / cap_scale + ) + + print("# Combined fit:") + print("set_wire_rc " + generic_rc_fit(["signal", "clock"])) -print("# Combined fit:") -print("set_wire_rc " + generic_rc_fit(["signal", "clock"])) + print("# Split signal/clock fit:") + print("set_wire_rc -signal " + generic_rc_fit(["signal"])) + print("set_wire_rc -clock " + generic_rc_fit(["clock"])) + +################################################################ -print("# Split signal/clock fit:") -print("set_wire_rc -signal " + generic_rc_fit(["signal"])) -print("set_wire_rc -clock " + generic_rc_fit(["clock"])) +if args.mode == "segment": + pass From 08af317e47421f4064c7591a23d22956bf8a5f19 Mon Sep 17 00:00:00 2001 From: LucasYuki Date: Wed, 11 Mar 2026 19:34:11 -0300 Subject: [PATCH 074/202] move kepler dependencies from _installCI to _installUbuntuPackages Signed-off-by: LucasYuki --- etc/DependencyInstaller.sh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index ce71b18133..74e4b6ca1e 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -152,19 +152,29 @@ _installUbuntuPackages() { apt-get -y update apt-get -y install --no-install-recommends \ bison \ + capnproto \ + clang \ curl \ flex \ help2man \ + libboost-dev \ + libboost-iostreams-dev \ + libcapnp-dev \ libfl-dev \ + libfmt-dev \ libfl2 \ libgit2-dev \ libgoogle-perftools-dev \ + libgtest-dev \ libqt5multimediawidgets5 \ libqt5opengl5 \ libqt5svg5-dev \ libqt5xmlpatterns5-dev \ + libspdlog-dev \ + libtbb-dev \ libz-dev \ perl \ + pkg-config \ python3-pip \ python3-venv \ qtmultimedia5-dev \ @@ -274,10 +284,7 @@ _installCI() { coreutils \ curl \ python3 \ - software-properties-common \ - clang pkg-config \ - libboost-dev libfl-dev libtbb-dev capnproto libcapnp-dev \ - libgtest-dev libspdlog-dev libfmt-dev libboost-iostreams-dev zlib1g-dev + software-properties-common } _help() { From 9902c4947a0f593534e50809d4e51f899d277785 Mon Sep 17 00:00:00 2001 From: Jorge Ferreira Date: Wed, 11 Mar 2026 23:32:32 +0000 Subject: [PATCH 075/202] Fix MPL-0065 and MPL-0040 in asap7 swerv_wrapper by adjusting core utilization Signed-off-by: Jorge Ferreira --- flow/designs/asap7/swerv_wrapper/config.mk | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/flow/designs/asap7/swerv_wrapper/config.mk b/flow/designs/asap7/swerv_wrapper/config.mk index f31f62ed37..d65359e24f 100644 --- a/flow/designs/asap7/swerv_wrapper/config.mk +++ b/flow/designs/asap7/swerv_wrapper/config.mk @@ -52,12 +52,9 @@ export ADDITIONAL_LEFS = $(sort $(wildcard $(DESIGN_HOME)/$(PLATFORM)/swerv_wrap export ADDITIONAL_LIBS = $(sort $(wildcard $(DESIGN_HOME)/$(PLATFORM)/swerv_wrapper/lib/*.lib)) export CORE_UTILIZATION = 30 -# export DIE_AREA = 0 0 350 400 -# export CORE_AREA = 5 5 345 395 export IO_CONSTRAINTS = $(DESIGN_HOME)/$(PLATFORM)/swerv_wrapper/io.tcl -# export PLACE_DENSITY_LB_ADDON = 0.20 -export PLACE_DENSITY = 0.70 +export PLACE_DENSITY_LB_ADDON = 0.30 export ROUTING_LAYER_ADJUSTMENT = 0.2 From 7fded1a07f39ee9c34e776459d443933ae9224b1 Mon Sep 17 00:00:00 2001 From: Jorge Ferreira Date: Wed, 11 Mar 2026 23:51:13 +0000 Subject: [PATCH 076/202] Update asap7 swerv_wrapper config.mk and constraint.sdc Signed-off-by: Jorge Ferreira --- flow/designs/asap7/swerv_wrapper/config.mk | 2 +- flow/designs/asap7/swerv_wrapper/constraint.sdc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/designs/asap7/swerv_wrapper/config.mk b/flow/designs/asap7/swerv_wrapper/config.mk index d65359e24f..b93dbad2d5 100644 --- a/flow/designs/asap7/swerv_wrapper/config.mk +++ b/flow/designs/asap7/swerv_wrapper/config.mk @@ -54,7 +54,7 @@ export ADDITIONAL_LIBS = $(sort $(wildcard $(DESIGN_HOME)/$(PLATFORM)/swerv_wrap export CORE_UTILIZATION = 30 export IO_CONSTRAINTS = $(DESIGN_HOME)/$(PLATFORM)/swerv_wrapper/io.tcl -export PLACE_DENSITY_LB_ADDON = 0.30 +export PLACE_DENSITY_LB_ADDON = 0.20 export ROUTING_LAYER_ADJUSTMENT = 0.2 diff --git a/flow/designs/asap7/swerv_wrapper/constraint.sdc b/flow/designs/asap7/swerv_wrapper/constraint.sdc index d01f656a06..99e95e8e24 100644 --- a/flow/designs/asap7/swerv_wrapper/constraint.sdc +++ b/flow/designs/asap7/swerv_wrapper/constraint.sdc @@ -2,7 +2,7 @@ current_design swerv_wrapper set clk_name core_clock set clk_port_name clk -set clk_period 1800 +set clk_period 1600 set clk_io_pct 0.2 set clk_port [get_ports $clk_port_name] From c91679f5c7402841ba5d4b482ecdf6cf11082424 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Thu, 12 Mar 2026 10:12:47 +0900 Subject: [PATCH 077/202] Bump kepler-formal (inout port issue fix) Signed-off-by: Jaehyun Kim --- tools/kepler-formal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/kepler-formal b/tools/kepler-formal index 093a7b50e0..e8675f3086 160000 --- a/tools/kepler-formal +++ b/tools/kepler-formal @@ -1 +1 @@ -Subproject commit 093a7b50e0070391233103e1d63c1c49310ecfd6 +Subproject commit e8675f3086926c63205f8f5f586be7c7dccaf788 From eaa6576edf74b92109e40326f27c7519cc485d28 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Thu, 12 Mar 2026 10:13:51 +0900 Subject: [PATCH 078/202] Enable kepler-formal for multiple designs - Previously, KF for those designs were disabled due to KF & OR issues Signed-off-by: Jaehyun Kim --- flow/designs/asap7/ibex/config.mk | 2 -- flow/designs/asap7/jpeg/config.mk | 2 -- flow/designs/asap7/mock-alu/config.mk | 2 -- flow/designs/asap7/swerv_wrapper/config.mk | 2 -- flow/designs/gf12/ariane/config.mk | 2 -- flow/designs/gf12/bp_dual/config.mk | 2 -- flow/designs/gf12/bp_single/config.mk | 2 -- flow/designs/gf12/ca53/config.mk | 2 -- flow/designs/gf12/tinyRocket/config.mk | 2 -- flow/designs/gf180/ibex/config.mk | 2 -- flow/designs/gf180/uart-blocks/config.mk | 2 -- .../ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/config.mk | 2 -- flow/designs/ihp-sg13g2/ibex/config.mk | 2 -- flow/designs/nangate45/bp_be_top/config.mk | 2 -- flow/designs/nangate45/bp_multi_top/config.mk | 2 -- flow/designs/rapidus2hp/cva6/config.mk | 1 - flow/designs/sky130hd/chameleon/config.mk | 2 -- flow/designs/sky130hd/ibex/config.mk | 2 -- flow/designs/sky130hd/microwatt/config.mk | 2 -- 19 files changed, 37 deletions(-) diff --git a/flow/designs/asap7/ibex/config.mk b/flow/designs/asap7/ibex/config.mk index a6a0b94a2e..419c77f8c3 100644 --- a/flow/designs/asap7/ibex/config.mk +++ b/flow/designs/asap7/ibex/config.mk @@ -31,5 +31,3 @@ export TNS_END_PERCENT = 100 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 -export LEC_CHECK = 0 - diff --git a/flow/designs/asap7/jpeg/config.mk b/flow/designs/asap7/jpeg/config.mk index 7a229fa0cf..e7bd41a42f 100644 --- a/flow/designs/asap7/jpeg/config.mk +++ b/flow/designs/asap7/jpeg/config.mk @@ -17,6 +17,4 @@ export TNS_END_PERCENT = 100 export EQUIVALENCE_CHECK ?= 1 export REMOVE_CELLS_FOR_EQY = TAPCELL* -export LEC_CHECK = 0 - diff --git a/flow/designs/asap7/mock-alu/config.mk b/flow/designs/asap7/mock-alu/config.mk index 455da4d370..c8054db41e 100644 --- a/flow/designs/asap7/mock-alu/config.mk +++ b/flow/designs/asap7/mock-alu/config.mk @@ -11,5 +11,3 @@ export ROUTING_LAYER_ADJUSTMENT = 0.45 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 -export LEC_CHECK = 0 - diff --git a/flow/designs/asap7/swerv_wrapper/config.mk b/flow/designs/asap7/swerv_wrapper/config.mk index 7316e10210..bef226b2da 100644 --- a/flow/designs/asap7/swerv_wrapper/config.mk +++ b/flow/designs/asap7/swerv_wrapper/config.mk @@ -62,5 +62,3 @@ export ROUTING_LAYER_ADJUSTMENT = 0.2 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 -export LEC_CHECK = 0 - diff --git a/flow/designs/gf12/ariane/config.mk b/flow/designs/gf12/ariane/config.mk index fe50cb930c..4a8e331a21 100644 --- a/flow/designs/gf12/ariane/config.mk +++ b/flow/designs/gf12/ariane/config.mk @@ -37,5 +37,3 @@ export REMOVE_ABC_BUFFERS = 1 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -export LEC_CHECK = 0 diff --git a/flow/designs/gf12/bp_dual/config.mk b/flow/designs/gf12/bp_dual/config.mk index 013ffea5d2..3f3e20af00 100644 --- a/flow/designs/gf12/bp_dual/config.mk +++ b/flow/designs/gf12/bp_dual/config.mk @@ -66,5 +66,3 @@ export MACRO_WRAPPERS = $(PLATFORM_DIR)/bp/wrappers/wrappers.tcl export PDN_TCL = $(PLATFORM_DIR)/cfg/pdn_grid_strategy_13m_9T.top.tcl export MACRO_PLACE_HALO = 7 7 - -export LEC_CHECK = 0 diff --git a/flow/designs/gf12/bp_single/config.mk b/flow/designs/gf12/bp_single/config.mk index 0455d8ff07..cf55a2e69e 100644 --- a/flow/designs/gf12/bp_single/config.mk +++ b/flow/designs/gf12/bp_single/config.mk @@ -71,5 +71,3 @@ export SETUP_SLACK_MARGIN ?= 100 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -export LEC_CHECK = 0 diff --git a/flow/designs/gf12/ca53/config.mk b/flow/designs/gf12/ca53/config.mk index d86d931093..b788b1fbea 100644 --- a/flow/designs/gf12/ca53/config.mk +++ b/flow/designs/gf12/ca53/config.mk @@ -69,5 +69,3 @@ endif #export SKIP_PIN_SWAP = 1 export SKIP_INCREMENTAL_REPAIR = 1 export TNS_END_PERCENT = 5 - -export LEC_CHECK = 0 diff --git a/flow/designs/gf12/tinyRocket/config.mk b/flow/designs/gf12/tinyRocket/config.mk index ff0e7be0ce..08e3a88942 100644 --- a/flow/designs/gf12/tinyRocket/config.mk +++ b/flow/designs/gf12/tinyRocket/config.mk @@ -41,5 +41,3 @@ endif export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -export LEC_CHECK = 0 diff --git a/flow/designs/gf180/ibex/config.mk b/flow/designs/gf180/ibex/config.mk index d7e80346ae..036ce5145e 100644 --- a/flow/designs/gf180/ibex/config.mk +++ b/flow/designs/gf180/ibex/config.mk @@ -18,5 +18,3 @@ export PLACE_DENSITY_LB_ADDON = 0.1 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 -export LEC_CHECK = 0 - diff --git a/flow/designs/gf180/uart-blocks/config.mk b/flow/designs/gf180/uart-blocks/config.mk index 15f496a5e6..b34c398b32 100644 --- a/flow/designs/gf180/uart-blocks/config.mk +++ b/flow/designs/gf180/uart-blocks/config.mk @@ -23,5 +23,3 @@ export TAPCELL_TCL ?= $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/tapcell.tcl export MACRO_ROWS_HALO_X = 14 export MACRO_ROWS_HALO_Y = 14 -export LEC_CHECK = 0 - diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/config.mk b/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/config.mk index ec737999b9..4af4286850 100644 --- a/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/config.mk +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/config.mk @@ -19,5 +19,3 @@ export CORNERS = slow typ fast export PDN_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(TOP_DESIGN_NICKNAME)/${DESIGN_NAME}/pdn.tcl -export LEC_CHECK = 0 - diff --git a/flow/designs/ihp-sg13g2/ibex/config.mk b/flow/designs/ihp-sg13g2/ibex/config.mk index 94aaf9c727..7f3e9f4fc7 100644 --- a/flow/designs/ihp-sg13g2/ibex/config.mk +++ b/flow/designs/ihp-sg13g2/ibex/config.mk @@ -23,5 +23,3 @@ export CTS_BUF_DISTANCE = 60 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 -export LEC_CHECK = 0 - diff --git a/flow/designs/nangate45/bp_be_top/config.mk b/flow/designs/nangate45/bp_be_top/config.mk index bf2de62487..7f88c0f4c3 100644 --- a/flow/designs/nangate45/bp_be_top/config.mk +++ b/flow/designs/nangate45/bp_be_top/config.mk @@ -30,5 +30,3 @@ export CTS_CLUSTER_DIAMETER = 50 export SYNTH_MINIMUM_KEEP_SIZE = 3000 export FASTROUTE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/fastroute.tcl - -export LEC_CHECK = 0 diff --git a/flow/designs/nangate45/bp_multi_top/config.mk b/flow/designs/nangate45/bp_multi_top/config.mk index f7cb5e4e0f..60edf46ef3 100644 --- a/flow/designs/nangate45/bp_multi_top/config.mk +++ b/flow/designs/nangate45/bp_multi_top/config.mk @@ -36,5 +36,3 @@ export SKIP_GATE_CLONING = 1 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 -export LEC_CHECK = 0 - diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index 7a7bbdebbf..b0d7591607 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -150,4 +150,3 @@ export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 # Until the verilog writer fix is merged -export LEC_CHECK = 0 diff --git a/flow/designs/sky130hd/chameleon/config.mk b/flow/designs/sky130hd/chameleon/config.mk index d02447831b..7bd29564ed 100644 --- a/flow/designs/sky130hd/chameleon/config.mk +++ b/flow/designs/sky130hd/chameleon/config.mk @@ -51,5 +51,3 @@ export FP_PDN_RAIL_WIDTH = 0.48 export FP_PDN_RAIL_OFFSET = 0 export TNS_END_PERCENT = 100 -export LEC_CHECK = 0 - diff --git a/flow/designs/sky130hd/ibex/config.mk b/flow/designs/sky130hd/ibex/config.mk index d2b3429777..028ddd21cd 100644 --- a/flow/designs/sky130hd/ibex/config.mk +++ b/flow/designs/sky130hd/ibex/config.mk @@ -29,5 +29,3 @@ export CTS_CLUSTER_DIAMETER = 50 export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -export LEC_CHECK = 0 diff --git a/flow/designs/sky130hd/microwatt/config.mk b/flow/designs/sky130hd/microwatt/config.mk index 56ba3efb8d..6a2021c3f5 100644 --- a/flow/designs/sky130hd/microwatt/config.mk +++ b/flow/designs/sky130hd/microwatt/config.mk @@ -51,5 +51,3 @@ endif export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -export LEC_CHECK = 0 From 6b81b89abfcb7fc8893378056d659c6ba2131e52 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Thu, 12 Mar 2026 12:10:05 +0900 Subject: [PATCH 079/202] Disable kepler-formal LEC for rapidus2hp cva6 Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/cva6/config.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index b0d7591607..7a7bbdebbf 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -150,3 +150,4 @@ export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 # Until the verilog writer fix is merged +export LEC_CHECK = 0 From 680433bac917c78342ee3fb79056606f523dd798 Mon Sep 17 00:00:00 2001 From: Jorge Ferreira Date: Thu, 12 Mar 2026 01:12:45 +0000 Subject: [PATCH 080/202] fix: allow preserving absolute paths in make issue This adds the PRESERVE_PATHS environment variable. If set, make issue will not replace /workspace and /platforms with relative paths in the generated scripts. This solves the conflict between external users needing relative paths and internal PII teams needing absolute paths. Signed-off-by: Jorge Ferreira --- flow/util/generate-vars.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/flow/util/generate-vars.sh b/flow/util/generate-vars.sh index 299cbe23aa..90e9c13e04 100755 --- a/flow/util/generate-vars.sh +++ b/flow/util/generate-vars.sh @@ -51,9 +51,13 @@ while read -r VAR; do if [[ "${name}" == *"SCRIPTS_DIR"* ]]; then value=$(sed -e "s,${FLOW_ROOT},.,g" <<< "${value}") fi - for path in workspace platforms; do - value=$(sed -e "s,\(^\|[: \"']\)/${path},\1./${path},g" <<< "${value}") - done + + # PII members use PRESERVE_PATHS=1 make issue ... + if [[ ! -v PRESERVE_PATHS ]]; then + for path in workspace platforms; do + value=$(sed -e "s,\(^\|[: \"']\)/${path},\1./${path},g" <<< "${value}") + done + fi value=$(sed -e "s,${FLOW_ROOT},\${FLOW_HOME},g" <<< "${value}") value=$(sed -e "s,${ORFS_ROOT},\${FLOW_HOME}/\.\.,g" <<< "${value}") From 837beb5dc20d36c930df9fe7f695430c2977910c Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Thu, 12 Mar 2026 17:47:38 +0900 Subject: [PATCH 081/202] cva6: drive optional outputs explicitly Signed-off-by: Jaehyun Kim --- .../src/cva6/core/cache_subsystem/cva6_hpdcache_if_adapter.sv | 4 ++++ .../src/cva6/core/cache_subsystem/cva6_hpdcache_wrapper.sv | 3 ++- .../hpdcache/rtl/src/hwpf_stride/hwpf_stride.sv | 3 ++- flow/designs/src/cva6/core/csr_regfile.sv | 2 +- flow/designs/src/cva6/core/cva6_mmu/cva6_mmu.sv | 2 ++ flow/designs/src/cva6/core/cvxif_fu.sv | 1 + flow/designs/src/cva6/core/id_stage.sv | 1 + flow/designs/src/cva6/core/load_store_unit.sv | 3 +++ flow/designs/src/cva6/core/load_unit.sv | 1 + 9 files changed, 17 insertions(+), 3 deletions(-) diff --git a/flow/designs/src/cva6/core/cache_subsystem/cva6_hpdcache_if_adapter.sv b/flow/designs/src/cva6/core/cache_subsystem/cva6_hpdcache_if_adapter.sv index d9e9f23316..5d3144b894 100644 --- a/flow/designs/src/cva6/core/cache_subsystem/cva6_hpdcache_if_adapter.sv +++ b/flow/designs/src/cva6/core/cache_subsystem/cva6_hpdcache_if_adapter.sv @@ -114,6 +114,9 @@ module cva6_hpdcache_if_adapter assign cva6_req_o.data_rdata = hpdcache_rsp_i.rdata; assign cva6_req_o.data_rid = hpdcache_rsp_i.tid; assign cva6_req_o.data_gnt = hpdcache_req_ready_i; + assign cva6_req_o.data_ruser = '0; + assign cva6_amo_resp_o = '0; + assign cva6_dcache_flush_ack_o = 1'b0; // Assertions // {{{ @@ -317,6 +320,7 @@ module cva6_hpdcache_if_adapter assign cva6_req_o.data_rdata = hpdcache_rsp_i.rdata; assign cva6_req_o.data_rid = hpdcache_rsp_i.tid; assign cva6_req_o.data_gnt = hpdcache_req_ready_i; + assign cva6_req_o.data_ruser = '0; assign cva6_amo_resp_o.ack = hpdcache_rsp_valid_i && (hpdcache_rsp_i.tid == '1); assign cva6_amo_resp_o.result = amo_is_word ? {{32{amo_resp_word[31]}}, amo_resp_word} diff --git a/flow/designs/src/cva6/core/cache_subsystem/cva6_hpdcache_wrapper.sv b/flow/designs/src/cva6/core/cache_subsystem/cva6_hpdcache_wrapper.sv index 7727dc703d..424024afbd 100644 --- a/flow/designs/src/cva6/core/cache_subsystem/cva6_hpdcache_wrapper.sv +++ b/flow/designs/src/cva6/core/cache_subsystem/cva6_hpdcache_wrapper.sv @@ -248,7 +248,8 @@ module cva6_hpdcache_wrapper dcache_req[NumPorts] = '0, dcache_req_abort[NumPorts] = 1'b0, dcache_req_tag[NumPorts] = '0, - dcache_req_pma[NumPorts] = '0; + dcache_req_pma[NumPorts] = '0, + dcache_cmo_resp_o = '0; `endif endgenerate diff --git a/flow/designs/src/cva6/core/cache_subsystem/hpdcache/rtl/src/hwpf_stride/hwpf_stride.sv b/flow/designs/src/cva6/core/cache_subsystem/hpdcache/rtl/src/hwpf_stride/hwpf_stride.sv index fd846bd915..40e078a592 100644 --- a/flow/designs/src/cva6/core/cache_subsystem/hpdcache/rtl/src/hwpf_stride/hwpf_stride.sv +++ b/flow/designs/src/cva6/core/cache_subsystem/hpdcache/rtl/src/hwpf_stride/hwpf_stride.sv @@ -147,7 +147,8 @@ import hpdcache_pkg::*; hpdcache_req_o.phys_indexed = 1'b1, hpdcache_req_o.addr_tag = hpdcache_req_tag, hpdcache_req_o.pma.uncacheable = 1'b0, - hpdcache_req_o.pma.io = 1'b0; + hpdcache_req_o.pma.io = 1'b0, + hpdcache_req_o.pma.wr_policy_hint = HPDCACHE_WR_POLICY_AUTO; // }}} // Set state of internal registers diff --git a/flow/designs/src/cva6/core/csr_regfile.sv b/flow/designs/src/cva6/core/csr_regfile.sv index 7bbf529048..321ac78f1f 100644 --- a/flow/designs/src/cva6/core/csr_regfile.sv +++ b/flow/designs/src/cva6/core/csr_regfile.sv @@ -2531,7 +2531,7 @@ module csr_regfile // determine if mprv needs to be considered if in debug mode assign mprv = (CVA6Cfg.DebugEn && debug_mode_q && !dcsr_q.mprven) ? 1'b0 : mstatus_q.mprv; - assign debug_mode_o = debug_mode_q; + assign debug_mode_o = CVA6Cfg.DebugEn ? debug_mode_q : 1'b0; assign single_step_o = CVA6Cfg.DebugEn ? dcsr_q.step : 1'b0; assign mcountinhibit_o = {{29 - MHPMCounterNum{1'b0}}, mcountinhibit_q}; diff --git a/flow/designs/src/cva6/core/cva6_mmu/cva6_mmu.sv b/flow/designs/src/cva6/core/cva6_mmu/cva6_mmu.sv index eebb9b6e46..9f84448b8b 100644 --- a/flow/designs/src/cva6/core/cva6_mmu/cva6_mmu.sv +++ b/flow/designs/src/cva6/core/cva6_mmu/cva6_mmu.sv @@ -528,6 +528,8 @@ module cva6_mmu ((ld_st_priv_lvl_i == riscv::PRIV_LVL_S && (ld_st_v_i ? !vs_sum_i : !sum_i ) && dtlb_pte_q.u) || // SUM is not set and we are trying to access a user page in supervisor mode (ld_st_priv_lvl_i == riscv::PRIV_LVL_U && !dtlb_pte_q.u)); + csr_hs_ld_st_inst_o = 1'b0; + if (CVA6Cfg.RVH) begin lsu_tinst_n = lsu_tinst_i; hs_ld_st_inst_n = hs_ld_st_inst_i; diff --git a/flow/designs/src/cva6/core/cvxif_fu.sv b/flow/designs/src/cva6/core/cvxif_fu.sv index cf6ee15215..515e9c28cc 100644 --- a/flow/designs/src/cva6/core/cvxif_fu.sv +++ b/flow/designs/src/cva6/core/cvxif_fu.sv @@ -64,6 +64,7 @@ module cvxif_fu // Handling of illegal instruction exception always_comb begin + x_exception_o = '0; x_exception_o.valid = x_illegal_i; x_exception_o.cause = x_illegal_i ? riscv::ILLEGAL_INSTR : '0; if (CVA6Cfg.TvalEn) diff --git a/flow/designs/src/cva6/core/id_stage.sv b/flow/designs/src/cva6/core/id_stage.sv index d37554db4f..2f6f312ad2 100644 --- a/flow/designs/src/cva6/core/id_stage.sv +++ b/flow/designs/src/cva6/core/id_stage.sv @@ -229,6 +229,7 @@ module id_stage #( assign is_compressed_zcmt = is_compressed_rvc; assign stall_macro_deco_zcmt = '0; assign jump_address = '0; + assign dcache_req_ports_o = '0; end if (CVA6Cfg.RVZCMT) begin diff --git a/flow/designs/src/cva6/core/load_store_unit.sv b/flow/designs/src/cva6/core/load_store_unit.sv index ccce630112..6279b1d17f 100644 --- a/flow/designs/src/cva6/core/load_store_unit.sv +++ b/flow/designs/src/cva6/core/load_store_unit.sv @@ -349,13 +349,16 @@ module load_store_unit assign dcache_req_ports_o[0].address_index = '0; assign dcache_req_ports_o[0].address_tag = '0; assign dcache_req_ports_o[0].data_wdata = '0; + assign dcache_req_ports_o[0].data_wuser = '0; assign dcache_req_ports_o[0].data_req = 1'b0; assign dcache_req_ports_o[0].data_be = '1; assign dcache_req_ports_o[0].data_size = 2'b11; + assign dcache_req_ports_o[0].data_id = '0; assign dcache_req_ports_o[0].data_we = 1'b0; assign dcache_req_ports_o[0].kill_req = '0; assign dcache_req_ports_o[0].tag_valid = 1'b0; + assign csr_hs_ld_st_inst_o = 1'b0; assign itlb_miss_o = 1'b0; assign dtlb_miss_o = 1'b0; assign dtlb_ppn = lsu_paddr[CVA6Cfg.PLEN-1:12]; diff --git a/flow/designs/src/cva6/core/load_unit.sv b/flow/designs/src/cva6/core/load_unit.sv index 0a66c51062..ef10d231d7 100644 --- a/flow/designs/src/cva6/core/load_unit.sv +++ b/flow/designs/src/cva6/core/load_unit.sv @@ -196,6 +196,7 @@ module load_unit // this is a read-only interface so set the write enable to 0 assign req_port_o.data_we = 1'b0; assign req_port_o.data_wdata = '0; + assign req_port_o.data_wuser = '0; // compose the load buffer write data, control is handled in the FSM assign ldbuf_wdata = { lsu_ctrl_i.trans_id, lsu_ctrl_i.vaddr[CVA6Cfg.XLEN_ALIGN_BYTES-1:0], lsu_ctrl_i.operation From ed998cb70b2b7a4854cd1d9c9faca77ca93d09c9 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Thu, 12 Mar 2026 17:49:15 +0900 Subject: [PATCH 082/202] rapidus2hp/cva6: restore default KF LEC Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/cva6/config.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index 7a7bbdebbf..da52a1ca62 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -148,6 +148,3 @@ export SYNTH_CANONICALIZE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/canoni export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -# Until the verilog writer fix is merged -export LEC_CHECK = 0 From 2cf4e42bd897b2f053fda1faa32c4c6678594b50 Mon Sep 17 00:00:00 2001 From: Daniel Schultz Date: Thu, 12 Mar 2026 10:14:46 +0100 Subject: [PATCH 083/202] flow: designs: ihp-sg13g2: i2c-gpio-expander: Remove add_global_connect from macro There should be no add_global_connect for the padframe in a macro cell. Signed-off-by: Daniel Schultz --- .../ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl | 8 -------- 1 file changed, 8 deletions(-) diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl b/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl index 11a54c43c5..43c4891c2b 100644 --- a/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl @@ -11,14 +11,6 @@ add_global_connection -net {VSS} -inst_pattern {.*} -pin_pattern {VSS!} -ground add_global_connection -net {VDD} -inst_pattern {.*} -pin_pattern {^VDD$} -power add_global_connection -net {VSS} -inst_pattern {.*} -pin_pattern {^VSS$} -ground -# padframe core power pins -add_global_connection -net {VDD} -pin_pattern {^vdd$} -power -add_global_connection -net {VSS} -pin_pattern {^vss$} -ground - -# padframe io power pins -add_global_connection -net {IOVDD} -pin_pattern {^iovdd$} -power -add_global_connection -net {IOVSS} -pin_pattern {^iovss$} -ground - global_connect # core voltage domain From ef92a830d828f49b3f911361e667a17b8a301bdf Mon Sep 17 00:00:00 2001 From: Daniel Schultz Date: Thu, 12 Mar 2026 10:17:35 +0100 Subject: [PATCH 084/202] flow: designs: ihp-sg13g2: i2c-gpio-expander: Move I2cDeviceCtrl macro Move the I2cDeviceCtrl macro slightly to the left for better connection between the macron on M5 and the chip-level TM1 pdn. Signed-off-by: Daniel Schultz --- flow/designs/ihp-sg13g2/i2c-gpio-expander/config.mk | 2 ++ flow/designs/ihp-sg13g2/i2c-gpio-expander/macros.tcl | 1 + 2 files changed, 3 insertions(+) create mode 100644 flow/designs/ihp-sg13g2/i2c-gpio-expander/macros.tcl diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/config.mk b/flow/designs/ihp-sg13g2/i2c-gpio-expander/config.mk index 2e85545f27..70ae7c201e 100644 --- a/flow/designs/ihp-sg13g2/i2c-gpio-expander/config.mk +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/config.mk @@ -40,6 +40,8 @@ sg13g2_IOPadIOVss_inst \ sg13g2_IOPadIOVdd_inst export FOOTPRINT_TCL = $(PLATFORM_DIR)/pad.tcl +export MACRO_PLACEMENT_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/macros.tcl + export PDN_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/pdn.tcl export BLOCKS = I2cDeviceCtrl diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/macros.tcl b/flow/designs/ihp-sg13g2/i2c-gpio-expander/macros.tcl new file mode 100644 index 0000000000..da053f450f --- /dev/null +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/macros.tcl @@ -0,0 +1 @@ +place_macro -macro_name system_expander.i2cCtrl -location {375.54 372} -orientation R0 -exact From fd5f6d77e2bef1b401e20c206868d84f57d728e7 Mon Sep 17 00:00:00 2001 From: Daniel Schultz Date: Thu, 12 Mar 2026 10:19:06 +0100 Subject: [PATCH 085/202] flow: designs: ihp-sg13g2: i2c-gpio-expander: Improve PDN Move the power ground ring from TM1+TM2 to M5+TM1. The connection between the IO ring and PGR will be estabilished with strips on TM2. When the PGR is using TM2, it won't have any connection to the IO cells on the north and south side because the connection strips won't need vias to connect to the PGR. Also increase the power strips width for the chip-level and macro power distribution netweek. Additionally, decrease the pitch and offset. Signed-off-by: Daniel Schultz --- .../ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl | 6 +++--- flow/designs/ihp-sg13g2/i2c-gpio-expander/pdn.tcl | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl b/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl index 43c4891c2b..e6c2311a3a 100644 --- a/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/pdn.tcl @@ -21,10 +21,10 @@ define_pdn_grid -name {grid} -voltage_domains {CORE} -pins {Metal4 Metal5} add_pdn_stripe -grid {grid} -layer {Metal1} -width {0.44} -pitch {7.56} -offset {0} \ -followpins add_pdn_ring -grid {grid} -layers {Metal4 Metal5} -widths {3.0} -spacings {2.0} \ - -core_offsets {4.5} -connect_to_pads -add_pdn_stripe -grid {grid} -layer {Metal4} -width {1.840} -pitch {75.6} -offset {13.6} \ + -core_offsets {4.5} +add_pdn_stripe -grid {grid} -layer {Metal4} -width {2.0} -pitch {40.0} -offset {10.0} \ -extend_to_core_ring -add_pdn_stripe -grid {grid} -layer {Metal5} -width {1.840} -pitch {75.6} -offset {13.6} \ +add_pdn_stripe -grid {grid} -layer {Metal5} -width {2.0} -pitch {40.0} -offset {10.0} \ -extend_to_core_ring add_pdn_connect -grid {grid} -layers {Metal1 Metal4} add_pdn_connect -grid {grid} -layers {Metal4 Metal5} diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/pdn.tcl b/flow/designs/ihp-sg13g2/i2c-gpio-expander/pdn.tcl index 6006bf8471..aa317e8153 100644 --- a/flow/designs/ihp-sg13g2/i2c-gpio-expander/pdn.tcl +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/pdn.tcl @@ -20,13 +20,15 @@ set_voltage_domain -name {CORE} -power {VDD} -ground {VSS} define_pdn_grid -name {grid} -voltage_domains {CORE} -pins {TopMetal1 TopMetal2} add_pdn_stripe -grid {grid} -layer {Metal1} -width {0.44} -pitch {7.56} -offset {0} \ -followpins -extend_to_core_ring -add_pdn_ring -grid {grid} -layers {TopMetal1 TopMetal2} -widths {8.0} -spacings {5.0} \ +add_pdn_ring -grid {grid} -layers {Metal5 TopMetal1} -widths {8.0} -spacings {5.0} \ -core_offsets {4.5} -connect_to_pads -add_pdn_stripe -grid {grid} -layer {TopMetal1} -width {2.200} -pitch {75.6} -offset {13.6} \ +add_pdn_stripe -grid {grid} -layer {TopMetal1} -width {4.0} -pitch {60.0} -offset {10.0} \ -extend_to_core_ring -add_pdn_stripe -grid {grid} -layer {TopMetal2} -width {2.200} -pitch {75.6} -offset {13.6} \ +add_pdn_stripe -grid {grid} -layer {TopMetal2} -width {4.0} -pitch {60.0} -offset {10.0} \ -extend_to_core_ring add_pdn_connect -grid {grid} -layers {Metal1 TopMetal1} +add_pdn_connect -grid {grid} -layers {Metal5 TopMetal1} +add_pdn_connect -grid {grid} -layers {Metal5 TopMetal2} add_pdn_connect -grid {grid} -layers {TopMetal1 TopMetal2} define_pdn_grid \ From 9750e41db530e78b1a3ee4be07f703a6ece89c51 Mon Sep 17 00:00:00 2001 From: Arthur Koucher Date: Thu, 12 Mar 2026 18:37:30 +0000 Subject: [PATCH 086/202] add mode for RC correlation based on segments Signed-off-by: Arthur Koucher --- flow/util/correlateRC.py | 54 +++++++++++++++- flow/util/utils.mk | 6 ++ flow/util/write_segment_rc.tcl | 88 +++++++++++++++++++++++++++ flow/util/write_segment_rc_script.tcl | 10 +++ 4 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 flow/util/write_segment_rc.tcl create mode 100644 flow/util/write_segment_rc_script.tcl diff --git a/flow/util/correlateRC.py b/flow/util/correlateRC.py index bced14e168..1800961f62 100755 --- a/flow/util/correlateRC.py +++ b/flow/util/correlateRC.py @@ -94,6 +94,13 @@ def makeDict(): stack = [] stack_line = None +# For segment mode. +layer_segments = defaultdict( + lambda: {"lengths": [], "resistances": [], "capacitances": []} +) +routing_layers = [] +routing_layers_line = None + # indices of relevant layers (routable layers or via layers) active_layers = set() @@ -104,6 +111,17 @@ def makeDict(): with open(rc_file) as f: nonGrtNets = 0 for line in f: + if line.startswith("# routing layers: "): + if routing_layers_line is not None and routing_layers_line != line: + print(f"layer stack inconsistent", file=stderr) + exit(1) + elif routing_layers_line is None: + routing_layers = ( + line.removeprefix("# routing layers: ").strip().split(" ") + ) + routing_layers_line = line + continue + if line.startswith("# stack: "): if stack_line is not None and stack_line != line: print(f"layer stack inconsistent", file=stderr) @@ -129,7 +147,9 @@ def makeDict(): tokens = line.strip().split(",") if args.mode == "segment": - pass + layer_segments[tokens[2]]["lengths"].append(float(tokens[3])) + layer_segments[tokens[2]]["resistances"].append(float(tokens[4])) + layer_segments[tokens[2]]["capacitances"].append(float(tokens[5])) else: netName = tokens[0] @@ -350,4 +370,34 @@ def generic_rc_fit(type_sieve): ################################################################ if args.mode == "segment": - pass + print( + "# Updated layer resistance {}/um capacitance {}/um".format(res_unit, cap_unit) + ) + + for layer_name in routing_layers: + # There may be routing layers with no segments, so we check if the + # layer exists in the dict. + if layer_name not in layer_segments: + continue + + # sklearn requires the input to be 2D, so we reshape to add a dimension + # to the list. + lengths = np.array(layer_segments[layer_name]["lengths"]).reshape(-1, 1) + resistances = np.array(layer_segments[layer_name]["resistances"]) + capacitances_ff = np.array(layer_segments[layer_name]["capacitances"]) + + res_model = LinearRegression(fit_intercept=False).fit(lengths, resistances) + cap_model = LinearRegression(fit_intercept=False).fit(lengths, capacitances_ff) + + r_sq = res_model.score(lengths, resistances) + print("# Resistance coefficient of determination: {:.4f}".format(r_sq)) + r_sq = cap_model.score(lengths, capacitances_ff) + print("# Capacitance coefficient of determination: {:.4f}".format(r_sq)) + + print( + "set_layer_rc -layer {} -resistance {:.5E} -capacitance {:.5E}".format( + layer_name, + res_model.coef_[0] / res_scale, + cap_model.coef_[0] * 1e-15 / cap_scale, + ) + ) diff --git a/flow/util/utils.mk b/flow/util/utils.mk index f9f998aaff..3924f57b4e 100644 --- a/flow/util/utils.mk +++ b/flow/util/utils.mk @@ -91,6 +91,12 @@ write_net_rc: $(RESULTS_DIR)/6_net_rc.csv $(RESULTS_DIR)/6_net_rc.csv: ($(TIME_CMD) $(OPENROAD_CMD) $(UTILS_DIR)/write_net_rc_script.tcl) 2>&1 | tee $(LOG_DIR)/6_write_net_rc.log +.PHONY: write_segment_rc +write_segment_rc: $(RESULTS_DIR)/6_segment_rc.csv + +$(RESULTS_DIR)/6_segment_rc.csv: + ($(TIME_CMD) $(OPENROAD_CMD) $(UTILS_DIR)/write_segment_rc_script.tcl) 2>&1 | tee $(LOG_DIR)/6_write_segment_rc.log + .PHONY: correlate_rc correlate_rc: $(RESULTS_DIR)/6_net_rc.csv $(PYTHON_EXE) $(UTILS_DIR)/correlateRC.py $(RESULTS_DIR)/6_net_rc.csv diff --git a/flow/util/write_segment_rc.tcl b/flow/util/write_segment_rc.tcl new file mode 100644 index 0000000000..90662e41a5 --- /dev/null +++ b/flow/util/write_segment_rc.tcl @@ -0,0 +1,88 @@ +# This function only works if each routing wire shape corresponds +# to one parasitic resistive model. +proc fetch_segments_rc { net_to_segments_var } { + upvar 1 $net_to_segments_var net_to_segments + + foreach sta_net [get_nets *] { + set db_net [sta::sta_to_db_net $sta_net] + set type [$db_net getSigType] + + if { !([string equal $type "CLOCK"] || [string equal $type "SIGNAL"]) } { + continue + } + + set wire [$db_net getWire] + + if { $wire eq "NULL" } { + continue + } + + set segments {} + set seen_shape_ids {} + foreach rseg [$db_net getRSegs] { + set shape [$wire getShape [$rseg getShapeId]] + + # We skip vias as they have no capacitance in RCX. + if { ![$shape isSegment] } { + continue + } + + set shape_id [$rseg getShapeId] + + if { $shape_id in $seen_shape_ids } { + error "Could not fetch segment parasitics data: shape\ + $shape_id on net [$db_net getName] has multiple rsegs." + } + + set layer [[$shape getTechLayer] getName] + + set width [$shape getDX] + set height [$shape getDY] + set length_um [ord::dbu_to_microns [expr { max($width, $height) }]] + + set resistance [$rseg getResistance 0] + set capacitance [$rseg getCapacitance 0] + + lappend segments $layer $length_um $resistance $capacitance + lappend seen_shape_ids $shape_id + } + + set net_to_segments([get_full_name $sta_net]) $segments + } +} + +proc write_segment_rc_csv { filename net_to_segments_var } { + upvar 1 $net_to_segments_var net_to_segments + + set stream [open $filename "w"] + + # First, write a header listing the routing layers in stack order. + puts -nonewline $stream "# routing layers:" + foreach layer [[ord::get_db_tech] getLayers] { + if { [$layer getRoutingLevel] != 0 } { + puts -nonewline $stream " [$layer getName]" + } + } + + puts $stream "" + + # Then, write the parasitics data of each wire segment. + foreach sta_net [get_nets *] { + set net_name [get_full_name $sta_net] + + if { ![info exists net_to_segments($net_name)] } { + continue + } + + set db_net [sta::sta_to_db_net $sta_net] + set type [$db_net getSigType] + set net_type [expr { $type eq "CLOCK" ? "clock" : "signal" }] + + foreach {layer length_um resistance capacitance} $net_to_segments($net_name) { + puts $stream [format "%s,%s,%s,%.3e,%.3e,%.3e" \ + $net_name $net_type $layer $length_um $resistance $capacitance] + } + } + + close $stream +} diff --git a/flow/util/write_segment_rc_script.tcl b/flow/util/write_segment_rc_script.tcl new file mode 100644 index 0000000000..7953deceb9 --- /dev/null +++ b/flow/util/write_segment_rc_script.tcl @@ -0,0 +1,10 @@ +source $::env(SCRIPTS_DIR)/load.tcl +load_design 6_final.odb 6_final.sdc + +source $::env(UTILS_DIR)/write_segment_rc.tcl + +# Set up RCX parameters to avoid any parasitics segment merging. +extract_parasitics -ext_model_file $::env(RCX_RULES) -max_res 0 -no_merge_via_res +fetch_segments_rc rcx + +write_segment_rc_csv $::env(RESULTS_DIR)/6_segment_rc.csv rcx From 6a411327feb72be862a76ce06372eb27eabdda87 Mon Sep 17 00:00:00 2001 From: Jeff Ng Date: Thu, 12 Mar 2026 20:08:18 +0000 Subject: [PATCH 087/202] added config files for new AutoTuner Signed-off-by: Jeff Ng --- flow/designs/asap7/gcd/asap7_gcd_sweep.yaml | 18 ++++++ flow/designs/asap7/gcd/asap7_gcd_tune.yaml | 13 +++++ flow/designs/asap7/gcd/autotuner_new.json | 46 +++++++++++++++ flow/designs/asap7/ibex/asap7_ibex_sweep.yaml | 19 ++++++ flow/designs/asap7/ibex/asap7_ibex_tune.yaml | 12 ++++ flow/designs/asap7/ibex/autotuner_new.json | 58 +++++++++++++++++++ 6 files changed, 166 insertions(+) create mode 100644 flow/designs/asap7/gcd/asap7_gcd_sweep.yaml create mode 100644 flow/designs/asap7/gcd/asap7_gcd_tune.yaml create mode 100644 flow/designs/asap7/gcd/autotuner_new.json create mode 100644 flow/designs/asap7/ibex/asap7_ibex_sweep.yaml create mode 100644 flow/designs/asap7/ibex/asap7_ibex_tune.yaml create mode 100644 flow/designs/asap7/ibex/autotuner_new.json diff --git a/flow/designs/asap7/gcd/asap7_gcd_sweep.yaml b/flow/designs/asap7/gcd/asap7_gcd_sweep.yaml new file mode 100644 index 0000000000..8ee0d4c056 --- /dev/null +++ b/flow/designs/asap7/gcd/asap7_gcd_sweep.yaml @@ -0,0 +1,18 @@ +run_config: + design: gcd + experiment: freq + flow_home: /OpenROAD-flow-scripts/flow + jobs: 3 + mode: sweep + platform: asap7 + ray_outputs_dir: /work + orfs_outputs_dir: /work +search_space: + _SDC_FILE_PATH: + type: constant + value: /OpenROAD-flow-scripts/flow/designs/asap7/gcd/constraint.sdc + _SDC_CLK_PERIOD: + type: range_int + min: 200 + max: 500 + step: 50 diff --git a/flow/designs/asap7/gcd/asap7_gcd_tune.yaml b/flow/designs/asap7/gcd/asap7_gcd_tune.yaml new file mode 100644 index 0000000000..cc0af0eff3 --- /dev/null +++ b/flow/designs/asap7/gcd/asap7_gcd_tune.yaml @@ -0,0 +1,13 @@ +run_config: + design: gcd + experiment: basic + flow_home: /OpenROAD-flow-scripts/flow + jobs: 3 + mode: tune + platform: asap7 + ray_outputs_dir: /work + orfs_outputs_dir: /work + samples: 10 + timeout: 1.0 +search_space: + file: autotuner_new.json diff --git a/flow/designs/asap7/gcd/autotuner_new.json b/flow/designs/asap7/gcd/autotuner_new.json new file mode 100644 index 0000000000..25df4e73e4 --- /dev/null +++ b/flow/designs/asap7/gcd/autotuner_new.json @@ -0,0 +1,46 @@ +{ + "_SDC_FILE_PATH": "constraint.sdc", + "_SDC_CLK_PERIOD": { + "type": "range_float", + "min": 200, + "max": 500, + "step": 0 + }, + "CELL_PAD_IN_SITES_GLOBAL_PLACEMENT": { + "type": "range_int", + "min": 0, + "max": 3, + "step": 1 + }, + "CELL_PAD_IN_SITES_DETAIL_PLACEMENT": { + "type": "range_int", + "min": 0, + "max": 3, + "step": 1 + }, + "_FR_LAYER_ADJUST": { + "type": "range_float", + "min": 0.1, + "max": 0.3, + "step": 0 + }, + "PLACE_DENSITY_LB_ADDON": { + "type": "range_float", + "min": 0.0, + "max": 0.2, + "step": 0 + }, + "CTS_CLUSTER_SIZE": { + "type": "range_int", + "min": 10, + "max": 200, + "step": 1 + }, + "CTS_CLUSTER_DIAMETER": { + "type": "range_int", + "min": 20, + "max": 400, + "step": 1 + }, + "_FR_FILE_PATH": "fastroute.tcl" +} \ No newline at end of file diff --git a/flow/designs/asap7/ibex/asap7_ibex_sweep.yaml b/flow/designs/asap7/ibex/asap7_ibex_sweep.yaml new file mode 100644 index 0000000000..05108af5e5 --- /dev/null +++ b/flow/designs/asap7/ibex/asap7_ibex_sweep.yaml @@ -0,0 +1,19 @@ +run_config: + design: ibex + experiment: freq + flow_home: /OpenROAD-flow-scripts/flow + jobs: 2 + mode: sweep + platform: asap7 + ray_outputs_dir: /work + orfs_outputs_dir: /work +search_space: + _SDC_FILE_PATH: + type: constant + value: /OpenROAD-flow-scripts/flow/designs/asap7/ibex/constraint.sdc + _SDC_CLK_PERIOD: + type: range_int + min: 950 + max: 1050 + step: 10 + diff --git a/flow/designs/asap7/ibex/asap7_ibex_tune.yaml b/flow/designs/asap7/ibex/asap7_ibex_tune.yaml new file mode 100644 index 0000000000..08b28e53f9 --- /dev/null +++ b/flow/designs/asap7/ibex/asap7_ibex_tune.yaml @@ -0,0 +1,12 @@ +run_config: + design: ibex + experiment: basic + flow_home: /OpenROAD-flow-scripts/flow + jobs: 2 + mode: tune + samples: 5 + platform: asap7 + ray_outputs_dir: /work + orfs_outputs_dir: /work +search_space: + file: /work/configs/asap7/ibex/autotuner_new.json diff --git a/flow/designs/asap7/ibex/autotuner_new.json b/flow/designs/asap7/ibex/autotuner_new.json new file mode 100644 index 0000000000..1921e7598b --- /dev/null +++ b/flow/designs/asap7/ibex/autotuner_new.json @@ -0,0 +1,58 @@ +{ + "_SDC_FILE_PATH": "designs/asap7/ibex/constraint.sdc", + "_SDC_CLK_PERIOD": { + "type": "range_int", + "step": 0, + "min": 1200, + "max": 2000 + }, + "CORE_UTILIZATION": { + "type": "range_int", + "step": 1, + "min": 5, + "max": 10 + }, + "CORE_ASPECT_RATIO": { + "type": "range_float", + "step": 0, + "min": 0.9, + "max": 1.1 + }, + "CELL_PAD_IN_SITES_GLOBAL_PLACEMENT": { + "type": "range_int", + "step": 1, + "min": 0, + "max": 3 + }, + "CELL_PAD_IN_SITES_DETAIL_PLACEMENT": { + "type": "range_int", + "step": 1, + "min": 0, + "max": 3 + }, + "_FR_LAYER_ADJUST": { + "type": "range_float", + "step": 0, + "min": 0.0, + "max": 0.1 + }, + "PLACE_DENSITY_LB_ADDON": { + "type": "range_float", + "step": 0, + "min": 0.0, + "max": 0.2 + }, + "CTS_CLUSTER_SIZE": { + "type": "range_int", + "step": 1, + "min": 10, + "max": 200 + }, + "CTS_CLUSTER_DIAMETER": { + "type": "range_int", + "step": 1, + "min": 20, + "max": 400 + }, + "_FR_FILE_PATH": "" +} From 0cbdcc9d8a76adaadeb8c65a4ed24b5d33d3084f Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Thu, 12 Mar 2026 20:49:41 -0300 Subject: [PATCH 088/202] use latest openroad Signed-off-by: Eder Monteiro --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index fe1aa0f9d0..50656bf4f3 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit fe1aa0f9d0254fac87b82c886c04ee1544e46885 +Subproject commit 50656bf4f34837257ea655f80124a82d9bd79ad3 From d2ec13515c03515714dd2e4ff4ce876773f99098 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Thu, 12 Mar 2026 20:50:54 -0300 Subject: [PATCH 089/202] call eliminate_dead_logic before init_floorplan Signed-off-by: Eder Monteiro --- flow/scripts/floorplan.tcl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flow/scripts/floorplan.tcl b/flow/scripts/floorplan.tcl index 7db820e760..3cb381904c 100644 --- a/flow/scripts/floorplan.tcl +++ b/flow/scripts/floorplan.tcl @@ -32,6 +32,10 @@ proc report_unused_masters { } { report_unused_masters +# Eliminate dead logic +eliminate_dead_logic + + #Run check_setup puts "\n==========================================================================" puts "Floorplan check_setup" From 5467434675b40535f65deef20a0d2a77e9a8cf65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Fri, 13 Mar 2026 08:43:07 +0100 Subject: [PATCH 090/202] retire deltaDebug.py references, replace with whittle.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: test_delta_debug.sh must also be pruned from Jenkins test files if referenced there. No such references were found currently. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Øyvind Harboe --- docs/user/FlowVariables.md | 2 +- flow/scripts/variables.yaml | 4 ++-- flow/test/test_delta_debug.sh | 27 --------------------------- flow/test/test_outoftree.sh | 2 +- 4 files changed, 4 insertions(+), 31 deletions(-) delete mode 100755 flow/test/test_delta_debug.sh diff --git a/docs/user/FlowVariables.md b/docs/user/FlowVariables.md index e90aee5375..10042720e1 100644 --- a/docs/user/FlowVariables.md +++ b/docs/user/FlowVariables.md @@ -234,7 +234,7 @@ configuration file. | REMOVE_CELLS_FOR_LEC| String patterns directly passed to write_verilog -remove_cells <> for lec checks.| | | REPAIR_PDN_VIA_LAYER| Remove power grid vias which generate DRC violations after detailed routing.| | | REPORT_CLOCK_SKEW| Report clock skew as part of reporting metrics, starting at CTS, before which there is no clock skew. This metric can be quite time-consuming, so it can be useful to disable.| 1| -| ROUTING_LAYER_ADJUSTMENT| Adjusts routing layer capacities to manage congestion and improve detailed routing. High values ease detailed routing but risk excessive detours and long global routing times, while low values reduce global routing failure but can complicate detailed routing. The global routing running time normally reduces dramatically (entirely design specific, but going from hours to minutes has been observed) when the value is low (such as 0.10). Sometimes, global routing will succeed with lower values and fail with higher values. Exploring results with different values can help shed light on the problem. Start with a too low value, such as 0.10, and bisect to value that works by doing multiple global routing runs. As a last resort, `make global_route_issue` and using the tools/OpenROAD/etc/deltaDebug.py can be useful to debug global routing errors. If there is something specific that is impossible to route, such as a clock line over a macro, global routing will terminate with DRC errors routes that could have been routed were it not for the specific impossible routes. deltaDebug.py should weed out the possible routes and leave a minimal failing case that pinpoints the problem.| 0.5| +| ROUTING_LAYER_ADJUSTMENT| Adjusts routing layer capacities to manage congestion and improve detailed routing. High values ease detailed routing but risk excessive detours and long global routing times, while low values reduce global routing failure but can complicate detailed routing. The global routing running time normally reduces dramatically (entirely design specific, but going from hours to minutes has been observed) when the value is low (such as 0.10). Sometimes, global routing will succeed with lower values and fail with higher values. Exploring results with different values can help shed light on the problem. Start with a too low value, such as 0.10, and bisect to value that works by doing multiple global routing runs. As a last resort, `make global_route_issue` and using the tools/OpenROAD/etc/whittle.py can be useful to debug global routing errors. If there is something specific that is impossible to route, such as a clock line over a macro, global routing will terminate with DRC errors routes that could have been routed were it not for the specific impossible routes. whittle.py should weed out the possible routes and leave a minimal failing case that pinpoints the problem.| 0.5| | RTLMP_AREA_WT| Weight for the area of the current floorplan.| 0.1| | RTLMP_ARGS| Overrides all other RTL macro placer arguments.| | | RTLMP_BOUNDARY_WT| Weight for the boundary or how far the hard macro clusters are from boundaries.| 50.0| diff --git a/flow/scripts/variables.yaml b/flow/scripts/variables.yaml index d2018d5baf..f9943223de 100644 --- a/flow/scripts/variables.yaml +++ b/flow/scripts/variables.yaml @@ -52,12 +52,12 @@ ROUTING_LAYER_ADJUSTMENT: a too low value, such as 0.10, and bisect to value that works by doing multiple global routing runs. As a last resort, `make global_route_issue` and using - the tools/OpenROAD/etc/deltaDebug.py can be useful to debug + the tools/OpenROAD/etc/whittle.py can be useful to debug global routing errors. If there is something specific that is impossible to route, such as a clock line over a macro, global routing will terminate with DRC errors routes that could have been routed were it not for the specific impossible routes. - deltaDebug.py should weed out the possible routes and leave + whittle.py should weed out the possible routes and leave a minimal failing case that pinpoints the problem. stages: - floorplan diff --git a/flow/test/test_delta_debug.sh b/flow/test/test_delta_debug.sh deleted file mode 100755 index 59180cf8b8..0000000000 --- a/flow/test/test_delta_debug.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash -# -# deltaDebug.py integration smoke-test, run from ORFS/flow folder. -# -# Exit with error if anything is amiss, including evaluation of -# variable names such as $(false), unused variables, etc. -set -ue -o pipefail - -cd "$(dirname "$0")/.." -. ../env.sh - -echo "Test deltaDebug.py with a make invocation" -make DESIGN_CONFIG=designs/asap7/gcd/config.mk clean_all floorplan -openroad -exit -python ../tools/OpenROAD/etc/deltaDebug.py --persistence 2 --use_stdout --error_string " 100 | " --base_db_path results/asap7/gcd/base/2_floorplan.odb --step "make DESIGN_CONFIG=designs/asap7/gcd/config.mk do-3_1_place_gp_skip_io" - -echo "Test deltaDebug.py with a make issue" -testname=uart -make DESIGN_CONFIG=designs/asap7/$testname/config.mk place -make DESIGN_CONFIG=designs/asap7/$testname/config.mk global_place_issue -latest_file=$(ls -t global_place_${testname}_asap7_base*.tar.gz | head -n1) -echo "Testing $latest_file" -rm -rf results/delta-debug/ -mkdir -p results/delta-debug/ -cd results/delta-debug/ -tar --strip-components=1 -xzf ../../$latest_file -sed -i 's/openroad -no_init/openroad -exit -no_init/g' run-me-$testname-asap7-base.sh -openroad -exit -python ../../../tools/OpenROAD/etc/deltaDebug.py --persistence 3 --use_stdout --error_string " 100 | " --base_db_path results/asap7/$testname/base/3_2_place_iop.odb --step ./run-me-$testname-asap7-base.sh --multiplier 2 diff --git a/flow/test/test_outoftree.sh b/flow/test/test_outoftree.sh index 5474b3012b..884873470f 100755 --- a/flow/test/test_outoftree.sh +++ b/flow/test/test_outoftree.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# deltaDebug.py integration smoke-test, run from ORFS/flow folder. +# Out of tree integration smoke-test, run from ORFS/flow folder. # # Exit with error if anything is amiss, including evaluation of # variable names such as $(false), unused variables, etc. From 53321614bce2a9e9ef54e2a63f547f185f206dd5 Mon Sep 17 00:00:00 2001 From: Jeff Ng Date: Fri, 13 Mar 2026 13:29:37 +0000 Subject: [PATCH 091/202] fixed paths to search space file Signed-off-by: Jeff Ng --- flow/designs/asap7/gcd/asap7_gcd_tune.yaml | 2 +- flow/designs/asap7/ibex/asap7_ibex_tune.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/designs/asap7/gcd/asap7_gcd_tune.yaml b/flow/designs/asap7/gcd/asap7_gcd_tune.yaml index cc0af0eff3..a1cd1786e3 100644 --- a/flow/designs/asap7/gcd/asap7_gcd_tune.yaml +++ b/flow/designs/asap7/gcd/asap7_gcd_tune.yaml @@ -10,4 +10,4 @@ run_config: samples: 10 timeout: 1.0 search_space: - file: autotuner_new.json + file: designs/gcd/autotuner_new.json diff --git a/flow/designs/asap7/ibex/asap7_ibex_tune.yaml b/flow/designs/asap7/ibex/asap7_ibex_tune.yaml index 08b28e53f9..104dc32385 100644 --- a/flow/designs/asap7/ibex/asap7_ibex_tune.yaml +++ b/flow/designs/asap7/ibex/asap7_ibex_tune.yaml @@ -9,4 +9,4 @@ run_config: ray_outputs_dir: /work orfs_outputs_dir: /work search_space: - file: /work/configs/asap7/ibex/autotuner_new.json + file: designs/asap7/ibex/autotuner_new.json From e2c6c7d7d503b3b03153dac635144d86b3d9d3fa Mon Sep 17 00:00:00 2001 From: LucasYuki Date: Fri, 13 Mar 2026 15:11:07 -0300 Subject: [PATCH 092/202] remove redudant dependencies Signed-off-by: LucasYuki --- etc/DependencyInstaller.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index 74e4b6ca1e..3a80d3764f 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -153,15 +153,12 @@ _installUbuntuPackages() { apt-get -y install --no-install-recommends \ bison \ capnproto \ - clang \ curl \ flex \ help2man \ - libboost-dev \ libboost-iostreams-dev \ libcapnp-dev \ libfl-dev \ - libfmt-dev \ libfl2 \ libgit2-dev \ libgoogle-perftools-dev \ @@ -170,7 +167,6 @@ _installUbuntuPackages() { libqt5opengl5 \ libqt5svg5-dev \ libqt5xmlpatterns5-dev \ - libspdlog-dev \ libtbb-dev \ libz-dev \ perl \ From bd061f6ea05c8b178cfefe8ab8876c98a93ff7cc Mon Sep 17 00:00:00 2001 From: Jeff Ng Date: Fri, 13 Mar 2026 23:42:01 +0000 Subject: [PATCH 093/202] Added UNSET_ABC9_BOX_CELLS to unset yosys abc9_box attribute lint fix newline fix Signed-off-by: Jeff Ng --- docs/user/FlowVariables.md | 2 ++ flow/scripts/synth_stdcells.tcl | 3 +++ flow/scripts/variables.yaml | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/docs/user/FlowVariables.md b/docs/user/FlowVariables.md index e90aee5375..9692ab4f36 100644 --- a/docs/user/FlowVariables.md +++ b/docs/user/FlowVariables.md @@ -305,6 +305,7 @@ configuration file. | TIELO_CELL_AND_PORT| Tie low cells used in Yosys synthesis to replace a logical 0 in the Netlist.| | | TIE_SEPARATION| Distance separating tie high/low instances from the load.| 0| | TNS_END_PERCENT| Default TNS_END_PERCENT value for post CTS timing repair. Try fixing all violating endpoints by default (reduce to 5% for runtime). Specifies how many percent of violating paths to fix [0-100]. Worst path will always be fixed.| 100| +| UNSET_ABC9_BOX_CELLS| List of cells to unset the abc9_box attribute on| | | USE_FILL| Whether to perform metal density filling.| 0| | VERILOG_DEFINES| Preprocessor defines passed to the language frontend. Example: `-D HPDCACHE_ASSERT_OFF`| | | VERILOG_FILES| The path to the design Verilog/SystemVerilog files providing a description of modules.| | @@ -349,6 +350,7 @@ configuration file. - [SYNTH_WRAPPED_MULTIPLIERS](#SYNTH_WRAPPED_MULTIPLIERS) - [TIEHI_CELL_AND_PORT](#TIEHI_CELL_AND_PORT) - [TIELO_CELL_AND_PORT](#TIELO_CELL_AND_PORT) +- [UNSET_ABC9_BOX_CELLS](#UNSET_ABC9_BOX_CELLS) - [VERILOG_DEFINES](#VERILOG_DEFINES) - [VERILOG_FILES](#VERILOG_FILES) - [VERILOG_INCLUDE_DIRS](#VERILOG_INCLUDE_DIRS) diff --git a/flow/scripts/synth_stdcells.tcl b/flow/scripts/synth_stdcells.tcl index 1cd5d5c06f..5fb2039171 100644 --- a/flow/scripts/synth_stdcells.tcl +++ b/flow/scripts/synth_stdcells.tcl @@ -2,3 +2,6 @@ read_liberty -overwrite -setattr liberty_cell -lib {*}$::env(LIB_FILES) read_liberty -overwrite -setattr liberty_cell \ -unit_delay -wb -ignore_miss_func -ignore_buses {*}$::env(LIB_FILES) +if { [info exists ::env(UNSET_ABC9_BOX_CELLS)] } { + setattr -mod -unset abc9_box {*}$::env(UNSET_ABC9_BOX_CELLS) +} diff --git a/flow/scripts/variables.yaml b/flow/scripts/variables.yaml index d2018d5baf..3cd4193ae6 100644 --- a/flow/scripts/variables.yaml +++ b/flow/scripts/variables.yaml @@ -354,6 +354,11 @@ TIE_SEPARATION: stages: - floorplan default: 0 +UNSET_ABC9_BOX_CELLS: + description: | + List of cells to unset the abc9_box attribute on + stages: + - synth EARLY_SIZING_CAP_RATIO: description: | Ratio between the input pin capacitance and the output pin load during initial gate sizing. From 9a3affafe2368be2448beb4251d55d420c90f0b2 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sun, 15 Mar 2026 00:36:00 +0000 Subject: [PATCH 094/202] update sta submodule Signed-off-by: Matt Liberty --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index fe1aa0f9d0..7cf7b720fd 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit fe1aa0f9d0254fac87b82c886c04ee1544e46885 +Subproject commit 7cf7b720fd035cd3d114cfb152ecac2ccd7e379f From a21d65e4d3618194abe92d0e0620a93b3bf09360 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sun, 15 Mar 2026 00:41:09 +0000 Subject: [PATCH 095/202] Lower routint derate to get passing: sky130hd/jpeg & sky130hs/riscv32i Signed-off-by: Matt Liberty --- flow/designs/sky130hd/jpeg/fastroute.tcl | 2 +- flow/designs/sky130hs/riscv32i/fastroute.tcl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/designs/sky130hd/jpeg/fastroute.tcl b/flow/designs/sky130hd/jpeg/fastroute.tcl index e795f5e820..76f9321967 100644 --- a/flow/designs/sky130hd/jpeg/fastroute.tcl +++ b/flow/designs/sky130hd/jpeg/fastroute.tcl @@ -1,4 +1,4 @@ -set_global_routing_layer_adjustment $::env(MIN_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) 0.3 +set_global_routing_layer_adjustment $::env(MIN_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) 0.2 set_routing_layers -clock $::env(MIN_CLK_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) set_routing_layers -signal $::env(MIN_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) diff --git a/flow/designs/sky130hs/riscv32i/fastroute.tcl b/flow/designs/sky130hs/riscv32i/fastroute.tcl index 8b8e48cc4b..d125e6f179 100644 --- a/flow/designs/sky130hs/riscv32i/fastroute.tcl +++ b/flow/designs/sky130hs/riscv32i/fastroute.tcl @@ -1,3 +1,3 @@ -set_global_routing_layer_adjustment $::env(MIN_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) 0.30 +set_global_routing_layer_adjustment $::env(MIN_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) 0.20 set_routing_layers -signal $::env(MIN_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) From f1c26c54242d2af5febeb5135118290299b03df8 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sun, 15 Mar 2026 00:44:18 +0000 Subject: [PATCH 096/202] ng45/mempool disable LEC_CHECK Signed-off-by: Matt Liberty --- flow/designs/nangate45/mempool_group/config.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flow/designs/nangate45/mempool_group/config.mk b/flow/designs/nangate45/mempool_group/config.mk index 115c2012c5..d0121653ce 100644 --- a/flow/designs/nangate45/mempool_group/config.mk +++ b/flow/designs/nangate45/mempool_group/config.mk @@ -78,3 +78,5 @@ export CORE_AREA = 10 12 1090 1090 export MACRO_PLACE_HALO = 10 10 export SYNTH_HDL_FRONTEND = slang + +export LEC_CHECK = 0 From 9a2ba141a9bcc37bd1bf46906d65fc2540de9820 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sun, 15 Mar 2026 05:19:03 +0000 Subject: [PATCH 097/202] Update metrics designs/asap7/aes-block/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -106.0 | -78.0 | Tighten | | cts__timing__setup__tns | -5150 | -2890.0 | Tighten | | cts__timing__hold__tns | -5770.0 | -5670.0 | Tighten | | globalroute__timing__setup__ws | -117.0 | -77.7 | Tighten | | globalroute__timing__setup__tns | -4295 | -3020.0 | Tighten | | globalroute__timing__hold__tns | -508.0 | -1080.0 | Failing | | detailedroute__route__wirelength | 52736 | 51873 | Tighten | | finish__timing__setup__ws | -66.7 | -58.1 | Tighten | | finish__timing__setup__tns | -1290.0 | -897.0 | Tighten | | finish__design__instance__area | 7206 | 7205 | Tighten | designs/sky130hs/gcd/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | synth__design__instance__area__stdcell | 4532.91 | 4470.0 | Tighten | | placeopt__design__instance__area | 6389 | 6112 | Tighten | | placeopt__design__instance__count__stdcell | 721 | 715 | Tighten | | cts__design__instance__count__setup_buffer | 63 | 62 | Tighten | | cts__timing__setup__tns | -10.8 | -11.4 | Failing | | globalroute__timing__setup__tns | -18.3 | -19.2 | Failing | | finish__timing__setup__tns | -14.6 | -15.8 | Failing | | finish__design__instance__area | 7546 | 7136 | Tighten | designs/sky130hd/ibex/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.533 | -0.505 | Tighten | | cts__timing__setup__tns | -2.05 | -2.0 | Tighten | | globalroute__timing__setup__tns | -2.37 | -4.96 | Failing | | finish__design__instance__area | 179572 | 179425 | Tighten | designs/sky130hs/ibex/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__timing__setup__tns | -88.3 | -114.0 | Failing | | finish__timing__setup__tns | -6.46 | -19.8 | Failing | designs/nangate45/jpeg/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -53.3 | -54.6 | Failing | | globalroute__timing__setup__tns | -64.8 | -66.5 | Failing | designs/nangate45/mempool_group/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -11900.0 | -15000.0 | Failing | | finish__timing__setup__tns | -12100.0 | -12400.0 | Failing | | finish__timing__hold__tns | -0.6 | -3.1 | Failing | | finish__design__instance__area | 461696 | 461350 | Tighten | designs/sky130hd/microwatt/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -352.0 | -261.0 | Tighten | | globalroute__antenna_diodes_count | 1962 | 2101 | Failing | | globalroute__timing__setup__tns | -188.0 | -241.0 | Failing | | detailedroute__antenna__violating__nets | 6 | 3 | Tighten | | detailedroute__antenna_diodes_count | 2377 | 1970 | Tighten | | finish__timing__setup__tns | -30.8 | -43.9 | Failing | designs/asap7/riscv32i-mock-sram/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | synth__design__instance__area__stdcell | 1640.0 | 1570.0 | Tighten | | cts__timing__setup__ws | -50.0 | -47.5 | Tighten | | cts__timing__setup__tns | -693.0 | -190.0 | Tighten | | globalroute__timing__setup__ws | -95.7 | -56.5 | Tighten | | globalroute__timing__setup__tns | -1700.0 | -224.0 | Tighten | | detailedroute__route__wirelength | 72999 | 67341 | Tighten | | finish__timing__setup__tns | -12300.0 | -26300.0 | Failing | designs/nangate45/swerv_wrapper/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -84.2 | -84.6 | Failing | | globalroute__timing__setup__ws | -0.398 | -0.285 | Tighten | | globalroute__timing__setup__tns | -75.8 | -86.3 | Failing | | detailedroute__route__wirelength | 5599467 | 5546498 | Tighten | | finish__timing__setup__ws | -0.185 | -0.315 | Failing | | finish__timing__setup__tns | -87.5 | -88.2 | Failing | designs/nangate45/tinyRocket/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -34.0 | -30.3 | Tighten | | globalroute__timing__setup__tns | -47.4 | -48.5 | Failing | | finish__timing__setup__tns | -41.6 | -39.0 | Tighten | Signed-off-by: Matt Liberty --- flow/designs/asap7/aes-block/rules-base.json | 20 +++++++++---------- .../asap7/riscv32i-mock-sram/rules-base.json | 14 ++++++------- flow/designs/nangate45/jpeg/rules-base.json | 4 ++-- .../nangate45/mempool_group/rules-base.json | 8 ++++---- .../nangate45/swerv_wrapper/rules-base.json | 12 +++++------ .../nangate45/tinyRocket/rules-base.json | 6 +++--- flow/designs/sky130hd/ibex/rules-base.json | 8 ++++---- .../sky130hd/microwatt/rules-base.json | 12 +++++------ flow/designs/sky130hs/gcd/rules-base.json | 16 +++++++-------- flow/designs/sky130hs/ibex/rules-base.json | 4 ++-- 10 files changed, 52 insertions(+), 52 deletions(-) diff --git a/flow/designs/asap7/aes-block/rules-base.json b/flow/designs/asap7/aes-block/rules-base.json index 012f81c8e0..0d454b5e23 100644 --- a/flow/designs/asap7/aes-block/rules-base.json +++ b/flow/designs/asap7/aes-block/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -106.0, + "value": -78.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -5150, + "value": -2890.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -40,7 +40,7 @@ "compare": ">=" }, "cts__timing__hold__tns": { - "value": -5770.0, + "value": -5670.0, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -117.0, + "value": -77.7, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -4295, + "value": -3020.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -60,11 +60,11 @@ "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -508.0, + "value": -1080.0, "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 52736, + "value": 51873, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -66.7, + "value": -58.1, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1290.0, + "value": -897.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 7206, + "value": 7205, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/riscv32i-mock-sram/rules-base.json b/flow/designs/asap7/riscv32i-mock-sram/rules-base.json index fe47b8735d..071fb38ee6 100644 --- a/flow/designs/asap7/riscv32i-mock-sram/rules-base.json +++ b/flow/designs/asap7/riscv32i-mock-sram/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 1640.0, + "value": 1570.0, "compare": "<=" }, "constraints__clocks__count": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -50.0, + "value": -47.5, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -693.0, + "value": -190.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -95.7, + "value": -56.5, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1700.0, + "value": -224.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 72999, + "value": 67341, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -12300.0, + "value": -26300.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/jpeg/rules-base.json b/flow/designs/nangate45/jpeg/rules-base.json index fa5449e10f..0a0bc86bd9 100644 --- a/flow/designs/nangate45/jpeg/rules-base.json +++ b/flow/designs/nangate45/jpeg/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -53.3, + "value": -54.6, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -64.8, + "value": -66.5, "compare": ">=" }, "globalroute__timing__hold__ws": { diff --git a/flow/designs/nangate45/mempool_group/rules-base.json b/flow/designs/nangate45/mempool_group/rules-base.json index aa57c0f78e..bcddcbc98d 100644 --- a/flow/designs/nangate45/mempool_group/rules-base.json +++ b/flow/designs/nangate45/mempool_group/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -11900.0, + "value": -15000.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -12100.0, + "value": -12400.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -92,11 +92,11 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.6, + "value": -3.1, "compare": ">=" }, "finish__design__instance__area": { - "value": 461696, + "value": 461350, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index 4903ef22db..c12bf4610f 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -84.2, + "value": -84.6, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.398, + "value": -0.285, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -75.8, + "value": -86.3, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 5599467, + "value": 5546498, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.185, + "value": -0.315, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -87.5, + "value": -88.2, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/tinyRocket/rules-base.json b/flow/designs/nangate45/tinyRocket/rules-base.json index 49b0eefcca..1744724c46 100644 --- a/flow/designs/nangate45/tinyRocket/rules-base.json +++ b/flow/designs/nangate45/tinyRocket/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -34.0, + "value": -30.3, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -47.4, + "value": -48.5, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -41.6, + "value": -39.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/ibex/rules-base.json b/flow/designs/sky130hd/ibex/rules-base.json index e36f0c7475..5ec4bf4827 100644 --- a/flow/designs/sky130hd/ibex/rules-base.json +++ b/flow/designs/sky130hd/ibex/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.533, + "value": -0.505, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -2.05, + "value": -2.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2.37, + "value": -4.96, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 179572, + "value": 179425, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/microwatt/rules-base.json b/flow/designs/sky130hd/microwatt/rules-base.json index 8c048d2f23..c377034281 100644 --- a/flow/designs/sky130hd/microwatt/rules-base.json +++ b/flow/designs/sky130hd/microwatt/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -352.0, + "value": -261.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 1962, + "value": 2101, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -188.0, + "value": -241.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -72,11 +72,11 @@ "compare": "<=" }, "detailedroute__antenna__violating__nets": { - "value": 6, + "value": 3, "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 2377, + "value": 1970, "compare": "<=" }, "finish__timing__setup__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -30.8, + "value": -43.9, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hs/gcd/rules-base.json b/flow/designs/sky130hs/gcd/rules-base.json index 37d58a53e7..5fb40f5dfc 100644 --- a/flow/designs/sky130hs/gcd/rules-base.json +++ b/flow/designs/sky130hs/gcd/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 4532.91, + "value": 4470.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 6389, + "value": 6112, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 721, + "value": 715, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,7 +20,7 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 63, + "value": 62, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -10.8, + "value": -11.4, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -18.3, + "value": -19.2, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -14.6, + "value": -15.8, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 7546, + "value": 7136, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hs/ibex/rules-base.json b/flow/designs/sky130hs/ibex/rules-base.json index 45e82b5a10..40be0a8a5f 100644 --- a/flow/designs/sky130hs/ibex/rules-base.json +++ b/flow/designs/sky130hs/ibex/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -88.3, + "value": -114.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -6.46, + "value": -19.8, "compare": ">=" }, "finish__timing__hold__ws": { From 3d0bc18d2bc0e6f6a31afabff39ed17d0680880a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Sun, 15 Mar 2026 09:31:32 +0100 Subject: [PATCH 098/202] Make KLayout an optional dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KLayout is a heavy end-user GUI tool that was previously required to complete the ORFS flow. The `finish` target depended on GDS_FINAL_FILE and `do-finish` called `do-gds`, meaning the flow could not complete without KLayout installed — even though most use cases never need GDS. This change decouples KLayout so it is only pulled in when explicitly requested via `make gds` / `make do-gds`, following the existing target naming pattern (place/do-place, finish/do-finish, gds/do-gds). Makefile changes: - Remove $(GDS_FINAL_FILE) from `finish` dependencies - Remove do-gds from `do-finish` recipe - Add explicit `gds` phony target - Add `check-klayout` guard on all KLayout-dependent targets (GDS merge, DRC, LVS, gallery, klayout viewer shortcuts) Extract .lyt tech file generation from sed to Python: - The do-klayout and do-klayout_wrap targets previously used fragile sed-based XML manipulation with shell variable expansion and ifeq/else branching. New util/generate_klayout_tech.py replaces this with stdlib xml/regex processing (no KLayout dependency). Refactor def2stream.py for testability: - Extract logic into merge_gds() function with pya as a parameter - Guard `import pya` so the module can be imported without KLayout - When run via `klayout -r`, the script behaves identically using klayout's -rd global variables The interface is backwards compatible: `make finish gds` produces GDS as before, `do-gds` is unchanged, and bazel-orfs can invoke `do-gds` from a new `orfs_gds()` rule while `do-final` no longer requires KLayout in the toolchain. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/Makefile | 42 ++++-- flow/util/def2stream.py | 225 ++++++++++++++++++----------- flow/util/generate_klayout_tech.py | 107 ++++++++++++++ flow/util/utils.mk | 2 +- 4 files changed, 274 insertions(+), 102 deletions(-) create mode 100644 flow/util/generate_klayout_tech.py diff --git a/flow/Makefile b/flow/Makefile index f18ca938d7..27db55c9b7 100644 --- a/flow/Makefile +++ b/flow/Makefile @@ -195,21 +195,25 @@ $(OBJECTS_DIR)/klayout.lyt: $(KLAYOUT_TECH_FILE) $(OBJECTS_DIR)/klayout_tech.lef .PHONY: do-klayout do-klayout: -ifeq ($(KLAYOUT_ENV_VAR_IN_PATH),valid) - SC_LEF_RELATIVE_PATH="$(shell realpath --relative-to=$(RESULTS_DIR) $(SC_LEF))"; \ - OTHER_LEFS_RELATIVE_PATHS=$$(echo "$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(ADDITIONAL_LEFS),$$(realpath --relative-to=$(RESULTS_DIR) $(file)))"); \ - sed 's,.*,'"$$SC_LEF_RELATIVE_PATH"''"$$OTHER_LEFS_RELATIVE_PATHS"',g' $(KLAYOUT_TECH_FILE) > $(OBJECTS_DIR)/klayout.lyt -else - sed 's,.*,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(SC_LEF) $(ADDITIONAL_LEFS),$(shell realpath --relative-to=$(RESULTS_DIR) $(file))),g' $(KLAYOUT_TECH_FILE) > $(OBJECTS_DIR)/klayout.lyt -endif - sed -i 's,.*,$(foreach file, $(FLOW_HOME)/platforms/$(PLATFORM)/*map,$(shell realpath $(file))),g' $(OBJECTS_DIR)/klayout.lyt + @mkdir -p $(dir $(OBJECTS_DIR)/klayout.lyt) + $(PYTHON_EXE) $(UTILS_DIR)/generate_klayout_tech.py \ + --template $(KLAYOUT_TECH_FILE) \ + --output $(OBJECTS_DIR)/klayout.lyt \ + --lef-files $(OBJECTS_DIR)/klayout_tech.lef $(SC_LEF) $(ADDITIONAL_LEFS) \ + --reference-dir $(RESULTS_DIR) \ + --map-files $(wildcard $(FLOW_HOME)/platforms/$(PLATFORM)/*map) $(OBJECTS_DIR)/klayout_wrap.lyt: $(KLAYOUT_TECH_FILE) $(OBJECTS_DIR)/klayout_tech.lef $(UNSET_AND_MAKE) do-klayout_wrap .PHONY: do-klayout_wrap do-klayout_wrap: - sed 's,.*,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(WRAP_LEFS),$(shell realpath --relative-to=$(OBJECTS_DIR)/def $(file))),g' $(KLAYOUT_TECH_FILE) > $(OBJECTS_DIR)/klayout_wrap.lyt + @mkdir -p $(dir $(OBJECTS_DIR)/klayout_wrap.lyt) + $(PYTHON_EXE) $(UTILS_DIR)/generate_klayout_tech.py \ + --template $(KLAYOUT_TECH_FILE) \ + --output $(OBJECTS_DIR)/klayout_wrap.lyt \ + --lef-files $(OBJECTS_DIR)/klayout_tech.lef $(WRAP_LEFS) \ + --reference-dir $(OBJECTS_DIR)/def $(WRAPPED_LEFS): mkdir -p $(OBJECTS_DIR)/lef $(OBJECTS_DIR)/def @@ -594,8 +598,7 @@ klayout_guides: $(RESULTS_DIR)/5_route.def $(OBJECTS_DIR)/klayout.lyt .PHONY: finish finish: $(LOG_DIR)/6_report.log \ $(RESULTS_DIR)/6_final.v \ - $(RESULTS_DIR)/6_final.sdc \ - $(GDS_FINAL_FILE) + $(RESULTS_DIR)/6_final.sdc $(UNSET_AND_MAKE) elapsed .PHONY: elapsed @@ -627,7 +630,7 @@ final: finish .PHONY: do-finish do-finish: - $(UNSET_AND_MAKE) do-6_1_fill do-6_1_fill.sdc do-6_final.sdc do-6_report do-gds elapsed + $(UNSET_AND_MAKE) do-6_1_fill do-6_1_fill.sdc do-6_final.sdc do-6_report elapsed .PHONY: generate_abstract generate_abstract: $(RESULTS_DIR)/6_final.gds $(RESULTS_DIR)/6_final.def $(RESULTS_DIR)/6_final.v $(RESULTS_DIR)/6_final.sdc @@ -643,6 +646,17 @@ do-generate_abstract: clean_abstract: rm -f $(RESULTS_DIR)/$(DESIGN_NAME).lib $(RESULTS_DIR)/$(DESIGN_NAME).lef +.PHONY: check-klayout +check-klayout: + @if [ -z "$(KLAYOUT_CMD)" ]; then \ + echo "Error: KLayout not found. Install KLayout or set KLAYOUT_CMD."; \ + echo "Hint: 'make finish' works without KLayout. Only GDS/DRC/LVS need it."; \ + exit 1; \ + fi + +.PHONY: gds +gds: $(GDS_FINAL_FILE) + # Merge wrapped macros using Klayout #------------------------------------------------------------------------------- $(WRAPPED_GDSOAS): $(OBJECTS_DIR)/klayout_wrap.lyt $(WRAPPED_LEFS) @@ -658,7 +672,7 @@ $(WRAPPED_GDSOAS): $(OBJECTS_DIR)/klayout_wrap.lyt $(WRAPPED_LEFS) # Merge GDS using Klayout #------------------------------------------------------------------------------- -$(GDS_MERGED_FILE): $(RESULTS_DIR)/6_final.def $(OBJECTS_DIR)/klayout.lyt $(GDSOAS_FILES) $(WRAPPED_GDSOAS) $(SEAL_GDSOAS) +$(GDS_MERGED_FILE): check-klayout $(RESULTS_DIR)/6_final.def $(OBJECTS_DIR)/klayout.lyt $(GDSOAS_FILES) $(WRAPPED_GDSOAS) $(SEAL_GDSOAS) $(UNSET_AND_MAKE) do-gds-merged .PHONY: do-gds-merged @@ -768,7 +782,7 @@ nuke: clean_test clean_issues # DEF/GDS/OAS viewer shortcuts #------------------------------------------------------------------------------- .PHONY: $(foreach file,$(RESULTS_DEF) $(RESULTS_GDS) $(RESULTS_OAS),klayout_$(file)) -$(foreach file,$(RESULTS_DEF) $(RESULTS_GDS) $(RESULTS_OAS),klayout_$(file)): klayout_%: $(OBJECTS_DIR)/klayout.lyt +$(foreach file,$(RESULTS_DEF) $(RESULTS_GDS) $(RESULTS_OAS),klayout_$(file)): klayout_%: check-klayout $(OBJECTS_DIR)/klayout.lyt $(SCRIPTS_DIR)/klayout.sh -nn $(OBJECTS_DIR)/klayout.lyt $(RESULTS_DIR)/$* $(eval $(call OPEN_GUI_SHORTCUT,synth,1_synth.odb)) diff --git a/flow/util/def2stream.py b/flow/util/def2stream.py index 5062474f9e..f6530d3db3 100644 --- a/flow/util/def2stream.py +++ b/flow/util/def2stream.py @@ -1,100 +1,151 @@ -import pya +try: + import pya +except ImportError: + pya = None + import re -import json -import copy import sys import os -errors = 0 - -# Load technology file -tech = pya.Technology() -tech.load(tech_file) -layoutOptions = tech.load_layout_options -if len(layer_map) > 0: - layoutOptions.lefdef_config.map_file = layer_map - -# Load def file -main_layout = pya.Layout() -print("[INFO] Reporting cells prior to loading DEF ...") -for i in main_layout.each_cell(): - print("[INFO] '{0}'".format(i.name)) - -main_layout.read(in_def, layoutOptions) - -# Clear cells -top_cell_index = main_layout.cell(design_name).cell_index() - -# remove orphan cell BUT preserve cell with VIA_ -# - KLayout is prepending VIA_ when reading DEF that instantiates LEF's via -for i in main_layout.each_cell(): - if i.cell_index() != top_cell_index: - if not i.name.startswith("VIA_") and not i.name.endswith("_DEF_FILL"): - i.clear() - -# Load in the gds to merge -for fil in in_files.split(): - print("\t{0}".format(fil)) - main_layout.read(fil) - -# Copy the top level only to a new layout -top_only_layout = pya.Layout() -top_only_layout.dbu = main_layout.dbu -top = top_only_layout.create_cell(design_name) -top.copy_tree(main_layout.cell(design_name)) - -missing_cell = False -allow_empty = os.environ.get("GDS_ALLOW_EMPTY", "") -regex = re.compile(allow_empty) if allow_empty else None - -if allow_empty: - print(f"[INFO] GDS_ALLOW_EMPTY={allow_empty}") - -for i in top_only_layout.each_cell(): - if i.is_empty(): - missing_cell = True - if regex is not None and regex.match(i.name): - print( - "[WARNING] LEF Cell '{0}' ignored. Matches GDS_ALLOW_EMPTY.".format( - i.name - ) - ) - else: - print( - "[ERROR] LEF Cell '{0}' has no matching GDS/OAS cell." - " Cell will be empty.".format(i.name) - ) - errors += 1 -if not missing_cell: - print("[INFO] All LEF cells have matching GDS/OAS cells") +def merge_gds( + pya_mod, + tech_file, + layer_map, + in_def, + design_name, + in_files, + seal_file, + out_file, + allow_empty="", +): + """Merge DEF and GDS/OAS files into a single stream file. + + Args: + pya_mod: The pya module (klayout Python API). + tech_file: Path to klayout technology file. + layer_map: Path to layer map file (empty string if none). + in_def: Path to input DEF file. + design_name: Top-level design name. + in_files: Space-separated string of GDS/OAS files to merge. + seal_file: Path to seal ring GDS/OAS file (empty string if none). + out_file: Path to output GDS/OAS file. + allow_empty: Regex pattern for cells allowed to be empty. + + Returns: + Number of errors encountered. + """ + errors = 0 + + # Load technology file + tech = pya_mod.Technology() + tech.load(tech_file) + layout_options = tech.load_layout_options + if len(layer_map) > 0: + layout_options.lefdef_config.map_file = layer_map + + # Load def file + main_layout = pya_mod.Layout() + print("[INFO] Reporting cells prior to loading DEF ...") + for i in main_layout.each_cell(): + print("[INFO] '{0}'".format(i.name)) + + main_layout.read(in_def, layout_options) + + # Clear cells + top_cell_index = main_layout.cell(design_name).cell_index() + + # remove orphan cell BUT preserve cell with VIA_ + # - KLayout is prepending VIA_ when reading DEF that instantiates LEF's via + for i in main_layout.each_cell(): + if i.cell_index() != top_cell_index: + if not i.name.startswith("VIA_") and not i.name.endswith("_DEF_FILL"): + i.clear() + + # Load in the gds to merge + for fil in in_files.split(): + print("\t{0}".format(fil)) + main_layout.read(fil) + + # Copy the top level only to a new layout + top_only_layout = pya_mod.Layout() + top_only_layout.dbu = main_layout.dbu + top = top_only_layout.create_cell(design_name) + top.copy_tree(main_layout.cell(design_name)) + + missing_cell = False + regex = re.compile(allow_empty) if allow_empty else None + + if allow_empty: + print(f"[INFO] GDS_ALLOW_EMPTY={allow_empty}") + + for i in top_only_layout.each_cell(): + if i.is_empty(): + missing_cell = True + if regex is not None and regex.match(i.name): + print( + "[WARNING] LEF Cell '{0}' ignored. Matches GDS_ALLOW_EMPTY.".format( + i.name + ) + ) + else: + print( + "[ERROR] LEF Cell '{0}' has no matching GDS/OAS cell." + " Cell will be empty.".format(i.name) + ) + errors += 1 -orphan_cell = False -for i in top_only_layout.each_cell(): - if i.name != design_name and i.parent_cells() == 0: - orphan_cell = True - print("[ERROR] Found orphan cell '{0}'".format(i.name)) - errors += 1 + if not missing_cell: + print("[INFO] All LEF cells have matching GDS/OAS cells") -if not orphan_cell: - print("[INFO] No orphan cells in the final layout") + orphan_cell = False + for i in top_only_layout.each_cell(): + if i.name != design_name and i.parent_cells() == 0: + orphan_cell = True + print("[ERROR] Found orphan cell '{0}'".format(i.name)) + errors += 1 + if not orphan_cell: + print("[INFO] No orphan cells in the final layout") -if seal_file: - top_cell = top_only_layout.top_cell() + if seal_file: + top_cell = top_only_layout.top_cell() - top_only_layout.read(seal_file) + top_only_layout.read(seal_file) - for cell in top_only_layout.top_cells(): - if cell != top_cell: - print( - "[INFO] Merging '{0}' as child of '{1}'".format( - cell.name, top_cell.name + for cell in top_only_layout.top_cells(): + if cell != top_cell: + print( + "[INFO] Merging '{0}' as child of '{1}'".format( + cell.name, top_cell.name + ) ) + top.insert(pya_mod.CellInstArray(cell.cell_index(), pya_mod.Trans())) + + # Write out the GDS + top_only_layout.write(out_file) + + return errors + + +# When run via klayout -r, globals tech_file, layer_map, in_def, etc. +# are set by klayout's -rd mechanism. +if pya is not None: + try: + # These globals are set by klayout -rd flags + sys.exit( + merge_gds( + pya_mod=pya, + tech_file=tech_file, # noqa: F821 - set by klayout -rd + layer_map=layer_map, # noqa: F821 + in_def=in_def, # noqa: F821 + design_name=design_name, # noqa: F821 + in_files=in_files, # noqa: F821 + seal_file=seal_file, # noqa: F821 + out_file=out_file, # noqa: F821 + allow_empty=os.environ.get("GDS_ALLOW_EMPTY", ""), ) - top.insert(pya.CellInstArray(cell.cell_index(), pya.Trans())) - -# Write out the GDS -top_only_layout.write(out_file) - -sys.exit(errors) + ) + except NameError: + # Not running under klayout -r, pya available but no -rd globals + pass diff --git a/flow/util/generate_klayout_tech.py b/flow/util/generate_klayout_tech.py new file mode 100644 index 0000000000..c054945f71 --- /dev/null +++ b/flow/util/generate_klayout_tech.py @@ -0,0 +1,107 @@ +"""Generate klayout .lyt tech file from platform template. + +Replaces and elements with actual paths. +No klayout dependency - pure XML manipulation using stdlib. +""" + +import argparse +import os +import re + + +def replace_lef_files(content, lef_files): + """Replace the ... element(s) with new ones. + + The original .lyt template has a single element inside + . We replace it with one element + per LEF file, matching the existing sed-based behavior. + """ + replacement = "".join("{}".format(f) for f in lef_files) + return re.sub(r".*?", replacement, content) + + +def replace_map_files(content, map_files): + """Replace the ... or element(s) with new ones.""" + if not map_files: + return content + replacement = "".join("{}".format(f) for f in map_files) + content = re.sub(r".*?", replacement, content) + content = re.sub(r"", replacement, content) + return content + + +def generate_klayout_tech( + template_lyt, + output_lyt, + lef_files, + reference_dir, + map_files, + use_relative_paths, +): + """Generate a klayout .lyt file from a platform template. + + Args: + template_lyt: Path to the platform .lyt template file. + output_lyt: Path to write the generated .lyt file. + lef_files: List of LEF file paths to include. + reference_dir: Directory to compute relative paths from. + map_files: List of map file paths. + use_relative_paths: If True, compute paths relative to reference_dir. + """ + with open(template_lyt, "r") as f: + content = f.read() + + # Both modes use relative paths from reference_dir, matching the + # original sed-based behavior which always uses realpath --relative-to. + resolved_lefs = [ + os.path.relpath(os.path.realpath(f), os.path.realpath(reference_dir)) + for f in lef_files + ] + + content = replace_lef_files(content, resolved_lefs) + + resolved_maps = [os.path.realpath(f) for f in map_files] + content = replace_map_files(content, resolved_maps) + + with open(output_lyt, "w") as f: + f.write(content) + + +def main(): + parser = argparse.ArgumentParser( + description="Generate klayout .lyt tech file from platform template." + ) + parser.add_argument( + "--template", required=True, help="Path to platform .lyt template" + ) + parser.add_argument("--output", required=True, help="Output .lyt file path") + parser.add_argument( + "--lef-files", nargs="*", default=[], help="LEF files to include" + ) + parser.add_argument( + "--reference-dir", + required=True, + help="Directory for computing relative paths", + ) + parser.add_argument( + "--map-files", nargs="*", default=[], help="Map files to include" + ) + parser.add_argument( + "--use-relative-paths", + action="store_true", + help="Use paths relative to reference-dir", + ) + args = parser.parse_args() + + generate_klayout_tech( + template_lyt=args.template, + output_lyt=args.output, + lef_files=args.lef_files, + reference_dir=args.reference_dir, + map_files=args.map_files, + use_relative_paths=args.use_relative_paths, + ) + + +if __name__ == "__main__": + main() diff --git a/flow/util/utils.mk b/flow/util/utils.mk index 3924f57b4e..25c1cfc2ac 100644 --- a/flow/util/utils.mk +++ b/flow/util/utils.mk @@ -157,7 +157,7 @@ $(RESULTS_DIR)/6_final_no_power.def: $(RESULTS_DIR)/6_final.def .PHONY: gallery -gallery: $(RESULTS_DIR)/6_final_no_power.def $(RESULTS_DIR)/6_final_only_clk.def +gallery: check-klayout $(RESULTS_DIR)/6_final_no_power.def $(RESULTS_DIR)/6_final_only_clk.def ($(TIME_CMD) klayout -z -nc -rx -rd gallery_json=util/gallery.json \ -rd results_path=$(RESULTS_DIR) \ -rd tech_file=$(OBJECTS_DIR)/klayout.lyt \ From 7a498f577b5b23877bba464fd512bf515f777074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Sun, 15 Mar 2026 09:31:38 +0100 Subject: [PATCH 099/202] Add documentation for KLayout optional dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/docs/KLayoutOptionalDependency.md | 89 ++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 flow/docs/KLayoutOptionalDependency.md diff --git a/flow/docs/KLayoutOptionalDependency.md b/flow/docs/KLayoutOptionalDependency.md new file mode 100644 index 0000000000..b4916262ef --- /dev/null +++ b/flow/docs/KLayoutOptionalDependency.md @@ -0,0 +1,89 @@ +# KLayout as an Optional Dependency + +KLayout is only required for GDS/OAS stream generation, DRC, and LVS +verification. All other ORFS functionality — synthesis, floorplanning, +placement, CTS, routing, timing reports, and abstract generation — works +without KLayout installed. + +## Makefile Targets + +| Target | Requires KLayout | Description | +|---|---|---| +| `make finish` | No | Complete flow through timing reports | +| `make gds` | Yes | Generate GDS/OAS from finished design | +| `make do-finish` / `make do-final` | No | Same as `finish`, for bazel-orfs | +| `make do-gds` | Yes | Same as `gds`, for bazel-orfs | +| `make drc` | Yes | Run DRC checks (requires GDS) | +| `make lvs` | Yes | Run LVS checks (requires GDS) | +| `make gallery` | Yes | Generate layout screenshots | +| `make klayout_` | Yes | Open result in KLayout viewer | +| `make generate_abstract` | No | Generate LEF/LIB abstracts | + +A `check-klayout` guard produces a clear error message when KLayout is +missing and a KLayout-dependent target is invoked: + +``` +Error: KLayout not found. Install KLayout or set KLAYOUT_CMD. +Hint: 'make finish' works without KLayout. Only GDS/DRC/LVS need it. +``` + +## Use Cases + +| Use Case | Needs KLayout? | +|---|---| +| Education / learning digital design | No | +| Architectural exploration (PPA analysis) | No | +| CI testing of ORFS / OpenROAD | No | +| Local ORFS and OpenROAD development | No | +| bazel-orfs default `orfs_flow()` | No | +| GDS generation for tapeout | Yes | +| DRC / LVS verification | Yes | +| Layout visualization in KLayout GUI | Yes | + +## bazel-orfs Integration + +bazel-orfs uses the `do-` prefixed targets which bypass Make's dependency +management. The relevant targets follow the standard pattern: + +- `do-finish` / `do-final` — runs the finish stage without GDS +- `do-gds` — runs GDS generation (requires KLayout) + +An `orfs_gds()` Bazel rule can call `do-gds` independently from +`orfs_flow()`, making KLayout an optional toolchain dependency configured +in `MODULE.bazel`. + +## KLayout Tech File Generation + +The `do-klayout` and `do-klayout_wrap` targets generate `.lyt` technology +files by substituting LEF and map file paths into platform templates. +This is implemented in `util/generate_klayout_tech.py` using stdlib XML +processing — no KLayout dependency required. + +## Testing Without KLayout + +Unit tests for all KLayout-related Python scripts use `unittest.mock` to +mock the `pya` API: + +``` +cd flow/test +python -m unittest test_generate_klayout_tech test_def2stream test_convertDrc +``` + +These tests cover: +- `.lyt` tech file generation (`test_generate_klayout_tech.py`) +- DEF-to-GDS merging logic (`test_def2stream.py`) +- DRC report conversion (`test_convertDrc.py`) + +## Future: OpenROAD `write_gds` and KLayout Coexistence + +OpenROAD has an unfinished `write_gds` command. When it is eventually +completed, it would eliminate the KLayout dependency for GDS generation +in many cases. However, KLayout support will live alongside `write_gds` +until there is confidence that `write_gds` is robust and fully covers +all current use cases. + +Even then, non-public or future PDKs may have requirements that benefit +from KLayout's mature GDS handling. Whether KLayout support stays in +ORFS indefinitely remains to be seen. Once `write_gds` works robustly +for all of today's use cases, extending it to cover future ones may +turn out to be straightforward. From a4e2395f4c5bc9135684cda398a91507fdaefa95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Sun, 15 Mar 2026 09:31:45 +0100 Subject: [PATCH 100/202] Add unit tests for KLayout-related Python utilities MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 34 mock-based tests that run without KLayout installed: - test_generate_klayout_tech.py: .lyt generation including validation against real platform templates (nangate45, asap7, sky130hd) - test_def2stream.py: cell clearing, VIA_ preservation, orphan detection, GDS_ALLOW_EMPTY regex, seal file merging, error counting - test_convertDrc.py: DRC report conversion (box/edge/text violations, waived items, comment assembly) Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/test/test_convertDrc.py | 255 +++++++++++++ flow/test/test_def2stream.py | 467 ++++++++++++++++++++++++ flow/test/test_generate_klayout_tech.py | 232 ++++++++++++ 3 files changed, 954 insertions(+) create mode 100644 flow/test/test_convertDrc.py create mode 100644 flow/test/test_def2stream.py create mode 100644 flow/test/test_generate_klayout_tech.py diff --git a/flow/test/test_convertDrc.py b/flow/test/test_convertDrc.py new file mode 100644 index 0000000000..87f5894dcc --- /dev/null +++ b/flow/test/test_convertDrc.py @@ -0,0 +1,255 @@ +#!/usr/bin/env python3 + +import unittest +from unittest.mock import MagicMock, patch +import sys +import os + +# Mock pya before importing convertDrc since it imports pya at module level +sys.modules["pya"] = MagicMock() + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "util")) + +# convertDrc uses a global `in_drc` set by klayout -rd, so we must set it +import builtins + +builtins.in_drc = "/tmp/test.drc" +builtins.out_file = "/tmp/test.json" + +# Now we can import - but the module-level code tries to use pya.Application +# We need to handle this by patching before import +import importlib + +# Import just the convert_drc function by reading the source +import types + +_util_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "util") +_src_path = os.path.join(_util_dir, "convertDrc.py") + +# Load only the convert_drc function, not the module-level klayout code +with open(_src_path) as f: + source = f.read() + +# Extract just the function definition +import textwrap +import re as _re + +# Parse out the convert_drc function +_func_start = source.index("def convert_drc(rdb):") +_func_end = source.index("\n\napp = pya.Application") +_func_source = source[_func_start:_func_end] + +# Create a module with just the function +_mod = types.ModuleType("convertDrc_test") +_mod.__dict__["os"] = os +_mod.__dict__["in_drc"] = "/tmp/test.drc" +exec(compile(_func_source, _src_path, "exec"), _mod.__dict__) +convert_drc = _mod.convert_drc + + +def make_mock_point(x, y): + p = MagicMock() + p.x = x + p.y = y + return p + + +def make_mock_edge(p1_x, p1_y, p2_x, p2_y): + edge = MagicMock() + edge.p1 = make_mock_point(p1_x, p1_y) + edge.p2 = make_mock_point(p2_x, p2_y) + return edge + + +def make_box_value(left, bottom, right, top): + value = MagicMock() + value.is_box.return_value = True + value.is_edge.return_value = False + value.is_edge_pair.return_value = False + value.is_polygon.return_value = False + value.is_path.return_value = False + value.is_text.return_value = False + value.is_string.return_value = False + box = MagicMock() + box.left = left + box.bottom = bottom + box.right = right + box.top = top + value.box.return_value = box + return value + + +def make_edge_value(p1_x, p1_y, p2_x, p2_y): + value = MagicMock() + value.is_box.return_value = False + value.is_edge.return_value = True + value.is_edge_pair.return_value = False + value.is_polygon.return_value = False + value.is_path.return_value = False + value.is_text.return_value = False + value.is_string.return_value = False + value.edge.return_value = make_mock_edge(p1_x, p1_y, p2_x, p2_y) + return value + + +def make_text_value(text): + value = MagicMock() + value.is_box.return_value = False + value.is_edge.return_value = False + value.is_edge_pair.return_value = False + value.is_polygon.return_value = False + value.is_path.return_value = False + value.is_text.return_value = True + value.is_string.return_value = False + value.text.return_value = text + return value + + +def make_mock_item(values, is_visited=False, tags_str="", comment=None): + item = MagicMock() + item.is_visited.return_value = is_visited + item.tags_str = tags_str + item.each_value.return_value = iter(values) + if comment is not None: + item.comment = comment + else: + # Remove hasattr for comment + del item.comment + return item + + +def make_mock_category(name, description, rdb_id, num_items, items): + cat = MagicMock() + cat.name.return_value = name + cat.description = description + cat.rdb_id.return_value = rdb_id + cat.num_items.return_value = num_items + return cat, items + + +class TestConvertDrc(unittest.TestCase): + def test_empty_rdb(self): + rdb = MagicMock() + rdb.each_category.return_value = iter([]) + + result = convert_drc(rdb) + + self.assertEqual(result["source"], os.path.abspath("/tmp/test.drc")) + self.assertEqual(result["category"], {}) + + def test_empty_category_skipped(self): + cat = MagicMock() + cat.num_items.return_value = 0 + + rdb = MagicMock() + rdb.each_category.return_value = iter([cat]) + + result = convert_drc(rdb) + self.assertEqual(result["category"], {}) + + def test_box_violation(self): + box_val = make_box_value(100, 200, 300, 400) + item = make_mock_item([box_val]) + + cat = MagicMock() + cat.name.return_value = "metal1.min_width" + cat.description = "Minimum width violation" + cat.rdb_id.return_value = 1 + cat.num_items.return_value = 1 + + rdb = MagicMock() + rdb.each_category.return_value = iter([cat]) + rdb.each_item_per_category.return_value = iter([item]) + + result = convert_drc(rdb) + + violations = result["category"]["metal1.min_width"]["violations"] + self.assertEqual(len(violations), 1) + self.assertEqual(len(violations[0]["shape"]), 1) + shape = violations[0]["shape"][0] + self.assertEqual(shape["type"], "box") + self.assertEqual(shape["points"][0], {"x": 100, "y": 200}) + self.assertEqual(shape["points"][1], {"x": 300, "y": 400}) + + def test_edge_violation(self): + edge_val = make_edge_value(10, 20, 30, 40) + item = make_mock_item([edge_val]) + + cat = MagicMock() + cat.name.return_value = "metal1.spacing" + cat.description = "Spacing violation" + cat.rdb_id.return_value = 2 + cat.num_items.return_value = 1 + + rdb = MagicMock() + rdb.each_category.return_value = iter([cat]) + rdb.each_item_per_category.return_value = iter([item]) + + result = convert_drc(rdb) + + violations = result["category"]["metal1.spacing"]["violations"] + shape = violations[0]["shape"][0] + self.assertEqual(shape["type"], "line") + self.assertEqual(shape["points"][0], {"x": 10, "y": 20}) + self.assertEqual(shape["points"][1], {"x": 30, "y": 40}) + + def test_waived_violation(self): + box_val = make_box_value(0, 0, 10, 10) + item = make_mock_item([box_val], tags_str="waived") + + cat = MagicMock() + cat.name.return_value = "rule1" + cat.description = "Rule 1" + cat.rdb_id.return_value = 1 + cat.num_items.return_value = 1 + + rdb = MagicMock() + rdb.each_category.return_value = iter([cat]) + rdb.each_item_per_category.return_value = iter([item]) + + result = convert_drc(rdb) + + violation = result["category"]["rule1"]["violations"][0] + self.assertTrue(violation["waived"]) + + def test_text_in_comment(self): + text_val = make_text_value("error detail") + item = make_mock_item([text_val]) + + cat = MagicMock() + cat.name.return_value = "rule1" + cat.description = "Rule 1" + cat.rdb_id.return_value = 1 + cat.num_items.return_value = 1 + + rdb = MagicMock() + rdb.each_category.return_value = iter([cat]) + rdb.each_item_per_category.return_value = iter([item]) + + result = convert_drc(rdb) + + violation = result["category"]["rule1"]["violations"][0] + self.assertEqual(violation["comment"], "error detail") + + def test_comment_with_text(self): + text_val = make_text_value("extra info") + item = make_mock_item([text_val], comment="base comment") + + cat = MagicMock() + cat.name.return_value = "rule1" + cat.description = "Rule 1" + cat.rdb_id.return_value = 1 + cat.num_items.return_value = 1 + + rdb = MagicMock() + rdb.each_category.return_value = iter([cat]) + rdb.each_item_per_category.return_value = iter([item]) + + result = convert_drc(rdb) + + violation = result["category"]["rule1"]["violations"][0] + self.assertEqual(violation["comment"], "base comment: extra info") + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/test/test_def2stream.py b/flow/test/test_def2stream.py new file mode 100644 index 0000000000..db9e88de50 --- /dev/null +++ b/flow/test/test_def2stream.py @@ -0,0 +1,467 @@ +#!/usr/bin/env python3 + +import unittest +from unittest.mock import MagicMock, patch, call +import sys +import os + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "util")) + +import def2stream + + +def make_mock_cell(name, cell_index=0, is_empty=False, parent_cells=1): + """Create a mock cell object.""" + cell = MagicMock() + cell.name = name + cell.cell_index.return_value = cell_index + cell.is_empty.return_value = is_empty + cell.parent_cells.return_value = parent_cells + return cell + + +def make_mock_pya(cells_before_read=None, cells_after_read=None, top_only_cells=None): + """Create a mock pya module with configurable cell behavior. + + Args: + cells_before_read: Cells in main_layout before reading DEF. + cells_after_read: Cells in main_layout after reading DEF/GDS. + top_only_cells: Cells in top_only_layout after copy_tree. + """ + pya_mod = MagicMock() + + # Technology mock + tech = MagicMock() + pya_mod.Technology.return_value = tech + + # Main layout mock + main_layout = MagicMock() + pya_mod.Layout.side_effect = [main_layout] + + if cells_before_read is None: + cells_before_read = [] + if cells_after_read is None: + cells_after_read = [] + + # each_cell returns different results before and after read + main_layout.each_cell.side_effect = [ + iter(cells_before_read), # first call: before reading DEF + iter(cells_after_read), # second call: clearing non-top cells + ] + + # top_only_layout is the second Layout() call + top_only_layout = MagicMock() + + if top_only_cells is None: + top_only_cells = [] + + # top_only each_cell called twice: missing cell check and orphan check + top_only_layout.each_cell.side_effect = [ + iter(top_only_cells), # missing cell check + iter(top_only_cells), # orphan cell check + ] + + # Override Layout side_effect to return both layouts + pya_mod.Layout.side_effect = [main_layout, top_only_layout] + + top_cell = MagicMock() + top_cell.name = "test_design" + top_only_layout.create_cell.return_value = top_cell + top_only_layout.top_cell.return_value = top_cell + top_only_layout.top_cells.return_value = [] + + return pya_mod, main_layout, top_only_layout, top_cell + + +class TestMergeGdsBasic(unittest.TestCase): + def test_no_errors_clean_design(self): + """A clean design with no missing/orphan cells should return 0 errors.""" + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, top_only_layout, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[], + ) + + main_layout.cell.return_value = top + + errors = def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="/tmp/cells.gds", + seal_file="", + out_file="/tmp/out.gds", + ) + + self.assertEqual(errors, 0) + top_only_layout.write.assert_called_once_with("/tmp/out.gds") + + def test_layer_map_applied(self): + """When layer_map is non-empty, it should be set on layout options.""" + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[], + ) + main_layout.cell.return_value = top + + tech = pya_mod.Technology.return_value + + def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="/tmp/layer.map", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + self.assertEqual( + tech.load_layout_options.lefdef_config.map_file, "/tmp/layer.map" + ) + + def test_empty_layer_map_not_applied(self): + """When layer_map is empty, map_file should not be set.""" + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[], + ) + main_layout.cell.return_value = top + + tech = pya_mod.Technology.return_value + original_map = tech.load_layout_options.lefdef_config.map_file + + def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + self.assertEqual(tech.load_layout_options.lefdef_config.map_file, original_map) + + +class TestCellClearing(unittest.TestCase): + def test_non_top_cells_cleared(self): + """Non-top cells (not VIA_ or _DEF_FILL) should be cleared.""" + top = make_mock_cell("test_design", cell_index=0) + filler = make_mock_cell("FILLER_cell", cell_index=1) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top, filler], + top_only_cells=[], + ) + main_layout.cell.return_value = top + + def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + filler.clear.assert_called_once() + + def test_via_cells_preserved(self): + """Cells starting with VIA_ should NOT be cleared.""" + top = make_mock_cell("test_design", cell_index=0) + via = make_mock_cell("VIA_M1M2", cell_index=1) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top, via], + top_only_cells=[], + ) + main_layout.cell.return_value = top + + def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + via.clear.assert_not_called() + + def test_def_fill_cells_preserved(self): + """Cells ending with _DEF_FILL should NOT be cleared.""" + top = make_mock_cell("test_design", cell_index=0) + fill = make_mock_cell("some_DEF_FILL", cell_index=2) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top, fill], + top_only_cells=[], + ) + main_layout.cell.return_value = top + + def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + fill.clear.assert_not_called() + + +class TestMissingCells(unittest.TestCase): + def test_empty_cell_is_error(self): + """An empty cell without GDS_ALLOW_EMPTY should count as an error.""" + missing = make_mock_cell( + "missing_gds", cell_index=1, is_empty=True, parent_cells=1 + ) + + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[missing], + ) + main_layout.cell.return_value = top + + errors = def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + self.assertEqual(errors, 1) + + def test_allow_empty_regex_suppresses_error(self): + """GDS_ALLOW_EMPTY regex should suppress errors for matching cells.""" + missing = make_mock_cell( + "pad_io_cell", cell_index=1, is_empty=True, parent_cells=1 + ) + + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[missing], + ) + main_layout.cell.return_value = top + + errors = def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + allow_empty="pad_.*", + ) + + self.assertEqual(errors, 0) + + def test_allow_empty_regex_no_match_still_errors(self): + """GDS_ALLOW_EMPTY regex should not suppress non-matching cells.""" + missing = make_mock_cell( + "other_cell", cell_index=1, is_empty=True, parent_cells=1 + ) + + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[missing], + ) + main_layout.cell.return_value = top + + errors = def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + allow_empty="pad_.*", + ) + + self.assertEqual(errors, 1) + + +class TestOrphanCells(unittest.TestCase): + def test_orphan_cell_is_error(self): + """A cell with no parents (orphan) should count as an error.""" + orphan = make_mock_cell( + "orphan_cell", cell_index=1, is_empty=False, parent_cells=0 + ) + + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[orphan], + ) + main_layout.cell.return_value = top + + errors = def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + self.assertEqual(errors, 1) + + def test_top_cell_not_orphan(self): + """The top cell itself should not be counted as an orphan.""" + top = make_mock_cell( + "test_design", cell_index=0, is_empty=False, parent_cells=0 + ) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[top], + ) + main_layout.cell.return_value = top + + errors = def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + self.assertEqual(errors, 0) + + +class TestSealFile(unittest.TestCase): + def test_seal_file_merged(self): + """When seal_file is provided, seal cells should be merged.""" + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, top_only_layout, top_cell = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[], + ) + main_layout.cell.return_value = top + + seal_cell = MagicMock() + seal_cell.name = "seal_ring" + seal_cell.cell_index.return_value = 5 + # top_cells returns original top + seal after reading seal file + top_only_layout.top_cells.return_value = [top_cell, seal_cell] + + errors = def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="/tmp/seal.gds", + out_file="/tmp/out.gds", + ) + + self.assertEqual(errors, 0) + top_only_layout.read.assert_called_once_with("/tmp/seal.gds") + pya_mod.CellInstArray.assert_called_once_with(5, pya_mod.Trans.return_value) + + def test_no_seal_file(self): + """When seal_file is empty, no seal merging should happen.""" + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, top_only_layout, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[], + ) + main_layout.cell.return_value = top + + def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="", + seal_file="", + out_file="/tmp/out.gds", + ) + + top_only_layout.read.assert_not_called() + + +class TestGdsFileMerging(unittest.TestCase): + def test_multiple_gds_files_read(self): + """All space-separated GDS files should be read into main_layout.""" + top = make_mock_cell("test_design", cell_index=0) + + pya_mod, main_layout, _, _ = make_mock_pya( + cells_before_read=[], + cells_after_read=[top], + top_only_cells=[], + ) + main_layout.cell.return_value = top + + def2stream.merge_gds( + pya_mod=pya_mod, + tech_file="/tmp/test.lyt", + layer_map="", + in_def="/tmp/test.def", + design_name="test_design", + in_files="/tmp/a.gds /tmp/b.gds /tmp/c.gds", + seal_file="", + out_file="/tmp/out.gds", + ) + + # read is called for DEF + 3 GDS files = 4 total + read_calls = main_layout.read.call_args_list + self.assertEqual(len(read_calls), 4) # 1 DEF + 3 GDS + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/test/test_generate_klayout_tech.py b/flow/test/test_generate_klayout_tech.py new file mode 100644 index 0000000000..22c6642127 --- /dev/null +++ b/flow/test/test_generate_klayout_tech.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python3 + +import unittest +import os +import sys +import tempfile + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "util")) + +import generate_klayout_tech + +MINIMAL_LYT = """\ + + + Test + + + ./original.lef + + + +""" + +LYT_WITH_MAP = """\ + + + Test + + + ./original.lef + original.map + + + +""" + +LYT_WITH_EMPTY_MAP = """\ + + + Test + + + ./original.lef + + + + +""" + + +class TestReplaceLefFiles(unittest.TestCase): + def test_single_lef(self): + result = generate_klayout_tech.replace_lef_files(MINIMAL_LYT, ["tech.lef"]) + self.assertIn("tech.lef", result) + self.assertNotIn("original.lef", result) + + def test_multiple_lefs(self): + result = generate_klayout_tech.replace_lef_files( + MINIMAL_LYT, ["tech.lef", "sc.lef", "extra.lef"] + ) + self.assertIn( + "tech.lef" + "sc.lef" + "extra.lef", + result, + ) + self.assertNotIn("original.lef", result) + + def test_empty_lefs(self): + result = generate_klayout_tech.replace_lef_files(MINIMAL_LYT, []) + self.assertNotIn("original.lef", result) + # Empty replacement removes the element content + self.assertNotIn("", result) + + +class TestReplaceMapFiles(unittest.TestCase): + def test_replace_existing_map(self): + result = generate_klayout_tech.replace_map_files( + LYT_WITH_MAP, ["/abs/path/layer.map"] + ) + self.assertIn("/abs/path/layer.map", result) + self.assertNotIn("original.map", result) + + def test_replace_empty_map(self): + result = generate_klayout_tech.replace_map_files( + LYT_WITH_EMPTY_MAP, ["/abs/path/layer.map"] + ) + self.assertIn("/abs/path/layer.map", result) + + def test_no_map_files_noop(self): + result = generate_klayout_tech.replace_map_files(LYT_WITH_MAP, []) + self.assertEqual(result, LYT_WITH_MAP) + + def test_no_map_element_in_template(self): + result = generate_klayout_tech.replace_map_files(MINIMAL_LYT, ["/some/map"]) + # No map element to replace, content unchanged + self.assertEqual(result, MINIMAL_LYT) + + +class TestGenerateKlayoutTech(unittest.TestCase): + def setUp(self): + self.tmp_dir = tempfile.TemporaryDirectory() + self.template = os.path.join(self.tmp_dir.name, "test.lyt") + self.output = os.path.join(self.tmp_dir.name, "output.lyt") + self.results_dir = os.path.join(self.tmp_dir.name, "results") + os.makedirs(self.results_dir, exist_ok=True) + + def tearDown(self): + self.tmp_dir.cleanup() + + def test_basic_generation(self): + with open(self.template, "w") as f: + f.write(MINIMAL_LYT) + + lef_path = os.path.join(self.tmp_dir.name, "tech.lef") + with open(lef_path, "w") as f: + f.write("") + + generate_klayout_tech.generate_klayout_tech( + template_lyt=self.template, + output_lyt=self.output, + lef_files=[lef_path], + reference_dir=self.results_dir, + map_files=[], + use_relative_paths=True, + ) + + with open(self.output) as f: + content = f.read() + + self.assertIn("", content) + self.assertNotIn("original.lef", content) + # Path should be relative to results_dir + expected_rel = os.path.relpath( + os.path.realpath(lef_path), + os.path.realpath(self.results_dir), + ) + self.assertIn(expected_rel, content) + + def test_with_map_files(self): + with open(self.template, "w") as f: + f.write(LYT_WITH_MAP) + + lef_path = os.path.join(self.tmp_dir.name, "tech.lef") + map_path = os.path.join(self.tmp_dir.name, "layer.map") + for p in [lef_path, map_path]: + with open(p, "w") as f: + f.write("") + + generate_klayout_tech.generate_klayout_tech( + template_lyt=self.template, + output_lyt=self.output, + lef_files=[lef_path], + reference_dir=self.results_dir, + map_files=[map_path], + use_relative_paths=False, + ) + + with open(self.output) as f: + content = f.read() + + self.assertIn(os.path.realpath(map_path), content) + self.assertNotIn("original.map", content) + + def test_multiple_lef_files(self): + with open(self.template, "w") as f: + f.write(MINIMAL_LYT) + + lef_files = [] + for name in ["tech.lef", "sc.lef", "extra.lef"]: + path = os.path.join(self.tmp_dir.name, name) + with open(path, "w") as f: + f.write("") + lef_files.append(path) + + generate_klayout_tech.generate_klayout_tech( + template_lyt=self.template, + output_lyt=self.output, + lef_files=lef_files, + reference_dir=self.results_dir, + map_files=[], + use_relative_paths=True, + ) + + with open(self.output) as f: + content = f.read() + + # Should have three lef-files elements + self.assertEqual(content.count(""), 3) + + +class TestRealPlatformLyt(unittest.TestCase): + """Test against actual platform .lyt files to catch regressions.""" + + PLATFORMS_DIR = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "..", "platforms" + ) + + def _test_platform(self, lyt_path): + if not os.path.exists(lyt_path): + self.skipTest(f"{lyt_path} not found") + + with open(lyt_path) as f: + content = f.read() + + result = generate_klayout_tech.replace_lef_files( + content, ["replaced_tech.lef", "replaced_sc.lef"] + ) + self.assertIn("replaced_tech.lef", result) + self.assertIn("replaced_sc.lef", result) + # Original lef-files content should be gone + self.assertNotIn("NangateOpenCellLibrary", result) + self.assertNotIn("asap7_tech", result) + + def test_nangate45(self): + self._test_platform( + os.path.join(self.PLATFORMS_DIR, "nangate45", "FreePDK45.lyt") + ) + + def test_asap7(self): + self._test_platform( + os.path.join(self.PLATFORMS_DIR, "asap7", "KLayout", "asap7.lyt") + ) + + def test_sky130hd(self): + self._test_platform( + os.path.join(self.PLATFORMS_DIR, "sky130hd", "sky130hd.lyt") + ) + + +if __name__ == "__main__": + unittest.main() From 2337490193cd5abdd7de1a53aeb9670570cb8039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Sun, 15 Mar 2026 09:31:52 +0100 Subject: [PATCH 101/202] Widen CI path triggers for Python util tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use glob patterns (flow/util/*.py, flow/test/test_*.py) instead of listing individual files, so new test and utility scripts trigger CI automatically. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- .github/workflows/github-actions-cron-util-test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/github-actions-cron-util-test.yml b/.github/workflows/github-actions-cron-util-test.yml index e2636fc7ad..0995738b48 100644 --- a/.github/workflows/github-actions-cron-util-test.yml +++ b/.github/workflows/github-actions-cron-util-test.yml @@ -4,12 +4,12 @@ on: - cron: "0 8 * * SUN" push: paths: - - 'flow/util/genElapsedTime.py' - - 'flow/test/test_genElapsedTime.py' + - 'flow/util/*.py' + - 'flow/test/test_*.py' pull_request: paths: - - 'flow/util/genElapsedTime.py' - - 'flow/test/test_genElapsedTime.py' + - 'flow/util/*.py' + - 'flow/test/test_*.py' # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From 4af3c2f31d2ecc95f61a9ea8f4a7c98c5b30995d Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sun, 15 Mar 2026 15:02:24 +0000 Subject: [PATCH 102/202] Update private metrics for sta update designs/gf12/bp_single/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__hold__ws | -303.0 | -414.0 | Failing | | cts__timing__hold__tns | -5060.0 | -3930.0 | Tighten | | globalroute__timing__hold__ws | -255.0 | -412.0 | Failing | | finish__timing__hold__ws | -100.0 | -227.0 | Failing | designs/rapidus2hp/cva6/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.111 | -0.0943 | Tighten | | cts__timing__setup__tns | -243.0 | -212.0 | Tighten | | globalroute__timing__setup__ws | -0.261 | -0.292 | Failing | | finish__timing__setup__ws | -0.261 | -0.292 | Failing | designs/rapidus2hp/ethmac/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -0.633 | -0.538 | Tighten | | globalroute__timing__setup__ws | -0.0419 | -0.0526 | Failing | | globalroute__timing__setup__tns | -1.07 | -1.44 | Failing | | finish__timing__setup__ws | -0.0419 | -0.0526 | Failing | | finish__timing__setup__tns | -1.07 | -1.44 | Failing | designs/rapidus2hp/ethmac/rules-verific.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__timing__setup__ws | -0.0445 | -0.0514 | Failing | | globalroute__timing__setup__tns | -1.23 | -1.37 | Failing | | finish__timing__setup__ws | -0.0445 | -0.0514 | Failing | | finish__timing__setup__tns | -1.23 | -1.37 | Failing | designs/rapidus2hp/hercules_idecode/rules-verific.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.0456 | -0.0713 | Failing | | cts__timing__setup__tns | -70.6 | -130.0 | Failing | | globalroute__timing__setup__tns | -263.0 | -211.0 | Tighten | | finish__timing__setup__tns | -263.0 | -211.0 | Tighten | designs/rapidus2hp/hercules_idecode/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.0252 | -0.0652 | Failing | | cts__timing__setup__tns | -16.6 | -128.0 | Failing | | globalroute__timing__setup__tns | -206.0 | -322.0 | Failing | | finish__timing__setup__tns | -206.0 | -322.0 | Failing | designs/rapidus2hp/hercules_is_int/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.0467 | -0.102 | Failing | | cts__timing__setup__tns | -156.0 | -214.0 | Failing | | globalroute__timing__setup__ws | -0.134 | -0.129 | Tighten | | globalroute__timing__setup__tns | -1120.0 | -1040.0 | Tighten | | finish__timing__setup__ws | -0.134 | -0.129 | Tighten | | finish__timing__setup__tns | -1120.0 | -1040.0 | Tighten | designs/rapidus2hp/jpeg/rules-verific.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__tns | -42.4 | -43.6 | Failing | | globalroute__timing__setup__ws | -0.113 | -0.0947 | Tighten | | globalroute__timing__setup__tns | -127.0 | -122.0 | Tighten | | finish__timing__setup__ws | -0.113 | -0.0947 | Tighten | | finish__timing__setup__tns | -127.0 | -122.0 | Tighten | designs/rapidus2hp/jpeg/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.0541 | -0.0535 | Tighten | | cts__timing__setup__tns | -51.1 | -39.0 | Tighten | | globalroute__timing__setup__ws | -0.0983 | -0.0941 | Tighten | | globalroute__timing__setup__tns | -119.0 | -148.0 | Failing | | finish__timing__setup__ws | -0.0983 | -0.0941 | Tighten | | finish__timing__setup__tns | -119.0 | -148.0 | Failing | Signed-off-by: Matt Liberty --- flow/designs/gf12/bp_single/rules-base.json | 8 ++++---- flow/designs/rapidus2hp/cva6/rules-base.json | 8 ++++---- flow/designs/rapidus2hp/ethmac/rules-base.json | 10 +++++----- flow/designs/rapidus2hp/ethmac/rules-verific.json | 8 ++++---- .../rapidus2hp/hercules_idecode/rules-base.json | 8 ++++---- .../rapidus2hp/hercules_idecode/rules-verific.json | 8 ++++---- .../rapidus2hp/hercules_is_int/rules-base.json | 12 ++++++------ flow/designs/rapidus2hp/jpeg/rules-base.json | 12 ++++++------ flow/designs/rapidus2hp/jpeg/rules-verific.json | 10 +++++----- 9 files changed, 42 insertions(+), 42 deletions(-) diff --git a/flow/designs/gf12/bp_single/rules-base.json b/flow/designs/gf12/bp_single/rules-base.json index 8a2cc25598..6eb75fc36f 100644 --- a/flow/designs/gf12/bp_single/rules-base.json +++ b/flow/designs/gf12/bp_single/rules-base.json @@ -36,11 +36,11 @@ "compare": ">=" }, "cts__timing__hold__ws": { - "value": -303.0, + "value": -414.0, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -5060.0, + "value": -3930.0, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -56,7 +56,7 @@ "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -255.0, + "value": -412.0, "compare": ">=" }, "globalroute__timing__hold__tns": { @@ -88,7 +88,7 @@ "compare": ">=" }, "finish__timing__hold__ws": { - "value": -100.0, + "value": -227.0, "compare": ">=" }, "finish__timing__hold__tns": { diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index 75d727b172..bde2571868 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.111, + "value": -0.0943, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -243.0, + "value": -212.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.261, + "value": -0.292, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -64,7 +64,7 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.261, + "value": -0.292, "compare": ">=" }, "finish__timing__setup__tns": { diff --git a/flow/designs/rapidus2hp/ethmac/rules-base.json b/flow/designs/rapidus2hp/ethmac/rules-base.json index 2bdda7ddf4..0dae2ef484 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-base.json +++ b/flow/designs/rapidus2hp/ethmac/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.633, + "value": -0.538, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0419, + "value": -0.0526, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.07, + "value": -1.44, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0419, + "value": -0.0526, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.07, + "value": -1.44, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/ethmac/rules-verific.json b/flow/designs/rapidus2hp/ethmac/rules-verific.json index 10b8d821ce..51e09d244e 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-verific.json +++ b/flow/designs/rapidus2hp/ethmac/rules-verific.json @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0445, + "value": -0.0514, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.23, + "value": -1.37, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0445, + "value": -0.0514, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.23, + "value": -1.37, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json index 5e68206ac5..bf712af78c 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0252, + "value": -0.0652, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -16.6, + "value": -128.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -206.0, + "value": -322.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -206.0, + "value": -322.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json index ba31c5e501..251e75d125 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0456, + "value": -0.0713, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -70.6, + "value": -130.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -263.0, + "value": -211.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -263.0, + "value": -211.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json index e7dc50c087..8b8619f9f0 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0467, + "value": -0.102, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -156.0, + "value": -214.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.134, + "value": -0.129, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1120.0, + "value": -1040.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.134, + "value": -0.129, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1120.0, + "value": -1040.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/jpeg/rules-base.json b/flow/designs/rapidus2hp/jpeg/rules-base.json index b58c3748e4..998e8fd633 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-base.json +++ b/flow/designs/rapidus2hp/jpeg/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0541, + "value": -0.0535, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -51.1, + "value": -39.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0983, + "value": -0.0941, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -119.0, + "value": -148.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0983, + "value": -0.0941, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -119.0, + "value": -148.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/jpeg/rules-verific.json b/flow/designs/rapidus2hp/jpeg/rules-verific.json index 48b4c99d64..70e1108406 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-verific.json +++ b/flow/designs/rapidus2hp/jpeg/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -42.4, + "value": -43.6, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.113, + "value": -0.0947, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -127.0, + "value": -122.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.113, + "value": -0.0947, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -127.0, + "value": -122.0, "compare": ">=" }, "finish__timing__hold__ws": { From 6a140bf8e8838e4269b507988d4ccd63e5de4e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Sun, 15 Mar 2026 22:33:00 +0100 Subject: [PATCH 103/202] Remove do-targets and redundant use-cases from KLayout docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR review: do-targets are internal to bazel-orfs and don't need user-facing documentation. Use-cases table is redundant with the introductory paragraph. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/docs/KLayoutOptionalDependency.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/flow/docs/KLayoutOptionalDependency.md b/flow/docs/KLayoutOptionalDependency.md index b4916262ef..9e64a8d1b8 100644 --- a/flow/docs/KLayoutOptionalDependency.md +++ b/flow/docs/KLayoutOptionalDependency.md @@ -11,8 +11,6 @@ without KLayout installed. |---|---|---| | `make finish` | No | Complete flow through timing reports | | `make gds` | Yes | Generate GDS/OAS from finished design | -| `make do-finish` / `make do-final` | No | Same as `finish`, for bazel-orfs | -| `make do-gds` | Yes | Same as `gds`, for bazel-orfs | | `make drc` | Yes | Run DRC checks (requires GDS) | | `make lvs` | Yes | Run LVS checks (requires GDS) | | `make gallery` | Yes | Generate layout screenshots | @@ -27,19 +25,6 @@ Error: KLayout not found. Install KLayout or set KLAYOUT_CMD. Hint: 'make finish' works without KLayout. Only GDS/DRC/LVS need it. ``` -## Use Cases - -| Use Case | Needs KLayout? | -|---|---| -| Education / learning digital design | No | -| Architectural exploration (PPA analysis) | No | -| CI testing of ORFS / OpenROAD | No | -| Local ORFS and OpenROAD development | No | -| bazel-orfs default `orfs_flow()` | No | -| GDS generation for tapeout | Yes | -| DRC / LVS verification | Yes | -| Layout visualization in KLayout GUI | Yes | - ## bazel-orfs Integration bazel-orfs uses the `do-` prefixed targets which bypass Make's dependency From cbadd29fe896148917712c52eb55cb858dae1eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Sun, 15 Mar 2026 22:37:22 +0100 Subject: [PATCH 104/202] Restore GDS dependency on finish target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No changes to the non do- versions of targets. bazel-orfs does not use the finish target; it uses do-finish and can invoke do-gds as a separate step. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/Makefile | 5 +++-- flow/docs/KLayoutOptionalDependency.md | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/flow/Makefile b/flow/Makefile index 27db55c9b7..7bccdc8307 100644 --- a/flow/Makefile +++ b/flow/Makefile @@ -598,7 +598,8 @@ klayout_guides: $(RESULTS_DIR)/5_route.def $(OBJECTS_DIR)/klayout.lyt .PHONY: finish finish: $(LOG_DIR)/6_report.log \ $(RESULTS_DIR)/6_final.v \ - $(RESULTS_DIR)/6_final.sdc + $(RESULTS_DIR)/6_final.sdc \ + $(GDS_FINAL_FILE) $(UNSET_AND_MAKE) elapsed .PHONY: elapsed @@ -650,7 +651,7 @@ clean_abstract: check-klayout: @if [ -z "$(KLAYOUT_CMD)" ]; then \ echo "Error: KLayout not found. Install KLayout or set KLAYOUT_CMD."; \ - echo "Hint: 'make finish' works without KLayout. Only GDS/DRC/LVS need it."; \ + echo "Hint: KLayout is needed for GDS/DRC/LVS targets."; \ exit 1; \ fi diff --git a/flow/docs/KLayoutOptionalDependency.md b/flow/docs/KLayoutOptionalDependency.md index 9e64a8d1b8..5bafe5c5cb 100644 --- a/flow/docs/KLayoutOptionalDependency.md +++ b/flow/docs/KLayoutOptionalDependency.md @@ -9,7 +9,7 @@ without KLayout installed. | Target | Requires KLayout | Description | |---|---|---| -| `make finish` | No | Complete flow through timing reports | +| `make finish` | Yes | Complete flow including GDS generation | | `make gds` | Yes | Generate GDS/OAS from finished design | | `make drc` | Yes | Run DRC checks (requires GDS) | | `make lvs` | Yes | Run LVS checks (requires GDS) | @@ -22,7 +22,7 @@ missing and a KLayout-dependent target is invoked: ``` Error: KLayout not found. Install KLayout or set KLAYOUT_CMD. -Hint: 'make finish' works without KLayout. Only GDS/DRC/LVS need it. +Hint: KLayout is needed for GDS/DRC/LVS targets. ``` ## bazel-orfs Integration From c50a4a077f87faf33a0ed291b253f516adf1f512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Mon, 16 Mar 2026 06:40:54 +0100 Subject: [PATCH 105/202] Add bazelisk run //:install MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bazelisk run //:install Builds and installs OpenROAD (with GUI), Yosys, and yosys-slang to tools/install/. Re-runs are instant (stamp file per submodule commit). No sudo required. On Ubuntu, checks for missing -dev packages before building and fails fast with the apt install command. Other platforms not checked (we can't test them, contributions welcome). Docs updated to present Bazel / Nix / CMake as three equal paths. Zero churn: no changes to DependencyInstaller.sh, flow/, setup.sh, build_openroad.sh, or Nix flakes. Tested: gcd/nangate45 synth, asap7/uart synth (yosys-slang). Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- BUILD.bazel | 6 ++ MODULE.bazel | 1 + MODULE.bazel.lock | 3 +- bazel/install.sh | 164 ++++++++++++++++++++++++++++++++++++++ docs/user/BuildLocally.md | 71 +++++++++-------- 5 files changed, 210 insertions(+), 35 deletions(-) create mode 100644 BUILD.bazel create mode 100755 bazel/install.sh diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000000..f0f4077bf3 --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,6 @@ +load("@rules_shell//shell:sh_binary.bzl", "sh_binary") + +sh_binary( + name = "install", + srcs = ["bazel/install.sh"], +) diff --git a/MODULE.bazel b/MODULE.bazel index 574d678f5d..9687e51c48 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -16,6 +16,7 @@ git_override( ) bazel_dep(name = "rules_python", version = "1.2.0") +bazel_dep(name = "rules_shell", version = "0.6.1") python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain( diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 45ece7112e..ffe386712a 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -124,7 +124,8 @@ "https://bcr.bazel.build/modules/rules_python/1.2.0/MODULE.bazel": "5aeeb48b2a6c19d668b48adf2b8a2b209a6310c230db0ce77450f148a89846e4", "https://bcr.bazel.build/modules/rules_python/1.2.0/source.json": "5b7892685c9a843526fd5a31e7d7a93eb819c59fd7b7fc444b5b143558e1b073", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/source.json": "7f27af3c28037d9701487c4744b5448d26537cc66cdef0d8df7ae85411f8de95", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", diff --git a/bazel/install.sh b/bazel/install.sh new file mode 100755 index 0000000000..9b548e4386 --- /dev/null +++ b/bazel/install.sh @@ -0,0 +1,164 @@ +#!/bin/bash +set -e + +# ORFS install script +# Single user-facing entry point: bazelisk run //:install +# +# Builds and installs tools to tools/install/ where flow/Makefile expects them. +# Uses stamp files for fast no-op re-runs (seconds when nothing changed). + +WORKSPACE="${BUILD_WORKSPACE_DIRECTORY:-.}" +INSTALL_DIR="${WORKSPACE}/tools/install" +NUM_THREADS=$(nproc) + +usage() { + cat <<'EOF' +Usage: bazelisk run //:install [-- OPTIONS] + +Installs tools required for the ORFS flow/Makefile. + +Installed: + openroad OpenROAD with GUI support + yosys Yosys synthesis tool + yosys-slang Yosys SystemVerilog plugin + +Not yet supported (use sudo ./setup.sh): + klayout KLayout layout viewer + kepler Kepler formal verification + +Nix users: nix develop already provides all tools. See flake.nix. + +Options: + --help, -h Show this help + --skip-openroad Skip OpenROAD build + --threads N Compilation threads (default: nproc) +EOF + exit 0 +} + +# Check for required system dependencies before expensive builds. +# ORFS checks deps for what it builds (yosys/slang). OpenROAD checks +# its own deps in tools/OpenROAD/bazel/install.sh (separation of concerns). +# +# Currently only Ubuntu/Debian is checked. Dependency checking for +# other platforms (macOS, RHEL, Fedora, etc.) is not implemented +# because we cannot test them. Contributions welcome. +check_ubuntu_deps() { + local missing_cmds=() + local missing_pkgs=() + + # Commands needed for yosys build + command -v bison &>/dev/null || { missing_cmds+=(bison); missing_pkgs+=(bison); } + command -v flex &>/dev/null || { missing_cmds+=(flex); missing_pkgs+=(flex); } + command -v gawk &>/dev/null || { missing_cmds+=(gawk); missing_pkgs+=(gawk); } + command -v g++ &>/dev/null || { missing_cmds+=(g++); missing_pkgs+=(g++); } + command -v pkg-config &>/dev/null || { missing_cmds+=(pkg-config); missing_pkgs+=(pkg-config); } + command -v tclsh &>/dev/null || { missing_cmds+=(tclsh); missing_pkgs+=(tcl); } + command -v git &>/dev/null || { missing_cmds+=(git); missing_pkgs+=(git); } + command -v cmake &>/dev/null || { missing_cmds+=(cmake); missing_pkgs+=(cmake); } + + # Dev libraries needed for yosys/slang compilation (check via dpkg) + for pkg in tcl-dev libffi-dev libreadline-dev zlib1g-dev; do + if ! dpkg -s "$pkg" &>/dev/null 2>&1; then + missing_pkgs+=("$pkg") + fi + done + + if [[ ${#missing_pkgs[@]} -gt 0 ]]; then + echo "ERROR: Missing dependencies for Yosys build." + if [[ ${#missing_cmds[@]} -gt 0 ]]; then + echo " Missing commands: ${missing_cmds[*]}" + fi + echo "" + echo "On Ubuntu this would be:" + echo " sudo apt install ${missing_pkgs[*]}" + exit 1 + fi +} + +if command -v dpkg &>/dev/null; then + check_ubuntu_deps +fi + +BUILD_OPENROAD=1 + +while [[ $# -gt 0 ]]; do + case "$1" in + --help|-h) + usage + ;; + --skip-openroad) + BUILD_OPENROAD=0 + ;; + --threads) + NUM_THREADS="$2" + shift + ;; + *) + echo "Unknown option: $1" + usage + ;; + esac + shift +done + +# --- Check submodules are initialized --- +for sub in tools/OpenROAD tools/yosys tools/yosys-slang; do + if [[ ! -d "${WORKSPACE}/${sub}" ]] || [[ -z "$(ls -A "${WORKSPACE}/${sub}" 2>/dev/null)" ]]; then + echo "ERROR: ${sub} not initialized." + echo "Run: git submodule update --init --recursive" + exit 1 + fi +done + +# --- OpenROAD (delegates to its own //:install) --- +if [[ $BUILD_OPENROAD -eq 1 ]]; then + echo "=== Building OpenROAD with GUI support ===" + (cd "${WORKSPACE}/tools/OpenROAD" && bazelisk run --//:platform=gui //:install) +fi + +# --- Yosys --- +# Uses stamp file for fast no-op: if the yosys submodule commit hasn't +# changed, skip the build entirely. +YOSYS_INSTALL="${INSTALL_DIR}/yosys" +YOSYS_STAMP="${YOSYS_INSTALL}/.yosys_commit" +YOSYS_COMMIT="$(git -C "${WORKSPACE}/tools/yosys" rev-parse HEAD)" + +if [[ -f "${YOSYS_STAMP}" ]] && [[ "$(cat "${YOSYS_STAMP}")" == "${YOSYS_COMMIT}" ]]; then + echo "=== Yosys already up to date (${YOSYS_COMMIT:0:12}) ===" +else + echo "=== Building Yosys ===" + ( + cd "${WORKSPACE}/tools/yosys" + make -j "${NUM_THREADS}" PREFIX="${YOSYS_INSTALL}" ABC_ARCHFLAGS=-Wno-register + make install PREFIX="${YOSYS_INSTALL}" + ) + echo "${YOSYS_COMMIT}" > "${YOSYS_STAMP}" + echo "Yosys installed to ${YOSYS_INSTALL}/bin/yosys" +fi + +# --- yosys-slang --- +SLANG_STAMP="${YOSYS_INSTALL}/.slang_commit" +SLANG_COMMIT="$(git -C "${WORKSPACE}/tools/yosys-slang" rev-parse HEAD)" + +if [[ -f "${SLANG_STAMP}" ]] && [[ "$(cat "${SLANG_STAMP}")" == "${SLANG_COMMIT}" ]]; then + echo "=== yosys-slang already up to date (${SLANG_COMMIT:0:12}) ===" +else + echo "=== Building yosys-slang ===" + ( + cd "${WORKSPACE}/tools/yosys-slang" + cmake -S . -B build \ + -DYOSYS_CONFIG="${YOSYS_INSTALL}/bin/yosys-config" \ + -DCMAKE_BUILD_TYPE=Release \ + -DYOSYS_SLANG_REVISION=unknown \ + -DSLANG_REVISION=unknown + cmake --build build -j "${NUM_THREADS}" + cmake --install build --prefix "${YOSYS_INSTALL}" + ) + echo "${SLANG_COMMIT}" > "${SLANG_STAMP}" + echo "yosys-slang installed to ${YOSYS_INSTALL}/share/yosys/plugins/" +fi + +echo "" +echo "=== Done ===" +echo "cd flow && make" diff --git a/docs/user/BuildLocally.md b/docs/user/BuildLocally.md index 79a2dd09aa..f388d64f3e 100644 --- a/docs/user/BuildLocally.md +++ b/docs/user/BuildLocally.md @@ -1,33 +1,49 @@ # Build from sources locally -## Clone and Install Dependencies +## Choose Your Build Path -The `setup.sh` script installs all of the dependencies, including OpenROAD dependencies, if they are not already installed. +| Path | Prerequisites | sudo? | Best for | +|------|--------------|-------|----------| +| **Bazel** | [Bazelisk](https://bazel.build/install/bazelisk) | No | Most users | +| **Nix** | [Nix](https://github.com/DeterminateSystems/nix-installer) | No | Nix users | +| **CMake** | `sudo ./setup.sh` | Yes | Existing CMake developers | -Supported configurations are: Ubuntu 20.04, Ubuntu 22.04, Ubuntu 22.04(aarch64), RHEL 8, RockyLinux 9 and Debian 11. +### Bazel (recommended) + +Install [Bazelisk](https://bazel.build/install/bazelisk) following the +[official instructions](https://bazel.build/install/bazelisk). ``` shell git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts cd OpenROAD-flow-scripts -sudo ./setup.sh +bazelisk run //:install +cd flow && make ``` -## Using Bazel to build OpenROAD and run the ORFS flow - -Long story short: OpenROAD will eventually switch to using Bazel for downloading dependencies and building OpenROAD for all the reasons that the DependencyInstaller.sh and cmake are hard to support and brittle across platforms. +For options: `bazelisk run //:install -- --help` -Currently the simplest way to build OpenROAD and run ORFS is to run one test, which will download all OpenROAD dependencies and build OpenROAD in the exec configuration: +### Nix ``` shell -cd tools/OpenROAD -bazelisk test src/drt/... -cd ../../flow -make OPENROAD_EXE=$(pwd)/../tools/OpenROAD/bazel-out/k8-opt-exec-ST-*/bin/openroad +git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts +cd OpenROAD-flow-scripts +nix develop +cd flow && make ``` -Bazel could similarly be used to download and make available pre-built binaries for tools such as Yosys, eqy and KLayout. +### CMake (existing path) + +## Clone and Install Dependencies + +The `setup.sh` script installs all of the dependencies, including OpenROAD dependencies, if they are not already installed. + +Supported configurations are: Ubuntu 20.04, Ubuntu 22.04, Ubuntu 22.04(aarch64), RHEL 8, RockyLinux 9 and Debian 11. -Running some quick tests will cause the desired exec config of OpenROAD to be built. There's no explicit Bazel way to build an exec config of an executable and we want to to use an exec config that is the same binary as is used for a local OpenROAD modify + test Bazel cycle. +``` shell +git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts +cd OpenROAD-flow-scripts +sudo ./setup.sh +``` ## Build @@ -72,35 +88,22 @@ Set up environment variables using `dev_env.sh`, then start Visual Studio Code. code tools/OpenROAD/ ``` -## Build OpenROAD and run a few ORFS flows with Bazel - -Local use case: +## Build and run ORFS flows with Bazel -- Install Bazelisk and no other dependencies, no need to run `sudo ./setup.sh` -- Modify & build OpenROAD -- Test built OpenROAD with a few ORFS flows +ORFS uses [bazel-orfs](https://github.com/The-OpenROAD-Project/bazel-orfs) to run +the flow entirely within Bazel. This is separate from `bazelisk run //:install` above +which installs tools for the Makefile-based flow. -The Bazel support in OpenROAD and ORFS is work in progress and some Bazel experience is recommended before going spelunking in the Bazel builds. - -Contributions welcome! - -To build `designs/asap7/gcd:gcd_floorplan`: - - cd flow - (cd ../tools/OpenROAD && bazel build :openroad -c opt) && bazelisk build designs/asap7/gcd:gcd_floorplan - -Or to run all flows currently available in Bazel +To build a design with Bazel: cd flow - (cd ../tools/OpenROAD && bazel build :openroad -c opt) && bazelisk build ... + bazelisk build designs/asap7/gcd:gcd_floorplan -Note! ORFS uses the OpenROAD Bazel built binary in stop-gap way until OpenROAD has been switched to bzlmod, after which to build all flows becomes simpler as ORFS will build the requisite OpenROAD directly: +Or to run all flows currently available in Bazel: cd flow bazelisk build ... -ORFS uses [bazel-orfs](https://github.com/The-OpenROAD-Project/bazel-orfs) to implement the flow and gets some depedencies, like yosys, from the Docker image. Over time, all dependencies should be built with Bazel and the dependency on the ORFS Docker image will be phased out. - ### Upgrading MODULE.bazel with the latest bazel-orfs and ORFS Docker image Run: From 861a261b9da1e4f0d5f479f401d7c4334d17e15e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Mon, 16 Mar 2026 16:49:58 +0100 Subject: [PATCH 106/202] deltaDebug: Jenkins CI cleanup fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Øyvind Harboe --- flow/test/test_delta_debug.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100755 flow/test/test_delta_debug.sh diff --git a/flow/test/test_delta_debug.sh b/flow/test/test_delta_debug.sh new file mode 100755 index 0000000000..f8c1d2f99e --- /dev/null +++ b/flow/test/test_delta_debug.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# +# Delete me when this file is no longer invoked from Jenkins CI + From 842ff190a44e6bc875cd14c7524efc476b76735c Mon Sep 17 00:00:00 2001 From: Jeff Ng Date: Mon, 16 Mar 2026 18:01:12 +0000 Subject: [PATCH 107/202] Fixed path to search_space file Signed-off-by: Jeff Ng --- flow/designs/asap7/gcd/asap7_gcd_tune.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/asap7/gcd/asap7_gcd_tune.yaml b/flow/designs/asap7/gcd/asap7_gcd_tune.yaml index a1cd1786e3..63e3b864d1 100644 --- a/flow/designs/asap7/gcd/asap7_gcd_tune.yaml +++ b/flow/designs/asap7/gcd/asap7_gcd_tune.yaml @@ -10,4 +10,4 @@ run_config: samples: 10 timeout: 1.0 search_space: - file: designs/gcd/autotuner_new.json + file: designs/asap7/gcd/autotuner_new.json From 3c7b6fcb9555279471196e348ffeabdf144ddc66 Mon Sep 17 00:00:00 2001 From: Arthur Koucher Date: Mon, 16 Mar 2026 19:40:46 +0000 Subject: [PATCH 108/202] improve print messages of RC correlation segment mode Signed-off-by: Arthur Koucher --- flow/util/correlateRC.py | 41 ++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/flow/util/correlateRC.py b/flow/util/correlateRC.py index 1800961f62..230a89b1c7 100755 --- a/flow/util/correlateRC.py +++ b/flow/util/correlateRC.py @@ -370,10 +370,9 @@ def generic_rc_fit(type_sieve): ################################################################ if args.mode == "segment": - print( - "# Updated layer resistance {}/um capacitance {}/um".format(res_unit, cap_unit) - ) + print("\nUnits: resistance [{}/um], capacitance [{}/um]".format(res_unit, cap_unit)) + layer_models = {} for layer_name in routing_layers: # There may be routing layers with no segments, so we check if the # layer exists in the dict. @@ -388,12 +387,37 @@ def generic_rc_fit(type_sieve): res_model = LinearRegression(fit_intercept=False).fit(lengths, resistances) cap_model = LinearRegression(fit_intercept=False).fit(lengths, capacitances_ff) + layer_models[layer_name] = ( + res_model, + cap_model, + lengths, + resistances, + capacitances_ff, + ) - r_sq = res_model.score(lengths, resistances) - print("# Resistance coefficient of determination: {:.4f}".format(r_sq)) - r_sq = cap_model.score(lengths, capacitances_ff) - print("# Capacitance coefficient of determination: {:.4f}".format(r_sq)) - + # Print R² table + print("{:<13s} | {:>8s} | {:>8s}".format("\nLayer", "Res R²", "Cap R²")) + print("-" * 34) + for layer_name, ( + res_model, + cap_model, + lengths, + resistances, + capacitances_ff, + ) in layer_models.items(): + r_sq_res = res_model.score(lengths, resistances) + r_sq_cap = cap_model.score(lengths, capacitances_ff) + print("{:<12s} | {:>8.4f} | {:>8.4f}".format(layer_name, r_sq_res, r_sq_cap)) + print("-" * 34) + print("") + + for layer_name, ( + res_model, + cap_model, + lengths, + resistances, + capacitances_ff, + ) in layer_models.items(): print( "set_layer_rc -layer {} -resistance {:.5E} -capacitance {:.5E}".format( layer_name, @@ -401,3 +425,4 @@ def generic_rc_fit(type_sieve): cap_model.coef_[0] * 1e-15 / cap_scale, ) ) + print("") From 4939a6ff2654b6a881bb292d1055054482007f7a Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Mon, 16 Mar 2026 16:48:48 -0300 Subject: [PATCH 109/202] update or submodule Signed-off-by: Eder Monteiro --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 6ce9559a46..6210b07558 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 6ce9559a468e59f1a2c9809842c46f08489d7c8c +Subproject commit 6210b075580952a4699f73fdf94c34e8c75809ff From f234bb127dc25597a0cff0de034cec0e43b384d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Mon, 16 Mar 2026 23:52:25 +0100 Subject: [PATCH 110/202] Address KLayout docs review feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove speculative write_gds section — document it when relevant. Clarify why do-finish differs from finish (Make dependency vs recipe). Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/docs/KLayoutOptionalDependency.md | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/flow/docs/KLayoutOptionalDependency.md b/flow/docs/KLayoutOptionalDependency.md index 5bafe5c5cb..c469160a27 100644 --- a/flow/docs/KLayoutOptionalDependency.md +++ b/flow/docs/KLayoutOptionalDependency.md @@ -28,10 +28,9 @@ Hint: KLayout is needed for GDS/DRC/LVS targets. ## bazel-orfs Integration bazel-orfs uses the `do-` prefixed targets which bypass Make's dependency -management. The relevant targets follow the standard pattern: - -- `do-finish` / `do-final` — runs the finish stage without GDS -- `do-gds` — runs GDS generation (requires KLayout) +management. `do-finish` / `do-final` only run the finish stage recipe +itself, while `make finish` also pulls in the GDS target as a Make +dependency. `do-gds` runs GDS generation separately (requires KLayout). An `orfs_gds()` Bazel rule can call `do-gds` independently from `orfs_flow()`, making KLayout an optional toolchain dependency configured @@ -58,17 +57,3 @@ These tests cover: - `.lyt` tech file generation (`test_generate_klayout_tech.py`) - DEF-to-GDS merging logic (`test_def2stream.py`) - DRC report conversion (`test_convertDrc.py`) - -## Future: OpenROAD `write_gds` and KLayout Coexistence - -OpenROAD has an unfinished `write_gds` command. When it is eventually -completed, it would eliminate the KLayout dependency for GDS generation -in many cases. However, KLayout support will live alongside `write_gds` -until there is confidence that `write_gds` is robust and fully covers -all current use cases. - -Even then, non-public or future PDKs may have requirements that benefit -from KLayout's mature GDS handling. Whether KLayout support stays in -ORFS indefinitely remains to be seen. Once `write_gds` works robustly -for all of today's use cases, extending it to cover future ones may -turn out to be straightforward. From 6307d99f693259a55b67e70bc0649f05579cb91d Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Tue, 17 Mar 2026 11:02:13 +0900 Subject: [PATCH 111/202] chameleon: add LEC auxiliary blackbox stubs for KF Add LEC_AUX_VERILOG_FILES support to lec_check.tcl so that auxiliary Verilog files (e.g., blackbox module stubs) are concatenated into LEC netlists before Kepler Formal runs. For sky130hd/chameleon, provide clean blackbox stubs for DFFRAM_4K, DMC_32x16HC, ibex_wrapper, and apb_sys_0 so KF can resolve these macro modules during CTS LEC. Signed-off-by: Jaehyun Kim --- flow/designs/sky130hd/chameleon/config.mk | 2 +- .../sky130hd/chameleon/lec_blackbox_stubs.v | 143 ++++++++++++++++++ flow/scripts/lec_check.tcl | 20 ++- 3 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 flow/designs/sky130hd/chameleon/lec_blackbox_stubs.v diff --git a/flow/designs/sky130hd/chameleon/config.mk b/flow/designs/sky130hd/chameleon/config.mk index 7bd29564ed..0a1b11aa9e 100644 --- a/flow/designs/sky130hd/chameleon/config.mk +++ b/flow/designs/sky130hd/chameleon/config.mk @@ -34,6 +34,7 @@ export CORE_ASPECT_RATIO = 1.3 export CORE_MARGIN = 2 export chameleon_DIR = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME) +export LEC_AUX_VERILOG_FILES = $(chameleon_DIR)/lec_blackbox_stubs.v export ADDITIONAL_GDS = $(chameleon_DIR)/gds/apb_sys_0.gds.gz \ $(chameleon_DIR)/gds/DMC_32x16HC.gds.gz \ @@ -50,4 +51,3 @@ export ADDITIONAL_LEFS = $(chameleon_DIR)/lef/apb_sys_0.lef \ export FP_PDN_RAIL_WIDTH = 0.48 export FP_PDN_RAIL_OFFSET = 0 export TNS_END_PERCENT = 100 - diff --git a/flow/designs/sky130hd/chameleon/lec_blackbox_stubs.v b/flow/designs/sky130hd/chameleon/lec_blackbox_stubs.v new file mode 100644 index 0000000000..8375c8dd33 --- /dev/null +++ b/flow/designs/sky130hd/chameleon/lec_blackbox_stubs.v @@ -0,0 +1,143 @@ +module DFFRAM_4K ( + CLK, + WE, + EN, + Di, + Do, + A +); + input CLK; + input [3:0] WE; + input EN; + input [31:0] Di; + output [31:0] Do; + input [9:0] A; +endmodule + +module DMC_32x16HC ( + clk, + rst_n, + A, + A_h, + Do, + hit, + line, + wr +); + input clk; + input rst_n; + input [23:0] A; + input [23:0] A_h; + output [31:0] Do; + output hit; + input [127:0] line; + input wr; +endmodule + +module ibex_wrapper ( + HCLK, + HRESETn, + HADDR, + HSIZE, + HTRANS, + HWDATA, + HWRITE, + HRDATA, + HREADY, + NMI, + EXT_IRQ, + IRQ, + SYSTICKCLKDIV +); + input HCLK; + input HRESETn; + output [31:0] HADDR; + output [2:0] HSIZE; + output [1:0] HTRANS; + output [31:0] HWDATA; + output HWRITE; + input [31:0] HRDATA; + input HREADY; + input NMI; + input EXT_IRQ; + input [14:0] IRQ; + input [23:0] SYSTICKCLKDIV; +endmodule + +module apb_sys_0 ( + HCLK, + HRESETn, + HADDR, + HTRANS, + HWRITE, + HWDATA, + HSEL, + HREADY, + HRDATA, + HREADYOUT, + RsRx_S0, + RsTx_S0, + RsRx_S1, + RsTx_S1, + MSI_S2, + MSO_S2, + SSn_S2, + SCLK_S2, + MSI_S3, + MSO_S3, + SSn_S3, + SCLK_S3, + scl_i_S4, + scl_o_S4, + scl_oen_o_S4, + sda_i_S4, + sda_o_S4, + sda_oen_o_S4, + scl_i_S5, + scl_o_S5, + scl_oen_o_S5, + sda_i_S5, + sda_o_S5, + sda_oen_o_S5, + pwm_S6, + pwm_S7, + IRQ +); + input HCLK; + input HRESETn; + input [31:0] HADDR; + input [1:0] HTRANS; + input HWRITE; + input [31:0] HWDATA; + input HSEL; + input HREADY; + output [31:0] HRDATA; + output HREADYOUT; + input [0:0] RsRx_S0; + output [0:0] RsTx_S0; + input [0:0] RsRx_S1; + output [0:0] RsTx_S1; + input [0:0] MSI_S2; + output [0:0] MSO_S2; + output [0:0] SSn_S2; + output [0:0] SCLK_S2; + input [0:0] MSI_S3; + output [0:0] MSO_S3; + output [0:0] SSn_S3; + output [0:0] SCLK_S3; + input [0:0] scl_i_S4; + output [0:0] scl_o_S4; + output [0:0] scl_oen_o_S4; + input [0:0] sda_i_S4; + output [0:0] sda_o_S4; + output [0:0] sda_oen_o_S4; + input [0:0] scl_i_S5; + output [0:0] scl_o_S5; + output [0:0] scl_oen_o_S5; + input [0:0] sda_i_S5; + output [0:0] sda_o_S5; + output [0:0] sda_oen_o_S5; + output [0:0] pwm_S6; + output [0:0] pwm_S7; + output [15:0] IRQ; +endmodule diff --git a/flow/scripts/lec_check.tcl b/flow/scripts/lec_check.tcl index c36b1a4a4a..8e1d35919a 100644 --- a/flow/scripts/lec_check.tcl +++ b/flow/scripts/lec_check.tcl @@ -3,7 +3,25 @@ proc write_lec_verilog { filename } { if { [env_var_exists_and_non_empty REMOVE_CELLS_FOR_LEC] } { lappend remove_cells {*}$::env(REMOVE_CELLS_FOR_LEC) } - write_verilog -remove_cells $remove_cells $::env(RESULTS_DIR)/$filename + set out_file $::env(RESULTS_DIR)/$filename + write_verilog -remove_cells $remove_cells $out_file + + # Add auxiliary Verilog files (e.g., blackbox stubs) for LEC + if { [env_var_exists_and_non_empty LEC_AUX_VERILOG_FILES] } { + set out [open $out_file a] + foreach aux_file $::env(LEC_AUX_VERILOG_FILES) { + if { ![file exists $aux_file] } { + close $out + error "LEC auxiliary Verilog file not found: $aux_file" + } + puts $out "\n// ORFS auxiliary Verilog for Kepler LEC: $aux_file" + set in [open $aux_file r] + fcopy $in $out + close $in + puts $out "" + } + close $out + } } proc write_lec_script { step file1 file2 } { From 89e8ed56d60705fc25c3acf0dcd811020268f6cd Mon Sep 17 00:00:00 2001 From: Jeff Ng Date: Tue, 17 Mar 2026 02:02:27 +0000 Subject: [PATCH 112/202] Metrics update for endcap cell type re-classification Signed-off-by: Jeff Ng --- flow/designs/rapidus2hp/cva6/rules-base.json | 8 ++++---- flow/designs/rapidus2hp/cva6/rules-verific.json | 14 +++++++------- flow/designs/rapidus2hp/ethmac/rules-base.json | 12 ++++++------ .../designs/rapidus2hp/ethmac/rules-verific.json | 10 +++++----- flow/designs/rapidus2hp/gcd/rules-base.json | 16 ++++++++-------- flow/designs/rapidus2hp/gcd/rules-verific.json | 12 ++++++------ .../rapidus2hp/hercules_idecode/rules-base.json | 12 ++++++------ .../hercules_idecode/rules-verific.json | 6 +++--- .../rapidus2hp/hercules_is_int/rules-base.json | 6 +++--- .../hercules_is_int/rules-verific.json | 12 ++++++------ flow/designs/rapidus2hp/ibex/rules-base.json | 12 ++++++------ flow/designs/rapidus2hp/ibex/rules-verific.json | 12 ++++++------ flow/designs/rapidus2hp/jpeg/rules-base.json | 12 ++++++------ flow/designs/rapidus2hp/jpeg/rules-verific.json | 6 +++--- 14 files changed, 75 insertions(+), 75 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index bde2571868..660152dee7 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 167948, + "value": 194724, "compare": "<=" }, "detailedplace__design__violations": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -212.0, + "value": -135.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -584.0, + "value": -452.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -584.0, + "value": -452.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json index 2835bf83b3..0874caf269 100644 --- a/flow/designs/rapidus2hp/cva6/rules-verific.json +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 173997, + "value": 201058, "compare": "<=" }, "detailedplace__design__violations": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.14, + "value": -0.136, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -412.0, + "value": -388.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.358, + "value": -0.279, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -697.0, + "value": -659.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.358, + "value": -0.279, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -697.0, + "value": -550.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/ethmac/rules-base.json b/flow/designs/rapidus2hp/ethmac/rules-base.json index 0dae2ef484..064e9ac89e 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-base.json +++ b/flow/designs/rapidus2hp/ethmac/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0361, + "value": -0.0347, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.538, + "value": -0.453, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0526, + "value": -0.0462, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.44, + "value": -1.07, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0526, + "value": -0.0462, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.44, + "value": -1.07, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/ethmac/rules-verific.json b/flow/designs/rapidus2hp/ethmac/rules-verific.json index 51e09d244e..ca3ba8ad41 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-verific.json +++ b/flow/designs/rapidus2hp/ethmac/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.47, + "value": -0.514, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0514, + "value": -0.0459, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.37, + "value": -0.885, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0514, + "value": -0.0459, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.37, + "value": -0.885, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/gcd/rules-base.json b/flow/designs/rapidus2hp/gcd/rules-base.json index 7631522ba4..c827b4e0dc 100644 --- a/flow/designs/rapidus2hp/gcd/rules-base.json +++ b/flow/designs/rapidus2hp/gcd/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 27, + "value": 36, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 637, + "value": 773, "compare": "<=" }, "detailedplace__design__violations": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.493, + "value": -0.322, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0404, + "value": -0.0397, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.904, + "value": -0.726, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0404, + "value": -0.0397, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.904, + "value": -0.726, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 31, + "value": 40, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/gcd/rules-verific.json b/flow/designs/rapidus2hp/gcd/rules-verific.json index acbd6f9acb..7be0c2bd5f 100644 --- a/flow/designs/rapidus2hp/gcd/rules-verific.json +++ b/flow/designs/rapidus2hp/gcd/rules-verific.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 29, + "value": 37, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 666, + "value": 780, "compare": "<=" }, "detailedplace__design__violations": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.581, + "value": -0.485, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.01, + "value": -1.08, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.01, + "value": -1.08, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 31, + "value": 41, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json index bf712af78c..d54d24eb8d 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0652, + "value": -0.058, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -128.0, + "value": -50.1, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0767, + "value": -0.0724, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -322.0, + "value": -213.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0767, + "value": -0.0724, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -322.0, + "value": -213.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json index 251e75d125..c295096c0a 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -130.0, + "value": -146.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -211.0, + "value": -359.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -211.0, + "value": -359.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json index 8b8619f9f0..059219ead5 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json @@ -28,7 +28,7 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.102, + "value": -0.0909, "compare": ">=" }, "cts__timing__setup__tns": { @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.129, + "value": -0.105, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -64,7 +64,7 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.129, + "value": -0.105, "compare": ">=" }, "finish__timing__setup__tns": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json b/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json index c3b6278e66..447e13eb1f 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0505, + "value": -0.0468, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -179.0, + "value": -147.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.132, + "value": -0.114, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1160.0, + "value": -1010.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.132, + "value": -0.114, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1160.0, + "value": -1010.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/ibex/rules-base.json b/flow/designs/rapidus2hp/ibex/rules-base.json index 3c226224e5..56cda8108f 100644 --- a/flow/designs/rapidus2hp/ibex/rules-base.json +++ b/flow/designs/rapidus2hp/ibex/rules-base.json @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1049, + "value": 1230, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.048, + "value": -0.0344, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -12.8, + "value": -1.02, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.048, + "value": -0.0344, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -12.8, + "value": -1.02, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1088, + "value": 1290, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ibex/rules-verific.json b/flow/designs/rapidus2hp/ibex/rules-verific.json index 6581cd35d2..faed324426 100644 --- a/flow/designs/rapidus2hp/ibex/rules-verific.json +++ b/flow/designs/rapidus2hp/ibex/rules-verific.json @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1060, + "value": 1237, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.085, + "value": -0.0353, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -31.8, + "value": -0.152, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0852, + "value": -0.0353, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -31.8, + "value": -0.152, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1103, + "value": 1292, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/jpeg/rules-base.json b/flow/designs/rapidus2hp/jpeg/rules-base.json index 998e8fd633..cc982f3fc7 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-base.json +++ b/flow/designs/rapidus2hp/jpeg/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0535, + "value": -0.0488, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -39.0, + "value": -37.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0941, + "value": -0.0934, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -148.0, + "value": -144.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0941, + "value": -0.0934, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -148.0, + "value": -144.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/jpeg/rules-verific.json b/flow/designs/rapidus2hp/jpeg/rules-verific.json index 70e1108406..22a5d30717 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-verific.json +++ b/flow/designs/rapidus2hp/jpeg/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -43.6, + "value": -54.4, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -122.0, + "value": -151.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -122.0, + "value": -151.0, "compare": ">=" }, "finish__timing__hold__ws": { From f6508ccf2ea0426ca1ef119f0e583bc79f113f0e Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Tue, 17 Mar 2026 17:41:07 +0900 Subject: [PATCH 113/202] Bump OR: fix net name collision in write_verilog Update OpenROAD to 9b0caf1a52 which includes the unified makeNewNetName fix, resolving wire collision for hierarchical designs (e.g., microwatt CTS LEC "wire collision for net net"). Signed-off-by: Jaehyun Kim --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 7cf7b720fd..9b0caf1a52 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 7cf7b720fd035cd3d114cfb152ecac2ccd7e379f +Subproject commit 9b0caf1a5218ea7f256ea743551d68ce475ba86d From d84eec3dd01ce02454ddc813cb058b68b011a086 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Tue, 17 Mar 2026 19:33:53 +0900 Subject: [PATCH 114/202] Disable kepler-formal LEC for rapidus2hp cva6 KF crashes with assertion failure in SNLLogicCloud.cpp:349: "Iso have no drivers and more than one reader, not supported" Both base and verific variants affected. Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/cva6/config.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index da52a1ca62..2276ce6544 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -148,3 +148,7 @@ export SYNTH_CANONICALIZE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/canoni export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 + +# Disable KF LEC: assertion crash in SNLLogicCloud.cpp:349 +# "Iso have no drivers and more than one reader, not supported" +export LEC_CHECK = 0 From 36c434f866b9bd4aa469ece9d5b99fd39a5644b3 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 17 Mar 2026 13:27:13 +0000 Subject: [PATCH 115/202] update private metrics Signed-off-by: Eder Monteiro --- flow/designs/gf12/ca53/rules-base.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/gf12/ca53/rules-base.json b/flow/designs/gf12/ca53/rules-base.json index 92a7084c78..a2d1eb0a25 100644 --- a/flow/designs/gf12/ca53/rules-base.json +++ b/flow/designs/gf12/ca53/rules-base.json @@ -88,7 +88,7 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -2390.0, + "value": -3000.0, "compare": ">=" }, "finish__design__instance__area": { From 285a2f23b80fe78f880fb55e421c114caec07a85 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 17 Mar 2026 12:56:45 -0300 Subject: [PATCH 116/202] bump or Signed-off-by: Eder Monteiro --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 6210b07558..63ed2e0fe5 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 6210b075580952a4699f73fdf94c34e8c75809ff +Subproject commit 63ed2e0fe5992099b7d528177bbb7a4df9523907 From d40042bdb538f6acea1f8f5ef7f3f0a41231039b Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 18 Mar 2026 03:33:20 +0900 Subject: [PATCH 117/202] Update rapidus2hp/cva6 verific TNS metrics for OR bump Widen globalroute and finish setup TNS thresholds from -697 to -750 to accommodate timing change from OR 9b0caf1a52 (makeNewNetName). Actual: -727.5 (4.4% regression). Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/cva6/rules-verific.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json index 2835bf83b3..e90ad50169 100644 --- a/flow/designs/rapidus2hp/cva6/rules-verific.json +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -697.0, + "value": -750.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -697.0, + "value": -750.0, "compare": ">=" }, "finish__timing__hold__ws": { From d2e2dc762fc8bee76b3974aadb3b57795dc3d9db Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 18 Mar 2026 05:03:38 +0900 Subject: [PATCH 118/202] Update rapidus2hp metrics for OR bump Widen area and TNS thresholds for gcd, ibex, ethmac, jpeg to accommodate changes from OR 9b0caf1a52 (makeNewNetName). Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/ethmac/rules-verific.json | 2 +- flow/designs/rapidus2hp/gcd/rules-base.json | 6 +++--- flow/designs/rapidus2hp/gcd/rules-verific.json | 10 +++++----- flow/designs/rapidus2hp/ibex/rules-base.json | 4 ++-- flow/designs/rapidus2hp/ibex/rules-verific.json | 4 ++-- flow/designs/rapidus2hp/jpeg/rules-verific.json | 6 +++--- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/flow/designs/rapidus2hp/ethmac/rules-verific.json b/flow/designs/rapidus2hp/ethmac/rules-verific.json index 51e09d244e..a5a528d66d 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-verific.json +++ b/flow/designs/rapidus2hp/ethmac/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.47, + "value": -0.52, "compare": ">=" }, "cts__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/gcd/rules-base.json b/flow/designs/rapidus2hp/gcd/rules-base.json index 7631522ba4..7e6a8dc6d2 100644 --- a/flow/designs/rapidus2hp/gcd/rules-base.json +++ b/flow/designs/rapidus2hp/gcd/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 27, + "value": 33, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 637, + "value": 710, "compare": "<=" }, "detailedplace__design__violations": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 31, + "value": 37, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/gcd/rules-verific.json b/flow/designs/rapidus2hp/gcd/rules-verific.json index acbd6f9acb..f81469040d 100644 --- a/flow/designs/rapidus2hp/gcd/rules-verific.json +++ b/flow/designs/rapidus2hp/gcd/rules-verific.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 29, + "value": 34, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 666, + "value": 720, "compare": "<=" }, "detailedplace__design__violations": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.01, + "value": -1.12, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.01, + "value": -1.12, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 31, + "value": 38, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ibex/rules-base.json b/flow/designs/rapidus2hp/ibex/rules-base.json index 3c226224e5..9f1f5f3bff 100644 --- a/flow/designs/rapidus2hp/ibex/rules-base.json +++ b/flow/designs/rapidus2hp/ibex/rules-base.json @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1049, + "value": 1125, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1088, + "value": 1180, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ibex/rules-verific.json b/flow/designs/rapidus2hp/ibex/rules-verific.json index 6581cd35d2..480120ab8c 100644 --- a/flow/designs/rapidus2hp/ibex/rules-verific.json +++ b/flow/designs/rapidus2hp/ibex/rules-verific.json @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1060, + "value": 1130, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1103, + "value": 1180, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/jpeg/rules-verific.json b/flow/designs/rapidus2hp/jpeg/rules-verific.json index 70e1108406..80a2186914 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-verific.json +++ b/flow/designs/rapidus2hp/jpeg/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -43.6, + "value": -48, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -122.0, + "value": -133, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -122.0, + "value": -133, "compare": ">=" }, "finish__timing__hold__ws": { From ac7c02a2aae3ea86ed1c68f2cb5d744c843b4c0b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 17 Mar 2026 20:35:57 +0000 Subject: [PATCH 119/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/asap7/swerv_wrapper/rules-base.json | 2 +- flow/designs/nangate45/ariane136/rules-base.json | 2 +- flow/designs/sky130hd/microwatt/rules-base.json | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flow/designs/asap7/swerv_wrapper/rules-base.json b/flow/designs/asap7/swerv_wrapper/rules-base.json index c0a40d396b..1c5d4f56db 100644 --- a/flow/designs/asap7/swerv_wrapper/rules-base.json +++ b/flow/designs/asap7/swerv_wrapper/rules-base.json @@ -80,7 +80,7 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -160.0, + "value": -276.0, "compare": ">=" }, "finish__timing__setup__tns": { diff --git a/flow/designs/nangate45/ariane136/rules-base.json b/flow/designs/nangate45/ariane136/rules-base.json index 97be8f8aa5..da7d50fb47 100644 --- a/flow/designs/nangate45/ariane136/rules-base.json +++ b/flow/designs/nangate45/ariane136/rules-base.json @@ -40,7 +40,7 @@ "compare": ">=" }, "cts__timing__hold__tns": { - "value": -4.16, + "value": -8.05, "compare": ">=" }, "globalroute__antenna_diodes_count": { diff --git a/flow/designs/sky130hd/microwatt/rules-base.json b/flow/designs/sky130hd/microwatt/rules-base.json index c377034281..dc3dfd9737 100644 --- a/flow/designs/sky130hd/microwatt/rules-base.json +++ b/flow/designs/sky130hd/microwatt/rules-base.json @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 2101, + "value": 2635, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -43.9, + "value": -61.5, "compare": ">=" }, "finish__timing__hold__ws": { @@ -92,7 +92,7 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -18.9, + "value": -22.1, "compare": ">=" }, "finish__design__instance__area": { From 3d9a3f7b533a52255d9a2617180bf8ccbb93a159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Tue, 17 Mar 2026 21:45:35 +0100 Subject: [PATCH 120/202] Strip //:install to developer-only MVP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove Ubuntu dep checking, --skip-openroad flag, and verbose help text. Docs: position Bazel as unsupported developer-only option, CMake first. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- bazel/install.sh | 67 +++------------------------------------ docs/user/BuildLocally.md | 50 +++++++++++++---------------- 2 files changed, 27 insertions(+), 90 deletions(-) diff --git a/bazel/install.sh b/bazel/install.sh index 9b548e4386..983dcf9d9c 100755 --- a/bazel/install.sh +++ b/bazel/install.sh @@ -1,33 +1,22 @@ #!/bin/bash set -e -# ORFS install script -# Single user-facing entry point: bazelisk run //:install +# ORFS developer install script +# Builds and installs OpenROAD, Yosys, and yosys-slang to tools/install/ +# where flow/Makefile expects them. # -# Builds and installs tools to tools/install/ where flow/Makefile expects them. # Uses stamp files for fast no-op re-runs (seconds when nothing changed). WORKSPACE="${BUILD_WORKSPACE_DIRECTORY:-.}" INSTALL_DIR="${WORKSPACE}/tools/install" NUM_THREADS=$(nproc) +BUILD_OPENROAD=1 + usage() { cat <<'EOF' Usage: bazelisk run //:install [-- OPTIONS] -Installs tools required for the ORFS flow/Makefile. - -Installed: - openroad OpenROAD with GUI support - yosys Yosys synthesis tool - yosys-slang Yosys SystemVerilog plugin - -Not yet supported (use sudo ./setup.sh): - klayout KLayout layout viewer - kepler Kepler formal verification - -Nix users: nix develop already provides all tools. See flake.nix. - Options: --help, -h Show this help --skip-openroad Skip OpenROAD build @@ -36,52 +25,6 @@ EOF exit 0 } -# Check for required system dependencies before expensive builds. -# ORFS checks deps for what it builds (yosys/slang). OpenROAD checks -# its own deps in tools/OpenROAD/bazel/install.sh (separation of concerns). -# -# Currently only Ubuntu/Debian is checked. Dependency checking for -# other platforms (macOS, RHEL, Fedora, etc.) is not implemented -# because we cannot test them. Contributions welcome. -check_ubuntu_deps() { - local missing_cmds=() - local missing_pkgs=() - - # Commands needed for yosys build - command -v bison &>/dev/null || { missing_cmds+=(bison); missing_pkgs+=(bison); } - command -v flex &>/dev/null || { missing_cmds+=(flex); missing_pkgs+=(flex); } - command -v gawk &>/dev/null || { missing_cmds+=(gawk); missing_pkgs+=(gawk); } - command -v g++ &>/dev/null || { missing_cmds+=(g++); missing_pkgs+=(g++); } - command -v pkg-config &>/dev/null || { missing_cmds+=(pkg-config); missing_pkgs+=(pkg-config); } - command -v tclsh &>/dev/null || { missing_cmds+=(tclsh); missing_pkgs+=(tcl); } - command -v git &>/dev/null || { missing_cmds+=(git); missing_pkgs+=(git); } - command -v cmake &>/dev/null || { missing_cmds+=(cmake); missing_pkgs+=(cmake); } - - # Dev libraries needed for yosys/slang compilation (check via dpkg) - for pkg in tcl-dev libffi-dev libreadline-dev zlib1g-dev; do - if ! dpkg -s "$pkg" &>/dev/null 2>&1; then - missing_pkgs+=("$pkg") - fi - done - - if [[ ${#missing_pkgs[@]} -gt 0 ]]; then - echo "ERROR: Missing dependencies for Yosys build." - if [[ ${#missing_cmds[@]} -gt 0 ]]; then - echo " Missing commands: ${missing_cmds[*]}" - fi - echo "" - echo "On Ubuntu this would be:" - echo " sudo apt install ${missing_pkgs[*]}" - exit 1 - fi -} - -if command -v dpkg &>/dev/null; then - check_ubuntu_deps -fi - -BUILD_OPENROAD=1 - while [[ $# -gt 0 ]]; do case "$1" in --help|-h) diff --git a/docs/user/BuildLocally.md b/docs/user/BuildLocally.md index f388d64f3e..df09d2de0b 100644 --- a/docs/user/BuildLocally.md +++ b/docs/user/BuildLocally.md @@ -4,23 +4,29 @@ | Path | Prerequisites | sudo? | Best for | |------|--------------|-------|----------| -| **Bazel** | [Bazelisk](https://bazel.build/install/bazelisk) | No | Most users | +| **CMake** | `sudo ./setup.sh` | Yes | Most users | | **Nix** | [Nix](https://github.com/DeterminateSystems/nix-installer) | No | Nix users | -| **CMake** | `sudo ./setup.sh` | Yes | Existing CMake developers | +| **Bazel** | [Bazelisk](https://bazel.build/install/bazelisk) | No | ORFS/OpenROAD developers only, unsupported | -### Bazel (recommended) +### CMake -Install [Bazelisk](https://bazel.build/install/bazelisk) following the -[official instructions](https://bazel.build/install/bazelisk). +The `setup.sh` script installs all of the dependencies, including OpenROAD dependencies, if they are not already installed. + +Supported configurations are: Ubuntu 20.04, Ubuntu 22.04, Ubuntu 22.04(aarch64), RHEL 8, RockyLinux 9 and Debian 11. ``` shell git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts cd OpenROAD-flow-scripts -bazelisk run //:install -cd flow && make +sudo ./setup.sh +./build_openroad.sh --local ``` -For options: `bazelisk run //:install -- --help` +:::{Note} +There is a `build_openroad.log` file that is generated with every +build in the main directory. In case of filing issues, it can be uploaded +in the "Relevant log output" section of OpenROAD-flow-scripts repo +[issue form](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/issues/new?assignees=&labels=&template=bug_report_with_orfs.yml). +::: ### Nix @@ -31,36 +37,24 @@ nix develop cd flow && make ``` -### CMake (existing path) - -## Clone and Install Dependencies +### Bazel -The `setup.sh` script installs all of the dependencies, including OpenROAD dependencies, if they are not already installed. - -Supported configurations are: Ubuntu 20.04, Ubuntu 22.04, Ubuntu 22.04(aarch64), RHEL 8, RockyLinux 9 and Debian 11. +For ORFS/OpenROAD developers. Most of `./setup.sh` isn't needed when +building OpenROAD with Bazel — this provides the bare minimum to build +OpenROAD and test ORFS flows. No sudo required. +Install [Bazelisk](https://bazel.build/install/bazelisk) first. ``` shell git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts cd OpenROAD-flow-scripts -sudo ./setup.sh -``` - -## Build - -``` shell -./build_openroad.sh --local +bazelisk run //:install +cd flow && make ``` -:::{Note} -There is a `build_openroad.log` file that is generated with every -build in the main directory. In case of filing issues, it can be uploaded -in the "Relevant log output" section of OpenROAD-flow-scripts repo -[issue form](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/issues/new?assignees=&labels=&template=bug_report_with_orfs.yml). -::: ## Verify Installation The binaries should be available on your `$PATH` after setting -up the environment. The `make` command runs from RTL-GDSII generation for default design `gcd` with `nangate45` PDK. +up the environment. The `make` command runs from RTL-GDSII generation for default design `gcd` with `nangate45` PDK. ``` shell source ./env.sh From d523296236393aa710d84eb20b9aa776162b5274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Tue, 17 Mar 2026 22:53:22 +0100 Subject: [PATCH 121/202] Strip //:install to developer-only MVP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add cross-platform dep checking (Ubuntu, RHEL, macOS, openSUSE). Remove verbose help text. Docs: replace outdated Bazel section with //:install, mark as unsupported developer-only path. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- bazel/install.sh | 34 +++++++++++++++++++ docs/user/BuildLocally.md | 70 +++++++++++++++++++-------------------- 2 files changed, 69 insertions(+), 35 deletions(-) diff --git a/bazel/install.sh b/bazel/install.sh index 983dcf9d9c..7c076b7480 100755 --- a/bazel/install.sh +++ b/bazel/install.sh @@ -11,6 +11,40 @@ WORKSPACE="${BUILD_WORKSPACE_DIRECTORY:-.}" INSTALL_DIR="${WORKSPACE}/tools/install" NUM_THREADS=$(nproc) +# --- Check system dependencies for yosys/slang builds --- +check_deps() { + local missing_cmds=() + + for cmd in bison flex gawk g++ pkg-config tclsh git cmake; do + if ! command -v "$cmd" &>/dev/null; then + missing_cmds+=("$cmd") + fi + done + + if [[ ${#missing_cmds[@]} -eq 0 ]]; then + return + fi + + echo "ERROR: Missing commands: ${missing_cmds[*]}" + echo "" + + # Platform-specific install hint + if [[ "$(uname -s)" == "Darwin" ]]; then + echo " brew install bison flex gawk cmake pkg-config tcl-tk" + elif command -v apt-get &>/dev/null; then + echo " sudo apt-get install bison flex gawk g++ pkg-config tcl cmake git" + elif command -v dnf &>/dev/null; then + echo " sudo dnf install bison flex gawk gcc-c++ pkgconf tcl cmake git" + elif command -v yum &>/dev/null; then + echo " sudo yum install bison flex gawk gcc-c++ pkgconf tcl cmake git" + elif command -v zypper &>/dev/null; then + echo " sudo zypper install bison flex gawk gcc-c++ pkg-config tcl cmake git" + fi + exit 1 +} + +check_deps + BUILD_OPENROAD=1 usage() { diff --git a/docs/user/BuildLocally.md b/docs/user/BuildLocally.md index df09d2de0b..17ed45db5b 100644 --- a/docs/user/BuildLocally.md +++ b/docs/user/BuildLocally.md @@ -1,14 +1,6 @@ # Build from sources locally -## Choose Your Build Path - -| Path | Prerequisites | sudo? | Best for | -|------|--------------|-------|----------| -| **CMake** | `sudo ./setup.sh` | Yes | Most users | -| **Nix** | [Nix](https://github.com/DeterminateSystems/nix-installer) | No | Nix users | -| **Bazel** | [Bazelisk](https://bazel.build/install/bazelisk) | No | ORFS/OpenROAD developers only, unsupported | - -### CMake +## Clone and Install Dependencies The `setup.sh` script installs all of the dependencies, including OpenROAD dependencies, if they are not already installed. @@ -18,26 +10,9 @@ Supported configurations are: Ubuntu 20.04, Ubuntu 22.04, Ubuntu 22.04(aarch64), git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts cd OpenROAD-flow-scripts sudo ./setup.sh -./build_openroad.sh --local -``` - -:::{Note} -There is a `build_openroad.log` file that is generated with every -build in the main directory. In case of filing issues, it can be uploaded -in the "Relevant log output" section of OpenROAD-flow-scripts repo -[issue form](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/issues/new?assignees=&labels=&template=bug_report_with_orfs.yml). -::: - -### Nix - -``` shell -git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts -cd OpenROAD-flow-scripts -nix develop -cd flow && make ``` -### Bazel +## Using Bazel to build OpenROAD and run the ORFS flow (unsupported) For ORFS/OpenROAD developers. Most of `./setup.sh` isn't needed when building OpenROAD with Bazel — this provides the bare minimum to build @@ -51,10 +26,22 @@ bazelisk run //:install cd flow && make ``` +## Build + +``` shell +./build_openroad.sh --local +``` +:::{Note} +There is a `build_openroad.log` file that is generated with every +build in the main directory. In case of filing issues, it can be uploaded +in the "Relevant log output" section of OpenROAD-flow-scripts repo +[issue form](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/issues/new?assignees=&labels=&template=bug_report_with_orfs.yml). +::: + ## Verify Installation The binaries should be available on your `$PATH` after setting -up the environment. The `make` command runs from RTL-GDSII generation for default design `gcd` with `nangate45` PDK. +up the environment. The `make` command runs from RTL-GDSII generation for default design `gcd` with `nangate45` PDK. ``` shell source ./env.sh @@ -82,22 +69,35 @@ Set up environment variables using `dev_env.sh`, then start Visual Studio Code. code tools/OpenROAD/ ``` -## Build and run ORFS flows with Bazel +## Build OpenROAD and run a few ORFS flows with Bazel + +Local use case: + +- Install Bazelisk and no other dependencies, no need to run `sudo ./setup.sh` +- Modify & build OpenROAD +- Test built OpenROAD with a few ORFS flows + +The Bazel support in OpenROAD and ORFS is work in progress and some Bazel experience is recommended before going spelunking in the Bazel builds. -ORFS uses [bazel-orfs](https://github.com/The-OpenROAD-Project/bazel-orfs) to run -the flow entirely within Bazel. This is separate from `bazelisk run //:install` above -which installs tools for the Makefile-based flow. +Contributions welcome! -To build a design with Bazel: +To build `designs/asap7/gcd:gcd_floorplan`: cd flow - bazelisk build designs/asap7/gcd:gcd_floorplan + (cd ../tools/OpenROAD && bazel build :openroad -c opt) && bazelisk build designs/asap7/gcd:gcd_floorplan -Or to run all flows currently available in Bazel: +Or to run all flows currently available in Bazel + + cd flow + (cd ../tools/OpenROAD && bazel build :openroad -c opt) && bazelisk build ... + +Note! ORFS uses the OpenROAD Bazel built binary in stop-gap way until OpenROAD has been switched to bzlmod, after which to build all flows becomes simpler as ORFS will build the requisite OpenROAD directly: cd flow bazelisk build ... +ORFS uses [bazel-orfs](https://github.com/The-OpenROAD-Project/bazel-orfs) to implement the flow and gets some depedencies, like yosys, from the Docker image. Over time, all dependencies should be built with Bazel and the dependency on the ORFS Docker image will be phased out. + ### Upgrading MODULE.bazel with the latest bazel-orfs and ORFS Docker image Run: From 62aa107c9c7556a43ad29a525c4ca801bc5533ea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 17 Mar 2026 22:30:55 +0000 Subject: [PATCH 122/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/nangate45/bp_multi_top/rules-base.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index 56e5c9c67e..f2e45fdecf 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -92,7 +92,7 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.96, + "value": -2.35, "compare": ">=" }, "finish__design__instance__area": { From 15e16d8ac96655a9c42d92009ec1a16866c33373 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 18 Mar 2026 07:34:49 +0900 Subject: [PATCH 123/202] Update rapidus2hp cva6/hercules_idecode metrics for OR bump MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cva6/verific: widen stdcell count (173997→183000), CTS WS (-0.14→-0.15) hercules_idecode/verific: widen CTS/GRT/finish TNS thresholds for timing regression from OR 9b0caf1a52. Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/cva6/rules-verific.json | 4 ++-- flow/designs/rapidus2hp/hercules_idecode/rules-verific.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json index e90ad50169..66d9fea0d0 100644 --- a/flow/designs/rapidus2hp/cva6/rules-verific.json +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 173997, + "value": 183000, "compare": "<=" }, "detailedplace__design__violations": { @@ -28,7 +28,7 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.14, + "value": -0.15, "compare": ">=" }, "cts__timing__setup__tns": { diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json index 251e75d125..3560e6e362 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -130.0, + "value": -155.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -211.0, + "value": -315.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -211.0, + "value": -315.0, "compare": ">=" }, "finish__timing__hold__ws": { From 4c65f9753987b5e29edf0bd13f1df02f8fc3ef7c Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 18 Mar 2026 08:34:30 +0900 Subject: [PATCH 124/202] Trigger CI rebuild Empty commit to retrigger sync and Jenkins PR-merge build. Signed-off-by: Jaehyun Kim From b61b1a82b4e37486d4018486589791121d654229 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 18 Mar 2026 09:37:53 +0900 Subject: [PATCH 125/202] Enable KF LEC for nangate45/mempool_group and rapidus2hp/cva6 Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/mempool_group/config.mk | 2 -- flow/designs/rapidus2hp/cva6/config.mk | 4 ---- 2 files changed, 6 deletions(-) diff --git a/flow/designs/nangate45/mempool_group/config.mk b/flow/designs/nangate45/mempool_group/config.mk index d0121653ce..115c2012c5 100644 --- a/flow/designs/nangate45/mempool_group/config.mk +++ b/flow/designs/nangate45/mempool_group/config.mk @@ -78,5 +78,3 @@ export CORE_AREA = 10 12 1090 1090 export MACRO_PLACE_HALO = 10 10 export SYNTH_HDL_FRONTEND = slang - -export LEC_CHECK = 0 diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index 2276ce6544..da52a1ca62 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -148,7 +148,3 @@ export SYNTH_CANONICALIZE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/canoni export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -# Disable KF LEC: assertion crash in SNLLogicCloud.cpp:349 -# "Iso have no drivers and more than one reader, not supported" -export LEC_CHECK = 0 From f61b4cce845dd2f8aa9cc902fd652044804d6711 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 18 Mar 2026 11:06:50 +0900 Subject: [PATCH 126/202] Disable KF LEC for nangate45/mempool_group and rapidus2hp/cva6 The bumped kepler-formal still has bugs for these designs: - nangate45/mempool_group: assertion crash in SNLLogicCloud.cpp:349 "Iso have no drivers and more than one reader, not supported" - rapidus2hp/cva6: netlist loading failure bus net "icache_areq_o" cannot be found in ALU module Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/mempool_group/config.mk | 4 ++++ flow/designs/rapidus2hp/cva6/config.mk | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/flow/designs/nangate45/mempool_group/config.mk b/flow/designs/nangate45/mempool_group/config.mk index 115c2012c5..05028370a7 100644 --- a/flow/designs/nangate45/mempool_group/config.mk +++ b/flow/designs/nangate45/mempool_group/config.mk @@ -78,3 +78,7 @@ export CORE_AREA = 10 12 1090 1090 export MACRO_PLACE_HALO = 10 10 export SYNTH_HDL_FRONTEND = slang + +# Disable KF LEC: assertion crash in SNLLogicCloud.cpp:349 +# "Iso have no drivers and more than one reader, not supported" +export LEC_CHECK = 0 diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index da52a1ca62..7bf2960f70 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -148,3 +148,7 @@ export SYNTH_CANONICALIZE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/canoni export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 + +# Disable KF LEC: netlist loading failure +# bus net "icache_areq_o" cannot be found in ALU module +export LEC_CHECK = 0 From ac3a2ee3ae794411b1e6c4d410cb43e54819cd97 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 18 Mar 2026 16:44:37 +0900 Subject: [PATCH 127/202] Update rapidus2hp cva6 metrics designs/rapidus2hp/cva6/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__timing__setup__tns | -452.0 | -463.0 | Failing | | finish__timing__setup__tns | -452.0 | -463.0 | Failing | designs/rapidus2hp/cva6/rules-verific.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | placeopt__design__instance__count__stdcell | 201058 | 200149 | Tighten | | cts__timing__setup__ws | -0.136 | -0.167 | Failing | | finish__timing__setup__tns | -550.0 | -738.0 | Failing | Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/cva6/rules-base.json | 4 ++-- flow/designs/rapidus2hp/cva6/rules-verific.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index 660152dee7..33692c2452 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -452.0, + "value": -463.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -452.0, + "value": -463.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json index 0874caf269..a9f6e0acca 100644 --- a/flow/designs/rapidus2hp/cva6/rules-verific.json +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 201058, + "value": 200149, "compare": "<=" }, "detailedplace__design__violations": { @@ -28,7 +28,7 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.136, + "value": -0.167, "compare": ">=" }, "cts__timing__setup__tns": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -550.0, + "value": -738.0, "compare": ">=" }, "finish__timing__hold__ws": { From 59a405693c123f7ee2dc57ad9f4d50c9954fecd6 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Wed, 18 Mar 2026 21:04:43 +0900 Subject: [PATCH 128/202] Update nangate45 swerv_wrapper metrics designs/nangate45/swerv_wrapper/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__setup__ws | -0.197 | -0.466 | Failing | | cts__timing__setup__tns | -84.6 | -290.0 | Failing | | globalroute__timing__setup__tns | -86.3 | -211.0 | Failing | | detailedroute__route__wirelength | 5546498 | 4367567 | Tighten | | finish__timing__setup__tns | -88.2 | -198.0 | Failing | Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/swerv_wrapper/rules-base.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index c12bf4610f..3d97a130ed 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.197, + "value": -0.466, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -84.6, + "value": -290.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -86.3, + "value": -211.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 5546498, + "value": 4367567, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -88.2, + "value": -198.0, "compare": ">=" }, "finish__timing__hold__ws": { From 4082ae407fc033449404b44644151afe0e295472 Mon Sep 17 00:00:00 2001 From: Vitor Bandeira Date: Wed, 18 Mar 2026 15:06:56 +0000 Subject: [PATCH 129/202] Bump CI version - remove mock-array - remove delta_debug Signed-off-by: Vitor Bandeira --- flow/test/test_delta_debug.sh | 4 ---- jenkins/public_nightly.Jenkinsfile | 2 +- jenkins/public_tests_all.Jenkinsfile | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100755 flow/test/test_delta_debug.sh diff --git a/flow/test/test_delta_debug.sh b/flow/test/test_delta_debug.sh deleted file mode 100755 index f8c1d2f99e..0000000000 --- a/flow/test/test_delta_debug.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -# -# Delete me when this file is no longer invoked from Jenkins CI - diff --git a/jenkins/public_nightly.Jenkinsfile b/jenkins/public_nightly.Jenkinsfile index 02c1261812..40d22ed41f 100644 --- a/jenkins/public_nightly.Jenkinsfile +++ b/jenkins/public_nightly.Jenkinsfile @@ -1,4 +1,4 @@ -@Library('utils@orfs-v2.3.6') _ +@Library('utils@orfs-v2.3.7') _ node { diff --git a/jenkins/public_tests_all.Jenkinsfile b/jenkins/public_tests_all.Jenkinsfile index 267804ea5a..f1bff92d92 100644 --- a/jenkins/public_tests_all.Jenkinsfile +++ b/jenkins/public_tests_all.Jenkinsfile @@ -1,4 +1,4 @@ -@Library('utils@orfs-v2.3.6') _ +@Library('utils@orfs-v2.3.7') _ node { From 5d9832d326b4a21dd16b302ee5911301444b0540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Thu, 19 Mar 2026 00:04:13 +0100 Subject: [PATCH 130/202] Rename //:install to //:install_for_bazel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address review feedback: make it clear this is not a general-purpose installer but specifically for bazel-orfs developers. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- BUILD.bazel | 2 +- bazel/install.sh | 2 +- docs/user/BuildLocally.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index f0f4077bf3..21e694405f 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,6 +1,6 @@ load("@rules_shell//shell:sh_binary.bzl", "sh_binary") sh_binary( - name = "install", + name = "install_for_bazel", srcs = ["bazel/install.sh"], ) diff --git a/bazel/install.sh b/bazel/install.sh index 7c076b7480..21a3f48c01 100755 --- a/bazel/install.sh +++ b/bazel/install.sh @@ -49,7 +49,7 @@ BUILD_OPENROAD=1 usage() { cat <<'EOF' -Usage: bazelisk run //:install [-- OPTIONS] +Usage: bazelisk run //:install_for_bazel [-- OPTIONS] Options: --help, -h Show this help diff --git a/docs/user/BuildLocally.md b/docs/user/BuildLocally.md index 17ed45db5b..120b4f943e 100644 --- a/docs/user/BuildLocally.md +++ b/docs/user/BuildLocally.md @@ -22,7 +22,7 @@ Install [Bazelisk](https://bazel.build/install/bazelisk) first. ``` shell git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts cd OpenROAD-flow-scripts -bazelisk run //:install +bazelisk run //:install_for_bazel cd flow && make ``` From f249506858d86204863a1ec95099f1d43f202303 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 19 Mar 2026 14:02:21 +0000 Subject: [PATCH 131/202] log read_sdc Signed-off-by: Matt Liberty --- flow/scripts/load.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/scripts/load.tcl b/flow/scripts/load.tcl index 23ea45dc27..34a680b7a4 100644 --- a/flow/scripts/load.tcl +++ b/flow/scripts/load.tcl @@ -32,7 +32,7 @@ proc load_design { design_file sdc_file } { } # Read SDC file - read_sdc $::env(RESULTS_DIR)/$sdc_file + log_cmd read_sdc $::env(RESULTS_DIR)/$sdc_file if { [file exists $::env(PLATFORM_DIR)/derate.tcl] } { log_cmd source $::env(PLATFORM_DIR)/derate.tcl From d6457772772b86bdc485a54e00412f10671e7644 Mon Sep 17 00:00:00 2001 From: Arthur Koucher Date: Thu, 19 Mar 2026 23:11:26 +0000 Subject: [PATCH 132/202] use segments' total capacitance when fetching parasitics data Signed-off-by: Arthur Koucher --- flow/util/write_segment_rc.tcl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flow/util/write_segment_rc.tcl b/flow/util/write_segment_rc.tcl index 90662e41a5..5b6a1e3274 100644 --- a/flow/util/write_segment_rc.tcl +++ b/flow/util/write_segment_rc.tcl @@ -40,8 +40,10 @@ proc fetch_segments_rc { net_to_segments_var } { set height [$shape getDY] set length_um [ord::dbu_to_microns [expr { max($width, $height) }]] - set resistance [$rseg getResistance 0] - set capacitance [$rseg getCapacitance 0] + # Default corner + set corner 0 + set resistance [$rseg getResistance $corner] + set capacitance [$rseg getTotalCapacitance $corner] lappend segments $layer $length_um $resistance $capacitance lappend seen_shape_ids $shape_id From b4fd3d04243e6e8c4d09fba767f707989a13635f Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Fri, 20 Mar 2026 14:20:56 -0300 Subject: [PATCH 133/202] get latest openroad version Signed-off-by: Eder Monteiro --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 63ed2e0fe5..a1ac31a843 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 63ed2e0fe5992099b7d528177bbb7a4df9523907 +Subproject commit a1ac31a8431b1747e4f72b05afbe09761c2e932b From 53e89d3eb84bd9c7396bc8aa8553919711de329c Mon Sep 17 00:00:00 2001 From: Sahil Jaiswal Date: Sat, 21 Mar 2026 04:25:21 +0530 Subject: [PATCH 134/202] setup: improve macOS handling in setup and dependency installer Signed-off-by: Sahil Jaiswal --- etc/DependencyInstaller.sh | 6 +++++- setup.sh | 27 +++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index 3a80d3764f..f2459dfe60 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -11,7 +11,11 @@ fi # package versions klayoutVersion=0.30.3 -numThreads=$(nproc) +if [[ "$OSTYPE" == "darwin"* ]]; then + numThreads=$(sysctl -n hw.ncpu) +else + numThreads=$(nproc) +fi _versionCompare() { local a b IFS=. ; set -f diff --git a/setup.sh b/setup.sh index 22a84cfea8..d2a65ce69d 100755 --- a/setup.sh +++ b/setup.sh @@ -5,8 +5,19 @@ set -euo pipefail # allow this script to be invoked from any folder DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -if [ $EUID -ne 0 ]; then - echo "This script must be run with sudo" +# macOS detection +IS_DARWIN=false +if [[ "$(uname)" == "Darwin" ]]; then + IS_DARWIN=true +fi + +if $IS_DARWIN && [[ $EUID -eq 0 ]]; then + echo "Do NOT run this script with sudo on macOS" + exit 1 +fi + +if ! $IS_DARWIN && [[ $EUID -ne 0 ]]; then + echo "This script must be run with sudo on Linux" exit 1 fi @@ -17,7 +28,11 @@ tmpfile=$(mktemp) git submodule status --recursive > "$tmpfile" if grep -q "^-" "$tmpfile"; then - sudo -u $SUDO_USER git submodule update --init --recursive + if $IS_DARWIN; then + git submodule update --init --recursive + else + sudo -u $SUDO_USER git submodule update --init --recursive + fi elif grep -q "^+" "$tmpfile"; then # Make it easy for users who are not hacking ORFS to do the right thing, # run with current submodules, at the cost of having ORFS @@ -27,4 +42,8 @@ elif grep -q "^+" "$tmpfile"; then fi "$DIR/etc/DependencyInstaller.sh" -base -sudo -u $SUDO_USER "$DIR/etc/DependencyInstaller.sh" -common -prefix="$DIR/dependencies" +if $IS_DARWIN; then + "$DIR/etc/DependencyInstaller.sh" -common -prefix="$DIR/dependencies" +else + sudo -u $SUDO_USER "$DIR/etc/DependencyInstaller.sh" -common -prefix="$DIR/dependencies" +fi From f9f7b5eaa1643fbdf2b1a2fc9a2734b68dca59f6 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sat, 21 Mar 2026 17:53:07 +0900 Subject: [PATCH 135/202] Bump OR (Fix cloned ICG location collision in CTS) Signed-off-by: Jaehyun Kim --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 9b0caf1a52..4c1ab98eef 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 9b0caf1a5218ea7f256ea743551d68ce475ba86d +Subproject commit 4c1ab98eefe90519258527d5d5801fe7e3e4deb2 From 4cac04623cfc8ea141e97910b9c4c55589d45e6b Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sat, 21 Mar 2026 17:59:00 +0900 Subject: [PATCH 136/202] Rebump OR Signed-off-by: Jaehyun Kim --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 4c1ab98eef..6be2024cca 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 4c1ab98eefe90519258527d5d5801fe7e3e4deb2 +Subproject commit 6be2024cca95b262e2bc33896ba23e26f8f84f90 From 59c0410751669fdda7c445f3f1f38f8b6eda45c2 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Sat, 21 Mar 2026 18:02:27 +0900 Subject: [PATCH 137/202] Enable KF (LEC_CHECK=1) for nangate45/mempool_group and rapidus2hp/cva6 Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/mempool_group/config.mk | 4 ---- flow/designs/rapidus2hp/cva6/config.mk | 4 ---- 2 files changed, 8 deletions(-) diff --git a/flow/designs/nangate45/mempool_group/config.mk b/flow/designs/nangate45/mempool_group/config.mk index 05028370a7..115c2012c5 100644 --- a/flow/designs/nangate45/mempool_group/config.mk +++ b/flow/designs/nangate45/mempool_group/config.mk @@ -78,7 +78,3 @@ export CORE_AREA = 10 12 1090 1090 export MACRO_PLACE_HALO = 10 10 export SYNTH_HDL_FRONTEND = slang - -# Disable KF LEC: assertion crash in SNLLogicCloud.cpp:349 -# "Iso have no drivers and more than one reader, not supported" -export LEC_CHECK = 0 diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index 7bf2960f70..da52a1ca62 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -148,7 +148,3 @@ export SYNTH_CANONICALIZE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/canoni export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -# Disable KF LEC: netlist loading failure -# bus net "icache_areq_o" cannot be found in ALU module -export LEC_CHECK = 0 From 98baadd21882748cf3be3d3cab28499e57156dc1 Mon Sep 17 00:00:00 2001 From: Sahil Jaiswal Date: Sun, 22 Mar 2026 00:39:32 +0530 Subject: [PATCH 138/202] Follow existing coding style Signed-off-by: Sahil Jaiswal --- setup.sh | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/setup.sh b/setup.sh index d2a65ce69d..b9f2853e1e 100755 --- a/setup.sh +++ b/setup.sh @@ -5,18 +5,12 @@ set -euo pipefail # allow this script to be invoked from any folder DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -# macOS detection -IS_DARWIN=false -if [[ "$(uname)" == "Darwin" ]]; then - IS_DARWIN=true -fi - -if $IS_DARWIN && [[ $EUID -eq 0 ]]; then +if [[ "$OSTYPE" == "darwin"* ]] && [[ $EUID -eq 0 ]]; then echo "Do NOT run this script with sudo on macOS" exit 1 fi -if ! $IS_DARWIN && [[ $EUID -ne 0 ]]; then +if [[ "$OSTYPE" != "darwin"* ]] && [[ $EUID -ne 0 ]]; then echo "This script must be run with sudo on Linux" exit 1 fi @@ -28,7 +22,7 @@ tmpfile=$(mktemp) git submodule status --recursive > "$tmpfile" if grep -q "^-" "$tmpfile"; then - if $IS_DARWIN; then + if [[ "$OSTYPE" == "darwin"* ]]; then git submodule update --init --recursive else sudo -u $SUDO_USER git submodule update --init --recursive @@ -42,7 +36,7 @@ elif grep -q "^+" "$tmpfile"; then fi "$DIR/etc/DependencyInstaller.sh" -base -if $IS_DARWIN; then +if [[ "$OSTYPE" == "darwin"* ]]; then "$DIR/etc/DependencyInstaller.sh" -common -prefix="$DIR/dependencies" else sudo -u $SUDO_USER "$DIR/etc/DependencyInstaller.sh" -common -prefix="$DIR/dependencies" From b02a2c3ea5c0e4a5f9c713b89922f1eb19ac14da Mon Sep 17 00:00:00 2001 From: Divinesoumyadip Date: Sun, 22 Mar 2026 17:37:14 +0000 Subject: [PATCH 139/202] setup: fix macOS thread count using hw.logicalcpu instead of hw.ncpu Signed-off-by: Divinesoumyadip --- etc/DependencyInstaller.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index f2459dfe60..8e07047fc6 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -12,7 +12,7 @@ fi # package versions klayoutVersion=0.30.3 if [[ "$OSTYPE" == "darwin"* ]]; then - numThreads=$(sysctl -n hw.ncpu) + numThreads=$(sysctl -n hw.logicalcpu) else numThreads=$(nproc) fi From 9d36f7efb4759993f04f264a3103094592246e5b Mon Sep 17 00:00:00 2001 From: Vi-shub Date: Mon, 23 Mar 2026 10:50:00 +0530 Subject: [PATCH 140/202] [Flow] V2 Fix variable name bug in gen_report() - gen_report() in flow/util/genReport.py incorrectly referenced the global iteration variable 'd' instead of the function parameter 'data' on line 173. - Changed d['drcs'] to data['drcs'] to fix the logic bug. Signed-off-by: Vi-shub --- flow/util/genReport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/util/genReport.py b/flow/util/genReport.py index f08fdd20e6..5134f4895b 100755 --- a/flow/util/genReport.py +++ b/flow/util/genReport.py @@ -170,7 +170,7 @@ def gen_report(name, data): args.verbose - 2, ) - if len(d["drcs"].keys()) > 0: + if len(data["drcs"].keys()) > 0: if data["status"] == STATUS_GREEN: output += " Design has the violations under the allowed limit: " else: From 840b438757057ee08439a22bf2cc8693eb637f4f Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Mon, 23 Mar 2026 12:03:15 -0300 Subject: [PATCH 141/202] bump or Signed-off-by: Eder Monteiro --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index a1ac31a843..7cbe62ead0 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit a1ac31a8431b1747e4f72b05afbe09761c2e932b +Subproject commit 7cbe62ead06f25de0e159ac776113a4fea2df237 From ebb3b977c43b5a1b6d9df632a5d1636870f036f9 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Mon, 23 Mar 2026 19:02:20 +0000 Subject: [PATCH 142/202] bump or again Signed-off-by: Eder Monteiro --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 7cbe62ead0..4589d89a40 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 7cbe62ead06f25de0e159ac776113a4fea2df237 +Subproject commit 4589d89a4015fe19e60880907a3e76777f0dce50 From 88613cfa53c99a549bb479adc12cbdfa1e532425 Mon Sep 17 00:00:00 2001 From: Vi-shub Date: Tue, 24 Mar 2026 00:58:44 +0530 Subject: [PATCH 143/202] [Flow] Fix potential division-by-zero crash in report_metrics.tcl - Added a protective check before calculating path_slack / path_delay percentage. - Prevents TCL fatal errors on designs with 0-delay critical paths. Signed-off-by: Vi-shub --- flow/scripts/report_metrics.tcl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/flow/scripts/report_metrics.tcl b/flow/scripts/report_metrics.tcl index edfa501dd9..5accb72a34 100644 --- a/flow/scripts/report_metrics.tcl +++ b/flow/scripts/report_metrics.tcl @@ -224,7 +224,11 @@ proc report_metrics { stage when { include_erc true } { include_clock_skew true report_puts "\n==========================================================================" report_puts "$when slack div critical path delay" report_puts "--------------------------------------------------------------------------" - report_puts "[format "%4f" [expr $path_slack / $path_delay * 100]]" + if { $path_delay != 0.0 } { + report_puts "[format "%4f" [expr $path_slack / $path_delay * 100]]" + } else { + report_puts "N/A (0 delay)" + } } report_puts "\n==========================================================================" From 9a3aa3d06ab0c9a5ffc379005d64dae65087d70b Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Mon, 23 Mar 2026 20:13:25 +0000 Subject: [PATCH 144/202] update private metrics Signed-off-by: Eder Monteiro --- flow/designs/rapidus2hp/cva6/rules-base.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index 660152dee7..ab7e31e07d 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 194724, + "value": 164719, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 14604, + "value": 14323, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 14604, + "value": 14323, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0943, + "value": -0.14, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -135.0, + "value": -168.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 143, + "value": 138, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.292, + "value": -0.194, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -452.0, + "value": -244.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.292, + "value": -0.194, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -452.0, + "value": -244.0, "compare": ">=" }, "finish__timing__hold__ws": { From 055b7db10307c1863427bf85d03aea98fcc49346 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Mar 2026 22:20:47 +0000 Subject: [PATCH 145/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/nangate45/swerv_wrapper/rules-base.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index c12bf4610f..915f52719e 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -84.6, + "value": -89.7, "compare": ">=" }, "cts__timing__hold__ws": { From d32df4feb6f7bae62de91beb322f789c47c06c2e Mon Sep 17 00:00:00 2001 From: Arthur Koucher Date: Fri, 20 Mar 2026 19:56:42 +0000 Subject: [PATCH 146/202] fetch segments rc also from nets which are not top-level Signed-off-by: Arthur Koucher --- flow/util/write_segment_rc.tcl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/util/write_segment_rc.tcl b/flow/util/write_segment_rc.tcl index 5b6a1e3274..05ce8b30a7 100644 --- a/flow/util/write_segment_rc.tcl +++ b/flow/util/write_segment_rc.tcl @@ -3,7 +3,7 @@ proc fetch_segments_rc { net_to_segments_var } { upvar 1 $net_to_segments_var net_to_segments - foreach sta_net [get_nets *] { + foreach sta_net [get_nets -hierarchical *] { set db_net [sta::sta_to_db_net $sta_net] set type [$db_net getSigType] @@ -69,7 +69,7 @@ proc write_segment_rc_csv { filename net_to_segments_var } { puts $stream "" # Then, write the parasitics data of each wire segment. - foreach sta_net [get_nets *] { + foreach sta_net [get_nets -hierarchical *] { set net_name [get_full_name $sta_net] if { ![info exists net_to_segments($net_name)] } { From 19ddf5987fe5055cded3d53967071c7f1f8c470b Mon Sep 17 00:00:00 2001 From: Arthur Koucher Date: Mon, 23 Mar 2026 17:19:36 +0000 Subject: [PATCH 147/202] add ability to compute set_wire_rc values with new RC regression mode Signed-off-by: Arthur Koucher --- flow/util/correlateRC.py | 57 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/flow/util/correlateRC.py b/flow/util/correlateRC.py index 230a89b1c7..5c49e8384b 100755 --- a/flow/util/correlateRC.py +++ b/flow/util/correlateRC.py @@ -98,6 +98,7 @@ def makeDict(): layer_segments = defaultdict( lambda: {"lengths": [], "resistances": [], "capacitances": []} ) +layer_net_type_length = defaultdict(lambda: defaultdict(float)) routing_layers = [] routing_layers_line = None @@ -150,6 +151,7 @@ def makeDict(): layer_segments[tokens[2]]["lengths"].append(float(tokens[3])) layer_segments[tokens[2]]["resistances"].append(float(tokens[4])) layer_segments[tokens[2]]["capacitances"].append(float(tokens[5])) + layer_net_type_length[tokens[2]][tokens[1]] += float(tokens[3]) else: netName = tokens[0] @@ -372,6 +374,9 @@ def generic_rc_fit(type_sieve): if args.mode == "segment": print("\nUnits: resistance [{}/um], capacitance [{}/um]".format(res_unit, cap_unit)) + # Note that the .csv data comes from ODB which stores capacitance in fF. + cap_ff_to_f = 1e-15 + layer_models = {} for layer_name in routing_layers: # There may be routing layers with no segments, so we check if the @@ -422,7 +427,57 @@ def generic_rc_fit(type_sieve): "set_layer_rc -layer {} -resistance {:.5E} -capacitance {:.5E}".format( layer_name, res_model.coef_[0] / res_scale, - cap_model.coef_[0] * 1e-15 / cap_scale, + cap_model.coef_[0] * cap_ff_to_f / cap_scale, + ) + ) + print("") + + def wire_rc_fit(target_net_type=None): + total_length = 0.0 + total_resistance = 0.0 + total_capacitance = 0.0 + + for layer_name, (res_model, cap_model, lengths, _, _) in layer_models.items(): + if target_net_type is not None: + layer_length = sum( + layer_net_type_length[layer_name][net_type] + for net_type in target_net_type + ) + else: + layer_length = float(lengths.sum()) + + total_resistance += res_model.coef_[0] * layer_length + total_capacitance += cap_model.coef_[0] * layer_length + total_length += layer_length + + if total_length == 0.0: + return None + + return ( + total_resistance / total_length / res_scale, + total_capacitance / total_length * cap_ff_to_f / cap_scale, + ) + + resistance, capacitance = wire_rc_fit() + + print( + "set_wire_rc -resistance {:.5E} -capacitance {:.5E}".format( + resistance, capacitance + ) + ) + + for net_type in ["signal", "clock"]: + result = wire_rc_fit([net_type]) + + if result is None: + print("[Warning] No {} nets were found.".format(net_type)) + continue + + resistance, capacitance = result + + print( + "set_wire_rc -{} -resistance {:.5E} -capacitance {:.5E}".format( + net_type, resistance, capacitance ) ) print("") From 467132e43fb88830e3f824b81a665242daeb37f9 Mon Sep 17 00:00:00 2001 From: ctkiku Date: Tue, 24 Mar 2026 11:54:37 +0200 Subject: [PATCH 148/202] flow: eval OPENROAD_EXE + Allows running OpenROAD under valgrind, which would previously fail due to treating "valgrind openroad" as a program name Signed-off-by: ctkiku --- flow/scripts/flow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/scripts/flow.sh b/flow/scripts/flow.sh index 018031ae2c..10f065394f 100755 --- a/flow/scripts/flow.sh +++ b/flow/scripts/flow.sh @@ -8,7 +8,7 @@ echo "Running $2.tcl, stage $1" ( trap 'mv "$LOG_DIR/$1.tmp.log" "$LOG_DIR/$1.log"' EXIT - "$OPENROAD_EXE" $OPENROAD_ARGS -exit "$SCRIPTS_DIR/noop.tcl" \ + eval "$OPENROAD_EXE $OPENROAD_ARGS -exit \"$SCRIPTS_DIR/noop.tcl\"" \ >"$LOG_DIR/$1.tmp.log" 2>&1 eval "$TIME_CMD $OPENROAD_CMD -no_splash \"$SCRIPTS_DIR/$2.tcl\" -metrics \"$LOG_DIR/$1.json\"" \ From 7a1ff2818db652a9b403d96be2a7a90c9fa17884 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Tue, 24 Mar 2026 21:25:52 +0900 Subject: [PATCH 149/202] Bump kepler-formal (ae2acd4aa825fbbffdc4f8e6591b720a4a0a9e12) Signed-off-by: Jaehyun Kim --- tools/kepler-formal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/kepler-formal b/tools/kepler-formal index e8675f3086..ae2acd4aa8 160000 --- a/tools/kepler-formal +++ b/tools/kepler-formal @@ -1 +1 @@ -Subproject commit e8675f3086926c63205f8f5f586be7c7dccaf788 +Subproject commit ae2acd4aa825fbbffdc4f8e6591b720a4a0a9e12 From fc4af09ed3011e414690c3f60d2dd8bcca1a9c21 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Tue, 24 Mar 2026 21:26:06 +0900 Subject: [PATCH 150/202] Bump OR (d2852e5e2ddf797c0c95da94df4b6077c506adca) Signed-off-by: Jaehyun Kim --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 6be2024cca..d2852e5e2d 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 6be2024cca95b262e2bc33896ba23e26f8f84f90 +Subproject commit d2852e5e2ddf797c0c95da94df4b6077c506adca From 843726aa8b880c7844c14f4f77a5b5182ef58475 Mon Sep 17 00:00:00 2001 From: ashnaaseth2325-oss Date: Tue, 24 Mar 2026 13:23:14 +0000 Subject: [PATCH 151/202] fix: use RXFIFOTR for rx_more_threshold in APB_UART Signed-off-by: Ashnaa Seth Signed-off-by: ashnaaseth2325-oss --- flow/designs/src/chameleon/IPs/APB_UART.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/src/chameleon/IPs/APB_UART.v b/flow/designs/src/chameleon/IPs/APB_UART.v index daddc6e182..2ac3a22935 100644 --- a/flow/designs/src/chameleon/IPs/APB_UART.v +++ b/flow/designs/src/chameleon/IPs/APB_UART.v @@ -142,7 +142,7 @@ module APB_UART( 32'hDEADDEAD; wire tx_less_threshold = (tx_level < TXFIFOTR); - wire rx_more_threshold = (rx_level > TXFIFOTR); + wire rx_more_threshold = (rx_level > RXFIFOTR); assign uart_irq = IMASK[0] & ( (~rx_empty & IMASK[2]) | From 035008cb8535b816bcf7b157a5b0858ca3839d35 Mon Sep 17 00:00:00 2001 From: ashnaaseth2325-oss Date: Tue, 24 Mar 2026 13:11:59 +0000 Subject: [PATCH 152/202] fix: correct inverted read MUX in dmem The sel_mem case arms were reversed, causing every memory read to return data from the wrong SRAM bank. Signed-off-by: Ashnaa Seth Signed-off-by: ashnaaseth2325-oss --- flow/designs/src/riscv32i/dmem.v | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flow/designs/src/riscv32i/dmem.v b/flow/designs/src/riscv32i/dmem.v index 46f6a58f65..6cda09216e 100755 --- a/flow/designs/src/riscv32i/dmem.v +++ b/flow/designs/src/riscv32i/dmem.v @@ -59,10 +59,10 @@ module dmem (clk, r_w, mem_addr, mem_data, mem_out); always @* begin case (sel_mem) - 2'b00: mem_out = inter_dmem3; - 2'b01: mem_out = inter_dmem2; - 2'b10: mem_out = inter_dmem1; - 2'b11: mem_out = inter_dmem0; + 2'b11: mem_out = inter_dmem3; + 2'b10: mem_out = inter_dmem2; + 2'b01: mem_out = inter_dmem1; + 2'b00: mem_out = inter_dmem0; endcase // case (sel_mem) end From ec4471c8ed690e4073b873644794a6eab4a74641 Mon Sep 17 00:00:00 2001 From: Jeff Ng Date: Tue, 24 Mar 2026 14:27:13 +0000 Subject: [PATCH 153/202] Rapidus design updates for PDK 0.3 (full) formatting Signed-off-by: Jeff Ng --- flow/designs/rapidus2hp/cva6/rules-base.json | 26 +++--- .../rapidus2hp/cva6/rules-verific.json | 26 +++--- .../rapidus2hp/cva6/test/test_params.py | 25 ++++-- flow/designs/rapidus2hp/ethmac/config.mk | 6 +- .../designs/rapidus2hp/ethmac/rules-base.json | 10 +-- .../rapidus2hp/ethmac/rules-verific.json | 14 ++-- .../rapidus2hp/ethmac/test/test_params.py | 23 ++++- flow/designs/rapidus2hp/gcd/config.mk | 32 ++++--- flow/designs/rapidus2hp/gcd/rules-base.json | 12 +-- .../designs/rapidus2hp/gcd/rules-verific.json | 14 ++-- .../rapidus2hp/gcd/test/test_params.py | 25 +++++- .../rapidus2hp/hercules_idecode/config.mk | 48 ++++++++--- .../hercules_idecode/prects_0.3.sdc | 16 ++++ .../hercules_idecode/rules-base.json | 22 ++--- .../hercules_idecode/rules-verific.json | 24 +++--- .../hercules_idecode/test/test_params.py | 46 ++++++++-- .../rapidus2hp/hercules_is_int/config.mk | 31 +++++-- .../rapidus2hp/hercules_is_int/prects_0.3.sdc | 16 ++++ .../hercules_is_int/rules-base.json | 20 ++--- .../hercules_is_int/rules-verific.json | 20 ++--- .../hercules_is_int/test/test_params.py | 48 +++++++++-- flow/designs/rapidus2hp/ibex/config.mk | 17 +++- .../rapidus2hp/ibex/constraint_0.3_8T.sdc | 19 +++++ flow/designs/rapidus2hp/ibex/rules-base.json | 12 +-- .../rapidus2hp/ibex/rules-verific.json | 8 +- .../rapidus2hp/ibex/test/test_params.py | 53 ++++++++++-- flow/designs/rapidus2hp/jpeg/config.mk | 19 ++++- .../rapidus2hp/jpeg/jpeg_encoder15_0.3_6T.sdc | 21 +++++ .../rapidus2hp/jpeg/jpeg_encoder15_0.3_8T.sdc | 21 +++++ flow/designs/rapidus2hp/jpeg/rules-base.json | 14 ++-- .../rapidus2hp/jpeg/rules-verific.json | 14 ++-- .../rapidus2hp/jpeg/test/test_params.py | 83 +++++++++++++++++-- 32 files changed, 587 insertions(+), 198 deletions(-) create mode 100644 flow/designs/rapidus2hp/hercules_idecode/prects_0.3.sdc create mode 100644 flow/designs/rapidus2hp/hercules_is_int/prects_0.3.sdc create mode 100644 flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc create mode 100644 flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3_6T.sdc create mode 100644 flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3_8T.sdc diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index ab7e31e07d..b080ef4497 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 17000.0, + "value": 16800.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 14040, + "value": 13856, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 164719, + "value": 142196, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 14323, + "value": 12365, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 14323, + "value": 12365, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.14, + "value": -0.04, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -168.0, + "value": -0.16, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 138, + "value": 118, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.194, + "value": -0.0412, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -244.0, + "value": -0.164, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.194, + "value": -0.0412, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -244.0, + "value": -0.164, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 14360, + "value": 14305, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json index 0874caf269..9626438b82 100644 --- a/flow/designs/rapidus2hp/cva6/rules-verific.json +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 17200.0, + "value": 17000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 14318, + "value": 14072, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 201058, + "value": 146806, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 15130, + "value": 12766, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 15130, + "value": 12766, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.136, + "value": -0.04, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -388.0, + "value": -0.16, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 148, + "value": 122, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.279, + "value": -0.04, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -659.0, + "value": -0.16, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.279, + "value": -0.04, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -550.0, + "value": -0.16, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 14642, + "value": 14515, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/cva6/test/test_params.py b/flow/designs/rapidus2hp/cva6/test/test_params.py index 4f0f353ba1..5320deb206 100755 --- a/flow/designs/rapidus2hp/cva6/test/test_params.py +++ b/flow/designs/rapidus2hp/cva6/test/test_params.py @@ -24,9 +24,7 @@ def setUp(self): def get_exp_sdc(self, place_site, pdk_version): """Returns the expected SDC file path""" - if pdk_version in ["", "0.2a", "0.3s"]: - if pdk_version == "": - pdk_version = "0.3s" + if pdk_version in ["0.2a", "0.3s"]: if place_site == "ra02h138_DST_45CPP": return os.path.join( self._design_full_dir, f"constraint_{pdk_version}_6T.sdc" @@ -41,9 +39,9 @@ def get_exp_sdc(self, place_site, pdk_version): return os.path.join(self._design_full_dir, "constraint.sdc") - def test_pdk_0p3s_default(self): + def test_pdk_0p3_default(self): """ - Tests PDK 0.3s + Tests PDK 0.3 """ pdk_version = "" @@ -126,6 +124,23 @@ def test_pdk_0p3s(self): front_end=front_end, ) + def test_pdk_0p3(self): + """ + Tests PDK 0.3 + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + def test_flow_variant(self): """Tests that setting the flow variant uses the right frontend""" diff --git a/flow/designs/rapidus2hp/ethmac/config.mk b/flow/designs/rapidus2hp/ethmac/config.mk index fe625b996e..f49bdc5577 100644 --- a/flow/designs/rapidus2hp/ethmac/config.mk +++ b/flow/designs/rapidus2hp/ethmac/config.mk @@ -19,7 +19,11 @@ export CORE_UTILIZATION = $(strip \ 65), \ $(if $(filter 0.3s,$(RAPIDUS_PDK_VERSION)), \ 65, \ - 70) \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + 63, \ + 70 \ + ) \ + ) \ )) export CORE_ASPECT_RATIO = 1 diff --git a/flow/designs/rapidus2hp/ethmac/rules-base.json b/flow/designs/rapidus2hp/ethmac/rules-base.json index 064e9ac89e..07fe69c1df 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-base.json +++ b/flow/designs/rapidus2hp/ethmac/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.453, + "value": -0.658, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0462, + "value": -0.0519, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.07, + "value": -1.58, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0462, + "value": -0.0519, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.07, + "value": -1.58, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/ethmac/rules-verific.json b/flow/designs/rapidus2hp/ethmac/rules-verific.json index ca3ba8ad41..19259f96c6 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-verific.json +++ b/flow/designs/rapidus2hp/ethmac/rules-verific.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 3290.0, + "value": 3780.0, "compare": "<=" }, "constraints__clocks__count": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0287, + "value": -0.0353, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.514, + "value": -0.698, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0459, + "value": -0.0601, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.885, + "value": -1.63, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0459, + "value": -0.0601, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.885, + "value": -1.63, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/ethmac/test/test_params.py b/flow/designs/rapidus2hp/ethmac/test/test_params.py index c5480e72ab..b7d78ae3f3 100755 --- a/flow/designs/rapidus2hp/ethmac/test/test_params.py +++ b/flow/designs/rapidus2hp/ethmac/test/test_params.py @@ -28,12 +28,14 @@ def get_exp_util(self, place_site, pdk_version): if place_site == "ra02h138_DST_45CPP": return 63 return 65 - if pdk_version in ["", "0.3s"]: + if pdk_version == "0.3s": return 65 + if pdk_version in ["", "0.3"]: + return 63 return 70 - def test_pdk_0p3s_default(self): - """Tests PDK 0.3s Utilization""" + def test_pdk_0p3_default(self): + """Tests PDK 0.3 Utilization""" pdk_version = "" for front_end in self._front_end_list: @@ -107,6 +109,21 @@ def test_pdk_0p3s(self): front_end=front_end, ) + def test_pdk_0p3(self): + """Tests PDK 0.3 Utilization""" + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + def test_flow_variant(self): """Tests that setting the flow variant uses the right frontend""" diff --git a/flow/designs/rapidus2hp/gcd/config.mk b/flow/designs/rapidus2hp/gcd/config.mk index 8f8d39ddfa..77d042acb7 100644 --- a/flow/designs/rapidus2hp/gcd/config.mk +++ b/flow/designs/rapidus2hp/gcd/config.mk @@ -10,22 +10,20 @@ export VERILOG_FILES = $(DESIGN_HOME)/src/$(DESIGN_NAME)/gcd.v export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/constraint.sdc # Use $(if) to defer conditional eval until all makefiles are read -# -# | PDK | Place Site | Utilization | -# | ---- | ---------- | ----------- | -# | 0.2 | 6T | 43 | -# | 0.2 | 8T | 45 | -# | 0.2a | 6T | 43 | -# | 0.2a | 8T | 45 | -# | 0.15 | 6T | 38 | -# | 0.15 | 8T | 40 | -# -export CORE_UTILIZATION = $(strip $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ - $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ - 36, \ - 40), \ - $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ - 43, \ - 45))) +export CORE_UTILIZATION = $(strip \ + $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + 36, \ + 40), \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + 36, \ + 42), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + 43, \ + 45 \ + ) \ + ) \ + )) export CORE_MARGIN = .5 diff --git a/flow/designs/rapidus2hp/gcd/rules-base.json b/flow/designs/rapidus2hp/gcd/rules-base.json index c827b4e0dc..d3d9ef6cdd 100644 --- a/flow/designs/rapidus2hp/gcd/rules-base.json +++ b/flow/designs/rapidus2hp/gcd/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 773, + "value": 692, "compare": "<=" }, "detailedplace__design__violations": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.322, + "value": -0.308, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0397, + "value": -0.0382, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.726, + "value": -0.704, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0397, + "value": -0.0382, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.726, + "value": -0.704, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/gcd/rules-verific.json b/flow/designs/rapidus2hp/gcd/rules-verific.json index 7be0c2bd5f..59b3c84e32 100644 --- a/flow/designs/rapidus2hp/gcd/rules-verific.json +++ b/flow/designs/rapidus2hp/gcd/rules-verific.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 22.2, + "value": 20.2, "compare": "<=" }, "constraints__clocks__count": { @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 780, + "value": 688, "compare": "<=" }, "detailedplace__design__violations": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.485, + "value": -0.475, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0339, + "value": -0.0302, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.08, + "value": -0.753, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0339, + "value": -0.0302, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.08, + "value": -0.753, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/gcd/test/test_params.py b/flow/designs/rapidus2hp/gcd/test/test_params.py index 91de2b7063..22a0d9e9ee 100755 --- a/flow/designs/rapidus2hp/gcd/test/test_params.py +++ b/flow/designs/rapidus2hp/gcd/test/test_params.py @@ -28,13 +28,17 @@ def get_exp_util(self, place_site, pdk_version): if place_site == "ra02h138_DST_45CPP": return 36 return 40 + if pdk_version in ["", "0.3"]: + if place_site == "ra02h138_DST_45CPP": + return 36 + return 42 if place_site in ["SC6T", "ra02h138_DST_45CPP"]: return 43 return 45 - def test_pdk_0p3s_default(self): + def test_pdk_0p3_default(self): """ - Tests PDK 0.3s utilization + Tests PDK 0.3 utilization """ pdk_version = "" @@ -117,6 +121,23 @@ def test_pdk_0p3s(self): front_end=front_end, ) + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + if __name__ == "__main__": unittest.main() diff --git a/flow/designs/rapidus2hp/hercules_idecode/config.mk b/flow/designs/rapidus2hp/hercules_idecode/config.mk index b03b6c6cc4..9b6d3c88b1 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/config.mk +++ b/flow/designs/rapidus2hp/hercules_idecode/config.mk @@ -15,23 +15,51 @@ export VERILOG_INCLUDE_DIRS = $(SRC_HOME)/hercules_idecode/verilog \ $(SRC_HOME)/shared/verilog \ $(SRC_HOME)/models/cells/generic -export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/prects.sdc +.DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/prects.sdc +._0P3_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/prects_0.3.sdc +export SDC_FILE = $(strip \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(._0P3_SDC_FILE), \ + $(.DEFAULT_SDC_FILE) \ + )) export SYNTH_HDL_FRONTEND ?= slang + # Use $(if) to defer conditional eval until all makefiles are read export CORE_UTILIZATION = $(strip \ - $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ - $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ - $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ - 42, \ - 44 \ + $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + 42, \ + 43 \ ), \ - 50 \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + 50, \ + 48 \ + ) \ ), \ - $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ - 43, \ - 48 \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + 47, \ + 48 \ + ), \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + 62, \ + 58 \ + ) \ + ), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + 44, \ + 43 \ + ), \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + 50, \ + 48 \ + ) \ + ) \ ) \ )) diff --git a/flow/designs/rapidus2hp/hercules_idecode/prects_0.3.sdc b/flow/designs/rapidus2hp/hercules_idecode/prects_0.3.sdc new file mode 100644 index 0000000000..cfd7563a21 --- /dev/null +++ b/flow/designs/rapidus2hp/hercules_idecode/prects_0.3.sdc @@ -0,0 +1,16 @@ +source $::env(PLATFORM_DIR)/util.tcl + +#set sdc_version 2.1 +set sdc_version 1.4 +current_design hercules_idecode + +set clk_period 370 + +convert_time_value clk_period + +set_max_fanout 32 [current_design] +set_load [convert_cap_value 10] [all_outputs] +set_max_capacitance [convert_cap_value 10] [all_inputs] + +create_clock -name "clk" -add -period $clk_period \ + -waveform [list 0.0 [expr 0.5*$clk_period]] [get_ports clk] diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json index d54d24eb8d..eb56be08be 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 11599, + "value": 10320, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 296166, + "value": 230511, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 25754, + "value": 20044, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 25754, + "value": 20044, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.058, + "value": -0.0185, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -50.1, + "value": -0.074, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0724, + "value": -0.0383, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -213.0, + "value": -0.339, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0724, + "value": -0.0383, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -213.0, + "value": -0.339, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 11865, + "value": 10628, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json index c295096c0a..06eec91af7 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 11625, + "value": 10358, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 298282, + "value": 232846, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 25938, + "value": 20248, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 25938, + "value": 20248, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0713, + "value": -0.0185, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -146.0, + "value": -0.074, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 259, + "value": 202, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0831, + "value": -0.0225, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -359.0, + "value": -0.0993, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0831, + "value": -0.0225, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -359.0, + "value": -0.0993, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 11884, + "value": 10645, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py b/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py index 94a15fae3a..07b1fb4a34 100755 --- a/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py +++ b/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py @@ -24,20 +24,33 @@ def setUp(self): def get_exp_util(self, place_site, pdk_version, front_end): """Returns the expected value""" - if front_end == "verific": - if place_site in ["SC6T", "ra02h138_DST_45CPP"]: + if pdk_version == "0.15": + if place_site == "ra02h138_DST_45CPP": + if front_end in ["", "slang"]: + return 42 return 43 + if front_end in ["", "slang"]: + return 50 return 48 - else: - if place_site in ["SC6T", "ra02h138_DST_45CPP"]: - if pdk_version == "0.15": - return 42 + if pdk_version in ["", "0.3"]: + if place_site == "ra02h138_DST_45CPP": + if front_end in ["", "slang"]: + return 47 + return 48 + if front_end in ["", "slang"]: + return 62 + return 58 + if place_site in ["SC6T", "ra02h138_DST_45CPP"]: + if front_end in ["", "slang"]: return 44 + return 43 + if front_end in ["", "slang"]: return 50 + return 48 - def test_pdk_0p3s_default(self): + def test_pdk_0p3_default(self): """ - Tests PDK 0.3s utilization + Tests PDK 0.3 utilization """ pdk_version = "" @@ -120,6 +133,23 @@ def test_pdk_0p3s(self): front_end=front_end, ) + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version, front_end) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + def test_flow_variant(self): """Tests that setting the flow variant uses the right frontend""" diff --git a/flow/designs/rapidus2hp/hercules_is_int/config.mk b/flow/designs/rapidus2hp/hercules_is_int/config.mk index ba4b8e7117..0ebf5d65b3 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/config.mk +++ b/flow/designs/rapidus2hp/hercules_is_int/config.mk @@ -20,7 +20,13 @@ export VERILOG_INCLUDE_DIRS = $(SRC_HOME)/hercules_issue/verilog \ $(SRC_HOME)/shared/verilog \ $(SRC_HOME)/models/cells/generic -export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/prects.sdc +.DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/prects.sdc +._0P3_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/prects_0.3.sdc +export SDC_FILE = $(strip \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(._0P3_SDC_FILE), \ + $(.DEFAULT_SDC_FILE) \ + )) # Must be defined before the ifeq's export SYNTH_HDL_FRONTEND ?= slang @@ -50,14 +56,23 @@ export CORE_UTILIZATION = $(strip \ 30, \ 52 \ ), \ - $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ - 30, \ - 52 \ - ), \ - $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ - 30, \ - 54 \ + 52, \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + 65, \ + 63 \ + ) \ + ), \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + 30, \ + 52 \ + ), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + 30, \ + 54 \ + ) \ ) \ ) \ ) \ diff --git a/flow/designs/rapidus2hp/hercules_is_int/prects_0.3.sdc b/flow/designs/rapidus2hp/hercules_is_int/prects_0.3.sdc new file mode 100644 index 0000000000..0d562a402c --- /dev/null +++ b/flow/designs/rapidus2hp/hercules_is_int/prects_0.3.sdc @@ -0,0 +1,16 @@ +source $::env(PLATFORM_DIR)/util.tcl + +#set sdc_version 2.1 +set sdc_version 1.4 +current_design hercules_is_int + +set clk_period 370 + +convert_time_value clk_period + +set_max_fanout 32 [current_design] +set_load [convert_cap_value 10] [all_outputs] +set_max_capacitance [convert_cap_value 10] [all_inputs] + +create_clock -name "clk" -add -period $clk_period \ + -waveform [list 0.0 [expr { 0.5 * $clk_period }]] [get_ports clk] diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json index 059219ead5..504e3f1dbe 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 658787, + "value": 647733, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 57286, + "value": 56325, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 57286, + "value": 56325, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0909, + "value": -0.0185, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -214.0, + "value": -0.074, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 579, + "value": 567, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.105, + "value": -0.0815, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1040.0, + "value": -47.3, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.105, + "value": -0.0815, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1040.0, + "value": -47.4, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json b/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json index 447e13eb1f..24a7dcca8c 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 659181, + "value": 646997, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 57320, + "value": 56261, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 57320, + "value": 56261, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0468, + "value": -0.0185, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -147.0, + "value": -0.074, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 579, + "value": 567, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.114, + "value": -0.111, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1010.0, + "value": -107.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.114, + "value": -0.111, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1010.0, + "value": -107.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py b/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py index 078f18ed83..3830917581 100755 --- a/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py +++ b/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py @@ -24,7 +24,11 @@ def setUp(self): def get_exp_util(self, place_site, front_end, pdk_version, layer_stack): """Returns the expected value""" - if pdk_version in ["", "0.3s"]: + if pdk_version == "0.15": + if place_site == "ra02h138_DST_45CPP": + return 30 + return 52 + if pdk_version == "0.3s": if place_site == "ra02h138_DST_45CPP": if front_end in ["", "slang"]: if layer_stack == "14LM": @@ -35,10 +39,12 @@ def get_exp_util(self, place_site, front_end, pdk_version, layer_stack): if layer_stack == "14LM": return 50 return 56 - if pdk_version in "0.15": + if pdk_version in ["", "0.3"]: if place_site == "ra02h138_DST_45CPP": - return 30 - return 52 + return 52 + if front_end in ["", "slang"]: + return 65 + return 63 if front_end == "verific": if place_site in ["SC6T", "ra02h138_DST_45CPP"]: return 30 @@ -48,9 +54,18 @@ def get_exp_util(self, place_site, front_end, pdk_version, layer_stack): return 30 return 52 - def test_pdk_0p3s_default(self): + def get_exp_sdc(self, place_site, pdk_version): + """Returns the expected SDC file path""" + + if pdk_version in ["", "0.3"]: + if pdk_version == "": + pdk_version = "0.3" + return os.path.join(self._design_full_dir, f"prects_{pdk_version}.sdc") + return os.path.join(self._design_full_dir, "prects.sdc") + + def test_pdk_0p3_default(self): """ - Tests PDK 0.3s utilization + Tests PDK 0.3 utilization """ pdk_version = "" @@ -152,6 +167,27 @@ def test_pdk_0p3s(self): layer_stack=layer_stack, ) + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + for layer_stack in self._layer_stack_list: + exp_util = self.get_exp_util( + place_site, front_end, pdk_version, layer_stack + ) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + layer_stack=layer_stack, + ) + def test_flow_variant(self): """Tests that setting the flow variant uses the right frontend""" diff --git a/flow/designs/rapidus2hp/ibex/config.mk b/flow/designs/rapidus2hp/ibex/config.mk index b7c506bb99..9e6c5907d6 100644 --- a/flow/designs/rapidus2hp/ibex/config.mk +++ b/flow/designs/rapidus2hp/ibex/config.mk @@ -29,6 +29,7 @@ else ._0P15_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.15.sdc ._0P3S_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3s_6T.sdc ._0P3S_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3s_8T.sdc + ._0P3_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_8T.sdc # Use $(if) to defer conditional eval until all makefiles are read export SDC_FILE = $(strip \ @@ -44,7 +45,13 @@ else $(._0P3S_6T_SDC_FILE), \ $(._0P3S_8T_SDC_FILE) \ ), \ - $(.DEFAULT_SDC_FILE) \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h184_HST_45CPP,$(PLACE_SITE)), \ + $(._0P3_8T_SDC_FILE), \ + $(.DEFAULT_SDC_FILE) \ + ), \ + $(.DEFAULT_SDC_FILE) \ + ) \ ) \ ) \ )) @@ -61,7 +68,13 @@ export CORE_UTILIZATION = $(strip \ 60, \ 65 \ ), \ - 70 \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + 55, \ + 70 \ + ), \ + 70 \ + ) \ ) \ )) diff --git a/flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc b/flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc new file mode 100644 index 0000000000..f539d55b82 --- /dev/null +++ b/flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc @@ -0,0 +1,19 @@ +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name core_clock +set clk_port_name clk_i +set clk_period 450 +set clk_io_pct 0.2 + +set clk_port [get_ports $clk_port_name] + +convert_time_value clk_period + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/ibex/rules-base.json b/flow/designs/rapidus2hp/ibex/rules-base.json index 56cda8108f..f68093141f 100644 --- a/flow/designs/rapidus2hp/ibex/rules-base.json +++ b/flow/designs/rapidus2hp/ibex/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 1020.0, + "value": 1010.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1230, + "value": 1216, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 22939, + "value": 20942, "compare": "<=" }, "detailedplace__design__violations": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.02, + "value": -0.938, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.02, + "value": -0.938, "compare": ">=" }, "finish__timing__hold__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1290, + "value": 1266, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ibex/rules-verific.json b/flow/designs/rapidus2hp/ibex/rules-verific.json index faed324426..14cad94e09 100644 --- a/flow/designs/rapidus2hp/ibex/rules-verific.json +++ b/flow/designs/rapidus2hp/ibex/rules-verific.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 1030.0, + "value": 1020.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1237, + "value": 1221, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 23278, + "value": 21890, "compare": "<=" }, "detailedplace__design__violations": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1292, + "value": 1274, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ibex/test/test_params.py b/flow/designs/rapidus2hp/ibex/test/test_params.py index 3eba7f7f17..3c2f74814e 100755 --- a/flow/designs/rapidus2hp/ibex/test/test_params.py +++ b/flow/designs/rapidus2hp/ibex/test/test_params.py @@ -24,14 +24,18 @@ def setUp(self): def get_exp_util(self, place_site, pdk_version): """Returns the expected utilization""" - if pdk_version in ["", "0.3s"]: - if place_site == "ra02h138_DST_45CPP": - return 60 - return 65 if pdk_version == "0.15": if place_site == "ra02h138_DST_45CPP": return 52 return 65 + if pdk_version == "0.3s": + if place_site == "ra02h138_DST_45CPP": + return 60 + return 65 + if pdk_version in ["", "0.3"]: + if place_site == "ra02h138_DST_45CPP": + return 55 + return 70 return 70 def get_exp_sdc(self, place_site, pdk_version): @@ -47,9 +51,7 @@ def get_exp_sdc(self, place_site, pdk_version): ) if pdk_version == "0.15": return os.path.join(self._design_full_dir, f"constraint_{pdk_version}.sdc") - if pdk_version in ["", "0.3s"]: - if pdk_version == "": - pdk_version = "0.3s" + if pdk_version == "0.3s": if place_site == "ra02h138_DST_45CPP": return os.path.join( self._design_full_dir, f"constraint_{pdk_version}_6T.sdc" @@ -58,11 +60,18 @@ def get_exp_sdc(self, place_site, pdk_version): self._design_full_dir, f"constraint_{pdk_version}_8T.sdc" ) + if pdk_version in ["", "0.3"]: + if place_site in ["", "ra02h184_HST_45CPP"]: + if pdk_version == "": + pdk_version = "0.3" + return os.path.join( + self._design_full_dir, f"constraint_{pdk_version}_8T.sdc" + ) return os.path.join(self._design_full_dir, "constraint.sdc") - def test_pdk_0p3s_default(self): + def test_pdk_0p3_default(self): """ - Tests PDK 0.3s utilization + Tests PDK 0.3 utilization """ pdk_version = "" @@ -186,6 +195,32 @@ def test_pdk_0p3s(self): front_end=front_end, ) + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + front_end = "" + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + def test_flow_variant(self): """Tests that setting the flow variant uses the right frontend""" diff --git a/flow/designs/rapidus2hp/jpeg/config.mk b/flow/designs/rapidus2hp/jpeg/config.mk index f328b7b4b8..c157e1942b 100644 --- a/flow/designs/rapidus2hp/jpeg/config.mk +++ b/flow/designs/rapidus2hp/jpeg/config.mk @@ -14,7 +14,9 @@ export VERILOG_INCLUDE_DIRS = $(DESIGN_HOME)/src/$(DESIGN_NICKNAME)/include ._0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.2a_8T.sdc ._0P15_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.15_6T.sdc ._0P15_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.15_8T.sdc -._0P3S_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.3s.sdc +._0P3S_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.3s.sdc +._0P3_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.3_6T.sdc +._0P3_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.3_8T.sdc # Use $(if) to defer conditional eval until all makefiles are read export SDC_FILE = $(strip \ @@ -27,14 +29,25 @@ export SDC_FILE = $(strip \ ), \ $(if $(filter 0.3s,$(RAPIDUS_PDK_VERSION)), \ $(._0P3S_SDC_FILE), \ - $(.DEFAULT_SDC_FILE) \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + $(._0P3_6T_SDC_FILE), \ + $(._0P3_8T_SDC_FILE) \ + ), \ + $(.DEFAULT_SDC_FILE) \ + ) \ ) \ ) \ )) export ABC_AREA = 1 -export CORE_UTILIZATION = 60 +export CORE_UTILIZATION = $(strip \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + 62, \ + 60 \ + )) + export CORE_ASPECT_RATIO = 1 export CORE_MARGIN = 0.75 diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3_6T.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3_6T.sdc new file mode 100644 index 0000000000..48533567a1 --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3_6T.sdc @@ -0,0 +1,21 @@ +source $::env(PLATFORM_DIR)/util.tcl + +current_design jpeg_encoder + +set clk_name clk +set clk_port_name clk +set clk_period 290 +set clk_io_pct 0.2 + +convert_time_value clk_period + +set clk_port [get_ports $clk_port_name] + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3_8T.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3_8T.sdc new file mode 100644 index 0000000000..4f489bb009 --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3_8T.sdc @@ -0,0 +1,21 @@ +source $::env(PLATFORM_DIR)/util.tcl + +current_design jpeg_encoder + +set clk_name clk +set clk_port_name clk +set clk_period 225 +set clk_io_pct 0.2 + +convert_time_value clk_period + +set clk_port [get_ports $clk_port_name] + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/jpeg/rules-base.json b/flow/designs/rapidus2hp/jpeg/rules-base.json index cc982f3fc7..84e4a2f460 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-base.json +++ b/flow/designs/rapidus2hp/jpeg/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 116278, + "value": 109773, "compare": "<=" }, "detailedplace__design__violations": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0488, + "value": -0.0112, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -37.0, + "value": -0.045, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0934, + "value": -0.0358, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -144.0, + "value": -6.39, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0934, + "value": -0.0358, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -144.0, + "value": -6.39, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/jpeg/rules-verific.json b/flow/designs/rapidus2hp/jpeg/rules-verific.json index 22a5d30717..6b369ce4b8 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-verific.json +++ b/flow/designs/rapidus2hp/jpeg/rules-verific.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 117602, + "value": 115045, "compare": "<=" }, "detailedplace__design__violations": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0522, + "value": -0.0112, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -54.4, + "value": -0.045, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0947, + "value": -0.0629, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -151.0, + "value": -13.8, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,11 +64,11 @@ "compare": ">=" }, "finish__timing__setup__ws": { - "value": -0.0947, + "value": -0.0629, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -151.0, + "value": -13.8, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/rapidus2hp/jpeg/test/test_params.py b/flow/designs/rapidus2hp/jpeg/test/test_params.py index e964bb9f25..d2b7432a58 100755 --- a/flow/designs/rapidus2hp/jpeg/test/test_params.py +++ b/flow/designs/rapidus2hp/jpeg/test/test_params.py @@ -21,6 +21,12 @@ def setUp(self): ParamTestBase.setUp(self, "jpeg") + def get_exp_util(self, place_site, pdk_version): + """Returns the expected utilization""" + if pdk_version in ["", "0.3"]: + return 62 + return 60 + def get_exp_sdc(self, place_site, pdk_version): """Returns the expected SDC file path""" @@ -29,7 +35,9 @@ def get_exp_sdc(self, place_site, pdk_version): return os.path.join( self._design_full_dir, f"jpeg_encoder15_{pdk_version}_8T.sdc" ) - if pdk_version == "0.15": + if pdk_version in ["", "0.3", "0.15"]: + if pdk_version == "": + pdk_version = "0.3" if place_site in ["", "ra02h184_HST_45CPP"]: return os.path.join( self._design_full_dir, f"jpeg_encoder15_{pdk_version}_8T.sdc" @@ -37,23 +45,29 @@ def get_exp_sdc(self, place_site, pdk_version): return os.path.join( self._design_full_dir, f"jpeg_encoder15_{pdk_version}_6T.sdc" ) - if pdk_version in ["", "0.3s"]: - if pdk_version == "": - pdk_version = "0.3s" + if pdk_version == "0.3s": return os.path.join( self._design_full_dir, f"jpeg_encoder15_{pdk_version}.sdc" ) return os.path.join(self._design_full_dir, "jpeg_encoder15_7nm.sdc") - def test_pdk_0p3s_default(self): + def test_pdk_0p3_default(self): """ - Tests PDK 0.3s utilization + Tests PDK 0.3 utilization """ pdk_version = "" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) self.execute_cmd( "SDC_FILE", exp_sdc, @@ -70,7 +84,15 @@ def test_pdk_0p2(self): pdk_version = "0.2" for front_end in self._front_end_list: for place_site in self._ibm_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) self.execute_cmd( "SDC_FILE", exp_sdc, @@ -87,7 +109,15 @@ def test_pdk_0p2a(self): pdk_version = "0.2a" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) self.execute_cmd( "SDC_FILE", exp_sdc, @@ -104,7 +134,15 @@ def test_pdk_0p15(self): pdk_version = "0.15" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) self.execute_cmd( "SDC_FILE", exp_sdc, @@ -121,7 +159,40 @@ def test_pdk_0p3s(self): pdk_version = "0.3s" for front_end in self._front_end_list: for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) self.execute_cmd( "SDC_FILE", exp_sdc, From 744a935fbbea43e976a3bccf0ca56817bbfa743e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Mai?= Date: Mon, 23 Mar 2026 17:48:38 +0000 Subject: [PATCH 154/202] flow: remove placement_blockages.tcl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Mai --- flow/scripts/macro_place_util.tcl | 3 -- flow/scripts/placement_blockages.tcl | 44 ---------------------------- 2 files changed, 47 deletions(-) delete mode 100644 flow/scripts/placement_blockages.tcl diff --git a/flow/scripts/macro_place_util.tcl b/flow/scripts/macro_place_util.tcl index c59e1adead..70ac5ea23f 100644 --- a/flow/scripts/macro_place_util.tcl +++ b/flow/scripts/macro_place_util.tcl @@ -67,9 +67,6 @@ if { [find_macros] != "" } { } log_cmd rtl_macro_placer {*}$all_args - - source $::env(SCRIPTS_DIR)/placement_blockages.tcl - block_channels $blockage_width } else { puts "No macros found: Skipping macro_placement" } diff --git a/flow/scripts/placement_blockages.tcl b/flow/scripts/placement_blockages.tcl deleted file mode 100644 index 82c306474b..0000000000 --- a/flow/scripts/placement_blockages.tcl +++ /dev/null @@ -1,44 +0,0 @@ -proc block_channels { channel_width_in_microns } { - set tech [ord::get_db_tech] - set units [$tech getDbUnitsPerMicron] - set block [ord::get_db_block] - - # - # Collect up all the macros - # - set shapes {} - foreach inst [$block getInsts] { - if { [[$inst getMaster] getType] == "BLOCK" } { - set box [$inst getBBox] - lappend shapes [odb::newSetFromRect [$box xMin] [$box yMin] [$box xMax] [$box yMax]] - } - } - - # - # Resize to fill the channels and edge gap - # - set resize_by [expr round($channel_width_in_microns * $units)] - set shapeSet [odb::orSets $shapes] - set shapeSet [odb::bloatSet $shapeSet $resize_by] - - # - # Clip result to the core area - # - set core [$block getCoreArea] - set xl [$core xMin] - set yl [$core yMin] - set xh [$core xMax] - set yh [$core yMax] - set core_rect [odb::newSetFromRect $xl $yl $xh $yh] - set shapeSet [odb::andSet $shapeSet $core_rect] - - # - # Output the blockages - # - set rects [odb::getRectangles $shapeSet] - foreach rect $rects { - set b [odb::dbBlockage_create $block \ - [$rect xMin] [$rect yMin] [$rect xMax] [$rect yMax]] - $b setSoft - } -} From 2ad2d8ac48097eef73f651893668935d52949b9f Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Tue, 24 Mar 2026 21:51:28 +0000 Subject: [PATCH 155/202] Add stale issues/PRs workflow Adds a GitHub Actions workflow using actions/stale@v10 to automatically label and close inactive issues and pull requests after 60+21 days. Discussion: #9878 Signed-off-by: Matt Liberty --- .github/workflows/github-actions-stale.yml | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/github-actions-stale.yml diff --git a/.github/workflows/github-actions-stale.yml b/.github/workflows/github-actions-stale.yml new file mode 100644 index 0000000000..5deb95b706 --- /dev/null +++ b/.github/workflows/github-actions-stale.yml @@ -0,0 +1,37 @@ +name: Mark stale issues and pull requests + +on: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + +jobs: + Stale: + runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} + + permissions: + # Required to label and close stale issues. + issues: write + # Required to label and close stale pull requests. + pull-requests: write + + steps: + - uses: actions/stale@v10 + with: + days-before-stale: 60 + days-before-close: 21 + stale-issue-label: Stale + stale-pr-label: Stale + stale-issue-message: > + This issue has been automatically marked as stale because it has not + had recent activity. It will be closed in 21 days if no further + activity occurs. Remove the `Stale` label or comment to keep it open. + stale-pr-message: > + This pull request has been automatically marked as stale because it + has not had recent activity. It will be closed in 21 days if no + further activity occurs. Remove the `Stale` label or comment to keep + it open. + close-issue-reason: not_planned + exempt-issue-labels: pinned,security + exempt-pr-labels: pinned,security + operations-per-run: 100 From 8171c9bfcff9b2ef3a0139fbff1468510219424d Mon Sep 17 00:00:00 2001 From: Jack Luar Date: Tue, 17 Mar 2026 03:28:44 +0000 Subject: [PATCH 156/202] feat(util): unify docker_shell into a single launcher supporting both AutoTuner and ORFS workflows. Signed-off-by: Jack Luar --- flow/util/docker_shell | 125 +++++++++++++++++++++++++++++++---------- 1 file changed, 95 insertions(+), 30 deletions(-) diff --git a/flow/util/docker_shell b/flow/util/docker_shell index 110715233d..bdd7b3e031 100755 --- a/flow/util/docker_shell +++ b/flow/util/docker_shell @@ -1,7 +1,18 @@ #!/usr/bin/env bash - set -ex +# docker_shell — unified launcher for AutoTuner / OpenROAD +# +# Usage: etc/docker_shell [OPTIONS] [-- CMD [ARGS...]] +# +# Options: +# -i, --image IMAGE Docker image (overrides $OR_IMAGE and default) +# --user Map host UID/GID into the container via entrypoint.sh +# --orfs-flow Mount pwd to /OpenROAD-flow-scripts/flow instead of /work +# -p, --port SPEC Forward a port, e.g. --port 8265:8265 (repeatable) +# --dry-run Print the docker command without executing it +# -h|--help Show this help and exit + # # Method to use docker CLI to determine if we're using docker or podman # @@ -20,7 +31,34 @@ get_container_engine () { fi } -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +DEFAULT_IMAGE="openroad/orfs:latest" +MOUNT_TARGET="/work" +USE_USER=false +DRY_RUN=false +PORTS=() +IMAGE="" +CMD_ARGS=() + +usage() { + grep '^#' "$0" | sed 's/^# \{0,1\}//' + exit 0 +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -i|--image) IMAGE="$2"; shift 2 ;; + --user) USE_USER=true; shift ;; + --orfs-flow) MOUNT_TARGET="/OpenROAD-flow-scripts/flow"; shift ;; + -p|--port) PORTS+=("$2"); shift 2 ;; + --dry-run) DRY_RUN=true; shift ;; + -h|--help) usage ;; + --) shift; CMD_ARGS=("$@"); break ;; + *) echo "Unknown option: $1" >&2; exit 1 ;; + esac +done + +# Image resolution: --image > $OR_IMAGE > default +IMAGE="${IMAGE:-${OR_IMAGE:-$DEFAULT_IMAGE}}" get_container_engine @@ -31,41 +69,68 @@ KLAYOUT_CMD=${KLAYOUT_CMD:-/usr/bin/klayout} XSOCK=/tmp/.X11-unix XAUTH=/tmp/.docker.xauth -xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge - -ARGUMENTS=$@ +if ! $DRY_RUN; then + xauth nlist ${DISPLAY:-:0} | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge - +fi if test -t 0; then DOCKER_INTERACTIVE=-ti +else + DOCKER_INTERACTIVE= fi -if [[ $container_engine == "podman" ]]; then +if $USE_USER; then + user_args="--entrypoint=entrypoint.sh --user=root" + user_env="-e CUSTOM_USER=$(id --user --name) -e CUSTOM_USER_ID=$(id --user) -e CUSTOM_GROUP_ID=$(id --group)" +elif [[ $container_engine == "podman" ]]; then user_args="--privileged --userns=keep-id" + user_env= else user_args="-u $(id -u ${USER}):$(id -g ${USER})" + user_env= +fi + +PORT_ARGS=() +for port in "${PORTS[@]}"; do + PORT_ARGS+=(-p "$port") +done + +CMD_STR= +[[ ${#CMD_ARGS[@]} -gt 0 ]] && CMD_STR="${CMD_ARGS[*]}" + +# Source env.sh only when mounting to ORFS flow dir (adds OR tools to PATH). +# AutoTuner images install binaries in /usr/local/bin so env.sh is not needed +# and would error out if absent. +ENV_SH_CMD= +[[ "$MOUNT_TARGET" == "/OpenROAD-flow-scripts/flow" ]] && ENV_SH_CMD=". ../env.sh;" + +# Build the command once; dry-run prints it, otherwise exec it. +DOCKER_CMD=( + "$container_engine" run --rm -i + $DOCKER_INTERACTIVE + $user_env $user_args + -e LIBGL_ALWAYS_SOFTWARE=1 + -e QT_X11_NO_MITSHM=1 + -e XDG_RUNTIME_DIR=/tmp/xdg-run + -e "DISPLAY=${DISPLAY:-:0}" + -e QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb + -v "$XSOCK:$XSOCK" + -v "$XAUTH:$XAUTH" + -e "XAUTHORITY=$XAUTH" + -e FLOW_HOME=/OpenROAD-flow-scripts/flow/ + -e "YOSYS_EXE=$YOSYS_EXE" + -e "OPENROAD_EXE=$OPENROAD_EXE" + -e "KLAYOUT_CMD=$KLAYOUT_CMD" + -v "$WORKSPACE:${MOUNT_TARGET}" + --network host + "${PORT_ARGS[@]}" + "$IMAGE" + bash -c "set -ex; mkdir /tmp/xdg-run; cd ${MOUNT_TARGET}; ${ENV_SH_CMD}$CMD_STR" +) + +if $DRY_RUN; then + echo "${DOCKER_CMD[*]}" + exit 0 fi -# Most of these options below has to do with allowing to -# run the OpenROAD GUI from within Docker. -docker run $user_args \ - -e LIBGL_ALWAYS_SOFTWARE=1 \ - -e "QT_X11_NO_MITSHM=1" \ - -e XDG_RUNTIME_DIR=/tmp/xdg-run \ - -e DISPLAY=$DISPLAY \ - -e QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb \ - -v $XSOCK:$XSOCK \ - -v $XAUTH:$XAUTH \ - -e XAUTHORITY=$XAUTH \ - -e FLOW_HOME=/OpenROAD-flow-scripts/flow/ \ - -e YOSYS_EXE=$YOSYS_EXE \ - -e OPENROAD_EXE=$OPENROAD_EXE \ - -e KLAYOUT_CMD=$KLAYOUT_CMD \ - -v $WORKSPACE:/OpenROAD-flow-scripts/flow:Z \ - --network host \ - $DOCKER_INTERACTIVE \ - ${OR_IMAGE:-openroad/orfs:latest} \ - bash -c "set -ex - mkdir /tmp/xdg-run - cd /OpenROAD-flow-scripts/flow - . ../env.sh - $ARGUMENTS -" +exec "${DOCKER_CMD[@]}" From 5af1da46f8a1b3b8c2905246ef9cf300a9bf533f Mon Sep 17 00:00:00 2001 From: Jack Luar Date: Fri, 20 Mar 2026 04:18:47 +0000 Subject: [PATCH 157/202] fix(util): treat positional args as CMD_ARGS instead of unknown option error Signed-off-by: Jack Luar --- flow/util/docker_shell | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flow/util/docker_shell b/flow/util/docker_shell index bdd7b3e031..68c3454cf2 100755 --- a/flow/util/docker_shell +++ b/flow/util/docker_shell @@ -53,7 +53,8 @@ while [[ $# -gt 0 ]]; do --dry-run) DRY_RUN=true; shift ;; -h|--help) usage ;; --) shift; CMD_ARGS=("$@"); break ;; - *) echo "Unknown option: $1" >&2; exit 1 ;; + -*) echo "Unknown option: $1" >&2; exit 1 ;; + *) CMD_ARGS=("$@"); break ;; esac done From 49559ddfcf8670f02a8913a18684a42ed78a486a Mon Sep 17 00:00:00 2001 From: Jack Luar Date: Sat, 21 Mar 2026 12:46:09 +0000 Subject: [PATCH 158/202] fix(util): always start in /OpenROAD-flow-scripts/flow with WORK_HOME=/work Signed-off-by: Jack Luar --- flow/util/docker_shell | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/flow/util/docker_shell b/flow/util/docker_shell index 68c3454cf2..9a14e01961 100755 --- a/flow/util/docker_shell +++ b/flow/util/docker_shell @@ -8,7 +8,6 @@ set -ex # Options: # -i, --image IMAGE Docker image (overrides $OR_IMAGE and default) # --user Map host UID/GID into the container via entrypoint.sh -# --orfs-flow Mount pwd to /OpenROAD-flow-scripts/flow instead of /work # -p, --port SPEC Forward a port, e.g. --port 8265:8265 (repeatable) # --dry-run Print the docker command without executing it # -h|--help Show this help and exit @@ -32,7 +31,7 @@ get_container_engine () { } DEFAULT_IMAGE="openroad/orfs:latest" -MOUNT_TARGET="/work" +FLOW_DIR="/OpenROAD-flow-scripts/flow" USE_USER=false DRY_RUN=false PORTS=() @@ -48,7 +47,6 @@ while [[ $# -gt 0 ]]; do case "$1" in -i|--image) IMAGE="$2"; shift 2 ;; --user) USE_USER=true; shift ;; - --orfs-flow) MOUNT_TARGET="/OpenROAD-flow-scripts/flow"; shift ;; -p|--port) PORTS+=("$2"); shift 2 ;; --dry-run) DRY_RUN=true; shift ;; -h|--help) usage ;; @@ -99,11 +97,7 @@ done CMD_STR= [[ ${#CMD_ARGS[@]} -gt 0 ]] && CMD_STR="${CMD_ARGS[*]}" -# Source env.sh only when mounting to ORFS flow dir (adds OR tools to PATH). -# AutoTuner images install binaries in /usr/local/bin so env.sh is not needed -# and would error out if absent. -ENV_SH_CMD= -[[ "$MOUNT_TARGET" == "/OpenROAD-flow-scripts/flow" ]] && ENV_SH_CMD=". ../env.sh;" +ENV_SH_CMD='if [ -f ../env.sh ]; then . ../env.sh; fi;' # Build the command once; dry-run prints it, otherwise exec it. DOCKER_CMD=( @@ -119,14 +113,15 @@ DOCKER_CMD=( -v "$XAUTH:$XAUTH" -e "XAUTHORITY=$XAUTH" -e FLOW_HOME=/OpenROAD-flow-scripts/flow/ + -e WORK_HOME=/work -e "YOSYS_EXE=$YOSYS_EXE" -e "OPENROAD_EXE=$OPENROAD_EXE" -e "KLAYOUT_CMD=$KLAYOUT_CMD" - -v "$WORKSPACE:${MOUNT_TARGET}" + -v "$WORKSPACE:/work" --network host "${PORT_ARGS[@]}" "$IMAGE" - bash -c "set -ex; mkdir /tmp/xdg-run; cd ${MOUNT_TARGET}; ${ENV_SH_CMD}$CMD_STR" + bash -c "set -ex; mkdir /tmp/xdg-run; cd ${FLOW_DIR}; ${ENV_SH_CMD}$CMD_STR" ) if $DRY_RUN; then From f7680d9056312a89725124868cbae7dc2710c621 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Wed, 25 Mar 2026 03:04:34 +0000 Subject: [PATCH 159/202] Give the stale action "actions: write" permission to save its state Signed-off-by: Matt Liberty --- .github/workflows/github-actions-stale.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/github-actions-stale.yml b/.github/workflows/github-actions-stale.yml index 5deb95b706..3d53d0ace2 100644 --- a/.github/workflows/github-actions-stale.yml +++ b/.github/workflows/github-actions-stale.yml @@ -14,6 +14,8 @@ jobs: issues: write # Required to label and close stale pull requests. pull-requests: write + # Required to save state between runs + actions: write steps: - uses: actions/stale@v10 From befa85bac5378d494fd3e5df6e967280ef67e3a4 Mon Sep 17 00:00:00 2001 From: Joao Luis Sombrio Date: Wed, 25 Mar 2026 12:54:54 -0300 Subject: [PATCH 160/202] upgrade klayout to version 0.30.7 Signed-off-by: Joao Luis Sombrio --- etc/DependencyInstaller.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index 8e07047fc6..d26e791faf 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -10,7 +10,7 @@ else fi # package versions -klayoutVersion=0.30.3 +klayoutVersion=0.30.7 if [[ "$OSTYPE" == "darwin"* ]]; then numThreads=$(sysctl -n hw.logicalcpu) else From a1aaea29b57af2c14ba58a20d520f070b540ad4d Mon Sep 17 00:00:00 2001 From: Joao Luis Sombrio Date: Wed, 25 Mar 2026 13:19:29 -0300 Subject: [PATCH 161/202] Update KLayout 0.30.7 checksums for Ubuntu 20.04, 22.04, and 24.04 Signed-off-by: Joao Luis Sombrio --- etc/DependencyInstaller.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index d26e791faf..1485e8a6e8 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -221,11 +221,11 @@ _installUbuntuPackages() { fi else if [[ $1 == 20.04 ]]; then - klayoutChecksum=e83be08033f2f69d83ab7bd494a7a858 + klayoutChecksum=e95175a8053d3577375fbd3a7b3d7dbf elif [[ $1 == 22.04 ]]; then - klayoutChecksum=6e431b0a1a34c16eab9958a2c28f88bd + klayoutChecksum=202530d198b0c7b93aa5af0e8e438ccd elif [[ $1 == 24.04 ]]; then - klayoutChecksum=2d186f0225dbac7ae2d790aa8fa57814 + klayoutChecksum=145adaa044101bb41179aa63ec6d7f86 else echo "Unrecognized version of Ubuntu $1. Please install KLayout manually" exit 1 From f2d5f1df9c94c13f7fe5d70b6d5331fee2f486e2 Mon Sep 17 00:00:00 2001 From: Joao Luis Sombrio Date: Wed, 25 Mar 2026 15:22:15 -0300 Subject: [PATCH 162/202] fix KLayout install being skipped on Ubuntu 24.04 The apt fallback for Ubuntu >= 23.04 was silently installing whatever version Ubuntu ships (0.28.16) rather than the pinned 0.30.7 .deb from klayout.org. On 24.04 VMs where klayout was already present via apt, every setup.sh run reported "already the newest version" and skipped the update entirely. Drop the apt fallback so 24.04 uses the same versioned .deb download and checksum verification path as 20.04 and 22.04. Non-LTS versions (23.04, 23.10) now fail fast with a clear message pointing to supported LTS releases. Signed-off-by: Joao Luis Sombrio --- etc/DependencyInstaller.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index 1485e8a6e8..6097a39696 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -199,8 +199,6 @@ _installUbuntuPackages() { # install KLayout if [[ $1 == "rodete" ]]; then apt-get -y install --no-install-recommends klayout python3-pandas - elif _versionCompare "$1" -ge 23.04; then - apt-get -y install --no-install-recommends klayout python3-pandas else arch=$(uname -m) lastDir="$(pwd)" @@ -227,7 +225,7 @@ _installUbuntuPackages() { elif [[ $1 == 24.04 ]]; then klayoutChecksum=145adaa044101bb41179aa63ec6d7f86 else - echo "Unrecognized version of Ubuntu $1. Please install KLayout manually" + echo "Unsupported Ubuntu version $1. Supported versions: 20.04, 22.04, 24.04. Please upgrade to a supported LTS release or install KLayout ${klayoutVersion} manually from https://www.klayout.org/build.html" exit 1 fi wget https://www.klayout.org/downloads/Ubuntu-${1%.*}/klayout_${klayoutVersion}-1_amd64.deb From 7039d216012c8807fd90f4eb1e73da9ad3927210 Mon Sep 17 00:00:00 2001 From: Ashnaa Seth Date: Wed, 25 Mar 2026 20:11:32 +0000 Subject: [PATCH 163/202] genReport: fix DRC violation type parsing str.strip(chars) strips a character set, not a literal prefix. Use split() to correctly extract the violation type name. Signed-off-by: Ashnaa Seth Signed-off-by: ashnaaseth2325-oss --- flow/util/genReport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/util/genReport.py b/flow/util/genReport.py index 5134f4895b..4856deff09 100755 --- a/flow/util/genReport.py +++ b/flow/util/genReport.py @@ -295,7 +295,7 @@ def write_summary(): with open(drc_report_file, "r") as file_: for line_ in file_.readlines(): if "violation type:" in line_: - type_ = line_.strip("violation type:").strip() + type_ = line_.split("violation type:", 1)[1].strip() if type_ in d["drcs"].keys(): d["drcs"][type_] += 1 else: From 0b681052fa6b0fa51c7fc0a9ab4368257731be99 Mon Sep 17 00:00:00 2001 From: Ashnaa Seth Date: Wed, 25 Mar 2026 20:20:13 +0000 Subject: [PATCH 164/202] util: fix bare exit no-op in correlateRC.py exit without parentheses is a no-op in Python; replace with exit(1) so invalid res_unit/cap_unit arguments terminate the script immediately instead of continuing with undefined res_scale/cap_scale variables. Signed-off-by: Ashnaa Seth Signed-off-by: ashnaaseth2325-oss --- flow/util/correlateRC.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/util/correlateRC.py b/flow/util/correlateRC.py index 5c49e8384b..65702ee102 100755 --- a/flow/util/correlateRC.py +++ b/flow/util/correlateRC.py @@ -73,7 +73,7 @@ def parse_args(): res_scale = 1e3 else: print("unknown resistance unit") - exit + exit(1) cap_unit = args.cap_unit if cap_unit == "ff": @@ -82,7 +82,7 @@ def parse_args(): cap_scale = 1e-12 else: print("unknown capacitance unit") - exit + exit(1) def makeDict(): From 365725ad9f4a81f695a26480cf3ba50244c1e35b Mon Sep 17 00:00:00 2001 From: Ashnaa Seth Date: Thu, 26 Mar 2026 03:36:46 +0000 Subject: [PATCH 165/202] util: close devnull fd in is_git_repo Signed-off-by: Ashnaa Seth --- flow/util/genMetrics.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/flow/util/genMetrics.py b/flow/util/genMetrics.py index fbf746cdfc..938a4c91fb 100755 --- a/flow/util/genMetrics.py +++ b/flow/util/genMetrics.py @@ -175,10 +175,11 @@ def read_sdc(file_name): def is_git_repo(folder=None): cmd = ["git", "branch"] - if folder is not None: - return call(cmd, stderr=STDOUT, stdout=open(os.devnull, "w"), cwd=folder) == 0 - else: - return call(cmd, stderr=STDOUT, stdout=open(os.devnull, "w")) == 0 + with open(os.devnull, "w") as devnull: + if folder is not None: + return call(cmd, stderr=STDOUT, stdout=devnull, cwd=folder) == 0 + else: + return call(cmd, stderr=STDOUT, stdout=devnull) == 0 def merge_jsons(root_path, output, files): From 045ac0479f13f14788d8f799581e14bbf2df0c4f Mon Sep 17 00:00:00 2001 From: vvbandeira <9001905+vvbandeira@users.noreply.github.com> Date: Thu, 26 Mar 2026 08:26:56 +0000 Subject: [PATCH 166/202] [BOT] Update OpenROAD submodule Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 4589d89a40..d1dde03fc8 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 4589d89a4015fe19e60880907a3e76777f0dce50 +Subproject commit d1dde03fc87613ac137b06ce4c4938b02cfad2df From a96a25a690b0d1d18858cfd6f98e0a13e5d68508 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 26 Mar 2026 10:50:54 +0000 Subject: [PATCH 167/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/asap7/aes-mbff/rules-base.json | 18 +++++++-------- flow/designs/asap7/aes/rules-base.json | 22 +++++++++---------- flow/designs/asap7/aes_lvt/rules-base.json | 6 ++--- flow/designs/asap7/ethmac/rules-base.json | 20 ++++++++--------- flow/designs/asap7/ethmac_lvt/rules-base.json | 12 +++++----- flow/designs/asap7/gcd-ccs/rules-base.json | 22 +++++++++---------- flow/designs/asap7/gcd/rules-base.json | 12 +++++----- flow/designs/asap7/ibex/rules-base.json | 12 +++++----- flow/designs/asap7/mock-alu/rules-base.json | 8 +++---- flow/designs/asap7/mock-cpu/rules-base.json | 12 +++++----- .../asap7/riscv32i-mock-sram/rules-base.json | 8 +++---- flow/designs/asap7/riscv32i/rules-base.json | 12 +++++----- .../asap7/swerv_wrapper/rules-base.json | 22 +++++++++---------- flow/designs/asap7/uart/rules-base.json | 10 ++++----- flow/designs/gf180/aes-hybrid/rules-base.json | 12 +++++----- flow/designs/gf180/aes/rules-base.json | 10 ++++----- flow/designs/gf180/ibex/rules-base.json | 12 +++++----- flow/designs/gf180/jpeg/rules-base.json | 6 ++--- flow/designs/gf180/riscv32i/rules-base.json | 8 +++---- flow/designs/ihp-sg13g2/aes/rules-base.json | 8 +++---- flow/designs/ihp-sg13g2/gcd/rules-base.json | 8 +++---- flow/designs/ihp-sg13g2/jpeg/rules-base.json | 4 ++-- flow/designs/nangate45/aes/rules-base.json | 14 ++++++------ .../nangate45/ariane133/rules-base.json | 14 ++++++------ .../nangate45/ariane136/rules-base.json | 12 +++++----- .../nangate45/black_parrot/rules-base.json | 20 ++++++++--------- .../nangate45/bp_be_top/rules-base.json | 12 +++++----- .../nangate45/bp_fe_top/rules-base.json | 8 +++---- .../nangate45/bp_multi_top/rules-base.json | 20 ++++++++--------- .../nangate45/dynamic_node/rules-base.json | 14 ++++++------ flow/designs/nangate45/gcd/rules-base.json | 14 ++++++------ flow/designs/nangate45/ibex/rules-base.json | 2 +- .../nangate45/mempool_group/rules-base.json | 16 +++++++------- flow/designs/nangate45/swerv/rules-base.json | 12 +++++----- .../nangate45/swerv_wrapper/rules-base.json | 10 ++++----- .../nangate45/tinyRocket/rules-base.json | 16 +++++++------- flow/designs/sky130hd/aes/rules-base.json | 12 +++++----- .../sky130hd/chameleon/rules-base.json | 20 ++++++++--------- flow/designs/sky130hd/gcd/rules-base.json | 12 +++++----- flow/designs/sky130hd/ibex/rules-base.json | 2 +- flow/designs/sky130hd/jpeg/rules-base.json | 14 ++++++------ .../sky130hd/microwatt/rules-base.json | 10 ++++----- .../designs/sky130hd/riscv32i/rules-base.json | 14 ++++++------ flow/designs/sky130hs/aes/rules-base.json | 10 ++++----- flow/designs/sky130hs/jpeg/rules-base.json | 8 +++---- .../designs/sky130hs/riscv32i/rules-base.json | 14 ++++++------ 46 files changed, 282 insertions(+), 282 deletions(-) diff --git a/flow/designs/asap7/aes-mbff/rules-base.json b/flow/designs/asap7/aes-mbff/rules-base.json index 198be13ec2..08c173c711 100644 --- a/flow/designs/asap7/aes-mbff/rules-base.json +++ b/flow/designs/asap7/aes-mbff/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 1928.39, + "value": 1900.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 2156, + "value": 2103, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -38.2, + "value": -28.8, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1130.0, + "value": -164.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -49.6, + "value": -41.3, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2370.0, + "value": -1010.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -41.6, + "value": -31.8, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -857.0, + "value": -235.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 2254, + "value": 2206, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/aes/rules-base.json b/flow/designs/asap7/aes/rules-base.json index 4fbd47958b..76ab79317d 100644 --- a/flow/designs/asap7/aes/rules-base.json +++ b/flow/designs/asap7/aes/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 1920.0, + "value": 1900.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 2049, + "value": 2032, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 19328, + "value": 19153, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 1681, + "value": 1666, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 1681, + "value": 1666, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -34.8, + "value": -28.8, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -226.0, + "value": -164.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -47.4, + "value": -37.6, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 68021, + "value": 66246, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -357.0, + "value": -303.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 2149, + "value": 2108, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/aes_lvt/rules-base.json b/flow/designs/asap7/aes_lvt/rules-base.json index e5039648ab..2fb6b362f8 100644 --- a/flow/designs/asap7/aes_lvt/rules-base.json +++ b/flow/designs/asap7/aes_lvt/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 1920.63, + "value": 1910.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1978, + "value": 1954, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 2017, + "value": 1992, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/ethmac/rules-base.json b/flow/designs/asap7/ethmac/rules-base.json index 0f81ddda44..7db97e6cd6 100644 --- a/flow/designs/asap7/ethmac/rules-base.json +++ b/flow/designs/asap7/ethmac/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 69423, + "value": 68920, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 6037, + "value": 5993, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 6037, + "value": 5993, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -114.0, + "value": -90.2, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1710.0, + "value": -1360.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -128.0, + "value": -107.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2160.0, + "value": -2140.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 243645, + "value": 241787, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -117.0, + "value": -102.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1800.0, + "value": -1630.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/ethmac_lvt/rules-base.json b/flow/designs/asap7/ethmac_lvt/rules-base.json index 1e3ce0a680..3f6b71c8b5 100644 --- a/flow/designs/asap7/ethmac_lvt/rules-base.json +++ b/flow/designs/asap7/ethmac_lvt/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -62.7, + "value": -21.7, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -907.0, + "value": -113.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -70.3, + "value": -28.9, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1130.0, + "value": -263.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -56.5, + "value": -19.6, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -904.0, + "value": -94.2, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/gcd-ccs/rules-base.json b/flow/designs/asap7/gcd-ccs/rules-base.json index 102e04c4e8..990e39d816 100644 --- a/flow/designs/asap7/gcd-ccs/rules-base.json +++ b/flow/designs/asap7/gcd-ccs/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 520, + "value": 489, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 45, + "value": 42, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 44, + "value": 42, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -33.8, + "value": -21.3, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -103.0, + "value": -67.8, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -33.8, + "value": -15.5, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -102.0, + "value": -62.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1358, + "value": 925, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -56.6, + "value": -37.9, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -324.0, + "value": -180.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 54, + "value": 53, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/gcd/rules-base.json b/flow/designs/asap7/gcd/rules-base.json index 815558c3d0..b8a5a4a404 100644 --- a/flow/designs/asap7/gcd/rules-base.json +++ b/flow/designs/asap7/gcd/rules-base.json @@ -28,7 +28,7 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -38.0, + "value": -29.6, "compare": ">=" }, "cts__timing__setup__tns": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -47.4, + "value": -39.7, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -290.0, + "value": -225.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1053, + "value": 1006, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -37.5, + "value": -32.2, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -185.0, + "value": -141.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/ibex/rules-base.json b/flow/designs/asap7/ibex/rules-base.json index 4ea1cb0ccc..fb2ed8ed93 100644 --- a/flow/designs/asap7/ibex/rules-base.json +++ b/flow/designs/asap7/ibex/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -139.0, + "value": -79.4, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -48300.0, + "value": -442.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -151.0, + "value": -87.4, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -82000.0, + "value": -592.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -125.0, + "value": -69.1, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -46500.0, + "value": -286.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/mock-alu/rules-base.json b/flow/designs/asap7/mock-alu/rules-base.json index 6de35a7d79..41d7e8aa44 100644 --- a/flow/designs/asap7/mock-alu/rules-base.json +++ b/flow/designs/asap7/mock-alu/rules-base.json @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1808, + "value": 1790, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -18100.0, + "value": -13200.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -21700.0, + "value": -15100.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -18600.0, + "value": -13000.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/mock-cpu/rules-base.json b/flow/designs/asap7/mock-cpu/rules-base.json index fa1aefe3a0..008068335e 100644 --- a/flow/designs/asap7/mock-cpu/rules-base.json +++ b/flow/designs/asap7/mock-cpu/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -103.0, + "value": -89.5, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -2070.0, + "value": -1430.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -104.0, + "value": -90.9, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2350.0, + "value": -1780.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -97.7, + "value": -84.6, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -2230.0, + "value": -1670.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/riscv32i-mock-sram/rules-base.json b/flow/designs/asap7/riscv32i-mock-sram/rules-base.json index 071fb38ee6..fe4797062a 100644 --- a/flow/designs/asap7/riscv32i-mock-sram/rules-base.json +++ b/flow/designs/asap7/riscv32i-mock-sram/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -224.0, + "value": -209.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 67341, + "value": 65578, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -106.0, + "value": -66.8, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -26300.0, + "value": -363.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/riscv32i/rules-base.json b/flow/designs/asap7/riscv32i/rules-base.json index e71b73a916..763594330b 100644 --- a/flow/designs/asap7/riscv32i/rules-base.json +++ b/flow/designs/asap7/riscv32i/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -117.0, + "value": -51.1, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -23200.0, + "value": -220.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -100.0, + "value": -60.9, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -19800.0, + "value": -1010.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 70494, + "value": 67276, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -4450.0, + "value": -261.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/swerv_wrapper/rules-base.json b/flow/designs/asap7/swerv_wrapper/rules-base.json index 1c5d4f56db..6a509049e7 100644 --- a/flow/designs/asap7/swerv_wrapper/rules-base.json +++ b/flow/designs/asap7/swerv_wrapper/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 55786, + "value": 55101, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 167763, + "value": 156615, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 14588, + "value": 13619, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 14588, + "value": 13619, "compare": "<=" }, "cts__timing__setup__ws": { @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 118, + "value": 117, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1711340, + "value": 1483815, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 118, + "value": 117, "compare": "<=" }, "finish__timing__setup__ws": { @@ -84,19 +84,19 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -12900.0, + "value": -11700.0, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -332.0, + "value": -134.0, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -545000.0, + "value": -11000.0, "compare": ">=" }, "finish__design__instance__area": { - "value": 56249, + "value": 55530, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/uart/rules-base.json b/flow/designs/asap7/uart/rules-base.json index 41a1e745d0..fff05ed184 100644 --- a/flow/designs/asap7/uart/rules-base.json +++ b/flow/designs/asap7/uart/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -927.0, + "value": -756.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1640.0, + "value": -1360.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 2030, + "value": 1673, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1030.0, + "value": -690.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 119, + "value": 109, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf180/aes-hybrid/rules-base.json b/flow/designs/gf180/aes-hybrid/rules-base.json index 8c1d4ef4c6..42ece06169 100644 --- a/flow/designs/gf180/aes-hybrid/rules-base.json +++ b/flow/designs/gf180/aes-hybrid/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -1.16, + "value": -1.14, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -155.0, + "value": -137.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -1.29, + "value": -1.27, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -170.0, + "value": -154.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -166.0, + "value": -148.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 762911, + "value": 752796, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf180/aes/rules-base.json b/flow/designs/gf180/aes/rules-base.json index 58ca477974..864fdbe9fb 100644 --- a/flow/designs/gf180/aes/rules-base.json +++ b/flow/designs/gf180/aes/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -101.0, + "value": -98.7, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -1.06, + "value": -1.04, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -119.0, + "value": -118.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1368635, + "value": 1359688, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -114.0, + "value": -112.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/gf180/ibex/rules-base.json b/flow/designs/gf180/ibex/rules-base.json index 5d6d354b54..18835caee7 100644 --- a/flow/designs/gf180/ibex/rules-base.json +++ b/flow/designs/gf180/ibex/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.518, + "value": -0.507, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -2.04, + "value": -2.01, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.683, + "value": -0.59, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -8.66, + "value": -2.32, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.628, + "value": -0.601, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -2.6, + "value": -2.22, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/gf180/jpeg/rules-base.json b/flow/designs/gf180/jpeg/rules-base.json index 9da8363f53..67e5147e29 100644 --- a/flow/designs/gf180/jpeg/rules-base.json +++ b/flow/designs/gf180/jpeg/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 51347, + "value": 51218, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 4465, + "value": 4454, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 4465, + "value": 4454, "compare": "<=" }, "cts__timing__setup__ws": { diff --git a/flow/designs/gf180/riscv32i/rules-base.json b/flow/designs/gf180/riscv32i/rules-base.json index c9c7102342..fe9c6ee742 100644 --- a/flow/designs/gf180/riscv32i/rules-base.json +++ b/flow/designs/gf180/riscv32i/rules-base.json @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.5, + "value": -0.471, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2.0, + "value": -1.86, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.5, + "value": -0.453, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.87, + "value": -1.8, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/ihp-sg13g2/aes/rules-base.json b/flow/designs/ihp-sg13g2/aes/rules-base.json index bd5fa98563..d20b95319c 100644 --- a/flow/designs/ihp-sg13g2/aes/rules-base.json +++ b/flow/designs/ihp-sg13g2/aes/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 214000.0, + "value": 208000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 200905, + "value": 197224, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 18614, + "value": 18253, "compare": "<=" }, "detailedplace__design__violations": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 204761, + "value": 201215, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/ihp-sg13g2/gcd/rules-base.json b/flow/designs/ihp-sg13g2/gcd/rules-base.json index 8c7b58a53a..a74bfae7db 100644 --- a/flow/designs/ihp-sg13g2/gcd/rules-base.json +++ b/flow/designs/ihp-sg13g2/gcd/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 6197, + "value": 6153, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 508, + "value": 443, "compare": "<=" }, "detailedplace__design__violations": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 11161, + "value": 11091, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 6473, + "value": 6429, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/ihp-sg13g2/jpeg/rules-base.json b/flow/designs/ihp-sg13g2/jpeg/rules-base.json index ce42b4ed9f..1db51ffa17 100644 --- a/flow/designs/ihp-sg13g2/jpeg/rules-base.json +++ b/flow/designs/ihp-sg13g2/jpeg/rules-base.json @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 135, + "value": 118, "compare": "<=" }, "finish__timing__setup__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1053077, + "value": 1041769, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/aes/rules-base.json b/flow/designs/nangate45/aes/rules-base.json index c06b130a4f..0259ea49ed 100644 --- a/flow/designs/nangate45/aes/rules-base.json +++ b/flow/designs/nangate45/aes/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 19700.0, + "value": 19000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 23356, + "value": 22666, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 18239, + "value": 18129, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 1586, + "value": 1576, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 1586, + "value": 1576, "compare": "<=" }, "cts__timing__setup__ws": { @@ -80,7 +80,7 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.0439, + "value": -0.0432, "compare": ">=" }, "finish__timing__setup__tns": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 23597, + "value": 22909, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/ariane133/rules-base.json b/flow/designs/nangate45/ariane133/rules-base.json index 6ad8080e09..932d873880 100644 --- a/flow/designs/nangate45/ariane133/rules-base.json +++ b/flow/designs/nangate45/ariane133/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 825864.85, + "value": 825000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.845, + "value": -0.694, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1730.0, + "value": -1190.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.852, + "value": -0.699, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1770.0, + "value": -1260.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.867, + "value": -0.716, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1800.0, + "value": -1510.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/ariane136/rules-base.json b/flow/designs/nangate45/ariane136/rules-base.json index da7d50fb47..e48b97d4ae 100644 --- a/flow/designs/nangate45/ariane136/rules-base.json +++ b/flow/designs/nangate45/ariane136/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 845982.06, + "value": 845000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 853182, + "value": 847520, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -36,7 +36,7 @@ "compare": ">=" }, "cts__timing__hold__ws": { - "value": -0.693, + "value": -0.678, "compare": ">=" }, "cts__timing__hold__tns": { @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 202, + "value": 200, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 202, + "value": 201, "compare": "<=" }, "finish__timing__setup__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 864432, + "value": 858672, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/black_parrot/rules-base.json b/flow/designs/nangate45/black_parrot/rules-base.json index fc21694bef..0bc0df18eb 100644 --- a/flow/designs/nangate45/black_parrot/rules-base.json +++ b/flow/designs/nangate45/black_parrot/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 777000.0, + "value": 776000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 774157, + "value": 724309, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 280905, + "value": 242399, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,15 +20,15 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 24426, + "value": 21078, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 24426, + "value": 21078, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -2.88, + "value": -2.8, "compare": ">=" }, "cts__timing__setup__tns": { @@ -48,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -3.04, + "value": -2.97, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 6985506, + "value": 6759084, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,7 +80,7 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -2.85, + "value": -2.78, "compare": ">=" }, "finish__timing__setup__tns": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 788072, + "value": 737075, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/bp_be_top/rules-base.json b/flow/designs/nangate45/bp_be_top/rules-base.json index b579bb1766..2140525de9 100644 --- a/flow/designs/nangate45/bp_be_top/rules-base.json +++ b/flow/designs/nangate45/bp_be_top/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.423, + "value": -0.411, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -32.1, + "value": -24.3, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.431, + "value": -0.427, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -35.9, + "value": -29.9, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.43, + "value": -0.418, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -35.5, + "value": -28.5, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/bp_fe_top/rules-base.json b/flow/designs/nangate45/bp_fe_top/rules-base.json index 87db27968c..6f22269795 100644 --- a/flow/designs/nangate45/bp_fe_top/rules-base.json +++ b/flow/designs/nangate45/bp_fe_top/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.23, + "value": -0.411, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1912200, + "value": 1673870, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.222, + "value": -0.206, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -13.8, + "value": -9.95, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index f2e45fdecf..87610d44e9 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 570000.0, + "value": 568000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 580304, + "value": 574894, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 110096, + "value": 108887, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 9574, + "value": 9468, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 9574, + "value": 9468, "compare": "<=" }, "cts__timing__setup__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 4677863, + "value": 3920880, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -4.92, + "value": -0.24, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -373.0, + "value": -0.96, "compare": ">=" }, "finish__timing__hold__ws": { @@ -92,11 +92,11 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -2.35, + "value": -0.96, "compare": ">=" }, "finish__design__instance__area": { - "value": 587157, + "value": 581449, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/dynamic_node/rules-base.json b/flow/designs/nangate45/dynamic_node/rules-base.json index bdac02bcce..9cf3eed023 100644 --- a/flow/designs/nangate45/dynamic_node/rules-base.json +++ b/flow/designs/nangate45/dynamic_node/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.423, + "value": -0.362, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1.51, + "value": -1.45, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.434, + "value": -0.38, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.63, + "value": -1.49, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 219107, + "value": 208117, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.408, + "value": -0.344, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.45, + "value": -1.32, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/gcd/rules-base.json b/flow/designs/nangate45/gcd/rules-base.json index 9660611774..40ceae99f8 100644 --- a/flow/designs/nangate45/gcd/rules-base.json +++ b/flow/designs/nangate45/gcd/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 725.6, + "value": 723.0, "compare": "<=" }, "constraints__clocks__count": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0696, + "value": -0.0599, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.812, + "value": -0.448, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0841, + "value": -0.0751, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.47, + "value": -1.06, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.0744, + "value": -0.0688, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.05, + "value": -0.821, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/ibex/rules-base.json b/flow/designs/nangate45/ibex/rules-base.json index 6bfd481475..57b78f4f4e 100644 --- a/flow/designs/nangate45/ibex/rules-base.json +++ b/flow/designs/nangate45/ibex/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.07, + "value": -0.626, "compare": ">=" }, "globalroute__timing__hold__ws": { diff --git a/flow/designs/nangate45/mempool_group/rules-base.json b/flow/designs/nangate45/mempool_group/rules-base.json index bcddcbc98d..68c3af717b 100644 --- a/flow/designs/nangate45/mempool_group/rules-base.json +++ b/flow/designs/nangate45/mempool_group/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 451188, + "value": 444176, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 198708, + "value": 194613, "compare": "<=" }, "detailedplace__design__violations": { @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -15000.0, + "value": -13300.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -14200.0, + "value": -11200.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 5795200, + "value": 5508759, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -12400.0, + "value": -11000.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -92,11 +92,11 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -3.1, + "value": -1.77, "compare": ">=" }, "finish__design__instance__area": { - "value": 461350, + "value": 453719, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/swerv/rules-base.json b/flow/designs/nangate45/swerv/rules-base.json index 1d6b11da14..0693282dcc 100644 --- a/flow/designs/nangate45/swerv/rules-base.json +++ b/flow/designs/nangate45/swerv/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.532, + "value": -0.518, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -357.0, + "value": -338.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.544, + "value": -0.533, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -380.0, + "value": -329.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.533, + "value": -0.524, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -375.0, + "value": -311.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index 915f52719e..2ee7e0a7e6 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.285, + "value": -0.237, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -86.3, + "value": -68.7, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 5546498, + "value": 5077847, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.315, + "value": -0.256, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -88.2, + "value": -66.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/tinyRocket/rules-base.json b/flow/designs/nangate45/tinyRocket/rules-base.json index 1744724c46..f546d8c309 100644 --- a/flow/designs/nangate45/tinyRocket/rules-base.json +++ b/flow/designs/nangate45/tinyRocket/rules-base.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 60645, + "value": 60308, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 32140, + "value": 31653, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 2795, + "value": 2752, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 2795, + "value": 2752, "compare": "<=" }, "cts__timing__setup__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -48.5, + "value": -44.3, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 539547, + "value": 538070, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -39.0, + "value": -38.1, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 62486, + "value": 62067, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/aes/rules-base.json b/flow/designs/sky130hd/aes/rules-base.json index 35d8773839..2721f12272 100644 --- a/flow/designs/sky130hd/aes/rules-base.json +++ b/flow/designs/sky130hd/aes/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 20599, + "value": 20235, "compare": "<=" }, "detailedplace__design__violations": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -1.24, + "value": -0.854, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -20.3, + "value": -14.4, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -1.03, + "value": -0.767, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -8.65, + "value": -7.56, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 155682, + "value": 146144, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/chameleon/rules-base.json b/flow/designs/sky130hd/chameleon/rules-base.json index 3f105102ea..e49df076c1 100644 --- a/flow/designs/sky130hd/chameleon/rules-base.json +++ b/flow/designs/sky130hd/chameleon/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -4.65, + "value": -3.88, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -205.0, + "value": -125.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 218, + "value": 122, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -4.17, + "value": -3.77, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -200.0, + "value": -86.7, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 808834, + "value": 788362, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -72,19 +72,19 @@ "compare": "<=" }, "detailedroute__antenna__violating__nets": { - "value": 4, + "value": 0, "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 218, + "value": 136, "compare": "<=" }, "finish__timing__setup__ws": { - "value": -3.79, + "value": -3.59, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -183.0, + "value": -79.8, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/gcd/rules-base.json b/flow/designs/sky130hd/gcd/rules-base.json index 6e86e2fd3d..8fab3fb34d 100644 --- a/flow/designs/sky130hd/gcd/rules-base.json +++ b/flow/designs/sky130hd/gcd/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -2.27, + "value": -1.82, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -95.5, + "value": -77.3, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -2.42, + "value": -1.91, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -99.7, + "value": -85.4, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -2.28, + "value": -1.8, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -92.8, + "value": -80.8, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/ibex/rules-base.json b/flow/designs/sky130hd/ibex/rules-base.json index 5ec4bf4827..429672309c 100644 --- a/flow/designs/sky130hd/ibex/rules-base.json +++ b/flow/designs/sky130hd/ibex/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -4.96, + "value": -2.82, "compare": ">=" }, "globalroute__timing__hold__ws": { diff --git a/flow/designs/sky130hd/jpeg/rules-base.json b/flow/designs/sky130hd/jpeg/rules-base.json index 4698f87333..04e90985a0 100644 --- a/flow/designs/sky130hd/jpeg/rules-base.json +++ b/flow/designs/sky130hd/jpeg/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 463729.45, + "value": 463000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.888, + "value": -0.781, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -145.0, + "value": -110.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 122, + "value": 100, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -250.0, + "value": -185.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 125, + "value": 116, "compare": "<=" }, "finish__timing__setup__ws": { @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -128.0, + "value": -90.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/microwatt/rules-base.json b/flow/designs/sky130hd/microwatt/rules-base.json index dc3dfd9737..15d7239d50 100644 --- a/flow/designs/sky130hd/microwatt/rules-base.json +++ b/flow/designs/sky130hd/microwatt/rules-base.json @@ -32,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -261.0, + "value": -211.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -241.0, + "value": -220.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -76,11 +76,11 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 1970, + "value": 1724, "compare": "<=" }, "finish__timing__setup__ws": { - "value": -1.38, + "value": -1.34, "compare": ">=" }, "finish__timing__setup__tns": { @@ -88,7 +88,7 @@ "compare": ">=" }, "finish__timing__hold__ws": { - "value": -1.68, + "value": -1.6, "compare": ">=" }, "finish__timing__hold__tns": { diff --git a/flow/designs/sky130hd/riscv32i/rules-base.json b/flow/designs/sky130hd/riscv32i/rules-base.json index f44a048e24..7fcf2c4ece 100644 --- a/flow/designs/sky130hd/riscv32i/rules-base.json +++ b/flow/designs/sky130hd/riscv32i/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 8498, + "value": 8393, "compare": "<=" }, "detailedplace__design__violations": { @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -1.66, + "value": -1.07, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -55.4, + "value": -15.4, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -1.77, + "value": -1.19, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -140.0, + "value": -16.2, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -1.71, + "value": -1.06, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -69.3, + "value": -11.6, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hs/aes/rules-base.json b/flow/designs/sky130hs/aes/rules-base.json index 025435c2ce..3c79d79eef 100644 --- a/flow/designs/sky130hs/aes/rules-base.json +++ b/flow/designs/sky130hs/aes/rules-base.json @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.454, + "value": -0.224, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -4.24, + "value": -1.92, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -0.241, + "value": -0.15, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.71, + "value": -0.57, "compare": ">=" }, "finish__timing__hold__ws": { @@ -96,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 177126, + "value": 176489, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hs/jpeg/rules-base.json b/flow/designs/sky130hs/jpeg/rules-base.json index 418426dbef..e3dc5ecd4b 100644 --- a/flow/designs/sky130hs/jpeg/rules-base.json +++ b/flow/designs/sky130hs/jpeg/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 56059, + "value": 56019, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 4875, + "value": 4871, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 4875, + "value": 4871, "compare": "<=" }, "cts__timing__setup__ws": { @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 200, + "value": 100, "compare": "<=" }, "globalroute__timing__setup__ws": { diff --git a/flow/designs/sky130hs/riscv32i/rules-base.json b/flow/designs/sky130hs/riscv32i/rules-base.json index d56e3d7fa5..e7141d363c 100644 --- a/flow/designs/sky130hs/riscv32i/rules-base.json +++ b/flow/designs/sky130hs/riscv32i/rules-base.json @@ -28,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.854, + "value": -0.786, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -293.0, + "value": -183.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -48,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -1.19, + "value": -1.15, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -832.0, + "value": -406.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 352098, + "value": 351774, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -80,11 +80,11 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -1.01, + "value": -0.876, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -514.0, + "value": -207.0, "compare": ">=" }, "finish__timing__hold__ws": { From ef457f5126402e650f0d420526e251d315685504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Mai?= Date: Thu, 26 Mar 2026 22:58:17 +0000 Subject: [PATCH 168/202] bump OR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Mai --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index d1dde03fc8..af6324a7d9 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit d1dde03fc87613ac137b06ce4c4938b02cfad2df +Subproject commit af6324a7d9be6ffae6c0a1c3bb128da113aedad8 From efe3ba370b491ea28856c55c1501fad9ed800275 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 27 Mar 2026 10:45:27 +0900 Subject: [PATCH 169/202] Bump OR (secure-fix-cloned-icg-loc-coll update) Signed-off-by: Jaehyun Kim --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index 4e9f481325..9d073cee39 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit 4e9f481325f5aa23b888c872857ba9021eec0e0a +Subproject commit 9d073cee39efa48b6d5a7e00a4387d0798aa04a1 From bcd97f1086b9c97cdb57bd35bb40951a73a6d167 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 27 Mar 2026 11:08:08 +0900 Subject: [PATCH 170/202] Retrigger CI (OR submodule commit now available on remote) Signed-off-by: Jaehyun Kim From ce077d93479bde7a2663639e62dfa032e0846cb4 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 27 Mar 2026 17:54:57 +0900 Subject: [PATCH 171/202] Update rapidus2hp hercules_idecode metrics designs/rapidus2hp/hercules_idecode/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__timing__setup__tns | -0.339 | -0.473 | Failing | | finish__timing__setup__tns | -0.339 | -0.473 | Failing | Signed-off-by: Jaehyun Kim --- flow/designs/rapidus2hp/hercules_idecode/rules-base.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json index eb56be08be..b40328635d 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.339, + "value": -0.473, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.339, + "value": -0.473, "compare": ">=" }, "finish__timing__hold__ws": { From 12fc65b1ab0a4c7b77d8ad0b1c0c0d8b6aa988be Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 27 Mar 2026 21:04:11 +0900 Subject: [PATCH 172/202] Disable KF LEC for rapidus2hp/cva6, update nangate45/bp_multi_top metrics rapidus2hp/cva6: KF LEC assertion failure (SNLLogicCloud.cpp:381) persists with updated OR submodule. Re-disable LEC_CHECK. designs/nangate45/bp_multi_top/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | finish__timing__hold__tns | -0.96 | -2.21 | Failing | Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/bp_multi_top/rules-base.json | 2 +- flow/designs/rapidus2hp/cva6/config.mk | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index 87610d44e9..759959a0a8 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -92,7 +92,7 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.96, + "value": -2.21, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index da52a1ca62..4af13fca5e 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -148,3 +148,6 @@ export SYNTH_CANONICALIZE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/canoni export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 + +# KF LEC assertion failure: SNLLogicCloud.cpp:381 iso.getDrivers().size() == 1 +export LEC_CHECK = 0 From 77f6de9137a31ce2ee9f65bad1c91d2c0cbcc00d Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 27 Mar 2026 22:00:42 +0900 Subject: [PATCH 173/202] Revert "Disable KF LEC for rapidus2hp/cva6, update nangate45/bp_multi_top metrics" This reverts commit 12fc65b1ab0a4c7b77d8ad0b1c0c0d8b6aa988be. Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/bp_multi_top/rules-base.json | 2 +- flow/designs/rapidus2hp/cva6/config.mk | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index 759959a0a8..87610d44e9 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -92,7 +92,7 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -2.21, + "value": -0.96, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index 4af13fca5e..da52a1ca62 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -148,6 +148,3 @@ export SYNTH_CANONICALIZE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/canoni export SWAP_ARITH_OPERATORS = 1 export OPENROAD_HIERARCHICAL = 1 - -# KF LEC assertion failure: SNLLogicCloud.cpp:381 iso.getDrivers().size() == 1 -export LEC_CHECK = 0 From 2a248b83297a74a95e764082c14bf15cf31c600b Mon Sep 17 00:00:00 2001 From: Jeff Ng Date: Fri, 27 Mar 2026 14:14:45 +0000 Subject: [PATCH 174/202] Metrics update for missing ULVT custom library Signed-off-by: Jeff Ng --- flow/designs/rapidus2hp/cva6/rules-verific.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json index 9626438b82..61b8668d9c 100644 --- a/flow/designs/rapidus2hp/cva6/rules-verific.json +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 14072, + "value": 14025, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 146806, + "value": 145376, "compare": "<=" }, "detailedplace__design__violations": { @@ -20,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 12766, + "value": 12641, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 12766, + "value": 12641, "compare": "<=" }, "cts__timing__setup__ws": { @@ -44,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 122, + "value": 121, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -80,7 +80,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 14515, + "value": 14478, "compare": "<=" } } \ No newline at end of file From f56ae538a55675bf5852c34439501ff48b4cd77c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Sat, 28 Mar 2026 09:07:12 +0100 Subject: [PATCH 175/202] Update .bazelversion from 7.6.0 to 8.6.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bazelisk walks up the directory tree to find .bazelversion, so this file shadows tools/OpenROAD/.bazelversion (8.6.0) when working in the OpenROAD submodule. This caused a cryptic module resolution error instead of using the correct Bazel version. Fixes: The-OpenROAD-Project/OpenROAD#9978 Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- .bazelversion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bazelversion b/.bazelversion index 93c8ddab9f..acd405b1d6 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.6.0 +8.6.0 From 7b03fa0b8f9454893c1f995fc8605bba97968b50 Mon Sep 17 00:00:00 2001 From: ashnaaseth2325-oss Date: Sat, 28 Mar 2026 12:48:34 +0000 Subject: [PATCH 176/202] util: use context managers in genMetrics.py to fix fd leaks Replace bare open()/close() calls in read_sdc() and merge_jsons() with context managers so file descriptors are released on exception. Signed-off-by: Ashnaa Seth Signed-off-by: ashnaaseth2325-oss --- flow/util/genMetrics.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/flow/util/genMetrics.py b/flow/util/genMetrics.py index 938a4c91fb..62c8b6dc33 100755 --- a/flow/util/genMetrics.py +++ b/flow/util/genMetrics.py @@ -142,17 +142,14 @@ def extractGnuTime(prefix, jsonFile, file): # def read_sdc(file_name): clkList = [] - sdcFile = None try: - sdcFile = open(file_name, "r") + with open(file_name, "r") as sdcFile: + lines = sdcFile.readlines() except IOError: print("[WARN] Failed to open file:", file_name) return clkList - lines = sdcFile.readlines() - sdcFile.close() - for line in lines: if len(line.split()) < 2: continue @@ -185,10 +182,9 @@ def is_git_repo(folder=None): def merge_jsons(root_path, output, files): paths = sorted(glob(os.path.join(root_path, files))) for path in paths: - file = open(path, "r") - data = json.load(file) + with open(path, "r") as file: + data = json.load(file) output.update(data) - file.close() def extract_metrics( From f094e248d4959a997df16cbe120cbfc39751d826 Mon Sep 17 00:00:00 2001 From: Ashnaa Seth Date: Sat, 28 Mar 2026 12:58:08 +0000 Subject: [PATCH 177/202] util: make --logs/--reports/--results required in genMetrics.py Signed-off-by: Ashnaa Seth Signed-off-by: ashnaaseth2325-oss --- flow/util/genMetrics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flow/util/genMetrics.py b/flow/util/genMetrics.py index 938a4c91fb..45a4c4f52a 100755 --- a/flow/util/genMetrics.py +++ b/flow/util/genMetrics.py @@ -48,9 +48,9 @@ def parse_args(): "--output", "-o", required=False, default="metadata.json", help="Output file" ) parser.add_argument("--hier", "-x", action="store_true", help="Hierarchical JSON") - parser.add_argument("--logs", help="Path to logs") - parser.add_argument("--reports", help="Path to reports") - parser.add_argument("--results", help="Path to results") + parser.add_argument("--logs", required=True, help="Path to logs") + parser.add_argument("--reports", required=True, help="Path to reports") + parser.add_argument("--results", required=True, help="Path to results") args = parser.parse_args() return args From fad0fa127e4a78c45c9912cce3e56e49cce29b1a Mon Sep 17 00:00:00 2001 From: ashnaaseth2325-oss Date: Sat, 28 Mar 2026 13:27:53 +0000 Subject: [PATCH 178/202] util: fix KeyError on missing last_log in genReport.py Initialize d["last_log"] = "" before the os.walk loop so that designs with no .log files report finished=False instead of crashing. Signed-off-by: Ashnaa Seth Signed-off-by: ashnaaseth2325-oss --- flow/util/genReport.py | 1 + 1 file changed, 1 insertion(+) diff --git a/flow/util/genReport.py b/flow/util/genReport.py index 4856deff09..02b898775b 100755 --- a/flow/util/genReport.py +++ b/flow/util/genReport.py @@ -264,6 +264,7 @@ def write_summary(): # check if design ran to completion without errors or warnings d["log_errors"] = list() d["log_warnings"] = list() + d["last_log"] = "" for name_ in sorted(files): temp_e, temp_w = parse_messages(os.path.join(log_dir, name_)) d["log_errors"] += temp_e From f0e83c55c398ffa7e37264d613de7868c38323b3 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sat, 28 Mar 2026 15:32:32 +0000 Subject: [PATCH 179/202] Update metrics for The-OpenROAD-Project/OpenROAD#9965 designs/rapidus2hp/hercules_idecode/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | globalroute__timing__setup__tns | -0.339 | -0.473 | Failing | | finish__timing__setup__tns | -0.339 | -0.473 | Failing | Signed-off-by: Matt Liberty --- flow/designs/rapidus2hp/hercules_idecode/rules-base.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json index eb56be08be..b40328635d 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json @@ -52,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.339, + "value": -0.473, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -68,7 +68,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.339, + "value": -0.473, "compare": ">=" }, "finish__timing__hold__ws": { From 75af8d6a651572ed0759714e796f68ca3c6e91b1 Mon Sep 17 00:00:00 2001 From: ashnaaseth2325-oss Date: Sat, 28 Mar 2026 23:20:08 +0530 Subject: [PATCH 180/202] Update flow/util/genMetrics.py Co-authored-by: Matt Liberty Signed-off-by: ashnaaseth2325-oss --- flow/util/genMetrics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/util/genMetrics.py b/flow/util/genMetrics.py index 62c8b6dc33..77bd9891a5 100755 --- a/flow/util/genMetrics.py +++ b/flow/util/genMetrics.py @@ -146,8 +146,8 @@ def read_sdc(file_name): try: with open(file_name, "r") as sdcFile: lines = sdcFile.readlines() - except IOError: - print("[WARN] Failed to open file:", file_name) +except IOError as e: + print(f"[WARN] Failed to open file: {file_name} ({e.strerror})") return clkList for line in lines: From 9f313aa8b1aaa6f7d6c4d73255e90bda7d6891a7 Mon Sep 17 00:00:00 2001 From: Ashnaa Seth Date: Sat, 28 Mar 2026 18:20:34 +0000 Subject: [PATCH 181/202] fix: correct f-string syntax Signed-off-by: Ashnaa Seth --- flow/util/genMetrics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/util/genMetrics.py b/flow/util/genMetrics.py index 77bd9891a5..e112cd1d2d 100755 --- a/flow/util/genMetrics.py +++ b/flow/util/genMetrics.py @@ -146,8 +146,8 @@ def read_sdc(file_name): try: with open(file_name, "r") as sdcFile: lines = sdcFile.readlines() -except IOError as e: - print(f"[WARN] Failed to open file: {file_name} ({e.strerror})") + except OSError as e: + print(f"[WARN] Failed to open file: {file_name} ({e})") return clkList for line in lines: From fa84634c9da6eb97f054e9c71c21de8b501be216 Mon Sep 17 00:00:00 2001 From: Ashnaa Seth Date: Sat, 28 Mar 2026 13:18:16 +0000 Subject: [PATCH 182/202] util: use context managers in addDummyToLef.py to fix fd leaks Replace bare open()/close() pairs with with-statements and add an input file existence check with a clear error message. Signed-off-by: Ashnaa Seth Signed-off-by: ashnaaseth2325-oss --- flow/util/addDummyToLef.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/flow/util/addDummyToLef.py b/flow/util/addDummyToLef.py index 3c0c828eec..2dc433f40e 100755 --- a/flow/util/addDummyToLef.py +++ b/flow/util/addDummyToLef.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import os import re import sys import argparse # argument parsing @@ -14,9 +15,12 @@ args = parser.parse_args() -f = open(args.inputLef) -content = f.read() -f.close() +if not os.path.isfile(args.inputLef): + print(f"Error: Input LEF not found: {args.inputLef}", file=sys.stderr) + sys.exit(1) + +with open(args.inputLef) as f: + content = f.read() # refMacro = "BUFH_X1M_A12TR" @@ -26,9 +30,8 @@ result, count = re.subn(pattern, replace, content, 1, re.S) if count > 0: - f = open(args.outputLef, "w") - f.write(result) - f.close() + with open(args.outputLef, "w") as f: + f.write(result) else: - print("Error: Pattern not found") + print("Error: Pattern not found", file=sys.stderr) sys.exit(1) From 918019124436fd65e1a2be96b9a82bc61f155720 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sat, 28 Mar 2026 21:13:44 +0000 Subject: [PATCH 183/202] test Signed-off-by: Matt Liberty --- tools/OpenROAD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/OpenROAD b/tools/OpenROAD index af6324a7d9..b3a329795b 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit af6324a7d9be6ffae6c0a1c3bb128da113aedad8 +Subproject commit b3a329795b7cec60e3f3eb27bf0b60e0572bd61b From 624069e9881427ee06dfd7f64dfda8fc4c647ad3 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sun, 29 Mar 2026 02:29:48 +0000 Subject: [PATCH 184/202] designs/gf12/bp_single/rules-base.json updates: | Metric | Old | New | Type | | ------ | --- | --- | ---- | | cts__timing__hold__ws | -414.0 | -385.0 | Tighten | | cts__timing__hold__tns | -3930.0 | -4460.0 | Failing | | globalroute__timing__hold__ws | -412.0 | -382.0 | Tighten | | finish__timing__hold__ws | -227.0 | -208.0 | Tighten | Signed-off-by: Matt Liberty --- flow/designs/gf12/bp_single/rules-base.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flow/designs/gf12/bp_single/rules-base.json b/flow/designs/gf12/bp_single/rules-base.json index 6eb75fc36f..e3585846e5 100644 --- a/flow/designs/gf12/bp_single/rules-base.json +++ b/flow/designs/gf12/bp_single/rules-base.json @@ -36,11 +36,11 @@ "compare": ">=" }, "cts__timing__hold__ws": { - "value": -414.0, + "value": -385.0, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -3930.0, + "value": -4460.0, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -56,7 +56,7 @@ "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -412.0, + "value": -382.0, "compare": ">=" }, "globalroute__timing__hold__tns": { @@ -88,7 +88,7 @@ "compare": ">=" }, "finish__timing__hold__ws": { - "value": -227.0, + "value": -208.0, "compare": ">=" }, "finish__timing__hold__tns": { From 93a2a936f0987bb7a5ef8cc9a0c805d2850ce47b Mon Sep 17 00:00:00 2001 From: Cho Moon Date: Sun, 29 Mar 2026 03:56:51 +0000 Subject: [PATCH 185/202] enable mod swap for 4 more designs Signed-off-by: Cho Moon --- flow/designs/asap7/cva6/config.mk | 2 ++ flow/designs/nangate45/swerv/config.mk | 2 ++ flow/designs/nangate45/tinyRocket/config.mk | 3 +++ flow/designs/sky130hd/gcd/config.mk | 3 +++ 4 files changed, 10 insertions(+) diff --git a/flow/designs/asap7/cva6/config.mk b/flow/designs/asap7/cva6/config.mk index 3882ee9347..355dba03aa 100644 --- a/flow/designs/asap7/cva6/config.mk +++ b/flow/designs/asap7/cva6/config.mk @@ -109,3 +109,5 @@ export CTS_LIB_NAME = asap7sc7p5t_INVBUF_SLVT_FF_nldm_211120 # Remove rvfi_probes_o interface export SYNTH_CANONICALIZE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/canonicalize.tcl +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/nangate45/swerv/config.mk b/flow/designs/nangate45/swerv/config.mk index 31319f817f..2a76357c5a 100644 --- a/flow/designs/nangate45/swerv/config.mk +++ b/flow/designs/nangate45/swerv/config.mk @@ -11,3 +11,5 @@ export CORE_MARGIN = 5 export PLACE_DENSITY_LB_ADDON = 0.25 export TNS_END_PERCENT = 100 +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/nangate45/tinyRocket/config.mk b/flow/designs/nangate45/tinyRocket/config.mk index d86621ba34..8c8ce35294 100644 --- a/flow/designs/nangate45/tinyRocket/config.mk +++ b/flow/designs/nangate45/tinyRocket/config.mk @@ -21,3 +21,6 @@ export CORE_UTILIZATION = 60 export CORE_ASPECT_RATIO = 1 export CORE_MARGIN = 2 export PLACE_DENSITY = 0.75 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/sky130hd/gcd/config.mk b/flow/designs/sky130hd/gcd/config.mk index 9b725dcf0b..66f35db996 100644 --- a/flow/designs/sky130hd/gcd/config.mk +++ b/flow/designs/sky130hd/gcd/config.mk @@ -11,3 +11,6 @@ export CORE_UTILIZATION = 40 export TNS_END_PERCENT = 100 export EQUIVALENCE_CHECK ?= 1 export REMOVE_CELLS_FOR_EQY = sky130_fd_sc_hd__tapvpwrvgnd* + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 From a2f7301a98ae3a7eaf9734e03256a2dadaed0a33 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 29 Mar 2026 04:45:48 +0000 Subject: [PATCH 186/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/asap7/aes/rules-base.json | 2 +- flow/designs/ihp-sg13g2/jpeg/rules-base.json | 2 +- flow/designs/nangate45/jpeg/rules-base.json | 2 +- flow/designs/nangate45/swerv_wrapper/rules-base.json | 2 +- flow/designs/sky130hd/chameleon/rules-base.json | 2 +- flow/designs/sky130hd/jpeg/rules-base.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flow/designs/asap7/aes/rules-base.json b/flow/designs/asap7/aes/rules-base.json index 76ab79317d..5d37adb92a 100644 --- a/flow/designs/asap7/aes/rules-base.json +++ b/flow/designs/asap7/aes/rules-base.json @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -303.0, + "value": -384.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/ihp-sg13g2/jpeg/rules-base.json b/flow/designs/ihp-sg13g2/jpeg/rules-base.json index 1db51ffa17..3e35a44c1a 100644 --- a/flow/designs/ihp-sg13g2/jpeg/rules-base.json +++ b/flow/designs/ihp-sg13g2/jpeg/rules-base.json @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 118, + "value": 142, "compare": "<=" }, "finish__timing__setup__ws": { diff --git a/flow/designs/nangate45/jpeg/rules-base.json b/flow/designs/nangate45/jpeg/rules-base.json index 0a0bc86bd9..b9828daea8 100644 --- a/flow/designs/nangate45/jpeg/rules-base.json +++ b/flow/designs/nangate45/jpeg/rules-base.json @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -53.0, + "value": -53.3, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index 2ee7e0a7e6..e823e2c4c5 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -66.0, + "value": -70.8, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/chameleon/rules-base.json b/flow/designs/sky130hd/chameleon/rules-base.json index e49df076c1..96373615bf 100644 --- a/flow/designs/sky130hd/chameleon/rules-base.json +++ b/flow/designs/sky130hd/chameleon/rules-base.json @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 136, + "value": 159, "compare": "<=" }, "finish__timing__setup__ws": { diff --git a/flow/designs/sky130hd/jpeg/rules-base.json b/flow/designs/sky130hd/jpeg/rules-base.json index 04e90985a0..b44db29b9e 100644 --- a/flow/designs/sky130hd/jpeg/rules-base.json +++ b/flow/designs/sky130hd/jpeg/rules-base.json @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 116, + "value": 118, "compare": "<=" }, "finish__timing__setup__ws": { From 379570f268bc4d1100f727ff5624d030ee4d0c4d Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Mon, 30 Mar 2026 10:51:51 +0900 Subject: [PATCH 187/202] metric: nangate45/bp_multi_top finish__timing__hold__tns = -0.96 -> -1.32 Signed-off-by: Jaehyun Kim --- flow/designs/nangate45/bp_multi_top/rules-base.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index 87610d44e9..15e50bdcba 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -92,7 +92,7 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.96, + "value": -1.32, "compare": ">=" }, "finish__design__instance__area": { From 041b088fa4b8973379cc7ee7d7bcb375c9fc4bdf Mon Sep 17 00:00:00 2001 From: Vitor Bandeira Date: Mon, 30 Mar 2026 12:37:15 +0000 Subject: [PATCH 188/202] test: consider WORK_HOME Signed-off-by: Vitor Bandeira --- docker/Dockerfile.dev | 5 +++-- flow/test/test_helper.sh | 41 +++++----------------------------------- flow/util/makeIssue.sh | 4 ++-- 3 files changed, 10 insertions(+), 40 deletions(-) diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index a2a822b486..2abeb09cdb 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -28,8 +28,7 @@ RUN mkdir -p /usr/local/bin/wrapped-cc && \ ENV PATH="/usr/local/bin/wrapped-cc:$PATH" -RUN ./DependencyInstaller.sh -base $options $constantBuildDir \ - && ./DependencyInstaller.sh -common $options $constantBuildDir \ +RUN ./DependencyInstaller.sh -all $options $constantBuildDir \ && rm -rf /tmp/installer /tmp/* /var/tmp/* /var/lib/apt/lists/* ARG fromImage @@ -37,3 +36,5 @@ ARG fromImage RUN echo "$fromImage" | grep -q "ubuntu" && \ strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so || \ echo "Skipping strip command as fromImage does not contain 'ubuntu'" + +WORKDIR /OpenROAD-flow-scripts diff --git a/flow/test/test_helper.sh b/flow/test/test_helper.sh index 0b6af7e2d7..dcd5081631 100755 --- a/flow/test/test_helper.sh +++ b/flow/test/test_helper.sh @@ -13,8 +13,11 @@ if [ $# -ge 4 ]; then fi TARGET=${5:-'finish metadata'} DESIGN_CONFIG=./designs/$PLATFORM/$DESIGN_NAME/$CONFIG_MK -LOG_FILE=./logs/$PLATFORM/$DESIGN_NAME.log -mkdir -p "./logs/$PLATFORM" +if [ -z "${WORK_HOME+x}" ]; then + WORK_HOME=. +fi +LOG_FILE=${WORK_HOME}/logs/$PLATFORM/$DESIGN_NAME.log +mkdir -p "${WORK_HOME}/logs/$PLATFORM" __make="make DESIGN_CONFIG=$DESIGN_CONFIG" if [ -n "${FLOW_VARIANT+x}" ]; then @@ -83,38 +86,4 @@ if [ $ret -eq 0 ] && grep -q 'power:' <(echo $TARGETS); then fi set -x -# Run Autotuner CI specifically for gcd on selected platforms. -if [ -z "${RUN_AUTOTUNER+x}" ]; then - echo "RUN_AUTOTUNER not set, disable AT test." - RUN_AUTOTUNER="false" -fi - -if [ "${RUN_AUTOTUNER}" == "true" ]; then - case $DESIGN_NAME in - "gcd") - # Keep RUN_AUTOTUNER enabled only for these designs - ;; - *) - echo "Disable AT test for design ${DESIGN_NAME}." - RUN_AUTOTUNER="false" - ;; - esac - case $PLATFORM in - "asap7" | "sky130hd" | "ihp-sg13g2" ) - # Keep RUN_AUTOTUNER enabled only for these platforms - ;; - *) - echo "Disable AT test for platform ${PLATFORM}." - RUN_AUTOTUNER="false" - ;; - esac -fi - -if [ "${RUN_AUTOTUNER}" == "true" ]; then - set +x - echo "Start AutoTuner test." - ./test/test_autotuner.sh $DESIGN_NAME $PLATFORM - set -x -fi - exit $ret diff --git a/flow/util/makeIssue.sh b/flow/util/makeIssue.sh index 0d3e34bae8..f8307558f3 100755 --- a/flow/util/makeIssue.sh +++ b/flow/util/makeIssue.sh @@ -56,8 +56,8 @@ if [[ ! -v EXCLUDE_PLATFORM ]]; then fi fi -VARS_BASENAME=vars-$DESIGN_NICKNAME-$PLATFORM-$FLOW_VARIANT -RUN_ME_SCRIPT=run-me-$DESIGN_NICKNAME-$PLATFORM-$FLOW_VARIANT.sh +VARS_BASENAME=${WORK_HOME}/vars-$DESIGN_NICKNAME-$PLATFORM-$FLOW_VARIANT +RUN_ME_SCRIPT=${WORK_HOME}/run-me-$DESIGN_NICKNAME-$PLATFORM-$FLOW_VARIANT.sh for i in $ISSUE_CP_FILE_VARS ; do if [ -v ${i} ]; then From 4db6d43597062f74d64982c6d106338410b683e5 Mon Sep 17 00:00:00 2001 From: Cho Moon Date: Mon, 30 Mar 2026 17:37:48 +0000 Subject: [PATCH 189/202] disabled module swap on ng45 / tinyRocket Signed-off-by: Cho Moon --- flow/designs/nangate45/tinyRocket/config.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/flow/designs/nangate45/tinyRocket/config.mk b/flow/designs/nangate45/tinyRocket/config.mk index 8c8ce35294..d86621ba34 100644 --- a/flow/designs/nangate45/tinyRocket/config.mk +++ b/flow/designs/nangate45/tinyRocket/config.mk @@ -21,6 +21,3 @@ export CORE_UTILIZATION = 60 export CORE_ASPECT_RATIO = 1 export CORE_MARGIN = 2 export PLACE_DENSITY = 0.75 - -export SWAP_ARITH_OPERATORS = 1 -export OPENROAD_HIERARCHICAL = 1 From a920d4e03b86712deea5e0bbbcbac2b89ee70167 Mon Sep 17 00:00:00 2001 From: Vitor Bandeira Date: Mon, 30 Mar 2026 18:07:30 +0000 Subject: [PATCH 190/202] etc: install pip packages on ubuntu24+ Signed-off-by: Vitor Bandeira --- etc/DependencyInstaller.sh | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index 6097a39696..98f286ea1e 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -44,10 +44,13 @@ _installPipCommon() { fi } +_installPipSystem() { + apt-get -y install python3-pandas python3-numpy python3-click python3-yaml python3-yamlfix +} + # Enterprise Linux 7 cleanup _install_EL7_CleanUp() { yum clean -y all - rm -rf /var/lib/apt/lists/* } # Enterprise Linux 7 package installation (EL7 = RHEL 7 or CentOS 7) @@ -76,7 +79,6 @@ _install_EL7_Packages() { # Enterprise Linux 8/9 cleanup _install_EL8_EL9_CleanUp() { dnf clean -y all - rm -rf /var/lib/apt/lists/* } # Enterprise Linux 8/9 package installation (EL8/EL9 = RHEL, Rocky Linux, AlmaLinux, or CentOS 8 as no CentOS 9 exists) @@ -426,7 +428,7 @@ case "${os}" in if [[ ${CI} == "yes" ]]; then echo "WARNING: Installing CI dependencies is only supported on Ubuntu 22.04" >&2 fi - + # Detect EL version to choose appropriate functions if [[ -f /etc/os-release ]]; then elVersion=$(awk -F= '/^VERSION_ID/{print $2}' /etc/os-release | sed 's/"//g' | cut -d. -f1) @@ -434,10 +436,10 @@ case "${os}" in echo "ERROR: Could not detect Enterprise Linux version" >&2 exit 1 fi - + # First install OpenROAD base _installORDependencies - + # Determine between EL7 vs EL8/9, since yum vs dnf should be used, and different Klayout builds exist case "${elVersion}" in "7") @@ -459,7 +461,7 @@ case "${os}" in exit 1 ;; esac - + if [[ "${option}" == "common" || "${option}" == "all" ]]; then _installPipCommon fi @@ -478,14 +480,18 @@ case "${os}" in _installUbuntuPackages "${version}" _installUbuntuCleanUp fi - if [[ "${option}" == "common" || "${option}" == "all" ]]; then - if [[ $version != "rodete" ]]; then + if [[ $version != "rodete" ]]; then + if [[ "${option}" == "common" || "${option}" == "all" ]]; then if _versionCompare ${version} -lt 23.04 ; then _installPipCommon + else + if [[ "${option}" == "base" || "${option}" == "all" ]]; then + _installPipSystem + fi fi - else - echo "Skip common for rodete" fi + else + echo "Skip pip packages for rodete" fi ;; "Darwin" ) From 5e705d37b3a882a4665e8aef4e94832574107597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Mon, 30 Mar 2026 21:58:24 +0200 Subject: [PATCH 191/202] fix: use portable path in mock-cpu constraint.sdc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hardcoded relative path `designs/src/mock-array/util.tcl` breaks when the working directory isn't the repo root. Use $::env(DESIGN_HOME) which is the standard pattern for all other SDC files. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/designs/asap7/mock-cpu/constraint.sdc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/designs/asap7/mock-cpu/constraint.sdc b/flow/designs/asap7/mock-cpu/constraint.sdc index 4648916e35..a7f3b609e2 100644 --- a/flow/designs/asap7/mock-cpu/constraint.sdc +++ b/flow/designs/asap7/mock-cpu/constraint.sdc @@ -2,7 +2,7 @@ # # This fifo is from http://www.sunburst-design.com/papers/CummingsSNUG2002SJ_FIFO1.pdf -source designs/src/mock-array/util.tcl +source $::env(DESIGN_HOME)/src/mock-array/util.tcl set sdc_version 2.0 From b193d49fb36d3dd840a526970113a146923bf834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Mon, 30 Mar 2026 21:58:38 +0200 Subject: [PATCH 192/202] fix: standardize paths in asap7 riscv32i config.mk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use $(PLATFORM_DIR) consistently instead of hardcoded ./platforms/$(PLATFORM). Fix lib path from $(LIB_DIR)/fakeram7_256x32.lib to $(PLATFORM_DIR)/lib/NLDM/fakeram7_256x32.lib to match the actual directory structure: $ find . | grep fakeram7_256x32\.lib ./platforms/asap7/lib/NLDM/fakeram7_256x32.lib $ Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/designs/asap7/riscv32i/config.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/designs/asap7/riscv32i/config.mk b/flow/designs/asap7/riscv32i/config.mk index d148ad51c9..6b4175b16a 100644 --- a/flow/designs/asap7/riscv32i/config.mk +++ b/flow/designs/asap7/riscv32i/config.mk @@ -10,8 +10,8 @@ export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/riscv32i/*.v)) export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/riscv32i/constraint.sdc ifeq ($(BLOCKS),) - export ADDITIONAL_LEFS = ./platforms/$(PLATFORM)/lef/fakeram7_256x32.lef - export ADDITIONAL_LIBS = $(LIB_DIR)/fakeram7_256x32.lib + export ADDITIONAL_LEFS = $(PLATFORM_DIR)/lef/fakeram7_256x32.lef + export ADDITIONAL_LIBS = $(PLATFORM_DIR)/lib/NLDM/fakeram7_256x32.lib endif export CORE_UTILIZATION = 62 From e8e66bd01254c679096155fab513644281571b88 Mon Sep 17 00:00:00 2001 From: Vitor Bandeira Date: Mon, 30 Mar 2026 20:38:28 +0000 Subject: [PATCH 193/202] build: use deps prefixes Signed-off-by: Vitor Bandeira --- build_openroad.sh | 19 ++++++++++++++++++- docker/Dockerfile.dev | 2 +- etc/DependencyInstaller.sh | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/build_openroad.sh b/build_openroad.sh index 74303aa69e..e93cade290 100755 --- a/build_openroad.sh +++ b/build_openroad.sh @@ -265,7 +265,24 @@ __local_build() if [ -z "${SKIP_OPENROAD+x}" ]; then echo "[INFO FLW-0018] Compiling OpenROAD." - eval ${NICE} ./tools/OpenROAD/etc/Build.sh -dir="$DIR/tools/OpenROAD/build" -threads=${PROC} -cmake=\'${OPENROAD_APP_ARGS}\' + if [ -f "${DIR}/openroad_deps_prefixes.txt" ]; then + DEPS_PREFIX_ARG="${DIR}/openroad_deps_prefixes.txt" + elif [ -f "${DIR}/tools/OpenROAD/etc/openroad_deps_prefixes.txt" ]; then + DEPS_PREFIX_ARG="${DIR}/tools/OpenROAD/etc/openroad_deps_prefixes.txt" + elif [ -f /etc/openroad_deps_prefixes.txt ]; then + DEPS_PREFIX_ARG="/etc/openroad_deps_prefixes.txt" + else + DEPS_PREFIX_ARG="" + fi + if [[ -n "${DEPS_PREFIX_ARG}" ]]; then + echo "[INFO FLW-0029] Found OpenROAD dependencies prefixes file: '${DEPS_PREFIX_ARG}'." + DEPS_PREFIX_ARG="-deps-prefixes-file=${DEPS_PREFIX_ARG}" + fi + eval ${NICE} ./tools/OpenROAD/etc/Build.sh \ + -dir="$DIR/tools/OpenROAD/build" \ + -threads=${PROC} \ + -cmake=\'${OPENROAD_APP_ARGS}\' \ + ${DEPS_PREFIX_ARG} ${NICE} cmake --build tools/OpenROAD/build --target install -j "${PROC}" fi diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 2abeb09cdb..288d4ef709 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -28,7 +28,7 @@ RUN mkdir -p /usr/local/bin/wrapped-cc && \ ENV PATH="/usr/local/bin/wrapped-cc:$PATH" -RUN ./DependencyInstaller.sh -all $options $constantBuildDir \ +RUN ./DependencyInstaller.sh -all $options $constantBuildDir -save-deps-prefixes=/etc/openroad_deps_prefixes.txt \ && rm -rf /tmp/installer /tmp/* /var/tmp/* /var/lib/apt/lists/* ARG fromImage diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index 6097a39696..cb2a5d76d9 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -368,6 +368,9 @@ while [ "$#" -gt 0 ]; do CI="yes" OR_INSTALLER_ARGS="${OR_INSTALLER_ARGS} -save-deps-prefixes=/etc/openroad_deps_prefixes.txt" ;; + -save-deps-prefixes=*) + OR_INSTALLER_ARGS="${OR_INSTALLER_ARGS} $1" + ;; -yosys-ver=*) YOSYS_VER=${1#*=} ;; From 4389880bbaa943c948ea74636437b4c8509c4a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Tue, 31 Mar 2026 00:05:08 +0200 Subject: [PATCH 194/202] Remove unused plot-area-min-clock-period.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One-off ad-hoc plotting script for some discussion post, not since maintained. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- .../mock-alu/plot-area-min-clock-period.py | 161 ------------------ 1 file changed, 161 deletions(-) delete mode 100644 flow/designs/src/mock-alu/plot-area-min-clock-period.py diff --git a/flow/designs/src/mock-alu/plot-area-min-clock-period.py b/flow/designs/src/mock-alu/plot-area-min-clock-period.py deleted file mode 100644 index 76e2e630b4..0000000000 --- a/flow/designs/src/mock-alu/plot-area-min-clock-period.py +++ /dev/null @@ -1,161 +0,0 @@ -import subprocess -import os -import re -from matplotlib import pyplot as plt -import numpy as np -from matplotlib import cm -import itertools -import argparse - - -def run(platform): - test_design = "make DESIGN_CONFIG=designs/asap7/mock-alu/config.mk" - - values = {} - - # measure three variables at the time. - measurements = { - # "datawidth": (("MOCK_ALU_WIDTH",), (8, 16, 32, 64)), - "operations": ( - ("MOCK_ALU_OPERATIONS",), - ( - "ADD", - "ADD_BRENTKUNG", - "ADD_HANCARLSON", - "ADD_INFERRED", - "ADD_KOGGESTONE", - # "ADD_RIPPLE", - # "MULT_BRENTKUNG", - # "MULT_HANCARLSON", - # "MULT_INFERRED", - # "MULT_KOGGESTONE", - # "MULT_RIPPLE", - # "MULT_HANCARLSON16", - # "MULT_HANCARLSON32", - # "MULT_HANCARLSON48", - # "MULT_HANCARLSON64", - # "MULT_HANCARLSON128", - # "ADD", - # "CLAADD", - # "KOGGESTONEADD", - # "ADD8", - # "ADD16", - # "ADD32", - # "MUX1,MUX2", - # "MUX1,MUX2,MUX3,MUX4", - # "MUX1,MUX2,MUX3,MUX4,MUX5,MUX6,MUX7,MUX8", - # "ADD", - # "AND,OR,XOR", - # "OR", - # "SHL,SHR,SRA", - # "ADD,SUB,SETCC_EQ,SETCC_NE,SETCC_LT,SETCC_ULT,SETCC_LE,SETCC_ULE", - # "MULT", - # "AND,OR,XOR,SHL,SHR,SRA,ADD,SUB,SETCC_EQ,SETCC_NE,SETCC_LT,SETCC_ULT,SETCC_LE,SETCC_ULE", - # "AND,OR,XOR,SHL,SHR,SRA,ADD,SUB,SETCC_EQ,SETCC_NE,SETCC_LT,SETCC_ULT,SETCC_LE,SETCC_ULE,MULT", - ), - ), - } - measure_ids = sorted(measurements.keys()) - - for measurement in itertools.product( - *map(lambda key: measurements[key][1], measure_ids) - ): - variant = "-".join(map(str, measurement)).replace(" ", "-") - print(f"testing {variant}") - env_change = {"FLOW_VARIANT": variant, "PLATFORM": platform} - for e in itertools.chain( - *map( - lambda measure: map( - lambda var: {var: measure[1]}, measurements[measure[0]][0] - ), - zip(measure_ids, measurement), - ) - ): - u = dict(map(lambda item: (item[0], str(item[1])), e.items())) - env_change.update(u) - env = os.environ.copy() - env.update(env_change) - - if not os.path.exists(f"results/{platform}/mock-alu/{variant}/5_route.odb"): - print(f"Measuring {variant}") - for cmd in ( - test_design + " verilog", - test_design + " route", - ): - returncode = subprocess.call(cmd, env=env, shell=True) - if returncode != 0: - print("Skipping variant, doesn't compile: " + variant) - input_string = "report_design_area\nreport_clock_min_period\n" - result = subprocess.check_output( - test_design + " open_route", - shell=True, - env=env, - input=input_string, - text=True, - ) - - m = re.search(r"period_min\s*=\s*(\d+\.\d+)", result) - if m: - min_period = float(m.group(1)) - if m is None: - print("Variant skipped: " + variant) - continue - m = re.search(r"Design area (\d+) u.*", result) - if m: - design_area = float(m.group(1)) - if m is None: - print("Variant skipped: " + variant) - continue - values[measurement] = [min_period, design_area] - - # Splitting the dictionary into x and y coordinates, and labels - x_coords = [value[0] for value in values.values()] - y_coords = [value[1] for value in values.values()] - labels = list(values.keys()) - - # Creating the scatter plot - plt.scatter(x_coords, y_coords, color="red") - - def custom_wrap(text, max_len=20): - line, length = "", 0 - - for part in text.split(","): - if length + len(part) > max_len: - yield line - line, length = part, len(part) - else: - line = f"{line},{part}" if line else part - length += len(part) + 1 - - yield line - - # Annotating each point with its label - for i, label in enumerate(labels): - plt.annotate( - "\n".join(custom_wrap(label[0])), - (x_coords[i], y_coords[i] + 0), - ha="center", - va="bottom", - ) - - # Displaying the plot - units = { - "asap7": "ps", - "sky130hd": "ns", - } - - plt.xlabel(f"minimum period/{units[platform]}") - plt.ylabel("area/u^2") - plt.title(f"{platform} ALU Operations and minimum period and area") - plt.grid(True) - - plt.show() - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Process some arguments.") - parser.add_argument( - "--platform", default="asap7", help="Specify the platform. Default is asap7." - ) - args = parser.parse_args() - run(args.platform) From e778ea22a95627bb97d8ef6db4a9696da981117d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Tue, 31 Mar 2026 00:06:29 +0200 Subject: [PATCH 195/202] Remove unused plot_congestion.py and plot_floorplan.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some ad hoc testing scripts These utility scripts are not referenced anywhere in the codebase. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/util/plot_congestion.py | 30 ------ flow/util/plot_floorplan.py | 188 ----------------------------------- 2 files changed, 218 deletions(-) delete mode 100644 flow/util/plot_congestion.py delete mode 100644 flow/util/plot_floorplan.py diff --git a/flow/util/plot_congestion.py b/flow/util/plot_congestion.py deleted file mode 100644 index dfa0e600a1..0000000000 --- a/flow/util/plot_congestion.py +++ /dev/null @@ -1,30 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -import sys -import re -import os - -sweep = sys.argv[1] -output = sys.argv[2] -remainder = sys.argv[3:] -files = remainder[: len(remainder) // 2] -values = remainder[len(remainder) // 2 :] - -# count lines in each file and divide by 3 and create a list of those -# numbers -congestion = [] -for file in files: - with open(file, "r") as f: - lines = f.readlines() - congestion.append(len(lines) // 4) - -# xy plot of density vs DRC errors -x = list(map(float, values)) -y = congestion -plt.plot(x, y, "o-") -plt.xlabel(sweep) -plt.ylabel("DRC Errors") -plt.title(sweep + " vs DRC Errors") -plt.grid() -plt.yscale("log") -plt.savefig(output) diff --git a/flow/util/plot_floorplan.py b/flow/util/plot_floorplan.py deleted file mode 100644 index 89bdd4ba58..0000000000 --- a/flow/util/plot_floorplan.py +++ /dev/null @@ -1,188 +0,0 @@ -import os -import matplotlib.pyplot as plt -from math import log - -# -# Helper function to visualize the rtlmp macro placement -# If run in ORFS rtlmp creates a dir in the objext////rtlmp -# link that dir to ./rtlmp -# run python3 utils/plot_floorplan.py -# - - -file_name = "./rtlmp/final_floorplan.txt" -net_file = "./rtlmp/partition.txt.net" - -net_threshold = 1500 - -cluster_list = [] -cluster_lx_list = [] -cluster_ly_list = [] -cluster_ux_list = [] -cluster_uy_list = [] - -macro_list = [] -macro_lx_list = [] -macro_ly_list = [] -macro_ux_list = [] -macro_uy_list = [] - -cluster_dict = {} - - -with open(file_name) as f: - content = f.read().splitlines() -f.close() - - -outline_width = float(content[0].split()[-1]) -outline_height = float(content[1].split()[-1]) - -terminal_dict = {} - -terminal_dict["LM"] = [0, outline_height / 2.0] -terminal_dict["RM"] = [outline_width, outline_height / 2.0] -terminal_dict["BM"] = [outline_width / 2.0, 0] -terminal_dict["TM"] = [outline_width / 2.0, outline_height] -terminal_dict["LL"] = [0, outline_height / 6.0] -terminal_dict["RL"] = [outline_width, outline_height / 6.0] -terminal_dict["BL"] = [outline_width / 6.0, 0.0] -terminal_dict["TL"] = [outline_width / 6.0, outline_height] -terminal_dict["LU"] = [0, outline_height * 5.0 / 6.0] -terminal_dict["RU"] = [outline_width, outline_height * 5.0 / 6.0] -terminal_dict["BU"] = [outline_width * 5.0 / 6.0, 0.0] -terminal_dict["TU"] = [outline_width * 5.0 / 6.0, outline_height] - - -i = 2 -while i < len(content): - words = content[i].split() - if len(words) == 0: - break - else: - cluster_list.append(words[0]) - cluster_lx_list.append(float(words[1])) - cluster_ly_list.append(float(words[2])) - cluster_ux_list.append(float(words[3])) - cluster_uy_list.append(float(words[4])) - cluster_dict[words[0]] = [ - (float(words[1]) + float(words[3])) / 2.0, - (float(words[2]) + float(words[4])) / 2.0, - ] - - i = i + 1 - - -i = i + 1 -while i < len(content): - words = content[i].split() - macro_list.append(words[0]) - macro_lx_list.append(float(words[1])) - macro_ly_list.append(float(words[2])) - macro_ux_list.append(float(words[3])) - macro_uy_list.append(float(words[4])) - i = i + 1 - - -net_list = [] - -with open(net_file) as f: - content = f.read().splitlines() -f.close() - -for line in content: - items = line.split() - if len(items) > 1: - source = items[1] - for j in range(2, len(items), 2): - target = items[j] - weight = float(items[j + 1]) - net_list.append([source, target, weight]) - - -plt.figure() -for i in range(len(cluster_list)): - rectangle = plt.Rectangle( - (cluster_lx_list[i], cluster_ly_list[i]), - cluster_ux_list[i] - cluster_lx_list[i], - cluster_uy_list[i] - cluster_ly_list[i], - fc="r", - ec="blue", - ) - plt.gca().add_patch(rectangle) - - -for i in range(len(macro_list)): - rectangle = plt.Rectangle( - (macro_lx_list[i], macro_ly_list[i]), - macro_ux_list[i] - macro_lx_list[i], - macro_uy_list[i] - macro_ly_list[i], - fc="yellow", - ec="blue", - ) - plt.gca().add_patch(rectangle) - - -for i in range(len(net_list)): - source = net_list[i][0] - target = net_list[i][1] - weight = net_list[i][2] - - x = [] - y = [] - - if source in cluster_dict: - x.append(cluster_dict[source][0]) - y.append(cluster_dict[source][1]) - else: - x.append(terminal_dict[source][0]) - y.append(terminal_dict[source][1]) - - if target in cluster_list: - x.append(cluster_dict[target][0]) - y.append(cluster_dict[target][1]) - else: - x.append(terminal_dict[target][0]) - y.append(terminal_dict[target][1]) - - if weight > net_threshold: - plt.plot(x, y, "k", lw=log(weight)) - - -x = [] -y = [] -x.append(0) -y.append(0) -x.append(outline_width) -y.append(0) -plt.plot(x, y, "--k") - -x = [] -y = [] -x.append(0) -y.append(0) -x.append(0) -y.append(outline_height) -plt.plot(x, y, "--k") - -x = [] -y = [] -x.append(0) -y.append(outline_height) -x.append(outline_width) -y.append(outline_height) -plt.plot(x, y, "--k") - -x = [] -y = [] -x.append(outline_width) -y.append(0) -x.append(outline_width) -y.append(outline_height) -plt.plot(x, y, "--k") - - -plt.xlim(0, outline_width) -plt.ylim(0, outline_height) -plt.axis("scaled") -plt.show() From 22b484a862b78b042255cb0d8da174c9318739e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 31 Mar 2026 00:55:46 +0000 Subject: [PATCH 196/202] flow: update rules Signed-off-by: github-actions[bot] --- flow/designs/asap7/aes/rules-base.json | 2 +- flow/designs/ihp-sg13g2/jpeg/rules-base.json | 2 +- flow/designs/nangate45/jpeg/rules-base.json | 2 +- flow/designs/nangate45/swerv_wrapper/rules-base.json | 2 +- flow/designs/sky130hd/chameleon/rules-base.json | 2 +- flow/designs/sky130hd/gcd/rules-base.json | 2 +- flow/designs/sky130hd/jpeg/rules-base.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/flow/designs/asap7/aes/rules-base.json b/flow/designs/asap7/aes/rules-base.json index 76ab79317d..5d37adb92a 100644 --- a/flow/designs/asap7/aes/rules-base.json +++ b/flow/designs/asap7/aes/rules-base.json @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -303.0, + "value": -384.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/ihp-sg13g2/jpeg/rules-base.json b/flow/designs/ihp-sg13g2/jpeg/rules-base.json index 1db51ffa17..3e35a44c1a 100644 --- a/flow/designs/ihp-sg13g2/jpeg/rules-base.json +++ b/flow/designs/ihp-sg13g2/jpeg/rules-base.json @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 118, + "value": 142, "compare": "<=" }, "finish__timing__setup__ws": { diff --git a/flow/designs/nangate45/jpeg/rules-base.json b/flow/designs/nangate45/jpeg/rules-base.json index 0a0bc86bd9..b9828daea8 100644 --- a/flow/designs/nangate45/jpeg/rules-base.json +++ b/flow/designs/nangate45/jpeg/rules-base.json @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -53.0, + "value": -53.3, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index 2ee7e0a7e6..e823e2c4c5 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -84,7 +84,7 @@ "compare": ">=" }, "finish__timing__setup__tns": { - "value": -66.0, + "value": -70.8, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hd/chameleon/rules-base.json b/flow/designs/sky130hd/chameleon/rules-base.json index e49df076c1..96373615bf 100644 --- a/flow/designs/sky130hd/chameleon/rules-base.json +++ b/flow/designs/sky130hd/chameleon/rules-base.json @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 136, + "value": 159, "compare": "<=" }, "finish__timing__setup__ws": { diff --git a/flow/designs/sky130hd/gcd/rules-base.json b/flow/designs/sky130hd/gcd/rules-base.json index 8fab3fb34d..0b617790b3 100644 --- a/flow/designs/sky130hd/gcd/rules-base.json +++ b/flow/designs/sky130hd/gcd/rules-base.json @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 9945, + "value": 14932, "compare": "<=" }, "detailedroute__route__drc_errors": { diff --git a/flow/designs/sky130hd/jpeg/rules-base.json b/flow/designs/sky130hd/jpeg/rules-base.json index 04e90985a0..b44db29b9e 100644 --- a/flow/designs/sky130hd/jpeg/rules-base.json +++ b/flow/designs/sky130hd/jpeg/rules-base.json @@ -76,7 +76,7 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 116, + "value": 118, "compare": "<=" }, "finish__timing__setup__ws": { From 71f4f530faff46d9c4600fb3baad5dedcc6bb487 Mon Sep 17 00:00:00 2001 From: Vitor Bandeira Date: Mon, 30 Mar 2026 21:07:16 +0000 Subject: [PATCH 197/202] docker: add optioin for verific Signed-off-by: Vitor Bandeira --- build_openroad.sh | 99 ++++++++++++++++++++------------------- docker/Dockerfile.builder | 20 +++++++- etc/DockerHelper.sh | 14 ++++-- 3 files changed, 79 insertions(+), 54 deletions(-) diff --git a/build_openroad.sh b/build_openroad.sh index e93cade290..aa19f183a4 100755 --- a/build_openroad.sh +++ b/build_openroad.sh @@ -29,9 +29,11 @@ OPENROAD_APP_ARGS="" DOCKER_OS_NAME="ubuntu22.04" PROC=-1 -VERIFIC_COMPONENTS='database util containers pct hier_tree verilog' WITH_VERIFIC=0 -VERIFIC_DIR="" +VERIFIC_SRC="" +VERIFIC_COMPONENTS='database util containers pct hier_tree verilog' +VERIFIC_ARGS=" VERIFIC_COMPONENTS='${VERIFIC_COMPONENTS}'" +VERIFIC_ARGS+=" ENABLE_VERIFIC=1 ENABLE_VERIFIC_VHDL=0 VERIFIC_DIR=verific" function usage() { cat << EOF @@ -145,20 +147,17 @@ while (( "$#" )); do YOSYS_OVERWRITE_ARGS=1 ;; --yosys-args) - YOSYS_USER_ARGS="$2" + YOSYS_USER_ARGS+="$2" shift ;; --with-verific) - YOSYS_USER_ARGS+=" ENABLE_VERIFIC=1" - YOSYS_USER_ARGS+=" ENABLE_VERIFIC_VHDL=0" - YOSYS_USER_ARGS+=" VERIFIC_COMPONENTS='${VERIFIC_COMPONENTS}'" - VERIFIC_DIR=${2} - if [ ! -d "${VERIFIC_DIR}" ]; then - echo "[ERROR] Verific path '${VERIFIC_DIR}' does not exist." >&2 + WITH_VERIFIC=1 + VERIFIC_SRC=${2} + if [ ! -d "${VERIFIC_SRC}" ]; then + echo "[ERROR] Verific path '${VERIFIC_SRC}' does not exist." >&2 exit 1 fi - YOSYS_USER_ARGS+=" VERIFIC_DIR=${VERIFIC_DIR}" - WITH_VERIFIC=1 + YOSYS_USER_ARGS+="${VERIFIC_ARGS}" shift ;; --openroad-args-overwrite) @@ -238,8 +237,14 @@ __docker_build() cp .dockerignore{,.bak} sed -i '/flow\/platforms/d' .dockerignore fi + options="" + if [ -n "${WITH_VERIFIC}" ]; then + cp -r "${VERIFIC_SRC}" tools/verific + options="-buildArgs=--build-arg verificPath=tools/verific" + fi ./etc/DockerHelper.sh create -target=dev -os="${DOCKER_OS_NAME}" -threads="${PROC}" - ./etc/DockerHelper.sh create -target=builder -os="${DOCKER_OS_NAME}" -threads="${PROC}" + ./etc/DockerHelper.sh create -target=builder -os="${DOCKER_OS_NAME}" -threads="${PROC}" "${options}" + rm -rf tools/verific if [ ! -z "${DOCKER_COPY_PLATFORMS+x}" ]; then mv .dockerignore{.bak,} fi @@ -248,56 +253,56 @@ __docker_build() __local_build() { if [[ "$OSTYPE" == "darwin"* ]]; then - export PATH="$(brew --prefix bison)/bin:$(brew --prefix flex)/bin:$(brew --prefix tcl-tk)/bin:$PATH" - export CMAKE_PREFIX_PATH=$(brew --prefix or-tools) + export PATH="$(brew --prefix bison)/bin:$(brew --prefix flex)/bin:$(brew --prefix tcl-tk)/bin:$PATH" + export CMAKE_PREFIX_PATH=$(brew --prefix or-tools) fi if [[ -f "/opt/rh/rh-python38/enable" ]]; then - set +u - source /opt/rh/rh-python38/enable - set -u + set +u + source /opt/rh/rh-python38/enable + set -u fi if [[ -f "/opt/rh/devtoolset-8/enable" ]]; then - # the scl script has unbound variables - set +u - source /opt/rh/devtoolset-8/enable - set -u + # the scl script has unbound variables + set +u + source /opt/rh/devtoolset-8/enable + set -u fi if [ -z "${SKIP_OPENROAD+x}" ]; then - echo "[INFO FLW-0018] Compiling OpenROAD." - if [ -f "${DIR}/openroad_deps_prefixes.txt" ]; then - DEPS_PREFIX_ARG="${DIR}/openroad_deps_prefixes.txt" - elif [ -f "${DIR}/tools/OpenROAD/etc/openroad_deps_prefixes.txt" ]; then - DEPS_PREFIX_ARG="${DIR}/tools/OpenROAD/etc/openroad_deps_prefixes.txt" - elif [ -f /etc/openroad_deps_prefixes.txt ]; then - DEPS_PREFIX_ARG="/etc/openroad_deps_prefixes.txt" - else - DEPS_PREFIX_ARG="" - fi - if [[ -n "${DEPS_PREFIX_ARG}" ]]; then - echo "[INFO FLW-0029] Found OpenROAD dependencies prefixes file: '${DEPS_PREFIX_ARG}'." - DEPS_PREFIX_ARG="-deps-prefixes-file=${DEPS_PREFIX_ARG}" - fi - eval ${NICE} ./tools/OpenROAD/etc/Build.sh \ - -dir="$DIR/tools/OpenROAD/build" \ - -threads=${PROC} \ - -cmake=\'${OPENROAD_APP_ARGS}\' \ - ${DEPS_PREFIX_ARG} - ${NICE} cmake --build tools/OpenROAD/build --target install -j "${PROC}" + echo "[INFO FLW-0018] Compiling OpenROAD." + if [ -f "${DIR}/openroad_deps_prefixes.txt" ]; then + DEPS_PREFIX_ARG="${DIR}/openroad_deps_prefixes.txt" + elif [ -f "${DIR}/tools/OpenROAD/etc/openroad_deps_prefixes.txt" ]; then + DEPS_PREFIX_ARG="${DIR}/tools/OpenROAD/etc/openroad_deps_prefixes.txt" + elif [ -f /etc/openroad_deps_prefixes.txt ]; then + DEPS_PREFIX_ARG="/etc/openroad_deps_prefixes.txt" + else + DEPS_PREFIX_ARG="" + fi + if [[ -n "${DEPS_PREFIX_ARG}" ]]; then + echo "[INFO FLW-0029] Found OpenROAD dependencies prefixes file: '${DEPS_PREFIX_ARG}'." + DEPS_PREFIX_ARG="-deps-prefixes-file=${DEPS_PREFIX_ARG}" + fi + eval ${NICE} ./tools/OpenROAD/etc/Build.sh \ + -dir="$DIR/tools/OpenROAD/build" \ + -threads=${PROC} \ + -cmake=\'${OPENROAD_APP_ARGS}\' \ + ${DEPS_PREFIX_ARG} + ${NICE} cmake --build tools/OpenROAD/build --target install -j "${PROC}" fi YOSYS_ABC_PATH=tools/yosys/abc if [[ -d "${YOSYS_ABC_PATH}/.git" ]]; then - # update indexes to make sure git diff-index uses correct data - git --work-tree=${YOSYS_ABC_PATH} --git-dir=${YOSYS_ABC_PATH}/.git update-index --refresh + # update indexes to make sure git diff-index uses correct data + git --work-tree=${YOSYS_ABC_PATH} --git-dir=${YOSYS_ABC_PATH}/.git update-index --refresh fi if [ ${WITH_VERIFIC} -eq 1 ]; then echo "[INFO FLW-0031] Compiling Verific components." - cp -r "${VERIFIC_DIR}" verific + cp -r "${VERIFIC_SRC}" tools/yosys/verific for c in ${VERIFIC_COMPONENTS}; do - make -j -C "verific/${c}" clean - make -j -C "verific/${c}" + make -j -C "tools/yosys/verific/${c}" clean + make -j -C "tools/yosys/verific/${c}" done fi @@ -322,7 +327,7 @@ __local_build() if [ ${WITH_VERIFIC} -eq 1 ]; then echo "[INFO FLW-0032] Cleaning up Verific components." - rm -rf verific + rm -rf tools/yosys/verific fi } diff --git a/docker/Dockerfile.builder b/docker/Dockerfile.builder index 62419e533c..7b8ff10f7f 100644 --- a/docker/Dockerfile.builder +++ b/docker/Dockerfile.builder @@ -31,9 +31,25 @@ ENV PATH="/usr/local/bin/wrapped-cc:$PATH" COPY --link tools tools ARG numThreads=$(nproc) ARG openroadVersion=NotSet +ARG verificPath="" -RUN echo "" > tools/yosys/abc/.gitcommit && \ - ./build_openroad.sh --no_init --local --threads ${numThreads} --openroad-args -DOPENROAD_VERSION=${openroadVersion} +RUN < tools/yosys/abc/.gitcommit +if [ -n "${verificPath}" ]; then + verificArgs="--with-verific ${verificPath}" +else + verificArgs="" +fi +./build_openroad.sh --no_init \ + --local \ + --threads ${numThreads} \ + --openroad-args -DOPENROAD_VERSION=${openroadVersion} \ + ${verificArgs} +if [ -n "${verificPath}" ]; then + rm -rf "${verificPath}" +fi +EOF FROM orfs-base diff --git a/etc/DockerHelper.sh b/etc/DockerHelper.sh index 1eb0acca56..1d31edbb69 100755 --- a/etc/DockerHelper.sh +++ b/etc/DockerHelper.sh @@ -35,6 +35,7 @@ usage: $0 [CMD] [OPTIONS] -dry-run Do not push images to the repository -push-latest Push the latest image to the repository -no-constant-build-dir Do not use constant build directory + -buildArgs= Additional build arguments to pass to docker buildx -h -help Show this message and exits EOF @@ -64,7 +65,7 @@ _setup() { "builder" | "master") fromImage="${FROM_IMAGE_OVERRIDE:-"${org}/flow-${os}-dev"}:${imageTag}" context="." - buildArgs="--build-arg numThreads=${numThreads}" + buildArgs+=" --build-arg numThreads=${numThreads}" orVersion=$(git -C tools/OpenROAD describe --tags) echo "OpenROAD version: ${orVersion}" buildArgs+=" --build-arg openroadVersion=${orVersion}" @@ -76,7 +77,7 @@ _setup() { local yosys_ver yosys_ver=v$(grep 'yosys_ver =' tools/yosys/docs/source/conf.py | awk -F'"' '{print $2}') options+=" -yosys-ver=${yosys_ver}" - buildArgs="--build-arg \"options=${options}\" ${noConstantBuildDir}" + buildArgs+=" --build-arg \"options=${options}\" ${noConstantBuildDir}" ;; *) echo "Target ${target} not found" >&2 @@ -84,7 +85,7 @@ _setup() { ;; esac imagePath="${imageName}:${imageTag}" - buildArgs="--build-arg fromImage=${fromImage} ${buildArgs}" + buildArgs+=" ${buildArgs} --build-arg fromImage=${fromImage}" file="docker/Dockerfile.${target}" } @@ -191,7 +192,7 @@ os="ubuntu22.04" target="dev" numThreads="-1" tag="" -options="" +buildArgs="" dryRun=0 pushLatest=0 @@ -201,7 +202,7 @@ while [ "$#" -gt 0 ]; do _help 0 ;; -ci ) - options="-ci" + options+=" -ci" ;; -dry-run ) dryRun=1 @@ -227,6 +228,9 @@ while [ "$#" -gt 0 ]; do -tag=* ) tag="${1#*=}" ;; + -buildArgs=* ) + buildArgs="${1#*=}" + ;; -no-constant-build-dir ) noConstantBuildDir="--build-arg constantBuildDir= " ;; From bbf96a34098b0a68574e4bea2cf0658c691d4707 Mon Sep 17 00:00:00 2001 From: Vitor Bandeira Date: Tue, 31 Mar 2026 14:02:35 +0000 Subject: [PATCH 198/202] ci: move to new version Signed-off-by: Vitor Bandeira --- Jenkinsfile | 5 ++ jenkins/public_nightly.Jenkinsfile | 76 ---------------------------- jenkins/public_tests_all.Jenkinsfile | 72 +------------------------- 3 files changed, 6 insertions(+), 147 deletions(-) create mode 100644 Jenkinsfile delete mode 100644 jenkins/public_nightly.Jenkinsfile mode change 100644 => 120000 jenkins/public_tests_all.Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000000..490967ecde --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,5 @@ +@Library('utils@main') _ + +node { + pipelineORFS() +} diff --git a/jenkins/public_nightly.Jenkinsfile b/jenkins/public_nightly.Jenkinsfile deleted file mode 100644 index 40d22ed41f..0000000000 --- a/jenkins/public_nightly.Jenkinsfile +++ /dev/null @@ -1,76 +0,0 @@ -@Library('utils@orfs-v2.3.7') _ - -node { - - properties([copyArtifactPermission('${JOB_NAME},'+env.BRANCH_NAME)]); - - stage('Checkout ORFS') { - checkout([ - $class: 'GitSCM', - branches: [[name: scm.branches[0].name]], - doGenerateSubmoduleConfigurations: false, - extensions: [ - [$class: 'CloneOption', noTags: false], - [$class: 'SubmoduleOption', recursiveSubmodules: true] - ], - submoduleCfg: [], - userRemoteConfigs: scm.userRemoteConfigs - ]); - def description = sh(script: "git log -1 --pretty=%B", returnStdout: true).trim(); - if (description.contains('ci') && description.contains('skip')) { - currentBuild.result = 'SKIPPED'; // 'SUCCESS', 'SKIPPED' - return; - } - } - - - stage('Checkout OpenROAD Latest') { - checkout([$class: "GitSCM", - branches: [[name: "*/master"]], - doGenerateSubmoduleConfigurations: false, - extensions: [ - [ - $class: "SubmoduleOption", - disableSubmodules: false, - parentCredentials: true, - recursiveSubmodules: true, - reference: "", - trackingSubmodules: false - ], - [ - $class: "RelativeTargetDirectory", - relativeTargetDir: "tools/OpenROAD" - ] - ] - ]); - } - - def DOCKER_IMAGE; - stage('Build and Push Docker Image') { - DOCKER_IMAGE = dockerPush('ubuntu22.04', 'orfs'); - echo "Docker image is $DOCKER_IMAGE"; - } - - stage('Build ORFS and Stash bins') { - buildBins(DOCKER_IMAGE, '--local --no_init --latest'); - } - - try { - stage('Run Tests') { - if (env.CHANGE_BRANCH && env.CHANGE_BRANCH.contains('ci-dev')) { - runTests(DOCKER_IMAGE, 'dev'); - } else { - runTests(DOCKER_IMAGE, 'nightly'); - } - } - } catch (e) { - throw e - } finally { - stage ('Cleanup and Reporting') { - env.CHANGE_BRANCH = 'nightly' - env.BRANCH_NAME = 'nightly' - finalReport(DOCKER_IMAGE); - } - } - -} diff --git a/jenkins/public_tests_all.Jenkinsfile b/jenkins/public_tests_all.Jenkinsfile deleted file mode 100644 index f1bff92d92..0000000000 --- a/jenkins/public_tests_all.Jenkinsfile +++ /dev/null @@ -1,71 +0,0 @@ -@Library('utils@orfs-v2.3.7') _ - -node { - - def isDefaultBranch = (env.BRANCH_NAME == 'master') - def daysToKeep = '20'; - def numToKeep = (isDefaultBranch ? '-1' : '10'); - - properties([ - copyArtifactPermission('${JOB_NAME},'+env.BRANCH_NAME), - - buildDiscarder(logRotator( - daysToKeepStr: daysToKeep, - artifactDaysToKeepStr: daysToKeep, - - numToKeepStr: numToKeep, - artifactNumToKeepStr: numToKeep - )) - ]); - - stage('Checkout') { - if (env.BRANCH_NAME && env.BRANCH_NAME == 'master') { - checkout([ - $class: 'GitSCM', - branches: [[name: scm.branches[0].name]], - doGenerateSubmoduleConfigurations: false, - extensions: [ - [$class: 'CloneOption', noTags: false], - [$class: 'SubmoduleOption', recursiveSubmodules: true] - ], - submoduleCfg: [], - userRemoteConfigs: scm.userRemoteConfigs - ]); - } - else { - checkout scm; - } - def description = sh(script: "git log -1 --pretty=%B", returnStdout: true).trim(); - if (description.contains('ci') && description.contains('skip')) { - currentBuild.result = 'SKIPPED'; // 'SUCCESS', 'SKIPPED' - return; - } - } - - def DOCKER_IMAGE; - stage('Build and Push Docker Image') { - DOCKER_IMAGE = dockerPush('ubuntu22.04', 'orfs'); - echo "Docker image is $DOCKER_IMAGE"; - } - - stage('Build ORFS and Stash bins') { - buildBins(DOCKER_IMAGE); - } - - try { - stage('Run Tests') { - if (env.CHANGE_BRANCH && env.CHANGE_BRANCH.contains('ci-dev')) { - runTests(DOCKER_IMAGE, 'dev'); - } else { - runTests(DOCKER_IMAGE, 'pr'); - } - } - } catch (e) { - throw e - } finally { - stage ('Cleanup and Reporting') { - finalReport(DOCKER_IMAGE); - } - } - -} diff --git a/jenkins/public_tests_all.Jenkinsfile b/jenkins/public_tests_all.Jenkinsfile new file mode 120000 index 0000000000..46074c1231 --- /dev/null +++ b/jenkins/public_tests_all.Jenkinsfile @@ -0,0 +1 @@ +../Jenkinsfile \ No newline at end of file From eaeb822714109b261937d1c90a725db87922eb70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Mon, 30 Mar 2026 21:58:08 +0200 Subject: [PATCH 199/202] fix: use DESIGN_DIR instead of custom dir variables in chameleon/microwatt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DESIGN_DIR is already defined in the Makefile as $(dir $(DESIGN_CONFIG)). These two designs defined redundant custom variables (chameleon_DIR, microwatt_DIR) that were identical to DESIGN_DIR. Use the standard variable to simplify config and remove non-standard patterns. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/designs/sky130hd/chameleon/config.mk | 21 ++++++++++----------- flow/designs/sky130hd/microwatt/config.mk | 8 +++----- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/flow/designs/sky130hd/chameleon/config.mk b/flow/designs/sky130hd/chameleon/config.mk index 0a1b11aa9e..2048ec0f03 100644 --- a/flow/designs/sky130hd/chameleon/config.mk +++ b/flow/designs/sky130hd/chameleon/config.mk @@ -33,20 +33,19 @@ export CORE_UTILIZATION = 70 export CORE_ASPECT_RATIO = 1.3 export CORE_MARGIN = 2 -export chameleon_DIR = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME) -export LEC_AUX_VERILOG_FILES = $(chameleon_DIR)/lec_blackbox_stubs.v +export LEC_AUX_VERILOG_FILES = $(DESIGN_DIR)/lec_blackbox_stubs.v -export ADDITIONAL_GDS = $(chameleon_DIR)/gds/apb_sys_0.gds.gz \ - $(chameleon_DIR)/gds/DMC_32x16HC.gds.gz \ - $(chameleon_DIR)/gds/DFFRAM_4K.gds.gz \ - $(chameleon_DIR)/gds/ibex_wrapper.gds.gz +export ADDITIONAL_GDS = $(DESIGN_DIR)/gds/apb_sys_0.gds.gz \ + $(DESIGN_DIR)/gds/DMC_32x16HC.gds.gz \ + $(DESIGN_DIR)/gds/DFFRAM_4K.gds.gz \ + $(DESIGN_DIR)/gds/ibex_wrapper.gds.gz -export ADDITIONAL_LEFS = $(chameleon_DIR)/lef/apb_sys_0.lef \ - $(chameleon_DIR)/lef/DFFRAM_4K.lef \ - $(chameleon_DIR)/lef/DMC_32x16HC.lef \ - $(chameleon_DIR)/lef/ibex_wrapper.lef +export ADDITIONAL_LEFS = $(DESIGN_DIR)/lef/apb_sys_0.lef \ + $(DESIGN_DIR)/lef/DFFRAM_4K.lef \ + $(DESIGN_DIR)/lef/DMC_32x16HC.lef \ + $(DESIGN_DIR)/lef/ibex_wrapper.lef -#export MACRO_PLACEMENT_TCL = $(chameleon_DIR)/macro_placement.tcl +#export MACRO_PLACEMENT_TCL = $(DESIGN_DIR)/macro_placement.tcl export FP_PDN_RAIL_WIDTH = 0.48 export FP_PDN_RAIL_OFFSET = 0 diff --git a/flow/designs/sky130hd/microwatt/config.mk b/flow/designs/sky130hd/microwatt/config.mk index 6a2021c3f5..e6cc7dfe74 100644 --- a/flow/designs/sky130hd/microwatt/config.mk +++ b/flow/designs/sky130hd/microwatt/config.mk @@ -11,13 +11,11 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint. export DIE_AREA = 0 0 3020 3610 export CORE_AREA = 10 10 3010 3600 -export microwatt_DIR = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME) +export ADDITIONAL_GDS = $(wildcard $(DESIGN_DIR)/gds/*.gds.gz) -export ADDITIONAL_GDS = $(wildcard $(microwatt_DIR)/gds/*.gds.gz) +export ADDITIONAL_LEFS = $(wildcard $(DESIGN_DIR)/lef/*.lef) -export ADDITIONAL_LEFS = $(wildcard $(microwatt_DIR)/lef/*.lef) - -export ADDITIONAL_LIBS = $(wildcard $(microwatt_DIR)/lib/*.lib) +export ADDITIONAL_LIBS = $(wildcard $(DESIGN_DIR)/lib/*.lib) export SYNTH_HIERARCHICAL = 1 From dc44f643a7bf47e8172bf2abc5bc0e8d72ce46f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Wed, 1 Apr 2026 06:09:36 +0200 Subject: [PATCH 200/202] fix: strip trailing slash from DESIGN_DIR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit $(dir ...) in GNU Make always appends a trailing slash, so DESIGN_DIR ended up as e.g. ".../chameleon/". When config.mk files use $(DESIGN_DIR)/gds/file.gds, this produced paths with "//" instead of "/". Mind-bogglingly, this was the only difference we could find that caused CI metric failures (antenna_diodes_count) in PR #4080. Strip the trailing slash with $(patsubst %/,%,...) so that replacing custom _DIR variables with DESIGN_DIR is a true no-op. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/Makefile b/flow/Makefile index 7bccdc8307..462d37bb04 100644 --- a/flow/Makefile +++ b/flow/Makefile @@ -88,7 +88,7 @@ DESIGN_CONFIG ?= ./designs/nangate45/gcd/config.mk export DESIGN_CONFIG include $(DESIGN_CONFIG) -export DESIGN_DIR ?= $(dir $(DESIGN_CONFIG)) +export DESIGN_DIR ?= $(patsubst %/,%,$(dir $(DESIGN_CONFIG))) # default value "base" for FLOW_VARIANT and "." for WORK_HOME are duplicated # from variables.yaml and variables.mk because we need it From 8e76a33ed4ed1b2e26516082ceef72abc63bcbdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Wed, 1 Apr 2026 06:26:36 +0200 Subject: [PATCH 201/202] build: remove hand-written design BUILD files and stale references MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove design BUILD.bazel files that are being replaced by auto-generated targets from the orfs_design() macro in bazel-orfs. Also remove stale merge_lib.py/preprocessLib.py references from flow/util/BUILD.bazel (files were deleted in 644ff7053 but the BUILD reference was not updated). Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Øyvind Harboe --- flow/designs/asap7/aes/BUILD.bazel | 47 -------- flow/designs/asap7/ethmac_lvt/BUILD.bazel | 24 ---- flow/designs/asap7/swerv_wrapper/BUILD.bazel | 118 ------------------- flow/designs/sky130hd/ibex/BUILD.bazel | 23 ---- flow/designs/src/aes/BUILD.bazel | 5 - flow/designs/src/ethmac/BUILD.bazel | 5 - flow/designs/src/gcd/BUILD.bazel | 5 - flow/designs/src/ibex_sv/BUILD.bazel | 9 -- flow/designs/src/swerv/BUILD.bazel | 5 - flow/util/BUILD.bazel | 5 +- 10 files changed, 1 insertion(+), 245 deletions(-) delete mode 100644 flow/designs/asap7/aes/BUILD.bazel delete mode 100644 flow/designs/asap7/ethmac_lvt/BUILD.bazel delete mode 100644 flow/designs/asap7/swerv_wrapper/BUILD.bazel delete mode 100644 flow/designs/sky130hd/ibex/BUILD.bazel delete mode 100644 flow/designs/src/aes/BUILD.bazel delete mode 100644 flow/designs/src/ethmac/BUILD.bazel delete mode 100644 flow/designs/src/gcd/BUILD.bazel delete mode 100644 flow/designs/src/ibex_sv/BUILD.bazel delete mode 100644 flow/designs/src/swerv/BUILD.bazel diff --git a/flow/designs/asap7/aes/BUILD.bazel b/flow/designs/asap7/aes/BUILD.bazel deleted file mode 100644 index 2ff325bb42..0000000000 --- a/flow/designs/asap7/aes/BUILD.bazel +++ /dev/null @@ -1,47 +0,0 @@ -load("@bazel-orfs//:openroad.bzl", "orfs_flow", "orfs_synth") - -BLACKBOXES = [ - "aes_sbox", - "aes_key_expand_128", - "aes_cipher_top", -] - -[orfs_synth( - name = "{name}_netlist_synth".format(name = name), - arguments = { - "SDC_FILE": "$(location :constraint.sdc)", - "SYNTH_BLACKBOXES": " ".join([b for b in BLACKBOXES if b != name]), - }, - data = [":constraint.sdc"], - module_top = name, - variant = "netlist", - verilog_files = ["//flow/designs/src/aes:verilog"], -) for name in BLACKBOXES] - -[filegroup( - name = "{name}_netlist".format(name = name), - srcs = ["{name}_netlist_synth".format(name = name)], - output_group = "1_synth.v", -) for name in BLACKBOXES] - -filegroup( - name = "netlists", - srcs = [":{}_netlist".format(name) for name in BLACKBOXES], -) - -orfs_flow( - name = "aes_cipher_top", - arguments = { - "ABC_AREA": "1", - "CORE_UTILIZATION": "40", - "CORE_ASPECT_RATIO": "1", - "CORE_MARGIN": "2", - "PLACE_DENSITY": "0.65", - "TNS_END_PERCENT": "100", - }, - sources = { - "SDC_FILE": [":constraint.sdc"], - "SYNTH_NETLIST_FILES": [":netlists"], - }, - top = "aes_cipher_top", -) diff --git a/flow/designs/asap7/ethmac_lvt/BUILD.bazel b/flow/designs/asap7/ethmac_lvt/BUILD.bazel deleted file mode 100644 index 6bc3354348..0000000000 --- a/flow/designs/asap7/ethmac_lvt/BUILD.bazel +++ /dev/null @@ -1,24 +0,0 @@ -load("@bazel-orfs//:openroad.bzl", "orfs_flow") - -orfs_flow( - name = "ethmac_lvt", - arguments = { - # Faster builds - "SKIP_INCREMENTAL_REPAIR": "1", - "GPL_TIMING_DRIVEN": "0", - # Various - "SDC_FILE": "$(location :constraint.sdc)", - "ABC_AREA": "1", - "CORE_UTILIZATION": "40", - "CORE_ASPECT_RATIO": "1", - "CORE_MARGIN": "2", - "PLACE_DENSITY": "0.60", - "ASAP7_USE_VT": "LVT", - "RECOVER_POWER": "1", - }, - sources = { - "SDC_FILE": [":constraint.sdc"], - }, - top = "ethmac", - verilog_files = ["//flow/designs/src/ethmac_lvt:verilog"], -) diff --git a/flow/designs/asap7/swerv_wrapper/BUILD.bazel b/flow/designs/asap7/swerv_wrapper/BUILD.bazel deleted file mode 100644 index e97eee723b..0000000000 --- a/flow/designs/asap7/swerv_wrapper/BUILD.bazel +++ /dev/null @@ -1,118 +0,0 @@ -load("@bazel-orfs//:openroad.bzl", "orfs_flow", "orfs_macro", "orfs_synth") - -FAKERAMS = [ - "fakeram7_64x21", - "fakeram7_256x34", - "fakeram7_2048x39", -] - -# BLACKBOXES are those listed in SYNTH_HIERARCHICAL=1 -# -# 33.1. IC_DATA_ICACHE_TAG_HIGH12_ICACHE_TAG_LOW6_ICACHE_IC_DEPTH8' to `/input.blif'.. - -BLACKBOXES = [ - "IC_TAG_ICACHE_TAG_HIGH12_ICACHE_TAG_LOW6_ICACHE_TAG_DEPTH64", - "dbg", - "dec_decode_ctl", - "dec_gpr_ctl_GPR_BANKS1_GPR_BANKS_LOG21", - "dec_ib_ctl", - "dec_tlu_ctl", - "dec_trigger", - "dma_ctrl", - "exu_alu_ctl", - "ifu_aln_ctl", - "ifu_bp_ctl", - "ifu_ifc_ctl", - "ifu_mem_ctl", - "lsu_bus_intf", - "lsu_dccm_ctl", - "lsu_ecc", - "lsu_lsc_ctl", - "lsu_stbuf", - "lsu_trigger", - "pic_ctrl", - "ram_256x34", - # When run with SYNTH_HIERARCHICAL=1, which should not be used here, - # the error below is produced. - # - # ERROR: Missing cost information on instanced blackbox lsu_dccm_mem - "lsu_dccm_mem", - "exu_div_ctl", - "lsu_bus_buffer", - "ram_2048x39", - "exu", - "swerv_wrapper", -] - -[orfs_synth( - name = "{name}_netlist_synth".format(name = name), - arguments = { - "SDC_FILE": "$(location :constraint.sdc)", - "SYNTH_BLACKBOXES": " ".join([b for b in BLACKBOXES if b != name]), - "SYNTH_HIERARCHICAL": "0", - }, - data = [":constraint.sdc"], - module_top = name, - variant = "netlist", - verilog_files = [ - "macros.v", - "//flow/designs/src/swerv:verilog", - ], - deps = FAKERAMS, -) for name in BLACKBOXES] - -[filegroup( - name = "{name}_netlist".format(name = name), - srcs = ["{name}_netlist_synth".format(name = name)], - output_group = "1_synth.v", -) for name in BLACKBOXES] - -# ca. 540 seconds for sequential synthesis, vs 90 seconds for netlist synthesis. -filegroup( - name = "netlists", - srcs = [":{}_netlist".format(name) for name in BLACKBOXES], -) - -# Canonicalize the netlists to avoid rebuilds unecessarily. -# -# This is more a demonstration than a practical solution. -# -# Other things could be done here, like get a netlist from git lfs, -# process the netlist in some other way, with Naja, etc. -genrule( - name = "netlists_canonicalized", - srcs = [":netlists"], - outs = ["netlists_canonicalized.v"], - cmd = """ - cat $(locations :netlists) | grep -v -E '\\(\\* src = "|Generated by Yosys' > $@ - """, -) - -[orfs_macro( - name = top, - lef = "lef/{}.lef".format(top), - lib = "lib/{}.lib".format(top), - module_top = top, -) for top in FAKERAMS] - -orfs_flow( - name = "swerv_wrapper", - arguments = { - "LIB_MODEL": "CCS", - "SYNTH_HIERARCHICAL": "1", - "DIE_AREA": "0 0 550 600", - "CORE_AREA": "5 5 545 595", - "PLACE_PINS_ARGS": "-exclude left:* -exclude right:*", - "PLACE_DENSITY_LB_ADDON": "0.20", - "TNS_END_PERCENT": "100", - "PWR_NETS_VOLTAGEsS": "", - "GND_NETS_VOLTAGES": "", - }, - macros = FAKERAMS, - sources = { - "SDC_FILE": [":constraint.sdc"], - "SYNTH_NETLIST_FILES": [":netlists_canonicalized"], - }, - tags = ["manual"], - verilog_files = [], -) diff --git a/flow/designs/sky130hd/ibex/BUILD.bazel b/flow/designs/sky130hd/ibex/BUILD.bazel deleted file mode 100644 index 08f7adc3e6..0000000000 --- a/flow/designs/sky130hd/ibex/BUILD.bazel +++ /dev/null @@ -1,23 +0,0 @@ -load("@bazel-orfs//:openroad.bzl", "orfs_flow") - -orfs_flow( - name = "ibex", - arguments = { - "ADDER_MAP_FILE": "", - "CORE_UTILIZATION": "45", - "PLACE_DENSITY_LB_ADDON": "0.25", - "TNS_END_PERCENT": "100", - "REMOVE_ABC_BUFFERS": "1", - "SYNTH_HDL_FRONTEND": "slang", - "VERILOG_INCLUDE_DIRS": "flow/designs/src/ibex_sv/vendor/lowrisc_ip/prim/rtl", - "CTS_CLUSTER_SIZE": "20", - "CTS_CLUSTER_DIAMETER": "50", - }, - pdk = "@docker_orfs//:sky130hd", - sources = { - "SDC_FILE": [":constraint.sdc"], - "FASTROUTE_TCL": ["fastroute.tcl"], - }, - top = "ibex_core", - verilog_files = ["//flow/designs/src/ibex_sv:verilog"], -) diff --git a/flow/designs/src/aes/BUILD.bazel b/flow/designs/src/aes/BUILD.bazel deleted file mode 100644 index 1639cf0a3b..0000000000 --- a/flow/designs/src/aes/BUILD.bazel +++ /dev/null @@ -1,5 +0,0 @@ -filegroup( - name = "verilog", - srcs = glob(include = ["*.v"]), - visibility = ["//visibility:public"], -) diff --git a/flow/designs/src/ethmac/BUILD.bazel b/flow/designs/src/ethmac/BUILD.bazel deleted file mode 100644 index 1639cf0a3b..0000000000 --- a/flow/designs/src/ethmac/BUILD.bazel +++ /dev/null @@ -1,5 +0,0 @@ -filegroup( - name = "verilog", - srcs = glob(include = ["*.v"]), - visibility = ["//visibility:public"], -) diff --git a/flow/designs/src/gcd/BUILD.bazel b/flow/designs/src/gcd/BUILD.bazel deleted file mode 100644 index 1639cf0a3b..0000000000 --- a/flow/designs/src/gcd/BUILD.bazel +++ /dev/null @@ -1,5 +0,0 @@ -filegroup( - name = "verilog", - srcs = glob(include = ["*.v"]), - visibility = ["//visibility:public"], -) diff --git a/flow/designs/src/ibex_sv/BUILD.bazel b/flow/designs/src/ibex_sv/BUILD.bazel deleted file mode 100644 index 964365b4e1..0000000000 --- a/flow/designs/src/ibex_sv/BUILD.bazel +++ /dev/null @@ -1,9 +0,0 @@ -filegroup( - name = "verilog", - srcs = glob(include = [ - "**/*.sv", - "**/*.svh", - "**/*.v", - ]), - visibility = ["//visibility:public"], -) diff --git a/flow/designs/src/swerv/BUILD.bazel b/flow/designs/src/swerv/BUILD.bazel deleted file mode 100644 index 1639cf0a3b..0000000000 --- a/flow/designs/src/swerv/BUILD.bazel +++ /dev/null @@ -1,5 +0,0 @@ -filegroup( - name = "verilog", - srcs = glob(include = ["*.v"]), - visibility = ["//visibility:public"], -) diff --git a/flow/util/BUILD.bazel b/flow/util/BUILD.bazel index b8892cbab6..0d9f174267 100644 --- a/flow/util/BUILD.bazel +++ b/flow/util/BUILD.bazel @@ -34,9 +34,6 @@ filegroup( # for scripts/synth.sh steps filegroup( name = "makefile_yosys", - srcs = glob(MAKEFILE_SHARED) + [ - "merge_lib.py", - "preprocessLib.py", - ], + srcs = glob(MAKEFILE_SHARED), visibility = ["//visibility:public"], ) From 684eabb52bb6d97d8fd01e661d1c6992660e553b Mon Sep 17 00:00:00 2001 From: arthurjolo <78425256+arthurjolo@users.noreply.github.com> Date: Mon, 1 Jun 2026 13:38:58 +0000 Subject: [PATCH 202/202] [BOT] Update yosys submodule Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- tools/yosys | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/yosys b/tools/yosys index d3e297fcd4..9ed031ddd5 160000 --- a/tools/yosys +++ b/tools/yosys @@ -1 +1 @@ -Subproject commit d3e297fcd479247322f83d14f42b3556db7acdfb +Subproject commit 9ed031ddd588442f22be13ce608547a5809b62f0