librelane 3.1.0.dev1__tar.gz → 3.1.0.dev2__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 (178) hide show
  1. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/PKG-INFO +1 -1
  2. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/config/config.py +9 -4
  3. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/config/flow.py +6 -0
  4. librelane-3.1.0.dev2/librelane/pdk_hashes.yaml +3 -0
  5. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/def/antenna_check.tcl +3 -0
  6. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/def/mag.tcl +4 -1
  7. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/def/mag_gds.tcl +1 -0
  8. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/drc.tcl +1 -0
  9. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/extract_spice.tcl +3 -0
  10. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/gds/drc_batch.tcl +3 -0
  11. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/gds/erase_box.tcl +4 -0
  12. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/gds/extras_mag.tcl +2 -0
  13. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/gds/mag_with_pointers.tcl +2 -0
  14. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/get_bbox.tcl +4 -0
  15. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/lef/extras_maglef.tcl +2 -0
  16. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/lef/maglef.tcl +2 -0
  17. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/lef.tcl +3 -0
  18. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/spice_rcx.tcl +4 -0
  19. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/power_utils.py +9 -2
  20. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/io.tcl +5 -1
  21. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/pad_cfg.tcl +25 -11
  22. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/repair_design.tcl +5 -2
  23. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/pyosys/json_header.py +5 -0
  24. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/pyosys/synthesize.py +15 -6
  25. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/common_variables.py +1 -1
  26. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/klayout.py +12 -9
  27. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/openroad.py +13 -0
  28. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/verilator.py +15 -1
  29. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/pyproject.toml +1 -1
  30. librelane-3.1.0.dev1/librelane/pdk_hashes.yaml +0 -3
  31. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/Readme.md +0 -0
  32. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/__init__.py +0 -0
  33. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/__main__.py +0 -0
  34. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/__version__.py +0 -0
  35. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/__init__.py +0 -0
  36. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/cli.py +0 -0
  37. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/drc.py +0 -0
  38. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/generic_dict.py +0 -0
  39. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/metrics/__init__.py +0 -0
  40. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/metrics/__main__.py +0 -0
  41. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/metrics/library.py +0 -0
  42. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/metrics/metric.py +0 -0
  43. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/metrics/util.py +0 -0
  44. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/misc.py +0 -0
  45. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/ring_buffer.py +0 -0
  46. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/tcl.py +0 -0
  47. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/toolbox.py +0 -0
  48. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/tpe.py +0 -0
  49. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/common/types.py +0 -0
  50. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/config/__init__.py +0 -0
  51. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/config/__main__.py +0 -0
  52. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/config/pdk_compat.py +0 -0
  53. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/config/preprocessor.py +0 -0
  54. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/config/removals.py +0 -0
  55. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/config/variable.py +0 -0
  56. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/container.py +0 -0
  57. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/env_info.py +0 -0
  58. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/hold_eco_demo/config.yaml +0 -0
  59. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/hold_eco_demo/demo.v +0 -0
  60. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm/config.yaml +0 -0
  61. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm/pin_order.cfg +0 -0
  62. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm/src/impl.sdc +0 -0
  63. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm/src/signoff.sdc +0 -0
  64. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm/src/spm.v +0 -0
  65. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm/verify/spm_tb.v +0 -0
  66. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  67. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  68. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  69. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
  70. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  71. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  72. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  73. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/__init__.py +0 -0
  74. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/builtins.py +0 -0
  75. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/chip.py +0 -0
  76. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/classic.py +0 -0
  77. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/cli.py +0 -0
  78. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/flow.py +0 -0
  79. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/misc.py +0 -0
  80. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/optimizing.py +0 -0
  81. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/sequential.py +0 -0
  82. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/flows/synth_explore.py +0 -0
  83. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/help/__main__.py +0 -0
  84. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/logging/__init__.py +0 -0
  85. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/logging/logger.py +0 -0
  86. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/plugins.py +0 -0
  87. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/py.typed +0 -0
  88. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/base.sdc +0 -0
  89. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/klayout/Readme.md +0 -0
  90. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/klayout/insert_cell.py +0 -0
  91. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/klayout/open_design.py +0 -0
  92. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/klayout/render.py +0 -0
  93. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/klayout/stream_out.py +0 -0
  94. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  95. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/klayout/xor.drc +0 -0
  96. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/Readme.md +0 -0
  97. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/common/read.tcl +0 -0
  98. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/open.tcl +0 -0
  99. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/magic/wrapper.tcl +0 -0
  100. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/netgen/setup.tcl +0 -0
  101. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  102. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  103. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
  104. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/contextualize.py +0 -0
  105. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/defutil.py +0 -0
  106. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/diodes.py +0 -0
  107. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  108. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/eco_buffer.py +0 -0
  109. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/eco_diode.py +0 -0
  110. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  111. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/io_place.py +0 -0
  112. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  113. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  114. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  115. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/lefutil.py +0 -0
  116. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/placers.py +0 -0
  117. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/random_place.py +0 -0
  118. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/reader.py +0 -0
  119. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  120. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  121. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  122. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  123. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  124. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  125. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/dpl.tcl +0 -0
  126. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  127. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/grt.tcl +0 -0
  128. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
  129. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/resizer.tcl +0 -0
  130. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
  131. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  132. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
  133. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
  134. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  135. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/cts.tcl +0 -0
  136. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/cut_rows.tcl +0 -0
  137. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/dpl.tcl +0 -0
  138. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/drt.tcl +0 -0
  139. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/dump_rc.tcl +0 -0
  140. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/fill.tcl +0 -0
  141. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/floorplan.tcl +0 -0
  142. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/gpl.tcl +0 -0
  143. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/grt.tcl +0 -0
  144. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/gui.tcl +0 -0
  145. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
  146. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/ioplacer.tcl +0 -0
  147. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/irdrop.tcl +0 -0
  148. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/pad.tcl +0 -0
  149. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/pdn.tcl +0 -0
  150. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/rcx.tcl +0 -0
  151. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
  152. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
  153. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
  154. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
  155. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/sta/corner.tcl +0 -0
  156. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/tapcell.tcl +0 -0
  157. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/ungpl.tcl +0 -0
  158. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/write_cdl.tcl +0 -0
  159. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/openroad/write_views.tcl +0 -0
  160. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  161. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/pyosys/ys_common.py +0 -0
  162. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/scripts/tclsh/hello.tcl +0 -0
  163. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/state/__init__.py +0 -0
  164. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/state/__main__.py +0 -0
  165. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/state/design_format.py +0 -0
  166. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/state/state.py +0 -0
  167. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/__init__.py +0 -0
  168. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/__main__.py +0 -0
  169. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/checker.py +0 -0
  170. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/magic.py +0 -0
  171. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/misc.py +0 -0
  172. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/netgen.py +0 -0
  173. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/odb.py +0 -0
  174. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/openroad_alerts.py +0 -0
  175. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/pyosys.py +0 -0
  176. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/step.py +0 -0
  177. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/librelane/steps/tclstep.py +0 -0
  178. {librelane-3.1.0.dev1 → librelane-3.1.0.dev2}/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.dev1
3
+ Version: 3.1.0.dev2
4
4
  Summary: An infrastructure for implementing chip design flows
5
5
  License-Expression: Apache-2.0
6
6
  Maintainer: Mohamed Gaber
@@ -495,10 +495,10 @@ class Config(GenericImmutableDict[str, Any]):
495
495
  :param pdk: A process design kit to use. Required unless specified via the
496
496
  "PDK" key in a configuration object.
497
497
 
498
- :param pdk_root: Required if Volare is not installed.
498
+ :param pdk_root: Required if Ciel is not installed.
499
499
 
500
- If Volare is installed, this value can be used to optionally override
501
- Volare's default.
500
+ If Ciel is installed, this value can be used to optionally override
501
+ Ciel's default.
502
502
 
503
503
  :param scl: A standard cell library to use. If not specified, the PDK's
504
504
  default standard cell library will be used instead.
@@ -713,7 +713,7 @@ class Config(GenericImmutableDict[str, Any]):
713
713
  pdk=pdk,
714
714
  pdkpath=pdkpath,
715
715
  scl=mutable[SpecialKeys.scl],
716
- pad=mutable.get(SpecialKeys.pad, None),
716
+ pad=mutable.get(SpecialKeys.pad, pad),
717
717
  design_dir=design_dir,
718
718
  )
719
719
  )
@@ -833,6 +833,11 @@ class Config(GenericImmutableDict[str, Any]):
833
833
  if scl is not None:
834
834
  pdk_config[SpecialKeys.scl] = scl
835
835
 
836
+ # HACK: Prevent loading default SCL cfg vars for old openlane PDK
837
+ # configs
838
+ # For more info: https://github.com/librelane/librelane/issues/932
839
+ pdk_config["STD_CELL_LIBRARY_OPT"] = scl
840
+
836
841
  if pad is not None:
837
842
  pdk_config[SpecialKeys.pad] = pad
838
843
 
@@ -39,6 +39,12 @@ pdk_variables = [
39
39
  "Specifies the default standard cell library to be used under the specified PDK. Must be a valid C identifier, i.e., matches the regular expression `[_a-zA-Z][_a-zA-Z0-9]+`.",
40
40
  pdk=True,
41
41
  ),
42
+ Variable(
43
+ "PAD_CELL_LIBRARY",
44
+ Optional[str],
45
+ "Specifies the default pad cell library to be used under the specified PDK. Must be a valid C identifier, i.e., matches the regular expression `[_a-zA-Z][_a-zA-Z0-9]+`.",
46
+ pdk=True,
47
+ ),
42
48
  Variable(
43
49
  "VDD_PIN",
44
50
  str,
@@ -0,0 +1,3 @@
1
+ sky130: 74c0e6b118a67d94c24172143d3bd597473fa63d
2
+ gf180mcu: b344c97eacc2aaf8e14ae7e43e2e9dc0871de2c0
3
+ ihp-sg13g2: c4b8b4e5e7a05f375cca3815d51b3a37721fbf5c
@@ -12,6 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  source $::env(SCRIPTS_DIR)/magic/def/read.tcl
15
+ drc off
16
+ crashbackups disable
17
+ locking disable
15
18
 
16
19
  load $::env(DESIGN_NAME) -dereference
17
20
 
@@ -13,7 +13,10 @@
13
13
  # limitations under the License.
14
14
 
15
15
  source $::env(SCRIPTS_DIR)/magic/def/read.tcl
16
+ drc off
17
+ crashbackups disable
18
+ locking disable
16
19
 
17
20
  save $::env(SAVE_MAG)
18
21
 
19
- puts "[INFO] Done exporting $::env(SAVE_MAG)."
22
+ puts "[INFO] Done exporting $::env(SAVE_MAG)."
@@ -18,6 +18,7 @@
18
18
  source $::env(SCRIPTS_DIR)/magic/common/read.tcl
19
19
  drc off
20
20
  crashbackups disable
21
+ locking disable
21
22
 
22
23
  gds noduplicates true
23
24
  gds readonly true
@@ -17,6 +17,7 @@
17
17
  # limitations under the License.
18
18
 
19
19
  crashbackups disable
20
+ locking disable
20
21
  units internal
21
22
 
22
23
  # Read in maglef views in order to blackbox cells
@@ -20,6 +20,9 @@ puts $f [expr {((round([magic::cif scale output] * 10000)) / 10000.0) * 1}]
20
20
  close $f
21
21
 
22
22
  source $::env(SCRIPTS_DIR)/magic/common/read.tcl
23
+ drc off
24
+ crashbackups disable
25
+ locking disable
23
26
 
24
27
  if { $::env(MAGIC_EXT_USE_GDS) } {
25
28
  gds read $::env(CURRENT_GDS)
@@ -12,6 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ crashbackups disable
16
+ locking disable
17
+
15
18
  if { [info exists ::env(TECH)] } {
16
19
  tech load $::env(TECH)
17
20
  }
@@ -12,6 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ drc off
16
+ crashbackups disable
17
+ locking disable
18
+
15
19
  tech unlock *
16
20
 
17
21
  gds read $::env(CURRENT_GDS)
@@ -17,6 +17,8 @@
17
17
  # corresponding maglefs
18
18
 
19
19
  drc off
20
+ crashbackups disable
21
+ locking disable
20
22
 
21
23
  gds readonly true
22
24
  gds rescale false
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  drc off
16
+ crashbackups disable
17
+ locking disable
16
18
 
17
19
  gds readonly true
18
20
  gds rescale false
@@ -1,3 +1,7 @@
1
+ drc off
2
+ crashbackups disable
3
+ locking disable
4
+
1
5
  gds read $::env(_GDS_IN)
2
6
  load $::env(_MACRO_NAME_IN)
3
7
  set curunits [units]
@@ -15,6 +15,8 @@
15
15
  # convert all external macros to maglef views with GDS_* pointers
16
16
 
17
17
  drc off
18
+ crashbackups disable
19
+ locking disable
18
20
 
19
21
  if { [info exist ::env(EXTRA_LEFS)] } {
20
22
  foreach lef_file $::env(EXTRA_LEFS) {
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  drc off
16
+ crashbackups disable
17
+ locking disable
16
18
 
17
19
  lef read $::env(signoff_results)/$::env(DESIGN_NAME).lef
18
20
 
@@ -16,6 +16,9 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
  drc off
19
+ crashbackups disable
20
+ locking disable
21
+
19
22
  if { $::env(MAGIC_LEF_WRITE_USE_GDS) } {
20
23
  gds read $::env(CURRENT_GDS)
21
24
  } else {
@@ -16,6 +16,10 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
 
19
+ drc off
20
+ crashbackups disable
21
+ locking disable
22
+
19
23
  # we do always want to read the GDS for this
20
24
  gds read $::env(CURRENT_GDS)
21
25
 
@@ -52,8 +52,15 @@ class Design(object):
52
52
  netname_by_bit = {}
53
53
 
54
54
  for netname, info in yosys_design_object["netnames"].items():
55
- for bit in info["bits"]:
56
- netname_by_bit[bit] = netname
55
+ assert len(info["bits"]) > 0
56
+ # Single bit net, return name directly
57
+ if len(info["bits"]) == 1:
58
+ netname_by_bit[info["bits"][0]] = netname
59
+ # Append bit index to signal name
60
+ else:
61
+ offset = info.get("offset", 0)
62
+ for index, bit in enumerate(info["bits"]):
63
+ netname_by_bit[bit] = f"{netname}[{offset + index}]"
57
64
 
58
65
  self.verilog_net_names_by_bit_by_module[top_module] = netname_by_bit
59
66
  return self.verilog_net_names_by_bit_by_module[top_module][target_bit]
@@ -588,7 +588,11 @@ proc write_libs {} {
588
588
  foreach corner_name [lln::get_corner_names] {
589
589
  set target $::env(_LIB_SAVE_DIR)/$::env(DESIGN_NAME)__$corner_name.lib
590
590
  puts "Writing timing models for the $corner_name corner to $target…"
591
- write_timing_model -corner $corner_name $target
591
+ if {[string length [namespace which sta::scenes]] != 0} {
592
+ write_timing_model -scene $corner_name $target
593
+ } else {
594
+ write_timing_model -corner $corner_name $target
595
+ }
592
596
  }
593
597
  }
594
598
  }
@@ -20,6 +20,11 @@ puts "\[INFO\] Generating padring…"
20
20
  set block [ord::get_db_block]
21
21
  set units [$block getDefUnits]
22
22
 
23
+ # Round a micrometer value to nanometer
24
+ proc round_um_nm {value} {
25
+ return [expr double(round($value * 1000)) / 1000]
26
+ }
27
+
23
28
  # Pad Placement Algorithm
24
29
  #
25
30
  # For all sides:
@@ -128,15 +133,15 @@ foreach side $sides {
128
133
 
129
134
  set space_between_pads [expr $space_for_fill / ([llength $::env($side)] + 1)]
130
135
  puts "space_between_pads: $space_between_pads"
131
-
132
- # Round to minimum site width (min. filler)
133
- set space_between_pads_min_filler [expr round(floor($space_between_pads / $pad_site_width) * $pad_site_width * 1000) / 1000]
134
- puts "space_between_pads_min_filler: $space_between_pads_min_filler"
136
+
137
+ # Round to PAD_SPACING_MULTIPLE
138
+ set space_between_pads_multiple [round_um_nm [expr floor($space_between_pads / $::env(PAD_SPACING_MULTIPLE)) * $::env(PAD_SPACING_MULTIPLE)]]
139
+ puts "space_between_pads_multiple: $space_between_pads_multiple"
135
140
 
136
141
  # The spacing for the pads on the side (the remaining space)
137
- set space_side [expr round(($space_for_fill - $space_between_pads_min_filler * ([llength $::env($side)] - 1)) / 2 * 1000) / 1000]
142
+ set space_side [round_um_nm [expr ($space_for_fill - $space_between_pads_multiple * ([llength $::env($side)] - 1)) / 2]]
138
143
 
139
- if { $space_side != round(floor($space_side / $pad_site_width) * $pad_site_width * 1000) / 1000 } {
144
+ if { $space_side != [round_um_nm [expr floor($space_side / $pad_site_width) * $pad_site_width]] } {
140
145
  puts "\[Error\] The remaining area for the pads on the side ($space_side) is not divisible by the minimum site width (minimum filler: $pad_site_width)."
141
146
  exit 1
142
147
  }
@@ -166,7 +171,7 @@ foreach side $sides {
166
171
  place_pad -row [dict get $row_names $side] -location $cur_pos $inst_name -master $master_name
167
172
 
168
173
  # Increment current position
169
- set cur_pos [expr $cur_pos + $space_between_pads_min_filler + $width]
174
+ set cur_pos [expr $cur_pos + $space_between_pads_multiple + $width]
170
175
  }
171
176
  }
172
177
 
@@ -178,10 +183,18 @@ place_corners $::env(PAD_CORNER)
178
183
  puts "\[INFO\] Placing filler cells…"
179
184
 
180
185
  # Place filler cells
181
- place_io_fill -row IO_NORTH {*}$::env(PAD_FILLERS)
182
- place_io_fill -row IO_SOUTH {*}$::env(PAD_FILLERS)
183
- place_io_fill -row IO_WEST {*}$::env(PAD_FILLERS)
184
- place_io_fill -row IO_EAST {*}$::env(PAD_FILLERS)
186
+ if {!$::env(PAD_TRIM_ROWS) || ($::env(PAD_NORTH) ne "")} { place_io_fill -row IO_NORTH {*}$::env(PAD_FILLERS) }
187
+ if {!$::env(PAD_TRIM_ROWS) || ($::env(PAD_SOUTH) ne "")} { place_io_fill -row IO_SOUTH {*}$::env(PAD_FILLERS) }
188
+ if {!$::env(PAD_TRIM_ROWS) || ($::env(PAD_WEST) ne "")} { place_io_fill -row IO_WEST {*}$::env(PAD_FILLERS) }
189
+ if {!$::env(PAD_TRIM_ROWS) || ($::env(PAD_EAST) ne "")} { place_io_fill -row IO_EAST {*}$::env(PAD_FILLERS) }
190
+
191
+ puts "\[INFO\] Deleting corner cells (if required)…"
192
+
193
+ # Delete corner cells if required
194
+ if {$::env(PAD_TRIM_ROWS) && ($::env(PAD_NORTH) eq "") && ($::env(PAD_WEST) eq "")} { odb::dbInst_destroy [$block findInst IO_CORNER_NORTH_WEST_INST] }
195
+ if {$::env(PAD_TRIM_ROWS) && ($::env(PAD_NORTH) eq "") && ($::env(PAD_EAST) eq "")} { odb::dbInst_destroy [$block findInst IO_CORNER_NORTH_EAST_INST] }
196
+ if {$::env(PAD_TRIM_ROWS) && ($::env(PAD_SOUTH) eq "") && ($::env(PAD_WEST) eq "")} { odb::dbInst_destroy [$block findInst IO_CORNER_SOUTH_WEST_INST] }
197
+ if {$::env(PAD_TRIM_ROWS) && ($::env(PAD_SOUTH) eq "") && ($::env(PAD_EAST) eq "")} { odb::dbInst_destroy [$block findInst IO_CORNER_SOUTH_EAST_INST] }
185
198
 
186
199
  puts "\[INFO\] Connecting ring signals…"
187
200
 
@@ -246,3 +259,4 @@ if { [info exists ::env(PAD_PLACE_IO_TERMINALS)] } {
246
259
  # Remove io rows to avoid causing confusion with the other tools
247
260
  puts "\[INFO\] Removing I/O rows…"
248
261
  remove_io_rows
262
+
@@ -33,12 +33,15 @@ if { $::env(DESIGN_REPAIR_REMOVE_BUFFERS) } {
33
33
  remove_buffers
34
34
  }
35
35
 
36
+ # Use SYNTH_BUFFER_CELL as buffer, since OpenROAD may select a hold/delay buffer
37
+ # See: https://github.com/librelane/librelane/pull/961
38
+
36
39
  if { $::env(DESIGN_REPAIR_BUFFER_INPUT_PORTS) } {
37
- buffer_ports -inputs
40
+ buffer_ports -inputs -buffer_cell [lindex [split $::env(SYNTH_BUFFER_CELL) "/"] 0]
38
41
  }
39
42
 
40
43
  if { $::env(DESIGN_REPAIR_BUFFER_OUTPUT_PORTS) } {
41
- buffer_ports -outputs
44
+ buffer_ports -outputs -buffer_cell [lindex [split $::env(SYNTH_BUFFER_CELL) "/"] 0]
42
45
  }
43
46
 
44
47
  set arg_list [list]
@@ -43,6 +43,11 @@ def json_header(
43
43
  "__librelane__",
44
44
  "__pnr__",
45
45
  ]
46
+ + (
47
+ [f"PAD_{config['PAD_CELL_LIBRARY']}"]
48
+ if "PAD_CELL_LIBRARY" in config
49
+ else []
50
+ )
46
51
  + (
47
52
  []
48
53
  if config.get("VERILOG_POWER_DEFINE") is None
@@ -157,6 +157,7 @@ def librelane_synth(
157
157
  ):
158
158
 
159
159
  d.run_pass("hierarchy", "-check", "-top", top, "-nokeep_prints", "-nokeep_asserts")
160
+ d.run_pass("chformal", "-remove")
160
161
  librelane_proc(d, report_dir)
161
162
 
162
163
  if keep_hierarchy_min_cost:
@@ -251,12 +252,20 @@ def synthesize(
251
252
  extra = json.load(open(extra_in))
252
253
 
253
254
  includes = config.get("VERILOG_INCLUDE_DIRS") or []
254
- defines = (config.get("VERILOG_DEFINES") or []) + [
255
- f"PDK_{config['PDK'].replace('-','_')}",
256
- f"SCL_{config['STD_CELL_LIBRARY']}",
257
- "__librelane__",
258
- "__pnr__",
259
- ]
255
+ defines = (
256
+ (config.get("VERILOG_DEFINES") or [])
257
+ + [
258
+ f"PDK_{config['PDK'].replace('-','_')}",
259
+ f"SCL_{config['STD_CELL_LIBRARY']}",
260
+ "__librelane__",
261
+ "__pnr__",
262
+ ]
263
+ + (
264
+ [f"PAD_{config['PAD_CELL_LIBRARY']}"]
265
+ if "PAD_CELL_LIBRARY" in config
266
+ else []
267
+ )
268
+ )
260
269
 
261
270
  blackbox_models = extra["blackbox_models"]
262
271
  libs = extra["libs_synth"]
@@ -286,7 +286,7 @@ pdn_variables = [
286
286
  Variable(
287
287
  "PDN_RAIL_WIDTH",
288
288
  Decimal,
289
- "Defines the width of PDN rails on the `FP_PDN_RAILS_LAYER` layer.",
289
+ "Defines the width of PDN rails on the `PDN_RAIL_LAYER` layer.",
290
290
  units="µm",
291
291
  pdk=True,
292
292
  deprecated_names=["FP_PDN_RAIL_WIDTH"],
@@ -171,7 +171,7 @@ class Render(KLayoutStep):
171
171
  id = "KLayout.Render"
172
172
  name = "Render Image (w/ KLayout)"
173
173
 
174
- inputs = [DesignFormat.DEF]
174
+ inputs = []
175
175
  outputs = []
176
176
 
177
177
  config_vars = KLayoutStep.config_vars + [
@@ -216,10 +216,14 @@ class Render(KLayoutStep):
216
216
  def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
217
217
  views_updates: ViewsUpdate = {}
218
218
 
219
- input_view = state_in[DesignFormat.DEF]
219
+ input_view = state_in.get(DesignFormat.DEF)
220
+
220
221
  if gds := state_in.get(DesignFormat.GDS):
221
222
  input_view = gds
222
223
 
224
+ if input_view is None:
225
+ raise StepError(f"{id} requires at least one of LEF or GDS as input.")
226
+
223
227
  assert isinstance(input_view, Path)
224
228
 
225
229
  klayout_render = os.path.join(
@@ -434,7 +438,7 @@ class DRC(KLayoutStep):
434
438
  Unlike most steps, the KLayout scripts vary quite wildly by PDK. If a PDK
435
439
  is not supported by this step, it will simply be skipped.
436
440
 
437
- Currently, only sky130A and sky130B are supported.
441
+ Currently, sky130, gf180mcu and ihp-sg13 are supported.
438
442
  """
439
443
 
440
444
  id = "KLayout.DRC"
@@ -455,7 +459,7 @@ class DRC(KLayoutStep):
455
459
  ),
456
460
  Variable(
457
461
  "KLAYOUT_DRC_OPTIONS",
458
- Optional[Dict[str, Union[bool, int, str]]],
462
+ Optional[Dict[str, Union[int, bool, str]]],
459
463
  "Options passed directly to the KLayout DRC runset. They vary from one PDK to another.",
460
464
  pdk=True,
461
465
  ),
@@ -513,9 +517,6 @@ class DRC(KLayoutStep):
513
517
  if threads != "1":
514
518
  opts.extend(
515
519
  [
516
- "-rd",
517
- f"thr={threads}",
518
- # Use "threads" if possible
519
520
  "-rd",
520
521
  f"threads={threads}",
521
522
  ]
@@ -602,6 +603,8 @@ class DRC(KLayoutStep):
602
603
  "-rd",
603
604
  f"seal={seal}",
604
605
  "-rd",
606
+ f"thr={threads}",
607
+ "-rd",
605
608
  f"threads={threads}",
606
609
  ],
607
610
  env=env,
@@ -658,7 +661,7 @@ class DRC(KLayoutStep):
658
661
  opts.extend(
659
662
  [
660
663
  "-rd",
661
- f"thr={threads}",
664
+ f"threads={threads}",
662
665
  ]
663
666
  )
664
667
 
@@ -727,7 +730,7 @@ class DRC(KLayoutStep):
727
730
  opts.extend(
728
731
  [
729
732
  "-rd",
730
- f"thr={threads}",
733
+ f"threads={threads}",
731
734
  ]
732
735
  )
733
736
 
@@ -1267,6 +1267,19 @@ class PadRing(OpenROADStep):
1267
1267
  Optional[List[str]],
1268
1268
  "The pad instance names for the west pad row.",
1269
1269
  ),
1270
+ Variable(
1271
+ "PAD_SPACING_MULTIPLE",
1272
+ Decimal,
1273
+ "The spacing between the pad cells will be a multiple of this value. Please ensure that the remaining space on the sides is divisible by the minimum site width.",
1274
+ default=1,
1275
+ units="µm",
1276
+ ),
1277
+ Variable(
1278
+ "PAD_TRIM_ROWS",
1279
+ bool,
1280
+ "If any of `PAD_[SOUTH|EAST|NORTH|WEST]` is empty, skip io fill for those rows and delete the corners with two neighbouring empty rows.",
1281
+ default=False,
1282
+ ),
1270
1283
  ]
1271
1284
 
1272
1285
  def get_script_path(self):
@@ -77,6 +77,12 @@ class Lint(Step):
77
77
  "When a latch is inferred by an `always` block that is not explicitly marked as `always_latch`, report this as a linter error.",
78
78
  default=True,
79
79
  ),
80
+ Variable(
81
+ "LINTER_ERROR_ON_MULTIDRIVEN",
82
+ bool,
83
+ "When a net has multiple drivers, report this as a linter error.",
84
+ default=True,
85
+ ),
80
86
  Variable(
81
87
  "VERILOG_DEFINES",
82
88
  Optional[List[str]],
@@ -162,7 +168,11 @@ class Lint(Step):
162
168
  f"SCL_{self.config['STD_CELL_LIBRARY']}",
163
169
  "__librelane__",
164
170
  "__pnr__",
165
- ]
171
+ ] + (
172
+ [f"PAD_{self.config['PAD_CELL_LIBRARY']}"]
173
+ if "PAD_CELL_LIBRARY" in self.config
174
+ else []
175
+ )
166
176
  if verilog_power_define := self.config.get("VERILOG_POWER_DEFINE"):
167
177
  defines += [verilog_power_define]
168
178
 
@@ -197,6 +207,10 @@ class Lint(Step):
197
207
  if self.config["LINTER_ERROR_ON_LATCH"]:
198
208
  extra_args.append("--Werror-LATCH")
199
209
 
210
+ # It's more user-friendly to catch multiple-driver conflicts here in Verilator (if possible) than later in Yosys.
211
+ if self.config["LINTER_ERROR_ON_MULTIDRIVEN"]:
212
+ extra_args.append("--Werror-MULTIDRIVEN")
213
+
200
214
  if include_dirs := self.config["VERILOG_INCLUDE_DIRS"]:
201
215
  extra_args.extend([f"-I{dir}" for dir in include_dirs])
202
216
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "librelane"
3
- version = "3.1.0.dev1"
3
+ version = "3.1.0.dev2"
4
4
  description = "An infrastructure for implementing chip design flows"
5
5
  maintainers = [
6
6
  {name = "Mohamed Gaber", email = "donn@fossi-foundation.org"},
@@ -1,3 +0,0 @@
1
- sky130: d815bb30c9afdf9e264c276a8a2b533108dea3d0
2
- gf180mcu: d815bb30c9afdf9e264c276a8a2b533108dea3d0
3
- ihp-sg13g2: c4b8b4e5e7a05f375cca3815d51b3a37721fbf5c
File without changes