librelane 3.1.0.dev3__tar.gz → 3.1.0.dev5__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.dev5}/PKG-INFO +9 -6
  2. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/Readme.md +6 -4
  3. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/__init__.py +1 -0
  4. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/misc.py +27 -0
  5. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/toolbox.py +5 -0
  6. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/__init__.py +4 -0
  7. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/__main__.py +4 -0
  8. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/config.py +5 -1
  9. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/flow.py +1 -1
  10. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/pdk_compat.py +20 -0
  11. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/preprocessor.py +4 -0
  12. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/removals.py +4 -0
  13. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/variable.py +6 -0
  14. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/cli.py +20 -18
  15. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/synth_explore.py +1 -0
  16. librelane-3.1.0.dev5/librelane/pdk_hashes.yaml +4 -0
  17. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/check_antenna_properties.py +1 -1
  18. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/defutil.py +4 -1
  19. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/io.tcl +53 -29
  20. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/gui.tcl +4 -4
  21. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design.tcl +3 -3
  22. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design_postgrt.tcl +1 -4
  23. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/sta/corner.tcl +3 -3
  24. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/synthesize.py +60 -20
  25. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/ys_common.py +7 -0
  26. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/klayout.py +59 -27
  27. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/openroad.py +21 -1
  28. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/pyosys.py +67 -39
  29. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/step.py +9 -6
  30. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/verilator.py +1 -1
  31. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/pyproject.toml +2 -2
  32. librelane-3.1.0.dev3/librelane/pdk_hashes.yaml +0 -3
  33. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/__init__.py +0 -0
  34. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/__main__.py +0 -0
  35. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/__version__.py +0 -0
  36. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/cli.py +0 -0
  37. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/drc.py +0 -0
  38. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/generic_dict.py +0 -0
  39. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/__init__.py +0 -0
  40. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/__main__.py +0 -0
  41. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/compare.py +0 -0
  42. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/library.py +0 -0
  43. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/metric.py +0 -0
  44. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/util.py +0 -0
  45. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/ring_buffer.py +0 -0
  46. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/tcl.py +0 -0
  47. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/tpe.py +0 -0
  48. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/types.py +0 -0
  49. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/container.py +0 -0
  50. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/env_info.py +0 -0
  51. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/hold_eco_demo/config.yaml +0 -0
  52. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/hold_eco_demo/demo.v +0 -0
  53. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/config.yaml +0 -0
  54. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/pin_order.cfg +0 -0
  55. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/src/impl.sdc +0 -0
  56. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/src/signoff.sdc +0 -0
  57. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/src/spm.v +0 -0
  58. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/verify/spm_tb.v +0 -0
  59. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  60. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  61. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  62. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
  63. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  64. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  65. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  66. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/__init__.py +0 -0
  67. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/builtins.py +0 -0
  68. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/chip.py +0 -0
  69. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/classic.py +0 -0
  70. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/flow.py +0 -0
  71. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/misc.py +0 -0
  72. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/optimizing.py +0 -0
  73. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/sequential.py +0 -0
  74. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/help/__main__.py +0 -0
  75. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/logging/__init__.py +0 -0
  76. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/logging/logger.py +0 -0
  77. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/plugins.py +0 -0
  78. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/py.typed +0 -0
  79. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/base.sdc +0 -0
  80. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/Readme.md +0 -0
  81. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/insert_cell.py +0 -0
  82. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/open_design.py +0 -0
  83. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/render.py +0 -0
  84. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/stream_out.py +0 -0
  85. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  86. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xor.drc +0 -0
  87. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/Readme.md +0 -0
  88. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/common/read.tcl +0 -0
  89. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
  90. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/mag.tcl +0 -0
  91. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
  92. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/drc.tcl +0 -0
  93. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/extract_spice.tcl +0 -0
  94. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
  95. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
  96. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
  97. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
  98. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/get_bbox.tcl +0 -0
  99. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
  100. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef/maglef.tcl +0 -0
  101. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef.tcl +0 -0
  102. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/open.tcl +0 -0
  103. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/spice_rcx.tcl +0 -0
  104. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/wrapper.tcl +0 -0
  105. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/netgen/setup.tcl +0 -0
  106. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  107. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  108. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/contextualize.py +0 -0
  109. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/diodes.py +0 -0
  110. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  111. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/eco_buffer.py +0 -0
  112. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/eco_diode.py +0 -0
  113. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  114. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/io_place.py +0 -0
  115. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  116. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  117. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  118. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/lefutil.py +0 -0
  119. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/placers.py +0 -0
  120. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/power_utils.py +0 -0
  121. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/random_place.py +0 -0
  122. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/reader.py +0 -0
  123. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  124. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  125. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  126. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  127. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  128. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  129. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl.tcl +0 -0
  130. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  131. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/grt.tcl +0 -0
  132. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/pad_cfg.tcl +0 -0
  133. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
  134. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/resizer.tcl +0 -0
  135. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
  136. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  137. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
  138. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
  139. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  140. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/cts.tcl +0 -0
  141. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/cut_rows.tcl +0 -0
  142. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/dpl.tcl +0 -0
  143. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/drt.tcl +0 -0
  144. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/dump_rc.tcl +0 -0
  145. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/fill.tcl +0 -0
  146. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/floorplan.tcl +0 -0
  147. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/gpl.tcl +0 -0
  148. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/grt.tcl +0 -0
  149. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
  150. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/ioplacer.tcl +0 -0
  151. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/irdrop.tcl +0 -0
  152. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/pad.tcl +0 -0
  153. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/pdn.tcl +0 -0
  154. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rcx.tcl +0 -0
  155. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
  156. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
  157. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
  158. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/tapcell.tcl +0 -0
  159. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/ungpl.tcl +0 -0
  160. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/write_cdl.tcl +0 -0
  161. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/write_views.tcl +0 -0
  162. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  163. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/json_header.py +0 -0
  164. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/tclsh/hello.tcl +0 -0
  165. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/state/__init__.py +0 -0
  166. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/state/__main__.py +0 -0
  167. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/state/design_format.py +0 -0
  168. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/state/state.py +0 -0
  169. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/__init__.py +0 -0
  170. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/__main__.py +0 -0
  171. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/checker.py +0 -0
  172. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/common_variables.py +0 -0
  173. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/magic.py +0 -0
  174. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/misc.py +0 -0
  175. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/netgen.py +0 -0
  176. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/odb.py +0 -0
  177. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/openroad_alerts.py +0 -0
  178. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/tclstep.py +0 -0
  179. {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/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.dev5
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)
@@ -79,7 +80,7 @@ LibreLane includes two reference flows (`Classic` and `Chip`) that are built
79
80
  entirely using open-source EDA tools.
80
81
 
81
82
  You can find the documentation
82
- [here](https://librelane.readthedocs.io/en/latest/getting_started/) to get
83
+ [here](https://librelane.readthedocs.io/en/stable/getting_started/) to get
83
84
  started. You can discuss LibreLane in the
84
85
  [FOSSi Chat Matrix Server](https://fossi-chat.org).
85
86
 
@@ -120,7 +121,7 @@ Works for macOS and Linux (x86-64 and aarch64). Recommended, as it is more
120
121
  integrated with your filesystem and overall has less upload and download deltas.
121
122
 
122
123
  See
123
- [Nix-based installation](https://librelane.readthedocs.io/en/latest/installation/nix_installation/index.html)
124
+ [Nix-based installation](https://librelane.readthedocs.io/en/stable/installation/nix_installation/index.html)
124
125
  in the docs for more info.
125
126
 
126
127
  ### Docker
@@ -128,7 +129,7 @@ in the docs for more info.
128
129
  Works for Windows, macOS and Linux (x86-64 and aarch64).
129
130
 
130
131
  See
131
- [Docker-based installation](https://librelane.readthedocs.io/en/latest/installation/docker_installation/index.html)
132
+ [Docker-based installation](https://librelane.readthedocs.io/en/stable/installation/docker_installation/index.html)
132
133
  in the docs for more info.
133
134
 
134
135
  Do note you'll need to add `--dockerized` right after `librelane` in most CLI
@@ -144,7 +145,9 @@ python3 -m pip install --upgrade librelane
144
145
  ```
145
146
 
146
147
  Python-only installations are presently unsupported and entirely at your own
147
- risk.
148
+ risk, but you may consult
149
+ [Manual installation](https://librelane.readthedocs.io/en/stable/installation/manual_installation/index.html)
150
+ in the docs for more info.
148
151
 
149
152
  ## Usage
150
153
 
@@ -45,7 +45,7 @@ LibreLane includes two reference flows (`Classic` and `Chip`) that are built
45
45
  entirely using open-source EDA tools.
46
46
 
47
47
  You can find the documentation
48
- [here](https://librelane.readthedocs.io/en/latest/getting_started/) to get
48
+ [here](https://librelane.readthedocs.io/en/stable/getting_started/) to get
49
49
  started. You can discuss LibreLane in the
50
50
  [FOSSi Chat Matrix Server](https://fossi-chat.org).
51
51
 
@@ -86,7 +86,7 @@ Works for macOS and Linux (x86-64 and aarch64). Recommended, as it is more
86
86
  integrated with your filesystem and overall has less upload and download deltas.
87
87
 
88
88
  See
89
- [Nix-based installation](https://librelane.readthedocs.io/en/latest/installation/nix_installation/index.html)
89
+ [Nix-based installation](https://librelane.readthedocs.io/en/stable/installation/nix_installation/index.html)
90
90
  in the docs for more info.
91
91
 
92
92
  ### Docker
@@ -94,7 +94,7 @@ in the docs for more info.
94
94
  Works for Windows, macOS and Linux (x86-64 and aarch64).
95
95
 
96
96
  See
97
- [Docker-based installation](https://librelane.readthedocs.io/en/latest/installation/docker_installation/index.html)
97
+ [Docker-based installation](https://librelane.readthedocs.io/en/stable/installation/docker_installation/index.html)
98
98
  in the docs for more info.
99
99
 
100
100
  Do note you'll need to add `--dockerized` right after `librelane` in most CLI
@@ -110,7 +110,9 @@ python3 -m pip install --upgrade librelane
110
110
  ```
111
111
 
112
112
  Python-only installations are presently unsupported and entirely at your own
113
- risk.
113
+ risk, but you may consult
114
+ [Manual installation](https://librelane.readthedocs.io/en/stable/installation/manual_installation/index.html)
115
+ in the docs for more info.
114
116
 
115
117
  ## Usage
116
118
 
@@ -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");
@@ -241,6 +245,8 @@ class Macro:
241
245
 
242
246
  # we need to make a copy here, as we're modifying the dictionary as we iterate
243
247
  for instance_name, instance in self.instances.copy().items():
248
+ if not isinstance(instance, Instance):
249
+ instance = Instance(**instance)
244
250
  if (array := instance.array) is not None:
245
251
  # we have a macro to expand
246
252
  # first, check it's valid
@@ -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]
@@ -111,7 +129,7 @@ proc read_current_sdc {} {
111
129
  }
112
130
 
113
131
  puts "Reading design constraints file at '$::env(_SDC_IN)'…"
114
- if {[catch {read_sdc $::env(_SDC_IN)} errmsg]} {
132
+ if {[catch {log_cmd read_sdc $::env(_SDC_IN)} errmsg]} {
115
133
  puts stderr $errmsg
116
134
  exit 1
117
135
  }
@@ -119,10 +137,10 @@ proc read_current_sdc {} {
119
137
  if { ![string_in_file $::env(_SDC_IN) "set_propagated_clock"] && ![string_in_file $::env(_SDC_IN) "unset_propagated_clock"] } {
120
138
  if { [info exists ::env(OPENLANE_SDC_IDEAL_CLOCKS)] && $::env(OPENLANE_SDC_IDEAL_CLOCKS) } {
121
139
  puts "\[INFO\] No information on clock propagation in input SDC file-- unpropagating all clocks."
122
- unset_propagated_clock [all_clocks]
140
+ log_cmd unset_propagated_clock [all_clocks]
123
141
  } else {
124
142
  puts "\[INFO\] No information on clock propagation in input SDC file-- propagating all clocks."
125
- set_propagated_clock [all_clocks]
143
+ log_cmd set_propagated_clock [all_clocks]
126
144
  }
127
145
  }
128
146
 
@@ -140,6 +158,12 @@ proc read_current_sdc {} {
140
158
  unset ::env(SYNTH_DRIVING_CELL_PIN)
141
159
  set ::env(SYNTH_DRIVING_CELL) $synth_driving_cell_bk
142
160
  }
161
+
162
+ # this maneuver is so it ends up in the report directory even if it's not
163
+ # the step directory
164
+ puts "%OL_CREATE_REPORT resolved.sdc"
165
+ write_sdc /dev/stdout
166
+ puts "%OL_END_REPORT"
143
167
  }
144
168
 
145
169
  proc read_pad_cfg {} {
@@ -192,20 +216,20 @@ proc read_current_netlist {args} {
192
216
 
193
217
  if { [info exists flags(-powered)] } {
194
218
  puts "Reading top-level powered netlist at '$::env(CURRENT_PNL)'…"
195
- if {[catch {read_verilog $::env(CURRENT_PNL)} errmsg]} {
219
+ if {[catch {log_cmd read_verilog $::env(CURRENT_PNL)} errmsg]} {
196
220
  puts stderr $errmsg
197
221
  exit 1
198
222
  }
199
223
  } else {
200
224
  puts "Reading top-level netlist at '$::env(CURRENT_NL)'…"
201
- if {[catch {read_verilog $::env(CURRENT_NL)} errmsg]} {
225
+ if {[catch {log_cmd read_verilog $::env(CURRENT_NL)} errmsg]} {
202
226
  puts stderr $errmsg
203
227
  exit 1
204
228
  }
205
229
  }
206
230
 
207
231
  puts "Linking design '$::env(DESIGN_NAME)' from netlist…"
208
- link_design $::env(DESIGN_NAME)
232
+ log_cmd link_design $::env(DESIGN_NAME)
209
233
  set_global_vars
210
234
  read_current_sdc
211
235
  }
@@ -219,27 +243,27 @@ proc read_timing_info {args} {
219
243
  return
220
244
  }
221
245
  set corner_name $::env(_CURRENT_CORNER_NAME)
222
- log_cm define_corners $corner_name
246
+ log_cmd define_corners $corner_name
223
247
 
224
248
  puts "Reading timing models for corner $corner_name…"
225
249
 
226
250
  foreach lib $::env(_CURRENT_CORNER_LIBS) {
227
251
  puts "Reading cell library for the '$corner_name' corner at '$lib'…"
228
- read_liberty -corner $corner_name $lib
252
+ log_cmd read_liberty -corner $corner_name $lib
229
253
  }
230
254
 
231
255
  if { [info exists ::env(EXTRA_LIBS) ] } {
232
256
  puts "Reading explicitly-specified extra libs for $corner_name…"
233
257
  foreach extra_lib $::env(EXTRA_LIBS) {
234
258
  puts "Reading extra timing library for the '$corner_name' corner at '$extra_lib'…"
235
- read_liberty -corner $corner_name $extra_lib
259
+ log_cmd read_liberty -corner $corner_name $extra_lib
236
260
  }
237
261
  }
238
262
 
239
263
  set blackbox_wildcard {/// sta-blackbox}
240
264
  foreach nl $::env(_CURRENT_CORNER_NETLISTS) {
241
265
  puts "Reading macro netlist at '$nl'…"
242
- if { [catch {read_verilog $nl} err] } {
266
+ if { [catch {log_cmd read_verilog $nl} err] } {
243
267
  puts stderr "Error while reading macro netlist '$nl':"
244
268
  puts stderr $err
245
269
  puts stderr "Make sure that this a gate-level netlist and not an RTL file."
@@ -250,7 +274,7 @@ proc read_timing_info {args} {
250
274
  foreach verilog_file $::env(EXTRA_VERILOG_MODELS) {
251
275
  if { [string_in_file $verilog_file $blackbox_wildcard] } {
252
276
  puts "Found '$blackbox_wildcard' in '$verilog_file', skipping…"
253
- } elseif { [catch {puts "Reading Verilog model at '$verilog_file'…"; read_verilog $verilog_file} err] } {
277
+ } elseif { [catch {puts "Reading Verilog model at '$verilog_file'…"; log_cmd read_verilog $verilog_file} err] } {
254
278
  puts stderr "Error while reading $verilog_file:"
255
279
  puts stderr $err
256
280
  puts stderr "Make sure that this a gate-level netlist and not an RTL file, otherwise, you can add the following comment '$blackbox_wildcard' in the file to skip it and blackbox the modules inside if needed."
@@ -277,7 +301,7 @@ proc read_spefs {} {
277
301
  if { [info exists ::env(_CURRENT_SPEF_BY_CORNER)] } {
278
302
  set corner_name $::env(_CURRENT_CORNER_NAME)
279
303
  puts "Reading top-level design parasitics for the '$corner_name' corner at '$::env(_CURRENT_SPEF_BY_CORNER)'…"
280
- read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
304
+ log_cmd read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
281
305
  }
282
306
  if { [info exists ::env(_CURRENT_CORNER_SPEFS)] } {
283
307
  set corner_name $::env(_CURRENT_CORNER_NAME)
@@ -285,7 +309,7 @@ proc read_spefs {} {
285
309
  set instance_path [lshift spefs]
286
310
  foreach spef $spefs {
287
311
  puts "Reading '$instance_path' parasitics for the '$corner_name' corner at '$spef'…"
288
- read_spef -corner $corner_name -path $instance_path $spef
312
+ log_cmd read_spef -corner $corner_name -path $instance_path $spef
289
313
  }
290
314
  }
291
315
  }
@@ -298,7 +322,7 @@ proc read_spefs {} {
298
322
  if { "[get_property $cell ref_name]" eq "$module_name"} {
299
323
  set instance_path [get_property $cell full_name]
300
324
  puts "Reading '$instance_path' parasitics for the '$corner_name' corner at '$spef'…"
301
- read_spef -corner $corner_name -path $instance_path $spef
325
+ log_cmd read_spef -corner $corner_name -path $instance_path $spef
302
326
  }
303
327
  }
304
328
  }
@@ -318,7 +342,7 @@ proc read_pnr_libs {args} {
318
342
  lappend corner_names $corner_name
319
343
  }
320
344
 
321
- define_corners {*}[array name corner]
345
+ log_cmd define_corners {*}[array name corner]
322
346
 
323
347
  foreach corner_name [array name corner] {
324
348
  puts "Reading timing models for corner $corner_name…"
@@ -326,14 +350,14 @@ proc read_pnr_libs {args} {
326
350
  set corner_models $corner($corner_name)
327
351
  foreach model $corner_models {
328
352
  puts "Reading timing library for the '$corner_name' corner at '$model'…"
329
- read_liberty -corner $corner_name $model
353
+ log_cmd read_liberty -corner $corner_name $model
330
354
  }
331
355
 
332
356
  if { [info exists ::env(EXTRA_LIBS) ] } {
333
357
  puts "Reading explicitly-specified extra libs for $corner_name…"
334
358
  foreach extra_lib $::env(EXTRA_LIBS) {
335
359
  puts "Reading extra timing library for the '$corner_name' corner at '$extra_lib'…"
336
- read_liberty -corner $corner_name $extra_lib
360
+ log_cmd read_liberty -corner $corner_name $extra_lib
337
361
  }
338
362
  }
339
363
  }
@@ -343,7 +367,7 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
343
367
  set tlef $::env($tlef_key)
344
368
 
345
369
  puts "Reading technology LEF file at '$tlef'…"
346
- read_lef $tlef
370
+ log_cmd read_lef $tlef
347
371
 
348
372
  # Make fake I/O sites
349
373
  if { [info exists ::env(PAD_FAKE_SITES)] } {
@@ -352,7 +376,7 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
352
376
  set height [lindex $size 1]
353
377
 
354
378
  puts "Making fake IO site $site_name…"
355
- make_fake_io_site -name $site_name -width $width -height $height
379
+ log_cmd make_fake_io_site -name $site_name -width $width -height $height
356
380
  }
357
381
  }
358
382
  }
@@ -360,24 +384,24 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
360
384
  proc read_other_lefs {} {
361
385
  foreach lef $::env(CELL_LEFS) {
362
386
  puts "Reading cell LEF file at '$lef'…"
363
- read_lef $lef
387
+ log_cmd read_lef $lef
364
388
  }
365
389
  if { [info exist ::env(MACRO_LEFS)] } {
366
390
  foreach lef $::env(MACRO_LEFS) {
367
391
  puts "Reading macro LEF file at '$lef'…"
368
- read_lef $lef
392
+ log_cmd read_lef $lef
369
393
  }
370
394
  }
371
395
  if { [info exist ::env(PAD_LEFS)] } {
372
396
  foreach lef $::env(PAD_LEFS) {
373
397
  puts "Reading gpio pad LEF file at '$lef'…"
374
- read_lef $lef
398
+ log_cmd read_lef $lef
375
399
  }
376
400
  }
377
401
  if { [info exist ::env(EXTRA_LEFS)] } {
378
402
  foreach lef $::env(EXTRA_LEFS) {
379
403
  puts "Reading extra LEF file at '$lef'…"
380
- read_lef $lef
404
+ log_cmd read_lef $lef
381
405
  }
382
406
  }
383
407
  }
@@ -398,7 +422,7 @@ proc read_current_odb {args} {
398
422
 
399
423
  read_pnr_libs
400
424
  puts "Reading OpenROAD database at '$::env(CURRENT_ODB)'…"
401
- if { [ catch {read_db $::env(CURRENT_ODB)} errmsg ]} {
425
+ if { [ catch {log_cmd read_db $::env(CURRENT_ODB)} errmsg ]} {
402
426
  puts stderr $errmsg
403
427
  exit 1
404
428
  }