physdes-py 0.6__tar.gz → 0.8__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.
Files changed (254) hide show
  1. {physdes_py-0.6 → physdes_py-0.8}/.gitignore +4 -0
  2. physdes_py-0.8/CHANGELOG.md +39 -0
  3. {physdes_py-0.6/src/physdes_py.egg-info → physdes_py-0.8}/PKG-INFO +1 -2
  4. {physdes_py-0.6 → physdes_py-0.8}/alpha10.svg +16 -16
  5. {physdes_py-0.6 → physdes_py-0.8}/alpha12.svg +13 -13
  6. {physdes_py-0.6 → physdes_py-0.8}/alpha14.svg +10 -10
  7. {physdes_py-0.6 → physdes_py-0.8}/alpha8.svg +13 -13
  8. {physdes_py-0.6 → physdes_py-0.8}/alpha9998.svg +16 -16
  9. {physdes_py-0.6 → physdes_py-0.8}/demo_overlap.py +0 -49
  10. {physdes_py-0.6 → physdes_py-0.8}/docs/build_from_md.py +17 -15
  11. {physdes_py-0.6 → physdes_py-0.8}/docs/build_remark.py +28 -21
  12. {physdes_py-0.6 → physdes_py-0.8}/docs/build_slides.py +32 -24
  13. {physdes_py-0.6 → physdes_py-0.8}/docs/examples/plot_cts.py +10 -4
  14. {physdes_py-0.6 → physdes_py-0.8}/docs/examples/plot_global_router.py +24 -7
  15. {physdes_py-0.6 → physdes_py-0.8}/docs/examples/plot_rectangles.py +2 -1
  16. {physdes_py-0.6 → physdes_py-0.8}/docs/examples/plot_rpolygon.py +1 -0
  17. {physdes_py-0.6 → physdes_py-0.8}/docs/requirements.txt +2 -0
  18. {physdes_py-0.6 → physdes_py-0.8}/example_route3d_with_constraint_and_keepouts.svg +10 -16
  19. {physdes_py-0.6 → physdes_py-0.8}/example_route3d_with_steiner_and_keepouts.svg +10 -16
  20. {physdes_py-0.6/outputs → physdes_py-0.8}/example_route_with_delay_constraint.svg +16 -16
  21. {physdes_py-0.6 → physdes_py-0.8}/example_route_with_keepouts.svg +10 -10
  22. {physdes_py-0.6/outputs → physdes_py-0.8}/example_route_with_steiner.svg +10 -10
  23. {physdes_py-0.6 → physdes_py-0.8}/example_route_with_steiner_and_keepouts.svg +10 -10
  24. {physdes_py-0.6/outputs → physdes_py-0.8}/example_route_with_steiner_special.svg +13 -13
  25. {physdes_py-0.6 → physdes_py-0.8}/my_congestion.svg +1 -1
  26. physdes_py-0.8/mypy.ini +6 -0
  27. {physdes_py-0.6/outputs → physdes_py-0.8}/neg_specical10.svg +28 -28
  28. {physdes_py-0.6 → physdes_py-0.8}/setup.cfg +0 -3
  29. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/__init__.py +1 -8
  30. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/cts/clk_tree_vis.py +103 -18
  31. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/cts/dme_algorithm.py +187 -347
  32. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/generic.py +0 -44
  33. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/interval.py +0 -39
  34. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/manhattan_arc.py +1 -50
  35. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/point.py +1 -21
  36. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/polygon.py +6 -7
  37. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/recti.py +3 -26
  38. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/router/routing_tree.py +73 -80
  39. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/router/routing_tree3d.tpy +27 -27
  40. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/router/routing_visualizer.py +6 -21
  41. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/rpolygon.py +4 -69
  42. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/rpolygon_cut.py +125 -130
  43. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/steiner_forest/steiner_forest_grid.py +0 -10
  44. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/vector2.py +0 -20
  45. {physdes_py-0.6 → physdes_py-0.8/src/physdes_py.egg-info}/PKG-INFO +1 -2
  46. {physdes_py-0.6 → physdes_py-0.8}/src/physdes_py.egg-info/SOURCES.txt +3 -4
  47. {physdes_py-0.6 → physdes_py-0.8}/src/physdes_py.egg-info/requires.txt +0 -3
  48. physdes_py-0.8/src/physdes_py.egg-info/scm_file_list.json +244 -0
  49. physdes_py-0.8/src/physdes_py.egg-info/scm_version.json +8 -0
  50. {physdes_py-0.6 → physdes_py-0.8}/tests/test_clk_tree_vis.py +46 -0
  51. {physdes_py-0.6 → physdes_py-0.8}/tests/test_dme_algorithm.py +70 -144
  52. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router3d_with_keepouts.py +3 -3
  53. {physdes_py-0.6 → physdes_py-0.8}/tests/test_routing_tree.py +68 -68
  54. physdes_py-0.6/.benchmarks/test_area.py +0 -29
  55. physdes_py-0.6/mypy.ini +0 -21
  56. physdes_py-0.6/mypy_test_errors.txt +0 -50
  57. physdes_py-0.6/src/physdes/skeleton.py +0 -169
  58. physdes_py-0.6/tests/test_skeleton.py +0 -36
  59. {physdes_py-0.6 → physdes_py-0.8}/.coveragerc +0 -0
  60. {physdes_py-0.6 → physdes_py-0.8}/.flake8 +0 -0
  61. {physdes_py-0.6 → physdes_py-0.8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  62. {physdes_py-0.6 → physdes_py-0.8}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  63. {physdes_py-0.6 → physdes_py-0.8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  64. {physdes_py-0.6 → physdes_py-0.8}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  65. {physdes_py-0.6 → physdes_py-0.8}/.github/workflows/jekyll-gh-pages.yml +0 -0
  66. {physdes_py-0.6 → physdes_py-0.8}/.github/workflows/multi-platforms.yml +0 -0
  67. {physdes_py-0.6 → physdes_py-0.8}/.github/workflows/python-app.yml +0 -0
  68. {physdes_py-0.6 → physdes_py-0.8}/.github/workflows/python-publish.yml +0 -0
  69. {physdes_py-0.6 → physdes_py-0.8}/.gitpod.Dockerfile +0 -0
  70. {physdes_py-0.6 → physdes_py-0.8}/.gitpod.yml +0 -0
  71. {physdes_py-0.6 → physdes_py-0.8}/.hadolint.yaml +0 -0
  72. {physdes_py-0.6 → physdes_py-0.8}/.isort.cfg +0 -0
  73. {physdes_py-0.6 → physdes_py-0.8}/.markdownlint.yaml +0 -0
  74. {physdes_py-0.6 → physdes_py-0.8}/.pre-commit-config.yaml +0 -0
  75. {physdes_py-0.6 → physdes_py-0.8}/.readthedocs.yml +0 -0
  76. {physdes_py-0.6 → physdes_py-0.8}/.shellcheckrc +0 -0
  77. {physdes_py-0.6 → physdes_py-0.8}/AGENTS.md +0 -0
  78. {physdes_py-0.6 → physdes_py-0.8}/AUTHORS.rst +0 -0
  79. {physdes_py-0.6 → physdes_py-0.8}/CHANGELOG.rst +0 -0
  80. {physdes_py-0.6 → physdes_py-0.8}/CONTRIBUTING.rst +0 -0
  81. {physdes_py-0.6 → physdes_py-0.8}/GEMINI.md +0 -0
  82. {physdes_py-0.6 → physdes_py-0.8}/LICENSE +0 -0
  83. {physdes_py-0.6 → physdes_py-0.8}/README.md +0 -0
  84. {physdes_py-0.6 → physdes_py-0.8}/_config.yml +0 -0
  85. {physdes_py-0.6 → physdes_py-0.8}/changelog/1.misc.rst +0 -0
  86. {physdes_py-0.6 → physdes_py-0.8}/changelog/README.md +0 -0
  87. {physdes_py-0.6 → physdes_py-0.8}/coverage.json +0 -0
  88. {physdes_py-0.6 → physdes_py-0.8}/demo_overlap.svg +0 -0
  89. {physdes_py-0.6 → physdes_py-0.8}/diagram.bob +0 -0
  90. {physdes_py-0.6 → physdes_py-0.8}/dme_algorithm-slides.html +0 -0
  91. {physdes_py-0.6 → physdes_py-0.8}/dme_algorithm-slides.md +0 -0
  92. {physdes_py-0.6 → physdes_py-0.8}/docs/Makefile +0 -0
  93. {physdes_py-0.6 → physdes_py-0.8}/docs/_static/.gitignore +0 -0
  94. {physdes_py-0.6 → physdes_py-0.8}/docs/authors.rst +0 -0
  95. {physdes_py-0.6 → physdes_py-0.8}/docs/changelog.rst +0 -0
  96. {physdes_py-0.6 → physdes_py-0.8}/docs/conf.py +0 -0
  97. {physdes_py-0.6 → physdes_py-0.8}/docs/contributing.md +0 -0
  98. {physdes_py-0.6 → physdes_py-0.8}/docs/contributing.rst +0 -0
  99. {physdes_py-0.6 → physdes_py-0.8}/docs/essays/essay.md +0 -0
  100. {physdes_py-0.6 → physdes_py-0.8}/docs/essays/polygon_vs_rpolygon_comparison.html +0 -0
  101. {physdes_py-0.6 → physdes_py-0.8}/docs/essays/polygon_vs_rpolygon_comparison.md +0 -0
  102. {physdes_py-0.6 → physdes_py-0.8}/docs/figures_demo.rst +0 -0
  103. {physdes_py-0.6 → physdes_py-0.8}/docs/index.rst +0 -0
  104. {physdes_py-0.6 → physdes_py-0.8}/docs/license.rst +0 -0
  105. {physdes_py-0.6 → physdes_py-0.8}/docs/misc/note.md +0 -0
  106. {physdes_py-0.6 → physdes_py-0.8}/docs/misc/report.md +0 -0
  107. {physdes_py-0.6 → physdes_py-0.8}/docs/my_congestion.svg +0 -0
  108. {physdes_py-0.6 → physdes_py-0.8}/docs/proposals/fyproj2026.md +0 -0
  109. {physdes_py-0.6 → physdes_py-0.8}/docs/proposals/fyproj2026.md.bad +0 -0
  110. {physdes_py-0.6 → physdes_py-0.8}/docs/proposals/fyproj2026_cts.md +0 -0
  111. {physdes_py-0.6 → physdes_py-0.8}/docs/proposals/fyproj2026_cts_2d.md +0 -0
  112. {physdes_py-0.6 → physdes_py-0.8}/docs/proposals/mulit-fpga-routing.md +0 -0
  113. {physdes_py-0.6 → physdes_py-0.8}/docs/readme.rst +0 -0
  114. {physdes_py-0.6 → physdes_py-0.8}/docs/slides_content.md +0 -0
  115. {physdes_py-0.6 → physdes_py-0.8}/docs/steiner_forest_diagonal.svg +0 -0
  116. {physdes_py-0.6 → physdes_py-0.8}/environment.yml +0 -0
  117. {physdes_py-0.6 → physdes_py-0.8}/examples/steiner_forest_grid_example.py +0 -0
  118. {physdes_py-0.6 → physdes_py-0.8}/examples/steiner_forest_grid_large_example.py +0 -0
  119. {physdes_py-0.6 → physdes_py-0.8}/examples/steiner_forest_simple_example.py +0 -0
  120. {physdes_py-0.6 → physdes_py-0.8}/experimental/distance_comparison.png +0 -0
  121. {physdes_py-0.6 → physdes_py-0.8}/experimental/rectilinear_distance_field.png +0 -0
  122. {physdes_py-0.6 → physdes_py-0.8}/experimental/rectilinear_voronoi.ipynb +0 -0
  123. {physdes_py-0.6 → physdes_py-0.8}/experimental/rectilinear_voronoi.py +0 -0
  124. {physdes_py-0.6 → physdes_py-0.8}/experimental/rectilinear_voronoi_diamond.png +0 -0
  125. {physdes_py-0.6 → physdes_py-0.8}/experimental/rectilinear_voronoi_grid.png +0 -0
  126. {physdes_py-0.6 → physdes_py-0.8}/experimental/rectilinear_voronoi_random.png +0 -0
  127. {physdes_py-0.6 → physdes_py-0.8}/experimental/steiner_trees_demo.py +0 -0
  128. {physdes_py-0.6 → physdes_py-0.8}/global_router-slides.html +0 -0
  129. {physdes_py-0.6 → physdes_py-0.8}/global_router-slides.md +0 -0
  130. {physdes_py-0.6 → physdes_py-0.8}/oryx-build-commands.txt +0 -0
  131. {physdes_py-0.6 → physdes_py-0.8}/outputs/comparison.svg +0 -0
  132. {physdes_py-0.6 → physdes_py-0.8}/outputs/convex_hull.svg +0 -0
  133. {physdes_py-0.6 → physdes_py-0.8}/outputs/delay_model_comparison.svg +0 -0
  134. {physdes_py-0.6 → physdes_py-0.8}/outputs/delay_model_comparison3d.svg +0 -0
  135. {physdes_py-0.6 → physdes_py-0.8}/outputs/elmore_model_clock_tree.svg +0 -0
  136. {physdes_py-0.6 → physdes_py-0.8}/outputs/elmore_model_clock_tree3d.svg +0 -0
  137. {physdes_py-0.6 → physdes_py-0.8}/outputs/example_route3d_with_constraint.svg +0 -0
  138. {physdes_py-0.6 → physdes_py-0.8}/outputs/example_route3d_with_constraint_and_keepouts.svg +0 -0
  139. {physdes_py-0.6 → physdes_py-0.8}/outputs/example_route3d_with_steiner.svg +0 -0
  140. {physdes_py-0.6 → physdes_py-0.8}/outputs/example_route3d_with_steiner_and_keepouts.svg +0 -0
  141. {physdes_py-0.6 → physdes_py-0.8}/outputs/example_route_with_constraint.svg +0 -0
  142. {physdes_py-0.6 → physdes_py-0.8}/outputs/example_route_with_constraint_specical.svg +0 -0
  143. {physdes_py-0.6 → physdes_py-0.8/outputs}/example_route_with_delay_constraint.svg +0 -0
  144. {physdes_py-0.6 → physdes_py-0.8}/outputs/example_route_with_keepouts.svg +0 -0
  145. {physdes_py-0.6 → physdes_py-0.8/outputs}/example_route_with_steiner.svg +0 -0
  146. {physdes_py-0.6 → physdes_py-0.8}/outputs/example_route_with_steiner_and_keepouts.svg +0 -0
  147. {physdes_py-0.6 → physdes_py-0.8/outputs}/example_route_with_steiner_special.svg +0 -0
  148. {physdes_py-0.6 → physdes_py-0.8}/outputs/linear_model_clock_tree.svg +0 -0
  149. {physdes_py-0.6 → physdes_py-0.8}/outputs/linear_model_clock_tree3d.svg +0 -0
  150. {physdes_py-0.6 → physdes_py-0.8}/outputs/my_congestion.svg +0 -0
  151. {physdes_py-0.6 → physdes_py-0.8/outputs}/neg_specical10.svg +0 -0
  152. {physdes_py-0.6 → physdes_py-0.8}/outputs/polygon_convex_hull.svg +0 -0
  153. {physdes_py-0.6 → physdes_py-0.8}/outputs/polygon_convex_hull13.svg +0 -0
  154. {physdes_py-0.6 → physdes_py-0.8}/outputs/rectilinear-shapes-for-vlsi-physical-desgin.svg +0 -0
  155. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolygon_convex_cut.svg +0 -0
  156. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolygon_cut_explicit.svg +0 -0
  157. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolyon_convex_hull.svg +0 -0
  158. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolyon_convex_hull13.svg +0 -0
  159. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolyon_cut_convex.svg +0 -0
  160. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolyon_cut_convex2.svg +0 -0
  161. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolyon_xmono.svg +0 -0
  162. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolyon_xmono_hull.svg +0 -0
  163. {physdes_py-0.6 → physdes_py-0.8}/outputs/rpolyon_ymono_hull.svg +0 -0
  164. {physdes_py-0.6 → physdes_py-0.8}/outputs/steiner_forest.svg +0 -0
  165. {physdes_py-0.6 → physdes_py-0.8}/outputs/steiner_forest_diagonal.svg +0 -0
  166. {physdes_py-0.6 → physdes_py-0.8}/outputs/test.svg +0 -0
  167. {physdes_py-0.6 → physdes_py-0.8}/outputs/xmono_hull.svg +0 -0
  168. {physdes_py-0.6 → physdes_py-0.8}/plot_alpha.py +0 -0
  169. {physdes_py-0.6 → physdes_py-0.8}/presentation_overlap_detection.html +0 -0
  170. {physdes_py-0.6 → physdes_py-0.8}/presentation_overlap_detection.md +0 -0
  171. {physdes_py-0.6 → physdes_py-0.8}/pyproject.toml +0 -0
  172. {physdes_py-0.6 → physdes_py-0.8}/requirements/README.md +0 -0
  173. {physdes_py-0.6 → physdes_py-0.8}/requirements/default.txt +0 -0
  174. {physdes_py-0.6 → physdes_py-0.8}/requirements/dev.txt +0 -0
  175. {physdes_py-0.6 → physdes_py-0.8}/requirements/doc.txt +0 -0
  176. {physdes_py-0.6 → physdes_py-0.8}/requirements/extras.txt +0 -0
  177. {physdes_py-0.6 → physdes_py-0.8}/requirements/test.txt +0 -0
  178. {physdes_py-0.6 → physdes_py-0.8}/requirements.txt +0 -0
  179. {physdes_py-0.6 → physdes_py-0.8}/rpolygon-slides.html +0 -0
  180. {physdes_py-0.6 → physdes_py-0.8}/rpolygon-slides.md +0 -0
  181. {physdes_py-0.6 → physdes_py-0.8}/setup.py +0 -0
  182. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/cts/clk_tree3d_vis.py +0 -0
  183. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/generic.tpy +0 -0
  184. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/manhattan_arc_3d.py +0 -0
  185. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/manhattan_arc_3d.tpy +0 -0
  186. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/point.tpy +0 -0
  187. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/py.typed +0 -0
  188. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/rdllist.py +0 -0
  189. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/router/global_router.py +0 -0
  190. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/router/global_router3d.tpy +0 -0
  191. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/router/steiner_forest.md +0 -0
  192. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/steiner_forest/congestion_map.py +0 -0
  193. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/steiner_forest/my_congestion.svg +0 -0
  194. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/steiner_forest/steiner_forest.md +0 -0
  195. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/steiner_forest/steiner_forest.svg +0 -0
  196. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/steiner_forest/steiner_forest_diagonal.svg +0 -0
  197. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/to_polygon.py +0 -0
  198. {physdes_py-0.6 → physdes_py-0.8}/src/physdes/vector2.tpy +0 -0
  199. {physdes_py-0.6 → physdes_py-0.8}/src/physdes_py.egg-info/dependency_links.txt +0 -0
  200. {physdes_py-0.6 → physdes_py-0.8}/src/physdes_py.egg-info/not-zip-safe +0 -0
  201. {physdes_py-0.6 → physdes_py-0.8}/src/physdes_py.egg-info/top_level.txt +0 -0
  202. {physdes_py-0.6 → physdes_py-0.8}/svgo.config.js +0 -0
  203. {physdes_py-0.6 → physdes_py-0.8}/test.svg +0 -0
  204. {physdes_py-0.6 → physdes_py-0.8}/tests/__init__.py +0 -0
  205. {physdes_py-0.6 → physdes_py-0.8}/tests/conftest.py +0 -0
  206. {physdes_py-0.6 → physdes_py-0.8}/tests/golden.txt +0 -0
  207. {physdes_py-0.6 → physdes_py-0.8}/tests/mysvg.css +0 -0
  208. {physdes_py-0.6 → physdes_py-0.8}/tests/pnrpoly.svg +0 -0
  209. {physdes_py-0.6 → physdes_py-0.8}/tests/run_failing_tests.py +0 -0
  210. {physdes_py-0.6 → physdes_py-0.8}/tests/test_alpha.py +0 -0
  211. {physdes_py-0.6 → physdes_py-0.8}/tests/test_generic_functions.py +0 -0
  212. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router.py +0 -0
  213. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router3d.py +0 -0
  214. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router3d.tpy +0 -0
  215. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router3d_with_keepouts2.py +0 -0
  216. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router_logic.py +0 -0
  217. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router_logic3d.tpy +0 -0
  218. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router_with_keepouts.py +0 -0
  219. {physdes_py-0.6 → physdes_py-0.8}/tests/test_global_router_with_keepouts2.py +0 -0
  220. {physdes_py-0.6 → physdes_py-0.8}/tests/test_interval.py +0 -0
  221. {physdes_py-0.6 → physdes_py-0.8}/tests/test_manhattan_arc_3d.py +0 -0
  222. {physdes_py-0.6 → physdes_py-0.8}/tests/test_manhattan_arc_3d.tpy +0 -0
  223. {physdes_py-0.6 → physdes_py-0.8}/tests/test_merge.py +0 -0
  224. {physdes_py-0.6 → physdes_py-0.8}/tests/test_merge3d.tpy +0 -0
  225. {physdes_py-0.6 → physdes_py-0.8}/tests/test_nearest_point_to.tpy +0 -0
  226. {physdes_py-0.6 → physdes_py-0.8}/tests/test_overlap.py +0 -0
  227. {physdes_py-0.6 → physdes_py-0.8}/tests/test_point.py +0 -0
  228. {physdes_py-0.6 → physdes_py-0.8}/tests/test_point_extended.py +0 -0
  229. {physdes_py-0.6 → physdes_py-0.8}/tests/test_point_hypothesis.py +0 -0
  230. {physdes_py-0.6 → physdes_py-0.8}/tests/test_polygon.py +0 -0
  231. {physdes_py-0.6 → physdes_py-0.8}/tests/test_polygon.svg +0 -0
  232. {physdes_py-0.6 → physdes_py-0.8}/tests/test_polygon_convex_decomposition.py +0 -0
  233. {physdes_py-0.6 → physdes_py-0.8}/tests/test_polygon_hypothesis.py +0 -0
  234. {physdes_py-0.6 → physdes_py-0.8}/tests/test_rdllist.py +0 -0
  235. {physdes_py-0.6 → physdes_py-0.8}/tests/test_rect3d.py +0 -0
  236. {physdes_py-0.6 → physdes_py-0.8}/tests/test_recti.py +0 -0
  237. {physdes_py-0.6 → physdes_py-0.8}/tests/test_recti_hypothesis.py +0 -0
  238. {physdes_py-0.6 → physdes_py-0.8}/tests/test_routing_tree3d.tpy +0 -0
  239. {physdes_py-0.6 → physdes_py-0.8}/tests/test_routing_visualizer.py +0 -0
  240. {physdes_py-0.6 → physdes_py-0.8}/tests/test_rpolygon.py +0 -0
  241. {physdes_py-0.6 → physdes_py-0.8}/tests/test_rpolygon_convex_cut.py +0 -0
  242. {physdes_py-0.6 → physdes_py-0.8}/tests/test_rpolygon_convex_hull.py +0 -0
  243. {physdes_py-0.6 → physdes_py-0.8}/tests/test_rpolygon_cut.py +0 -0
  244. {physdes_py-0.6 → physdes_py-0.8}/tests/test_steiner_forest_grid.py +0 -0
  245. {physdes_py-0.6 → physdes_py-0.8}/tests/test_to_polygon.py +0 -0
  246. {physdes_py-0.6 → physdes_py-0.8}/tests/test_vector2.py +0 -0
  247. {physdes_py-0.6 → physdes_py-0.8}/tests/test_vector2_hypothesis.py +0 -0
  248. {physdes_py-0.6 → physdes_py-0.8}/tests/xmono_polygon.svg +0 -0
  249. {physdes_py-0.6 → physdes_py-0.8}/tests/xmono_polygon2.svg +0 -0
  250. {physdes_py-0.6 → physdes_py-0.8}/tests/ymono_polygon.svg +0 -0
  251. {physdes_py-0.6 → physdes_py-0.8}/tests/ymono_rpolygon.svg +0 -0
  252. {physdes_py-0.6 → physdes_py-0.8}/tox.ini +0 -0
  253. {physdes_py-0.6 → physdes_py-0.8}/wirelength_vs_alpha.png +0 -0
  254. {physdes_py-0.6 → physdes_py-0.8}/wirelength_vs_alpha_small.png +0 -0
@@ -185,3 +185,7 @@ mypy_error.log
185
185
  # Build artifacts
186
186
  diagram.bob
187
187
  oryx-build-commands.txt
188
+
189
+ # Cache dirs
190
+ .ruff_cache/
191
+ .benchmarks/
@@ -0,0 +1,39 @@
1
+ # Changelog
2
+
3
+ ## Version 0.8 (2026-09-04)
4
+
5
+ ### Features
6
+ - **Builder pattern for ClockTreeVisualizer**: Added fluent `ClockTreeVisualizerBuilder` (`builder().margin(..).node_radius(..)...build()`) mirroring the C++/Rust siblings; `create_interactive_svg` and `create_comparison_visualization` now use it. (#311848a)
7
+
8
+ ### Refactoring
9
+ - **Template Method in rpolygon cut decomposition**: Collapsed the duplicated convex/explicit recursive decomposers into one `rpolygon_cut_recur` Template Method plus shared `rpolygon_cut_impl`; public entry points unchanged. (#3666c82)
10
+ - **Factory Method in global routing tree**: Concentrated 5 duplicated ID-generation/registration sites behind a single `_create_node` factory, preserving the `insert_node_on_branch` ValueError contract and ordering constraints. (#2e03732)
11
+ - **Module-level logging**: Replaced `skeleton._logger` with standard module-level `logging`. (#6c863fd)
12
+
13
+ ### Testing & Code Quality
14
+ - **Builder tests**: Added tests for builder output, default-equivalence and fluent reuse, plus a doctest on the builder class. (#311848a)
15
+ - **mypy fixes**: Resolved None checks and type annotations. (#2a5f7b2)
16
+
17
+ ### Code Cleanup
18
+ - **Removed AI slop**: Stripped boilerplate from docstrings and comments. (#587ad95)
19
+ - **Deduped route3d legends**: Removed duplicated legend entries in example SVGs. (#678aa21)
20
+ - **Stripped empty `entry_points`**: Removed dead section from setup.cfg. (#fd06baf)
21
+ - **EOF newlines in example SVGs**: Added trailing newlines to 15 figures and formatted sources. (#23aaf16)
22
+
23
+ ### Build & CI
24
+ - **RTD doc build**: Added matplotlib and numpy to `docs/requirements.txt`. (#41cad71)
25
+
26
+ ## Version 0.7 (2026-07-16)
27
+
28
+ ### Performance
29
+ - **`__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)
30
+
31
+ ### Bug Fixes
32
+ - **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)
33
+ - **NodeType rename**: Changed `ALL_CAPS` enum values to `PascalCase` to align with Rust naming conventions. (#0267be3)
34
+
35
+ ### Documentation
36
+ - **Doc build scripts**: Updated remark and slide build scripts. Updated example plot scripts for RPolygon, CTS, and global router. (#0a613b3)
37
+
38
+ ### Code Cleanup
39
+ - **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.6
3
+ Version: 0.8
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
@@ -26,36 +26,36 @@
26
26
  <circle cx="455.64903846153845" cy="357.6923076923077" r="6" fill="green" stroke="black" stroke-width="1"/>
27
27
  <text x="463.64903846153845" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">T2</text>
28
28
  <text x="455.64903846153845" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1216)</text>
29
- <circle cx="455.64903846153845" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
30
- <text x="463.64903846153845" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S1</text>
31
- <text x="455.64903846153845" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1344)</text>
32
29
  <circle cx="601.6826923076923" cy="550.0" r="6" fill="green" stroke="black" stroke-width="1"/>
33
30
  <text x="609.6826923076923" y="554.0" font-family="Arial" font-size="10" fill="black">T3</text>
34
31
  <text x="601.6826923076923" y="539.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1856)</text>
35
- <circle cx="382.63221153846155" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
36
- <text x="390.63221153846155" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S2</text>
37
- <text x="382.63221153846155" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1344)</text>
32
+ <circle cx="455.64903846153845" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
33
+ <text x="463.64903846153845" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S1</text>
34
+ <text x="455.64903846153845" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1344)</text>
38
35
  <circle cx="382.63221153846155" cy="242.3076923076923" r="6" fill="green" stroke="black" stroke-width="1"/>
39
36
  <text x="390.63221153846155" y="246.3076923076923" font-family="Arial" font-size="10" fill="black">T4</text>
40
37
  <text x="382.63221153846155" y="231.3076923076923" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,832)</text>
41
- <circle cx="236.59855769230768" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
42
- <text x="244.59855769230768" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S3</text>
43
- <text x="236.59855769230768" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,1344)</text>
38
+ <circle cx="382.63221153846155" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
39
+ <text x="390.63221153846155" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S2</text>
40
+ <text x="382.63221153846155" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1344)</text>
44
41
  <circle cx="236.59855769230768" cy="50.0" r="6" fill="green" stroke="black" stroke-width="1"/>
45
42
  <text x="244.59855769230768" y="54.0" font-family="Arial" font-size="10" fill="black">T5</text>
46
43
  <text x="236.59855769230768" y="39.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,192)</text>
47
- <circle cx="236.59855769230768" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
48
- <text x="244.59855769230768" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S4</text>
49
- <text x="236.59855769230768" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,320)</text>
44
+ <circle cx="236.59855769230768" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
45
+ <text x="244.59855769230768" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S3</text>
46
+ <text x="236.59855769230768" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,1344)</text>
50
47
  <circle cx="528.6658653846154" cy="88.46153846153845" r="6" fill="green" stroke="black" stroke-width="1"/>
51
48
  <text x="536.6658653846154" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">T6</text>
52
49
  <text x="528.6658653846154" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1620,320)</text>
53
- <circle cx="601.6826923076923" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
54
- <text x="609.6826923076923" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S5</text>
55
- <text x="601.6826923076923" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1344)</text>
50
+ <circle cx="236.59855769230768" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
51
+ <text x="244.59855769230768" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S4</text>
52
+ <text x="236.59855769230768" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,320)</text>
56
53
  <circle cx="674.6995192307692" cy="203.84615384615384" r="6" fill="green" stroke="black" stroke-width="1"/>
57
54
  <text x="682.6995192307692" y="207.84615384615384" font-family="Arial" font-size="10" fill="black">T7</text>
58
55
  <text x="674.6995192307692" y="192.84615384615384" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(2106,704)</text>
56
+ <circle cx="601.6826923076923" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
57
+ <text x="609.6826923076923" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S5</text>
58
+ <text x="601.6826923076923" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1344)</text>
59
59
  <text x="20" y="20" font-family="Arial" font-size="12" font-weight="bold">Legend:</text>
60
60
  <circle cx="20" cy="36" r="4" fill="red" stroke="black"/>
61
61
  <text x="30" y="40" font-family="Arial" font-size="10">Source</text>
@@ -68,4 +68,4 @@
68
68
  <text x="20" y="140" font-family="Arial" font-size="9">Terminals: 7</text>
69
69
  <text x="20" y="155" font-family="Arial" font-size="9">Steiner: 5</text>
70
70
  <text x="20" y="170" font-family="Arial" font-size="9">Wirelength: 6379.00</text>
71
- </svg>
71
+ </svg>
@@ -25,33 +25,33 @@
25
25
  <circle cx="455.64903846153845" cy="357.6923076923077" r="6" fill="green" stroke="black" stroke-width="1"/>
26
26
  <text x="463.64903846153845" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">T2</text>
27
27
  <text x="455.64903846153845" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1216)</text>
28
- <circle cx="455.64903846153845" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
29
- <text x="463.64903846153845" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S1</text>
30
- <text x="455.64903846153845" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1344)</text>
31
28
  <circle cx="601.6826923076923" cy="550.0" r="6" fill="green" stroke="black" stroke-width="1"/>
32
29
  <text x="609.6826923076923" y="554.0" font-family="Arial" font-size="10" fill="black">T3</text>
33
30
  <text x="601.6826923076923" y="539.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1856)</text>
34
- <circle cx="382.63221153846155" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
35
- <text x="390.63221153846155" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S2</text>
36
- <text x="382.63221153846155" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1344)</text>
31
+ <circle cx="455.64903846153845" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
32
+ <text x="463.64903846153845" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S1</text>
33
+ <text x="455.64903846153845" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1344)</text>
37
34
  <circle cx="382.63221153846155" cy="242.3076923076923" r="6" fill="green" stroke="black" stroke-width="1"/>
38
35
  <text x="390.63221153846155" y="246.3076923076923" font-family="Arial" font-size="10" fill="black">T4</text>
39
36
  <text x="382.63221153846155" y="231.3076923076923" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,832)</text>
37
+ <circle cx="382.63221153846155" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
38
+ <text x="390.63221153846155" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S2</text>
39
+ <text x="382.63221153846155" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1344)</text>
40
40
  <circle cx="236.59855769230768" cy="50.0" r="6" fill="green" stroke="black" stroke-width="1"/>
41
41
  <text x="244.59855769230768" y="54.0" font-family="Arial" font-size="10" fill="black">T5</text>
42
42
  <text x="236.59855769230768" y="39.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,192)</text>
43
- <circle cx="382.63221153846155" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
44
- <text x="390.63221153846155" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S3</text>
45
- <text x="382.63221153846155" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,320)</text>
46
43
  <circle cx="528.6658653846154" cy="88.46153846153845" r="6" fill="green" stroke="black" stroke-width="1"/>
47
44
  <text x="536.6658653846154" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">T6</text>
48
45
  <text x="528.6658653846154" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1620,320)</text>
49
- <circle cx="601.6826923076923" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
50
- <text x="609.6826923076923" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S4</text>
51
- <text x="601.6826923076923" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1344)</text>
46
+ <circle cx="382.63221153846155" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
47
+ <text x="390.63221153846155" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S3</text>
48
+ <text x="382.63221153846155" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,320)</text>
52
49
  <circle cx="674.6995192307692" cy="203.84615384615384" r="6" fill="green" stroke="black" stroke-width="1"/>
53
50
  <text x="682.6995192307692" y="207.84615384615384" font-family="Arial" font-size="10" fill="black">T7</text>
54
51
  <text x="674.6995192307692" y="192.84615384615384" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(2106,704)</text>
52
+ <circle cx="601.6826923076923" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
53
+ <text x="609.6826923076923" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S4</text>
54
+ <text x="601.6826923076923" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1344)</text>
55
55
  <text x="20" y="20" font-family="Arial" font-size="12" font-weight="bold">Legend:</text>
56
56
  <circle cx="20" cy="36" r="4" fill="red" stroke="black"/>
57
57
  <text x="30" y="40" font-family="Arial" font-size="10">Source</text>
@@ -64,4 +64,4 @@
64
64
  <text x="20" y="140" font-family="Arial" font-size="9">Terminals: 7</text>
65
65
  <text x="20" y="155" font-family="Arial" font-size="9">Steiner: 4</text>
66
66
  <text x="20" y="170" font-family="Arial" font-size="9">Wirelength: 5867.00</text>
67
- </svg>
67
+ </svg>
@@ -24,27 +24,27 @@
24
24
  <circle cx="455.64903846153845" cy="357.6923076923077" r="6" fill="green" stroke="black" stroke-width="1"/>
25
25
  <text x="463.64903846153845" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">T2</text>
26
26
  <text x="455.64903846153845" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1216)</text>
27
- <circle cx="455.64903846153845" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
28
- <text x="463.64903846153845" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S1</text>
29
- <text x="455.64903846153845" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1344)</text>
30
27
  <circle cx="601.6826923076923" cy="550.0" r="6" fill="green" stroke="black" stroke-width="1"/>
31
28
  <text x="609.6826923076923" y="554.0" font-family="Arial" font-size="10" fill="black">T3</text>
32
29
  <text x="601.6826923076923" y="539.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1856)</text>
33
- <circle cx="382.63221153846155" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
34
- <text x="390.63221153846155" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S2</text>
35
- <text x="382.63221153846155" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1344)</text>
30
+ <circle cx="455.64903846153845" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
31
+ <text x="463.64903846153845" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S1</text>
32
+ <text x="455.64903846153845" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1344)</text>
36
33
  <circle cx="382.63221153846155" cy="242.3076923076923" r="6" fill="green" stroke="black" stroke-width="1"/>
37
34
  <text x="390.63221153846155" y="246.3076923076923" font-family="Arial" font-size="10" fill="black">T4</text>
38
35
  <text x="382.63221153846155" y="231.3076923076923" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,832)</text>
36
+ <circle cx="382.63221153846155" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
37
+ <text x="390.63221153846155" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S2</text>
38
+ <text x="382.63221153846155" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1344)</text>
39
39
  <circle cx="236.59855769230768" cy="50.0" r="6" fill="green" stroke="black" stroke-width="1"/>
40
40
  <text x="244.59855769230768" y="54.0" font-family="Arial" font-size="10" fill="black">T5</text>
41
41
  <text x="236.59855769230768" y="39.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,192)</text>
42
- <circle cx="382.63221153846155" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
43
- <text x="390.63221153846155" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S3</text>
44
- <text x="382.63221153846155" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,320)</text>
45
42
  <circle cx="528.6658653846154" cy="88.46153846153845" r="6" fill="green" stroke="black" stroke-width="1"/>
46
43
  <text x="536.6658653846154" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">T6</text>
47
44
  <text x="528.6658653846154" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1620,320)</text>
45
+ <circle cx="382.63221153846155" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
46
+ <text x="390.63221153846155" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S3</text>
47
+ <text x="382.63221153846155" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,320)</text>
48
48
  <circle cx="674.6995192307692" cy="203.84615384615384" r="6" fill="green" stroke="black" stroke-width="1"/>
49
49
  <text x="682.6995192307692" y="207.84615384615384" font-family="Arial" font-size="10" fill="black">T7</text>
50
50
  <text x="674.6995192307692" y="192.84615384615384" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(2106,704)</text>
@@ -60,4 +60,4 @@
60
60
  <text x="20" y="140" font-family="Arial" font-size="9">Terminals: 7</text>
61
61
  <text x="20" y="155" font-family="Arial" font-size="9">Steiner: 3</text>
62
62
  <text x="20" y="170" font-family="Arial" font-size="9">Wirelength: 5854.00</text>
63
- </svg>
63
+ </svg>
@@ -25,30 +25,30 @@
25
25
  <circle cx="455.64903846153845" cy="357.6923076923077" r="6" fill="green" stroke="black" stroke-width="1"/>
26
26
  <text x="463.64903846153845" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">T2</text>
27
27
  <text x="455.64903846153845" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1216)</text>
28
- <circle cx="163.58173076923077" cy="511.53846153846155" r="6" fill="blue" stroke="black" stroke-width="1"/>
29
- <text x="171.58173076923077" y="515.5384615384615" font-family="Arial" font-size="10" fill="black">S1</text>
30
- <text x="163.58173076923077" y="500.53846153846155" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(405,1728)</text>
31
28
  <circle cx="601.6826923076923" cy="550.0" r="6" fill="green" stroke="black" stroke-width="1"/>
32
29
  <text x="609.6826923076923" y="554.0" font-family="Arial" font-size="10" fill="black">T3</text>
33
30
  <text x="601.6826923076923" y="539.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1856)</text>
34
- <circle cx="382.63221153846155" cy="357.6923076923077" r="6" fill="blue" stroke="black" stroke-width="1"/>
35
- <text x="390.63221153846155" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">S2</text>
36
- <text x="382.63221153846155" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1216)</text>
31
+ <circle cx="163.58173076923077" cy="511.53846153846155" r="6" fill="blue" stroke="black" stroke-width="1"/>
32
+ <text x="171.58173076923077" y="515.5384615384615" font-family="Arial" font-size="10" fill="black">S1</text>
33
+ <text x="163.58173076923077" y="500.53846153846155" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(405,1728)</text>
37
34
  <circle cx="382.63221153846155" cy="242.3076923076923" r="6" fill="green" stroke="black" stroke-width="1"/>
38
35
  <text x="390.63221153846155" y="246.3076923076923" font-family="Arial" font-size="10" fill="black">T4</text>
39
36
  <text x="382.63221153846155" y="231.3076923076923" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,832)</text>
40
- <circle cx="236.59855769230768" cy="357.6923076923077" r="6" fill="blue" stroke="black" stroke-width="1"/>
41
- <text x="244.59855769230768" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">S3</text>
42
- <text x="236.59855769230768" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,1216)</text>
37
+ <circle cx="382.63221153846155" cy="357.6923076923077" r="6" fill="blue" stroke="black" stroke-width="1"/>
38
+ <text x="390.63221153846155" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">S2</text>
39
+ <text x="382.63221153846155" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1216)</text>
43
40
  <circle cx="236.59855769230768" cy="50.0" r="6" fill="green" stroke="black" stroke-width="1"/>
44
41
  <text x="244.59855769230768" y="54.0" font-family="Arial" font-size="10" fill="black">T5</text>
45
42
  <text x="236.59855769230768" y="39.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,192)</text>
46
- <circle cx="236.59855769230768" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
47
- <text x="244.59855769230768" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S4</text>
48
- <text x="236.59855769230768" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,320)</text>
43
+ <circle cx="236.59855769230768" cy="357.6923076923077" r="6" fill="blue" stroke="black" stroke-width="1"/>
44
+ <text x="244.59855769230768" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">S3</text>
45
+ <text x="236.59855769230768" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,1216)</text>
49
46
  <circle cx="528.6658653846154" cy="88.46153846153845" r="6" fill="green" stroke="black" stroke-width="1"/>
50
47
  <text x="536.6658653846154" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">T6</text>
51
48
  <text x="528.6658653846154" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1620,320)</text>
49
+ <circle cx="236.59855769230768" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
50
+ <text x="244.59855769230768" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S4</text>
51
+ <text x="236.59855769230768" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,320)</text>
52
52
  <circle cx="674.6995192307692" cy="203.84615384615384" r="6" fill="green" stroke="black" stroke-width="1"/>
53
53
  <text x="682.6995192307692" y="207.84615384615384" font-family="Arial" font-size="10" fill="black">T7</text>
54
54
  <text x="674.6995192307692" y="192.84615384615384" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(2106,704)</text>
@@ -64,4 +64,4 @@
64
64
  <text x="20" y="140" font-family="Arial" font-size="9">Terminals: 7</text>
65
65
  <text x="20" y="155" font-family="Arial" font-size="9">Steiner: 4</text>
66
66
  <text x="20" y="170" font-family="Arial" font-size="9">Wirelength: 6928.00</text>
67
- </svg>
67
+ </svg>
@@ -26,36 +26,36 @@
26
26
  <circle cx="455.64903846153845" cy="357.6923076923077" r="6" fill="green" stroke="black" stroke-width="1"/>
27
27
  <text x="463.64903846153845" y="361.6923076923077" font-family="Arial" font-size="10" fill="black">T2</text>
28
28
  <text x="455.64903846153845" y="346.6923076923077" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1216)</text>
29
- <circle cx="455.64903846153845" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
30
- <text x="463.64903846153845" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S1</text>
31
- <text x="455.64903846153845" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1344)</text>
32
29
  <circle cx="601.6826923076923" cy="550.0" r="6" fill="green" stroke="black" stroke-width="1"/>
33
30
  <text x="609.6826923076923" y="554.0" font-family="Arial" font-size="10" fill="black">T3</text>
34
31
  <text x="601.6826923076923" y="539.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1856)</text>
35
- <circle cx="382.63221153846155" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
36
- <text x="390.63221153846155" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S2</text>
37
- <text x="382.63221153846155" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1344)</text>
32
+ <circle cx="455.64903846153845" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
33
+ <text x="463.64903846153845" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S1</text>
34
+ <text x="455.64903846153845" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1377,1344)</text>
38
35
  <circle cx="382.63221153846155" cy="242.3076923076923" r="6" fill="green" stroke="black" stroke-width="1"/>
39
36
  <text x="390.63221153846155" y="246.3076923076923" font-family="Arial" font-size="10" fill="black">T4</text>
40
37
  <text x="382.63221153846155" y="231.3076923076923" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,832)</text>
41
- <circle cx="236.59855769230768" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
42
- <text x="244.59855769230768" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S3</text>
43
- <text x="236.59855769230768" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,1344)</text>
38
+ <circle cx="382.63221153846155" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
39
+ <text x="390.63221153846155" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S2</text>
40
+ <text x="382.63221153846155" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1134,1344)</text>
44
41
  <circle cx="236.59855769230768" cy="50.0" r="6" fill="green" stroke="black" stroke-width="1"/>
45
42
  <text x="244.59855769230768" y="54.0" font-family="Arial" font-size="10" fill="black">T5</text>
46
43
  <text x="236.59855769230768" y="39.0" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,192)</text>
47
- <circle cx="236.59855769230768" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
48
- <text x="244.59855769230768" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S4</text>
49
- <text x="236.59855769230768" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,320)</text>
44
+ <circle cx="236.59855769230768" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
45
+ <text x="244.59855769230768" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S3</text>
46
+ <text x="236.59855769230768" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,1344)</text>
50
47
  <circle cx="528.6658653846154" cy="88.46153846153845" r="6" fill="green" stroke="black" stroke-width="1"/>
51
48
  <text x="536.6658653846154" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">T6</text>
52
49
  <text x="528.6658653846154" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1620,320)</text>
53
- <circle cx="601.6826923076923" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
54
- <text x="609.6826923076923" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S5</text>
55
- <text x="601.6826923076923" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1344)</text>
50
+ <circle cx="236.59855769230768" cy="88.46153846153845" r="6" fill="blue" stroke="black" stroke-width="1"/>
51
+ <text x="244.59855769230768" y="92.46153846153845" font-family="Arial" font-size="10" fill="black">S4</text>
52
+ <text x="236.59855769230768" y="77.46153846153845" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(648,320)</text>
56
53
  <circle cx="674.6995192307692" cy="203.84615384615384" r="6" fill="green" stroke="black" stroke-width="1"/>
57
54
  <text x="682.6995192307692" y="207.84615384615384" font-family="Arial" font-size="10" fill="black">T7</text>
58
55
  <text x="674.6995192307692" y="192.84615384615384" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(2106,704)</text>
56
+ <circle cx="601.6826923076923" cy="396.15384615384613" r="6" fill="blue" stroke="black" stroke-width="1"/>
57
+ <text x="609.6826923076923" y="400.15384615384613" font-family="Arial" font-size="10" fill="black">S5</text>
58
+ <text x="601.6826923076923" y="385.15384615384613" font-family="Arial" font-size="8" fill="gray" text-anchor="middle">(1863,1344)</text>
59
59
  <text x="20" y="20" font-family="Arial" font-size="12" font-weight="bold">Legend:</text>
60
60
  <circle cx="20" cy="36" r="4" fill="red" stroke="black"/>
61
61
  <text x="30" y="40" font-family="Arial" font-size="10">Source</text>
@@ -68,4 +68,4 @@
68
68
  <text x="20" y="140" font-family="Arial" font-size="9">Terminals: 7</text>
69
69
  <text x="20" y="155" font-family="Arial" font-size="9">Steiner: 5</text>
70
70
  <text x="20" y="170" font-family="Arial" font-size="9">Wirelength: 6379.00</text>
71
- </svg>
71
+ </svg>
@@ -9,7 +9,6 @@ from typing import Generator
9
9
 
10
10
  from lds_gen.ilds import Halton
11
11
 
12
- # from physdes.interval import Interval
13
12
  from physdes.point import Point
14
13
  from physdes.recti import detect_overlap_gen
15
14
 
@@ -59,24 +58,6 @@ def visualize_overlap_svg(
59
58
  f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" style="background-color:#f8f9fa;">',
60
59
  ]
61
60
 
62
- # legend_y = 30
63
- # svg_parts.append(f'<text x="{margin}" y="{legend_y}" font-size="14" fill="#333">Rectangles</text>')
64
- # legend_y += 20
65
- # svg_parts.append(f'<rect x="{margin}" y="{legend_y - 12}" width="16" height="12" fill="#4a90d9" stroke="#333"/>')
66
- # svg_parts.append(f'<text x="{margin + 20}" y="{legend_y}" font-size="12" fill="#333">Non-overlapping</text>')
67
- # legend_y += 20
68
- # svg_parts.append(f'<rect x="{margin}" y="{legend_y - 12}" width="16" height="12" fill="#e74c3c" stroke="#c0392b"/>')
69
- # svg_parts.append(f'<text x="{margin + 20}" y="{legend_y}" font-size="12" fill="#333">Overlapping</text>')
70
- # if overlapping_pair:
71
- # legend_y += 20
72
- # svg_parts.append(f'<text x="{margin + 20}" y="{legend_y}" font-size="12" fill="#e74c3c">Overlap detected!</text>')
73
- # legend_y += 20
74
- # pair1_str = f"({overlapping_pair[0].xcoord}, {overlapping_pair[0].ycoord})"
75
- # svg_parts.append(f'<text x="{margin + 20}" y="{legend_y}" font-size="11" fill="#666">{pair1_str}</text>')
76
- # legend_y += 15
77
- # pair2_str = f"({overlapping_pair[1].xcoord}, {overlapping_pair[1].ycoord})"
78
- # svg_parts.append(f'<text x="{margin + 20}" y="{legend_y}" font-size="11" fill="#666">{pair2_str}</text>')
79
-
80
61
  for idx, r in enumerate(rectangles):
81
62
  x1 = to_svg_x(r.xcoord.lb)
82
63
  y1 = to_svg_y(r.ycoord.ub)
@@ -96,10 +77,6 @@ def visualize_overlap_svg(
96
77
  f'<rect x="{x1}" y="{y1}" width="{w}" height="{h}" fill="{fill}" stroke="{stroke}" stroke-width="2" opacity="{opacity}"/>'
97
78
  )
98
79
 
99
- # cx = x1 + w / 2
100
- # cy = y1 + h / 2
101
- # svg_parts.append(f'<text x="{cx}" y="{cy + 4}" text-anchor="middle" font-size="11" fill="white" font-weight="bold">{idx + 1}</text>')
102
-
103
80
  svg_parts.append("</svg>")
104
81
  return "\n".join(svg_parts)
105
82
 
@@ -111,38 +88,12 @@ def demo() -> None:
111
88
  coords = [hgen.pop() for _ in range(500)]
112
89
  svg_rects = [Point(coord[0], coord[1]).enlarge_with(10) for coord in coords]
113
90
 
114
- # svg_rects = [
115
- # Rectangle(Interval(0, 4), Interval(0, 4)),
116
- # Rectangle(Interval(2, 6), Interval(2, 6)),
117
- # Rectangle(Interval(5, 9), Interval(5, 9)),
118
- # Rectangle(Interval(8, 12), Interval(8, 12)),
119
- # Rectangle(Interval(11, 15), Interval(11, 15)),
120
- # Rectangle(Interval(3, 7), Interval(10, 14)),
121
- # Rectangle(Interval(14, 18), Interval(14, 18)),
122
- # Rectangle(Interval(16, 20), Interval(4, 8)),
123
- # Rectangle(Interval(6, 10), Interval(6, 10)),
124
- # Rectangle(Interval(9, 13), Interval(12, 16)),
125
- # Rectangle(Interval(0, 3), Interval(8, 11)),
126
- # ]
127
-
128
- # print(f"Testing with {len(svg_rects)} rectangles:")
129
- # for i, r in enumerate(svg_rects):
130
- # print(f" {i + 1}: ({r.xcoord}, {r.ycoord})")
131
-
132
91
  print()
133
92
  print("=" * 50)
134
93
  print("Overlap Detection Result")
135
94
  print("=" * 50)
136
95
  overlap_result_gen = detect_overlap_gen(svg_rects)
137
96
 
138
- # for overlap_result in overlap_result_gen:
139
- # r1, r2 = overlap_result
140
- # print("OVERLAP DETECTED between:")
141
- # print(f" Rect A: ({r1.xcoord}, {r1.ycoord})")
142
- # print(f" Rect B: ({r2.xcoord}, {r2.ycoord})")
143
- # else:
144
- # print("No overlap found")
145
-
146
97
  svg = visualize_overlap_svg(svg_rects, overlap_result_gen)
147
98
 
148
99
  with open("demo_overlap.svg", "w") as f:
@@ -4,31 +4,33 @@ Run: python build_from_md.py
4
4
  """
5
5
  import re
6
6
 
7
- with open('D:/github/py/physdes-py/docs/slides_content.md', 'r', encoding='utf-8') as f:
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'\n---\n', md) if s.strip()]
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('\n')[0]
17
- is_qa = '❓ Questions' in first_line
18
- is_end = '🙏 Thank You' in first_line
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'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}')
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 = 'layout: true\nclass: typo, typo-selection\n\n---\n' + '\n\n---\n\n'.join(annotated)
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('</textarea>', '&lt;/textarea&gt;')
31
+ remark_content = remark_content.replace("</textarea>", "&lt;/textarea&gt;")
30
32
 
31
- html = f'''<!doctype html>
33
+ html = f"""<!doctype html>
32
34
  <html>
33
35
  <head>
34
36
  <title>Embedding Figures in Docs — Python &amp; 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 = 'D:/github/luk036.github.io/idea/doc-fig-py-remark-v2.html'
81
- with open(out, 'w', encoding='utf-8') as f:
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'Written {len(html)} bytes, {len(slides)} slides to {out}')
86
+ print(f"Written {len(html)} bytes, {len(slides)} slides to {out}")