[top_englishbreakfast] Add script to prepare SW
Currently, our SW build cannot deal with different top levels. This commit
adds a script to modify the sources produced by topgen such that the
required SW can be built.
Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/hw/top_englishbreakfast/util/prepare_sw.py b/hw/top_englishbreakfast/util/prepare_sw.py
new file mode 100755
index 0000000..66aebd1
--- /dev/null
+++ b/hw/top_englishbreakfast/util/prepare_sw.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python3
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+r"""Script to prepare SW for non-earlgrey tops
+"""
+
+import sys
+import subprocess
+import re
+from pathlib import Path
+
+
+def main():
+
+ # Config
+ name_old = 'earlgrey'
+ name = 'englishbreakfast'
+
+ topname = 'top_' + name
+
+ # We first need to run topgen in order to create all auto-generated files.
+ path_root = str(Path(__file__).resolve().parents[3])
+ path_in = path_root + '/hw/' + topname + '/data/'
+ path_out = path_root + '/hw/' + topname
+ cmd = [path_root + '/util/topgen.py', # "--verbose",
+ "-t", path_in + topname + '.hjson',
+ "-c", path_in,
+ "-o", path_out]
+
+ try:
+ print("Running topgen...")
+ subprocess.run(cmd,
+ check=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ universal_newlines=True)
+
+ except subprocess.CalledProcessError as e:
+ print("topgen failed: " + str(e))
+ sys.exit(1)
+
+ # We need to patch some files:
+ # 1. meson.build needs to be pointed to the proper auto-gen files.
+ # 2. SW sources currently contain hardcoded references to top_earlgrey. We
+ # need to change some file and variable names in auto-generated files.
+ # 3. The build system still uses some sources from the original top level.
+ # We thus need to replace those with the new sources patched in 2.
+
+ # 1.
+ cmd = ['sed', '-i', "s/TOPNAME='top_{}'/TOPNAME='top_{}'/g".format(name_old, name),
+ path_root + '/meson.build']
+ try:
+ print("Adjusting meson.build...")
+ subprocess.run(cmd,
+ check=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ universal_newlines=True)
+
+ except subprocess.CalledProcessError as e:
+ print("Adjustment of meson.build failed: " + str(e))
+ sys.exit(1)
+
+ # 2. and 3.
+ print("Adjusting SW files generated by topgen...")
+ files = ['top_' + name + '.c',
+ 'top_' + name + '.h',
+ 'top_' + name + '_memory.h',
+ 'top_' + name + '_memory.ld']
+ path_in = path_root + '/hw/top_' + name + '/sw/autogen/'
+ path_out = path_root + '/hw/top_' + name_old + '/sw/autogen/'
+
+ for file_name in files:
+
+ # Read file produced by topgen.
+ with open(path_in + file_name, "r") as file_in:
+ text = file_in.read()
+
+ text = re.sub(name, name_old, text)
+ text = re.sub(name.capitalize(), name_old.capitalize(), text)
+ text = re.sub(name.upper(), name_old.upper(), text)
+
+ # Write file that SW build can deal with.
+ file_name_new = re.sub(name, name_old, file_name)
+ with open(path_in + file_name_new, "w") as file_out:
+ file_out.write(text)
+
+ # Overwrite the files in the tree of the original top level. They are still used by the
+ # SW build.
+ with open(path_out + file_name_new, "w") as file_out:
+ file_out.write(text)
+
+ # Generate the boot_rom to enable the FPGA build.
+ print("Generating boot ROM...")
+ cmd = ['ninja', '-C', path_root + '/build-out',
+ 'sw/device/boot_rom/boot_rom_export_fpga_nexysvideo']
+ try:
+ subprocess.run(cmd,
+ check=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ universal_newlines=True)
+
+ except subprocess.CalledProcessError as e:
+ print("Failed to generate boot ROM: " + str(e))
+ sys.exit(1)
+
+ return 0
+
+
+if __name__ == "__main__":
+ main()
diff --git a/meson.build b/meson.build
index 2b12355..53d70f5 100644
--- a/meson.build
+++ b/meson.build
@@ -178,11 +178,12 @@
)
# TODO: Considering moving these into hw/ip directories.
+TOPNAME='top_earlgrey'
hw_ip_aes_reg_h = gen_hw_hdr.process('hw/ip/aes/data/aes.hjson')
hw_ip_alert_handler_reg_h = gen_hw_hdr.process('hw/ip/alert_handler/data/alert_handler.hjson')
hw_ip_aon_timer_reg_h = gen_hw_hdr.process('hw/ip/aon_timer/data/aon_timer.hjson')
-hw_ip_clkgmr_reg_h = gen_hw_hdr.process('hw/top_earlgrey/ip/clkmgr/data/autogen/clkmgr.hjson')
-hw_ip_flash_ctrl_reg_h = gen_hw_hdr.process('hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson')
+hw_ip_clkgmr_reg_h = gen_hw_hdr.process('hw/' + TOPNAME + '/ip/clkmgr/data/autogen/clkmgr.hjson')
+hw_ip_flash_ctrl_reg_h = gen_hw_hdr.process('hw/' + TOPNAME + '/ip/flash_ctrl/data/autogen/flash_ctrl.hjson')
hw_ip_gpio_reg_h = gen_hw_hdr.process('hw/ip/gpio/data/gpio.hjson')
hw_ip_hmac_reg_h = gen_hw_hdr.process('hw/ip/hmac/data/hmac.hjson')
hw_ip_i2c_reg_h = gen_hw_hdr.process('hw/ip/i2c/data/i2c.hjson')
@@ -193,10 +194,10 @@
hw_ip_rv_timer_reg_h = gen_hw_hdr.process('hw/ip/rv_timer/data/rv_timer.hjson')
hw_ip_uart_reg_h = gen_hw_hdr.process('hw/ip/uart/data/uart.hjson')
hw_ip_usbdev_reg_h = gen_hw_hdr.process('hw/ip/usbdev/data/usbdev.hjson')
-hw_ip_pwrmgr_reg_h = gen_hw_hdr.process('hw/top_earlgrey/ip/pwrmgr/data/autogen/pwrmgr.hjson')
-hw_ip_rstmgr_reg_h = gen_hw_hdr.process('hw/top_earlgrey/ip/rstmgr/data/autogen/rstmgr.hjson')
-hw_top_earlgrey_pinmux_reg_h = gen_hw_hdr.process('hw/top_earlgrey/ip/pinmux/data/autogen/pinmux.hjson')
-hw_top_earlgrey_rv_plic_reg_h = gen_hw_hdr.process('hw/top_earlgrey/ip/rv_plic/data/autogen/rv_plic.hjson')
+hw_ip_pwrmgr_reg_h = gen_hw_hdr.process('hw/' + TOPNAME + '/ip/pwrmgr/data/autogen/pwrmgr.hjson')
+hw_ip_rstmgr_reg_h = gen_hw_hdr.process('hw/' + TOPNAME + '/ip/rstmgr/data/autogen/rstmgr.hjson')
+hw_top_earlgrey_pinmux_reg_h = gen_hw_hdr.process('hw/' + TOPNAME + '/ip/pinmux/data/autogen/pinmux.hjson')
+hw_top_earlgrey_rv_plic_reg_h = gen_hw_hdr.process('hw/' + TOPNAME + '/ip/rv_plic/data/autogen/rv_plic.hjson')
# Top Earlgrey library (top_earlgrey)
# The sources for this are generated into the hw hierarchy.
@@ -204,7 +205,7 @@
link_with: static_library(
'top_earlgrey_ot',
sources: [
- 'hw/top_earlgrey/sw/autogen/top_earlgrey.c',
+ 'hw/' + TOPNAME + '/sw/autogen/top_earlgrey.c',
],
)
)