mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-04 22:32:36 +00:00
- Introduced to create pad-aware timing constraints for the Tiny IHP130 chip flow. - Added to create a checksummed delivery archive for the Tiny LibreLane implementation. - Created for synthesis-only header of the locked IHP SRAM macro physical views. - Implemented to limit OpenSTA report enumeration for path counts. - Updated to include power pad definitions. - Enhanced to handle power pad counts and validation. - Added tests for Tiny flow and pin map validation, including power pad overrides and constraints.
134 lines
6.6 KiB
Makefile
134 lines
6.6 KiB
Makefile
LIBRELANE_FLOW_ROOT := $(ROOT_PATH)/physical/librelane/tiny
|
|
LIBRELANE_RUN_ROOT := $(VARIANT_ROOT)/physical/librelane/tiny/chip
|
|
LIBRELANE_INPUT_DIR := $(LIBRELANE_RUN_ROOT)/input
|
|
LIBRELANE_RTL := $(LIBRELANE_INPUT_DIR)/retrosoc_tiny_asic_sources.sv
|
|
LIBRELANE_SDC := $(LIBRELANE_INPUT_DIR)/retrosoc_tiny_chip.sdc
|
|
LIBRELANE_BONDPAD_GDS := $(LIBRELANE_INPUT_DIR)/bondpad_70x70.gds
|
|
LIBRELANE_BONDPAD_LEF := $(ROOT_PATH)/physical/librelane/bondpad/bondpad_70x70.lef
|
|
LIBRELANE_CONFIG := $(LIBRELANE_RUN_ROOT)/config.json
|
|
LIBRELANE_LOG := $(LIBRELANE_RUN_ROOT)/librelane.log
|
|
LIBRELANE_RESULT := $(LIBRELANE_RUN_ROOT)/result.json
|
|
LIBRELANE_META_RESULT := $(META_DIR)/librelane-chip.json
|
|
LIBRELANE_DOCTOR_RESULT := $(META_DIR)/librelane-chip-doctor.json
|
|
LIBRELANE_FINAL_DIR := $(LIBRELANE_RUN_ROOT)/final
|
|
LIBRELANE_ARCHIVE := $(LIBRELANE_RUN_ROOT)/retrosoc-tiny-ihp130-chip.tar.gz
|
|
LIBRELANE_RUN_TAG ?= current
|
|
LIBRELANE_PDK_ROOT := $(ROOT_PATH)/physical/pdk/IHP-Open-PDK
|
|
LIBRELANE_PDK := ihp-sg13g2
|
|
LIBRELANE_SCL := sg13g2_stdcell
|
|
LIBRELANE_PAD := sg13g2_io
|
|
LIBRELANE_KLAYOUT_PATH := $(LIBRELANE_PDK_ROOT)/$(LIBRELANE_PDK)/libs.tech/klayout
|
|
LIBRELANE_BONDPAD_SCRIPT := $(LIBRELANE_PDK_ROOT)/$(LIBRELANE_PDK)/libs.tech/klayout/tech/scripts/bondpad.py
|
|
LIBRELANE_PDN := $(LIBRELANE_FLOW_ROOT)/pdn_cfg.tcl
|
|
LIBRELANE_SRAM_VH := $(LIBRELANE_FLOW_ROOT)/sram_blackboxes.vh
|
|
LIBRELANE_STA_REPORT_LIMIT := $(LIBRELANE_FLOW_ROOT)/sta_report_limit.tcl
|
|
LIBRELANE_CLOCK_DOMAINS := $(RTL_PATH)/integration/clock_reset_domains.json
|
|
LIBRELANE_PIN_MAP := $(RTL_PATH)/pin_map/pin_map.json
|
|
LIBRELANE_TRACKED_RTL := $(shell git -C $(ROOT_PATH) ls-files \
|
|
'rtl/**/*.sv' 'rtl/**/*.svh' 'rtl/**/*.v' 'rtl/**/*.vh')
|
|
|
|
LIBRELANE_SOURCE_PYTHON ?= /usr/bin/python3
|
|
LIBRELANE_PYTHON ?= python3
|
|
LIBRELANE_COMMAND := $(LIBRELANE_PYTHON) -m librelane
|
|
# LibreLane 3.0.5 writes 1000 expanded paths per group at every mid-PnR STA.
|
|
# Final multi-corner RCX STA remains mandatory; skip only the redundant reports.
|
|
LIBRELANE_MID_PNR_SKIP ?= --skip OpenROAD.STAMidPNR
|
|
|
|
ifneq ($(filter librelane-input librelane-doctor librelane-chip \
|
|
librelane-openroad librelane-klayout librelane-package,$(MAKECMDGOALS)),)
|
|
FLOW_PYTHON := $(LIBRELANE_SOURCE_PYTHON)
|
|
endif
|
|
|
|
LIBRELANE_FEATURE_ARGS := \
|
|
$(if $(filter YES,$(HAVE_PLL)),--have-pll) \
|
|
$(if $(filter YES,$(HAVE_SRAM_IF)),--have-sram-if) \
|
|
$(if $(filter YES,$(HAVE_SRAM_MACRO)),--have-sram-macro) \
|
|
$(if $(filter YES,$(HAVE_SVA)),--have-sva)
|
|
|
|
LIBRELANE_CONFIG_DEPS := $(LIBRELANE_RTL) $(LIBRELANE_SDC) \
|
|
$(LIBRELANE_PDN) $(LIBRELANE_SRAM_VH) \
|
|
$(LIBRELANE_STA_REPORT_LIMIT) $(LIBRELANE_BONDPAD_GDS) $(LIBRELANE_BONDPAD_LEF) \
|
|
$(LIBRELANE_FLOW_ROOT)/scripts/generate_chip_config.py
|
|
|
|
.PHONY: librelane-check-pdk librelane-input librelane-doctor librelane-chip \
|
|
librelane-openroad librelane-klayout librelane-package
|
|
|
|
librelane-check-pdk:
|
|
@test '$(PDK)' = IHP130 || { \
|
|
echo 'physical/librelane/tiny currently implements only PDK=IHP130' >&2; exit 2; }
|
|
@test '$(HAVE_PLL)' = NO || { \
|
|
echo 'the IHP130 LibreLane flow has no qualified crystal PAD' >&2; exit 2; }
|
|
|
|
$(LIBRELANE_RTL): $(FILELIST_STAMP) $(LIBRELANE_TRACKED_RTL) \
|
|
$(ROOT_PATH)/physical/smoke/syn/tools/export_soc_sources.py | librelane-check-pdk
|
|
@mkdir -p $(@D)
|
|
$(FLOW_PYTHON) $(ROOT_PATH)/physical/smoke/syn/tools/export_soc_sources.py sv \
|
|
--output-dir $(@D) --soc TINY --pdk IHP130 --simu $(SIMU) \
|
|
--jtag-idcode $(JTAG_IDCODE) \
|
|
--ext-clk-hz $(EXT_CLK_HZ) --aud-clk-hz $(AUD_CLK_HZ) \
|
|
--clint-timebase-hz $(CLINT_TIMEBASE_HZ) \
|
|
--source-filelist-dir $(GENERATED_FL_DIR) \
|
|
--librelane-safe \
|
|
$(LIBRELANE_FEATURE_ARGS)
|
|
|
|
$(LIBRELANE_SDC): $(LIBRELANE_FLOW_ROOT)/scripts/generate_sdc.py \
|
|
$(LIBRELANE_CLOCK_DOMAINS) $(LIBRELANE_PIN_MAP) | librelane-check-pdk
|
|
@mkdir -p $(@D)
|
|
$(FLOW_PYTHON) $(LIBRELANE_FLOW_ROOT)/scripts/generate_sdc.py \
|
|
--domains $(LIBRELANE_CLOCK_DOMAINS) --pin-map $(LIBRELANE_PIN_MAP) \
|
|
--ext-clk-hz $(EXT_CLK_HZ) --output $@
|
|
|
|
$(LIBRELANE_BONDPAD_GDS): $(LIBRELANE_BONDPAD_SCRIPT) | librelane-check-pdk
|
|
@mkdir -p $(@D)
|
|
KLAYOUT_PATH=$(LIBRELANE_KLAYOUT_PATH) klayout -n sg13g2 -zz \
|
|
-r $(LIBRELANE_BONDPAD_SCRIPT) -rd diameter=70.0 -rd shape=square \
|
|
-rd output=$@
|
|
@test -s $@
|
|
|
|
$(LIBRELANE_CONFIG): $(LIBRELANE_CONFIG_DEPS)
|
|
$(FLOW_PYTHON) $(LIBRELANE_FLOW_ROOT)/scripts/generate_chip_config.py \
|
|
--pin-map $(LIBRELANE_PIN_MAP) --rtl $(LIBRELANE_RTL) --sdc $(LIBRELANE_SDC) \
|
|
--pdn $(LIBRELANE_PDN) --bondpad-gds $(LIBRELANE_BONDPAD_GDS) \
|
|
--bondpad-lef $(LIBRELANE_BONDPAD_LEF) --sram-vh $(LIBRELANE_SRAM_VH) \
|
|
--ext-clk-hz $(EXT_CLK_HZ) --sram-size-kib $(SRAM_SIZE_KIB) \
|
|
$(if $(filter YES,$(HAVE_SRAM_MACRO)),--have-sram-macro) \
|
|
--output $@
|
|
|
|
librelane-input: $(LIBRELANE_CONFIG)
|
|
|
|
$(LIBRELANE_DOCTOR_RESULT): $(LIBRELANE_CONFIG) \
|
|
$(LIBRELANE_FLOW_ROOT)/scripts/doctor.py
|
|
@mkdir -p $(@D)
|
|
$(LIBRELANE_PYTHON) $(LIBRELANE_FLOW_ROOT)/scripts/doctor.py \
|
|
--root $(ROOT_PATH) --config $(LIBRELANE_CONFIG) --lock $(LOCK_FILE) \
|
|
--pin-map $(LIBRELANE_PIN_MAP) --pdk-root $(LIBRELANE_PDK_ROOT) --output $@
|
|
|
|
librelane-doctor: $(LIBRELANE_DOCTOR_RESULT)
|
|
|
|
librelane-chip: librelane-doctor manifest
|
|
$(FLOW_PYTHON) $(ROOT_PATH)/scripts/run_flow.py --tool librelane \
|
|
--log $(LIBRELANE_LOG) --result $(LIBRELANE_RESULT) --cwd $(LIBRELANE_RUN_ROOT) -- \
|
|
$(LIBRELANE_COMMAND) $(LIBRELANE_CONFIG) --manual-pdk --pdk $(LIBRELANE_PDK) \
|
|
--pdk-root $(LIBRELANE_PDK_ROOT) --scl $(LIBRELANE_SCL) --pad $(LIBRELANE_PAD) \
|
|
--run-tag $(LIBRELANE_RUN_TAG) --overwrite --jobs $(JOBS) $(LIBRELANE_MID_PNR_SKIP) \
|
|
--condensed --hide-progress-bar --save-views-to $(LIBRELANE_FINAL_DIR)
|
|
@mkdir -p $(META_DIR)
|
|
@cp $(LIBRELANE_RESULT) $(LIBRELANE_META_RESULT)
|
|
|
|
librelane-openroad: librelane-doctor
|
|
cd $(LIBRELANE_RUN_ROOT) && $(LIBRELANE_COMMAND) $(LIBRELANE_CONFIG) --manual-pdk \
|
|
--pdk $(LIBRELANE_PDK) --pdk-root $(LIBRELANE_PDK_ROOT) \
|
|
--scl $(LIBRELANE_SCL) --pad $(LIBRELANE_PAD) \
|
|
--run-tag $(LIBRELANE_RUN_TAG) --last-run --flow OpenInOpenROAD
|
|
|
|
librelane-klayout: librelane-doctor
|
|
cd $(LIBRELANE_RUN_ROOT) && $(LIBRELANE_COMMAND) $(LIBRELANE_CONFIG) --manual-pdk \
|
|
--pdk $(LIBRELANE_PDK) --pdk-root $(LIBRELANE_PDK_ROOT) \
|
|
--scl $(LIBRELANE_SCL) --pad $(LIBRELANE_PAD) \
|
|
--run-tag $(LIBRELANE_RUN_TAG) --last-run --flow OpenInKLayout
|
|
|
|
librelane-package: librelane-chip
|
|
$(FLOW_PYTHON) $(LIBRELANE_FLOW_ROOT)/scripts/package.py \
|
|
--root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) \
|
|
--run-root $(LIBRELANE_RUN_ROOT) --output $(LIBRELANE_ARCHIVE)
|