librelane 2.4.0.dev0__tar.gz → 2.4.0.dev2__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.
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/PKG-INFO +28 -9
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/Readme.md +24 -5
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/__main__.py +6 -1
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/config/config.py +2 -2
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/container.py +1 -1
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/env_info.py +1 -1
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/classic.py +1 -4
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/optimizing.py +1 -1
- librelane-2.4.0.dev2/librelane/scripts/odbpy/ioplace_parser/__init__.py +23 -0
- librelane-2.4.0.dev2/librelane/scripts/odbpy/ioplace_parser/parse.py +147 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/__main__.py +1 -1
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/pyproject.toml +2 -3
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/__init__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/__version__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/__init__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/cli.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/drc.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/generic_dict.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/metrics/__init__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/metrics/__main__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/metrics/library.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/metrics/metric.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/metrics/util.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/misc.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/ring_buffer.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/tcl.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/toolbox.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/tpe.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/common/types.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/config/__init__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/config/__main__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/config/flow.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/config/pdk_compat.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/config/preprocessor.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/config/removals.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/config/variable.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm/config.yaml +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/__init__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/builtins.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/cli.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/flow.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/misc.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/sequential.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/flows/synth_explore.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/logging/__init__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/logging/logger.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/open_pdks_rev +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/plugins.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/py.typed +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/base.sdc +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/klayout/render.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/common/read.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/drc.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/lef/maglef.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/wrapper.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/defutil.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/diodes.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/exception_codes.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/power_utils.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/reader.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/basic_mp.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/dpl.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/grt.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/io.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/resizer.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/cts.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/cut_rows.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/drt.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/fill.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/floorplan.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/gpl.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/gui.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/ioplacer.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/irdrop.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/pdn.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/rcx.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/repair_design.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/sta/corner.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/tapcell.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/pyosys/json_header.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/pyosys/synthesize.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/pyosys/ys_common.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/state/__init__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/state/__main__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/state/design_format.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/state/state.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/__init__.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/checker.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/common_variables.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/cvc_rv.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/klayout.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/magic.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/misc.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/netgen.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/odb.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/openroad.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/pyosys.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/step.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/tclstep.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/verilator.py +0 -0
- {librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/steps/yosys.py +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: librelane
|
|
3
|
-
Version: 2.4.0.
|
|
3
|
+
Version: 2.4.0.dev2
|
|
4
4
|
Summary: An infrastructure for implementing chip design flows
|
|
5
|
+
Home-page: https://github.com/librelane/librelane
|
|
5
6
|
License: Apache-2.0
|
|
6
7
|
Author: Mohamed Gaber
|
|
7
8
|
Author-email: me@donn.website
|
|
@@ -19,8 +20,7 @@ Requires-Dist: click (>=8,<9)
|
|
|
19
20
|
Requires-Dist: cloup (>=3.0.5,<4)
|
|
20
21
|
Requires-Dist: deprecated (>=1.2.10,<2)
|
|
21
22
|
Requires-Dist: httpx (>=0.22.0,<0.29)
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist: klayout (>=0.29.0,<0.30.0)
|
|
23
|
+
Requires-Dist: klayout (>=0.29.0,<0.31.0)
|
|
24
24
|
Requires-Dist: libparse (>=0.3.1,<1)
|
|
25
25
|
Requires-Dist: lxml (>=4.9.0)
|
|
26
26
|
Requires-Dist: psutil (>=5.9.0)
|
|
@@ -49,8 +49,10 @@ Description-Content-Type: text/markdown
|
|
|
49
49
|
|
|
50
50
|
LibreLane is an ASIC infrastructure library based on several components including
|
|
51
51
|
OpenROAD, Yosys, Magic, Netgen, CVC, KLayout and a number of custom scripts for
|
|
52
|
-
design exploration and optimization, currently developed and maintained by
|
|
53
|
-
|
|
52
|
+
design exploration and optimization, currently developed and maintained by
|
|
53
|
+
members and affiliates of the
|
|
54
|
+
[American University in Cairo Open Hardware Lab](https://github.com/aucohl)
|
|
55
|
+
under the stewardship of the [FOSSi Foundation](https://fossi-foundation.org).
|
|
54
56
|
|
|
55
57
|
A reference flow, "Classic", performs all ASIC implementation steps from RTL all
|
|
56
58
|
the way down to GDSII.
|
|
@@ -142,10 +144,27 @@ If you use LibreLane in your research, please cite the following paper.
|
|
|
142
144
|
|
|
143
145
|
## License and Legal Info
|
|
144
146
|
|
|
145
|
-
LibreLane is a trademark of the FOSSi Foundation.
|
|
147
|
+
LibreLane is a trademark of the [FOSSi Foundation](https://fossi-foundation.org).
|
|
146
148
|
|
|
149
|
+
LibreLane code and binaries are available under
|
|
147
150
|
[The Apache License, version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt).
|
|
148
151
|
|
|
149
|
-
LibreLane is based on OpenLane 2.
|
|
150
|
-
|
|
152
|
+
LibreLane is based on [OpenLane 2](https://github.com/efabless/openlane2)
|
|
153
|
+
by Efabless Corporation:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
Copyright 2022-2025 Efabless Corporation
|
|
157
|
+
|
|
158
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
159
|
+
you may not use this file except in compliance with the License.
|
|
160
|
+
You may obtain a copy of the License at
|
|
161
|
+
|
|
162
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
163
|
+
|
|
164
|
+
Unless required by applicable law or agreed to in writing, software
|
|
165
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
166
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
167
|
+
See the License for the specific language governing permissions and
|
|
168
|
+
limitations under the License.
|
|
169
|
+
```
|
|
151
170
|
|
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
LibreLane is an ASIC infrastructure library based on several components including
|
|
16
16
|
OpenROAD, Yosys, Magic, Netgen, CVC, KLayout and a number of custom scripts for
|
|
17
|
-
design exploration and optimization, currently developed and maintained by
|
|
18
|
-
|
|
17
|
+
design exploration and optimization, currently developed and maintained by
|
|
18
|
+
members and affiliates of the
|
|
19
|
+
[American University in Cairo Open Hardware Lab](https://github.com/aucohl)
|
|
20
|
+
under the stewardship of the [FOSSi Foundation](https://fossi-foundation.org).
|
|
19
21
|
|
|
20
22
|
A reference flow, "Classic", performs all ASIC implementation steps from RTL all
|
|
21
23
|
the way down to GDSII.
|
|
@@ -107,9 +109,26 @@ If you use LibreLane in your research, please cite the following paper.
|
|
|
107
109
|
|
|
108
110
|
## License and Legal Info
|
|
109
111
|
|
|
110
|
-
LibreLane is a trademark of the FOSSi Foundation.
|
|
112
|
+
LibreLane is a trademark of the [FOSSi Foundation](https://fossi-foundation.org).
|
|
111
113
|
|
|
114
|
+
LibreLane code and binaries are available under
|
|
112
115
|
[The Apache License, version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt).
|
|
113
116
|
|
|
114
|
-
LibreLane is based on OpenLane 2.
|
|
115
|
-
|
|
117
|
+
LibreLane is based on [OpenLane 2](https://github.com/efabless/openlane2)
|
|
118
|
+
by Efabless Corporation:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
Copyright 2022-2025 Efabless Corporation
|
|
122
|
+
|
|
123
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
124
|
+
you may not use this file except in compliance with the License.
|
|
125
|
+
You may obtain a copy of the License at
|
|
126
|
+
|
|
127
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
128
|
+
|
|
129
|
+
Unless required by applicable law or agreed to in writing, software
|
|
130
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
131
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
132
|
+
See the License for the specific language governing permissions and
|
|
133
|
+
limitations under the License.
|
|
134
|
+
```
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
# Copyright 2025 The American University in Cairo
|
|
2
|
+
#
|
|
3
|
+
# Adapted from OpenLane
|
|
4
|
+
#
|
|
1
5
|
# Copyright 2023 Efabless Corporation
|
|
2
6
|
#
|
|
3
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -202,7 +206,8 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool):
|
|
|
202
206
|
f"""
|
|
203
207
|
LibreLane v{__version__}
|
|
204
208
|
|
|
205
|
-
Copyright ©2020-
|
|
209
|
+
Copyright ©2020-2025 Efabless Corporation, The American University in
|
|
210
|
+
Cairo, and other contributors.
|
|
206
211
|
|
|
207
212
|
Available under the Apache License, version 2. Included with the source code,
|
|
208
213
|
but you can also get a copy at https://www.apache.org/licenses/LICENSE-2.0
|
|
@@ -102,7 +102,7 @@ class PassedDirectoryError(ValueError):
|
|
|
102
102
|
def __init__(self, config: AnyPath) -> None:
|
|
103
103
|
self.config = str(config)
|
|
104
104
|
super().__init__(
|
|
105
|
-
"Passing design directories as arguments is unsupported in LibreLane
|
|
105
|
+
"Passing design directories as arguments is unsupported in LibreLane: please pass the configuration file(s) directly."
|
|
106
106
|
)
|
|
107
107
|
|
|
108
108
|
|
|
@@ -960,7 +960,7 @@ class Config(GenericImmutableDict[str, Any]):
|
|
|
960
960
|
pass
|
|
961
961
|
if not isinstance(dis, int) or dis in [1, 2, 5] or dis > 6:
|
|
962
962
|
errors.append(
|
|
963
|
-
f"DIODE_INSERTION_STRATEGY '{dis}' is not available in LibreLane 2 or higher. See 'Migrating DIODE_INSERTION_STRATEGY' in the docs for more info."
|
|
963
|
+
f"DIODE_INSERTION_STRATEGY '{dis}' is not available in LibreLane 2.0 or higher. See 'Migrating DIODE_INSERTION_STRATEGY' in the docs for more info."
|
|
964
964
|
)
|
|
965
965
|
else:
|
|
966
966
|
warnings.append(
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
## This file is internal to LibreLane
|
|
15
|
+
## This file is internal to LibreLane and is not part of the API.
|
|
16
16
|
import os
|
|
17
17
|
import re
|
|
18
18
|
import uuid
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
# environment surveys. Please ensure all code as compatible as possible
|
|
19
19
|
# with ancient versions of Python.
|
|
20
20
|
|
|
21
|
-
## This file is internal to LibreLane
|
|
21
|
+
## This file is internal to LibreLane and is not part of the API.
|
|
22
22
|
import os
|
|
23
23
|
import re
|
|
24
24
|
import sys
|
|
@@ -30,11 +30,8 @@ from ..steps import (
|
|
|
30
30
|
@Flow.factory.register()
|
|
31
31
|
class Classic(SequentialFlow):
|
|
32
32
|
"""
|
|
33
|
-
**Note: While LibreLane 2 has a stable release, the default flow is in beta
|
|
34
|
-
pending silicon validation. Use at your own risk.**
|
|
35
|
-
|
|
36
33
|
A flow of type :class:`librelane.flows.SequentialFlow` that is the most
|
|
37
|
-
similar to the original
|
|
34
|
+
similar to the original OpenLane flow, running the Verilog RTL through
|
|
38
35
|
Yosys, OpenROAD, KLayout and Magic to produce a valid GDSII for simpler designs.
|
|
39
36
|
|
|
40
37
|
This is the default when using LibreLane via the command-line.
|
|
@@ -23,7 +23,7 @@ from ..steps import Step, Yosys, OpenROAD, StepError
|
|
|
23
23
|
from ..logging import get_log_level, set_log_level, LogLevels, success, info
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
# "Optimizing" is a custom demo flow to show what's possible with non-sequential Flows in
|
|
26
|
+
# "Optimizing" is a custom demo flow to show what's possible with non-sequential Flows in LibreLan
|
|
27
27
|
# It works across two steps:
|
|
28
28
|
# * The Synthesis Exploration - tries multiple synthesis strategies in *parallel*.
|
|
29
29
|
# The best-performing strategy in terms of minimizing the area makes it to the next stage.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Copyright 2025 The American University in Cairo
|
|
2
|
+
#
|
|
3
|
+
# Adapted from ioplace_parser
|
|
4
|
+
#
|
|
5
|
+
# Copyright 2020-2023 Efabless Corporation
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
"""
|
|
19
|
+
This is a modified version of https://github.com/efabless/ioplace_parser that
|
|
20
|
+
does NOT use Antlr4 and instead uses a custom parser that is faster and
|
|
21
|
+
dependency-free.
|
|
22
|
+
"""
|
|
23
|
+
from .parse import Side, Order, parse
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Copyright 2025 The American University in Cairo
|
|
2
|
+
#
|
|
3
|
+
# Adapted from ioplace_parser
|
|
4
|
+
#
|
|
5
|
+
# Copyright 2020-2023 Efabless Corporation
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
import re
|
|
19
|
+
from enum import IntEnum
|
|
20
|
+
from typing import Literal, Optional, Dict, List, Union
|
|
21
|
+
from decimal import Decimal
|
|
22
|
+
import warnings
|
|
23
|
+
|
|
24
|
+
from dataclasses import dataclass, field
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Order(IntEnum):
|
|
28
|
+
busMajor = 0
|
|
29
|
+
bitMajor = 1
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class Side:
|
|
34
|
+
min_distance: Optional[Decimal] = None
|
|
35
|
+
reverse_result: bool = False
|
|
36
|
+
pins: List[Union[str, int]] = field(default_factory=list)
|
|
37
|
+
sort_mode: Optional[Order] = Order.busMajor
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
VALUE_ANNOTATIONS = ["min_distance"]
|
|
41
|
+
STANDALONE_ANNOTATIONS = [
|
|
42
|
+
"bus_major",
|
|
43
|
+
"bit_major",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def parse(string: str) -> Dict[Literal["N", "E", "W", "S"], Side]:
|
|
48
|
+
"""
|
|
49
|
+
Parses a pin configuration into a dictionary of the four cardinal sides.
|
|
50
|
+
|
|
51
|
+
:param string: The input configuration as a string (not a file path)
|
|
52
|
+
:returns: A dictionary where each cardinal direction points to a Side object.
|
|
53
|
+
:raises ValueError: On syntax or token recognition errors
|
|
54
|
+
"""
|
|
55
|
+
sides = {}
|
|
56
|
+
current_side: Optional[Side] = None
|
|
57
|
+
global_sort_mode: Order = Order.busMajor
|
|
58
|
+
global_min_distance: Optional[Decimal] = None
|
|
59
|
+
|
|
60
|
+
string_mut = string
|
|
61
|
+
|
|
62
|
+
ws_rx = re.compile(r"^\s+")
|
|
63
|
+
annotation_rx = re.compile(r"^@\s*(\w+)(?:\s*=\s*([0-9]+(?:.[0-9]+)?))?")
|
|
64
|
+
direction_rx = re.compile(r"^#\s*([NEWS]R?|BUS_SORT)")
|
|
65
|
+
virtual_pin_rx = re.compile(r"^\$\s*([0-9]+)")
|
|
66
|
+
non_ws_rx = re.compile(r"^\S+")
|
|
67
|
+
while len(string_mut):
|
|
68
|
+
# annotation
|
|
69
|
+
if skip_match := ws_rx.search(string_mut):
|
|
70
|
+
string_mut = string_mut[skip_match.end() :]
|
|
71
|
+
elif anno_match := annotation_rx.search(string_mut):
|
|
72
|
+
annotation = anno_match[1]
|
|
73
|
+
if annotation in VALUE_ANNOTATIONS:
|
|
74
|
+
if anno_match[2] is None:
|
|
75
|
+
raise ValueError(f"Annotation {annotation} requires a value")
|
|
76
|
+
value = anno_match[2]
|
|
77
|
+
if annotation == "min_distance":
|
|
78
|
+
if current_side is None:
|
|
79
|
+
global_min_distance = Decimal(value)
|
|
80
|
+
else:
|
|
81
|
+
current_side.min_distance = Decimal(value)
|
|
82
|
+
elif annotation in STANDALONE_ANNOTATIONS:
|
|
83
|
+
if anno_match[2] is not None:
|
|
84
|
+
raise ValueError(
|
|
85
|
+
f"Annotation {annotation} cannot be assigned a value"
|
|
86
|
+
)
|
|
87
|
+
if annotation == "bus_major":
|
|
88
|
+
if current_side is None:
|
|
89
|
+
global_sort_mode = Order.busMajor
|
|
90
|
+
else:
|
|
91
|
+
current_side.sort_mode = Order.busMajor
|
|
92
|
+
elif annotation == "bit_major":
|
|
93
|
+
if current_side is None:
|
|
94
|
+
global_sort_mode = Order.bitMajor
|
|
95
|
+
else:
|
|
96
|
+
current_side.sort_mode = Order.bitMajor
|
|
97
|
+
else:
|
|
98
|
+
raise ValueError(f"Unknown annotation '{annotation}'")
|
|
99
|
+
string_mut = string_mut[anno_match.end() :]
|
|
100
|
+
elif dir_match := direction_rx.search(string_mut):
|
|
101
|
+
direction = dir_match[1]
|
|
102
|
+
if direction == "BUS_SORT":
|
|
103
|
+
warnings.warn(
|
|
104
|
+
"Specifying bit-major using the direction token ('#BUS_SORT') is deprecated: use @bit_major."
|
|
105
|
+
)
|
|
106
|
+
global_sort_mode = Order.bitMajor
|
|
107
|
+
else:
|
|
108
|
+
current_side = Side(
|
|
109
|
+
min_distance=global_min_distance,
|
|
110
|
+
reverse_result=len(direction) == 2,
|
|
111
|
+
sort_mode=global_sort_mode,
|
|
112
|
+
)
|
|
113
|
+
side: Literal["N", "E", "W", "S"] = direction[0] # type: ignore
|
|
114
|
+
sides[side] = current_side
|
|
115
|
+
string_mut = string_mut[dir_match.end() :]
|
|
116
|
+
elif vp_match := virtual_pin_rx.search(string_mut):
|
|
117
|
+
count = int(vp_match[1])
|
|
118
|
+
if current_side is None:
|
|
119
|
+
raise ValueError(
|
|
120
|
+
f"virtual pin declaration ${count} requires a direction to be set first"
|
|
121
|
+
)
|
|
122
|
+
current_side.pins.append(count)
|
|
123
|
+
string_mut = string_mut[vp_match.end() :]
|
|
124
|
+
elif nonws_match := non_ws_rx.match(string_mut):
|
|
125
|
+
# assume regex
|
|
126
|
+
if current_side is None:
|
|
127
|
+
raise ValueError(
|
|
128
|
+
f"identifier/regex '{nonws_match[0]}' requires a direction to be set first"
|
|
129
|
+
)
|
|
130
|
+
current_side.pins.append(nonws_match[0])
|
|
131
|
+
string_mut = string_mut[nonws_match.end() :]
|
|
132
|
+
else:
|
|
133
|
+
raise ValueError(
|
|
134
|
+
f"Syntax Error: Unexpected character starting at {string_mut[:10]}…"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
all_sides: List[Literal["N", "E", "W", "S"]] = ["N", "E", "W", "S"]
|
|
138
|
+
for side in all_sides:
|
|
139
|
+
if side in sides:
|
|
140
|
+
continue
|
|
141
|
+
sides[side] = Side(
|
|
142
|
+
min_distance=global_min_distance,
|
|
143
|
+
reverse_result=False,
|
|
144
|
+
sort_mode=global_sort_mode,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return sides
|
|
@@ -418,7 +418,7 @@ def create_reproducible(
|
|
|
418
418
|
* The current working directory
|
|
419
419
|
|
|
420
420
|
These reproducibles are filesystem-independent, i.e. they can be run
|
|
421
|
-
on any computer that has the appropriate version of LibreLane
|
|
421
|
+
on any computer that has the appropriate version of LibreLane installed
|
|
422
422
|
(as well as the underlying utility for that specific step.)
|
|
423
423
|
|
|
424
424
|
The reproducible will report an error if LibreLane is not installed and will
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "librelane"
|
|
3
|
-
version = "2.4.
|
|
3
|
+
version = "2.4.0.dev2"
|
|
4
4
|
description = "An infrastructure for implementing chip design flows"
|
|
5
5
|
authors = ["Mohamed Gaber <me@donn.website>", "Efabless Corporation"]
|
|
6
6
|
readme = "Readme.md"
|
|
@@ -21,9 +21,8 @@ deprecated = ">=1.2.10,<2"
|
|
|
21
21
|
libparse = ">=0.3.1,<1"
|
|
22
22
|
psutil = ">=5.9.0"
|
|
23
23
|
httpx = ">=0.22.0,<0.29"
|
|
24
|
-
klayout = ">=0.29.0,<0.
|
|
24
|
+
klayout = ">=0.29.0,<0.31.0"
|
|
25
25
|
rapidfuzz = ">=3.9.0,<4"
|
|
26
|
-
ioplace-parser = ">=0.3.0,<0.5.0"
|
|
27
26
|
yamlcore = "^0.0.2"
|
|
28
27
|
semver = "^3.0.2"
|
|
29
28
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/examples/spm-user_project_wrapper/defines.v
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/klayout/xml_drc_report_to_json.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/magic/gds/mag_with_pointers.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/odbpy/check_antenna_properties.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/dpl_cell_pad.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/common/set_power_nets.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/repair_design_postgrt.tcl
RENAMED
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/rsz_timing_postcts.tcl
RENAMED
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/openroad/rsz_timing_postgrt.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.0.dev0 → librelane-2.4.0.dev2}/librelane/scripts/pyosys/construct_abc_script.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|