physdes-py 0.6__tar.gz → 0.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {physdes_py-0.6 → physdes_py-0.7}/.gitignore +4 -0
- physdes_py-0.7/CHANGELOG.md +16 -0
- {physdes_py-0.6/src/physdes_py.egg-info → physdes_py-0.7}/PKG-INFO +1 -2
- {physdes_py-0.6 → physdes_py-0.7}/docs/build_from_md.py +17 -15
- {physdes_py-0.6 → physdes_py-0.7}/docs/build_remark.py +28 -21
- {physdes_py-0.6 → physdes_py-0.7}/docs/build_slides.py +32 -24
- {physdes_py-0.6 → physdes_py-0.7}/docs/examples/plot_cts.py +10 -4
- {physdes_py-0.6 → physdes_py-0.7}/docs/examples/plot_global_router.py +24 -7
- {physdes_py-0.6 → physdes_py-0.7}/docs/examples/plot_rectangles.py +2 -1
- {physdes_py-0.6 → physdes_py-0.7}/docs/examples/plot_rpolygon.py +1 -0
- {physdes_py-0.6 → physdes_py-0.7}/my_congestion.svg +1 -1
- physdes_py-0.7/mypy.ini +6 -0
- {physdes_py-0.6 → physdes_py-0.7}/setup.cfg +0 -1
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/__init__.py +1 -8
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/cts/dme_algorithm.py +178 -348
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/manhattan_arc.py +1 -29
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/point.py +1 -2
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/polygon.py +1 -2
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/recti.py +3 -7
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/router/routing_tree.py +33 -33
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/router/routing_tree3d.tpy +27 -27
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/router/routing_visualizer.py +6 -6
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/rpolygon.py +1 -26
- physdes_py-0.7/src/physdes/skeleton.py +3 -0
- {physdes_py-0.6 → physdes_py-0.7/src/physdes_py.egg-info}/PKG-INFO +1 -2
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes_py.egg-info/SOURCES.txt +3 -2
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes_py.egg-info/requires.txt +0 -3
- physdes_py-0.7/src/physdes_py.egg-info/scm_file_list.json +246 -0
- physdes_py-0.7/src/physdes_py.egg-info/scm_version.json +8 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_dme_algorithm.py +70 -144
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router3d_with_keepouts.py +3 -3
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_routing_tree.py +68 -68
- physdes_py-0.6/mypy.ini +0 -21
- physdes_py-0.6/mypy_test_errors.txt +0 -50
- physdes_py-0.6/src/physdes/skeleton.py +0 -169
- physdes_py-0.6/tests/test_skeleton.py +0 -36
- {physdes_py-0.6 → physdes_py-0.7}/.benchmarks/test_area.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.coveragerc +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.flake8 +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.github/workflows/jekyll-gh-pages.yml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.github/workflows/multi-platforms.yml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.github/workflows/python-app.yml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.github/workflows/python-publish.yml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.gitpod.Dockerfile +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.gitpod.yml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.hadolint.yaml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.isort.cfg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.markdownlint.yaml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.pre-commit-config.yaml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.readthedocs.yml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/.shellcheckrc +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/AGENTS.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/AUTHORS.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/CHANGELOG.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/CONTRIBUTING.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/GEMINI.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/LICENSE +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/README.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/_config.yml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/alpha10.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/alpha12.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/alpha14.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/alpha8.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/alpha9998.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/changelog/1.misc.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/changelog/README.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/coverage.json +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/demo_overlap.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/demo_overlap.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/diagram.bob +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/dme_algorithm-slides.html +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/dme_algorithm-slides.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/Makefile +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/_static/.gitignore +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/authors.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/changelog.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/conf.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/contributing.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/contributing.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/essays/essay.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/essays/polygon_vs_rpolygon_comparison.html +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/essays/polygon_vs_rpolygon_comparison.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/figures_demo.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/index.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/license.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/misc/note.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/misc/report.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/my_congestion.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/proposals/fyproj2026.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/proposals/fyproj2026.md.bad +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/proposals/fyproj2026_cts.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/proposals/fyproj2026_cts_2d.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/proposals/mulit-fpga-routing.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/readme.rst +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/requirements.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/slides_content.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/docs/steiner_forest_diagonal.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/environment.yml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/example_route3d_with_constraint_and_keepouts.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/example_route3d_with_steiner_and_keepouts.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/example_route_with_delay_constraint.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/example_route_with_keepouts.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/example_route_with_steiner.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/example_route_with_steiner_and_keepouts.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/example_route_with_steiner_special.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/examples/steiner_forest_grid_example.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/examples/steiner_forest_grid_large_example.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/examples/steiner_forest_simple_example.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/experimental/distance_comparison.png +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/experimental/rectilinear_distance_field.png +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/experimental/rectilinear_voronoi.ipynb +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/experimental/rectilinear_voronoi.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/experimental/rectilinear_voronoi_diamond.png +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/experimental/rectilinear_voronoi_grid.png +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/experimental/rectilinear_voronoi_random.png +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/experimental/steiner_trees_demo.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/global_router-slides.html +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/global_router-slides.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/neg_specical10.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/oryx-build-commands.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/comparison.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/convex_hull.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/delay_model_comparison.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/delay_model_comparison3d.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/elmore_model_clock_tree.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/elmore_model_clock_tree3d.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route3d_with_constraint.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route3d_with_constraint_and_keepouts.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route3d_with_steiner.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route3d_with_steiner_and_keepouts.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route_with_constraint.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route_with_constraint_specical.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route_with_delay_constraint.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route_with_keepouts.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route_with_steiner.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route_with_steiner_and_keepouts.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/example_route_with_steiner_special.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/linear_model_clock_tree.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/linear_model_clock_tree3d.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/my_congestion.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/neg_specical10.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/polygon_convex_hull.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/polygon_convex_hull13.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rectilinear-shapes-for-vlsi-physical-desgin.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolygon_convex_cut.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolygon_cut_explicit.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolyon_convex_hull.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolyon_convex_hull13.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolyon_cut_convex.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolyon_cut_convex2.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolyon_xmono.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolyon_xmono_hull.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/rpolyon_ymono_hull.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/steiner_forest.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/steiner_forest_diagonal.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/test.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/outputs/xmono_hull.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/plot_alpha.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/presentation_overlap_detection.html +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/presentation_overlap_detection.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/pyproject.toml +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/requirements/README.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/requirements/default.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/requirements/dev.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/requirements/doc.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/requirements/extras.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/requirements/test.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/requirements.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/rpolygon-slides.html +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/rpolygon-slides.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/setup.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/cts/clk_tree3d_vis.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/cts/clk_tree_vis.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/generic.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/generic.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/interval.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/manhattan_arc_3d.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/manhattan_arc_3d.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/point.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/py.typed +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/rdllist.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/router/global_router.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/router/global_router3d.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/router/steiner_forest.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/rpolygon_cut.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/steiner_forest/congestion_map.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/steiner_forest/my_congestion.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/steiner_forest/steiner_forest.md +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/steiner_forest/steiner_forest.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/steiner_forest/steiner_forest_diagonal.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/steiner_forest/steiner_forest_grid.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/to_polygon.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/vector2.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes/vector2.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes_py.egg-info/dependency_links.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes_py.egg-info/not-zip-safe +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/src/physdes_py.egg-info/top_level.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/svgo.config.js +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/test.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/__init__.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/conftest.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/golden.txt +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/mysvg.css +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/pnrpoly.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/run_failing_tests.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_alpha.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_clk_tree_vis.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_generic_functions.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router3d.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router3d.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router3d_with_keepouts2.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router_logic.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router_logic3d.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router_with_keepouts.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_global_router_with_keepouts2.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_interval.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_manhattan_arc_3d.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_manhattan_arc_3d.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_merge.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_merge3d.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_nearest_point_to.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_overlap.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_point.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_point_extended.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_point_hypothesis.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_polygon.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_polygon.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_polygon_convex_decomposition.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_polygon_hypothesis.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_rdllist.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_rect3d.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_recti.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_recti_hypothesis.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_routing_tree3d.tpy +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_routing_visualizer.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_rpolygon.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_rpolygon_convex_cut.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_rpolygon_convex_hull.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_rpolygon_cut.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_steiner_forest_grid.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_to_polygon.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_vector2.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/test_vector2_hypothesis.py +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/xmono_polygon.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/xmono_polygon2.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/ymono_polygon.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tests/ymono_rpolygon.svg +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/tox.ini +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/wirelength_vs_alpha.png +0 -0
- {physdes_py-0.6 → physdes_py-0.7}/wirelength_vs_alpha_small.png +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Version 0.7 (2026-07-16)
|
|
4
|
+
|
|
5
|
+
### Performance
|
|
6
|
+
- **`__slots__` on core geometry classes**: Added `__slots__` to `Point`, `ManhattanArc`, `Polygon`, `RPolygon`, `TreeNode`, `Sink` — saving ~176 bytes per instance. Most impactful on `Point` which is used everywhere in the codebase. (#64242a6)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
- **DME alignment with Rust**: Fixed elongation calculation with `raw_extend_left` to match Rust/C++. Replaced `sorted()` with median-partition in `build_merging_tree` (matches Rust `nth_element`). (#0267be3)
|
|
10
|
+
- **NodeType rename**: Changed `ALL_CAPS` enum values to `PascalCase` to align with Rust naming conventions. (#0267be3)
|
|
11
|
+
|
|
12
|
+
### Documentation
|
|
13
|
+
- **Doc build scripts**: Updated remark and slide build scripts. Updated example plot scripts for RPolygon, CTS, and global router. (#0a613b3)
|
|
14
|
+
|
|
15
|
+
### Code Cleanup
|
|
16
|
+
- **Removed PyScaffold boilerplate**: Deleted `skeleton.py`/`test_skeleton.py`, removed Python < 3.9 compat, unused mypy ignores, stale files. (#e594991)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: physdes-py
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7
|
|
4
4
|
Summary: Physical Design Python Code
|
|
5
5
|
Home-page: https://github.com/luk036/physdes-py/
|
|
6
6
|
Author: Wai-Shing Luk
|
|
@@ -11,7 +11,6 @@ Platform: any
|
|
|
11
11
|
Classifier: Development Status :: 4 - Beta
|
|
12
12
|
Classifier: Programming Language :: Python
|
|
13
13
|
Description-Content-Type: text/markdown; charset=UTF-8
|
|
14
|
-
Requires-Dist: importlib-metadata; python_version < "3.9"
|
|
15
14
|
Requires-Dist: typing_extensions
|
|
16
15
|
Requires-Dist: mywheel
|
|
17
16
|
Requires-Dist: icecream
|
|
@@ -4,31 +4,33 @@ Run: python build_from_md.py
|
|
|
4
4
|
"""
|
|
5
5
|
import re
|
|
6
6
|
|
|
7
|
-
with open(
|
|
7
|
+
with open("D:/github/py/physdes-py/docs/slides_content.md", encoding="utf-8") as f:
|
|
8
8
|
md = f.read()
|
|
9
9
|
|
|
10
10
|
# Split into slides
|
|
11
|
-
slides = [s.strip() for s in re.split(r
|
|
11
|
+
slides = [s.strip() for s in re.split(r"\n---\n", md) if s.strip()]
|
|
12
12
|
|
|
13
13
|
# Annotate slides
|
|
14
14
|
annotated = []
|
|
15
15
|
for i, slide in enumerate(slides):
|
|
16
|
-
first_line = slide.split(
|
|
17
|
-
is_qa =
|
|
18
|
-
is_end =
|
|
16
|
+
first_line = slide.split("\n")[0]
|
|
17
|
+
is_qa = "❓ Questions" in first_line
|
|
18
|
+
is_end = "🙏 Thank You" in first_line
|
|
19
19
|
if i == 0 or is_qa or is_end:
|
|
20
|
-
annotated.append(f
|
|
21
|
-
elif first_line.startswith(
|
|
22
|
-
annotated.append(f
|
|
20
|
+
annotated.append(f"count: false\nclass: nord-dark, middle, center\n\n{slide}")
|
|
21
|
+
elif first_line.startswith("## 🐍"):
|
|
22
|
+
annotated.append(f"class: nord-light, middle, center\n\n{slide}")
|
|
23
23
|
else:
|
|
24
24
|
annotated.append(slide)
|
|
25
25
|
|
|
26
|
-
remark_content =
|
|
26
|
+
remark_content = (
|
|
27
|
+
"layout: true\nclass: typo, typo-selection\n\n---\n" + "\n\n---\n\n".join(annotated)
|
|
28
|
+
)
|
|
27
29
|
|
|
28
30
|
# Escape for HTML textarea
|
|
29
|
-
remark_content = remark_content.replace(
|
|
31
|
+
remark_content = remark_content.replace("</textarea>", "</textarea>")
|
|
30
32
|
|
|
31
|
-
html = f
|
|
33
|
+
html = f"""<!doctype html>
|
|
32
34
|
<html>
|
|
33
35
|
<head>
|
|
34
36
|
<title>Embedding Figures in Docs — Python & Rust</title>
|
|
@@ -75,10 +77,10 @@ html = f'''<!doctype html>
|
|
|
75
77
|
</script>
|
|
76
78
|
<script src="../js/mermaid-init.js"></script>
|
|
77
79
|
</body>
|
|
78
|
-
</html>
|
|
80
|
+
</html>"""
|
|
79
81
|
|
|
80
|
-
out =
|
|
81
|
-
with open(out,
|
|
82
|
+
out = "D:/github/luk036.github.io/idea/doc-fig-py-remark-v2.html"
|
|
83
|
+
with open(out, "w", encoding="utf-8") as f:
|
|
82
84
|
f.write(html)
|
|
83
85
|
|
|
84
|
-
print(f
|
|
86
|
+
print(f"Written {len(html)} bytes, {len(slides)} slides to {out}")
|
|
@@ -4,7 +4,8 @@ Run: python build_remark.py
|
|
|
4
4
|
"""
|
|
5
5
|
import re
|
|
6
6
|
|
|
7
|
-
MD =
|
|
7
|
+
MD = (
|
|
8
|
+
r'''layout: true
|
|
8
9
|
class: typo, typo-selection
|
|
9
10
|
|
|
10
11
|
---
|
|
@@ -249,12 +250,13 @@ docs/_build/html/ target/doc/my_crate/
|
|
|
249
250
|
.. svgbob::
|
|
250
251
|
:align: center
|
|
251
252
|
|
|
252
|
-
_.-'''
|
|
253
|
+
_.-'''
|
|
254
|
+
"""'-._
|
|
253
255
|
,' | `.
|
|
254
256
|
/ | \
|
|
255
257
|
| | . |
|
|
256
258
|
| | |
|
|
257
|
-
|
|
259
|
+
\\ | /
|
|
258
260
|
`._ | _.'
|
|
259
261
|
'-......-'
|
|
260
262
|
```
|
|
@@ -294,12 +296,12 @@ docs/_build/html/ target/doc/my_crate/
|
|
|
294
296
|
```rst
|
|
295
297
|
.. math::
|
|
296
298
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
+
\\phi_b(n) =
|
|
300
|
+
\\sum_{k=0}^{m} \frac{d_k}{b^{k+1}}
|
|
299
301
|
```
|
|
300
302
|
|
|
301
303
|
```rst
|
|
302
|
-
Inline :math
|
|
304
|
+
Inline :math:`\\phi_2(n)` works too.
|
|
303
305
|
```
|
|
304
306
|
|
|
305
307
|
✅ `.. math::` display equations
|
|
@@ -316,9 +318,9 @@ Inline :math:`\phi_2(n)` works too.
|
|
|
316
318
|
|
|
317
319
|
```rust
|
|
318
320
|
//! Display:
|
|
319
|
-
//! $$
|
|
321
|
+
//! $$ \\phi_b(n) = \\sum_{k=0}^{m} \frac{d_k}{b^{k+1}} $$
|
|
320
322
|
//!
|
|
321
|
-
//! Inline: $
|
|
323
|
+
//! Inline: $ \\phi_2(n) $
|
|
322
324
|
```
|
|
323
325
|
|
|
324
326
|
✅ `$$...$$` display equations
|
|
@@ -578,27 +580,30 @@ class: nord-dark, middle, center
|
|
|
578
580
|
- [`github.com/luk036/ellalgo`](https://github.com/luk036/ellalgo)
|
|
579
581
|
|
|
580
582
|
@luk036 👨💻 · 2026 📅
|
|
581
|
-
|
|
583
|
+
"""
|
|
584
|
+
)
|
|
582
585
|
|
|
583
586
|
# Split into slides
|
|
584
|
-
slides = [s.strip() for s in re.split(r
|
|
587
|
+
slides = [s.strip() for s in re.split(r"\n---\n", MD) if s.strip()]
|
|
585
588
|
|
|
586
589
|
# Annotate slides
|
|
587
590
|
annotated = []
|
|
588
591
|
for i, slide in enumerate(slides):
|
|
589
|
-
first_line = slide.split(
|
|
590
|
-
is_qa =
|
|
591
|
-
is_end =
|
|
592
|
+
first_line = slide.split("\n")[0]
|
|
593
|
+
is_qa = "❓ Questions" in first_line
|
|
594
|
+
is_end = "🙏 Thank You" in first_line
|
|
592
595
|
if i == 0 or is_qa or is_end:
|
|
593
|
-
annotated.append(f
|
|
594
|
-
elif first_line.startswith(
|
|
595
|
-
annotated.append(f
|
|
596
|
+
annotated.append(f"count: false\nclass: nord-dark, middle, center\n\n{slide}")
|
|
597
|
+
elif first_line.startswith("## 🐍"):
|
|
598
|
+
annotated.append(f"class: nord-light, middle, center\n\n{slide}")
|
|
596
599
|
else:
|
|
597
600
|
annotated.append(slide)
|
|
598
601
|
|
|
599
|
-
remark_content =
|
|
602
|
+
remark_content = (
|
|
603
|
+
"layout: true\nclass: typo, typo-selection\n\n---\n" + "\n\n---\n\n".join(annotated)
|
|
604
|
+
)
|
|
600
605
|
|
|
601
|
-
html = f
|
|
606
|
+
html = f"""<!doctype html>
|
|
602
607
|
<html>
|
|
603
608
|
<head>
|
|
604
609
|
<title>Embedding Figures in Docs — Python & Rust</title>
|
|
@@ -645,9 +650,11 @@ html = f'''<!doctype html>
|
|
|
645
650
|
</script>
|
|
646
651
|
<script src="../js/mermaid-init.js"></script>
|
|
647
652
|
</body>
|
|
648
|
-
</html>
|
|
653
|
+
</html>"""
|
|
649
654
|
|
|
650
|
-
with open(
|
|
655
|
+
with open(
|
|
656
|
+
"D:/github/luk036.github.io/idea/doc-fig-py-remark.html", "w", encoding="utf-8"
|
|
657
|
+
) as f:
|
|
651
658
|
f.write(html)
|
|
652
659
|
|
|
653
|
-
print(f
|
|
660
|
+
print(f"Written {len(html)} bytes, {len(slides)} slides")
|
|
@@ -4,11 +4,14 @@ Run: python build_slides.py
|
|
|
4
4
|
"""
|
|
5
5
|
import re
|
|
6
6
|
|
|
7
|
+
|
|
7
8
|
def esc(t):
|
|
8
9
|
"""Escape backtick for f-string."""
|
|
9
|
-
return t.replace(
|
|
10
|
+
return t.replace("`", "\\`")
|
|
11
|
+
|
|
10
12
|
|
|
11
|
-
MD =
|
|
13
|
+
MD = (
|
|
14
|
+
r'''layout: true
|
|
12
15
|
class: typo, typo-selection
|
|
13
16
|
|
|
14
17
|
---
|
|
@@ -249,12 +252,13 @@ class: nord-light, middle, center
|
|
|
249
252
|
.. svgbobdoc::
|
|
250
253
|
:align: center
|
|
251
254
|
|
|
252
|
-
_.-'''
|
|
255
|
+
_.-'''
|
|
256
|
+
"""'-._
|
|
253
257
|
,' | `.
|
|
254
258
|
/ | \
|
|
255
259
|
| | . |
|
|
256
260
|
| | |
|
|
257
|
-
|
|
261
|
+
\\ | /
|
|
258
262
|
`._ | _.'
|
|
259
263
|
'-......-'
|
|
260
264
|
```
|
|
@@ -271,7 +275,8 @@ class: nord-light, middle, center
|
|
|
271
275
|
|
|
272
276
|
```rust
|
|
273
277
|
//! ```svgbobdoc
|
|
274
|
-
//! _.-
|
|
278
|
+
//! _.-"""
|
|
279
|
+
"""'-._
|
|
275
280
|
//! ,' | `.
|
|
276
281
|
//! ```
|
|
277
282
|
```
|
|
@@ -295,12 +300,12 @@ class: nord-light, middle, center
|
|
|
295
300
|
```rst
|
|
296
301
|
.. math::
|
|
297
302
|
|
|
298
|
-
|
|
299
|
-
|
|
303
|
+
\\phi_b(n) =
|
|
304
|
+
\\sum_{k=0}^{m} \frac{d_k}{b^{k+1}}
|
|
300
305
|
```
|
|
301
306
|
|
|
302
307
|
```rst
|
|
303
|
-
Inline :math
|
|
308
|
+
Inline :math:`\\phi_2(n)` works too.
|
|
304
309
|
```
|
|
305
310
|
|
|
306
311
|
✅ `.. math::` display equations
|
|
@@ -315,9 +320,9 @@ Inline :math:`\phi_2(n)` works too.
|
|
|
315
320
|
|
|
316
321
|
```rust
|
|
317
322
|
//! Display:
|
|
318
|
-
//! $$
|
|
323
|
+
//! $$ \\phi_b(n) = \\sum_{k=0}^{m} \frac{d_k}{b^{k+1}} $$
|
|
319
324
|
//!
|
|
320
|
-
//! Inline: $
|
|
325
|
+
//! Inline: $ \\phi_2(n) $
|
|
321
326
|
```
|
|
322
327
|
|
|
323
328
|
✅ `$$...$$` display equations
|
|
@@ -571,27 +576,30 @@ class: nord-dark, middle, center
|
|
|
571
576
|
- [`github.com/luk036/ellalgo`](https://github.com/luk036/ellalgo)
|
|
572
577
|
|
|
573
578
|
@luk036 👨💻 · 2026 📅
|
|
574
|
-
|
|
579
|
+
"""
|
|
580
|
+
)
|
|
575
581
|
|
|
576
582
|
# Split into slides
|
|
577
|
-
slides = [s.strip() for s in re.split(r
|
|
583
|
+
slides = [s.strip() for s in re.split(r"\n---\n", MD) if s.strip()]
|
|
578
584
|
|
|
579
585
|
# Annotate slides
|
|
580
586
|
annotated = []
|
|
581
587
|
for i, slide in enumerate(slides):
|
|
582
|
-
first_line = slide.split(
|
|
583
|
-
is_qa =
|
|
584
|
-
is_end =
|
|
588
|
+
first_line = slide.split("\n")[0]
|
|
589
|
+
is_qa = "❓ Questions" in first_line
|
|
590
|
+
is_end = "🙏 Thank You" in first_line
|
|
585
591
|
if i == 0 or is_qa or is_end:
|
|
586
|
-
annotated.append(f
|
|
587
|
-
elif first_line.startswith(
|
|
588
|
-
annotated.append(f
|
|
592
|
+
annotated.append(f"count: false\nclass: nord-dark, middle, center\n\n{slide}")
|
|
593
|
+
elif first_line.startswith("## 🐍"):
|
|
594
|
+
annotated.append(f"class: nord-light, middle, center\n\n{slide}")
|
|
589
595
|
else:
|
|
590
596
|
annotated.append(slide)
|
|
591
597
|
|
|
592
|
-
remark_content =
|
|
598
|
+
remark_content = (
|
|
599
|
+
"layout: true\nclass: typo, typo-selection\n\n---\n" + "\n\n---\n\n".join(annotated)
|
|
600
|
+
)
|
|
593
601
|
|
|
594
|
-
html = f
|
|
602
|
+
html = f"""<!doctype html>
|
|
595
603
|
<html>
|
|
596
604
|
<head>
|
|
597
605
|
<title>Embedding Figures in Docs — Python & Rust</title>
|
|
@@ -638,10 +646,10 @@ html = f'''<!doctype html>
|
|
|
638
646
|
</script>
|
|
639
647
|
<script src="../js/mermaid-init.js"></script>
|
|
640
648
|
</body>
|
|
641
|
-
</html>
|
|
649
|
+
</html>"""
|
|
642
650
|
|
|
643
|
-
out =
|
|
644
|
-
with open(out,
|
|
651
|
+
out = "D:/github/luk036.github.io/idea/doc-fig-py-remark-v2.html"
|
|
652
|
+
with open(out, "w", encoding="utf-8") as f:
|
|
645
653
|
f.write(html)
|
|
646
654
|
|
|
647
|
-
print(f
|
|
655
|
+
print(f"Written {len(html)} bytes, {len(slides)} slides to {out}")
|
|
@@ -6,8 +6,9 @@ Clock tree built with the DME algorithm using a linear delay model.
|
|
|
6
6
|
Sinks are green, internal nodes are blue, source is red.
|
|
7
7
|
"""
|
|
8
8
|
import matplotlib.pyplot as plt
|
|
9
|
+
|
|
10
|
+
from physdes.cts.dme_algorithm import DMEAlgorithm, LinearDelayCalculator, Sink
|
|
9
11
|
from physdes.point import Point
|
|
10
|
-
from physdes.cts.dme_algorithm import DMEAlgorithm, Sink, LinearDelayCalculator
|
|
11
12
|
|
|
12
13
|
sinks = [
|
|
13
14
|
Sink("s1", Point(-100, 40), 1.0),
|
|
@@ -27,6 +28,7 @@ tree = dme.build_clock_tree()
|
|
|
27
28
|
|
|
28
29
|
sink_positions = {(s.position.xcoord, s.position.ycoord) for s in sinks}
|
|
29
30
|
|
|
31
|
+
|
|
30
32
|
def walk(node, depth=0):
|
|
31
33
|
"""Collect nodes recursively."""
|
|
32
34
|
if node is None:
|
|
@@ -40,6 +42,7 @@ def walk(node, depth=0):
|
|
|
40
42
|
edges.extend(ce)
|
|
41
43
|
return nodes, edges
|
|
42
44
|
|
|
45
|
+
|
|
43
46
|
nodes, edges = walk(tree)
|
|
44
47
|
|
|
45
48
|
fig, ax = plt.subplots(figsize=(8, 7))
|
|
@@ -47,7 +50,9 @@ for parent, child in edges:
|
|
|
47
50
|
ax.plot(
|
|
48
51
|
[parent.position.xcoord, child.position.xcoord],
|
|
49
52
|
[parent.position.ycoord, child.position.ycoord],
|
|
50
|
-
color="gray",
|
|
53
|
+
color="gray",
|
|
54
|
+
linewidth=1.5,
|
|
55
|
+
zorder=1,
|
|
51
56
|
)
|
|
52
57
|
|
|
53
58
|
for node, _depth in nodes:
|
|
@@ -62,8 +67,9 @@ for node, _depth in nodes:
|
|
|
62
67
|
color, size, label = "#2196F3", 60, None
|
|
63
68
|
ax.scatter(x, y, c=color, s=size, edgecolors="black", linewidths=0.8, zorder=2)
|
|
64
69
|
if is_root:
|
|
65
|
-
ax.annotate(
|
|
66
|
-
|
|
70
|
+
ax.annotate(
|
|
71
|
+
label, (x, y), xytext=(5, 8), textcoords="offset points", fontsize=9
|
|
72
|
+
)
|
|
67
73
|
|
|
68
74
|
ax.set_title("DME Clock Tree (Linear Delay Model)")
|
|
69
75
|
ax.set_xlabel("x")
|
|
@@ -6,20 +6,26 @@ A routing tree built with the global router using Steiner-point
|
|
|
6
6
|
optimisation. Source is red, Steiner nodes are blue, terminals are green.
|
|
7
7
|
"""
|
|
8
8
|
import matplotlib.pyplot as plt
|
|
9
|
+
|
|
9
10
|
from physdes.point import Point
|
|
10
11
|
from physdes.router.global_router import GlobalRouter
|
|
11
12
|
from physdes.router.routing_tree import NodeType
|
|
12
13
|
|
|
13
14
|
source = Point(0, 0)
|
|
14
15
|
terminals = [
|
|
15
|
-
Point(10, 5),
|
|
16
|
-
Point(
|
|
16
|
+
Point(10, 5),
|
|
17
|
+
Point(3, 8),
|
|
18
|
+
Point(12, 12),
|
|
19
|
+
Point(5, -4),
|
|
20
|
+
Point(-4, 6),
|
|
21
|
+
Point(8, -2),
|
|
17
22
|
]
|
|
18
23
|
|
|
19
24
|
router = GlobalRouter(source, terminals)
|
|
20
25
|
router.route_with_steiners()
|
|
21
26
|
tree = router.tree
|
|
22
27
|
|
|
28
|
+
|
|
23
29
|
def collect(node):
|
|
24
30
|
"""Flatten tree to (nodes, edges)."""
|
|
25
31
|
nodes, edges = [node], []
|
|
@@ -30,6 +36,7 @@ def collect(node):
|
|
|
30
36
|
edges.extend(ce)
|
|
31
37
|
return nodes, edges
|
|
32
38
|
|
|
39
|
+
|
|
33
40
|
nodes, edges = collect(tree.source)
|
|
34
41
|
|
|
35
42
|
colors = {
|
|
@@ -48,17 +55,27 @@ for parent, child in edges:
|
|
|
48
55
|
ax.plot(
|
|
49
56
|
[parent.pt.xcoord, child.pt.xcoord],
|
|
50
57
|
[parent.pt.ycoord, child.pt.ycoord],
|
|
51
|
-
color="gray",
|
|
58
|
+
color="gray",
|
|
59
|
+
linewidth=1.5,
|
|
60
|
+
zorder=1,
|
|
52
61
|
)
|
|
53
62
|
|
|
54
63
|
for node in nodes:
|
|
55
64
|
x, y = node.pt.xcoord, node.pt.ycoord
|
|
56
|
-
ax.scatter(
|
|
57
|
-
|
|
65
|
+
ax.scatter(
|
|
66
|
+
x,
|
|
67
|
+
y,
|
|
68
|
+
c=colors[node.type],
|
|
69
|
+
s=sizes[node.type],
|
|
70
|
+
edgecolors="black",
|
|
71
|
+
linewidths=0.8,
|
|
72
|
+
zorder=2,
|
|
73
|
+
)
|
|
58
74
|
|
|
59
75
|
if node.type == NodeType.SOURCE:
|
|
60
|
-
ax.annotate(
|
|
61
|
-
|
|
76
|
+
ax.annotate(
|
|
77
|
+
"Source", (x, y), xytext=(5, 8), textcoords="offset points", fontsize=9
|
|
78
|
+
)
|
|
62
79
|
|
|
63
80
|
wl = tree.calculate_total_wirelength()
|
|
64
81
|
ax.set_title(f"Global Router (Steiner) — Total wirelength: {wl:.1f}")
|
|
@@ -5,8 +5,9 @@ Rectangle overlap detection
|
|
|
5
5
|
Several rectangles visualized with overlapping pairs highlighted in red,
|
|
6
6
|
using the sweep-line algorithm from ``detect_overlap_gen``.
|
|
7
7
|
"""
|
|
8
|
-
import matplotlib.pyplot as plt
|
|
9
8
|
import matplotlib.patches as mpatches
|
|
9
|
+
import matplotlib.pyplot as plt
|
|
10
|
+
|
|
10
11
|
from physdes.interval import Interval
|
|
11
12
|
from physdes.recti import Rectangle, detect_overlap_gen
|
|
12
13
|
|
physdes_py-0.7/mypy.ini
ADDED
|
@@ -6,16 +6,9 @@ Vector2, ManhattanArc) and algorithms for clock tree synthesis (DME), global
|
|
|
6
6
|
routing, Steiner forest construction, and polygon decomposition.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
if sys.version_info[:2] >= (3, 8):
|
|
12
|
-
# TODO: Import directly (no need for conditional) when `python_requires = >= 3.9`
|
|
13
|
-
from importlib.metadata import PackageNotFoundError, version # pragma: no cover
|
|
14
|
-
else:
|
|
15
|
-
from importlib_metadata import PackageNotFoundError, version # pragma: no cover
|
|
9
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
16
10
|
|
|
17
11
|
try:
|
|
18
|
-
# Change here if project is renamed and does not equal the package name
|
|
19
12
|
dist_name = "physdes-py"
|
|
20
13
|
__version__ = version(dist_name)
|
|
21
14
|
except PackageNotFoundError: # pragma: no cover
|