librelane 3.0.0.dev24__tar.gz → 3.0.0.dev26__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.dev24 → librelane-3.0.0.dev26}/PKG-INFO +1 -1
  2. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/__init__.py +1 -0
  3. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/drc.py +1 -0
  4. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/misc.py +27 -5
  5. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/types.py +2 -3
  6. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/__main__.py +1 -1
  7. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/variable.py +16 -0
  8. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/config.yaml +8 -8
  9. librelane-3.0.0.dev26/librelane/examples/spm-user_project_wrapper/config.json +25 -0
  10. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/flow.py +89 -21
  11. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/def/mag_gds.tcl +1 -2
  12. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/drc.tcl +0 -1
  13. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/gds/extras_mag.tcl +0 -2
  14. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -1
  15. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -2
  16. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/lef/maglef.tcl +0 -1
  17. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/wrapper.tcl +2 -0
  18. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/power_utils.py +8 -6
  19. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/reader.py +2 -2
  20. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/io.tcl +23 -11
  21. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/pdn_cfg.tcl +36 -36
  22. librelane-3.0.0.dev26/librelane/scripts/openroad/ioplacer.tcl +67 -0
  23. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/pdn.tcl +1 -1
  24. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/state/state.py +11 -3
  25. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/__main__.py +1 -2
  26. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/common_variables.py +82 -33
  27. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/magic.py +24 -14
  28. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/odb.py +15 -39
  29. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/openroad.py +22 -44
  30. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/step.py +22 -7
  31. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/tclstep.py +1 -1
  32. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/pyproject.toml +1 -1
  33. librelane-3.0.0.dev24/librelane/examples/spm-user_project_wrapper/config.json +0 -13
  34. librelane-3.0.0.dev24/librelane/scripts/openroad/ioplacer.tcl +0 -66
  35. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/Readme.md +0 -0
  36. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/__init__.py +0 -0
  37. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/__main__.py +0 -0
  38. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/__version__.py +0 -0
  39. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/cli.py +0 -0
  40. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/generic_dict.py +0 -0
  41. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/__init__.py +0 -0
  42. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/__main__.py +0 -0
  43. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/library.py +0 -0
  44. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/metric.py +0 -0
  45. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/util.py +0 -0
  46. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/ring_buffer.py +0 -0
  47. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/tcl.py +0 -0
  48. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/toolbox.py +0 -0
  49. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/tpe.py +0 -0
  50. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/__init__.py +0 -0
  51. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/config.py +0 -0
  52. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/flow.py +0 -0
  53. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/pdk_compat.py +0 -0
  54. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/preprocessor.py +0 -0
  55. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/removals.py +0 -0
  56. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/container.py +0 -0
  57. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/env_info.py +0 -0
  58. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/pin_order.cfg +0 -0
  59. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/src/impl.sdc +0 -0
  60. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/src/signoff.sdc +0 -0
  61. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/src/spm.v +0 -0
  62. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/verify/spm_tb.v +0 -0
  63. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
  64. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
  65. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
  66. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
  67. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
  68. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
  69. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/__init__.py +0 -0
  70. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/builtins.py +0 -0
  71. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/classic.py +0 -0
  72. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/cli.py +0 -0
  73. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/misc.py +0 -0
  74. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/optimizing.py +0 -0
  75. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/sequential.py +0 -0
  76. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/synth_explore.py +0 -0
  77. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/logging/__init__.py +0 -0
  78. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/logging/logger.py +0 -0
  79. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/open_pdks_rev +0 -0
  80. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/plugins.py +0 -0
  81. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/py.typed +0 -0
  82. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/base.sdc +0 -0
  83. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/Readme.md +0 -0
  84. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/open_design.py +0 -0
  85. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/render.py +0 -0
  86. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/stream_out.py +0 -0
  87. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
  88. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/xor.drc +0 -0
  89. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/Readme.md +0 -0
  90. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/common/read.tcl +0 -0
  91. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
  92. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/def/mag.tcl +0 -0
  93. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/extract_spice.tcl +0 -0
  94. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
  95. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
  96. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/get_bbox.tcl +0 -0
  97. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/lef.tcl +0 -0
  98. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/open.tcl +0 -0
  99. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/netgen/setup.tcl +0 -0
  100. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/apply_def_template.py +0 -0
  101. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/cell_frequency.py +0 -0
  102. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
  103. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/contextualize.py +0 -0
  104. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/defutil.py +0 -0
  105. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/diodes.py +0 -0
  106. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
  107. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/eco_buffer.py +0 -0
  108. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/eco_diode.py +0 -0
  109. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
  110. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/io_place.py +0 -0
  111. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
  112. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
  113. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
  114. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/lefutil.py +0 -0
  115. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/placers.py +0 -0
  116. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/random_place.py +0 -0
  117. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/remove_buffers.py +0 -0
  118. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
  119. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/wire_lengths.py +0 -0
  120. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/antenna_check.tcl +0 -0
  121. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
  122. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/basic_mp.tcl +0 -0
  123. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/buffer_list.tcl +0 -0
  124. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/dpl.tcl +0 -0
  125. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
  126. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/grt.tcl +0 -0
  127. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/resizer.tcl +0 -0
  128. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
  129. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
  130. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
  131. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
  132. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
  133. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/cts.tcl +0 -0
  134. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/cut_rows.tcl +0 -0
  135. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/dpl.tcl +0 -0
  136. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/drt.tcl +0 -0
  137. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/dump_rc.tcl +0 -0
  138. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/fill.tcl +0 -0
  139. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/floorplan.tcl +0 -0
  140. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/gpl.tcl +0 -0
  141. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/grt.tcl +0 -0
  142. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/gui.tcl +0 -0
  143. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
  144. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/irdrop.tcl +0 -0
  145. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/rcx.tcl +0 -0
  146. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/repair_design.tcl +0 -0
  147. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
  148. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
  149. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
  150. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
  151. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/sta/corner.tcl +0 -0
  152. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/tapcell.tcl +0 -0
  153. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/ungpl.tcl +0 -0
  154. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/write_views.tcl +0 -0
  155. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
  156. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/pyosys/json_header.py +0 -0
  157. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/pyosys/synthesize.py +0 -0
  158. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/pyosys/ys_common.py +0 -0
  159. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/tclsh/hello.tcl +0 -0
  160. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/state/__init__.py +0 -0
  161. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/state/__main__.py +0 -0
  162. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/state/design_format.py +0 -0
  163. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/__init__.py +0 -0
  164. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/checker.py +0 -0
  165. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/cvc_rv.py +0 -0
  166. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/klayout.py +0 -0
  167. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/misc.py +0 -0
  168. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/netgen.py +0 -0
  169. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/openroad_alerts.py +0 -0
  170. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/pyosys.py +0 -0
  171. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/verilator.py +0 -0
  172. {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/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.dev24
3
+ Version: 3.0.0.dev26
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
@@ -43,6 +43,7 @@ from .misc import (
43
43
  Filter,
44
44
  get_latest_file,
45
45
  process_list_file,
46
+ count_occurences,
46
47
  _get_process_limit,
47
48
  )
48
49
  from .types import (
@@ -287,6 +287,7 @@ class DRC:
287
287
  from lxml import etree as ET
288
288
 
289
289
  with ET.xmlfile(out, encoding="utf8", buffered=False) as xf:
290
+ xf.write_declaration()
290
291
  with xf.element("report-database"):
291
292
  # 1. Cells
292
293
  with xf.element("cells"):
@@ -11,16 +11,18 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- import fnmatch
15
- import glob
16
- import gzip
14
+ import io
17
15
  import os
18
- import pathlib
19
16
  import re
17
+ import glob
18
+ import gzip
20
19
  import typing
20
+ import pathlib
21
+ import fnmatch
21
22
  import unicodedata
22
23
  from math import inf
23
24
  from typing import (
25
+ IO,
24
26
  Any,
25
27
  Generator,
26
28
  Iterable,
@@ -378,7 +380,7 @@ def _get_process_limit() -> int:
378
380
  return int(os.getenv("_OPENLANE_MAX_CORES", os.cpu_count() or 1))
379
381
 
380
382
 
381
- def gzopen(filename, mode="rt"):
383
+ def gzopen(filename: AnyPath, mode="rt") -> IO[Any]:
382
384
  """
383
385
  This method (tries to?) emulate the gzopen from the Linux Standard Base,
384
386
  specifically this part:
@@ -388,6 +390,11 @@ def gzopen(filename, mode="rt"):
388
390
  for reading directly from the file without any decompression.
389
391
 
390
392
  gzip.open does not have this behavior.
393
+
394
+ :param filename: The full path to the uncompressed or gzipped file.
395
+ :param mode: "r", "rb", "w", "wb", "x", "xb", "a" or "ab" for
396
+ binary mode, or "rt", "wt", "xt" or "at" for text mode.
397
+ :returns: An I/O wrapper that may very slightly based on the mode.
391
398
  """
392
399
  try:
393
400
  g = gzip.open(filename, mode=mode)
@@ -400,3 +407,18 @@ def gzopen(filename, mode="rt"):
400
407
  except gzip.BadGzipFile:
401
408
  g.close()
402
409
  return open(filename, mode=mode)
410
+
411
+
412
+ def count_occurences(fp: io.TextIOWrapper, pattern: str = "") -> int:
413
+ """
414
+ Counts the occurences of a certain string in a stream, line-by-line, without
415
+ necessarily loading the entire file into memory.
416
+
417
+ Equivalent to: ``grep -c 'pattern' <file>`` (but without regex support).
418
+
419
+ :param fp: the text stream
420
+ :param pattern: the substring to search for. if set to "", it will simply
421
+ count the lines in the file.
422
+ :returns: the number of matching lines
423
+ """
424
+ return sum(pattern in line for line in fp)
@@ -16,6 +16,7 @@ import sys
16
16
  import tempfile
17
17
  from math import isfinite
18
18
  from decimal import Decimal
19
+ from weakref import finalize
19
20
  from collections import UserString
20
21
  from typing import Any, Union, ClassVar, Tuple, Optional
21
22
 
@@ -112,6 +113,4 @@ class ScopedFile(Path):
112
113
  super().__init__(self._ntf.name)
113
114
  self._ntf.write(contents)
114
115
  self._ntf.close()
115
-
116
- def __del__(self):
117
- os.unlink(self._ntf.name)
116
+ self._ntf_cleanup = finalize(self, os.unlink, self._ntf.name)
@@ -110,7 +110,7 @@ def create_config(
110
110
  print("At least one source RTL file is required.", file=sys.stderr)
111
111
  exit(1)
112
112
  source_rtl_key = "VERILOG_FILES"
113
- if not all((file.endswith(".sv") or file.endswith(".v")) for file in source_rtl):
113
+ if not all(file.endswith(".sv") or file.endswith(".v") for file in source_rtl):
114
114
  print(
115
115
  "Only Verilog/SystemVerilog files are supported by create-config.",
116
116
  file=sys.stderr,
@@ -440,6 +440,9 @@ class Variable:
440
440
  return_value = list()
441
441
  raw = value
442
442
  if isinstance(raw, list) or isinstance(raw, tuple):
443
+ if validating_type == List[Path]:
444
+ if any(isinstance(item, List) for item in raw):
445
+ Variable.__flatten_list(value)
443
446
  pass
444
447
  elif is_string(raw):
445
448
  if not permissive_typing:
@@ -725,3 +728,16 @@ class Variable:
725
728
  and self.type == rhs.type
726
729
  and self.default == rhs.default
727
730
  )
731
+
732
+ # Flatten list. Note: Must modify value, not return a new list.
733
+ @staticmethod
734
+ def __flatten_list(value: list):
735
+ new_list = []
736
+ for item in value:
737
+ if isinstance(item, list):
738
+ for sub_item in item:
739
+ new_list.append(sub_item)
740
+ else:
741
+ new_list.append(item)
742
+
743
+ value[:] = new_list
@@ -7,16 +7,16 @@ PNR_SDC_FILE: dir::src/impl.sdc
7
7
  SIGNOFF_SDC_FILE: dir::src/signoff.sdc
8
8
 
9
9
  # PDN
10
- FP_PDN_VOFFSET: 5
11
- FP_PDN_HOFFSET: 5
12
- FP_PDN_VWIDTH: 2
13
- FP_PDN_HWIDTH: 2
14
- FP_PDN_VPITCH: 30
15
- FP_PDN_HPITCH: 30
16
- FP_PDN_SKIPTRIM: true
10
+ PDN_VOFFSET: 5
11
+ PDN_HOFFSET: 5
12
+ PDN_VWIDTH: 2
13
+ PDN_HWIDTH: 2
14
+ PDN_VPITCH: 30
15
+ PDN_HPITCH: 30
16
+ PDN_SKIPTRIM: true
17
17
 
18
18
  # Pin Order
19
- FP_PIN_ORDER_CFG: dir::pin_order.cfg
19
+ IO_PIN_ORDER_CFG: dir::pin_order.cfg
20
20
 
21
21
  # Technology-Specific Configs
22
22
  pdk::sky130*:
@@ -0,0 +1,25 @@
1
+ {
2
+ "DESIGN_NAME": "SPM_example",
3
+ "VERILOG_FILES": [
4
+ "dir::./defines.v",
5
+ "dir::./SPM_example.v"
6
+ ],
7
+ "CLOCK_PERIOD": 25,
8
+ "CLOCK_PORT": "wb_clk_i",
9
+ "CLOCK_NET": "SPM.clk",
10
+ "RT_MAX_LAYER": "met4",
11
+ "FP_SIZING": "absolute",
12
+ "VDD_NETS": [
13
+ "vccd1"
14
+ ],
15
+ "GND_NETS": [
16
+ "vssd1"
17
+ ],
18
+ "PDN_MULTILAYER": false,
19
+ "DIE_AREA": [
20
+ 0,
21
+ 0,
22
+ 600,
23
+ 600
24
+ ]
25
+ }
@@ -375,7 +375,7 @@ class Flow(ABC):
375
375
  self.progress_bar = FlowProgressBar(self.name)
376
376
 
377
377
  @classmethod
378
- def get_help_md(Self) -> str: # pragma: no cover
378
+ def get_help_md(Self, myst_anchors: bool = True) -> str: # pragma: no cover
379
379
  """
380
380
  :returns: rendered Markdown help for this Flow
381
381
  """
@@ -383,10 +383,12 @@ class Flow(ABC):
383
383
  if Self.__doc__:
384
384
  doc_string = textwrap.dedent(Self.__doc__)
385
385
 
386
+ flow_anchor = f"(flow-{slugify(Self.__name__, lower=True)})="
387
+
386
388
  result = (
387
389
  textwrap.dedent(
388
390
  f"""\
389
- (flow-{slugify(Self.__name__, lower=True)})=
391
+ {flow_anchor * myst_anchors}
390
392
  ### {Self.__name__}
391
393
 
392
394
  ```{{eval-rst}}
@@ -426,7 +428,8 @@ class Flow(ABC):
426
428
  for var in flow_config_vars:
427
429
  units = var.units or ""
428
430
  pdk_superscript = "<sup>PDK</sup>" if var.pdk else ""
429
- result += f"| `{var.name}`{{#{var._get_docs_identifier(Self.__name__)}}}{pdk_superscript} | {var.type_repr_md()} | {var.desc_repr_md()} | `{var.default}` | {units} |\n"
431
+ var_anchor = f"{{#{var._get_docs_identifier(Self.__name__)}}}"
432
+ result += f"| `{var.name}`{var_anchor * myst_anchors} {pdk_superscript} | {var.type_repr_md()} | {var.desc_repr_md()} | `{var.default}` | {units} |\n"
430
433
  result += "\n"
431
434
 
432
435
  if len(Self.Steps):
@@ -438,10 +441,35 @@ class Flow(ABC):
438
441
  name = step.name
439
442
  else:
440
443
  name = step.id
441
- result += f"* [`{step.id}`](./step_config_vars.md#{slugify(name)})\n"
444
+ if myst_anchors:
445
+ result += (
446
+ f"* [`{step.id}`](./step_config_vars.md#{slugify(name)})\n"
447
+ )
448
+ else:
449
+ result += f"* {step.id}"
442
450
 
443
451
  return result
444
452
 
453
+ @classmethod
454
+ def display_help(Self): # pragma: no cover
455
+ """
456
+ Displays Markdown help for a given flow.
457
+
458
+ If in an IPython environment, it's rendered using ``IPython.display``.
459
+ Otherwise, it's rendered using ``rich.markdown``.
460
+ """
461
+ try:
462
+ get_ipython() # type: ignore
463
+
464
+ import IPython.display
465
+
466
+ IPython.display.display(IPython.display.Markdown(Self.get_help_md()))
467
+ except NameError:
468
+ from ..logging import console
469
+ from rich.markdown import Markdown
470
+
471
+ console.log(Markdown(Self.get_help_md()))
472
+
445
473
  def get_all_config_variables(self) -> List[Variable]:
446
474
  """
447
475
  :returns: All configuration variables for this Flow, including
@@ -796,7 +824,6 @@ class Flow(ABC):
796
824
  DesignFormat.POWERED_NETLIST: (os.path.join("verilog", "gl"), "v"),
797
825
  DesignFormat.DEF: ("def", "def"),
798
826
  DesignFormat.LEF: ("lef", "lef"),
799
- DesignFormat.SDF: (os.path.join("sdf", "multicorner"), "sdf"),
800
827
  DesignFormat.SPEF: (os.path.join("spef", "multicorner"), "spef"),
801
828
  DesignFormat.LIB: (os.path.join("lib", "multicorner"), "lib"),
802
829
  DesignFormat.GDS: ("gds", "gds"),
@@ -852,38 +879,67 @@ class Flow(ABC):
852
879
  file_path, os.path.join(to_dir, file), follow_symlinks=True
853
880
  )
854
881
 
855
- signoff_folder = os.path.join(
856
- path, "signoff", self.config["DESIGN_NAME"], "librelane-signoff"
857
- )
858
- mkdirp(signoff_folder)
882
+ def find_one(pattern):
883
+ result = glob.glob(pattern)
884
+ if len(result) == 0:
885
+ return None
886
+ return result[0]
887
+
888
+ signoff_dir = os.path.join(path, "signoff", self.config["DESIGN_NAME"])
889
+ openlane_signoff_dir = os.path.join(signoff_dir, "openlane-signoff")
890
+ mkdirp(openlane_signoff_dir)
859
891
 
860
- # resolved.json
892
+ ## resolved.json
861
893
  shutil.copyfile(
862
894
  self.config_resolved_path,
863
- os.path.join(signoff_folder, "resolved.json"),
895
+ os.path.join(openlane_signoff_dir, "resolved.json"),
864
896
  follow_symlinks=True,
865
897
  )
866
898
 
867
- # Logs
868
- mkdirp(signoff_folder)
869
- copy_dir_contents(self.run_dir, signoff_folder, "*.log")
899
+ ## metrics
900
+ with open(os.path.join(signoff_dir, "metrics.csv"), "w", encoding="utf8") as f:
901
+ last_state.metrics_to_csv(f)
870
902
 
871
- # Step-specific
903
+ ## flow logs
904
+ mkdirp(openlane_signoff_dir)
905
+ copy_dir_contents(self.run_dir, openlane_signoff_dir, "*.log")
906
+
907
+ ### step-specific signoff logs and reports
872
908
  for step in self.step_objects:
873
909
  reports_dir = os.path.join(step.step_dir, "reports")
874
910
  step_imp_id = step.get_implementation_id()
911
+ if step_imp_id == "Magic.DRC":
912
+ if drc_rpt := find_one(os.path.join(reports_dir, "*.rpt")):
913
+ shutil.copyfile(
914
+ drc_rpt, os.path.join(openlane_signoff_dir, "drc.rpt")
915
+ )
916
+ if drc_xml := find_one(os.path.join(reports_dir, "*.xml")):
917
+ # Despite the name, this is the Magic DRC report simply
918
+ # converted into a KLayout-compatible format. Confusing!
919
+ drc_xml_out = os.path.join(openlane_signoff_dir, "drc.klayout.xml")
920
+ with open(drc_xml, encoding="utf8") as i, open(
921
+ drc_xml_out, "w", encoding="utf8"
922
+ ) as o:
923
+ o.write(
924
+ "<!-- Despite the name, this is the Magic DRC report in KLayout format. -->\n"
925
+ )
926
+ shutil.copyfileobj(i, o)
927
+ if step_imp_id == "Netgen.LVS":
928
+ if lvs_rpt := find_one(os.path.join(reports_dir, "*.rpt")):
929
+ shutil.copyfile(
930
+ lvs_rpt, os.path.join(openlane_signoff_dir, "lvs.rpt")
931
+ )
875
932
  if step_imp_id.endswith("DRC") or step_imp_id.endswith("LVS"):
876
- if os.path.exists(reports_dir):
877
- copy_dir_contents(reports_dir, signoff_folder)
878
- if step_imp_id.endswith("LVS"):
879
- copy_dir_contents(step.step_dir, signoff_folder, "*.log")
933
+ copy_dir_contents(step.step_dir, openlane_signoff_dir, "*.log")
880
934
  if step_imp_id.endswith("CheckAntennas"):
881
935
  if os.path.exists(reports_dir):
882
936
  copy_dir_contents(
883
- reports_dir, signoff_folder, "antenna_summary.rpt"
937
+ reports_dir, openlane_signoff_dir, "antenna_summary.rpt"
884
938
  )
885
939
  if step_imp_id.endswith("STAPostPNR"):
886
- timing_report_folder = os.path.join(signoff_folder, "timing-reports")
940
+ timing_report_folder = os.path.join(
941
+ openlane_signoff_dir, "timing-reports"
942
+ )
887
943
  mkdirp(timing_report_folder)
888
944
  copy_dir_contents(step.step_dir, timing_report_folder, "*summary.rpt")
889
945
  for dir in os.listdir(step.step_dir):
@@ -894,6 +950,18 @@ class Flow(ABC):
894
950
  mkdirp(target)
895
951
  copy_dir_contents(dir_path, target, "*.rpt")
896
952
 
953
+ # 3. SDF
954
+ # (This one, as with many things in the Efabless format, is special)
955
+ if sdf := last_state[DesignFormat.SDF]:
956
+ assert isinstance(sdf, dict), "SDF is not a dictionary"
957
+ for corner, view in sdf.items():
958
+ assert isinstance(view, Path), "SDF state out returned multiple paths"
959
+ target_dir = os.path.join(signoff_dir, "sdf", corner)
960
+ mkdirp(target_dir)
961
+ shutil.copyfile(
962
+ view, os.path.join(target_dir, f"{self.config['DESIGN_NAME']}.sdf")
963
+ )
964
+
897
965
  @deprecated(
898
966
  version="2.0.0a46",
899
967
  reason="Use .progress_bar.set_max_stage_count",
@@ -24,6 +24,7 @@ if { $::env(MAGIC_MACRO_STD_CELL_SOURCE) == "PDK" } {
24
24
  }
25
25
 
26
26
  read_extra_gds
27
+ read_extra_lef
27
28
 
28
29
  load (NEWCELL)
29
30
 
@@ -77,5 +78,3 @@ if { $::env(MAGIC_GDS_POLYGON_SUBCELLS) } {
77
78
 
78
79
  gds write $::env(SAVE_MAG_GDS)
79
80
  puts "\[INFO\] GDS Write Complete"
80
-
81
- exit 0
@@ -76,4 +76,3 @@ puts stdout "\[INFO\] Saving mag view with DRC errors ($mag_view)"
76
76
  # WARNING: changes the name of the cell; keep as last step
77
77
  save $mag_view
78
78
  puts stdout "\[INFO\] Saved"
79
- exit 0
@@ -43,5 +43,3 @@ if { [info exist ::env(EXTRA_GDS)] } {
43
43
  puts "\[INFO\] Saved mag view from $gds_file under $::env(STEP_DIR)"
44
44
  }
45
45
  }
46
-
47
- exit 0
@@ -29,4 +29,3 @@ set final_filepath $::env(signoff_tmpfiles)/gds_ptrs.mag
29
29
  file rename -force $::env(signoff_tmpfiles)/$::env(DESIGN_NAME).mag $final_filepath
30
30
 
31
31
  puts "\[INFO\] Wrote $final_filepath including GDS pointers."
32
- exit 0
@@ -59,5 +59,3 @@ foreach design_name [cellname list allcells] {
59
59
  puts $fp [join $new_mag_lines "\n"]
60
60
  close $fp
61
61
  }
62
-
63
- exit 0
@@ -24,4 +24,3 @@ cellname filepath $::env(DESIGN_NAME).lef $::env(signoff_results)
24
24
  save
25
25
 
26
26
  puts "\[INFO\] DONE GENERATING MAGLEF VIEW"
27
- exit 0
@@ -17,3 +17,5 @@ if {[catch {source $::env(_MAGIC_SCRIPT)} err]} {
17
17
  puts "Error: $err"
18
18
  exit 1
19
19
  }
20
+
21
+ exit 0
@@ -17,7 +17,6 @@ import utl
17
17
 
18
18
  import re
19
19
  import json
20
- import functools
21
20
  from dataclasses import dataclass
22
21
  from typing import Dict, List, Optional
23
22
 
@@ -49,11 +48,14 @@ class Design(object):
49
48
  def get_verilog_net_name_by_bit(self, top_module: str, target_bit: int):
50
49
  yosys_design_object = self.yosys_dict["modules"][top_module]
51
50
  if top_module not in self.verilog_net_names_by_bit_by_module:
52
- self.verilog_net_names_by_bit_by_module[top_module] = functools.reduce(
53
- lambda a, b: {**a, **{bit: b[0] for bit in b[1]["bits"]}},
54
- yosys_design_object["netnames"].items(),
55
- {},
56
- )
51
+ # check git history for a version of this loop that is drunk on power
52
+ netname_by_bit = {}
53
+
54
+ for netname, info in yosys_design_object["netnames"].items():
55
+ for bit in info["bits"]:
56
+ netname_by_bit[bit] = netname
57
+
58
+ self.verilog_net_names_by_bit_by_module[top_module] = netname_by_bit
57
59
  return self.verilog_net_names_by_bit_by_module[top_module][target_bit]
58
60
 
59
61
  def get_pins(self, module_name: str) -> Dict[str, odb.dbMTerm]:
@@ -20,7 +20,7 @@ import sys
20
20
  import json
21
21
  import locale
22
22
  import inspect
23
- import functools
23
+ from functools import wraps
24
24
  from decimal import Decimal
25
25
  from fnmatch import fnmatch
26
26
  from typing import Callable, Dict
@@ -188,7 +188,7 @@ class OdbReader(object):
188
188
 
189
189
 
190
190
  def click_odb(function):
191
- @functools.wraps(function)
191
+ @wraps(function)
192
192
  def wrapper(input_db, input_lefs, config_path, **kwargs):
193
193
  reader = OdbReader(input_db, config_path=config_path)
194
194
 
@@ -99,23 +99,35 @@ proc read_pdn_cfg {} {
99
99
 
100
100
  # Compatibility Layer for Deprecated Variables That May Still Be Used By
101
101
  # User Files
102
- set ::env(DESIGN_IS_CORE) $::env(FP_PDN_MULTILAYER)
103
- set ::env(FP_PDN_ENABLE_MACROS_GRID) $::env(PDN_CONNECT_MACROS_TO_GRID)
104
- set ::env(FP_PDN_RAILS_LAYER) $::env(FP_PDN_RAIL_LAYER)
105
- set ::env(FP_PDN_UPPER_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)
106
- set ::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_VERTICAL_LAYER)
102
+ set unset_list {
103
+ DESIGN_IS_CORE
104
+ PDN_ENABLE_MACROS_GRID
105
+ PDN_RAILS_LAYER
106
+ PDN_UPPER_LAYER
107
+ PDN_LOWER_LAYER
108
+ }
109
+ set ::env(DESIGN_IS_CORE) $::env(PDN_MULTILAYER)
110
+ set ::env(PDN_ENABLE_MACROS_GRID) $::env(PDN_CONNECT_MACROS_TO_GRID)
111
+ set ::env(PDN_RAILS_LAYER) $::env(PDN_RAIL_LAYER)
112
+ set ::env(PDN_UPPER_LAYER) $::env(PDN_HORIZONTAL_LAYER)
113
+ set ::env(PDN_LOWER_LAYER) $::env(PDN_VERTICAL_LAYER)
114
+ foreach key [array names ::env] {
115
+ if { [string match PDN_* $key] } {
116
+ set fp_name FP_$key
117
+ lappend unset_list $fp_name
118
+ set ::env($fp_name) $::env($key)
119
+ }
120
+ }
107
121
 
108
- if {[catch {source $::env(FP_PDN_CFG)} errmsg]} {
122
+ if {[catch {source $::env(PDN_CFG)} errmsg]} {
109
123
  puts stderr $errmsg
110
124
  exit 1
111
125
  }
112
126
 
113
127
  # Restore Environment
114
- unset ::env(DESIGN_IS_CORE)
115
- unset ::env(FP_PDN_ENABLE_MACROS_GRID)
116
- unset ::env(FP_PDN_RAILS_LAYER)
117
- unset ::env(FP_PDN_UPPER_LAYER)
118
- unset ::env(FP_PDN_LOWER_LAYER)
128
+ foreach unsettable $unset_list {
129
+ unset ::env($unsettable)
130
+ }
119
131
  }
120
132
 
121
133
 
@@ -43,83 +43,83 @@ foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {
43
43
  set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \
44
44
  -secondary_power $secondary
45
45
 
46
- if { $::env(FP_PDN_MULTILAYER) == 1 } {
46
+ if { $::env(PDN_MULTILAYER) == 1 } {
47
47
  define_pdn_grid \
48
48
  -name stdcell_grid \
49
49
  -starts_with POWER \
50
50
  -voltage_domain CORE \
51
- -pins "$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)"
51
+ -pins "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
52
52
 
53
53
  add_pdn_stripe \
54
54
  -grid stdcell_grid \
55
- -layer $::env(FP_PDN_VERTICAL_LAYER) \
56
- -width $::env(FP_PDN_VWIDTH) \
57
- -pitch $::env(FP_PDN_VPITCH) \
58
- -offset $::env(FP_PDN_VOFFSET) \
59
- -spacing $::env(FP_PDN_VSPACING) \
55
+ -layer $::env(PDN_VERTICAL_LAYER) \
56
+ -width $::env(PDN_VWIDTH) \
57
+ -pitch $::env(PDN_VPITCH) \
58
+ -offset $::env(PDN_VOFFSET) \
59
+ -spacing $::env(PDN_VSPACING) \
60
60
  -starts_with POWER -extend_to_core_ring
61
61
 
62
62
  add_pdn_stripe \
63
63
  -grid stdcell_grid \
64
- -layer $::env(FP_PDN_HORIZONTAL_LAYER) \
65
- -width $::env(FP_PDN_HWIDTH) \
66
- -pitch $::env(FP_PDN_HPITCH) \
67
- -offset $::env(FP_PDN_HOFFSET) \
68
- -spacing $::env(FP_PDN_HSPACING) \
64
+ -layer $::env(PDN_HORIZONTAL_LAYER) \
65
+ -width $::env(PDN_HWIDTH) \
66
+ -pitch $::env(PDN_HPITCH) \
67
+ -offset $::env(PDN_HOFFSET) \
68
+ -spacing $::env(PDN_HSPACING) \
69
69
  -starts_with POWER -extend_to_core_ring
70
70
 
71
71
  add_pdn_connect \
72
72
  -grid stdcell_grid \
73
- -layers "$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)"
73
+ -layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
74
74
  } else {
75
75
  define_pdn_grid \
76
76
  -name stdcell_grid \
77
77
  -starts_with POWER \
78
78
  -voltage_domain CORE \
79
- -pins $::env(FP_PDN_VERTICAL_LAYER)
79
+ -pins $::env(PDN_VERTICAL_LAYER)
80
80
 
81
81
  add_pdn_stripe \
82
82
  -grid stdcell_grid \
83
- -layer $::env(FP_PDN_VERTICAL_LAYER) \
84
- -width $::env(FP_PDN_VWIDTH) \
85
- -pitch $::env(FP_PDN_VPITCH) \
86
- -offset $::env(FP_PDN_VOFFSET) \
87
- -spacing $::env(FP_PDN_VSPACING) \
83
+ -layer $::env(PDN_VERTICAL_LAYER) \
84
+ -width $::env(PDN_VWIDTH) \
85
+ -pitch $::env(PDN_VPITCH) \
86
+ -offset $::env(PDN_VOFFSET) \
87
+ -spacing $::env(PDN_VSPACING) \
88
88
  -starts_with POWER -extend_to_core_ring
89
89
  }
90
90
 
91
91
  # Adds the standard cell rails if enabled.
92
- if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {
92
+ if { $::env(PDN_ENABLE_RAILS) == 1 } {
93
93
  add_pdn_stripe \
94
94
  -grid stdcell_grid \
95
- -layer $::env(FP_PDN_RAIL_LAYER) \
96
- -width $::env(FP_PDN_RAIL_WIDTH) \
95
+ -layer $::env(PDN_RAIL_LAYER) \
96
+ -width $::env(PDN_RAIL_WIDTH) \
97
97
  -followpins
98
98
 
99
99
  add_pdn_connect \
100
100
  -grid stdcell_grid \
101
- -layers "$::env(FP_PDN_RAIL_LAYER) $::env(FP_PDN_VERTICAL_LAYER)"
101
+ -layers "$::env(PDN_RAIL_LAYER) $::env(PDN_VERTICAL_LAYER)"
102
102
  }
103
103
 
104
104
 
105
105
  # Adds the core ring if enabled.
106
- if { $::env(FP_PDN_CORE_RING) == 1 } {
107
- if { $::env(FP_PDN_MULTILAYER) == 1 } {
106
+ if { $::env(PDN_CORE_RING) == 1 } {
107
+ if { $::env(PDN_MULTILAYER) == 1 } {
108
108
  add_pdn_ring \
109
109
  -allow_out_of_die \
110
110
  -grid stdcell_grid \
111
- -layers "$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)" \
112
- -widths "$::env(FP_PDN_CORE_RING_VWIDTH) $::env(FP_PDN_CORE_RING_HWIDTH)" \
113
- -spacings "$::env(FP_PDN_CORE_RING_VSPACING) $::env(FP_PDN_CORE_RING_HSPACING)" \
114
- -core_offset "$::env(FP_PDN_CORE_RING_VOFFSET) $::env(FP_PDN_CORE_RING_HOFFSET)"
111
+ -layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)" \
112
+ -widths "$::env(PDN_CORE_RING_VWIDTH) $::env(PDN_CORE_RING_HWIDTH)" \
113
+ -spacings "$::env(PDN_CORE_RING_VSPACING) $::env(PDN_CORE_RING_HSPACING)" \
114
+ -core_offset "$::env(PDN_CORE_RING_VOFFSET) $::env(PDN_CORE_RING_HOFFSET)"
115
115
  } else {
116
- throw APPLICATION "FP_PDN_CORE_RING cannot be used when FP_PDN_MULTILAYER is set to false."
116
+ throw APPLICATION "PDN_CORE_RING cannot be used when PDN_MULTILAYER is set to false."
117
117
  # add_pdn_ring \
118
118
  # -grid stdcell_grid \
119
- # -layers "$::env(FP_PDN_VERTICAL_LAYER)" \
120
- # -widths "$::env(FP_PDN_CORE_RING_VWIDTH)" \
121
- # -spacings "$::env(FP_PDN_CORE_RING_VSPACING)" \
122
- # -core_offset "$::env(FP_PDN_CORE_RING_VOFFSET)"
119
+ # -layers "$::env(PDN_VERTICAL_LAYER)" \
120
+ # -widths "$::env(PDN_CORE_RING_VWIDTH)" \
121
+ # -spacings "$::env(PDN_CORE_RING_VSPACING)" \
122
+ # -core_offset "$::env(PDN_CORE_RING_VOFFSET)"
123
123
  }
124
124
  }
125
125
 
@@ -128,8 +128,8 @@ define_pdn_grid \
128
128
  -default \
129
129
  -name macro \
130
130
  -starts_with POWER \
131
- -halo "$::env(FP_PDN_HORIZONTAL_HALO) $::env(FP_PDN_VERTICAL_HALO)"
131
+ -halo "$::env(PDN_HORIZONTAL_HALO) $::env(PDN_VERTICAL_HALO)"
132
132
 
133
133
  add_pdn_connect \
134
134
  -grid macro \
135
- -layers "$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)"
135
+ -layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"