librelane 2.4.0.dev8__tar.gz → 3.0.0.dev22__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.

Potentially problematic release.


This version of librelane might be problematic. Click here for more details.

Files changed (174) hide show
  1. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/PKG-INFO +1 -1
  2. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/__main__.py +12 -15
  3. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/__init__.py +1 -1
  4. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/drc.py +88 -7
  5. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/toolbox.py +1 -1
  6. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/config/config.py +5 -1
  7. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/config/flow.py +51 -66
  8. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/config/pdk_compat.py +79 -2
  9. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/config/preprocessor.py +1 -1
  10. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/config/variable.py +2 -2
  11. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/classic.py +1 -0
  12. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/flow.py +3 -6
  13. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/sequential.py +85 -40
  14. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/plugins.py +1 -1
  15. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/common/read.tcl +2 -2
  16. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/gds/extras_mag.tcl +2 -2
  17. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/diodes.py +2 -2
  18. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/dpl.tcl +1 -1
  19. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/grt.tcl +3 -3
  20. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/io.tcl +163 -45
  21. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/resizer.tcl +1 -40
  22. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/set_global_connections.tcl +2 -2
  23. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/set_power_nets.tcl +1 -1
  24. librelane-3.0.0.dev22/librelane/scripts/openroad/common/set_rc.tcl +194 -0
  25. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/cts.tcl +37 -6
  26. librelane-3.0.0.dev22/librelane/scripts/openroad/cut_rows.tcl +39 -0
  27. librelane-3.0.0.dev22/librelane/scripts/openroad/drt.tcl +88 -0
  28. librelane-3.0.0.dev22/librelane/scripts/openroad/dump_rc.tcl +105 -0
  29. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/fill.tcl +2 -2
  30. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/floorplan.tcl +5 -3
  31. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/gpl.tcl +7 -8
  32. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/insert_buffer.tcl +2 -2
  33. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/ioplacer.tcl +1 -2
  34. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/irdrop.tcl +3 -3
  35. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/pdn.tcl +17 -18
  36. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/rcx.tcl +1 -1
  37. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/repair_design.tcl +14 -7
  38. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/repair_design_postgrt.tcl +13 -6
  39. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/rsz_timing_postcts.tcl +13 -12
  40. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +13 -12
  41. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/sta/check_macro_instances.tcl +1 -1
  42. librelane-3.0.0.dev22/librelane/scripts/openroad/tapcell.tcl +32 -0
  43. librelane-2.4.0.dev8/librelane/scripts/openroad/cut_rows.tcl → librelane-3.0.0.dev22/librelane/scripts/openroad/ungpl.tcl +6 -7
  44. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/state/__init__.py +1 -1
  45. librelane-3.0.0.dev22/librelane/state/design_format.py +247 -0
  46. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/state/state.py +20 -21
  47. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/checker.py +12 -1
  48. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/common_variables.py +4 -4
  49. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/cvc_rv.py +1 -1
  50. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/klayout.py +14 -6
  51. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/magic.py +18 -2
  52. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/misc.py +1 -1
  53. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/odb.py +50 -31
  54. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/openroad.py +455 -128
  55. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/pyosys.py +20 -5
  56. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/step.py +17 -20
  57. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/tclstep.py +9 -7
  58. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/yosys.py +1 -1
  59. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/pyproject.toml +1 -1
  60. librelane-2.4.0.dev8/librelane/scripts/openroad/common/set_rc.tcl +0 -75
  61. librelane-2.4.0.dev8/librelane/scripts/openroad/drt.tcl +0 -37
  62. librelane-2.4.0.dev8/librelane/scripts/openroad/tapcell.tcl +0 -25
  63. librelane-2.4.0.dev8/librelane/state/design_format.py +0 -195
  64. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/Readme.md +0 -0
  65. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/__init__.py +0 -0
  66. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/__version__.py +0 -0
  67. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/cli.py +0 -0
  68. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/generic_dict.py +0 -0
  69. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/metrics/__init__.py +0 -0
  70. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/metrics/__main__.py +0 -0
  71. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/metrics/library.py +0 -0
  72. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/metrics/metric.py +0 -0
  73. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/metrics/util.py +0 -0
  74. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/misc.py +6 -6
  75. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/ring_buffer.py +0 -0
  76. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/tcl.py +0 -0
  77. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/tpe.py +0 -0
  78. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/common/types.py +0 -0
  79. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/config/__init__.py +0 -0
  80. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/config/__main__.py +0 -0
  81. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/config/removals.py +0 -0
  82. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/container.py +0 -0
  83. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/env_info.py +0 -0
  84. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm/config.yaml +0 -0
  85. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm/pin_order.cfg +0 -0
  86. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm/src/impl.sdc +0 -0
  87. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm/src/signoff.sdc +0 -0
  88. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm/src/spm.v +0 -0
  89. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm/verify/spm_tb.v +0 -0
  90. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  91. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  92. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  93. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
  94. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  95. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  96. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  97. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/__init__.py +0 -0
  98. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/builtins.py +0 -0
  99. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/cli.py +0 -0
  100. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/misc.py +0 -0
  101. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/optimizing.py +0 -0
  102. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/flows/synth_explore.py +0 -0
  103. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/logging/__init__.py +0 -0
  104. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/logging/logger.py +0 -0
  105. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/open_pdks_rev +0 -0
  106. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/py.typed +0 -0
  107. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/base.sdc +0 -0
  108. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/klayout/Readme.md +0 -0
  109. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/klayout/open_design.py +0 -0
  110. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/klayout/render.py +0 -0
  111. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/klayout/stream_out.py +0 -0
  112. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  113. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/klayout/xor.drc +0 -0
  114. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/Readme.md +0 -0
  115. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
  116. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/def/mag.tcl +0 -0
  117. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
  118. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/drc.tcl +0 -0
  119. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/extract_spice.tcl +0 -0
  120. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
  121. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
  122. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
  123. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/get_bbox.tcl +0 -0
  124. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
  125. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/lef/maglef.tcl +0 -0
  126. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/lef.tcl +0 -0
  127. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/open.tcl +0 -0
  128. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/magic/wrapper.tcl +0 -0
  129. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/netgen/setup.tcl +0 -0
  130. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  131. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  132. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
  133. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/contextualize.py +0 -0
  134. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/defutil.py +0 -0
  135. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  136. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/eco_buffer.py +0 -0
  137. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/eco_diode.py +0 -0
  138. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  139. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/io_place.py +0 -0
  140. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  141. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  142. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  143. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/lefutil.py +0 -0
  144. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/placers.py +0 -0
  145. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/power_utils.py +0 -0
  146. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/random_place.py +0 -0
  147. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/reader.py +0 -0
  148. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  149. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  150. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  151. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  152. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  153. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/basic_mp.tcl +0 -0
  154. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  155. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  156. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
  157. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  158. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  159. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/dpl.tcl +0 -0
  160. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/grt.tcl +0 -0
  161. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/gui.tcl +0 -0
  162. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/sta/corner.tcl +0 -0
  163. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/openroad/write_views.tcl +0 -0
  164. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  165. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/pyosys/json_header.py +0 -0
  166. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/pyosys/synthesize.py +0 -0
  167. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/pyosys/ys_common.py +0 -0
  168. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/scripts/tclsh/hello.tcl +0 -0
  169. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/state/__main__.py +0 -0
  170. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/__init__.py +0 -0
  171. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/__main__.py +0 -0
  172. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/netgen.py +0 -0
  173. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/openroad_alerts.py +0 -0
  174. {librelane-2.4.0.dev8 → librelane-3.0.0.dev22}/librelane/steps/verilator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: librelane
3
- Version: 2.4.0.dev8
3
+ Version: 3.0.0.dev22
4
4
  Summary: An infrastructure for implementing chip design flows
5
5
  Home-page: https://github.com/librelane/librelane
6
6
  License: Apache-2.0
@@ -85,28 +85,25 @@ def run(
85
85
 
86
86
  for config_file in config_files:
87
87
  if meta := Config.get_meta(config_file):
88
- # to maintain backwards compat, in 3 you will need to explicitly
89
- # set the flow you're substituting
90
- target_flow_desc = meta.flow or "Classic"
91
-
92
- if isinstance(target_flow_desc, str):
93
- if found := Flow.factory.get(target_flow_desc):
88
+ if isinstance(meta.flow, str):
89
+ if found := Flow.factory.get(meta.flow):
94
90
  TargetFlow = found
95
91
  else:
96
92
  err(
97
93
  f"Unknown flow '{meta.flow}' specified in configuration file's 'meta' object."
98
94
  )
99
95
  ctx.exit(1)
100
- elif isinstance(target_flow_desc, list):
101
- TargetFlow = SequentialFlow.make(target_flow_desc)
102
- if meta.substituting_steps is not None and issubclass(
103
- TargetFlow, SequentialFlow
104
- ):
96
+ elif isinstance(meta.flow, list):
97
+ TargetFlow = SequentialFlow.make(meta.flow)
98
+ if meta.substituting_steps is not None:
105
99
  if meta.flow is None:
106
- warn(
107
- 'config_file currently has substituting_steps set with no flow, where it will fall back to Classic. Starting LibreLane 3.0.0, this will be an error. Please update your configuration to explicitly set "flow" to "Classic".'
108
- )
109
- TargetFlow = TargetFlow.Substitute(meta.substituting_steps) # type: ignore # Type checker is being rowdy with this one
100
+ err("config_file has substituting_steps set with no flow.")
101
+ ctx.exit(1)
102
+ assert (
103
+ TargetFlow is not None
104
+ ), "run() failed to properly deduce TargetFlow -- please file an issue"
105
+ if issubclass(TargetFlow, SequentialFlow):
106
+ TargetFlow = TargetFlow.Substitute(meta.substituting_steps) # type: ignore # Type checker is being rowdy with this one
110
107
 
111
108
  if flow_name is not None:
112
109
  if found := Flow.factory.get(flow_name):
@@ -55,7 +55,7 @@ from .types import (
55
55
  ScopedFile,
56
56
  )
57
57
  from .toolbox import Toolbox
58
- from .drc import DRC, Violation
58
+ from .drc import DRC, Violation, BoundingBox
59
59
  from . import cli
60
60
  from .tpe import get_tpe, set_tpe
61
61
  from .ring_buffer import RingBuffer
@@ -1,4 +1,4 @@
1
- # Copyright 2020-2023 Efabless Corporation
1
+ # Copyright 2020-2025 Efabless Corporation
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -18,9 +18,19 @@ import shlex
18
18
  from enum import IntEnum
19
19
  from decimal import Decimal, InvalidOperation
20
20
  from dataclasses import dataclass, field, asdict
21
- from typing import List, Optional, Tuple, Dict
21
+ from typing import List, Optional, Tuple, Dict, Iterable
22
22
 
23
- BoundingBox = Tuple[Decimal, Decimal, Decimal, Decimal] # microns
23
+
24
+ @dataclass
25
+ class BoundingBox(Iterable[Decimal]):
26
+ llx: Decimal
27
+ lly: Decimal
28
+ urx: Decimal
29
+ ury: Decimal
30
+ info: Optional[str] = None
31
+
32
+ def __iter__(self):
33
+ return iter([self.llx, self.lly, self.urx, self.ury])
24
34
 
25
35
 
26
36
  @dataclass
@@ -54,6 +64,75 @@ class DRC:
54
64
  module: str
55
65
  violations: Dict[str, Violation]
56
66
 
67
+ @classmethod
68
+ def from_openroad(
69
+ Self,
70
+ report: io.TextIOWrapper,
71
+ module: str,
72
+ ) -> Tuple["DRC", int]:
73
+ class State(IntEnum):
74
+ vio_type = 0
75
+ src = 1
76
+ bbox = 10
77
+
78
+ re_violation = re.compile(r"violation type: (?P<type>.*)$")
79
+ re_src = re.compile(r"srcs: (?P<src1>\S+)( (?P<src2>\S+))?")
80
+ re_bbox = re.compile(
81
+ r"bbox = \((?P<llx>\S+), (?P<lly>\S+)\) - \((?P<urx>\S+), (?P<ury>\S+)\) on Layer (?P<layer>\S+)"
82
+ )
83
+ bbox_count = 0
84
+ violations: Dict[str, Violation] = {}
85
+ state = State.vio_type
86
+ vio_type = src1 = src2 = lly = llx = urx = ury = ""
87
+ for line in report:
88
+ line = line.strip()
89
+ if line.strip() == "":
90
+ continue
91
+ if state == State.vio_type:
92
+ vio_match = re_violation.match(line)
93
+ assert (
94
+ vio_match is not None
95
+ ), f"Error while parsing drc report file: Could not match violation line '{line}'"
96
+ vio_type = vio_match.group("type")
97
+ state = State.src
98
+ elif state == State.src:
99
+ src_match = re_src.match(line)
100
+ assert (
101
+ src_match is not None
102
+ ), f"Error while parsing drc report file: Could not match source line '{line}'"
103
+ src1 = src_match.group("src1")
104
+ src2 = src_match.group("src2")
105
+ state = State.bbox
106
+ elif state == State.bbox:
107
+ bbox_match = re_bbox.match(line)
108
+ assert (
109
+ bbox_match is not None
110
+ ), f"Error while parsing drc report file: Could not match bbox line '{line}'"
111
+ llx = bbox_match.group("llx")
112
+ lly = bbox_match.group("lly")
113
+ urx = bbox_match.group("urx")
114
+ ury = bbox_match.group("ury")
115
+ layer = bbox_match.group("layer")
116
+ bbox_count += 1
117
+ bounding_box = BoundingBox(
118
+ Decimal(llx),
119
+ Decimal(lly),
120
+ Decimal(urx),
121
+ Decimal(ury),
122
+ f"{src1} to {src2}",
123
+ )
124
+ violation = (layer, vio_type)
125
+ description = vio_type
126
+ if violations.get(vio_type) is not None:
127
+ violations[vio_type].bounding_boxes.append(bounding_box)
128
+ else:
129
+ violations[vio_type] = Violation(
130
+ [violation], description, [bounding_box]
131
+ )
132
+ state = State.vio_type
133
+
134
+ return (Self(module, violations), bbox_count)
135
+
57
136
  @classmethod
58
137
  def from_magic(
59
138
  Self,
@@ -125,7 +204,7 @@ class DRC:
125
204
  f"invalid bounding box at line {i}: bounding box has {len(coord_list)}/4 elements"
126
205
  )
127
206
 
128
- bounding_box: BoundingBox = (
207
+ bounding_box = BoundingBox(
129
208
  coord_list[0],
130
209
  coord_list[1],
131
210
  coord_list[2],
@@ -155,7 +234,7 @@ class DRC:
155
234
  "Invalid syntax: 'box' command has less than 4 arguments"
156
235
  )
157
236
  lx, ly, ux, uy = components[0:4]
158
- last_bounding_box = (
237
+ last_bounding_box = BoundingBox(
159
238
  Decimal(lx) * cif_scale,
160
239
  Decimal(ly) * cif_scale,
161
240
  Decimal(ux) * cif_scale,
@@ -239,7 +318,9 @@ class DRC:
239
318
  multiplicity.text = str(len(violation.bounding_boxes))
240
319
  xf.write(cell, category, visited, multiplicity)
241
320
  with xf.element("values"):
242
- llx, lly, urx, ury = bounding_box
243
321
  value = ET.Element("value")
244
- value.text = f"polygon: ({llx},{lly};{urx},{lly};{urx},{ury};{llx},{ury})"
322
+ value.text = f"polygon: ({bounding_box.llx},{bounding_box.lly};{bounding_box.urx},{bounding_box.lly};{bounding_box.urx},{bounding_box.ury};{bounding_box.llx},{bounding_box.ury})"
323
+ xf.write(value)
324
+ value = ET.Element("value")
325
+ value.text = f"text: '{bounding_box.info}'"
245
326
  xf.write(value)
@@ -91,7 +91,7 @@ class Toolbox(object):
91
91
  corner.
92
92
  :param views_by_corner: The mapping from (wild cards) of corner names to
93
93
  views.
94
- :param corner: An explicit override for the default corner. Must be a
94
+ :param timing_corner: An explicit override for the default corner. Must be a
95
95
  fully qualified IPVT corner.
96
96
  :returns: The created list
97
97
  """
@@ -166,7 +166,11 @@ class Meta:
166
166
 
167
167
  version: int = 1
168
168
  flow: Union[None, str, List[str]] = None
169
- substituting_steps: Union[None, Dict[str, Union[str, None]]] = None
169
+ substituting_steps: Union[
170
+ None,
171
+ Dict[str, Union[str, None]],
172
+ List[Tuple[str, Union[str, None]]],
173
+ ] = None
170
174
  step: Union[None, str] = None
171
175
  librelane_version: Union[None, str] = __version__
172
176
 
@@ -53,44 +53,12 @@ pdk_variables = [
53
53
  "The ground pin for the cells.",
54
54
  pdk=True,
55
55
  ),
56
- Variable(
57
- "WIRE_LENGTH_THRESHOLD",
58
- Optional[Decimal],
59
- "A value above which wire lengths generate warnings.",
60
- units="µm",
61
- pdk=True,
62
- ),
63
56
  Variable(
64
57
  "TECH_LEFS",
65
58
  Dict[str, Path],
66
59
  "Map of corner patterns to to technology LEF files. A corner not matched here will not be supported by OpenRCX in the default flow.",
67
60
  pdk=True,
68
61
  ),
69
- Variable(
70
- "GPIO_PADS_LEF",
71
- Optional[List[Path]],
72
- "Path(s) to GPIO pad LEF file(s).",
73
- pdk=True,
74
- ),
75
- Variable(
76
- "GPIO_PADS_LEF_CORE_SIDE",
77
- Optional[List[Path]],
78
- "Path(s) to GPIO pad LEF file(s) as used for routing (?).",
79
- pdk=True,
80
- ),
81
- Variable(
82
- "GPIO_PADS_VERILOG",
83
- Optional[List[Path]],
84
- "Path(s) to GPIO pad Verilog models.",
85
- pdk=True,
86
- ),
87
- Variable(
88
- "GPIO_PAD_CELLS",
89
- Optional[List[str]],
90
- "A list of pad cell name prefixes.",
91
- deprecated_names=[("GPIO_PADS_PREFIX", _prefix_to_wildcard)],
92
- pdk=True,
93
- ),
94
62
  Variable(
95
63
  "PRIMARY_GDSII_STREAMOUT_TOOL",
96
64
  str,
@@ -136,20 +104,6 @@ pdk_variables = [
136
104
  pdk=True,
137
105
  ),
138
106
  # Floorplanning
139
- Variable(
140
- "FP_TRACKS_INFO",
141
- Path,
142
- "A path to the a classic OpenROAD `.tracks` file. Used by the floorplanner to generate tracks.",
143
- deprecated_names=["TRACKS_INFO_FILE"],
144
- pdk=True,
145
- ),
146
- Variable(
147
- "FP_TAPCELL_DIST",
148
- Decimal,
149
- "The distance between tap cell columns.",
150
- units="µm",
151
- pdk=True,
152
- ),
153
107
  Variable(
154
108
  "FP_IO_HLAYER",
155
109
  str,
@@ -190,16 +144,18 @@ scl_variables = [
190
144
  pdk=True,
191
145
  ),
192
146
  Variable(
193
- "FILL_CELL",
147
+ "FILL_CELLS",
194
148
  List[str],
195
149
  "A list of cell names or wildcards of fill cells to be used in fill insertion.",
196
150
  pdk=True,
151
+ deprecated_names=["FILL_CELL"],
197
152
  ),
198
153
  Variable(
199
- "DECAP_CELL",
154
+ "DECAP_CELLS",
200
155
  List[str],
201
156
  "A list of cell names or wildcards of decap cells to be used in fill insertion.",
202
157
  pdk=True,
158
+ deprecated_names=["DECAP_CELL"],
203
159
  ),
204
160
  Variable(
205
161
  "LIB",
@@ -348,20 +304,6 @@ scl_variables = [
348
304
  "Defines a buffer port to be used by yosys during synthesis: in the format `{cell}/{input_port}/{output_port}`",
349
305
  pdk=True,
350
306
  ),
351
- Variable(
352
- "WELLTAP_CELL",
353
- str,
354
- "Defines the cell used for tap insertion.",
355
- pdk=True,
356
- deprecated_names=["FP_WELLTAP_CELL"],
357
- ),
358
- Variable(
359
- "ENDCAP_CELL",
360
- str,
361
- "Defines so-called 'end-cap' cells- decap cells placed at either sides of a design.",
362
- pdk=True,
363
- deprecated_names=["FP_ENDCAP_CELL"],
364
- ),
365
307
  # Placement
366
308
  Variable(
367
309
  "PLACE_SITE",
@@ -379,9 +321,23 @@ scl_variables = [
379
321
  Variable(
380
322
  "DIODE_CELL",
381
323
  Optional[str],
382
- "Defines a diode cell used to fix antenna violations, in the format {name}/{port}.",
324
+ "Defines a diode cell used to fix antenna violations, in the format {name}/{port}. If not defined, steps should not attempt to repair the antenna effect by inserting diode cells.",
383
325
  pdk=True,
384
326
  ),
327
+ Variable(
328
+ "WELLTAP_CELL",
329
+ Optional[str],
330
+ "Defines the cell used for tap insertion. If not defined, steps should not attempt to insert welltap cells.",
331
+ pdk=True,
332
+ deprecated_names=["FP_WELLTAP_CELL"],
333
+ ),
334
+ Variable(
335
+ "ENDCAP_CELL",
336
+ Optional[str],
337
+ "Defines the so-called 'end-cap' cell- class of decap cells placed at either sides of a design, if available.",
338
+ pdk=True,
339
+ deprecated_names=["FP_ENDCAP_CELL"],
340
+ ),
385
341
  ]
386
342
  option_variables = [
387
343
  # Common
@@ -474,17 +430,46 @@ option_variables = [
474
430
  "Specifies LIB files of pre-hardened macros used in the current design, used during timing analyses (and during parasitics-based STA as a fallback). These are loaded indiscriminately for all timing corners.",
475
431
  ),
476
432
  Variable(
477
- "EXTRA_GDS_FILES",
433
+ "EXTRA_GDS",
478
434
  Optional[List[Path]],
479
435
  "Specifies GDS files of pre-hardened macros used in the current design, used during tape-out.",
436
+ deprecated_names=["EXTRA_GDS_FILES"],
480
437
  ),
481
438
  Variable(
482
- "FALLBACK_SDC_FILE",
439
+ "FALLBACK_SDC",
483
440
  Path,
484
441
  "A fallback SDC file for when a step-specific SDC file is not defined.",
485
- deprecated_names=["BASE_SDC_FILE", "SDC_FILE"],
442
+ deprecated_names=["FALLBACK_SDC_FILE", "BASE_SDC_FILE", "SDC_FILE"],
486
443
  default=Path(os.path.join(get_script_dir(), "base.sdc")),
487
444
  ),
488
445
  ]
489
446
 
447
+ __for_whenever_we_implement_padring = [
448
+ Variable(
449
+ "GPIO_PADS_LEF",
450
+ Optional[List[Path]],
451
+ "Path(s) to GPIO pad LEF file(s).",
452
+ pdk=True,
453
+ ),
454
+ Variable(
455
+ "GPIO_PADS_LEF_CORE_SIDE",
456
+ Optional[List[Path]],
457
+ "Path(s) to GPIO pad LEF file(s) as used for routing (?).",
458
+ pdk=True,
459
+ ),
460
+ Variable(
461
+ "GPIO_PADS_VERILOG",
462
+ Optional[List[Path]],
463
+ "Path(s) to GPIO pad Verilog models.",
464
+ pdk=True,
465
+ ),
466
+ Variable(
467
+ "GPIO_PAD_CELLS",
468
+ Optional[List[str]],
469
+ "A list of pad cell name prefixes.",
470
+ deprecated_names=[("GPIO_PADS_PREFIX", _prefix_to_wildcard)],
471
+ pdk=True,
472
+ ),
473
+ ]
474
+
490
475
  flow_common_variables = pdk_variables + scl_variables + option_variables
@@ -1,4 +1,4 @@
1
- # Copyright 2023 Efabless Corporation
1
+ # Copyright 2023-2025 Efabless Corporation
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
14
14
  import os
15
15
  import re
16
16
  from glob import glob
17
- from typing import Any, List, Mapping, Dict
17
+ from typing import Any, Dict, List, Mapping
18
18
 
19
19
 
20
20
  def migrate_old_config(config: Mapping[str, Any]) -> Dict[str, Any]:
@@ -214,6 +214,83 @@ def migrate_old_config(config: Mapping[str, Any]) -> Dict[str, Any]:
214
214
  "max_ss_100C_1v60",
215
215
  "max_ff_n40C_1v95",
216
216
  ]
217
+
218
+ # Code below adapted from OpenROAD Flow Scripts under the following license:
219
+ #
220
+ # BSD 3-Clause License
221
+ #
222
+ # Copyright (c) 2018-2023, The Regents of the University of California
223
+ # All rights reserved.
224
+ #
225
+ # Redistribution and use in source and binary forms, with or without
226
+ # modification, are permitted provided that the following conditions are met:
227
+
228
+ # * Redistributions of source code must retain the above copyright notice, this
229
+ # list of conditions and the following disclaimer.
230
+ #
231
+ # * Redistributions in binary form must reproduce the above copyright notice,
232
+ # this list of conditions and the following disclaimer in the documentation
233
+ # and/or other materials provided with the distribution.
234
+ #
235
+ # * Neither the name of the copyright holder nor the names of its
236
+ # contributors may be used to endorse or promote products derived from
237
+ # this software without specific prior written permission.
238
+ #
239
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
240
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
241
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
242
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
243
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
244
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
245
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
246
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
247
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
249
+
250
+ # new["LAYERS_RC"] = {
251
+ # "*tt*": {
252
+ # "li1": {"res": 7.176e-02, "cap": 1.499e-04},
253
+ # "met1": {"res": 8.929e-04, "cap": 1.72375e-04},
254
+ # "met2": {"res": 8.929e-04, "cap": 1.36233e-04},
255
+ # "met3": {"res": 1.567e-04, "cap": 2.14962e-04},
256
+ # "met4": {"res": 1.567e-04, "cap": 1.54087e-04},
257
+ # "met5": {"res": 1.781e-05, "cap": 1.54087e-04},
258
+ # },
259
+ # "*ff*": {
260
+ # "li1": {"res": 0.050232, "cap": 0.00010493},
261
+ # "met1": {"res": 0.0006250299999999999, "cap": 0.0001206625},
262
+ # "met2": {"res": 0.0006250299999999999, "cap": 9.53631e-05},
263
+ # "met3": {
264
+ # "res": 0.00010968999999999999,
265
+ # "cap": 0.00015047339999999998,
266
+ # },
267
+ # "met4": {
268
+ # "res": 0.00010968999999999999,
269
+ # "cap": 0.00010786089999999998,
270
+ # },
271
+ # "met5": {"res": 1.2467e-05, "cap": 0.00010786089999999998},
272
+ # },
273
+ # "*ss*": {
274
+ # "li1": {"res": 0.09328800000000001, "cap": 0.00019487},
275
+ # "met1": {"res": 0.00116077, "cap": 0.00022408750000000002},
276
+ # "met2": {"res": 0.00116077, "cap": 0.0001771029},
277
+ # "met3": {"res": 0.00020370999999999999, "cap": 0.0002794506},
278
+ # "met4": {
279
+ # "res": 0.00020370999999999999,
280
+ # "cap": 0.00020031309999999998,
281
+ # },
282
+ # "met5": {"res": 2.3153e-05, "cap": 0.00020031309999999998},
283
+ # },
284
+ # }
285
+ # new["VIAS_RC"] = {
286
+ # "*": {
287
+ # "mcon": {"res": 9.249146e-3},
288
+ # "via": {"res": 4.5e-3},
289
+ # "via2": {"res": 3.368786e-3},
290
+ # "via3": {"res": 0.376635e-3},
291
+ # "via4": {"res": 0.00580e-3},
292
+ # }
293
+ # }
217
294
  elif new["PDK"].startswith("gf180mcu"):
218
295
  new["STA_CORNERS"] = [
219
296
  "nom_tt_025C_5v00",
@@ -180,7 +180,7 @@ class Expr(object):
180
180
  eval_stack.pop()
181
181
  eval_stack.pop()
182
182
 
183
- result = Decimal(0.0)
183
+ result = Decimal("0")
184
184
  if token.value == "**":
185
185
  result = number1**number2
186
186
  elif token.value == "*":
@@ -160,7 +160,7 @@ class Macro:
160
160
  self, df: DesignFormat
161
161
  ) -> Union[None, Path, List[Path], Dict[str, List[Path]]]:
162
162
  try:
163
- return getattr(self, df.value.id)
163
+ return getattr(self, df.id)
164
164
  except AttributeError:
165
165
  return None
166
166
 
@@ -593,7 +593,7 @@ class Variable:
593
593
  value=field_value,
594
594
  explicitly_specified=explicitly_specified,
595
595
  default=field_default,
596
- validating_type=subtype,
596
+ validating_type=subtype, # type: ignore
597
597
  permissive_typing=permissive_typing,
598
598
  depth=depth + 1,
599
599
  )
@@ -51,6 +51,7 @@ class Classic(SequentialFlow):
51
51
  OpenROAD.CheckMacroInstances,
52
52
  OpenROAD.STAPrePNR,
53
53
  OpenROAD.Floorplan,
54
+ OpenROAD.DumpRCValues,
54
55
  Odb.CheckMacroAntennaProperties,
55
56
  Odb.SetPowerConnections,
56
57
  Odb.ManualMacroPlacement,
@@ -48,7 +48,7 @@ from deprecated.sphinx import deprecated
48
48
  from librelane.common.types import Path
49
49
 
50
50
  from ..config import Config, Variable, universal_flow_config_variables, AnyConfigs
51
- from ..state import State, DesignFormat, DesignFormatObject
51
+ from ..state import State, DesignFormat
52
52
  from ..steps import Step, StepNotFound
53
53
  from ..logging import (
54
54
  LevelFilter,
@@ -804,14 +804,11 @@ class Flow(ABC):
804
804
  }
805
805
 
806
806
  def visitor(key, value, top_key, _, __):
807
- df = DesignFormat.by_id(top_key)
807
+ df = DesignFormat.factory.get(top_key)
808
808
  assert df is not None
809
809
  if df not in supported_formats:
810
810
  return
811
811
 
812
- dfo = df.value
813
- assert isinstance(dfo, DesignFormatObject)
814
-
815
812
  subdirectory, extension = supported_formats[df]
816
813
 
817
814
  target_dir = os.path.join(path, subdirectory)
@@ -837,7 +834,7 @@ class Flow(ABC):
837
834
  return
838
835
 
839
836
  target_basename = os.path.basename(str(value))
840
- target_basename = target_basename[: -len(dfo.extension)] + extension
837
+ target_basename = target_basename[: -len(df.extension)] + extension
841
838
  target_path = os.path.join(target_dir, target_basename)
842
839
  mkdirp(target_dir)
843
840
  shutil.copyfile(value, target_path, follow_symlinks=True)