| # Copyright lowRISC contributors. | 
 | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | CUR_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) | 
 | PRJ_DIR := $(realpath ${CUR_DIR}/../) | 
 |  | 
 | REG_OUTPUT_DIR    ?= ${PRJ_DIR}/build/regs-generated | 
 | REG_OUTPUT_DV_DIR ?= ${REG_OUTPUT_DIR}/dv | 
 | REG_OUTPUT_SW_DIR ?= ${REG_OUTPUT_DIR}/sw | 
 |  | 
 | IPS ?= aes           \ | 
 |        adc_ctrl      \ | 
 |        aon_timer     \ | 
 |        clkmgr        \ | 
 |        entropy_src   \ | 
 |        csrng         \ | 
 |        edn           \ | 
 |        flash_ctrl    \ | 
 |        gpio          \ | 
 |        hmac          \ | 
 |        kmac          \ | 
 |        i2c           \ | 
 |        keymgr        \ | 
 |        lc_ctrl       \ | 
 |        otp_ctrl      \ | 
 |        pattgen       \ | 
 |        pinmux        \ | 
 |        pwm           \ | 
 |        pwrmgr        \ | 
 |        rom_ctrl      \ | 
 |        rstmgr        \ | 
 |        rv_core_ibex  \ | 
 |        rv_dm         \ | 
 |        rv_timer      \ | 
 |        sensor_ctrl   \ | 
 |        spi_device    \ | 
 |        spi_host      \ | 
 |        sram_ctrl     \ | 
 |        sysrst_ctrl   \ | 
 |        trial1        \ | 
 |        otbn          \ | 
 |        uart          \ | 
 |        usbdev | 
 |  | 
 | TOPS ?= top_earlgrey | 
 |  | 
 | # conditional flags | 
 | VERBOSE ?= 0 | 
 | toolflags ?= | 
 | ifeq ($(VERBOSE),1) | 
 |   toolflags      += -v | 
 | endif | 
 |  | 
 | dir_hjson = data | 
 |  | 
 | hjson_for_ip = ${PRJ_DIR}/hw/ip/$(1)/$(dir_hjson)/$(1).hjson | 
 |  | 
 | # IPs that have a directory in hw/ip | 
 | local_ips := \ | 
 |   $(foreach i,$(IPS),$(if $(wildcard $(call hjson_for_ip,$(i))),$(i))) | 
 |  | 
 | # Per-IP targets (all phonies) | 
 | ips_reg        = $(addsuffix _reg, $(local_ips)) | 
 | ips_reg_header = $(addsuffix _reg_header, $(local_ips)) | 
 | ips_reg_rust   = $(foreach ip,$(local_ips),$(REG_OUTPUT_SW_DIR)/$(ip)_reg_constants.rs) | 
 |  | 
 | # Per-top targets (all phonies) | 
 | tops_gen = $(addsuffix _gen,$(TOPS)) | 
 | tops_reg = $(addsuffix _reg,$(TOPS)) | 
 |  | 
 | # Targets for installing files into TOCK_ROOT (empty if TOCK_ROOT is not defined) | 
 | ifneq ($(TOCK_ROOT),) | 
 | tock_rust_destdir    := $(TOCK_ROOT)/chips/lowrisc/src/reg_constants | 
 | ips_reg_rust_install := $(addprefix $(tock_rust_destdir)/,$(notdir $(ips_reg_rust))) | 
 |  | 
 | $(tock_rust_destdir): | 
 | 	mkdir -p $@ | 
 | endif | 
 |  | 
 | .PHONY: $(ips_reg) $(ips_reg_header) $(ips_reg_rust) $(tops_gen) $(tops_reg) | 
 |  | 
 | all: $(ips_reg) $(tops_gen) $(tops_reg) | 
 |  | 
 | regs: $(ips_reg) $(tops_reg) | 
 |  | 
 | $(REG_OUTPUT_DV_DIR) $(REG_OUTPUT_SW_DIR): %: | 
 | 	mkdir -p $@ | 
 |  | 
 | blk-gen-script = $(PRJ_DIR)/hw/ip/$*/util/$*_gen.py | 
 | blk-hjson      = $(PRJ_DIR)/hw/ip/$*/$(dir_hjson)/$*.hjson | 
 |  | 
 | # If the ip has a local generation script, run it first. This will | 
 | # require all blocks to use a consistent naming. This should be hooked | 
 | # into ipgen (see #5636) for completeness. | 
 | $(ips_reg): %_reg: | $(REG_OUTPUT_DV_DIR) | 
 | 	$(if $(wildcard $(blk-gen-script)),$(blk-gen-script)) | 
 | 	${PRJ_DIR}/util/regtool.py ${toolflags} -r $(blk-hjson) | 
 | 	${PRJ_DIR}/util/regtool.py --sec-cm-testplan $(blk-hjson) | 
 | 	${PRJ_DIR}/util/regtool.py -s -t $(REG_OUTPUT_DV_DIR) $(blk-hjson) | 
 |  | 
 | # Register generation for otp_ctrl also depends on running gen-otp-mmap.py | 
 | .PHONY: otp-mmap | 
 | $(filter otp_ctrl_reg,$(ips_reg)): otp-mmap | 
 | otp-mmap: | 
 | 	cd ${PRJ_DIR} && ./util/design/gen-otp-mmap.py | 
 |  | 
 | # Register generation for lc_ctrl also depends on running gen-lc-state-enc.py | 
 | .PHONY: lc-state-enc | 
 | $(filter lc_ctrl_reg,$(ips_reg)): lc-state-enc | 
 | lc-state-enc: | 
 | 	cd ${PRJ_DIR} && ./util/design/gen-lc-state-enc.py | 
 |  | 
 | regs-header: $(ips_reg_header) | 
 |  | 
 | $(ips_reg_header): %_reg_header: | $(REG_OUTPUT_SW_DIR) | 
 | 	${PRJ_DIR}/util/regtool.py -D -o $(REG_OUTPUT_SW_DIR)/$*_reg_headers.h $(blk-hjson) | 
 |  | 
 | regs-rust: $(ips_reg_rust_install) $(ips_reg_rust) | 
 |  | 
 | $(ips_reg_rust): $(REG_OUTPUT_SW_DIR)/%_reg_constants.rs: | $(REG_OUTPUT_SW_DIR) | 
 | 	${PRJ_DIR}/util/regtool.py -R -o $@ $(blk-hjson) | 
 |  | 
 | $(ips_reg_rust_install): $(tock_rust_destdir)/%: $(REG_OUTPUT_SW_DIR)/% | $(tock_rust_destdir) | 
 | 	cp $< $@ | 
 |  | 
 | clean-regs-header: | 
 | 	rm -r -f ${REG_OUTPUT_SW_DIR} | 
 |  | 
 | top-hjson = $(PRJ_DIR)/hw/$*/data/$*.hjson | 
 |  | 
 | top: $(tops_gen) $(tops_reg) | 
 | $(tops_gen): %_gen: | 
 | 	${PRJ_DIR}/util/topgen.py -t $(top-hjson) -o ${PRJ_DIR}/hw/$*/ ${toolflags} | 
 |  | 
 | $(tops_reg): %_reg: | 
 | 	mkdir -p ${REG_OUTPUT_DV_DIR}/$* | 
 | 	${PRJ_DIR}/util/topgen.py -t $(top-hjson) -r -o ${REG_OUTPUT_DV_DIR}/$* ${toolflags} | 
 |  | 
 |  | 
 | .PHONY: all |