librelane 3.0.0.dev41__tar.gz → 3.0.0.dev42__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (174) hide show
  1. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/PKG-INFO +1 -1
  2. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/__init__.py +1 -1
  3. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/__main__.py +4 -1
  4. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/tcl.py +2 -1
  5. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/container.py +7 -4
  6. librelane-3.0.0.dev42/librelane/examples/hold_eco_demo/config.yaml +18 -0
  7. librelane-3.0.0.dev42/librelane/examples/hold_eco_demo/demo.v +27 -0
  8. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/cli.py +24 -11
  9. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/defutil.py +9 -3
  10. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/eco_buffer.py +3 -2
  11. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/eco_diode.py +3 -3
  12. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/__main__.py +3 -2
  13. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/checker.py +7 -8
  14. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/klayout.py +9 -0
  15. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/misc.py +5 -0
  16. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/odb.py +32 -0
  17. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/openroad.py +0 -5
  18. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/pyosys.py +6 -0
  19. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/yosys.py +9 -1
  20. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/pyproject.toml +7 -1
  21. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/Readme.md +0 -0
  22. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/__version__.py +0 -0
  23. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/__init__.py +0 -0
  24. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/cli.py +0 -0
  25. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/drc.py +0 -0
  26. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/generic_dict.py +0 -0
  27. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/metrics/__init__.py +0 -0
  28. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/metrics/__main__.py +0 -0
  29. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/metrics/library.py +0 -0
  30. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/metrics/metric.py +0 -0
  31. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/metrics/util.py +0 -0
  32. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/misc.py +0 -0
  33. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/ring_buffer.py +0 -0
  34. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/toolbox.py +0 -0
  35. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/tpe.py +0 -0
  36. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/common/types.py +0 -0
  37. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/config/__init__.py +0 -0
  38. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/config/__main__.py +0 -0
  39. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/config/config.py +0 -0
  40. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/config/flow.py +0 -0
  41. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/config/pdk_compat.py +0 -0
  42. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/config/preprocessor.py +0 -0
  43. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/config/removals.py +0 -0
  44. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/config/variable.py +0 -0
  45. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/env_info.py +0 -0
  46. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm/config.yaml +0 -0
  47. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm/pin_order.cfg +0 -0
  48. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm/src/impl.sdc +0 -0
  49. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm/src/signoff.sdc +0 -0
  50. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm/src/spm.v +0 -0
  51. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm/verify/spm_tb.v +0 -0
  52. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  53. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  54. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  55. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
  56. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  57. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  58. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  59. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/__init__.py +0 -0
  60. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/builtins.py +0 -0
  61. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/classic.py +0 -0
  62. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/flow.py +0 -0
  63. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/misc.py +0 -0
  64. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/optimizing.py +0 -0
  65. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/sequential.py +0 -0
  66. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/flows/synth_explore.py +0 -0
  67. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/help/__main__.py +0 -0
  68. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/logging/__init__.py +0 -0
  69. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/logging/logger.py +0 -0
  70. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/pdk_hashes.yaml +0 -0
  71. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/plugins.py +0 -0
  72. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/py.typed +0 -0
  73. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/base.sdc +0 -0
  74. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/klayout/Readme.md +0 -0
  75. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/klayout/open_design.py +0 -0
  76. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/klayout/render.py +0 -0
  77. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/klayout/stream_out.py +0 -0
  78. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  79. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/klayout/xor.drc +0 -0
  80. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/Readme.md +0 -0
  81. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/common/read.tcl +0 -0
  82. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
  83. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/def/mag.tcl +0 -0
  84. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
  85. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/drc.tcl +0 -0
  86. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/extract_spice.tcl +0 -0
  87. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
  88. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
  89. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
  90. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
  91. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/get_bbox.tcl +0 -0
  92. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
  93. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/lef/maglef.tcl +0 -0
  94. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/lef.tcl +0 -0
  95. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/open.tcl +0 -0
  96. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/magic/wrapper.tcl +0 -0
  97. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/netgen/setup.tcl +0 -0
  98. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  99. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  100. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
  101. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/contextualize.py +0 -0
  102. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/diodes.py +0 -0
  103. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  104. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  105. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/io_place.py +0 -0
  106. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  107. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  108. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  109. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/lefutil.py +0 -0
  110. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/placers.py +0 -0
  111. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/power_utils.py +0 -0
  112. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/random_place.py +0 -0
  113. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/reader.py +0 -0
  114. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  115. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  116. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  117. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  118. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  119. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/basic_mp.tcl +0 -0
  120. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  121. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/dpl.tcl +0 -0
  122. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  123. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/grt.tcl +0 -0
  124. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/io.tcl +0 -0
  125. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
  126. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/resizer.tcl +0 -0
  127. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
  128. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  129. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
  130. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
  131. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  132. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/cts.tcl +0 -0
  133. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/cut_rows.tcl +0 -0
  134. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/dpl.tcl +0 -0
  135. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/drt.tcl +0 -0
  136. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/dump_rc.tcl +0 -0
  137. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/fill.tcl +0 -0
  138. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/floorplan.tcl +0 -0
  139. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/gpl.tcl +0 -0
  140. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/grt.tcl +0 -0
  141. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/gui.tcl +0 -0
  142. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
  143. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/ioplacer.tcl +0 -0
  144. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/irdrop.tcl +0 -0
  145. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/pdn.tcl +0 -0
  146. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/rcx.tcl +0 -0
  147. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/repair_design.tcl +0 -0
  148. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
  149. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
  150. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
  151. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
  152. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/sta/corner.tcl +0 -0
  153. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/tapcell.tcl +0 -0
  154. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/ungpl.tcl +0 -0
  155. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/write_cdl.tcl +0 -0
  156. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/openroad/write_views.tcl +0 -0
  157. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  158. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/json_header.py +0 -0
  159. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/synthesize.py +0 -0
  160. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/ys_common.py +0 -0
  161. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/scripts/tclsh/hello.tcl +0 -0
  162. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/state/__init__.py +0 -0
  163. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/state/__main__.py +0 -0
  164. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/state/design_format.py +0 -0
  165. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/state/state.py +0 -0
  166. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/__init__.py +0 -0
  167. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/common_variables.py +0 -0
  168. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/cvc_rv.py +0 -0
  169. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/magic.py +0 -0
  170. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/netgen.py +0 -0
  171. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/openroad_alerts.py +0 -0
  172. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/step.py +0 -0
  173. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/tclstep.py +0 -0
  174. {librelane-3.0.0.dev41 → librelane-3.0.0.dev42}/librelane/steps/verilator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: librelane
3
- Version: 3.0.0.dev41
3
+ Version: 3.0.0.dev42
4
4
  Summary: An infrastructure for implementing chip design flows
5
5
  License-Expression: Apache-2.0
6
6
  Maintainer: Mohamed Gaber
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  """
15
15
  The LibreLane API
16
- ----------------
16
+ -----------------
17
17
 
18
18
  Documented elements of this API represent the primary programming interface for
19
19
  the LibreLane infrastructure.
@@ -217,7 +217,10 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool):
217
217
  if len(discovered_plugins) > 0:
218
218
  print("Discovered plugins:")
219
219
  for name, module in discovered_plugins.items():
220
- print(f"{name} -> {module.__version__}")
220
+ if hasattr(module, "__version__"):
221
+ print(f"{name} -> {module.__version__}")
222
+ else:
223
+ print(f"{name}")
221
224
 
222
225
  ctx.exit(0)
223
226
 
@@ -16,7 +16,6 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
  import re
19
- import tkinter
20
19
  from typing import Dict, Mapping, Any, Iterable
21
20
 
22
21
  _env_rx = re.compile(r"(?:\:\:)?env\((\w+)\)")
@@ -59,6 +58,8 @@ class TclUtils(object):
59
58
 
60
59
  @staticmethod
61
60
  def _eval_env(env_in: Mapping[str, Any], tcl_in: str) -> Dict[str, Any]:
61
+ import tkinter
62
+
62
63
  interpreter = tkinter.Tcl()
63
64
 
64
65
  interpreter.eval("array unset ::env")
@@ -57,10 +57,13 @@ def gui_args(osinfo: OSInfo) -> List[str]:
57
57
  args += [
58
58
  "-e",
59
59
  f"DISPLAY={os.environ.get('DISPLAY')}",
60
- "-v",
61
- "/tmp/.X11-unix:/tmp/.X11-unix",
62
- "-v",
63
- f"{os.path.expanduser('~')}/.Xauthority:/.Xauthority",
60
+ ]
61
+ if os.path.isdir("/tmp/.X11-unix"):
62
+ args += ["-v", "/tmp/.X11-unix:/tmp/.X11-unix"]
63
+ homedir = os.path.expanduser("~")
64
+ if os.path.isfile(f"{homedir}/.Xauthority"):
65
+ args += ["-v", f"{homedir}/.Xauthority:/.Xauthority"]
66
+ args += [
64
67
  "--network",
65
68
  "host",
66
69
  "--security-opt",
@@ -0,0 +1,18 @@
1
+ DESIGN_NAME: hold_violation
2
+ CLOCK_PORT: clk
3
+ CLOCK_PERIOD: 5
4
+ VERILOG_FILES: dir::demo.v
5
+ RUN_POST_CTS_RESIZER_TIMING: false
6
+ RUN_POST_GRT_RESIZER_TIMING: false
7
+ FP_SIZING: absolute
8
+ DIE_AREA: [0, 0, 100, 100]
9
+ INSERT_ECO_BUFFERS:
10
+ - target: u_ff1/Q
11
+ buffer: sky130_fd_sc_hd__buf_1
12
+ - target: u_ff1/Q
13
+ buffer: sky130_fd_sc_hd__buf_1
14
+ meta:
15
+ flow: Classic
16
+ substituting_steps:
17
+ "+OpenROAD.DetailedRouting": "Odb.InsertECOBuffers"
18
+ "+Odb.InsertECOBuffers": "OpenROAD.DetailedRouting"
@@ -0,0 +1,27 @@
1
+ module hold_violation(
2
+ input clk,
3
+ input d,
4
+ output q
5
+ );
6
+ wire intermediate;
7
+ wire clk_delayed;
8
+
9
+ sky130_fd_sc_hd__clkbuf_4 dly (
10
+ .A(clk),
11
+ .X(clk_delayed)
12
+ );
13
+
14
+ sky130_fd_sc_hd__dfrtp_4 u_ff1 (
15
+ .CLK(clk),
16
+ .D(d),
17
+ .RESET_B(1'b1),
18
+ .Q(intermediate)
19
+ );
20
+
21
+ sky130_fd_sc_hd__dfrtp_1 u_ff2 (
22
+ .CLK(clk_delayed),
23
+ .D(intermediate),
24
+ .RESET_B(1'b1),
25
+ .Q(q)
26
+ );
27
+ endmodule
@@ -43,7 +43,7 @@ from cloup.typing import Decorator
43
43
 
44
44
  from .flow import Flow
45
45
  from ..common import set_tpe, cli, get_pdk_hash, _get_process_limit
46
- from ..logging import set_log_level, verbose, err, options, LogLevels
46
+ from ..logging import set_log_level, verbose, info, err, options, LogLevels
47
47
  from ..state import State, InvalidState
48
48
 
49
49
 
@@ -520,16 +520,29 @@ def cloup_flow_opts(
520
520
  err(f"Could not resolve the PDK '{pdk}'.")
521
521
  exit(1)
522
522
 
523
- version = ciel.fetch(
524
- ciel_home,
525
- pdk_family,
526
- opdks_rev,
527
- data_source=StaticWebDataSource(
528
- "https://fossi-foundation.github.io/ciel-releases"
529
- ),
530
- include_libraries=include_libraries,
531
- )
532
- pdk_root = version.get_dir(ciel_home)
523
+ if pdk_family == "ihp-sg13g2":
524
+ err(
525
+ "The IHP Open PDK is only supported in the development version of LibreLane, specifically 3.0.0.dev28 or higher."
526
+ )
527
+ info(
528
+ "If you're using Nix, switch to the 'dev' branch. If you're using the Python package, run \"python3 -m pip install 'librelane>=3.0.0.dev28'\"."
529
+ )
530
+ exit(1)
531
+
532
+ try:
533
+ version = ciel.fetch(
534
+ ciel_home,
535
+ pdk_family,
536
+ opdks_rev,
537
+ data_source=StaticWebDataSource(
538
+ "https://fossi-foundation.github.io/ciel-releases"
539
+ ),
540
+ include_libraries=include_libraries,
541
+ )
542
+ pdk_root = version.get_dir(ciel_home)
543
+ except ValueError as e:
544
+ err(f"Failed to download PDK: {e}")
545
+ exit(1)
533
546
 
534
547
  return f(*args, pdk_root=pdk_root, pdk=pdk, scl=scl, **kwargs)
535
548
 
@@ -248,13 +248,19 @@ def relocate_pins(db, input_lefs, template_def, permissive, copy_def_power=False
248
248
  pin_name = bterm.getName()
249
249
  pin_net_name = bterm.getNet().getName()
250
250
  pin_net = output_block.findNet(pin_net_name)
251
+ new_net_created = False
251
252
  if pin_net is None:
252
253
  pin_net = odb.dbNet.create(output_block, pin_net_name, True)
253
254
  pin_net.setSpecial()
254
255
  pin_net.setSigType(bterm.getSigType())
255
- pin_bterm = odb.dbBTerm.create(pin_net, pin_name)
256
- pin_bterm.setSigType(bterm.getSigType())
257
- output_bterms.append(pin_bterm)
256
+ new_net_created = True
257
+ pin_bterm = output_block.findBTerm(pin_name)
258
+ if pin_bterm is None:
259
+ pin_bterm = odb.dbBTerm.create(pin_net, pin_name)
260
+ pin_bterm.setSigType(bterm.getSigType())
261
+ output_bterms.append(pin_bterm)
262
+ elif new_net_created:
263
+ pin_bterm.connect(pin_net)
258
264
 
259
265
  grid_errors = False
260
266
  for output_bterm in output_bterms:
@@ -43,8 +43,9 @@ def cli(reader):
43
43
  grt_inc = GRT.IncrementalGRoute(grt, reader.block)
44
44
  i = 0
45
45
 
46
- for target_info in reader.config["INSERT_ECO_BUFFERS"]:
47
- target_name, target_pin = target_info["target"].rsplit("/", 1)
46
+ eco_buffers = reader.config["INSERT_ECO_BUFFERS"] or []
47
+ for target_info in eco_buffers:
48
+ target_name, target_pin = target_info["target"].split("/")
48
49
  name_escaped = reader.escape_verilog_name(target_name)
49
50
  buffer_master = target_info["buffer"]
50
51
 
@@ -38,9 +38,9 @@ def cli(reader):
38
38
  # print(grt)
39
39
  grt_inc = GRT.IncrementalGRoute(grt, reader.block)
40
40
  i = 0
41
-
42
- for target_info in reader.config["INSERT_ECO_DIODES"]:
43
- target_name, target_pin = target_info["target"].rsplit("/", 1)
41
+ diodes = reader.config["INSERT_ECO_DIODES"] or []
42
+ for target_info in diodes:
43
+ target_name, target_pin = target_info["target"].split("/")
44
44
  name_escaped = reader.escape_verilog_name(target_name)
45
45
 
46
46
  target = reader.block.findInst(name_escaped)
@@ -47,8 +47,9 @@ def load_step_from_inputs(
47
47
  if Found := Step.factory.get(id):
48
48
  Target = Found
49
49
  else:
50
- err(
51
- f"No step registered with id '{id}'. Ensure all relevant plugins are installed."
50
+ err(f"No step registered with id '{id}'.")
51
+ info(
52
+ f"If the step '{id}' is part of a plugin, make sure the plugin's parent directory is in the PYTHONPATH environment variable."
52
53
  )
53
54
  ctx.exit(-1)
54
55
 
@@ -79,22 +79,21 @@ class MetricChecker(Step):
79
79
  deferred: ClassVar[bool] = True
80
80
  error_on_var: Optional[Variable] = None
81
81
 
82
- @classmethod
83
- def get_help_md(Self, **kwargs): # pragma: no cover
84
- threshold_string = Self.get_threshold_description(None)
82
+ def __init_subclass__(cls):
83
+ threshold_string = cls.get_threshold_description(None)
85
84
  if threshold_string is None:
86
- threshold_string = str(Self.get_threshold(None))
85
+ threshold_string = str(cls.get_threshold(None))
87
86
  dynamic_docstring = "Raises"
88
- if Self.deferred:
87
+ if cls.deferred:
89
88
  dynamic_docstring += " a deferred error"
90
89
  else:
91
90
  dynamic_docstring += " an immediate error"
92
- dynamic_docstring += f" if {Self.metric_description} (metric: ``{Self.metric_name}``) are >= {threshold_string}."
91
+ dynamic_docstring += f" if {cls.metric_description} (metric: ``{cls.metric_name}``) are >= {threshold_string}."
93
92
  dynamic_docstring += (
94
93
  " Doesn't raise an error depending on error_on_var if defined."
95
94
  )
96
-
97
- return super().get_help_md(docstring_override=dynamic_docstring, **kwargs)
95
+ cls.__doc__ = dynamic_docstring
96
+ return super().__init_subclass__()
98
97
 
99
98
  def get_threshold(self: Optional["MetricChecker"]) -> Optional[Decimal]:
100
99
  return Decimal(0)
@@ -353,6 +353,15 @@ class XOR(KLayoutStep):
353
353
 
354
354
  @Step.factory.register()
355
355
  class DRC(KLayoutStep):
356
+ """
357
+ Runs DRC using KLayout.
358
+
359
+ Unlike most steps, the KLayout scripts vary quite wildly by PDK. If a PDK
360
+ is not supported by this step, it will simply be skipped.
361
+
362
+ Currently, only sky130A and sky130B are supported.
363
+ """
364
+
356
365
  id = "KLayout.DRC"
357
366
  name = "Design Rule Check (KLayout)"
358
367
 
@@ -53,6 +53,11 @@ class LoadBaseSDC(Step):
53
53
 
54
54
  @Step.factory.register()
55
55
  class ReportManufacturability(Step):
56
+ """
57
+ Logs a simple "manufacturability report", i.e., the status of DRC, LVS, and
58
+ antenna violations.
59
+ """
60
+
56
61
  id = "Misc.ReportManufacturability"
57
62
  name = "Report Manufacturability"
58
63
  long_name = "Report Manufacturability (DRC, LVS, Antenna)"
@@ -184,6 +184,10 @@ class OdbpyStep(Step):
184
184
 
185
185
  @Step.factory.register()
186
186
  class CheckMacroAntennaProperties(OdbpyStep):
187
+ """
188
+ Prints warnings if the LEF views of macros are missing antenna information.
189
+ """
190
+
187
191
  id = "Odb.CheckMacroAntennaProperties"
188
192
  name = "Check Antenna Properties of Macros Pins in Their LEF Views"
189
193
  inputs = OdbpyStep.inputs
@@ -221,6 +225,10 @@ class CheckMacroAntennaProperties(OdbpyStep):
221
225
 
222
226
  @Step.factory.register()
223
227
  class CheckDesignAntennaProperties(CheckMacroAntennaProperties):
228
+ """
229
+ Prints warnings if the LEF view of the design is missing antenna information.
230
+ """
231
+
224
232
  id = "Odb.CheckDesignAntennaProperties"
225
233
  name = "Check Antenna Properties of Pins in The Generated Design LEF view"
226
234
  inputs = CheckMacroAntennaProperties.inputs + [DesignFormat.LEF]
@@ -527,6 +535,11 @@ class ReportDisconnectedPins(OdbpyStep):
527
535
 
528
536
  @Step.factory.register()
529
537
  class AddRoutingObstructions(OdbpyStep):
538
+ """
539
+ Adds obstructions on metal layers which prevent shapes from being created in
540
+ the designated areas.
541
+ """
542
+
530
543
  id = "Odb.AddRoutingObstructions"
531
544
  name = "Add Obstructions"
532
545
  config_vars = [
@@ -569,6 +582,11 @@ class AddRoutingObstructions(OdbpyStep):
569
582
 
570
583
  @Step.factory.register()
571
584
  class RemoveRoutingObstructions(AddRoutingObstructions):
585
+ """
586
+ Removes any routing obstructions previously placed by
587
+ <#Odb.AddRoutingObstructions>`_.
588
+ """
589
+
572
590
  id = "Odb.RemoveRoutingObstructions"
573
591
  name = "Remove Obstructions"
574
592
 
@@ -578,6 +596,15 @@ class RemoveRoutingObstructions(AddRoutingObstructions):
578
596
 
579
597
  @Step.factory.register()
580
598
  class AddPDNObstructions(AddRoutingObstructions):
599
+ """
600
+ Adds obstructions on metal layers which prevent shapes from being created in
601
+ the designated areas.
602
+
603
+ A soft-duplicate of <#Odb.AddRoutingObstructions>`_ , though this one uses
604
+ a different variable name so the obstructions can be restricted for PDN
605
+ steps only.
606
+ """
607
+
581
608
  id = "Odb.AddPDNObstructions"
582
609
  name = "Add PDN obstructions"
583
610
 
@@ -595,6 +622,11 @@ class AddPDNObstructions(AddRoutingObstructions):
595
622
 
596
623
  @Step.factory.register()
597
624
  class RemovePDNObstructions(RemoveRoutingObstructions):
625
+ """
626
+ Removes any PDN obstructions previously placed by
627
+ <#Odb.RemovePDNObstructions>`_.
628
+ """
629
+
598
630
  id = "Odb.RemovePDNObstructions"
599
631
  name = "Remove PDN obstructions"
600
632
 
@@ -1518,11 +1518,6 @@ class GlobalPlacementSkipIO(_GlobalPlacement):
1518
1518
  "Path to a custom pin configuration file.",
1519
1519
  deprecated_names=["FP_PIN_ORDER_CFG"],
1520
1520
  ),
1521
- Variable(
1522
- "FP_DEF_TEMPLATE",
1523
- Optional[Path],
1524
- "Points to the DEF file to be used as a template.",
1525
- ),
1526
1521
  ]
1527
1522
 
1528
1523
  def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
@@ -327,6 +327,12 @@ class VerilogStep(PyosysStep):
327
327
 
328
328
  @Step.factory.register()
329
329
  class JsonHeader(VerilogStep):
330
+ """
331
+ Extracts a high-level hierarchical view of the circuit in JSON format,
332
+ including power connections. The power connections are used in later steps
333
+ to ensure macros and cells are connected as desired.
334
+ """
335
+
330
336
  id = "Yosys.JsonHeader"
331
337
  name = "Generate JSON Header"
332
338
  long_name = "Generate JSON Header"
@@ -258,6 +258,14 @@ class YosysStep(TclStep):
258
258
 
259
259
  @Step.factory.register()
260
260
  class EQY(Step):
261
+ """
262
+ Experimental: Uses the `EQY <https://github.com/yosyshq/eqy>`_ utility to
263
+ perform an RTL vs. Netlist equivalence check.
264
+
265
+ Currently, you are expected to provide your own EQY script if you want this
266
+ to work properly.
267
+ """
268
+
261
269
  id = "Yosys.EQY"
262
270
  name = "Equivalence Check"
263
271
  long_name = "RTL/Netlist Equivalence Check"
@@ -272,7 +280,7 @@ class EQY(Step):
272
280
  Variable(
273
281
  "EQY_SCRIPT",
274
282
  Optional[Path],
275
- "An optional override for the automatically generated EQY script for more complex designs.",
283
+ "The EQY script to use. If unset, a generic EQY script will be generated, but this fails in a number of scenarios.",
276
284
  ),
277
285
  Variable(
278
286
  "MACRO_PLACEMENT_CFG",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "librelane"
3
- version = "3.0.0.dev41"
3
+ version = "3.0.0.dev42"
4
4
  description = "An infrastructure for implementing chip design flows"
5
5
  maintainers = [
6
6
  {name = "Mohamed Gaber", email = "me@donn.website"}
@@ -68,6 +68,12 @@ librelane = "librelane.__main__:cli"
68
68
  "librelane.help" = "librelane.help.__main__:cli"
69
69
  "librelane.env_info" = "librelane:env_info_cli"
70
70
 
71
+ [tool.ruff]
72
+ # syntax-only check, make sure files are parseable under py310
73
+ # $ ruff check .
74
+ target-version = "py310"
75
+ lint.ignore = ["E", "F"]
76
+
71
77
  [build-system]
72
78
  requires = ["poetry-core>=2.0.0,<3"]
73
79
  build-backend = "poetry.core.masonry.api"