librelane 3.0.0.dev34__tar.gz → 3.0.0.dev35__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 (172) hide show
  1. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/PKG-INFO +1 -1
  2. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/cli.py +79 -5
  3. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/pyproject.toml +1 -1
  4. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/Readme.md +0 -0
  5. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/__init__.py +0 -0
  6. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/__main__.py +0 -0
  7. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/__version__.py +0 -0
  8. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/__init__.py +0 -0
  9. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/cli.py +0 -0
  10. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/drc.py +0 -0
  11. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/generic_dict.py +0 -0
  12. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/metrics/__init__.py +0 -0
  13. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/metrics/__main__.py +0 -0
  14. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/metrics/library.py +0 -0
  15. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/metrics/metric.py +0 -0
  16. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/metrics/util.py +0 -0
  17. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/misc.py +0 -0
  18. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/ring_buffer.py +0 -0
  19. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/tcl.py +0 -0
  20. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/toolbox.py +0 -0
  21. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/tpe.py +0 -0
  22. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/common/types.py +0 -0
  23. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/config/__init__.py +0 -0
  24. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/config/__main__.py +0 -0
  25. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/config/config.py +0 -0
  26. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/config/flow.py +0 -0
  27. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/config/pdk_compat.py +0 -0
  28. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/config/preprocessor.py +0 -0
  29. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/config/removals.py +0 -0
  30. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/config/variable.py +0 -0
  31. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/container.py +0 -0
  32. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/env_info.py +0 -0
  33. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm/config.yaml +0 -0
  34. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm/pin_order.cfg +0 -0
  35. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm/src/impl.sdc +0 -0
  36. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm/src/signoff.sdc +0 -0
  37. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm/src/spm.v +0 -0
  38. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm/verify/spm_tb.v +0 -0
  39. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  40. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  41. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  42. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
  43. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  44. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  45. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  46. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/__init__.py +0 -0
  47. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/builtins.py +0 -0
  48. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/classic.py +0 -0
  49. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/flow.py +0 -0
  50. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/misc.py +0 -0
  51. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/optimizing.py +0 -0
  52. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/sequential.py +0 -0
  53. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/flows/synth_explore.py +0 -0
  54. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/help/__main__.py +0 -0
  55. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/logging/__init__.py +0 -0
  56. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/logging/logger.py +0 -0
  57. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/pdk_hashes.yaml +0 -0
  58. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/plugins.py +0 -0
  59. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/py.typed +0 -0
  60. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/base.sdc +0 -0
  61. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/klayout/Readme.md +0 -0
  62. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/klayout/open_design.py +0 -0
  63. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/klayout/render.py +0 -0
  64. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/klayout/stream_out.py +0 -0
  65. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  66. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/klayout/xor.drc +0 -0
  67. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/Readme.md +0 -0
  68. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/common/read.tcl +0 -0
  69. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
  70. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/def/mag.tcl +0 -0
  71. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
  72. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/drc.tcl +0 -0
  73. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/extract_spice.tcl +0 -0
  74. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
  75. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
  76. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
  77. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
  78. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/get_bbox.tcl +0 -0
  79. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
  80. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/lef/maglef.tcl +0 -0
  81. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/lef.tcl +0 -0
  82. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/open.tcl +0 -0
  83. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/magic/wrapper.tcl +0 -0
  84. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/netgen/setup.tcl +0 -0
  85. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  86. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  87. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
  88. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/contextualize.py +0 -0
  89. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/defutil.py +0 -0
  90. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/diodes.py +0 -0
  91. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  92. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/eco_buffer.py +0 -0
  93. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/eco_diode.py +0 -0
  94. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  95. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/io_place.py +0 -0
  96. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  97. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  98. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  99. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/lefutil.py +0 -0
  100. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/placers.py +0 -0
  101. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/power_utils.py +0 -0
  102. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/random_place.py +0 -0
  103. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/reader.py +0 -0
  104. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  105. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  106. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  107. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  108. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  109. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/basic_mp.tcl +0 -0
  110. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  111. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/dpl.tcl +0 -0
  112. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  113. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/grt.tcl +0 -0
  114. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/io.tcl +0 -0
  115. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
  116. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/resizer.tcl +0 -0
  117. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
  118. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  119. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
  120. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
  121. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  122. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/cts.tcl +0 -0
  123. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/cut_rows.tcl +0 -0
  124. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/dpl.tcl +0 -0
  125. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/drt.tcl +0 -0
  126. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/dump_rc.tcl +0 -0
  127. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/fill.tcl +0 -0
  128. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/floorplan.tcl +0 -0
  129. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/gpl.tcl +0 -0
  130. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/grt.tcl +0 -0
  131. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/gui.tcl +0 -0
  132. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
  133. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/ioplacer.tcl +0 -0
  134. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/irdrop.tcl +0 -0
  135. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/pdn.tcl +0 -0
  136. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/rcx.tcl +0 -0
  137. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/repair_design.tcl +0 -0
  138. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
  139. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
  140. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
  141. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
  142. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/sta/corner.tcl +0 -0
  143. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/tapcell.tcl +0 -0
  144. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/ungpl.tcl +0 -0
  145. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/write_cdl.tcl +0 -0
  146. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/openroad/write_views.tcl +0 -0
  147. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  148. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/pyosys/json_header.py +0 -0
  149. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/pyosys/synthesize.py +0 -0
  150. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/pyosys/ys_common.py +0 -0
  151. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/scripts/tclsh/hello.tcl +0 -0
  152. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/state/__init__.py +0 -0
  153. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/state/__main__.py +0 -0
  154. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/state/design_format.py +0 -0
  155. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/state/state.py +0 -0
  156. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/__init__.py +0 -0
  157. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/__main__.py +0 -0
  158. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/checker.py +0 -0
  159. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/common_variables.py +0 -0
  160. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/cvc_rv.py +0 -0
  161. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/klayout.py +0 -0
  162. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/magic.py +0 -0
  163. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/misc.py +0 -0
  164. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/netgen.py +0 -0
  165. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/odb.py +0 -0
  166. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/openroad.py +0 -0
  167. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/openroad_alerts.py +0 -0
  168. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/pyosys.py +0 -0
  169. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/step.py +0 -0
  170. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/tclstep.py +0 -0
  171. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/verilator.py +0 -0
  172. {librelane-3.0.0.dev34 → librelane-3.0.0.dev35}/librelane/steps/yosys.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: librelane
3
- Version: 3.0.0.dev34
3
+ Version: 3.0.0.dev35
4
4
  Summary: An infrastructure for implementing chip design flows
5
5
  Home-page: https://github.com/librelane/librelane
6
6
  License: Apache-2.0
@@ -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");
@@ -12,6 +16,7 @@
12
16
  # See the License for the specific language governing permissions and
13
17
  # limitations under the License.
14
18
  import os
19
+ import sys
15
20
  from functools import partial, wraps
16
21
  from concurrent.futures import ThreadPoolExecutor
17
22
  from typing import Optional, Union
@@ -21,12 +26,15 @@ from click import (
21
26
  Parameter,
22
27
  echo,
23
28
  )
29
+ from click.formatting import join_options
24
30
  from cloup import (
25
31
  option,
26
32
  argument,
27
33
  option_group,
28
34
  Choice,
29
- Path,
35
+ Argument,
36
+ Option as CloupOption,
37
+ Path as CloupPath,
30
38
  )
31
39
  from cloup.constraints import (
32
40
  mutually_exclusive,
@@ -39,6 +47,70 @@ from ..logging import set_log_level, verbose, err, options, LogLevels
39
47
  from ..state import State, InvalidState
40
48
 
41
49
 
50
+ class Option(CloupOption):
51
+ """
52
+ A slight modification of cloup.Option that consumes the environment
53
+ variable(s) in envvar upon use.
54
+ """
55
+
56
+ def resolve_envvar_value(self, ctx: Context) -> Optional[str]:
57
+ if self.envvar is None:
58
+ return None
59
+ evs = self.envvar
60
+ if isinstance(evs, str):
61
+ evs = [evs]
62
+ for envvar in self.envvar:
63
+ rv = os.environ.pop(envvar, None)
64
+ if rv:
65
+ return rv
66
+ return None
67
+
68
+
69
+ class Path(CloupPath):
70
+ """
71
+ A modification of cloup.Path that rejects paths starting with a tilde (~)
72
+ as too ambiguous. This is because of user confusion.
73
+ """
74
+
75
+ def convert(
76
+ self,
77
+ value: Union[str, os.PathLike],
78
+ param: Optional[Parameter],
79
+ ctx: Optional[Context],
80
+ ):
81
+ value = str(value)
82
+ assert param is not None
83
+ assert ctx is not None
84
+
85
+ is_cmd = False
86
+ if sys.platform == "win32":
87
+ import psutil
88
+
89
+ is_cmd = psutil.Process(os.getppid()).name().lower().endswith("cmd.exe")
90
+ if not is_cmd and value.startswith("~"):
91
+ usage, _ = join_options(param.opts)
92
+ if isinstance(param, Argument):
93
+ usage = ""
94
+ buffer = f"'{value}' starts with a tilde, which is ambiguous.\n"
95
+ buffer += " * If you meant your home directory, make sure your POSIX shell is able to expand the tilde:\n"
96
+ buffer += f" * GOOD: {ctx.command_path} {usage} {value} …\n"
97
+ if usage != "":
98
+ buffer += f" * BAD: {ctx.command_path} {usage}={value} …\n"
99
+ buffer += f' * BAD: {ctx.command_path} {usage} "{value}" …\n'
100
+ env_vars = []
101
+ if param.envvar is not None:
102
+ if isinstance(param.envvar, str):
103
+ env_vars = [param.envvar]
104
+ else:
105
+ env_vars = list(param.envvar)
106
+ for var in env_vars:
107
+ buffer += f" * GOOD: {var}={value} {ctx.command_path} …\n"
108
+ buffer += f' * BAD: {var}="{value}" {ctx.command_path} …\n'
109
+ buffer += ' * If you want a relative file or directory that starts with a literal "~", use an absolute path.\n'
110
+ self.fail(buffer, param, ctx)
111
+ return super().convert(value, param, ctx)
112
+
113
+
42
114
  def set_log_level_cb(
43
115
  ctx: Context,
44
116
  param: Parameter,
@@ -181,7 +253,7 @@ def cloup_flow_opts(
181
253
  Ciel is used by default for this CLI or not.
182
254
  :returns: The wrapper
183
255
  """
184
- o = partial(option, show_default=True)
256
+ o = partial(option, cls=CloupOption, show_default=True)
185
257
 
186
258
  def decorate(f):
187
259
  if config_options:
@@ -355,21 +427,23 @@ def cloup_flow_opts(
355
427
  dir_okay=True,
356
428
  ),
357
429
  is_eager=True,
358
- default=os.environ.pop("PDK_ROOT", None),
430
+ envvar=["PDK_ROOT"],
359
431
  help="Override Ciel PDK root folder. Required if Ciel is not installed, but a default value can also be set via the environment variable PDK_ROOT.",
360
432
  ),
361
433
  o(
362
434
  "-p",
363
435
  "--pdk",
364
436
  type=str,
365
- default=os.environ.pop("PDK", "sky130A"),
437
+ envvar=["PDK"],
438
+ default="sky130A",
366
439
  help="The process design kit to use.",
367
440
  ),
368
441
  o(
369
442
  "-s",
370
443
  "--scl",
371
444
  type=str,
372
- default=os.environ.pop("STD_CELL_LIBRARY", None),
445
+ envvar=["STD_CELL_LIBRARY"],
446
+ # no default, default is obtained dynamically from PDK
373
447
  help="The standard cell library to use. If None, the PDK's default standard cell library is used.",
374
448
  ),
375
449
  )(f)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "librelane"
3
- version = "3.0.0.dev34"
3
+ version = "3.0.0.dev35"
4
4
  description = "An infrastructure for implementing chip design flows"
5
5
  # Technically, maintainer. We cannot use the maintainers field until
6
6
  # poetry-core>=2.0.0 which requires Python version 3.9+. This field does