From 6f27c1f79e4fd53e67a92cadc947b6fb60b8ead2 Mon Sep 17 00:00:00 2001 From: Nia Waldvogel Date: Tue, 9 Jun 2026 16:31:36 -0400 Subject: [PATCH] gen-device: only generate device files for supported devices This changes the make gen-device command such that it only converts relevant device files. This saves a lot of build time. The process of determining which files to convert is now handled by make. Incremental builds are now supported. Appropriate parallel building is now done for all device generation (previously it was only handled properly for AVR). The generated file names were updated to match their source name formatting. I could probbably lowercase everything when converting them, but this would complicate the makefile. I don't really think this is worth it. --- GNUmakefile | 128 ++++++++++++++++++------- src/device/kendryte/.gitignore | 0 src/device/sifive/.gitignore | 0 src/device/stm32/.gitignore | 0 targets/atmega1280.json | 4 +- targets/atmega1284p.json | 4 +- targets/atmega2560.json | 4 +- targets/atmega328p.json | 4 +- targets/atmega328pb.json | 4 +- targets/atmega32u4.json | 4 +- targets/atsamd21e18a.json | 2 +- targets/atsamd21g18a.json | 2 +- targets/atsamd51g19a.json | 2 +- targets/atsamd51j19a.json | 2 +- targets/atsamd51j20a.json | 2 +- targets/atsamd51p19a.json | 2 +- targets/atsamd51p20a.json | 2 +- targets/atsame51j19a.json | 2 +- targets/atsame54p20a.json | 2 +- targets/attiny1616.json | 4 +- targets/attiny85.json | 4 +- targets/teensy36.json | 3 +- targets/teensy40.json | 2 +- targets/teensy41.json | 2 +- tools/gen-device-avr/gen-device-avr.go | 114 +++++++--------------- tools/gen-device-svd/gen-device-svd.go | 99 ++++++++----------- 26 files changed, 193 insertions(+), 205 deletions(-) create mode 100644 src/device/kendryte/.gitignore create mode 100644 src/device/sifive/.gitignore create mode 100644 src/device/stm32/.gitignore diff --git a/GNUmakefile b/GNUmakefile index ef6af6f2d3..2ad4f323b4 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -215,58 +215,112 @@ fmt-check: ## Warn if any source needs reformatting gen-device: gen-device-avr gen-device-esp gen-device-nrf gen-device-sam gen-device-sifive gen-device-kendryte gen-device-nxp gen-device-rp ## Generate microcontroller-specific sources ifneq ($(RENESAS), 0) -gen-device: gen-device-renesas +# Renesas is currently unused +#gen-device: gen-device-renesas endif ifneq ($(STM32), 0) gen-device: gen-device-stm32 endif -gen-device-avr: - @if [ ! -e lib/avr/README.md ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi - $(GO) build -o ./build/gen-device-avr ./tools/gen-device-avr/ - ./build/gen-device-avr lib/avr/packs/atmega src/device/avr/ - ./build/gen-device-avr lib/avr/packs/tiny src/device/avr/ - @GO111MODULE=off $(GO) fmt ./src/device/avr +build/gen-device-%: ./tools/gen-device-%/*.go + $(GO) build -o $@ ./tools/gen-device-$*/ -build/gen-device-svd: ./tools/gen-device-svd/*.go - $(GO) build -o $@ ./tools/gen-device-svd/ +gen-device-avr: gen-device-atmega gen-device-attiny -gen-device-esp: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/Espressif-Community -interrupts=software lib/cmsis-svd/data/Espressif-Community/ src/device/esp/ - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/Espressif -interrupts=software lib/cmsis-svd/data/Espressif/ src/device/esp/ - GO111MODULE=off $(GO) fmt ./src/device/esp +# ATmega -gen-device-nrf: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/NordicSemiconductor/nrfx/tree/master/mdk lib/nrfx/mdk/ src/device/nrf/ - GO111MODULE=off $(GO) fmt ./src/device/nrf +DEVICES_AVR_MEGA = 1280 1284P 2560 328PB 328P 32U4 -gen-device-nxp: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/NXP lib/cmsis-svd/data/NXP/ src/device/nxp/ - GO111MODULE=off $(GO) fmt ./src/device/nxp +gen-device-atmega: $(foreach m,$(DEVICES_AVR_MEGA),src/device/avr/ATmega$(m).go src/device/avr/ATmega$(m).s src/device/avr/ATmega$(m).ld) -gen-device-sam: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/Atmel lib/cmsis-svd/data/Atmel/ src/device/sam/ - GO111MODULE=off $(GO) fmt ./src/device/sam +src/device/avr/ATmega%.go src/device/avr/ATmega%.s src/device/avr/ATmega%.ld: lib/avr/packs/atmega/ATmega%.atdf build/gen-device-avr + build/gen-device-avr $< src/device/avr/ATmega$*.go src/device/avr/ATmega$*.s src/device/avr/ATmega$*.ld -gen-device-sifive: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/SiFive-Community -interrupts=software lib/cmsis-svd/data/SiFive-Community/ src/device/sifive/ - GO111MODULE=off $(GO) fmt ./src/device/sifive +# ATtiny -gen-device-kendryte: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/Kendryte-Community -interrupts=software lib/cmsis-svd/data/Kendryte-Community/ src/device/kendryte/ - GO111MODULE=off $(GO) fmt ./src/device/kendryte +DEVICES_AVR_TINY = 1616 85 -gen-device-stm32: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/tinygo-org/stm32-svd lib/stm32-svd/svd src/device/stm32/ - GO111MODULE=off $(GO) fmt ./src/device/stm32 +gen-device-attiny: $(foreach m,$(DEVICES_AVR_TINY),src/device/avr/ATtiny$(m).go src/device/avr/ATtiny$(m).s src/device/avr/ATtiny$(m).ld) -gen-device-rp: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/posborne/cmsis-svd/tree/master/data/RaspberryPi lib/cmsis-svd/data/RaspberryPi/ src/device/rp/ - GO111MODULE=off $(GO) fmt ./src/device/rp +src/device/avr/ATtiny%.go src/device/avr/ATtiny%.s src/device/avr/ATtiny%.ld: lib/avr/packs/tiny/ATtiny%.atdf build/gen-device-avr + build/gen-device-avr $< src/device/avr/ATtiny$*.go src/device/avr/ATtiny$*.s src/device/avr/ATtiny$*.ld + +# Espressif + +# Both Espressif and Espressif-Community define esp32. +# The Espressif directory takes priority. + +gen-device-esp: src/device/esp/esp32c3.go src/device/esp/esp32s3.go src/device/esp/esp32.go src/device/esp/esp8266.go + +src/device/esp/%.go: lib/cmsis-svd/data/Espressif/%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/Espressif -interrupts=software $< $@ + +src/device/esp/%.go: lib/cmsis-svd/data/Espressif-Community/%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/Espressif-Community -interrupts=software $< $@ + +# NRF + +DEVICES_NRF = 51 52833 52840 52 + +gen-device-nrf: $(foreach m,$(DEVICES_NRF),src/device/nrf/nrf$(m).go src/device/nrf/nrf$(m).s) + +src/device/nrf/nrf%.go src/device/nrf/nrf%.s: lib/nrfx/mdk/nrf%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/NordicSemiconductor/nrfx/tree/master/mdk -asm=src/device/nrf/nrf$*.s $< src/device/nrf/nrf$*.go + +# NXP + +DEVICES_NXP = MIMXRT1062 MK66F18 + +gen-device-nxp: $(foreach m,$(DEVICES_NXP),src/device/nxp/$(m).go src/device/nxp/$(m).s) + +src/device/nxp/%.go src/device/nxp/%.s: lib/cmsis-svd/data/NXP/%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/NXP -asm=src/device/nxp/$*.s $< src/device/nxp/$*.go + +# SAM + +DEVICES_SAM = D21E18A D21G18A D51G19A D51J19A D51J20A D51P19A D51P20A D51J19A E51J19A E54P20A + +gen-device-sam: $(foreach m,$(DEVICES_SAM),src/device/sam/ATSAM$(m).go src/device/sam/ATSAM$(m).s) + +src/device/sam/ATSAM%.go src/device/sam/ATSAM%.s: lib/cmsis-svd/data/Atmel/ATSAM%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/Atmel -asm=src/device/sam/ATSAM$*.s $< src/device/sam/ATSAM$*.go + +# SiFive + +DEVICES_SIFIVE = e310x + +gen-device-sifive: $(foreach m,$(DEVICES_SIFIVE),src/device/sifive/$(m).go) + +src/device/sifive/%.go: lib/cmsis-svd/data/SiFive-Community/%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/SiFive-Community -interrupts=software $< $@ + +# Kendryte + +DEVICES_KENDRYTE = 210 + +gen-device-kendryte: $(foreach m,$(DEVICES_KENDRYTE),src/device/kendryte/k$(m).go) + +src/device/kendryte/k%.go: lib/cmsis-svd/data/Kendryte-Community/k%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/Kendryte-Community -interrupts=software $< $@ + +# STM32 + +DEVICES_STM32 = f103 f405 f407 f469 f722 g0b1 l4r5 l0x1 l0x2 l4x2 l4x5 l4x6 l552 u585 wl5x_cm4 wle5 + +gen-device-stm32: $(foreach m,$(DEVICES_STM32),src/device/stm32/stm32$(m).go src/device/stm32/stm32$(m).s) + +src/device/stm32/stm32%.go src/device/stm32/stm32%.s: lib/stm32-svd/svd/stm32%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/tinygo-org/stm32-svd -asm=src/device/stm32/stm32$*.s $< src/device/stm32/stm32$*.go + +# Raspberry Pi + +DEVICES_RP = 2040 2350 + +gen-device-rp: $(foreach m,$(DEVICES_RP),src/device/rp/rp$(m).go src/device/rp/rp$(m).s) + +src/device/rp/rp%.go src/device/rp/rp%.s: lib/cmsis-svd/data/RaspberryPi/rp%.svd build/gen-device-svd + build/gen-device-svd -url=https://github.com/posborne/cmsis-svd/tree/master/data/RaspberryPi -asm=src/device/rp/rp$*.s $< src/device/rp/rp$*.go -gen-device-renesas: build/gen-device-svd - ./build/gen-device-svd -source=https://github.com/cmsis-svd/cmsis-svd-data/tree/master/data/Renesas lib/cmsis-svd/data/Renesas/ src/device/renesas/ - GO111MODULE=off $(GO) fmt ./src/device/renesas $(LLVM_PROJECTDIR)/llvm: git clone -b tinygo_20.x --depth=1 https://github.com/tinygo-org/llvm-project $(LLVM_PROJECTDIR) diff --git a/src/device/kendryte/.gitignore b/src/device/kendryte/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/device/sifive/.gitignore b/src/device/sifive/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/device/stm32/.gitignore b/src/device/stm32/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/targets/atmega1280.json b/targets/atmega1280.json index 34e78f41df..6eb102f007 100644 --- a/targets/atmega1280.json +++ b/targets/atmega1280.json @@ -6,9 +6,9 @@ "ldflags": [ "--defsym=_stack_size=512" ], - "linkerscript": "src/device/avr/atmega1280.ld", + "linkerscript": "src/device/avr/ATmega1280.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega1280.s" + "src/device/avr/ATmega1280.s" ] } diff --git a/targets/atmega1284p.json b/targets/atmega1284p.json index 501fb58d17..9256513f04 100644 --- a/targets/atmega1284p.json +++ b/targets/atmega1284p.json @@ -7,10 +7,10 @@ "--defsym=_bootloader_size=0", "--defsym=_stack_size=512" ], - "linkerscript": "src/device/avr/atmega1284p.ld", + "linkerscript": "src/device/avr/ATmega1284P.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega1284p.s" + "src/device/avr/ATmega1284P.s" ], "emulator": "simavr -m atmega1284p -f 20000000 {}" } diff --git a/targets/atmega2560.json b/targets/atmega2560.json index a00179ef98..eb454e8caf 100644 --- a/targets/atmega2560.json +++ b/targets/atmega2560.json @@ -6,9 +6,9 @@ "ldflags": [ "--defsym=_stack_size=512" ], - "linkerscript": "src/device/avr/atmega2560.ld", + "linkerscript": "src/device/avr/ATmega2560.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega2560.s" + "src/device/avr/ATmega2560.s" ] } diff --git a/targets/atmega328p.json b/targets/atmega328p.json index d4098d4b86..c281dcec29 100644 --- a/targets/atmega328p.json +++ b/targets/atmega328p.json @@ -3,9 +3,9 @@ "cpu": "atmega328p", "build-tags": ["atmega328p", "atmega", "avr5"], "serial": "uart", - "linkerscript": "src/device/avr/atmega328p.ld", + "linkerscript": "src/device/avr/ATmega328P.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega328p.s" + "src/device/avr/ATmega328P.s" ] } diff --git a/targets/atmega328pb.json b/targets/atmega328pb.json index c4e1b447f4..1789f9f45f 100644 --- a/targets/atmega328pb.json +++ b/targets/atmega328pb.json @@ -7,9 +7,9 @@ "--defsym=_stack_size=512" ], "serial": "uart", - "linkerscript": "src/device/avr/atmega328pb.ld", + "linkerscript": "src/device/avr/ATmega328PB.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega328pb.s" + "src/device/avr/ATmega328PB.s" ] } diff --git a/targets/atmega32u4.json b/targets/atmega32u4.json index 7aa2c08bd2..75c7efb542 100644 --- a/targets/atmega32u4.json +++ b/targets/atmega32u4.json @@ -3,9 +3,9 @@ "cpu": "atmega32u4", "build-tags": ["atmega32u4", "avr5"], "serial": "none", - "linkerscript": "src/device/avr/atmega32u4.ld", + "linkerscript": "src/device/avr/ATmega32U4.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/atmega32u4.s" + "src/device/avr/ATmega32U4.s" ] } diff --git a/targets/atsamd21e18a.json b/targets/atsamd21e18a.json index 92b671c9f6..fb42e1e0b2 100644 --- a/targets/atsamd21e18a.json +++ b/targets/atsamd21e18a.json @@ -4,7 +4,7 @@ "serial": "usb", "linkerscript": "targets/atsamd21.ld", "extra-files": [ - "src/device/sam/atsamd21e18a.s" + "src/device/sam/ATSAMD21E18A.s" ], "openocd-transport": "swd", "openocd-target": "at91samdXX" diff --git a/targets/atsamd21g18a.json b/targets/atsamd21g18a.json index db46c96288..e6bb4231d1 100644 --- a/targets/atsamd21g18a.json +++ b/targets/atsamd21g18a.json @@ -4,7 +4,7 @@ "serial": "usb", "linkerscript": "targets/atsamd21.ld", "extra-files": [ - "src/device/sam/atsamd21g18a.s" + "src/device/sam/ATSAMD21G18A.s" ], "openocd-transport": "swd", "openocd-target": "at91samdXX" diff --git a/targets/atsamd51g19a.json b/targets/atsamd51g19a.json index 4534d1c1a8..5708bbec06 100644 --- a/targets/atsamd51g19a.json +++ b/targets/atsamd51g19a.json @@ -3,7 +3,7 @@ "build-tags": ["atsamd51g19a", "atsamd51g19", "atsamd51", "sam"], "linkerscript": "targets/atsamd51.ld", "extra-files": [ - "src/device/sam/atsamd51g19a.s" + "src/device/sam/ATSAMD51G19A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsamd51j19a.json b/targets/atsamd51j19a.json index 2493ca4ddc..18c5011e53 100644 --- a/targets/atsamd51j19a.json +++ b/targets/atsamd51j19a.json @@ -3,7 +3,7 @@ "build-tags": ["atsamd51j19a", "atsamd51j19", "atsamd51", "sam"], "linkerscript": "targets/atsamd51.ld", "extra-files": [ - "src/device/sam/atsamd51j19a.s" + "src/device/sam/ATSAMD51J19A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsamd51j20a.json b/targets/atsamd51j20a.json index 9f59e32d46..d5493a32eb 100644 --- a/targets/atsamd51j20a.json +++ b/targets/atsamd51j20a.json @@ -3,7 +3,7 @@ "build-tags": ["sam", "atsamd51", "atsamd51j20", "atsamd51j20a"], "linkerscript": "targets/atsamd51j20a.ld", "extra-files": [ - "src/device/sam/atsamd51j20a.s" + "src/device/sam/ATSAMD51J20A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsamd51p19a.json b/targets/atsamd51p19a.json index 6b2f6b5b39..c51adb00df 100644 --- a/targets/atsamd51p19a.json +++ b/targets/atsamd51p19a.json @@ -3,7 +3,7 @@ "build-tags": ["atsamd51p19a", "atsamd51p19", "atsamd51", "sam"], "linkerscript": "targets/atsamd51.ld", "extra-files": [ - "src/device/sam/atsamd51p19a.s" + "src/device/sam/ATSAMD51P19A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsamd51p20a.json b/targets/atsamd51p20a.json index bc66ca0321..d18161b91e 100644 --- a/targets/atsamd51p20a.json +++ b/targets/atsamd51p20a.json @@ -3,7 +3,7 @@ "build-tags": ["sam", "atsamd51", "atsamd51p20", "atsamd51p20a"], "linkerscript": "targets/atsamd51p20a.ld", "extra-files": [ - "src/device/sam/atsamd51p20a.s" + "src/device/sam/ATSAMD51P20A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsame51j19a.json b/targets/atsame51j19a.json index 98136769dd..93ef8599d4 100644 --- a/targets/atsame51j19a.json +++ b/targets/atsame51j19a.json @@ -3,7 +3,7 @@ "build-tags": ["atsame51j19a", "atsame51j19", "atsame51", "atsame5x", "sam"], "linkerscript": "targets/atsame5xx19.ld", "extra-files": [ - "src/device/sam/atsame51j19a.s" + "src/device/sam/ATSAME51J19A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/atsame54p20a.json b/targets/atsame54p20a.json index f2450fb421..04192be37f 100644 --- a/targets/atsame54p20a.json +++ b/targets/atsame54p20a.json @@ -3,7 +3,7 @@ "build-tags": ["sam", "atsame5x", "atsame54", "atsame54p20", "atsame54p20a"], "linkerscript": "targets/atsame5xx20-no-bootloader.ld", "extra-files": [ - "src/device/sam/atsame54p20a.s" + "src/device/sam/ATSAME54P20A.s" ], "openocd-transport": "swd", "openocd-target": "atsame5x" diff --git a/targets/attiny1616.json b/targets/attiny1616.json index 38e645ae1b..8c5c50c79d 100644 --- a/targets/attiny1616.json +++ b/targets/attiny1616.json @@ -6,9 +6,9 @@ "cflags": [ "-D__AVR_ARCH__=103" ], - "linkerscript": "src/device/avr/attiny1616.ld", + "linkerscript": "src/device/avr/ATtiny1616.ld", "extra-files": [ - "src/device/avr/attiny1616.s" + "src/device/avr/ATtiny1616.s" ], "flash-command": "pymcuprog write -f {hex} --erase --verify -d attiny1616 -t uart -u {port}" } diff --git a/targets/attiny85.json b/targets/attiny85.json index 3fb1111479..a3f24b6718 100644 --- a/targets/attiny85.json +++ b/targets/attiny85.json @@ -5,9 +5,9 @@ "cflags": [ "-D__AVR_ARCH__=25" ], - "linkerscript": "src/device/avr/attiny85.ld", + "linkerscript": "src/device/avr/ATtiny85.ld", "extra-files": [ "targets/avr.S", - "src/device/avr/attiny85.s" + "src/device/avr/ATtiny85.s" ] } diff --git a/targets/teensy36.json b/targets/teensy36.json index 253e397043..78503c74f6 100644 --- a/targets/teensy36.json +++ b/targets/teensy36.json @@ -4,9 +4,8 @@ "serial": "uart", "linkerscript": "targets/nxpmk66f18.ld", "extra-files": [ - "src/device/nxp/mk66f18.s", + "src/device/nxp/MK66F18.s", "targets/teensy36.s" ], "flash-command": "teensy_loader_cli -mmcu=mk66fx1m0 -v -w {hex}" } - diff --git a/targets/teensy40.json b/targets/teensy40.json index 223db6f6f1..3595a059e8 100644 --- a/targets/teensy40.json +++ b/targets/teensy40.json @@ -5,7 +5,7 @@ "automatic-stack-size": false, "linkerscript": "targets/mimxrt1062-teensy40.ld", "extra-files": [ - "src/device/nxp/mimxrt1062.s", + "src/device/nxp/MIMXRT1062.s", "targets/teensy40.s" ], "flash-command": "teensy_loader_cli -mmcu=imxrt1062 -v -w {hex}" diff --git a/targets/teensy41.json b/targets/teensy41.json index 8866bc48e3..28b2ea42ec 100644 --- a/targets/teensy41.json +++ b/targets/teensy41.json @@ -5,7 +5,7 @@ "automatic-stack-size": false, "linkerscript": "targets/mimxrt1062-teensy40.ld", "extra-files": [ - "src/device/nxp/mimxrt1062.s", + "src/device/nxp/MIMXRT1062.s", "targets/teensy40.s" ], "flash-command": "teensy_loader_cli -mmcu=imxrt1062 -v -w {hex}" diff --git a/tools/gen-device-avr/gen-device-avr.go b/tools/gen-device-avr/gen-device-avr.go index de32e3ed95..0fc01d04a4 100755 --- a/tools/gen-device-avr/gen-device-avr.go +++ b/tools/gen-device-avr/gen-device-avr.go @@ -1,18 +1,17 @@ package main import ( - "bufio" + "bytes" "encoding/xml" "fmt" + "go/format" "html/template" "math/bits" "os" "path/filepath" - "runtime" "sort" "strconv" "strings" - "sync" ) type AVRToolsDeviceFile struct { @@ -398,14 +397,8 @@ func readATDF(path string) (*Device, error) { }, nil } -func writeGo(outdir string, device *Device) error { +func writeGo(dst string, device *Device) error { // The Go module for this device. - outf, err := os.Create(outdir + "/" + device.metadata["nameLower"].(string) + ".go") - if err != nil { - return err - } - defer outf.Close() - w := bufio.NewWriter(outf) maxInterruptNum := 0 for _, intr := range device.interrupts { @@ -484,9 +477,11 @@ type {{.Name}}_Type struct { {{end}} {{end}} `)) - err = t.Execute(w, map[string]interface{}{ + var buf bytes.Buffer + w := &buf + err := t.Execute(w, map[string]interface{}{ "metadata": device.metadata, - "pkgName": filepath.Base(strings.TrimRight(outdir, "/")), + "pkgName": filepath.Base(filepath.Dir(dst)), "interrupts": device.interrupts, "interruptMax": maxInterruptNum, "instances": device.instances, @@ -559,12 +554,20 @@ type {{.Name}}_Type struct { } fmt.Fprintf(w, ")\n") } - return w.Flush() + + // Format the source. + formatted, err := format.Source(buf.Bytes()) + if err != nil { + return err + } + + // Save the file. + return os.WriteFile(dst, formatted, 0666) } -func writeAsm(outdir string, device *Device) error { +func writeAsm(dst string, device *Device) error { // The interrupt vector, which is hard to write directly in Go. - out, err := os.Create(outdir + "/" + device.metadata["nameLower"].(string) + ".s") + out, err := os.Create(dst) if err != nil { return err } @@ -628,9 +631,9 @@ __vector_default: return nil } -func writeLD(outdir string, device *Device) error { +func writeLD(dst string, device *Device) error { // Variables for the linker script. - out, err := os.Create(outdir + "/" + device.metadata["nameLower"].(string) + ".ld") + out, err := os.Create(dst) if err != nil { return err } @@ -649,73 +652,28 @@ __num_isrs = {{.numInterrupts}}; return t.Execute(out, device.metadata) } -func processFile(filepath, outdir string) error { - device, err := readATDF(filepath) +func main() { + src := os.Args[1] + dstGo := os.Args[2] + dstASM := os.Args[3] + dstLD := os.Args[4] + + device, err := readATDF(src) if err != nil { - return err + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } - err = writeGo(outdir, device) + err = writeGo(dstGo, device) if err != nil { - return err + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } - err = writeAsm(outdir, device) + err = writeAsm(dstASM, device) if err != nil { - return err - } - return writeLD(outdir, device) -} - -func generate(indir, outdir string) error { - // Read list of ATDF files to process. - matches, err := filepath.Glob(indir + "/*.atdf") - if err != nil { - return err - } - - // Start worker goroutines. - var wg sync.WaitGroup - workChan := make(chan string) - errChan := make(chan error, 1) - for i := 0; i < runtime.NumCPU(); i++ { - go func() { - for filepath := range workChan { - err := processFile(filepath, outdir) - wg.Done() - if err != nil { - // Store error to errChan if no error was stored before. - select { - case errChan <- err: - default: - } - } - } - }() - } - - // Submit all jobs to the goroutines. - wg.Add(len(matches)) - for _, filepath := range matches { - fmt.Println(filepath) - workChan <- filepath - } - close(workChan) - - // Wait until all workers have finished. - wg.Wait() - - // Check for an error. - select { - case err := <-errChan: - return err - default: - return nil + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } -} - -func main() { - indir := os.Args[1] // directory with register descriptor files (*.atdf) - outdir := os.Args[2] // output directory - err := generate(indir, outdir) + err = writeLD(dstLD, device) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) diff --git a/tools/gen-device-svd/gen-device-svd.go b/tools/gen-device-svd/gen-device-svd.go index ef9dedff97..5b5d73e211 100755 --- a/tools/gen-device-svd/gen-device-svd.go +++ b/tools/gen-device-svd/gen-device-svd.go @@ -2,11 +2,11 @@ package main import ( "bufio" + "bytes" "encoding/xml" - "errors" "flag" "fmt" - "io/fs" + "go/format" "os" "path/filepath" "regexp" @@ -1215,14 +1215,7 @@ func parseRegister(groupName string, regEl *SVDRegister, baseAddress uint64, bit } // The Go module for this device. -func writeGo(outdir string, device *Device, interruptSystem string) error { - outf, err := os.Create(filepath.Join(outdir, device.Metadata.NameLower+".go")) - if err != nil { - return err - } - defer outf.Close() - w := bufio.NewWriter(outf) - +func writeGo(dst string, device *Device, interruptSystem string) error { maxInterruptValue := 0 for _, intr := range device.Interrupts { if intr.Value > maxInterruptValue { @@ -1326,10 +1319,12 @@ var ( ) `)) - pkgName := filepath.Base(strings.TrimRight(outdir, "/")) + pkgName := filepath.Base(filepath.Dir(dst)) tweakDevice(device, pkgName) - err = t.Execute(w, map[string]interface{}{ + var buf bytes.Buffer + w := &buf + err := t.Execute(w, map[string]interface{}{ "device": device, "pkgName": pkgName, "interruptMax": maxInterruptValue, @@ -1594,10 +1589,17 @@ var ( w.WriteString(")\n") } - return w.Flush() + // Format the source. + formatted, err := format.Source(buf.Bytes()) + if err != nil { + return err + } + + // Save the file. + return os.WriteFile(dst, formatted, 0666) } -func writeGoRegisterConstants(w *bufio.Writer, register *PeripheralField, name string) { +func writeGoRegisterConstants(w *bytes.Buffer, register *PeripheralField, name string) { w.WriteString("\n\t// " + name) if register.Description != "" { if isMultiline(register.Description) { @@ -1619,7 +1621,7 @@ func writeGoRegisterConstants(w *bufio.Writer, register *PeripheralField, name s } } -func writeGoRegisterBitfieldType(w *bufio.Writer, register *PeripheralField, peripheralName, registerName string) { +func writeGoRegisterBitfieldType(w *bytes.Buffer, register *PeripheralField, peripheralName, registerName string) { if len(register.Bitfields) == 0 { return } @@ -1692,8 +1694,8 @@ func writeGoRegisterBitfieldType(w *bufio.Writer, register *PeripheralField, per } // The interrupt vector, which is hard to write directly in Go. -func writeAsm(outdir string, device *Device) error { - outf, err := os.Create(filepath.Join(outdir, device.Metadata.NameLower+".s")) +func writeAsm(dst string, device *Device) error { + outf, err := os.Create(dst) if err != nil { return err } @@ -1796,58 +1798,33 @@ __isr_vector: return w.Flush() } -func generate(indir, outdir, sourceURL, interruptSystem string) error { - if _, err := os.Stat(indir); errors.Is(err, fs.ErrNotExist) { - fmt.Fprintln(os.Stderr, "cannot find input directory:", indir) - os.Exit(1) - } - os.MkdirAll(outdir, 0777) - - infiles, err := filepath.Glob(filepath.Join(indir, "*.svd")) - if err != nil { - fmt.Fprintln(os.Stderr, "could not read .svd files:", err) - os.Exit(1) - } - sort.Strings(infiles) - for _, infile := range infiles { - fmt.Println(infile) - device, err := readSVD(infile, sourceURL) - if err != nil { - return fmt.Errorf("failed to read: %w", err) - } - err = writeGo(outdir, device, interruptSystem) - if err != nil { - return fmt.Errorf("failed to write Go file: %w", err) - } - switch interruptSystem { - case "software": - // Nothing to do. - case "hardware": - err = writeAsm(outdir, device) - if err != nil { - return fmt.Errorf("failed to write assembly file: %w", err) - } - default: - return fmt.Errorf("unknown interrupt system: %s", interruptSystem) - } - } - return nil -} - func main() { - sourceURL := flag.String("source", "", "source SVD file") + sourceURL := flag.String("url", "", "URL of source SVD repository") interruptSystem := flag.String("interrupts", "hardware", "interrupt system in use (software, hardware)") + asmDst := flag.String("asm", "", "destination path for assembly") flag.Parse() if flag.NArg() != 2 { - fmt.Fprintln(os.Stderr, "provide exactly two arguments: input directory (with .svd files) and output directory for generated files") + fmt.Fprintln(os.Stderr, "provide exactly two arguments: input path (.svd) and output path (.go)") flag.PrintDefaults() return } - indir := flag.Arg(0) - outdir := flag.Arg(1) - err := generate(indir, outdir, *sourceURL, *interruptSystem) + src := flag.Arg(0) + dst := flag.Arg(1) + device, err := readSVD(src, *sourceURL) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to read: %s\n", err) + os.Exit(1) + } + err = writeGo(dst, device, *interruptSystem) if err != nil { - fmt.Fprintln(os.Stderr, err) + fmt.Fprintf(os.Stderr, "failed to write Go file: %s\n", err) os.Exit(1) } + if asm := *asmDst; asm != "" { + err = writeAsm(asm, device) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to write assembly file: %s\n", err) + os.Exit(1) + } + } }