librelane 3.1.0.dev4__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 (178) hide show
  1. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/PKG-INFO +7 -5
  2. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/Readme.md +6 -4
  3. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/variable.py +2 -0
  4. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/io.tcl +30 -24
  5. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/gui.tcl +4 -4
  6. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/sta/corner.tcl +3 -3
  7. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/synthesize.py +24 -3
  8. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/pyosys.py +2 -2
  9. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/step.py +8 -5
  10. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/pyproject.toml +1 -1
  11. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/__init__.py +0 -0
  12. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/__main__.py +0 -0
  13. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/__version__.py +0 -0
  14. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/__init__.py +0 -0
  15. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/cli.py +0 -0
  16. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/drc.py +0 -0
  17. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/generic_dict.py +0 -0
  18. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/__init__.py +0 -0
  19. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/__main__.py +0 -0
  20. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/compare.py +0 -0
  21. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/library.py +0 -0
  22. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/metric.py +0 -0
  23. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/util.py +0 -0
  24. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/misc.py +0 -0
  25. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/ring_buffer.py +0 -0
  26. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/tcl.py +0 -0
  27. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/toolbox.py +0 -0
  28. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/tpe.py +0 -0
  29. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/types.py +0 -0
  30. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/__init__.py +0 -0
  31. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/__main__.py +0 -0
  32. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/config.py +0 -0
  33. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/flow.py +0 -0
  34. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/pdk_compat.py +0 -0
  35. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/preprocessor.py +0 -0
  36. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/removals.py +0 -0
  37. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/container.py +0 -0
  38. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/env_info.py +0 -0
  39. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/hold_eco_demo/config.yaml +0 -0
  40. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/hold_eco_demo/demo.v +0 -0
  41. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/config.yaml +0 -0
  42. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/pin_order.cfg +0 -0
  43. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/src/impl.sdc +0 -0
  44. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/src/signoff.sdc +0 -0
  45. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/src/spm.v +0 -0
  46. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/verify/spm_tb.v +0 -0
  47. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  48. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  49. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  50. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
  51. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  52. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  53. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  54. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/__init__.py +0 -0
  55. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/builtins.py +0 -0
  56. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/chip.py +0 -0
  57. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/classic.py +0 -0
  58. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/cli.py +0 -0
  59. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/flow.py +0 -0
  60. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/misc.py +0 -0
  61. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/optimizing.py +0 -0
  62. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/sequential.py +0 -0
  63. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/synth_explore.py +0 -0
  64. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/help/__main__.py +0 -0
  65. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/logging/__init__.py +0 -0
  66. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/logging/logger.py +0 -0
  67. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/pdk_hashes.yaml +0 -0
  68. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/plugins.py +0 -0
  69. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/py.typed +0 -0
  70. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/base.sdc +0 -0
  71. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/Readme.md +0 -0
  72. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/insert_cell.py +0 -0
  73. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/open_design.py +0 -0
  74. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/render.py +0 -0
  75. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/stream_out.py +0 -0
  76. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  77. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xor.drc +0 -0
  78. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/Readme.md +0 -0
  79. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/common/read.tcl +0 -0
  80. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
  81. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/mag.tcl +0 -0
  82. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
  83. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/drc.tcl +0 -0
  84. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/extract_spice.tcl +0 -0
  85. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
  86. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
  87. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
  88. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
  89. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/get_bbox.tcl +0 -0
  90. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
  91. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef/maglef.tcl +0 -0
  92. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef.tcl +0 -0
  93. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/open.tcl +0 -0
  94. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/spice_rcx.tcl +0 -0
  95. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/wrapper.tcl +0 -0
  96. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/netgen/setup.tcl +0 -0
  97. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  98. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  99. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
  100. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/contextualize.py +0 -0
  101. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/defutil.py +0 -0
  102. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/diodes.py +0 -0
  103. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  104. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/eco_buffer.py +0 -0
  105. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/eco_diode.py +0 -0
  106. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  107. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/io_place.py +0 -0
  108. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  109. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  110. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  111. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/lefutil.py +0 -0
  112. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/placers.py +0 -0
  113. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/power_utils.py +0 -0
  114. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/random_place.py +0 -0
  115. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/reader.py +0 -0
  116. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  117. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  118. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  119. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  120. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  121. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  122. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl.tcl +0 -0
  123. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  124. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/grt.tcl +0 -0
  125. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/pad_cfg.tcl +0 -0
  126. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
  127. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/resizer.tcl +0 -0
  128. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
  129. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  130. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
  131. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
  132. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  133. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/cts.tcl +0 -0
  134. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/cut_rows.tcl +0 -0
  135. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/dpl.tcl +0 -0
  136. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/drt.tcl +0 -0
  137. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/dump_rc.tcl +0 -0
  138. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/fill.tcl +0 -0
  139. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/floorplan.tcl +0 -0
  140. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/gpl.tcl +0 -0
  141. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/grt.tcl +0 -0
  142. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
  143. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/ioplacer.tcl +0 -0
  144. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/irdrop.tcl +0 -0
  145. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/pad.tcl +0 -0
  146. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/pdn.tcl +0 -0
  147. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rcx.tcl +0 -0
  148. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design.tcl +0 -0
  149. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
  150. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
  151. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
  152. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
  153. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/tapcell.tcl +0 -0
  154. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/ungpl.tcl +0 -0
  155. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/write_cdl.tcl +0 -0
  156. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/write_views.tcl +0 -0
  157. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  158. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/json_header.py +0 -0
  159. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/ys_common.py +0 -0
  160. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/tclsh/hello.tcl +0 -0
  161. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/state/__init__.py +0 -0
  162. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/state/__main__.py +0 -0
  163. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/state/design_format.py +0 -0
  164. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/state/state.py +0 -0
  165. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/__init__.py +0 -0
  166. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/__main__.py +0 -0
  167. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/checker.py +0 -0
  168. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/common_variables.py +0 -0
  169. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/klayout.py +0 -0
  170. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/magic.py +0 -0
  171. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/misc.py +0 -0
  172. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/netgen.py +0 -0
  173. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/odb.py +0 -0
  174. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/openroad.py +0 -0
  175. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/openroad_alerts.py +0 -0
  176. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/tclstep.py +0 -0
  177. {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/verilator.py +0 -0
  178. {librelane-3.1.0.dev4 → 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.dev4
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
@@ -80,7 +80,7 @@ LibreLane includes two reference flows (`Classic` and `Chip`) that are built
80
80
  entirely using open-source EDA tools.
81
81
 
82
82
  You can find the documentation
83
- [here](https://librelane.readthedocs.io/en/latest/getting_started/) to get
83
+ [here](https://librelane.readthedocs.io/en/stable/getting_started/) to get
84
84
  started. You can discuss LibreLane in the
85
85
  [FOSSi Chat Matrix Server](https://fossi-chat.org).
86
86
 
@@ -121,7 +121,7 @@ Works for macOS and Linux (x86-64 and aarch64). Recommended, as it is more
121
121
  integrated with your filesystem and overall has less upload and download deltas.
122
122
 
123
123
  See
124
- [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)
125
125
  in the docs for more info.
126
126
 
127
127
  ### Docker
@@ -129,7 +129,7 @@ in the docs for more info.
129
129
  Works for Windows, macOS and Linux (x86-64 and aarch64).
130
130
 
131
131
  See
132
- [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)
133
133
  in the docs for more info.
134
134
 
135
135
  Do note you'll need to add `--dockerized` right after `librelane` in most CLI
@@ -145,7 +145,9 @@ python3 -m pip install --upgrade librelane
145
145
  ```
146
146
 
147
147
  Python-only installations are presently unsupported and entirely at your own
148
- 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.
149
151
 
150
152
  ## Usage
151
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
 
@@ -245,6 +245,8 @@ class Macro:
245
245
 
246
246
  # we need to make a copy here, as we're modifying the dictionary as we iterate
247
247
  for instance_name, instance in self.instances.copy().items():
248
+ if not isinstance(instance, Instance):
249
+ instance = Instance(**instance)
248
250
  if (array := instance.array) is not None:
249
251
  # we have a macro to expand
250
252
  # first, check it's valid
@@ -129,7 +129,7 @@ proc read_current_sdc {} {
129
129
  }
130
130
 
131
131
  puts "Reading design constraints file at '$::env(_SDC_IN)'…"
132
- if {[catch {read_sdc $::env(_SDC_IN)} errmsg]} {
132
+ if {[catch {log_cmd read_sdc $::env(_SDC_IN)} errmsg]} {
133
133
  puts stderr $errmsg
134
134
  exit 1
135
135
  }
@@ -137,10 +137,10 @@ proc read_current_sdc {} {
137
137
  if { ![string_in_file $::env(_SDC_IN) "set_propagated_clock"] && ![string_in_file $::env(_SDC_IN) "unset_propagated_clock"] } {
138
138
  if { [info exists ::env(OPENLANE_SDC_IDEAL_CLOCKS)] && $::env(OPENLANE_SDC_IDEAL_CLOCKS) } {
139
139
  puts "\[INFO\] No information on clock propagation in input SDC file-- unpropagating all clocks."
140
- unset_propagated_clock [all_clocks]
140
+ log_cmd unset_propagated_clock [all_clocks]
141
141
  } else {
142
142
  puts "\[INFO\] No information on clock propagation in input SDC file-- propagating all clocks."
143
- set_propagated_clock [all_clocks]
143
+ log_cmd set_propagated_clock [all_clocks]
144
144
  }
145
145
  }
146
146
 
@@ -158,6 +158,12 @@ proc read_current_sdc {} {
158
158
  unset ::env(SYNTH_DRIVING_CELL_PIN)
159
159
  set ::env(SYNTH_DRIVING_CELL) $synth_driving_cell_bk
160
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"
161
167
  }
162
168
 
163
169
  proc read_pad_cfg {} {
@@ -210,20 +216,20 @@ proc read_current_netlist {args} {
210
216
 
211
217
  if { [info exists flags(-powered)] } {
212
218
  puts "Reading top-level powered netlist at '$::env(CURRENT_PNL)'…"
213
- if {[catch {read_verilog $::env(CURRENT_PNL)} errmsg]} {
219
+ if {[catch {log_cmd read_verilog $::env(CURRENT_PNL)} errmsg]} {
214
220
  puts stderr $errmsg
215
221
  exit 1
216
222
  }
217
223
  } else {
218
224
  puts "Reading top-level netlist at '$::env(CURRENT_NL)'…"
219
- if {[catch {read_verilog $::env(CURRENT_NL)} errmsg]} {
225
+ if {[catch {log_cmd read_verilog $::env(CURRENT_NL)} errmsg]} {
220
226
  puts stderr $errmsg
221
227
  exit 1
222
228
  }
223
229
  }
224
230
 
225
231
  puts "Linking design '$::env(DESIGN_NAME)' from netlist…"
226
- link_design $::env(DESIGN_NAME)
232
+ log_cmd link_design $::env(DESIGN_NAME)
227
233
  set_global_vars
228
234
  read_current_sdc
229
235
  }
@@ -237,27 +243,27 @@ proc read_timing_info {args} {
237
243
  return
238
244
  }
239
245
  set corner_name $::env(_CURRENT_CORNER_NAME)
240
- log_cm define_corners $corner_name
246
+ log_cmd define_corners $corner_name
241
247
 
242
248
  puts "Reading timing models for corner $corner_name…"
243
249
 
244
250
  foreach lib $::env(_CURRENT_CORNER_LIBS) {
245
251
  puts "Reading cell library for the '$corner_name' corner at '$lib'…"
246
- read_liberty -corner $corner_name $lib
252
+ log_cmd read_liberty -corner $corner_name $lib
247
253
  }
248
254
 
249
255
  if { [info exists ::env(EXTRA_LIBS) ] } {
250
256
  puts "Reading explicitly-specified extra libs for $corner_name…"
251
257
  foreach extra_lib $::env(EXTRA_LIBS) {
252
258
  puts "Reading extra timing library for the '$corner_name' corner at '$extra_lib'…"
253
- read_liberty -corner $corner_name $extra_lib
259
+ log_cmd read_liberty -corner $corner_name $extra_lib
254
260
  }
255
261
  }
256
262
 
257
263
  set blackbox_wildcard {/// sta-blackbox}
258
264
  foreach nl $::env(_CURRENT_CORNER_NETLISTS) {
259
265
  puts "Reading macro netlist at '$nl'…"
260
- if { [catch {read_verilog $nl} err] } {
266
+ if { [catch {log_cmd read_verilog $nl} err] } {
261
267
  puts stderr "Error while reading macro netlist '$nl':"
262
268
  puts stderr $err
263
269
  puts stderr "Make sure that this a gate-level netlist and not an RTL file."
@@ -268,7 +274,7 @@ proc read_timing_info {args} {
268
274
  foreach verilog_file $::env(EXTRA_VERILOG_MODELS) {
269
275
  if { [string_in_file $verilog_file $blackbox_wildcard] } {
270
276
  puts "Found '$blackbox_wildcard' in '$verilog_file', skipping…"
271
- } 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] } {
272
278
  puts stderr "Error while reading $verilog_file:"
273
279
  puts stderr $err
274
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."
@@ -295,7 +301,7 @@ proc read_spefs {} {
295
301
  if { [info exists ::env(_CURRENT_SPEF_BY_CORNER)] } {
296
302
  set corner_name $::env(_CURRENT_CORNER_NAME)
297
303
  puts "Reading top-level design parasitics for the '$corner_name' corner at '$::env(_CURRENT_SPEF_BY_CORNER)'…"
298
- read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
304
+ log_cmd read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
299
305
  }
300
306
  if { [info exists ::env(_CURRENT_CORNER_SPEFS)] } {
301
307
  set corner_name $::env(_CURRENT_CORNER_NAME)
@@ -303,7 +309,7 @@ proc read_spefs {} {
303
309
  set instance_path [lshift spefs]
304
310
  foreach spef $spefs {
305
311
  puts "Reading '$instance_path' parasitics for the '$corner_name' corner at '$spef'…"
306
- read_spef -corner $corner_name -path $instance_path $spef
312
+ log_cmd read_spef -corner $corner_name -path $instance_path $spef
307
313
  }
308
314
  }
309
315
  }
@@ -316,7 +322,7 @@ proc read_spefs {} {
316
322
  if { "[get_property $cell ref_name]" eq "$module_name"} {
317
323
  set instance_path [get_property $cell full_name]
318
324
  puts "Reading '$instance_path' parasitics for the '$corner_name' corner at '$spef'…"
319
- read_spef -corner $corner_name -path $instance_path $spef
325
+ log_cmd read_spef -corner $corner_name -path $instance_path $spef
320
326
  }
321
327
  }
322
328
  }
@@ -336,7 +342,7 @@ proc read_pnr_libs {args} {
336
342
  lappend corner_names $corner_name
337
343
  }
338
344
 
339
- define_corners {*}[array name corner]
345
+ log_cmd define_corners {*}[array name corner]
340
346
 
341
347
  foreach corner_name [array name corner] {
342
348
  puts "Reading timing models for corner $corner_name…"
@@ -344,14 +350,14 @@ proc read_pnr_libs {args} {
344
350
  set corner_models $corner($corner_name)
345
351
  foreach model $corner_models {
346
352
  puts "Reading timing library for the '$corner_name' corner at '$model'…"
347
- read_liberty -corner $corner_name $model
353
+ log_cmd read_liberty -corner $corner_name $model
348
354
  }
349
355
 
350
356
  if { [info exists ::env(EXTRA_LIBS) ] } {
351
357
  puts "Reading explicitly-specified extra libs for $corner_name…"
352
358
  foreach extra_lib $::env(EXTRA_LIBS) {
353
359
  puts "Reading extra timing library for the '$corner_name' corner at '$extra_lib'…"
354
- read_liberty -corner $corner_name $extra_lib
360
+ log_cmd read_liberty -corner $corner_name $extra_lib
355
361
  }
356
362
  }
357
363
  }
@@ -361,7 +367,7 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
361
367
  set tlef $::env($tlef_key)
362
368
 
363
369
  puts "Reading technology LEF file at '$tlef'…"
364
- read_lef $tlef
370
+ log_cmd read_lef $tlef
365
371
 
366
372
  # Make fake I/O sites
367
373
  if { [info exists ::env(PAD_FAKE_SITES)] } {
@@ -370,7 +376,7 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
370
376
  set height [lindex $size 1]
371
377
 
372
378
  puts "Making fake IO site $site_name…"
373
- 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
374
380
  }
375
381
  }
376
382
  }
@@ -378,24 +384,24 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
378
384
  proc read_other_lefs {} {
379
385
  foreach lef $::env(CELL_LEFS) {
380
386
  puts "Reading cell LEF file at '$lef'…"
381
- read_lef $lef
387
+ log_cmd read_lef $lef
382
388
  }
383
389
  if { [info exist ::env(MACRO_LEFS)] } {
384
390
  foreach lef $::env(MACRO_LEFS) {
385
391
  puts "Reading macro LEF file at '$lef'…"
386
- read_lef $lef
392
+ log_cmd read_lef $lef
387
393
  }
388
394
  }
389
395
  if { [info exist ::env(PAD_LEFS)] } {
390
396
  foreach lef $::env(PAD_LEFS) {
391
397
  puts "Reading gpio pad LEF file at '$lef'…"
392
- read_lef $lef
398
+ log_cmd read_lef $lef
393
399
  }
394
400
  }
395
401
  if { [info exist ::env(EXTRA_LEFS)] } {
396
402
  foreach lef $::env(EXTRA_LEFS) {
397
403
  puts "Reading extra LEF file at '$lef'…"
398
- read_lef $lef
404
+ log_cmd read_lef $lef
399
405
  }
400
406
  }
401
407
  }
@@ -416,7 +422,7 @@ proc read_current_odb {args} {
416
422
 
417
423
  read_pnr_libs
418
424
  puts "Reading OpenROAD database at '$::env(CURRENT_ODB)'…"
419
- if { [ catch {read_db $::env(CURRENT_ODB)} errmsg ]} {
425
+ if { [ catch {log_cmd read_db $::env(CURRENT_ODB)} errmsg ]} {
420
426
  puts stderr $errmsg
421
427
  exit 1
422
428
  }
@@ -14,18 +14,18 @@
14
14
  source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
15
15
 
16
16
  puts "Reading OpenROAD database at '$::env(CURRENT_ODB)'…"
17
- if { [ catch {read_db $::env(CURRENT_ODB)} errmsg ]} {
17
+ if { [ catch {log_cmd read_db $::env(CURRENT_ODB)} errmsg ]} {
18
18
  puts stderr $errmsg
19
19
  exit 1
20
20
  }
21
21
 
22
22
  set_global_vars
23
23
 
24
- define_corners $::env(DEFAULT_CORNER)
24
+ log_cmd define_corners $::env(DEFAULT_CORNER)
25
25
 
26
26
  foreach lib $::env(_PNR_LIBS) {
27
27
  puts "Reading library file at '$lib'…"
28
- read_liberty $lib
28
+ log_cmd read_liberty $lib
29
29
  }
30
30
 
31
31
  read_current_sdc
@@ -33,5 +33,5 @@ read_current_sdc
33
33
  if { [info exists ::env(_CURRENT_SPEF_BY_CORNER)] } {
34
34
  set corner_name $::env(_CURRENT_CORNER_NAME)
35
35
  puts "Reading top-level design parasitics for the '$corner_name' corner at '$::env(_CURRENT_SPEF_BY_CORNER)'…"
36
- read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
36
+ log_cmd read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
37
37
  }
@@ -23,7 +23,7 @@
23
23
 
24
24
  source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
25
25
 
26
- set_cmd_units\
26
+ log_cmd set_cmd_units\
27
27
  -time ns\
28
28
  -capacitance pF\
29
29
  -current mA\
@@ -39,9 +39,9 @@ if { [namespace exists ::ord] } {
39
39
 
40
40
  # Internal API- brittle
41
41
  if { [grt::have_routes] } {
42
- estimate_parasitics -global_routing
42
+ log_cmd estimate_parasitics -global_routing
43
43
  } elseif { [est::check_corner_wire_cap] } {
44
- estimate_parasitics -placement
44
+ log_cmd estimate_parasitics -placement
45
45
  }
46
46
  } else {
47
47
  read_timing_info
@@ -34,7 +34,7 @@
34
34
  import os
35
35
  import json
36
36
  import shutil
37
- from typing import List, Optional
37
+ from typing import List, Optional, Tuple
38
38
 
39
39
  import click
40
40
 
@@ -42,6 +42,27 @@ from ys_common import ys, yosys_version_at_least
42
42
  from construct_abc_script import ABCScriptCreator
43
43
 
44
44
 
45
+ def stat_json(d: ys.Design, lib_arguments: Tuple[str, ...], report_dir: str):
46
+ """
47
+ hack: work around https://github.com/YosysHQ/yosys/issues/6442
48
+ """
49
+ raw = os.path.join(report_dir, "stat.json.raw")
50
+ parseable = os.path.join(report_dir, "stat.json")
51
+ d.tee("stat", "-json", *lib_arguments, o=raw)
52
+ with (
53
+ open(raw, encoding="utf8") as f_in,
54
+ open(parseable, "w", encoding="utf8") as f_out,
55
+ ):
56
+ char = " "
57
+ # skip until first { or EOF
58
+ while char != "{" and char != "":
59
+ char = f_in.read(1)
60
+ # if EOF reached, print nothing, just close
61
+ if char != "":
62
+ f_out.write("{") # { already consumed, replace it before writing the rest
63
+ f_out.write(f_in.read())
64
+
65
+
45
66
  def librelane_proc(d: ys.Design, report_dir: str):
46
67
  d.run_pass("proc_clean") # Clean up unused procedures
47
68
  d.run_pass("proc_rmdead") # Remove dead procedures
@@ -357,7 +378,7 @@ def synthesize(
357
378
  d.run_pass("splitnets")
358
379
  d.run_pass("opt_clean", "-purge")
359
380
  d.tee("check", o=os.path.join(report_dir, "chk.rpt"))
360
- d.tee("stat", "-json", *lib_arguments, o=os.path.join(report_dir, "stat.json"))
381
+ stat_json(d, lib_arguments, report_dir)
361
382
  d.tee("stat", *lib_arguments, o=os.path.join(report_dir, "stat.rpt"))
362
383
 
363
384
  noattr_flag = []
@@ -523,7 +544,7 @@ def synthesize(
523
544
  d.run_pass("insbuf", "-buf", *config["SYNTH_BUFFER_CELL"].split("/"))
524
545
 
525
546
  d.tee("check", o=os.path.join(report_dir, "chk.rpt"))
526
- d.tee("stat", "-json", *lib_arguments, o=os.path.join(report_dir, "stat.json"))
547
+ stat_json(d, lib_arguments, report_dir)
527
548
  d.tee("stat", *lib_arguments, o=os.path.join(report_dir, "stat.rpt"))
528
549
 
529
550
  if config["SYNTH_AUTONAME"]:
@@ -622,8 +622,8 @@ class SynthesisCommon(VerilogStep):
622
622
  view_updates, metric_updates = super().run(state_in, **kwargs)
623
623
 
624
624
  stats_file = os.path.join(self.step_dir, "reports", "stat.json")
625
- stats_str = open(stats_file).read()
626
- stats = json.loads(stats_str, parse_float=Decimal)
625
+ with open(stats_file, encoding="utf8") as f:
626
+ stats = json.load(f, parse_float=Decimal)
627
627
 
628
628
  metric_updates["design__instance__count"] = stats["design"]["num_cells"]
629
629
  if chip_area := stats["design"].get("area"): # needs nonzero area
@@ -135,10 +135,13 @@ class DefaultOutputProcessor(OutputProcessor[Dict[str, Any]]):
135
135
 
136
136
  * ``%OL_CREATE_REPORT <file>``\\: Starts redirecting all output from
137
137
  standard output to a report file inside the step directory, with the
138
- name <file>.
139
- * ``%OL_END_REPORT``: Stops redirection behavior.
138
+ name <file>. Note that %OL_ commands take priority: a repeated call of
139
+ %OL_CREATE_REPORT will open a new report, closing the previous one, and
140
+ all metric calls will not be forwarded to the report.
141
+ * ``%OL_END_REPORT``: Stops redirection behavior, closing the report.
140
142
  * ``%OL_METRIC <name> <value>``\\: Adds a string metric with the name <name>
141
- and the value <value> to this function's returned object.
143
+ and the value <value> to this function's returned object, with leading
144
+ and trailing whitespace stripped.
142
145
  * ``%OL_METRIC_F <name> <value>``\\: Adds a floating-point metric with the
143
146
  name <name> and the value <value> to this function's returned object.
144
147
  * ``%OL_METRIC_I <name> <value>``\\: Adds an integer metric with the name
@@ -170,13 +173,13 @@ class DefaultOutputProcessor(OutputProcessor[Dict[str, Any]]):
170
173
  self.current_rpt.close()
171
174
  self.current_rpt = None
172
175
  elif line.startswith(METRIC_LOCUS):
173
- command, name, value = line.split(" ", maxsplit=3)
176
+ command, name, value = line.split(" ", maxsplit=2)
174
177
  metric_type: Union[Type[str], Type[int], Type[Decimal]] = str
175
178
  if command.endswith("_I"):
176
179
  metric_type = int
177
180
  elif command.endswith("_F"):
178
181
  metric_type = Decimal
179
- self.generated_metrics[name] = metric_type(value)
182
+ self.generated_metrics[name] = metric_type(value.strip())
180
183
  elif self.current_rpt is not None:
181
184
  # No echo- the timing reports especially can be very large
182
185
  # and terminal emulators will slow the flow down.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "librelane"
3
- version = "3.1.0.dev4"
3
+ version = "3.1.0.dev5"
4
4
  description = "An infrastructure for implementing chip design flows"
5
5
  maintainers = [
6
6
  {name = "Mohamed Gaber", email = "donn@fossi-foundation.org"},