blob: 07e89987bf668c48fa695ca554eb972c630f2fac [file] [log] [blame]
# 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