librelane 3.1.0.dev3__tar.gz → 3.1.0.dev4__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 (179) hide show
  1. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/PKG-INFO +3 -2
  2. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/__init__.py +1 -0
  3. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/misc.py +27 -0
  4. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/toolbox.py +5 -0
  5. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/__init__.py +4 -0
  6. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/__main__.py +4 -0
  7. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/config.py +5 -1
  8. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/flow.py +1 -1
  9. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/pdk_compat.py +20 -0
  10. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/preprocessor.py +4 -0
  11. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/removals.py +4 -0
  12. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/variable.py +4 -0
  13. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/cli.py +20 -18
  14. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/synth_explore.py +1 -0
  15. librelane-3.1.0.dev4/librelane/pdk_hashes.yaml +4 -0
  16. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/check_antenna_properties.py +1 -1
  17. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/defutil.py +4 -1
  18. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/io.tcl +23 -5
  19. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/repair_design.tcl +3 -3
  20. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/repair_design_postgrt.tcl +1 -4
  21. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/pyosys/synthesize.py +36 -17
  22. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/pyosys/ys_common.py +7 -0
  23. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/klayout.py +59 -27
  24. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/openroad.py +21 -1
  25. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/pyosys.py +65 -37
  26. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/step.py +1 -1
  27. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/verilator.py +1 -1
  28. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/pyproject.toml +2 -2
  29. librelane-3.1.0.dev3/librelane/pdk_hashes.yaml +0 -3
  30. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/Readme.md +0 -0
  31. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/__init__.py +0 -0
  32. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/__main__.py +0 -0
  33. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/__version__.py +0 -0
  34. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/cli.py +0 -0
  35. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/drc.py +0 -0
  36. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/generic_dict.py +0 -0
  37. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/__init__.py +0 -0
  38. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/__main__.py +0 -0
  39. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/compare.py +0 -0
  40. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/library.py +0 -0
  41. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/metric.py +0 -0
  42. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/util.py +0 -0
  43. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/ring_buffer.py +0 -0
  44. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/tcl.py +0 -0
  45. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/tpe.py +0 -0
  46. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/types.py +0 -0
  47. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/container.py +0 -0
  48. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/env_info.py +0 -0
  49. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/hold_eco_demo/config.yaml +0 -0
  50. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/hold_eco_demo/demo.v +0 -0
  51. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/config.yaml +0 -0
  52. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/pin_order.cfg +0 -0
  53. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/src/impl.sdc +0 -0
  54. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/src/signoff.sdc +0 -0
  55. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/src/spm.v +0 -0
  56. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/verify/spm_tb.v +0 -0
  57. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  58. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  59. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  60. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
  61. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  62. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  63. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  64. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/__init__.py +0 -0
  65. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/builtins.py +0 -0
  66. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/chip.py +0 -0
  67. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/classic.py +0 -0
  68. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/flow.py +0 -0
  69. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/misc.py +0 -0
  70. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/optimizing.py +0 -0
  71. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/sequential.py +0 -0
  72. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/help/__main__.py +0 -0
  73. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/logging/__init__.py +0 -0
  74. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/logging/logger.py +0 -0
  75. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/plugins.py +0 -0
  76. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/py.typed +0 -0
  77. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/base.sdc +0 -0
  78. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/Readme.md +0 -0
  79. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/insert_cell.py +0 -0
  80. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/open_design.py +0 -0
  81. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/render.py +0 -0
  82. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/stream_out.py +0 -0
  83. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  84. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/xor.drc +0 -0
  85. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/Readme.md +0 -0
  86. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/common/read.tcl +0 -0
  87. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
  88. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/def/mag.tcl +0 -0
  89. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
  90. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/drc.tcl +0 -0
  91. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/extract_spice.tcl +0 -0
  92. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
  93. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
  94. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
  95. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
  96. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/get_bbox.tcl +0 -0
  97. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
  98. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/lef/maglef.tcl +0 -0
  99. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/lef.tcl +0 -0
  100. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/open.tcl +0 -0
  101. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/spice_rcx.tcl +0 -0
  102. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/wrapper.tcl +0 -0
  103. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/netgen/setup.tcl +0 -0
  104. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  105. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  106. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/contextualize.py +0 -0
  107. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/diodes.py +0 -0
  108. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  109. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/eco_buffer.py +0 -0
  110. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/eco_diode.py +0 -0
  111. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  112. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/io_place.py +0 -0
  113. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  114. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  115. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  116. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/lefutil.py +0 -0
  117. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/placers.py +0 -0
  118. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/power_utils.py +0 -0
  119. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/random_place.py +0 -0
  120. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/reader.py +0 -0
  121. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  122. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  123. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  124. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  125. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  126. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  127. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/dpl.tcl +0 -0
  128. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  129. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/grt.tcl +0 -0
  130. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/pad_cfg.tcl +0 -0
  131. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
  132. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/resizer.tcl +0 -0
  133. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
  134. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  135. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
  136. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
  137. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  138. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/cts.tcl +0 -0
  139. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/cut_rows.tcl +0 -0
  140. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/dpl.tcl +0 -0
  141. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/drt.tcl +0 -0
  142. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/dump_rc.tcl +0 -0
  143. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/fill.tcl +0 -0
  144. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/floorplan.tcl +0 -0
  145. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/gpl.tcl +0 -0
  146. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/grt.tcl +0 -0
  147. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/gui.tcl +0 -0
  148. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
  149. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/ioplacer.tcl +0 -0
  150. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/irdrop.tcl +0 -0
  151. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/pad.tcl +0 -0
  152. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/pdn.tcl +0 -0
  153. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/rcx.tcl +0 -0
  154. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
  155. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
  156. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
  157. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/sta/corner.tcl +0 -0
  158. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/tapcell.tcl +0 -0
  159. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/ungpl.tcl +0 -0
  160. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/write_cdl.tcl +0 -0
  161. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/write_views.tcl +0 -0
  162. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  163. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/pyosys/json_header.py +0 -0
  164. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/tclsh/hello.tcl +0 -0
  165. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/state/__init__.py +0 -0
  166. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/state/__main__.py +0 -0
  167. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/state/design_format.py +0 -0
  168. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/state/state.py +0 -0
  169. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/__init__.py +0 -0
  170. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/__main__.py +0 -0
  171. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/checker.py +0 -0
  172. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/common_variables.py +0 -0
  173. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/magic.py +0 -0
  174. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/misc.py +0 -0
  175. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/netgen.py +0 -0
  176. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/odb.py +0 -0
  177. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/openroad_alerts.py +0 -0
  178. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/tclstep.py +0 -0
  179. {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/yosys.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: librelane
3
- Version: 3.1.0.dev3
3
+ Version: 3.1.0.dev4
4
4
  Summary: An infrastructure for implementing chip design flows
5
5
  License-Expression: Apache-2.0
6
6
  Maintainer: Mohamed Gaber
@@ -12,7 +12,8 @@ Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Programming Language :: Python :: 3.14
15
- Requires-Dist: ciel (>=2.3.1,<3)
15
+ Classifier: Programming Language :: Python :: 3.15
16
+ Requires-Dist: ciel (>=3.2.0,<4)
16
17
  Requires-Dist: click (>=8,<8.4)
17
18
  Requires-Dist: cloup (>=3.0.5,<4)
18
19
  Requires-Dist: deprecated (>=1.2.10,<2)
@@ -33,6 +33,7 @@ from .misc import (
33
33
  get_librelane_root,
34
34
  get_script_dir,
35
35
  get_pdk_hash,
36
+ get_ciel_pdk_hash,
36
37
  slugify,
37
38
  protected,
38
39
  final,
@@ -40,6 +40,7 @@ from typing import (
40
40
  )
41
41
 
42
42
  import httpx
43
+ from deprecated.sphinx import deprecated
43
44
 
44
45
  from ..__version__ import __version__
45
46
  from .types import AnyPath, Path
@@ -75,6 +76,11 @@ def get_script_dir() -> str:
75
76
  )
76
77
 
77
78
 
79
+ @deprecated(
80
+ version="3.1.0",
81
+ reason="Use get_ciel_pdk_hash, this method can force an exit in some codepaths",
82
+ action="once",
83
+ )
78
84
  def get_pdk_hash(pdk_variant) -> str:
79
85
  """
80
86
  Gets the PDK version hash confirmed compatible with this version of LibreLane.
@@ -92,6 +98,27 @@ def get_pdk_hash(pdk_variant) -> str:
92
98
  exit(1)
93
99
 
94
100
 
101
+ def get_ciel_pdk_hash(pdk_variant: str) -> str:
102
+ """
103
+ Gets the PDK version hash confirmed compatible with this version of LibreLane.
104
+
105
+ Requires ciel
106
+ """
107
+ import ciel
108
+
109
+ with open(os.path.join(get_librelane_root(), "pdk_hashes.yaml"), "r") as file:
110
+ pdk_hashes = yaml.safe_load(file)
111
+
112
+ pdk_family = ciel.resolve_pdk_family(pdk_variant)
113
+
114
+ if pdk_family not in pdk_hashes:
115
+ raise ValueError(
116
+ f"LibreLane does not have a validated version for Ciel PDK family {pdk_family}."
117
+ )
118
+
119
+ return pdk_hashes[pdk_family]
120
+
121
+
95
122
  # The following code snippet has been adapted under the following license:
96
123
  #
97
124
  # Copyright (c) Django Software Foundation and individual contributors.
@@ -367,6 +367,11 @@ class Toolbox(object):
367
367
  warn(f"Failed to generate preview: {e}.")
368
368
  return None
369
369
 
370
+ @deprecated(
371
+ version="3.1.0",
372
+ reason="No longer needed by internal LibreLane steps and will be removed in LibreLane 4.0.",
373
+ action="once",
374
+ )
370
375
  def remove_cells_from_lib(
371
376
  self,
372
377
  input_lib_files: FrozenSet[str],
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane 2
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane 2
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane 2
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -815,7 +819,7 @@ class Config(GenericImmutableDict[str, Any]):
815
819
  try:
816
820
  import ciel
817
821
 
818
- pdk_root = ciel.get_ciel_home(pdk_root)
822
+ pdk_root = str(ciel.get_ciel_home(pdk_root))
819
823
  except ImportError:
820
824
  raise ValueError(
821
825
  "The pdk_root argument is required as Ciel is not installed."
@@ -1,6 +1,6 @@
1
1
  # Copyright 2025 LibreLane Contributors
2
2
  #
3
- # Adapted from OpenLane
3
+ # Adapted from OpenLane 2
4
4
  #
5
5
  # Copyright 2023 Efabless Corporation
6
6
  #
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane 2
4
+ #
1
5
  # Copyright 2023-2025 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -350,4 +354,20 @@ def migrate_old_config(config: Mapping[str, Any]) -> Dict[str, Any]:
350
354
  if "HEURISTIC_ANTENNA_THRESHOLD" not in config:
351
355
  new["HEURISTIC_ANTENNA_THRESHOLD"] = 130
352
356
 
357
+ # x7. KLAYOUT_DRC_OPTIONS to defines
358
+ if new["PDK"].startswith("sky130") and "KLAYOUT_DRC_OPTIONS" in new:
359
+ tcl_dict = new["KLAYOUT_DRC_OPTIONS"]
360
+ ws_rx = re.compile(r"\s+")
361
+ del new["KLAYOUT_DRC_OPTIONS"]
362
+ new["KLAYOUT_DRC_DEFINES"] = {}
363
+ # deliberately not checking for bad dicts or dicts that require quoting
364
+ # it's already overkill to assume people modified the PDK files here
365
+ #
366
+ # if someone complains we can parse a Tcl dict later
367
+ tcl_dict_entries = ws_rx.split(tcl_dict)
368
+ while len(tcl_dict_entries):
369
+ key = tcl_dict_entries.pop(0)
370
+ value = tcl_dict_entries.pop(0)
371
+ new["KLAYOUT_DRC_DEFINES"][key] = value
372
+
353
373
  return new
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane 2
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane 2
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane 2
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -43,7 +43,7 @@ from cloup.constraints import (
43
43
  from cloup.typing import Decorator
44
44
 
45
45
  from .flow import Flow
46
- from ..common import set_tpe, cli, get_pdk_hash, _get_process_limit
46
+ from ..common import set_tpe, cli, get_ciel_pdk_hash, _get_process_limit
47
47
  from ..logging import set_log_level, verbose, err, options, LogLevels
48
48
  from ..state import State, InvalidState
49
49
 
@@ -517,8 +517,7 @@ def cloup_flow_opts(
517
517
  import ciel
518
518
  from ciel.source import StaticWebDataSource
519
519
 
520
- opdks_rev = volare_pdk_override or get_pdk_hash(pdk)
521
- ciel_home = ciel.get_ciel_home(pdk_root)
520
+ ciel_home = str(ciel.get_ciel_home(pdk_root))
522
521
 
523
522
  include_libraries = ["default"]
524
523
  if scl is not None:
@@ -527,32 +526,35 @@ def cloup_flow_opts(
527
526
  if pad is not None:
528
527
  include_libraries.append(pad)
529
528
 
530
- pdk_family = None
531
- if family := ciel.Family.by_name.get(pdk):
532
- pdk = family.default_variant
533
- pdk_family = family.name
534
- verbose(f"Resolved PDK variant {family.default_variant}.")
535
- else:
536
- for family in ciel.Family.by_name.values():
537
- if pdk in family.variants:
538
- pdk_family = family.name
539
- break
540
-
541
- if pdk_family is None:
542
- err(f"Could not resolve the PDK '{pdk}'.")
529
+ selector = pdk
530
+
531
+ try:
532
+ pdk = ciel.resolve_pdk_variant(pdk)
533
+ if pdk != selector:
534
+ verbose(f"Resolved PDK variant {pdk}.")
535
+ except ValueError as e:
536
+ err(str(e))
537
+ err("If you're using a non-Ciel PDK, please pass --manual-pdk.")
538
+ exit(1)
539
+
540
+ try:
541
+ opdks_rev = volare_pdk_override or get_ciel_pdk_hash(pdk)
542
+ except ValueError as e:
543
+ err(str(e))
544
+ err("Please specify a PDK manually with '--manual-pdk'.")
543
545
  exit(1)
544
546
 
545
547
  try:
546
548
  version = ciel.fetch(
547
549
  ciel_home,
548
- pdk_family,
550
+ pdk, # only pull default libraries for resolved variant since we have a message saying "Resolved variant {pdk}..."
549
551
  opdks_rev,
550
552
  data_source=StaticWebDataSource(
551
553
  "https://fossi-foundation.github.io/ciel-releases"
552
554
  ),
553
555
  include_libraries=include_libraries,
554
556
  )
555
- pdk_root = version.get_dir(ciel_home)
557
+ pdk_root = str(version.get_dir(ciel_home))
556
558
  except ValueError as e:
557
559
  err(f"Failed to download PDK: {e}")
558
560
  exit(1)
@@ -79,6 +79,7 @@ class SynthesisExploration(Flow):
79
79
  options.set_condensed_mode(True)
80
80
 
81
81
  for strategy in [
82
+ "DEFAULT",
82
83
  "AREA 0",
83
84
  "AREA 1",
84
85
  "AREA 2",
@@ -0,0 +1,4 @@
1
+ sky130: 792ef67037d74c8c51811eab3ce23cf793491296
2
+ gf180mcu: 792ef67037d74c8c51811eab3ce23cf793491296
3
+ ihp-sg13: 89d42ee6d2fd9b50b86a1aada6fee6673c3e6008
4
+ freepdk45: 784b1a483a5f4de362d6f3629378de1199453f3c
@@ -65,7 +65,7 @@ def check_cells(odb_cells):
65
65
  }
66
66
  report.append(entry)
67
67
 
68
- return report
68
+ return report
69
69
 
70
70
 
71
71
  def get_top_level_cell(input_lefs, design_lef, cell_name):
@@ -562,7 +562,10 @@ def remove_obstructions(reader, input_lefs, obstructions):
562
562
  if (odb_layer, odb_bbox) == (layer, bbox):
563
563
  print(f"Removing obstruction on {layer} at {bbox} (DBU)…")
564
564
  found = True
565
- odb.dbObstruction_destroy(odb_obj)
565
+ if not odb_obj.isSystemReserved():
566
+ odb.dbObstruction_destroy(odb_obj)
567
+ else:
568
+ print("[WARNING] Obstruction is system-reserved.")
566
569
  if found:
567
570
  break
568
571
  if not found:
@@ -19,11 +19,23 @@ source $::env(_TCL_ENV_IN)
19
19
  source $::env(SCRIPTS_DIR)/openroad/common/set_global_connections.tcl
20
20
 
21
21
  namespace eval lln {
22
+ proc scene_name {scene} {
23
+ # OpenSTA >= 3.1 (commit 998806cb, 2026-06-30) bridges scenes as SWIG
24
+ # objects instead of strings. Older OpenSTA 3 bridges them as strings,
25
+ # in which case the value already is the name.
26
+ if { [sta::is_object $scene] } {
27
+ return [sta::get_property $scene name]
28
+ }
29
+ return $scene
30
+ }
22
31
  proc get_corner_names {} {
23
32
  # returns: names as a Tcl list, compatible with both OpenSTA 2 and 3
24
33
  if {[string length [namespace which sta::scenes]] != 0} {
25
- # scenes are bridged as a list of strings
26
- return [sta::scenes]
34
+ set result [list]
35
+ foreach scene [sta::scenes] {
36
+ lappend result [scene_name $scene]
37
+ }
38
+ return $result
27
39
  } else {
28
40
  # corners are not bridged as strings
29
41
  set result [list]
@@ -36,12 +48,14 @@ namespace eval lln {
36
48
  proc get_corner_dict {} {
37
49
  # returns: Tcl dictionary from corner names to whatever object is
38
50
  # interpreted as a corner for internal commands that expect corners:
39
- # - in OpenSTA 3, that's the scene's name again
51
+ # - in OpenSTA 3, that's whatever sta::find_scene returns (a name in
52
+ # OpenSTA 3.0, a Scene object since 3.1)
40
53
  # - in OpenSTA 2, that's an opaque Tcl pointer
41
54
  set result [dict create]
42
55
  if {[string length [namespace which sta::scenes]] != 0} {
43
56
  foreach scene [sta::scenes] {
44
- dict set result $scene $scene
57
+ set name [scene_name $scene]
58
+ dict set result $name [sta::find_scene $name]
45
59
  }
46
60
  } else {
47
61
  foreach corner [sta::corners] {
@@ -52,7 +66,11 @@ namespace eval lln {
52
66
  }
53
67
 
54
68
  proc set_sta_cmd_corner {corner_name} {
55
- if {[string length [namespace which sta::set_cmd_scene]] != 0} {
69
+ # sta::set_scene takes a name in every OpenSTA 3; sta::set_cmd_scene
70
+ # takes a name before 998806cb and a Scene object after.
71
+ if {[string length [namespace which sta::set_scene]] != 0} {
72
+ sta::set_scene $corner_name
73
+ } elseif {[string length [namespace which sta::set_cmd_scene]] != 0} {
56
74
  sta::set_cmd_scene $corner_name
57
75
  } else {
58
76
  set corner_object [sta::find_corner $corner_name]
@@ -49,11 +49,11 @@ lappend arg_list -verbose
49
49
  lappend arg_list -max_wire_length $::env(DESIGN_REPAIR_MAX_WIRE_LENGTH)
50
50
  lappend arg_list -slew_margin $::env(DESIGN_REPAIR_MAX_SLEW_PCT)
51
51
  lappend arg_list -cap_margin $::env(DESIGN_REPAIR_MAX_CAP_PCT)
52
- if { [info exists ::env(DESIGN_REPAIR_MAX_UTILIZATION)] } {
52
+ if { $::env(DESIGN_REPAIR_MAX_UTILIZATION) > 0 } {
53
53
  lappend arg_list -max_utilization $::env(DESIGN_REPAIR_MAX_UTILIZATION)
54
54
  }
55
- if { [info exists ::env(DESIGN_REPAIR_BUFFER_GAIN)] } {
56
- lappend arg_list -buffer_gain $::env(DESIGN_REPAIR_BUFFER_GAIN)
55
+ if { $::env(DESIGN_REPAIR_PRE_PLACEMENT) } {
56
+ lappend arg_list -pre_placement
57
57
  }
58
58
  # Repair Design
59
59
  log_cmd repair_design {*}$arg_list
@@ -36,12 +36,9 @@ lappend arg_list -verbose
36
36
  lappend arg_list -max_wire_length $::env(GRT_DESIGN_REPAIR_MAX_WIRE_LENGTH)
37
37
  lappend arg_list -slew_margin $::env(GRT_DESIGN_REPAIR_MAX_SLEW_PCT)
38
38
  lappend arg_list -cap_margin $::env(GRT_DESIGN_REPAIR_MAX_CAP_PCT)
39
- if { [info exists ::env(GRT_DESIGN_REPAIR_MAX_UTILIZATION)] } {
39
+ if { $::env(GRT_DESIGN_REPAIR_MAX_UTILIZATION) > 0 } {
40
40
  lappend arg_list -max_utilization $::env(GRT_DESIGN_REPAIR_MAX_UTILIZATION)
41
41
  }
42
- if { [info exists ::env(GRT_DESIGN_REPAIR_BUFFER_GAIN)] } {
43
- lappend arg_list -buffer_gain $::env(GRT_DESIGN_REPAIR_BUFFER_GAIN)
44
- }
45
42
  log_cmd repair_design {*}$arg_list
46
43
 
47
44
  # Re-DPL and GRT
@@ -257,6 +257,10 @@ def synthesize(
257
257
  config = json.load(open(config_in))
258
258
  extra = json.load(open(extra_in))
259
259
 
260
+ lib_dont_use_args = []
261
+ for excluded_cell in extra["excluded_cell_patterns"]:
262
+ lib_dont_use_args.extend(("-dont_use", excluded_cell))
263
+
260
264
  includes = config.get("VERILOG_INCLUDE_DIRS") or []
261
265
  defines = (
262
266
  (config.get("VERILOG_DEFINES") or [])
@@ -288,7 +292,7 @@ def synthesize(
288
292
  # https://github.com/YosysHQ/abc/blob/28d955ca97a1c4be3aed4062aec0241a734fac5d/src/map/scl/sclUtil.c#L257
289
293
  sdc_path = os.path.join(step_dir, "synthesis.abc.sdc")
290
294
  with open(sdc_path, "w") as f:
291
- print(f"set_driving_cell {config['SYNTH_DRIVING_CELL']}", file=f)
295
+ print(f"set_driving_cell {config['SYNTH_DRIVING_CELL'].split('/')[0]}", file=f)
292
296
  print(f"set_load {config['OUTPUT_CAP_LOAD']}", file=f)
293
297
 
294
298
  ys.log(f"[INFO] Using SDC file '{sdc_path}' for ABC…")
@@ -434,6 +438,7 @@ def synthesize(
434
438
  cg_min_width = config["SYNTH_CLOCKGATE_MIN_WIDTH"]
435
439
  posedge = ()
436
440
  negedge = ()
441
+ tie_lo = ()
437
442
  if posedge_raw := config["SYNTH_CLOCKGATE_POSEDGE_ICG"]:
438
443
  cell, ce, clk, gclk = posedge_raw.rsplit("/", maxsplit=4)
439
444
  posedge = ("-pos", cell, f"{ce}:{clk}:{gclk}")
@@ -444,18 +449,21 @@ def synthesize(
444
449
  ys.log(
445
450
  "[WARNING] A minimum width for clock gating is set; but no ICGs are configured."
446
451
  )
452
+ if tie_lo_raw := config["SYNTH_CLOCKGATE_TIE_LO"]:
453
+ tie_lo = ("-tie_lo", tie_lo_raw)
447
454
  d.run_pass(
448
455
  "clockgate",
449
456
  "-min_net_size",
450
457
  str(cg_min_width),
451
458
  *posedge,
452
459
  *negedge,
460
+ *tie_lo,
453
461
  )
454
462
 
455
463
  dfflibmap_args = []
456
464
  for lib in libs:
457
465
  dfflibmap_args.extend(["-liberty", lib])
458
- d.run_pass("dfflibmap", *dfflibmap_args)
466
+ d.run_pass("dfflibmap", *dfflibmap_args, *lib_dont_use_args)
459
467
 
460
468
  d.tee("stat", "-json", *lib_arguments, o=os.path.join(report_dir, "post_dff.json"))
461
469
  d.tee("stat", *lib_arguments, o=os.path.join(report_dir, "post_dff.rpt"))
@@ -465,24 +473,35 @@ def synthesize(
465
473
  def run_strategy(d):
466
474
  abc_script = config["SYNTH_ABC_STRATEGY_SCRIPT"]
467
475
  if abc_script:
468
- ys.log(f"[INFO] Using custom ABC strategy script '{abc_script}'…")
469
- else:
470
- abc_script = script_creator.generate_abc_script(
471
- step_dir,
472
- config["SYNTH_STRATEGY"],
473
- )
474
- ys.log(f"[INFO] Using generated ABC strategy script '{abc_script}'…")
475
-
476
- d.run_pass(
477
- "abc",
478
- "-script",
479
- abc_script,
476
+ ys.log(f"[INFO] Using custom ABC strategy script '{abc_script}'…\n")
477
+ elif config["SYNTH_STRATEGY"] != "DEFAULT":
478
+ if config["SYNTH_ABC_NEW"]:
479
+ ys.log(
480
+ "[WARN] Using Yosys-provided synthesis strategy for experimental abc_new pass: use SYNTH_ABC_STRATEGY_SCRIPT to provide your own synthesis scripts."
481
+ )
482
+ else:
483
+ abc_script = script_creator.generate_abc_script(
484
+ step_dir,
485
+ config["SYNTH_STRATEGY"],
486
+ )
487
+ ys.log(f"[INFO] Using generated ABC strategy script '{abc_script}'…\n")
488
+ ys.log_flush()
489
+
490
+ extra_args = ["-script", abc_script] * bool(abc_script)
491
+ if not config["SYNTH_ABC_NEW"]:
492
+ extra_args += ["-showtmp"]
493
+ if config["SYNTH_ABC_DFF"]:
494
+ extra_args += ["-dff"]
495
+
496
+ abc_pass = [
497
+ "abc_new" if config["SYNTH_ABC_NEW"] else "abc",
480
498
  "-constr",
481
499
  sdc_path,
482
- "-showtmp",
483
500
  *lib_arguments,
484
- *(["-dff"] if config["SYNTH_ABC_DFF"] else []),
485
- )
501
+ *extra_args,
502
+ *lib_dont_use_args,
503
+ ]
504
+ d.run_pass(*abc_pass)
486
505
 
487
506
  if value := config.get("SYNTH_TIE_UNDEFINED"):
488
507
  flag = "-zero" if value == "low" else "-one"
@@ -18,6 +18,7 @@
18
18
  import os
19
19
  import re
20
20
  import sys
21
+ import shlex
21
22
  from typing import Iterable, List, Optional, Tuple, Union
22
23
 
23
24
  try:
@@ -64,6 +65,9 @@ def yosys_version_at_least(*target: Tuple[int, ...]) -> Tuple[int, int]:
64
65
 
65
66
 
66
67
  def _Design_run_pass(self, *command):
68
+ if pass_dump := os.getenv("_LIBRELANE_YOSYS_DUMP_PASSES_TO"):
69
+ with open(pass_dump, "a+", encoding="utf8") as f:
70
+ print(shlex.join(command), file=f)
67
71
  ys.Pass.call(self, command)
68
72
 
69
73
 
@@ -151,6 +155,8 @@ def _Design_add_blackbox_models(
151
155
  "-sv",
152
156
  "-setattr",
153
157
  "keep_hierarchy",
158
+ "-setattr",
159
+ "blackbox",
154
160
  "-lib",
155
161
  *include_args,
156
162
  *define_args,
@@ -165,6 +171,7 @@ def _Design_add_blackbox_models(
165
171
  "blackbox",
166
172
  "-setattr",
167
173
  "keep_hierarchy",
174
+ "-unit_delay",
168
175
  model,
169
176
  )
170
177
  else: