librelane 3.0.3__tar.gz → 3.1.0.dev1__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.0.3 → librelane-3.1.0.dev1}/PKG-INFO +1 -1
  2. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/toolbox.py +7 -1
  3. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/config/config.py +0 -5
  4. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/config/flow.py +34 -11
  5. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/config/pdk_compat.py +3 -3
  6. librelane-3.1.0.dev1/librelane/pdk_hashes.yaml +3 -0
  7. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/common/read.tcl +24 -45
  8. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/drc.tcl +4 -0
  9. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/io.tcl +1 -19
  10. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/pad_cfg.tcl +5 -2
  11. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/pdn_cfg.tcl +1 -0
  12. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/common_variables.py +7 -1
  13. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/odb.py +2 -1
  14. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/openroad.py +4 -2
  15. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/pyosys.py +8 -3
  16. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/verilator.py +0 -10
  17. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/yosys.py +5 -4
  18. {librelane-3.0.3 → librelane-3.1.0.dev1}/pyproject.toml +1 -1
  19. librelane-3.0.3/librelane/pdk_hashes.yaml +0 -3
  20. {librelane-3.0.3 → librelane-3.1.0.dev1}/Readme.md +0 -0
  21. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/__init__.py +0 -0
  22. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/__main__.py +0 -0
  23. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/__version__.py +0 -0
  24. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/__init__.py +0 -0
  25. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/cli.py +0 -0
  26. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/drc.py +0 -0
  27. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/generic_dict.py +0 -0
  28. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/metrics/__init__.py +0 -0
  29. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/metrics/__main__.py +0 -0
  30. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/metrics/library.py +0 -0
  31. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/metrics/metric.py +0 -0
  32. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/metrics/util.py +0 -0
  33. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/misc.py +0 -0
  34. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/ring_buffer.py +0 -0
  35. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/tcl.py +0 -0
  36. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/tpe.py +0 -0
  37. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/common/types.py +0 -0
  38. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/config/__init__.py +0 -0
  39. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/config/__main__.py +0 -0
  40. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/config/preprocessor.py +0 -0
  41. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/config/removals.py +0 -0
  42. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/config/variable.py +0 -0
  43. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/container.py +0 -0
  44. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/env_info.py +0 -0
  45. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/hold_eco_demo/config.yaml +0 -0
  46. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/hold_eco_demo/demo.v +0 -0
  47. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm/config.yaml +0 -0
  48. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm/pin_order.cfg +0 -0
  49. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm/src/impl.sdc +0 -0
  50. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm/src/signoff.sdc +0 -0
  51. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm/src/spm.v +0 -0
  52. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm/verify/spm_tb.v +0 -0
  53. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  54. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  55. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  56. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
  57. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  58. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  59. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  60. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/__init__.py +0 -0
  61. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/builtins.py +0 -0
  62. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/chip.py +0 -0
  63. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/classic.py +0 -0
  64. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/cli.py +0 -0
  65. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/flow.py +0 -0
  66. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/misc.py +0 -0
  67. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/optimizing.py +0 -0
  68. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/sequential.py +0 -0
  69. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/flows/synth_explore.py +0 -0
  70. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/help/__main__.py +0 -0
  71. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/logging/__init__.py +0 -0
  72. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/logging/logger.py +0 -0
  73. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/plugins.py +0 -0
  74. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/py.typed +0 -0
  75. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/base.sdc +0 -0
  76. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/klayout/Readme.md +0 -0
  77. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/klayout/insert_cell.py +0 -0
  78. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/klayout/open_design.py +0 -0
  79. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/klayout/render.py +0 -0
  80. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/klayout/stream_out.py +0 -0
  81. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  82. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/klayout/xor.drc +0 -0
  83. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/Readme.md +0 -0
  84. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
  85. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/def/mag.tcl +0 -0
  86. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
  87. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/extract_spice.tcl +0 -0
  88. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
  89. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
  90. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
  91. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
  92. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/get_bbox.tcl +0 -0
  93. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
  94. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/lef/maglef.tcl +0 -0
  95. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/lef.tcl +0 -0
  96. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/open.tcl +0 -0
  97. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/spice_rcx.tcl +0 -0
  98. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/magic/wrapper.tcl +0 -0
  99. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/netgen/setup.tcl +0 -0
  100. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  101. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  102. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
  103. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/contextualize.py +0 -0
  104. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/defutil.py +0 -0
  105. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/diodes.py +0 -0
  106. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  107. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/eco_buffer.py +0 -0
  108. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/eco_diode.py +0 -0
  109. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  110. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/io_place.py +0 -0
  111. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  112. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  113. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  114. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/lefutil.py +0 -0
  115. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/placers.py +0 -0
  116. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/power_utils.py +0 -0
  117. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/random_place.py +0 -0
  118. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/reader.py +0 -0
  119. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  120. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  121. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  122. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  123. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  124. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  125. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/dpl.tcl +0 -0
  126. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  127. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/grt.tcl +0 -0
  128. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/resizer.tcl +0 -0
  129. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
  130. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  131. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
  132. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
  133. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  134. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/cts.tcl +0 -0
  135. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/cut_rows.tcl +0 -0
  136. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/dpl.tcl +0 -0
  137. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/drt.tcl +0 -0
  138. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/dump_rc.tcl +0 -0
  139. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/fill.tcl +0 -0
  140. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/floorplan.tcl +0 -0
  141. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/gpl.tcl +0 -0
  142. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/grt.tcl +0 -0
  143. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/gui.tcl +0 -0
  144. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
  145. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/ioplacer.tcl +0 -0
  146. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/irdrop.tcl +0 -0
  147. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/pad.tcl +0 -0
  148. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/pdn.tcl +0 -0
  149. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/rcx.tcl +0 -0
  150. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/repair_design.tcl +0 -0
  151. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
  152. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
  153. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
  154. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
  155. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/sta/corner.tcl +0 -0
  156. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/tapcell.tcl +0 -0
  157. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/ungpl.tcl +0 -0
  158. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/write_cdl.tcl +0 -0
  159. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/openroad/write_views.tcl +0 -0
  160. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  161. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/pyosys/json_header.py +0 -0
  162. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/pyosys/synthesize.py +0 -0
  163. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/pyosys/ys_common.py +0 -0
  164. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/scripts/tclsh/hello.tcl +0 -0
  165. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/state/__init__.py +0 -0
  166. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/state/__main__.py +0 -0
  167. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/state/design_format.py +0 -0
  168. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/state/state.py +0 -0
  169. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/__init__.py +0 -0
  170. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/__main__.py +0 -0
  171. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/checker.py +0 -0
  172. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/klayout.py +0 -0
  173. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/magic.py +0 -0
  174. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/misc.py +0 -0
  175. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/netgen.py +0 -0
  176. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/openroad_alerts.py +0 -0
  177. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/step.py +0 -0
  178. {librelane-3.0.3 → librelane-3.1.0.dev1}/librelane/steps/tclstep.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: librelane
3
- Version: 3.0.3
3
+ Version: 3.1.0.dev1
4
4
  Summary: An infrastructure for implementing chip design flows
5
5
  License-Expression: Apache-2.0
6
6
  Maintainer: Mohamed Gaber
@@ -232,10 +232,16 @@ class Toolbox(object):
232
232
 
233
233
  timing_corner = timing_corner or config["DEFAULT_CORNER"]
234
234
 
235
- all_libs: List[Path] = self.filter_views(config, config["LIB"], timing_corner)
235
+ # Filter the cell libs
236
+ all_libs: List[Path] = self.filter_views(
237
+ config, config["CELL_LIBS"], timing_corner
238
+ )
236
239
  if len(all_libs) == 0:
237
240
  warn(f"No SCL lib files found for {timing_corner}.")
238
241
 
242
+ # Add optional I/O pad libs
243
+ all_libs += self.filter_views(config, config["PAD_LIBS"], timing_corner)
244
+
239
245
  all_netlists: List[Path] = []
240
246
  all_spefs: List[Tuple[str, Path]] = []
241
247
 
@@ -833,11 +833,6 @@ 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
-
841
836
  if pad is not None:
842
837
  pdk_config[SpecialKeys.pad] = pad
843
838
 
@@ -18,7 +18,7 @@
18
18
  import os
19
19
 
20
20
  from decimal import Decimal
21
- from typing import List, Optional, Dict, Sequence, Union, Tuple
21
+ from typing import List, Optional, Dict, Sequence, Union, Tuple, Literal
22
22
 
23
23
  from .variable import Variable, Macro
24
24
  from ..common import Path, get_script_dir
@@ -127,9 +127,10 @@ scl_variables = [
127
127
  deprecated_names=["DECAP_CELL"],
128
128
  ),
129
129
  Variable(
130
- "LIB",
130
+ "CELL_LIBS",
131
131
  Dict[str, List[Path]],
132
132
  "A map from corner patterns to a list of associated liberty files. Exactly one entry must match the `DEFAULT_CORNER`.",
133
+ deprecated_names=["LIB"],
133
134
  pdk=True,
134
135
  ),
135
136
  Variable(
@@ -427,9 +428,10 @@ option_variables = [
427
428
 
428
429
  pad_variables = [
429
430
  Variable(
430
- "PAD_GDS",
431
- Optional[List[Path]],
432
- "Path(s) to IO pad GDS file(s).",
431
+ "PAD_LIBS",
432
+ Optional[Dict[str, List[Path]]],
433
+ "A map from corner patterns to a list of associated liberty files. Exactly one entry must match the `DEFAULT_CORNER`.",
434
+ default={},
433
435
  pdk=True,
434
436
  ),
435
437
  Variable(
@@ -438,6 +440,12 @@ pad_variables = [
438
440
  "Path(s) to IO pad LEF file(s).",
439
441
  pdk=True,
440
442
  ),
443
+ Variable(
444
+ "PAD_GDS",
445
+ Optional[List[Path]],
446
+ "Path(s) to IO pad GDS file(s).",
447
+ pdk=True,
448
+ ),
441
449
  Variable(
442
450
  "PAD_VERILOG_MODELS",
443
451
  Optional[List[Path]],
@@ -456,12 +464,6 @@ pad_variables = [
456
464
  description="A circuit-design language view of the io pad library.",
457
465
  pdk=True,
458
466
  ),
459
- Variable(
460
- "PAD_LIBS",
461
- Optional[Dict[str, List[Path]]],
462
- "A map from corner patterns to a list of associated liberty files. Exactly one entry must match the `DEFAULT_CORNER`.",
463
- pdk=True,
464
- ),
465
467
  Variable(
466
468
  "PAD_CORNER",
467
469
  Optional[List[str]],
@@ -535,6 +537,27 @@ pad_variables = [
535
537
  units="µm",
536
538
  pdk=True,
537
539
  ),
540
+ Variable(
541
+ "PAD_ROTATION_HORIZONTAL",
542
+ Optional[Literal["R0", "MY", "R90", "MXR90", "R180", "MX", "R270", "MYR90"]],
543
+ "Rotation to apply to the horizontal sites to ensure pads are placed correctly.",
544
+ default="R0",
545
+ pdk=True,
546
+ ),
547
+ Variable(
548
+ "PAD_ROTATION_VERTICAL",
549
+ Optional[Literal["R0", "MY", "R90", "MXR90", "R180", "MX", "R270", "MYR90"]],
550
+ "Rotation to apply to the vertical sites to ensure pads are placed correctly.",
551
+ default="R0",
552
+ pdk=True,
553
+ ),
554
+ Variable(
555
+ "PAD_ROTATION_CORNER",
556
+ Optional[Literal["R0", "MY", "R90", "MXR90", "R180", "MX", "R270", "MYR90"]],
557
+ "Rotation to apply to the corner sites to ensure pads are placed correctly.",
558
+ default="R0",
559
+ pdk=True,
560
+ ),
538
561
  ]
539
562
 
540
563
  flow_common_variables = pdk_variables + scl_variables + option_variables + pad_variables
@@ -203,9 +203,9 @@ def migrate_old_config(config: Mapping[str, Any]) -> Dict[str, Any]:
203
203
  corner = f"*_{pvt}"
204
204
  lib_sta[corner] = lib_list
205
205
 
206
- if (
207
- new["PDK"].startswith("sky130") or new["PDK"].startswith("gf180mcu")
208
- ) and "LIB" not in config:
206
+ if (new["PDK"].startswith("sky130") or new["PDK"].startswith("gf180mcu")) and (
207
+ "LIB" not in config and "CELL_LIBS" not in config
208
+ ):
209
209
  process_sta("LIB_SYNTH")
210
210
  process_sta("LIB_SLOWEST")
211
211
  process_sta("LIB_FASTEST")
@@ -0,0 +1,3 @@
1
+ sky130: d815bb30c9afdf9e264c276a8a2b533108dea3d0
2
+ gf180mcu: d815bb30c9afdf9e264c276a8a2b533108dea3d0
3
+ ihp-sg13g2: c4b8b4e5e7a05f375cca3815d51b3a37721fbf5c
@@ -56,34 +56,37 @@ proc read_pad_lef {} {
56
56
  }
57
57
  }
58
58
 
59
- proc read_pdk_gds {} {
60
- set old_rescale [gds rescale]
61
- set old_readonly [gds readonly]
59
+ proc _read_gds {env_name} {
60
+ # Pre-check
61
+ if { ![info exist ::env($env_name)] } {
62
+ return
63
+ }
64
+
65
+ # Save options
66
+ set old [list]
67
+ lappend old [gds rescale]
68
+ lappend old [gds readonly]
62
69
  gds rescale false
63
70
  gds readonly true
64
- set gds_files_in $::env(CELL_GDS)
71
+
72
+ # Read GDS
73
+ set gds_files_in $::env($env_name)
65
74
  foreach gds_file $gds_files_in {
66
75
  puts "> gds read $gds_file"
67
76
  gds read $gds_file
68
77
  }
69
- gds rescale $old_rescale
70
- gds readonly $old_readonly
78
+
79
+ # Restore options
80
+ gds rescale [lindex $old 0]
81
+ gds readonly [lindex $old 1]
82
+ }
83
+
84
+ proc read_pdk_gds {} {
85
+ _read_gds CELL_GDS
71
86
  }
72
87
 
73
88
  proc read_macro_gds {} {
74
- set old_rescale [gds rescale]
75
- set old_readonly [gds readonly]
76
- gds rescale false
77
- gds readonly true
78
- if { [info exist ::env(MACRO_GDS_FILES)] } {
79
- set gds_files_in $::env(MACRO_GDS_FILES)
80
- foreach gds_file $gds_files_in {
81
- puts "> gds read $gds_file"
82
- gds read $gds_file
83
- }
84
- }
85
- gds rescale $old_rescale
86
- gds readonly $old_readonly
89
+ _read_gds MACRO_GDS_FILES
87
90
  }
88
91
 
89
92
  proc read_macro_gds_blackbox {} {
@@ -104,35 +107,11 @@ proc read_macro_gds_blackbox {} {
104
107
  }
105
108
 
106
109
  proc read_extra_gds {} {
107
- set old_rescale [gds rescale]
108
- set old_readonly [gds readonly]
109
- gds rescale false
110
- gds readonly true
111
- if { [info exist ::env(EXTRA_GDS)] } {
112
- set gds_files_in $::env(EXTRA_GDS)
113
- foreach gds_file $gds_files_in {
114
- puts "> gds read $gds_file"
115
- gds read $gds_file
116
- }
117
- }
118
- gds rescale $old_rescale
119
- gds readonly $old_readonly
110
+ _read_gds EXTRA_GDS
120
111
  }
121
112
 
122
113
  proc read_pad_gds {} {
123
- set old_rescale [gds rescale]
124
- set old_readonly [gds readonly]
125
- gds rescale false
126
- gds readonly true
127
- if { [info exist ::env(PAD_GDS)] } {
128
- set gds_files_in $::env(PAD_GDS)
129
- foreach gds_file $gds_files_in {
130
- puts "> gds read $gds_file"
131
- gds read $gds_file
132
- }
133
- }
134
- gds rescale $old_rescale
135
- gds readonly $old_readonly
114
+ _read_gds PAD_GDS
136
115
  }
137
116
 
138
117
  proc read_def {} {
@@ -32,6 +32,10 @@ if { [info exists ::env(MAGIC_DRC_MAGLEFS)] } {
32
32
  gds noduplicates true
33
33
  gds readonly true
34
34
 
35
+ # Enable maskhints so that DRC rules against generated layers are run
36
+ # against the closest possible version to what's actually in the GDS
37
+ gds maskhints true
38
+
35
39
  # Flatten cells
36
40
  if { [info exists ::env(MAGIC_GDS_FLATGLOB)] } {
37
41
  foreach {gds_flatglob} $::env(MAGIC_GDS_FLATGLOB) {
@@ -235,13 +235,6 @@ proc read_timing_info {args} {
235
235
  read_liberty -corner $corner_name $extra_lib
236
236
  }
237
237
  }
238
-
239
- if { [info exists ::env(PAD_LIBS) ] } {
240
- foreach lib $::env(PAD_LIBS) {
241
- puts "Reading gpio pad timing for the '$corner_name' corner at '$lib'…"
242
- read_liberty -corner $corner_name $lib
243
- }
244
- }
245
238
 
246
239
  set blackbox_wildcard {/// sta-blackbox}
247
240
  foreach nl $::env(_CURRENT_CORNER_NETLISTS) {
@@ -343,13 +336,6 @@ proc read_pnr_libs {args} {
343
336
  read_liberty -corner $corner_name $extra_lib
344
337
  }
345
338
  }
346
-
347
- if { [info exists ::env(PAD_LIBS) ] } {
348
- foreach pad_lib $::env(PAD_LIBS) {
349
- puts "Reading gpio pad timing library for the '$corner_name' corner at '$pad_lib'…"
350
- read_liberty -corner $corner_name $pad_lib
351
- }
352
- }
353
339
  }
354
340
  }
355
341
 
@@ -602,11 +588,7 @@ proc write_libs {} {
602
588
  foreach corner_name [lln::get_corner_names] {
603
589
  set target $::env(_LIB_SAVE_DIR)/$::env(DESIGN_NAME)__$corner_name.lib
604
590
  puts "Writing timing models for the $corner_name corner to $target…"
605
- if {[string length [namespace which sta::scenes]] != 0} {
606
- write_timing_model -scene $corner_name $target
607
- } else {
608
- write_timing_model -corner $corner_name $target
609
- }
591
+ write_timing_model -corner $corner_name $target
610
592
  }
611
593
  }
612
594
  }
@@ -74,7 +74,10 @@ make_io_sites \
74
74
  -horizontal_site $::env(PAD_SITE_NAME) \
75
75
  -vertical_site $::env(PAD_SITE_NAME) \
76
76
  -corner_site $::env(PAD_CORNER_SITE_NAME) \
77
- -offset $::env(PAD_EDGE_SPACING)
77
+ -offset $::env(PAD_EDGE_SPACING) \
78
+ -rotation_horizontal $::env(PAD_ROTATION_HORIZONTAL) \
79
+ -rotation_vertical $::env(PAD_ROTATION_VERTICAL) \
80
+ -rotation_corner $::env(PAD_ROTATION_CORNER)
78
81
 
79
82
  set sides {PAD_SOUTH PAD_EAST PAD_NORTH PAD_WEST}
80
83
  set vertical_sides [list PAD_EAST PAD_WEST]
@@ -150,7 +153,7 @@ foreach side $sides {
150
153
  # For all instances
151
154
  foreach inst_name $::env($side) {
152
155
  if { [set inst [$block findInst $inst_name]] == "NULL" } {
153
- puts stderr "\[ERROR\] No instance $instance_name found."
156
+ puts stderr "\[ERROR\] No instance $inst_name found."
154
157
  exit 1
155
158
  }
156
159
  set master_name [[$inst getMaster] getName]
@@ -139,6 +139,7 @@ if { $::env(PDN_CORE_RING) == 1 } {
139
139
  append_if_flag arg_list PDN_CORE_RING_ALLOW_OUT_OF_DIE -allow_out_of_die
140
140
  append_if_flag arg_list PDN_CORE_RING_CONNECT_TO_PADS -connect_to_pads
141
141
  append_if_equals arg_list PDN_EXTEND_TO "boundary" -extend_to_boundary
142
+ append_if_exists_argument arg_list PDN_CORE_RING_CONNECT_TO_PAD_LAYERS -connect_to_pad_layers
142
143
 
143
144
  set pdn_core_vertical_layer $::env(PDN_VERTICAL_LAYER)
144
145
  set pdn_core_horizontal_layer $::env(PDN_HORIZONTAL_LAYER)
@@ -263,6 +263,12 @@ pdn_variables = [
263
263
  default=False,
264
264
  pdk=True,
265
265
  ),
266
+ Variable(
267
+ "PDN_CORE_RING_CONNECT_TO_PAD_LAYERS",
268
+ Optional[List[str]],
269
+ "Restrict the pad pins layers to this list.",
270
+ pdk=True,
271
+ ),
266
272
  Variable(
267
273
  "PDN_CORE_RING_ALLOW_OUT_OF_DIE",
268
274
  bool,
@@ -280,7 +286,7 @@ pdn_variables = [
280
286
  Variable(
281
287
  "PDN_RAIL_WIDTH",
282
288
  Decimal,
283
- "Defines the width of PDN rails on the `PDN_RAIL_LAYER` layer.",
289
+ "Defines the width of PDN rails on the `FP_PDN_RAILS_LAYER` layer.",
284
290
  units="µm",
285
291
  pdk=True,
286
292
  deprecated_names=["FP_PDN_RAIL_WIDTH"],
@@ -972,7 +972,8 @@ class CellFrequencyTables(OdbpyStep):
972
972
  kwargs, env = self.extract_env(kwargs)
973
973
 
974
974
  env_copy = env.copy()
975
- lib_list = self.toolbox.filter_views(self.config, self.config["LIB"])
975
+ lib_list = self.toolbox.filter_views(self.config, self.config["CELL_LIBS"])
976
+ lib_list += self.toolbox.filter_views(self.config, self.config["PAD_LIBS"])
976
977
  env_copy["_PNR_LIBS"] = TclStep.value_to_tcl(lib_list)
977
978
  super().run_subprocess(
978
979
  [
@@ -317,7 +317,8 @@ class OpenROADStep(TclStep):
317
317
  def prepare_env(self, env: dict, state: State) -> dict:
318
318
  env = super().prepare_env(env, state)
319
319
 
320
- lib_list = self.toolbox.filter_views(self.config, self.config["LIB"])
320
+ lib_list = self.toolbox.filter_views(self.config, self.config["CELL_LIBS"])
321
+ lib_list += self.toolbox.filter_views(self.config, self.config["PAD_LIBS"])
321
322
  lib_list += self.toolbox.get_macro_views(self.config, DesignFormat.LIB)
322
323
 
323
324
  env["_SDC_IN"] = self.config["PNR_SDC_FILE"] or self.config["FALLBACK_SDC"]
@@ -2239,7 +2240,8 @@ class IRDropReport(OpenROADStep):
2239
2240
  elif len(spefs_in) < 1:
2240
2241
  raise StepException("No SPEF file found for the default corner.")
2241
2242
 
2242
- libs_in = self.toolbox.filter_views(self.config, self.config["LIB"])
2243
+ libs_in = self.toolbox.filter_views(self.config, self.config["CELL_LIBS"])
2244
+ libs_in += self.toolbox.filter_views(self.config, self.config["PAD_LIBS"])
2243
2245
 
2244
2246
  if self.config["VSRC_LOC_FILES"] is None:
2245
2247
  self.warn(
@@ -294,9 +294,13 @@ class VerilogStep(PyosysStep):
294
294
 
295
295
  blackbox_models = []
296
296
  scl_lib_list = self.toolbox.filter_views(
297
- self.config, self.config["LIB"], self.config.get("SYNTH_CORNER")
297
+ self.config, self.config["CELL_LIBS"], self.config.get("SYNTH_CORNER")
298
+ )
299
+ pad_lib_list = self.toolbox.filter_views(
300
+ self.config, self.config["PAD_LIBS"], self.config.get("SYNTH_CORNER")
298
301
  )
299
302
 
303
+ # Try your best to use powered blackbox models if power_defines is true
300
304
  if self.power_defines:
301
305
  if self.config["CELL_VERILOG_MODELS"] is not None:
302
306
  blackbox_models.extend(
@@ -317,7 +321,8 @@ class VerilogStep(PyosysStep):
317
321
  ]
318
322
  )
319
323
  else:
320
- blackbox_models.extend(str(f) for f in scl_lib_list)
324
+ # Fall back to scl_lib_list and pad_lib_list if you cant
325
+ blackbox_models.extend(str(f) for f in scl_lib_list + pad_lib_list)
321
326
 
322
327
  # Priorities from higher to lower
323
328
  format_list = (
@@ -352,7 +357,7 @@ class VerilogStep(PyosysStep):
352
357
  excluded_cells.update(process_list_file(self.config["PNR_EXCLUDED_CELL_FILE"]))
353
358
 
354
359
  libs_synth = self.toolbox.remove_cells_from_lib(
355
- frozenset([str(lib) for lib in scl_lib_list]),
360
+ frozenset([str(lib) for lib in scl_lib_list + pad_lib_list]),
356
361
  excluded_cells=frozenset(excluded_cells),
357
362
  )
358
363
  extra_path = os.path.join(self.step_dir, "extra.json")
@@ -77,12 +77,6 @@ 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
- ),
86
80
  Variable(
87
81
  "VERILOG_DEFINES",
88
82
  Optional[List[str]],
@@ -203,10 +197,6 @@ class Lint(Step):
203
197
  if self.config["LINTER_ERROR_ON_LATCH"]:
204
198
  extra_args.append("--Werror-LATCH")
205
199
 
206
- # It's more user-friendly to catch multiple-driver conflicts here in Verilator (if possible) than later in Yosys.
207
- if self.config["LINTER_ERROR_ON_MULTIDRIVEN"]:
208
- extra_args.append("--Werror-MULTIDRIVEN")
209
-
210
200
  if include_dirs := self.config["VERILOG_INCLUDE_DIRS"]:
211
201
  extra_args.extend([f"-I{dir}" for dir in include_dirs])
212
202
 
@@ -69,7 +69,8 @@ def _generate_read_deps(
69
69
  f"lappend ::_synlig_defines {TclUtils.escape(f'+define+{define}')}\n"
70
70
  )
71
71
 
72
- scl_lib_list = toolbox.filter_views(config, config["LIB"])
72
+ scl_lib_list = toolbox.filter_views(config, config["CELL_LIBS"])
73
+ pad_lib_list = toolbox.filter_views(config, config["PAD_LIBS"])
73
74
 
74
75
  if power_defines:
75
76
  if power_define := config.get(
@@ -94,8 +95,8 @@ def _generate_read_deps(
94
95
  )
95
96
  commands += f"read_verilog -sv -lib {pad_blackbox_models}\n"
96
97
  else:
97
- # Fall back to scl_lib_list if you cant
98
- for lib in scl_lib_list:
98
+ # Fall back to scl_lib_list and pad_lib_list if you cant
99
+ for lib in scl_lib_list + pad_lib_list:
99
100
  lib_str = TclUtils.escape(str(lib))
100
101
  commands += (
101
102
  f"read_liberty -lib -ignore_miss_dir -setattr blackbox {lib_str}\n"
@@ -106,7 +107,7 @@ def _generate_read_deps(
106
107
  excluded_cells.update(process_list_file(config["PNR_EXCLUDED_CELL_FILE"]))
107
108
 
108
109
  lib_synth = toolbox.remove_cells_from_lib(
109
- frozenset([str(lib) for lib in scl_lib_list]),
110
+ frozenset([str(lib) for lib in scl_lib_list + pad_lib_list]),
110
111
  excluded_cells=frozenset(excluded_cells),
111
112
  )
112
113
  if tcl:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "librelane"
3
- version = "3.0.3"
3
+ version = "3.1.0.dev1"
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: 8afc8346a57fe1ab7934ba5a6056ea8b43078e71
2
- gf180mcu: 54435919abffb937387ec956209f9cf5fd2dfbee
3
- ihp-sg13g2: c4b8b4e5e7a05f375cca3815d51b3a37721fbf5c
File without changes