|  | # SPDX-FileCopyrightText: 2020 Efabless Corporation | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  | # | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | ## PDK | 
|  | PDK_PATH = $(PDK_ROOT)/sky130A | 
|  |  | 
|  | ## Caravel Pointers | 
|  | CARAVEL_ROOT ?= ../../../caravel | 
|  | CARAVEL_PATH ?= $(CARAVEL_ROOT) | 
|  | CARAVEL_FIRMWARE_PATH = $(CARAVEL_PATH)/verilog/dv/caravel | 
|  | CARAVEL_VERILOG_PATH  = $(CARAVEL_PATH)/verilog | 
|  | CARAVEL_RTL_PATH = $(CARAVEL_VERILOG_PATH)/rtl | 
|  | CARAVEL_BEHAVIOURAL_MODELS = $(CARAVEL_VERILOG_PATH)/dv/caravel | 
|  |  | 
|  | ## User Project Pointers | 
|  | UPRJ_VERILOG_PATH ?= ../../../verilog | 
|  | UPRJ_RTL_PATH = $(UPRJ_VERILOG_PATH)/rtl | 
|  | UPRJ_BEHAVIOURAL_MODELS = ../ | 
|  |  | 
|  | ## RISCV GCC | 
|  | GCC_PATH?=/usr/bin | 
|  | GCC_PREFIX?=riscv64-unknown-elf | 
|  |  | 
|  | ## Simulation mode: RTL/GL | 
|  | SIM_DEFINES = -DFUNCTIONAL -DSIM | 
|  | SIM?=RTL | 
|  |  | 
|  | .SUFFIXES: | 
|  |  | 
|  | PATTERN = la_test1 | 
|  |  | 
|  | all:  ${PATTERN:=.vcd} | 
|  |  | 
|  | hex:  ${PATTERN:=.hex} | 
|  |  | 
|  | %.vvp: %_tb.v %.hex | 
|  | ifeq ($(SIM),RTL) | 
|  | iverilog $(SIM_DEFINES) -I $(PDK_PATH) \ | 
|  | -I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \ | 
|  | -I $(UPRJ_BEHAVIOURAL_MODELS)    -I $(UPRJ_RTL_PATH) \ | 
|  | $< -o $@ | 
|  | else | 
|  | iverilog $(SIM_DEFINES) -DGL -I $(PDK_PATH) \ | 
|  | -I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \ | 
|  | -I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH)   -I $(UPRJ_VERILOG_PATH) \ | 
|  | $< -o $@ | 
|  | endif | 
|  |  | 
|  | %.vcd: %.vvp | 
|  | vvp $< | 
|  |  | 
|  | %.elf: %.c $(CARAVEL_FIRMWARE_PATH)/sections.lds $(CARAVEL_FIRMWARE_PATH)/start.s check-env | 
|  | ${GCC_PATH}/${GCC_PREFIX}-gcc -I $(CARAVEL_PATH) -march=rv32imc -mabi=ilp32 -Wl,-Bstatic,-T,$(CARAVEL_FIRMWARE_PATH)/sections.lds,--strip-debug -ffreestanding -nostdlib -o $@ $(CARAVEL_FIRMWARE_PATH)/start.s $< | 
|  |  | 
|  | %.hex: %.elf | 
|  | ${GCC_PATH}/${GCC_PREFIX}-objcopy -O verilog $< $@ | 
|  | # to fix flash base address | 
|  | sed -i 's/@10000000/@00000000/g' $@ | 
|  |  | 
|  | %.bin: %.elf | 
|  | ${GCC_PATH}/${GCC_PREFIX}-objcopy -O binary $< /dev/stdout | tail -c +1048577 > $@ | 
|  |  | 
|  | check-env: | 
|  | ifndef PDK_ROOT | 
|  | $(error PDK_ROOT is undefined, please export it before running make) | 
|  | endif | 
|  | ifeq (,$(wildcard $(PDK_ROOT)/sky130A)) | 
|  | $(error $(PDK_ROOT)/sky130A not found, please install pdk before running make) | 
|  | endif | 
|  | ifeq (,$(wildcard $(GCC_PATH)/$(GCC_PREFIX)-gcc )) | 
|  | $(error $(GCC_PATH)/$(GCC_PREFIX)-gcc is not found, please export GCC_PATH and GCC_PREFIX before running make) | 
|  | endif | 
|  | # check for efabless style installation | 
|  | ifeq (,$(wildcard $(PDK_ROOT)/sky130A/libs.ref/*/verilog)) | 
|  | SIM_DEFINES := ${SIM_DEFINES} -DEF_STYLE | 
|  | endif | 
|  |  | 
|  | # ---- Clean ---- | 
|  |  | 
|  | clean: | 
|  | rm -f *.elf *.hex *.bin *.vvp *.vcd *.log | 
|  |  | 
|  | .PHONY: clean hex all |