From d2cb78724ab61bcddde3cde5d428f956a84dda1d Mon Sep 17 00:00:00 2001 From: Stanislaw Kaushanski Date: Mon, 2 May 2022 13:19:36 +0200 Subject: [PATCH] move RAVEN FW into Validation-VP repo --- fpga_spn/Makefile | 27 - fpga_spn/bsp/drivers/clic/clic_driver.c | 163 - fpga_spn/bsp/drivers/clic/clic_driver.h | 44 - .../bsp/drivers/fe300prci/fe300prci_driver.c | 252 - .../bsp/drivers/fe300prci/fe300prci_driver.h | 79 - fpga_spn/bsp/drivers/plic/plic_driver.c | 122 - fpga_spn/bsp/drivers/plic/plic_driver.h | 52 - fpga_spn/bsp/env/common.mk | 66 - fpga_spn/bsp/env/coreip-e2-arty/flash.lds | 161 - fpga_spn/bsp/env/coreip-e2-arty/init.c | 98 - fpga_spn/bsp/env/coreip-e2-arty/openocd.cfg | 31 - fpga_spn/bsp/env/coreip-e2-arty/platform.h | 98 - fpga_spn/bsp/env/coreip-e2-arty/settings.mk | 3 - fpga_spn/bsp/env/coreip-e2-arty/tim-split.lds | 157 - fpga_spn/bsp/env/coreip-e2-arty/tim.lds | 161 - fpga_spn/bsp/env/coreplexip-arty.h | 102 - .../bsp/env/coreplexip-e31-arty/dhrystone.lds | 157 - .../bsp/env/coreplexip-e31-arty/flash.lds | 161 - fpga_spn/bsp/env/coreplexip-e31-arty/init.c | 122 - .../bsp/env/coreplexip-e31-arty/openocd.cfg | 31 - .../bsp/env/coreplexip-e31-arty/platform.h | 100 - .../env/coreplexip-e31-arty/scratchpad.lds | 161 - .../bsp/env/coreplexip-e31-arty/settings.mk | 3 - .../bsp/env/coreplexip-e51-arty/dhrystone.lds | 157 - .../bsp/env/coreplexip-e51-arty/flash.lds | 161 - fpga_spn/bsp/env/coreplexip-e51-arty/init.c | 122 - .../bsp/env/coreplexip-e51-arty/openocd.cfg | 31 - .../bsp/env/coreplexip-e51-arty/platform.h | 100 - .../env/coreplexip-e51-arty/scratchpad.lds | 161 - .../bsp/env/coreplexip-e51-arty/settings.mk | 3 - fpga_spn/bsp/env/encoding.h | 1313 - fpga_spn/bsp/env/entry.S | 98 - fpga_spn/bsp/env/freedom-e300-arty/flash.lds | 161 - fpga_spn/bsp/env/freedom-e300-arty/init.c | 87 - .../bsp/env/freedom-e300-arty/openocd.cfg | 30 - fpga_spn/bsp/env/freedom-e300-arty/platform.h | 124 - .../bsp/env/freedom-e300-arty/settings.mk | 3 - .../env/freedom-e300-hifive1/dhrystone.lds | 157 - .../bsp/env/freedom-e300-hifive1/flash.lds | 166 - fpga_spn/bsp/env/freedom-e300-hifive1/init.c | 238 - .../bsp/env/freedom-e300-hifive1/openocd.cfg | 34 - .../bsp/env/freedom-e300-hifive1/platform.h | 133 - .../bsp/env/freedom-e300-hifive1/settings.mk | 3 - fpga_spn/bsp/env/hifive1.h | 81 - fpga_spn/bsp/env/start.S | 111 - fpga_spn/bsp/env/ventry.S | 288 - fpga_spn/bsp/include/sifive/bits.h | 36 - fpga_spn/bsp/include/sifive/const.h | 18 - fpga_spn/bsp/include/sifive/devices/aon.h | 88 - fpga_spn/bsp/include/sifive/devices/clic.h | 30 - fpga_spn/bsp/include/sifive/devices/clint.h | 14 - fpga_spn/bsp/include/sifive/devices/gpio.h | 24 - fpga_spn/bsp/include/sifive/devices/otp.h | 23 - fpga_spn/bsp/include/sifive/devices/plic.h | 31 - fpga_spn/bsp/include/sifive/devices/prci.h | 56 - fpga_spn/bsp/include/sifive/devices/pwm.h | 37 - fpga_spn/bsp/include/sifive/devices/spi.h | 80 - fpga_spn/bsp/include/sifive/devices/uart.h | 27 - fpga_spn/bsp/include/sifive/sections.h | 17 - fpga_spn/bsp/include/sifive/smp.h | 65 - fpga_spn/bsp/libwrap/libwrap.mk | 56 - fpga_spn/bsp/libwrap/misc/write_hex.c | 19 - fpga_spn/bsp/libwrap/stdlib/malloc.c | 17 - fpga_spn/bsp/libwrap/sys/_exit.c | 17 - fpga_spn/bsp/libwrap/sys/close.c | 11 - fpga_spn/bsp/libwrap/sys/execve.c | 11 - fpga_spn/bsp/libwrap/sys/fork.c | 9 - fpga_spn/bsp/libwrap/sys/fstat.c | 18 - fpga_spn/bsp/libwrap/sys/getpid.c | 8 - fpga_spn/bsp/libwrap/sys/isatty.c | 13 - fpga_spn/bsp/libwrap/sys/kill.c | 11 - fpga_spn/bsp/libwrap/sys/link.c | 11 - fpga_spn/bsp/libwrap/sys/lseek.c | 16 - fpga_spn/bsp/libwrap/sys/open.c | 11 - fpga_spn/bsp/libwrap/sys/openat.c | 11 - fpga_spn/bsp/libwrap/sys/puts.c | 28 - fpga_spn/bsp/libwrap/sys/read.c | 32 - fpga_spn/bsp/libwrap/sys/sbrk.c | 18 - fpga_spn/bsp/libwrap/sys/stat.c | 12 - fpga_spn/bsp/libwrap/sys/stub.h | 10 - fpga_spn/bsp/libwrap/sys/times.c | 12 - fpga_spn/bsp/libwrap/sys/unlink.c | 11 - fpga_spn/bsp/libwrap/sys/wait.c | 9 - fpga_spn/bsp/libwrap/sys/weak_under_alias.h | 7 - fpga_spn/bsp/libwrap/sys/write.c | 31 - fpga_spn/raven_spn | Bin 272560 -> 0 bytes fpga_spn/src/bsp.h | 22 - fpga_spn/src/delay.c | 123 - fpga_spn/src/delay.h | 25 - fpga_spn/src/dma_regs.h | 62 - fpga_spn/src/init.h | 96 - fpga_spn/src/io/gpio.h | 89 - fpga_spn/src/io/pwm.h | 122 - fpga_spn/src/io/spi.h | 200 - fpga_spn/src/io/uart.h | 83 - fpga_spn/src/raven_spn.cpp | 157 - fpga_spn/src/raven_spn.h | 6 - fpga_spn/src/spn_checker_regs.h | 125 - fpga_spn/src/spn_regs.h | 116 - fpga_spn/src/util/bit_field.h | 179 - fpga_spn/src/xspn_data.cpp | 20007 ---------------- fpga_spn/toolchain-rv32.cmake | 33 - raven/.cproject | 235 - raven/.project | 28 - raven/Makefile | 28 - raven/bsp/drivers/clic/clic_driver.c | 163 - raven/bsp/drivers/clic/clic_driver.h | 44 - .../bsp/drivers/fe300prci/fe300prci_driver.c | 252 - .../bsp/drivers/fe300prci/fe300prci_driver.h | 79 - raven/bsp/drivers/plic/plic_driver.c | 122 - raven/bsp/drivers/plic/plic_driver.h | 52 - raven/bsp/env/common.mk | 66 - raven/bsp/env/coreip-e2-arty/flash.lds | 161 - raven/bsp/env/coreip-e2-arty/init.c | 98 - raven/bsp/env/coreip-e2-arty/openocd.cfg | 31 - raven/bsp/env/coreip-e2-arty/platform.h | 98 - raven/bsp/env/coreip-e2-arty/settings.mk | 3 - raven/bsp/env/coreip-e2-arty/tim-split.lds | 157 - raven/bsp/env/coreip-e2-arty/tim.lds | 161 - raven/bsp/env/coreplexip-arty.h | 102 - .../bsp/env/coreplexip-e31-arty/dhrystone.lds | 157 - raven/bsp/env/coreplexip-e31-arty/flash.lds | 161 - raven/bsp/env/coreplexip-e31-arty/init.c | 122 - raven/bsp/env/coreplexip-e31-arty/openocd.cfg | 31 - raven/bsp/env/coreplexip-e31-arty/platform.h | 100 - .../env/coreplexip-e31-arty/scratchpad.lds | 161 - raven/bsp/env/coreplexip-e31-arty/settings.mk | 3 - .../bsp/env/coreplexip-e51-arty/dhrystone.lds | 157 - raven/bsp/env/coreplexip-e51-arty/flash.lds | 161 - raven/bsp/env/coreplexip-e51-arty/init.c | 122 - raven/bsp/env/coreplexip-e51-arty/openocd.cfg | 31 - raven/bsp/env/coreplexip-e51-arty/platform.h | 100 - .../env/coreplexip-e51-arty/scratchpad.lds | 161 - raven/bsp/env/coreplexip-e51-arty/settings.mk | 3 - raven/bsp/env/encoding.h | 1313 - raven/bsp/env/entry.S | 98 - raven/bsp/env/freedom-e300-arty/flash.lds | 161 - raven/bsp/env/freedom-e300-arty/init.c | 87 - raven/bsp/env/freedom-e300-arty/openocd.cfg | 30 - raven/bsp/env/freedom-e300-arty/platform.h | 124 - raven/bsp/env/freedom-e300-arty/settings.mk | 3 - .../env/freedom-e300-hifive1/dhrystone.lds | 157 - raven/bsp/env/freedom-e300-hifive1/flash.lds | 161 - raven/bsp/env/freedom-e300-hifive1/init.c | 238 - .../bsp/env/freedom-e300-hifive1/openocd.cfg | 34 - raven/bsp/env/freedom-e300-hifive1/platform.h | 133 - .../bsp/env/freedom-e300-hifive1/settings.mk | 3 - raven/bsp/env/hifive1.h | 81 - raven/bsp/env/start.S | 111 - raven/bsp/env/ventry.S | 288 - raven/bsp/include/sifive/bits.h | 36 - raven/bsp/include/sifive/const.h | 18 - raven/bsp/include/sifive/devices/aon.h | 88 - raven/bsp/include/sifive/devices/clic.h | 30 - raven/bsp/include/sifive/devices/clint.h | 14 - raven/bsp/include/sifive/devices/gpio.h | 24 - raven/bsp/include/sifive/devices/otp.h | 23 - raven/bsp/include/sifive/devices/plic.h | 31 - raven/bsp/include/sifive/devices/prci.h | 56 - raven/bsp/include/sifive/devices/pwm.h | 37 - raven/bsp/include/sifive/devices/spi.h | 80 - raven/bsp/include/sifive/devices/uart.h | 27 - raven/bsp/include/sifive/sections.h | 17 - raven/bsp/include/sifive/smp.h | 65 - raven/bsp/libwrap/libwrap.mk | 56 - raven/bsp/libwrap/misc/write_hex.c | 19 - raven/bsp/libwrap/stdlib/malloc.c | 17 - raven/bsp/libwrap/sys/_exit.c | 17 - raven/bsp/libwrap/sys/close.c | 11 - raven/bsp/libwrap/sys/execve.c | 11 - raven/bsp/libwrap/sys/fork.c | 9 - raven/bsp/libwrap/sys/fstat.c | 18 - raven/bsp/libwrap/sys/getpid.c | 8 - raven/bsp/libwrap/sys/isatty.c | 13 - raven/bsp/libwrap/sys/kill.c | 11 - raven/bsp/libwrap/sys/link.c | 11 - raven/bsp/libwrap/sys/lseek.c | 16 - raven/bsp/libwrap/sys/open.c | 11 - raven/bsp/libwrap/sys/openat.c | 11 - raven/bsp/libwrap/sys/puts.c | 28 - raven/bsp/libwrap/sys/read.c | 32 - raven/bsp/libwrap/sys/sbrk.c | 18 - raven/bsp/libwrap/sys/stat.c | 12 - raven/bsp/libwrap/sys/stub.h | 10 - raven/bsp/libwrap/sys/times.c | 12 - raven/bsp/libwrap/sys/unlink.c | 11 - raven/bsp/libwrap/sys/wait.c | 9 - raven/bsp/libwrap/sys/weak_under_alias.h | 7 - raven/bsp/libwrap/sys/write.c | 31 - raven/hello_raven | Bin 117196 -> 0 bytes raven/src/bsp.h | 22 - raven/src/delay.c | 123 - raven/src/delay.h | 25 - raven/src/hello_raven.cpp | 115 - raven/src/hello_raven.h | 6 - raven/src/io/gpio.h | 89 - raven/src/io/pwm.h | 122 - raven/src/io/spi.h | 200 - raven/src/io/uart.h | 83 - raven/src/util/bit_field.h | 179 - raven/src/wrap_printf.c | 271 - raven/toolchain-rv32.cmake | 33 - raven_spn/.cproject | 235 - raven_spn/Makefile | 27 - raven_spn/bsp/drivers/clic/clic_driver.c | 163 - raven_spn/bsp/drivers/clic/clic_driver.h | 44 - .../bsp/drivers/fe300prci/fe300prci_driver.c | 252 - .../bsp/drivers/fe300prci/fe300prci_driver.h | 79 - raven_spn/bsp/drivers/plic/plic_driver.c | 122 - raven_spn/bsp/drivers/plic/plic_driver.h | 52 - raven_spn/bsp/env/common.mk | 66 - raven_spn/bsp/env/coreip-e2-arty/flash.lds | 161 - raven_spn/bsp/env/coreip-e2-arty/init.c | 98 - raven_spn/bsp/env/coreip-e2-arty/openocd.cfg | 31 - raven_spn/bsp/env/coreip-e2-arty/platform.h | 98 - raven_spn/bsp/env/coreip-e2-arty/settings.mk | 3 - .../bsp/env/coreip-e2-arty/tim-split.lds | 157 - raven_spn/bsp/env/coreip-e2-arty/tim.lds | 161 - raven_spn/bsp/env/coreplexip-arty.h | 102 - .../bsp/env/coreplexip-e31-arty/dhrystone.lds | 157 - .../bsp/env/coreplexip-e31-arty/flash.lds | 161 - raven_spn/bsp/env/coreplexip-e31-arty/init.c | 122 - .../bsp/env/coreplexip-e31-arty/openocd.cfg | 31 - .../bsp/env/coreplexip-e31-arty/platform.h | 100 - .../env/coreplexip-e31-arty/scratchpad.lds | 161 - .../bsp/env/coreplexip-e31-arty/settings.mk | 3 - .../bsp/env/coreplexip-e51-arty/dhrystone.lds | 157 - .../bsp/env/coreplexip-e51-arty/flash.lds | 161 - raven_spn/bsp/env/coreplexip-e51-arty/init.c | 122 - .../bsp/env/coreplexip-e51-arty/openocd.cfg | 31 - .../bsp/env/coreplexip-e51-arty/platform.h | 100 - .../env/coreplexip-e51-arty/scratchpad.lds | 161 - .../bsp/env/coreplexip-e51-arty/settings.mk | 3 - raven_spn/bsp/env/encoding.h | 1313 - raven_spn/bsp/env/entry.S | 98 - raven_spn/bsp/env/freedom-e300-arty/flash.lds | 161 - raven_spn/bsp/env/freedom-e300-arty/init.c | 87 - .../bsp/env/freedom-e300-arty/openocd.cfg | 30 - .../bsp/env/freedom-e300-arty/platform.h | 124 - .../bsp/env/freedom-e300-arty/settings.mk | 3 - .../env/freedom-e300-hifive1/dhrystone.lds | 157 - .../bsp/env/freedom-e300-hifive1/flash.lds | 166 - raven_spn/bsp/env/freedom-e300-hifive1/init.c | 238 - .../bsp/env/freedom-e300-hifive1/openocd.cfg | 34 - .../bsp/env/freedom-e300-hifive1/platform.h | 133 - .../bsp/env/freedom-e300-hifive1/settings.mk | 3 - raven_spn/bsp/env/hifive1.h | 81 - raven_spn/bsp/env/start.S | 111 - raven_spn/bsp/env/ventry.S | 288 - raven_spn/bsp/include/sifive/bits.h | 36 - raven_spn/bsp/include/sifive/const.h | 18 - raven_spn/bsp/include/sifive/devices/aon.h | 88 - raven_spn/bsp/include/sifive/devices/clic.h | 30 - raven_spn/bsp/include/sifive/devices/clint.h | 14 - raven_spn/bsp/include/sifive/devices/gpio.h | 24 - raven_spn/bsp/include/sifive/devices/otp.h | 23 - raven_spn/bsp/include/sifive/devices/plic.h | 31 - raven_spn/bsp/include/sifive/devices/prci.h | 56 - raven_spn/bsp/include/sifive/devices/pwm.h | 37 - raven_spn/bsp/include/sifive/devices/spi.h | 80 - raven_spn/bsp/include/sifive/devices/uart.h | 27 - raven_spn/bsp/include/sifive/sections.h | 17 - raven_spn/bsp/include/sifive/smp.h | 65 - raven_spn/bsp/libwrap/libwrap.mk | 56 - raven_spn/bsp/libwrap/misc/write_hex.c | 19 - raven_spn/bsp/libwrap/stdlib/malloc.c | 17 - raven_spn/bsp/libwrap/sys/_exit.c | 17 - raven_spn/bsp/libwrap/sys/close.c | 11 - raven_spn/bsp/libwrap/sys/execve.c | 11 - raven_spn/bsp/libwrap/sys/fork.c | 9 - raven_spn/bsp/libwrap/sys/fstat.c | 18 - raven_spn/bsp/libwrap/sys/getpid.c | 8 - raven_spn/bsp/libwrap/sys/isatty.c | 13 - raven_spn/bsp/libwrap/sys/kill.c | 11 - raven_spn/bsp/libwrap/sys/link.c | 11 - raven_spn/bsp/libwrap/sys/lseek.c | 16 - raven_spn/bsp/libwrap/sys/open.c | 11 - raven_spn/bsp/libwrap/sys/openat.c | 11 - raven_spn/bsp/libwrap/sys/puts.c | 28 - raven_spn/bsp/libwrap/sys/read.c | 32 - raven_spn/bsp/libwrap/sys/sbrk.c | 18 - raven_spn/bsp/libwrap/sys/stat.c | 12 - raven_spn/bsp/libwrap/sys/stub.h | 10 - raven_spn/bsp/libwrap/sys/times.c | 12 - raven_spn/bsp/libwrap/sys/unlink.c | 11 - raven_spn/bsp/libwrap/sys/wait.c | 9 - raven_spn/bsp/libwrap/sys/weak_under_alias.h | 7 - raven_spn/bsp/libwrap/sys/write.c | 31 - raven_spn/raven_spn | Bin 123836 -> 0 bytes raven_spn/src/bsp.h | 22 - raven_spn/src/delay.c | 123 - raven_spn/src/delay.h | 25 - raven_spn/src/init.h | 109 - raven_spn/src/io/gpio.h | 89 - raven_spn/src/io/pwm.h | 122 - raven_spn/src/io/spi.h | 200 - raven_spn/src/io/uart.h | 83 - raven_spn/src/raven_spn.cpp | 149 - raven_spn/src/raven_spn.h | 6 - raven_spn/src/spn_checker_regs.h | 125 - raven_spn/src/spn_regs.h | 116 - raven_spn/src/util/bit_field.h | 179 - raven_spn/toolchain-rv32.cmake | 33 - 303 files changed, 45792 deletions(-) delete mode 100644 fpga_spn/Makefile delete mode 100644 fpga_spn/bsp/drivers/clic/clic_driver.c delete mode 100644 fpga_spn/bsp/drivers/clic/clic_driver.h delete mode 100644 fpga_spn/bsp/drivers/fe300prci/fe300prci_driver.c delete mode 100644 fpga_spn/bsp/drivers/fe300prci/fe300prci_driver.h delete mode 100644 fpga_spn/bsp/drivers/plic/plic_driver.c delete mode 100644 fpga_spn/bsp/drivers/plic/plic_driver.h delete mode 100644 fpga_spn/bsp/env/common.mk delete mode 100644 fpga_spn/bsp/env/coreip-e2-arty/flash.lds delete mode 100644 fpga_spn/bsp/env/coreip-e2-arty/init.c delete mode 100644 fpga_spn/bsp/env/coreip-e2-arty/openocd.cfg delete mode 100644 fpga_spn/bsp/env/coreip-e2-arty/platform.h delete mode 100644 fpga_spn/bsp/env/coreip-e2-arty/settings.mk delete mode 100644 fpga_spn/bsp/env/coreip-e2-arty/tim-split.lds delete mode 100644 fpga_spn/bsp/env/coreip-e2-arty/tim.lds delete mode 100644 fpga_spn/bsp/env/coreplexip-arty.h delete mode 100644 fpga_spn/bsp/env/coreplexip-e31-arty/dhrystone.lds delete mode 100644 fpga_spn/bsp/env/coreplexip-e31-arty/flash.lds delete mode 100644 fpga_spn/bsp/env/coreplexip-e31-arty/init.c delete mode 100644 fpga_spn/bsp/env/coreplexip-e31-arty/openocd.cfg delete mode 100644 fpga_spn/bsp/env/coreplexip-e31-arty/platform.h delete mode 100644 fpga_spn/bsp/env/coreplexip-e31-arty/scratchpad.lds delete mode 100644 fpga_spn/bsp/env/coreplexip-e31-arty/settings.mk delete mode 100644 fpga_spn/bsp/env/coreplexip-e51-arty/dhrystone.lds delete mode 100644 fpga_spn/bsp/env/coreplexip-e51-arty/flash.lds delete mode 100644 fpga_spn/bsp/env/coreplexip-e51-arty/init.c delete mode 100644 fpga_spn/bsp/env/coreplexip-e51-arty/openocd.cfg delete mode 100644 fpga_spn/bsp/env/coreplexip-e51-arty/platform.h delete mode 100644 fpga_spn/bsp/env/coreplexip-e51-arty/scratchpad.lds delete mode 100644 fpga_spn/bsp/env/coreplexip-e51-arty/settings.mk delete mode 100644 fpga_spn/bsp/env/encoding.h delete mode 100644 fpga_spn/bsp/env/entry.S delete mode 100644 fpga_spn/bsp/env/freedom-e300-arty/flash.lds delete mode 100644 fpga_spn/bsp/env/freedom-e300-arty/init.c delete mode 100644 fpga_spn/bsp/env/freedom-e300-arty/openocd.cfg delete mode 100644 fpga_spn/bsp/env/freedom-e300-arty/platform.h delete mode 100644 fpga_spn/bsp/env/freedom-e300-arty/settings.mk delete mode 100644 fpga_spn/bsp/env/freedom-e300-hifive1/dhrystone.lds delete mode 100644 fpga_spn/bsp/env/freedom-e300-hifive1/flash.lds delete mode 100644 fpga_spn/bsp/env/freedom-e300-hifive1/init.c delete mode 100644 fpga_spn/bsp/env/freedom-e300-hifive1/openocd.cfg delete mode 100644 fpga_spn/bsp/env/freedom-e300-hifive1/platform.h delete mode 100644 fpga_spn/bsp/env/freedom-e300-hifive1/settings.mk delete mode 100644 fpga_spn/bsp/env/hifive1.h delete mode 100644 fpga_spn/bsp/env/start.S delete mode 100644 fpga_spn/bsp/env/ventry.S delete mode 100644 fpga_spn/bsp/include/sifive/bits.h delete mode 100644 fpga_spn/bsp/include/sifive/const.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/aon.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/clic.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/clint.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/gpio.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/otp.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/plic.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/prci.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/pwm.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/spi.h delete mode 100644 fpga_spn/bsp/include/sifive/devices/uart.h delete mode 100644 fpga_spn/bsp/include/sifive/sections.h delete mode 100644 fpga_spn/bsp/include/sifive/smp.h delete mode 100644 fpga_spn/bsp/libwrap/libwrap.mk delete mode 100644 fpga_spn/bsp/libwrap/misc/write_hex.c delete mode 100644 fpga_spn/bsp/libwrap/stdlib/malloc.c delete mode 100644 fpga_spn/bsp/libwrap/sys/_exit.c delete mode 100644 fpga_spn/bsp/libwrap/sys/close.c delete mode 100644 fpga_spn/bsp/libwrap/sys/execve.c delete mode 100644 fpga_spn/bsp/libwrap/sys/fork.c delete mode 100644 fpga_spn/bsp/libwrap/sys/fstat.c delete mode 100644 fpga_spn/bsp/libwrap/sys/getpid.c delete mode 100644 fpga_spn/bsp/libwrap/sys/isatty.c delete mode 100644 fpga_spn/bsp/libwrap/sys/kill.c delete mode 100644 fpga_spn/bsp/libwrap/sys/link.c delete mode 100644 fpga_spn/bsp/libwrap/sys/lseek.c delete mode 100644 fpga_spn/bsp/libwrap/sys/open.c delete mode 100644 fpga_spn/bsp/libwrap/sys/openat.c delete mode 100644 fpga_spn/bsp/libwrap/sys/puts.c delete mode 100644 fpga_spn/bsp/libwrap/sys/read.c delete mode 100644 fpga_spn/bsp/libwrap/sys/sbrk.c delete mode 100644 fpga_spn/bsp/libwrap/sys/stat.c delete mode 100644 fpga_spn/bsp/libwrap/sys/stub.h delete mode 100644 fpga_spn/bsp/libwrap/sys/times.c delete mode 100644 fpga_spn/bsp/libwrap/sys/unlink.c delete mode 100644 fpga_spn/bsp/libwrap/sys/wait.c delete mode 100644 fpga_spn/bsp/libwrap/sys/weak_under_alias.h delete mode 100644 fpga_spn/bsp/libwrap/sys/write.c delete mode 100755 fpga_spn/raven_spn delete mode 100644 fpga_spn/src/bsp.h delete mode 100644 fpga_spn/src/delay.c delete mode 100644 fpga_spn/src/delay.h delete mode 100644 fpga_spn/src/dma_regs.h delete mode 100644 fpga_spn/src/init.h delete mode 100644 fpga_spn/src/io/gpio.h delete mode 100644 fpga_spn/src/io/pwm.h delete mode 100644 fpga_spn/src/io/spi.h delete mode 100644 fpga_spn/src/io/uart.h delete mode 100644 fpga_spn/src/raven_spn.cpp delete mode 100644 fpga_spn/src/raven_spn.h delete mode 100644 fpga_spn/src/spn_checker_regs.h delete mode 100644 fpga_spn/src/spn_regs.h delete mode 100644 fpga_spn/src/util/bit_field.h delete mode 100644 fpga_spn/src/xspn_data.cpp delete mode 100644 fpga_spn/toolchain-rv32.cmake delete mode 100644 raven/.cproject delete mode 100644 raven/.project delete mode 100644 raven/Makefile delete mode 100644 raven/bsp/drivers/clic/clic_driver.c delete mode 100644 raven/bsp/drivers/clic/clic_driver.h delete mode 100644 raven/bsp/drivers/fe300prci/fe300prci_driver.c delete mode 100644 raven/bsp/drivers/fe300prci/fe300prci_driver.h delete mode 100644 raven/bsp/drivers/plic/plic_driver.c delete mode 100644 raven/bsp/drivers/plic/plic_driver.h delete mode 100644 raven/bsp/env/common.mk delete mode 100644 raven/bsp/env/coreip-e2-arty/flash.lds delete mode 100644 raven/bsp/env/coreip-e2-arty/init.c delete mode 100644 raven/bsp/env/coreip-e2-arty/openocd.cfg delete mode 100644 raven/bsp/env/coreip-e2-arty/platform.h delete mode 100644 raven/bsp/env/coreip-e2-arty/settings.mk delete mode 100644 raven/bsp/env/coreip-e2-arty/tim-split.lds delete mode 100644 raven/bsp/env/coreip-e2-arty/tim.lds delete mode 100644 raven/bsp/env/coreplexip-arty.h delete mode 100644 raven/bsp/env/coreplexip-e31-arty/dhrystone.lds delete mode 100644 raven/bsp/env/coreplexip-e31-arty/flash.lds delete mode 100644 raven/bsp/env/coreplexip-e31-arty/init.c delete mode 100644 raven/bsp/env/coreplexip-e31-arty/openocd.cfg delete mode 100644 raven/bsp/env/coreplexip-e31-arty/platform.h delete mode 100644 raven/bsp/env/coreplexip-e31-arty/scratchpad.lds delete mode 100644 raven/bsp/env/coreplexip-e31-arty/settings.mk delete mode 100644 raven/bsp/env/coreplexip-e51-arty/dhrystone.lds delete mode 100644 raven/bsp/env/coreplexip-e51-arty/flash.lds delete mode 100644 raven/bsp/env/coreplexip-e51-arty/init.c delete mode 100644 raven/bsp/env/coreplexip-e51-arty/openocd.cfg delete mode 100644 raven/bsp/env/coreplexip-e51-arty/platform.h delete mode 100644 raven/bsp/env/coreplexip-e51-arty/scratchpad.lds delete mode 100644 raven/bsp/env/coreplexip-e51-arty/settings.mk delete mode 100644 raven/bsp/env/encoding.h delete mode 100644 raven/bsp/env/entry.S delete mode 100644 raven/bsp/env/freedom-e300-arty/flash.lds delete mode 100644 raven/bsp/env/freedom-e300-arty/init.c delete mode 100644 raven/bsp/env/freedom-e300-arty/openocd.cfg delete mode 100644 raven/bsp/env/freedom-e300-arty/platform.h delete mode 100644 raven/bsp/env/freedom-e300-arty/settings.mk delete mode 100644 raven/bsp/env/freedom-e300-hifive1/dhrystone.lds delete mode 100644 raven/bsp/env/freedom-e300-hifive1/flash.lds delete mode 100644 raven/bsp/env/freedom-e300-hifive1/init.c delete mode 100644 raven/bsp/env/freedom-e300-hifive1/openocd.cfg delete mode 100644 raven/bsp/env/freedom-e300-hifive1/platform.h delete mode 100644 raven/bsp/env/freedom-e300-hifive1/settings.mk delete mode 100644 raven/bsp/env/hifive1.h delete mode 100644 raven/bsp/env/start.S delete mode 100644 raven/bsp/env/ventry.S delete mode 100644 raven/bsp/include/sifive/bits.h delete mode 100644 raven/bsp/include/sifive/const.h delete mode 100644 raven/bsp/include/sifive/devices/aon.h delete mode 100644 raven/bsp/include/sifive/devices/clic.h delete mode 100644 raven/bsp/include/sifive/devices/clint.h delete mode 100644 raven/bsp/include/sifive/devices/gpio.h delete mode 100644 raven/bsp/include/sifive/devices/otp.h delete mode 100644 raven/bsp/include/sifive/devices/plic.h delete mode 100644 raven/bsp/include/sifive/devices/prci.h delete mode 100644 raven/bsp/include/sifive/devices/pwm.h delete mode 100644 raven/bsp/include/sifive/devices/spi.h delete mode 100644 raven/bsp/include/sifive/devices/uart.h delete mode 100644 raven/bsp/include/sifive/sections.h delete mode 100644 raven/bsp/include/sifive/smp.h delete mode 100644 raven/bsp/libwrap/libwrap.mk delete mode 100644 raven/bsp/libwrap/misc/write_hex.c delete mode 100644 raven/bsp/libwrap/stdlib/malloc.c delete mode 100644 raven/bsp/libwrap/sys/_exit.c delete mode 100644 raven/bsp/libwrap/sys/close.c delete mode 100644 raven/bsp/libwrap/sys/execve.c delete mode 100644 raven/bsp/libwrap/sys/fork.c delete mode 100644 raven/bsp/libwrap/sys/fstat.c delete mode 100644 raven/bsp/libwrap/sys/getpid.c delete mode 100644 raven/bsp/libwrap/sys/isatty.c delete mode 100644 raven/bsp/libwrap/sys/kill.c delete mode 100644 raven/bsp/libwrap/sys/link.c delete mode 100644 raven/bsp/libwrap/sys/lseek.c delete mode 100644 raven/bsp/libwrap/sys/open.c delete mode 100644 raven/bsp/libwrap/sys/openat.c delete mode 100644 raven/bsp/libwrap/sys/puts.c delete mode 100644 raven/bsp/libwrap/sys/read.c delete mode 100644 raven/bsp/libwrap/sys/sbrk.c delete mode 100644 raven/bsp/libwrap/sys/stat.c delete mode 100644 raven/bsp/libwrap/sys/stub.h delete mode 100644 raven/bsp/libwrap/sys/times.c delete mode 100644 raven/bsp/libwrap/sys/unlink.c delete mode 100644 raven/bsp/libwrap/sys/wait.c delete mode 100644 raven/bsp/libwrap/sys/weak_under_alias.h delete mode 100644 raven/bsp/libwrap/sys/write.c delete mode 100755 raven/hello_raven delete mode 100644 raven/src/bsp.h delete mode 100644 raven/src/delay.c delete mode 100644 raven/src/delay.h delete mode 100644 raven/src/hello_raven.cpp delete mode 100644 raven/src/hello_raven.h delete mode 100644 raven/src/io/gpio.h delete mode 100644 raven/src/io/pwm.h delete mode 100644 raven/src/io/spi.h delete mode 100644 raven/src/io/uart.h delete mode 100644 raven/src/util/bit_field.h delete mode 100644 raven/src/wrap_printf.c delete mode 100644 raven/toolchain-rv32.cmake delete mode 100644 raven_spn/.cproject delete mode 100644 raven_spn/Makefile delete mode 100644 raven_spn/bsp/drivers/clic/clic_driver.c delete mode 100644 raven_spn/bsp/drivers/clic/clic_driver.h delete mode 100644 raven_spn/bsp/drivers/fe300prci/fe300prci_driver.c delete mode 100644 raven_spn/bsp/drivers/fe300prci/fe300prci_driver.h delete mode 100644 raven_spn/bsp/drivers/plic/plic_driver.c delete mode 100644 raven_spn/bsp/drivers/plic/plic_driver.h delete mode 100644 raven_spn/bsp/env/common.mk delete mode 100644 raven_spn/bsp/env/coreip-e2-arty/flash.lds delete mode 100644 raven_spn/bsp/env/coreip-e2-arty/init.c delete mode 100644 raven_spn/bsp/env/coreip-e2-arty/openocd.cfg delete mode 100644 raven_spn/bsp/env/coreip-e2-arty/platform.h delete mode 100644 raven_spn/bsp/env/coreip-e2-arty/settings.mk delete mode 100644 raven_spn/bsp/env/coreip-e2-arty/tim-split.lds delete mode 100644 raven_spn/bsp/env/coreip-e2-arty/tim.lds delete mode 100644 raven_spn/bsp/env/coreplexip-arty.h delete mode 100644 raven_spn/bsp/env/coreplexip-e31-arty/dhrystone.lds delete mode 100644 raven_spn/bsp/env/coreplexip-e31-arty/flash.lds delete mode 100644 raven_spn/bsp/env/coreplexip-e31-arty/init.c delete mode 100644 raven_spn/bsp/env/coreplexip-e31-arty/openocd.cfg delete mode 100644 raven_spn/bsp/env/coreplexip-e31-arty/platform.h delete mode 100644 raven_spn/bsp/env/coreplexip-e31-arty/scratchpad.lds delete mode 100644 raven_spn/bsp/env/coreplexip-e31-arty/settings.mk delete mode 100644 raven_spn/bsp/env/coreplexip-e51-arty/dhrystone.lds delete mode 100644 raven_spn/bsp/env/coreplexip-e51-arty/flash.lds delete mode 100644 raven_spn/bsp/env/coreplexip-e51-arty/init.c delete mode 100644 raven_spn/bsp/env/coreplexip-e51-arty/openocd.cfg delete mode 100644 raven_spn/bsp/env/coreplexip-e51-arty/platform.h delete mode 100644 raven_spn/bsp/env/coreplexip-e51-arty/scratchpad.lds delete mode 100644 raven_spn/bsp/env/coreplexip-e51-arty/settings.mk delete mode 100644 raven_spn/bsp/env/encoding.h delete mode 100644 raven_spn/bsp/env/entry.S delete mode 100644 raven_spn/bsp/env/freedom-e300-arty/flash.lds delete mode 100644 raven_spn/bsp/env/freedom-e300-arty/init.c delete mode 100644 raven_spn/bsp/env/freedom-e300-arty/openocd.cfg delete mode 100644 raven_spn/bsp/env/freedom-e300-arty/platform.h delete mode 100644 raven_spn/bsp/env/freedom-e300-arty/settings.mk delete mode 100644 raven_spn/bsp/env/freedom-e300-hifive1/dhrystone.lds delete mode 100644 raven_spn/bsp/env/freedom-e300-hifive1/flash.lds delete mode 100644 raven_spn/bsp/env/freedom-e300-hifive1/init.c delete mode 100644 raven_spn/bsp/env/freedom-e300-hifive1/openocd.cfg delete mode 100644 raven_spn/bsp/env/freedom-e300-hifive1/platform.h delete mode 100644 raven_spn/bsp/env/freedom-e300-hifive1/settings.mk delete mode 100644 raven_spn/bsp/env/hifive1.h delete mode 100644 raven_spn/bsp/env/start.S delete mode 100644 raven_spn/bsp/env/ventry.S delete mode 100644 raven_spn/bsp/include/sifive/bits.h delete mode 100644 raven_spn/bsp/include/sifive/const.h delete mode 100644 raven_spn/bsp/include/sifive/devices/aon.h delete mode 100644 raven_spn/bsp/include/sifive/devices/clic.h delete mode 100644 raven_spn/bsp/include/sifive/devices/clint.h delete mode 100644 raven_spn/bsp/include/sifive/devices/gpio.h delete mode 100644 raven_spn/bsp/include/sifive/devices/otp.h delete mode 100644 raven_spn/bsp/include/sifive/devices/plic.h delete mode 100644 raven_spn/bsp/include/sifive/devices/prci.h delete mode 100644 raven_spn/bsp/include/sifive/devices/pwm.h delete mode 100644 raven_spn/bsp/include/sifive/devices/spi.h delete mode 100644 raven_spn/bsp/include/sifive/devices/uart.h delete mode 100644 raven_spn/bsp/include/sifive/sections.h delete mode 100644 raven_spn/bsp/include/sifive/smp.h delete mode 100644 raven_spn/bsp/libwrap/libwrap.mk delete mode 100644 raven_spn/bsp/libwrap/misc/write_hex.c delete mode 100644 raven_spn/bsp/libwrap/stdlib/malloc.c delete mode 100644 raven_spn/bsp/libwrap/sys/_exit.c delete mode 100644 raven_spn/bsp/libwrap/sys/close.c delete mode 100644 raven_spn/bsp/libwrap/sys/execve.c delete mode 100644 raven_spn/bsp/libwrap/sys/fork.c delete mode 100644 raven_spn/bsp/libwrap/sys/fstat.c delete mode 100644 raven_spn/bsp/libwrap/sys/getpid.c delete mode 100644 raven_spn/bsp/libwrap/sys/isatty.c delete mode 100644 raven_spn/bsp/libwrap/sys/kill.c delete mode 100644 raven_spn/bsp/libwrap/sys/link.c delete mode 100644 raven_spn/bsp/libwrap/sys/lseek.c delete mode 100644 raven_spn/bsp/libwrap/sys/open.c delete mode 100644 raven_spn/bsp/libwrap/sys/openat.c delete mode 100644 raven_spn/bsp/libwrap/sys/puts.c delete mode 100644 raven_spn/bsp/libwrap/sys/read.c delete mode 100644 raven_spn/bsp/libwrap/sys/sbrk.c delete mode 100644 raven_spn/bsp/libwrap/sys/stat.c delete mode 100644 raven_spn/bsp/libwrap/sys/stub.h delete mode 100644 raven_spn/bsp/libwrap/sys/times.c delete mode 100644 raven_spn/bsp/libwrap/sys/unlink.c delete mode 100644 raven_spn/bsp/libwrap/sys/wait.c delete mode 100644 raven_spn/bsp/libwrap/sys/weak_under_alias.h delete mode 100644 raven_spn/bsp/libwrap/sys/write.c delete mode 100755 raven_spn/raven_spn delete mode 100644 raven_spn/src/bsp.h delete mode 100644 raven_spn/src/delay.c delete mode 100644 raven_spn/src/delay.h delete mode 100644 raven_spn/src/init.h delete mode 100644 raven_spn/src/io/gpio.h delete mode 100644 raven_spn/src/io/pwm.h delete mode 100644 raven_spn/src/io/spi.h delete mode 100644 raven_spn/src/io/uart.h delete mode 100644 raven_spn/src/raven_spn.cpp delete mode 100644 raven_spn/src/raven_spn.h delete mode 100644 raven_spn/src/spn_checker_regs.h delete mode 100644 raven_spn/src/spn_regs.h delete mode 100644 raven_spn/src/util/bit_field.h delete mode 100644 raven_spn/toolchain-rv32.cmake diff --git a/fpga_spn/Makefile b/fpga_spn/Makefile deleted file mode 100644 index ad85959..0000000 --- a/fpga_spn/Makefile +++ /dev/null @@ -1,27 +0,0 @@ - -TARGET = raven_spn -C_SRCS = $(wildcard src/*.c) $(BSP_BASE)/drivers/fe300prci/fe300prci_driver.c $(BSP_BASE)/drivers/plic/plic_driver.c -CXX_SRCS = $(wildcard src/*.cpp) -HEADERS = $(wildcard src/*.h) -CFLAGS = -g -fno-builtin-printf -DUSE_PLIC -I./src -CXXFLAGS = -fno-use-cxa-atexit -LDFLAGS += -g -lstdc++ -fno-use-cxa-atexit -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=medany - - -BOARD=freedom-e300-hifive1 -LINK_TARGET=flash -RISCV_ARCH=rv32imac -RISCV_ABI=ilp32 - -TOOL_DIR=/opt/shared/riscv/tools/Ubuntu/riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-linux-ubuntu14/bin - -BSP_BASE = ./bsp -include $(BSP_BASE)/env/common.mk - -.PHONY: all -all: $(TARGET).dump - -$(TARGET).dump: $(TARGET) - $(TOOL_DIR)/$(TRIPLET)-objdump -d -S -C $< > $@ - - diff --git a/fpga_spn/bsp/drivers/clic/clic_driver.c b/fpga_spn/bsp/drivers/clic/clic_driver.c deleted file mode 100644 index 0612e58..0000000 --- a/fpga_spn/bsp/drivers/clic/clic_driver.c +++ /dev/null @@ -1,163 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/clic.h" -#include "clic/clic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -void volatile_memzero(uint8_t * base, unsigned int size) { - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -// Note that there are no assertions or bounds checking on these -// parameter values. -void clic_init ( - clic_instance_t * this_clic, - uintptr_t hart_addr, - interrupt_function_ptr_t* vect_table, - interrupt_function_ptr_t default_handler, - uint32_t num_irq, - uint32_t num_config_bits - ) -{ - this_clic->hart_addr= hart_addr; - this_clic->vect_table= vect_table; - this_clic->num_config_bits= num_config_bits; - - //initialize vector table - for(int i=0;i++;ivect_table[i] = default_handler; - } - - //set base vectors - write_csr(mtvt, vect_table); - - - //clear all interrupt enables and pending - volatile_memzero((uint8_t*)(this_clic->hart_addr+CLIC_INTIE), num_irq); - volatile_memzero((uint8_t*)(this_clic->hart_addr+CLIC_INTIP), num_irq); - - //clear nlbits and nvbits; all interrupts trap to level 15 - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG)=0; - -} - -void clic_install_handler (clic_instance_t * this_clic, uint32_t source, interrupt_function_ptr_t handler) { - this_clic->vect_table[source] = handler; -} - -void clic_enable_interrupt (clic_instance_t * this_clic, uint32_t source) { - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIE+source) = 1; -} - -void clic_disable_interrupt (clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIE+source) = 0; -} - -void clic_set_pending(clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIP+source) = 1; -} - -void clic_clear_pending(clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIP+source) = 0; -} - -void clic_set_intcfg (clic_instance_t * this_clic, uint32_t source, uint32_t intcfg){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTCFG+source) = intcfg; -} - -uint8_t clic_get_intcfg (clic_instance_t * this_clic, uint32_t source){ - return *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTCFG+source); -} - -void clic_set_cliccfg (clic_instance_t * this_clic, uint32_t cfg){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG) = cfg; -} - -uint8_t clic_get_cliccfg (clic_instance_t * this_clic){ - return *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG); -} - -//sets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_set_int_level( clic_instance_t * this_clic, uint32_t source, uint8_t level) { - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift level right to mask off unused bits - level = level>>((this_clic->num_config_bits)-nlbits); //plus this_clic->nmbits which is always 0 for now. - //shift level into correct bit position - level = level << (8-this_clic->num_config_bits) + (this_clic->num_config_bits - nlbits); - - //write to clicintcfg - uint8_t current_intcfg = clic_get_intcfg(this_clic, source); - clic_set_intcfg(this_clic, source, (current_intcfg | level)); - - return level; -} - -//gets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_get_int_level( clic_instance_t * this_clic, uint32_t source) { - uint8_t level; - level = clic_get_intcfg(this_clic, source); - - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift level - level = level >> (8-(this_clic->num_config_bits)); - - //shift level right to mask off priority bits - level = level>>(this_clic->num_config_bits-nlbits); //this_clic->nmbits which is always 0 for now. - - return level; -} - -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_set_int_priority( clic_instance_t * this_clic, uint32_t source, uint8_t priority) { - //priority bits = num_config_bits - nlbits - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - uint8_t priority_bits = this_clic->num_config_bits-nlbits; - if(priority_bits = 0) { - //no bits to set - return 0; - } - //mask off unused bits - priority = priority >> (8-priority_bits); - //shift into the correct bit position - priority = priority << (8-(this_clic->num_config_bits)); - - //write to clicintcfg - uint8_t current_intcfg = clic_get_intcfg(this_clic, source); - clic_set_intcfg(this_clic, source, (current_intcfg | priority)); - return current_intcfg; -} - -//gets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_get_int_priority( clic_instance_t * this_clic, uint32_t source) { - uint8_t priority; - priority = clic_get_intcfg(this_clic, source); - - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift left to mask off level bits - priority = priority << nlbits; - - //shift priority - priority = priority >> (8-((this_clic->num_config_bits)+nlbits)); - - return priority; -} - - diff --git a/fpga_spn/bsp/drivers/clic/clic_driver.h b/fpga_spn/bsp/drivers/clic/clic_driver.h deleted file mode 100644 index 27c34c2..0000000 --- a/fpga_spn/bsp/drivers/clic/clic_driver.h +++ /dev/null @@ -1,44 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef void (*interrupt_function_ptr_t) (void); - -typedef struct __clic_instance_t -{ - uintptr_t hart_addr; - interrupt_function_ptr_t* vect_table; - uint32_t num_config_bits; - uint32_t num_sources; -} clic_instance_t; - -// Note that there are no assertions or bounds checking on these -// parameter values. -void clic_init (clic_instance_t * this_clic, uintptr_t hart_addr, interrupt_function_ptr_t* vect_table, interrupt_function_ptr_t default_handler, uint32_t num_irq,uint32_t num_config_bits); -void clic_install_handler (clic_instance_t * this_clic, uint32_t source, interrupt_function_ptr_t handler); -void clic_enable_interrupt (clic_instance_t * this_clic, uint32_t source); -void clic_disable_interrupt (clic_instance_t * this_clic, uint32_t source); -void clic_set_pending(clic_instance_t * this_clic, uint32_t source); -void clic_clear_pending(clic_instance_t * this_clic, uint32_t source); -void clic_set_intcfg (clic_instance_t * this_clic, uint32_t source, uint32_t intcfg); -uint8_t clic_get_intcfg (clic_instance_t * this_clic, uint32_t source); -void clic_set_cliccfg (clic_instance_t * this_clic, uint32_t cfg); -uint8_t clic_get_cliccfg (clic_instance_t * this_clic); -//sets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_set_int_level( clic_instance_t * this_clic, uint32_t source, uint8_t level); -//get an interrupt level based encoding of nmbits, nlbits -uint8_t clic_get_int_level( clic_instance_t * this_clic, uint32_t source); -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_set_int_priority( clic_instance_t * this_clic, uint32_t source, uint8_t priority); -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_get_int_priority( clic_instance_t * this_clic, uint32_t source); - -__END_DECLS - -#endif diff --git a/fpga_spn/bsp/drivers/fe300prci/fe300prci_driver.c b/fpga_spn/bsp/drivers/fe300prci/fe300prci_driver.c deleted file mode 100644 index 8eeaafc..0000000 --- a/fpga_spn/bsp/drivers/fe300prci/fe300prci_driver.c +++ /dev/null @@ -1,252 +0,0 @@ -// See LICENSE file for license details - -#include "platform.h" - -#ifdef PRCI_CTRL_ADDR -#include "fe300prci/fe300prci_driver.h" -#include - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq) -{ - - uint32_t start_mtime = CLINT_REG(CLINT_MTIME); - uint32_t end_mtime = start_mtime + mtime_ticks + 1; - - // Make sure we won't get rollover. - while (end_mtime < start_mtime){ - start_mtime = CLINT_REG(CLINT_MTIME); - end_mtime = start_mtime + mtime_ticks + 1; - } - - // Don't start measuring until mtime edge. - uint32_t tmp = start_mtime; - do { - start_mtime = CLINT_REG(CLINT_MTIME); - } while (start_mtime == tmp); - - uint64_t start_mcycle; - rdmcycle(&start_mcycle); - - while (CLINT_REG(CLINT_MTIME) < end_mtime) ; - - uint64_t end_mcycle; - rdmcycle(&end_mcycle); - uint32_t difference = (uint32_t) (end_mcycle - start_mcycle); - - uint64_t freq = ((uint64_t) difference * mtime_freq) / mtime_ticks; - return (uint32_t) freq & 0xFFFFFFFF; - -} - - -void PRCI_use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - // It is OK to change this even if we are running off of it. - - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0); - - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - PRCI_use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if desired. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - - // To overclock, use the hfrosc - if (hfrosctrim >= 0 && hfroscdiv >= 0) { - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - } - - // Set DIV Settings for PLL - - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - if (finaldiv == 1){ - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV(finaldiv-1)); - } - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = CLINT_REG(CLINT_MTIME); - while (CLINT_REG(CLINT_MTIME) - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0); - - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); - - // If we're running off HFXOSC, turn off the HFROSC to - // save power. - if (refsel) { - PRCI_REG(PRCI_HFROSCCFG) &= ~ROSC_EN(1); - } - -} - -void PRCI_use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - PRCI_use_hfrosc(4, 16); -} - -void PRCI_use_hfxosc(uint32_t finaldiv) -{ - - PRCI_use_pll(1, // Use HFXTAL - 1, // Bypass = 1 - 0, // PLL settings don't matter - 0, // PLL settings don't matter - 0, // PLL settings don't matter - finaldiv, - -1, - -1); -} - -// This is a generic function, which -// doesn't span the entire range of HFROSC settings. -// It only adjusts the trim, which can span a hundred MHz or so. -// This function does not check the legality of the PLL settings -// at all, and it is quite possible to configure invalid PLL settings -// this way. -// It returns the actual measured CPU frequency. - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target ) -{ - - uint32_t hfrosctrim = 0; - uint32_t hfroscdiv = 4; - uint32_t prev_trim = 0; - - // In this function we use PLL settings which - // will give us a 32x multiplier from the output - // of the HFROSC source to the output of the - // PLL. We first measure our HFROSC to get the - // right trim, then finally use it as the PLL source. - // We should really check here that the f_cpu - // requested is something in the limit of the PLL. For - // now that is up to the user. - - // This will undershoot for frequencies not divisible by 16. - uint32_t desired_hfrosc_freq = (f_cpu/ 16); - - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - - // Ignore the first run (for icache reasons) - uint32_t cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - uint32_t prev_freq = cpu_freq; - - while ((cpu_freq < desired_hfrosc_freq) && (hfrosctrim < 0x1F)){ - prev_trim = hfrosctrim; - prev_freq = cpu_freq; - hfrosctrim ++; - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - } - - // We couldn't go low enough - if (prev_freq > desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // We couldn't go high enough - if (cpu_freq < desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // Check for over/undershoot - switch(target) { - case(PRCI_FREQ_CLOSEST): - if ((desired_hfrosc_freq - prev_freq) < (cpu_freq - desired_hfrosc_freq)) { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - } else { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - break; - case(PRCI_FREQ_UNDERSHOOT): - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - break; - default: - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - -} - -#endif diff --git a/fpga_spn/bsp/drivers/fe300prci/fe300prci_driver.h b/fpga_spn/bsp/drivers/fe300prci/fe300prci_driver.h deleted file mode 100644 index 7100f46..0000000 --- a/fpga_spn/bsp/drivers/fe300prci/fe300prci_driver.h +++ /dev/null @@ -1,79 +0,0 @@ -// See LICENSE file for license details - -#ifndef _FE300PRCI_DRIVER_H_ -#define _FE300PRCI_DRIVER_H_ - -__BEGIN_DECLS - -#include - -typedef enum prci_freq_target { - - PRCI_FREQ_OVERSHOOT, - PRCI_FREQ_CLOSEST, - PRCI_FREQ_UNDERSHOOT - -} PRCI_freq_target; - -/* Measure and return the approximate frequency of the - * CPU, as given by measuring the mcycle counter against - * the mtime ticks. - */ -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq); - -/* Safely switch over to the HFROSC using the given div - * and trim settings. - */ -void PRCI_use_hfrosc(int div, int trim); - -/* Safely switch over to the 16MHz HFXOSC, - * applying the finaldiv clock divider (1 is the lowest - * legal value). - */ -void PRCI_use_hfxosc(uint32_t finaldiv); - -/* Safely switch over to the PLL using the given - * settings. - * - * Note that not all combinations of the inputs are actually - * legal, and this function does not check for their - * legality ("safely" means that this function won't turn off - * or glitch the clock the CPU is actually running off, but - * doesn't protect against you making it too fast or slow.) - */ - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim); - -/* Use the default clocks configured at reset. - * This is ~16Mhz HFROSC and turns off the LFROSC - * (on the current FE310 Dev Platforms, an external LFROSC is - * used as it is more power efficient). - */ -void PRCI_use_default_clocks(); - -/* This routine will adjust the HFROSC trim - * while using HFROSC as the clock source, - * measure the resulting frequency, then - * use it as the PLL clock source, - * in an attempt to get over, under, or close to the - * requested frequency. It returns the actual measured - * frequency. - * - * Note that the requested frequency must be within the - * range supported by the PLL so not all values are - * achievable with this function, and not all - * are guaranteed to actually work. The PLL - * is rated higher than the hardware. - * - * There is no check on the desired f_cpu frequency, it - * is up to the user to specify something reasonable. - */ - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target); - -__END_DECLS - -#endif - diff --git a/fpga_spn/bsp/drivers/plic/plic_driver.c b/fpga_spn/bsp/drivers/plic/plic_driver.c deleted file mode 100644 index 4f41bda..0000000 --- a/fpga_spn/bsp/drivers/plic/plic_driver.c +++ /dev/null @@ -1,122 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/plic.h" -#include "plic/plic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -// Note that there are no assertions or bounds checking on these -// parameter values. - -void volatile_memzero(uint8_t * base, unsigned int size) -{ - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities, - uint32_t target_hartid - ) -{ - - this_plic->base_addr = base_addr; - this_plic->num_sources = num_sources; - this_plic->num_priorities = num_priorities; - this_plic->target_hartid = target_hartid; - - // Disable all interrupts (don't assume that these registers are reset). - volatile_memzero((uint8_t*) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET)), - (num_sources + 8) / 8); - - // Set all priorities to 0 (equal priority -- don't assume that these are reset). - volatile_memzero ((uint8_t *)(this_plic->base_addr + - PLIC_PRIORITY_OFFSET), - (num_sources + 1) << PLIC_PRIORITY_SHIFT_PER_SOURCE); - - // Set the threshold to 0. - volatile plic_threshold* threshold = (plic_threshold*) - (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (this_plic->target_hartid << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold = 0; - -} - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold){ - - volatile plic_threshold* threshold_ptr = (plic_threshold*) (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (this_plic->target_hartid << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold_ptr = threshold; - -} - - -void PLIC_enable_interrupt (plic_instance_t * this_plic, plic_source source){ - - volatile uint8_t * current_ptr = (volatile uint8_t *)(this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current | ( 1 << (source & 0x7)); - *current_ptr = current; - -} - -void PLIC_disable_interrupt (plic_instance_t * this_plic, plic_source source){ - - volatile uint8_t * current_ptr = (volatile uint8_t *) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current & ~(( 1 << (source & 0x7))); - *current_ptr = current; - -} - -void PLIC_set_priority (plic_instance_t * this_plic, plic_source source, plic_priority priority){ - - if (this_plic->num_priorities > 0) { - volatile plic_priority * priority_ptr = (volatile plic_priority *) - (this_plic->base_addr + - PLIC_PRIORITY_OFFSET + - (source << PLIC_PRIORITY_SHIFT_PER_SOURCE)); - *priority_ptr = priority; - } -} - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic){ - - volatile plic_source * claim_addr = (volatile plic_source * ) - (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (this_plic->target_hartid << PLIC_CLAIM_SHIFT_PER_TARGET)); - - return *claim_addr; - -} - -void PLIC_complete_interrupt(plic_instance_t * this_plic, plic_source source){ - - volatile plic_source * claim_addr = (volatile plic_source *) (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (this_plic->target_hartid << PLIC_CLAIM_SHIFT_PER_TARGET)); - *claim_addr = source; - -} - diff --git a/fpga_spn/bsp/drivers/plic/plic_driver.h b/fpga_spn/bsp/drivers/plic/plic_driver.h deleted file mode 100644 index f7201ee..0000000 --- a/fpga_spn/bsp/drivers/plic/plic_driver.h +++ /dev/null @@ -1,52 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef struct __plic_instance_t -{ - uintptr_t base_addr; - - uint32_t num_sources; - uint32_t num_priorities; - uint32_t target_hartid; -} plic_instance_t; - -typedef uint32_t plic_source; -typedef uint32_t plic_priority; -typedef uint32_t plic_threshold; - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities, - uint32_t target_hartid - ); - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold); - -void PLIC_enable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_disable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_set_priority (plic_instance_t * this_plic, - plic_source source, - plic_priority priority); - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic); - -void PLIC_complete_interrupt(plic_instance_t * this_plic, - plic_source source); - -__END_DECLS - -#endif diff --git a/fpga_spn/bsp/env/common.mk b/fpga_spn/bsp/env/common.mk deleted file mode 100644 index 0ca2c70..0000000 --- a/fpga_spn/bsp/env/common.mk +++ /dev/null @@ -1,66 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_COMMON -_SIFIVE_MK_COMMON := # defined - -.PHONY: all -all: $(TARGET) - -include $(BSP_BASE)/libwrap/libwrap.mk - -ENV_DIR = $(BSP_BASE)/env -PLATFORM_DIR = $(ENV_DIR)/$(BOARD) - -ASM_SRCS += $(ENV_DIR)/start.S -ASM_SRCS += $(ENV_DIR)/entry.S -C_SRCS += $(PLATFORM_DIR)/init.c - -LINKER_SCRIPT := $(PLATFORM_DIR)/$(LINK_TARGET).lds - -INCLUDES += -I$(BSP_BASE)/include -INCLUDES += -I$(BSP_BASE)/drivers/ -INCLUDES += -I$(ENV_DIR) -INCLUDES += -I$(PLATFORM_DIR) - -TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin - -LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles -LDFLAGS += -L$(ENV_DIR) --specs=nano.specs - -ASM_OBJS := $(ASM_SRCS:.S=.o) -C_OBJS := $(C_SRCS:.c=.o) -CXX_OBJS := $(CXX_SRCS:.cpp=.o) - -LINK_OBJS += $(ASM_OBJS) $(C_OBJS) $(CXX_OBJS) -LINK_DEPS += $(LINKER_SCRIPT) - -CLEAN_OBJS += $(TARGET) $(LINK_OBJS) - -CFLAGS += -march=$(RISCV_ARCH) -CFLAGS += -mabi=$(RISCV_ABI) -CFLAGS += -mcmodel=medany - -TRIPLET?=riscv64-unknown-elf -CXX=$(TOOL_DIR)/$(TRIPLET)-c++ -CC=$(TOOL_DIR)/$(TRIPLET)-gcc -LD=$(TOOL_DIR)/$(TRIPLET)-gcc -AR=$(TOOL_DIR)/$(TRIPLET)-ar - - -$(TARGET): $(LINK_OBJS) $(LINK_DEPS) - $(LD) $(LINK_OBJS) $(LDFLAGS) $(LIBWRAP) -o $@ - -$(ASM_OBJS): %.o: %.S $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(C_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -$(CXX_OBJS): %.o: %.cpp $(HEADERS) - $(CXX) $(CFLAGS) $(CXXFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -.PHONY: clean -clean: - rm -f $(CLEAN_OBJS) $(LIBWRAP) - -endif # _SIFIVE_MK_COMMON diff --git a/fpga_spn/bsp/env/coreip-e2-arty/flash.lds b/fpga_spn/bsp/env/coreip-e2-arty/flash.lds deleted file mode 100644 index 2d5eb01..0000000 --- a/fpga_spn/bsp/env/coreip-e2-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreip-e2-arty/init.c b/fpga_spn/bsp/env/coreip-e2-arty/init.c deleted file mode 100644 index 3a4c77c..0000000 --- a/fpga_spn/bsp/env/coreip-e2-arty/init.c +++ /dev/null @@ -1,98 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 32000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -extern int main(int argc, char** argv); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() ) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -typedef void (*interrupt_function_ptr_t) (void); -interrupt_function_ptr_t localISR[CLIC_NUM_INTERRUPTS] __attribute__((aligned(64))); - - -void trap_entry(void) __attribute__((interrupt, aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); - } else { - while(1); - } -} - -#ifdef CLIC_DIRECT -#else -void default_handler(void)__attribute__((interrupt));; -#endif -void default_handler(void) -{ - puts("default handler\n"); - while(1); -} - -void _init() -{ -#ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -//initialize vector table - int i=0; - while(iflash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreip-e2-arty/tim.lds b/fpga_spn/bsp/env/coreip-e2-arty/tim.lds deleted file mode 100644 index 7dfb36b..0000000 --- a/fpga_spn/bsp/env/coreip-e2-arty/tim.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreplexip-arty.h b/fpga_spn/bsp/env/coreplexip-arty.h deleted file mode 100644 index eedcaa5..0000000 --- a/fpga_spn/bsp/env/coreplexip-arty.h +++ /dev/null @@ -1,102 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_COREPLEXIP_ARTY_H -#define _SIFIVE_COREPLEXIP_ARTY_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the directly driven -// RGB LEDs on the Freedom Exx Coreplex IP Evaluation Arty FPGA Dev Kit. -// Additional RGB LEDs are driven by the 3 PWM outputs. - -#define RED_LED_OFFSET 0 -#define GREEN_LED_OFFSET 1 -#define BLUE_LED_OFFSET 2 - -// Switch 3 is used as a GPIO input. (Switch 0 is used to set -// the reset vector, the other switches are unused). - -#define SW_3_OFFSET 3 - -// These are the buttons which are mapped as inputs. - -#define HAS_BOARD_BUTTONS - -#define BUTTON_0_OFFSET 4 -#define BUTTON_1_OFFSET 5 -#define BUTTON_2_OFFSET 6 -#define BUTTON_3_OFFSET 7 - -// These are the bit offsets for the different GPIO pins -// mapped onto the PMOD A header. - -#define JA_0_OFFSET 8 -#define JA_1_OFFSET 9 -#define JA_2_OFFSET 10 -#define JA_3_OFFSET 11 -#define JA_4_OFFSET 12 -#define JA_5_OFFSET 13 -#define JA_6_OFFSET 14 -#define JA_7_OFFSET 15 - -// The below gives a mapping between global interrupt -// sources and their number. Note that on the coreplex -// deliverable, the io_global_interrupts go directly into -// the PLIC. The evaluation image on the FPGA mimics a -// system with peripheral devices which are driving the -// global interrupt lines. -// So, on this image, in order to get an interrupt from -// e.g. pressing BUTTON_0: -// 1) Steps which are external to the delivery coreplex: -// a) The corresponding GPIO pin must be configured as in input -// b) The "interrupt on fall" bit must be set for the GPIO pin -// 2) Steps which would also need to be performed for the delivery coreplex: -// a) The corresponding global interrupt, priority, and threshold must be configured in the PLIC. -// b) The external interrupt bit must be enabled in MSTATUS -// c) Interrupts must be enabled globally in the core. - -// Any of the above GPIO pins can be used as global interrupt -// sources by adding their offset to the INT_GPIO_BASE. -// For example, the buttons are shown here: - -#define INT_DEVICE_BUTTON_0 (GPIO_INT_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (GPIO_INT_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (GPIO_INT_BASE + BUTTON_2_OFFSET) -#define INT_DEVICE_BUTTON_3 (GPIO_INT_BASE + BUTTON_3_OFFSET) - -// In addition, the Switches are mapped directly to -// the PLIC (without going through the GPIO Peripheral). - -#define INT_EXT_DEVICE_SW_0 (EXTERNAL_INT_BASE + 0) -#define INT_EXT_DEVICE_SW_1 (EXTERNAL_INT_BASE + 1) -#define INT_EXT_DEVICE_SW_2 (EXTERNAL_INT_BASE + 2) -#define INT_EXT_DEVICE_SW_3 (EXTERNAL_INT_BASE + 3) - -// This gives the mapping from inputs to LOCAL interrupts. - -#define LOCAL_INT_SW_0 0 -#define LOCAL_INT_SW_1 1 -#define LOCAL_INT_SW_2 2 -#define LOCAL_INT_SW_3 3 -#define LOCAL_INT_BTN_0 4 -#define LOCAL_INT_BTN_1 5 -#define LOCAL_INT_BTN_2 6 -#define LOCAL_INT_BTN_3 7 -#define LOCAL_INT_JA_0 8 -#define LOCAL_INT_JA_1 9 -#define LOCAL_INT_JA_2 10 -#define LOCAL_INT_JA_3 11 -#define LOCAL_INT_JA_4 12 -#define LOCAL_INT_JA_5 13 -#define LOCAL_INT_JA_6 14 -#define LOCAL_INT_JA_7 15 - -#define RTC_FREQ 32768 - -void write_hex(int fd, unsigned long int hex); - -#endif /* _SIFIVE_COREPLEXIP_ARTY_H */ diff --git a/fpga_spn/bsp/env/coreplexip-e31-arty/dhrystone.lds b/fpga_spn/bsp/env/coreplexip-e31-arty/dhrystone.lds deleted file mode 100644 index 8f6527b..0000000 --- a/fpga_spn/bsp/env/coreplexip-e31-arty/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreplexip-e31-arty/flash.lds b/fpga_spn/bsp/env/coreplexip-e31-arty/flash.lds deleted file mode 100644 index 590c5b6..0000000 --- a/fpga_spn/bsp/env/coreplexip-e31-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreplexip-e31-arty/init.c b/fpga_spn/bsp/env/coreplexip-e31-arty/init.c deleted file mode 100644 index 1f8b679..0000000 --- a/fpga_spn/bsp/env/coreplexip-e31-arty/init.c +++ /dev/null @@ -1,122 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 65000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -#ifndef VECT_IRQ - #define TRAP_ENTRY trap_entry -#else - #define TRAP_ENTRY vtrap_entry -#endif - -extern int main(int argc, char** argv); -extern void TRAP_ENTRY(); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() / 2) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -#ifdef USE_LOCAL_ISR -typedef void (*my_interrupt_function_ptr_t) (void); -extern my_interrupt_function_ptr_t localISR[]; -#endif - -#ifndef VECT_IRQ -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) __attribute__((noinline)); -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif -#ifdef USE_LOCAL_ISR - } else if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} -#endif - -#ifdef USE_CLIC -void trap_entry(void) __attribute__((interrupt("SiFive-CLIC-preemptible"), aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - handle_trap(mcause, mepc); -} -#endif - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -#ifdef USE_CLIC - write_csr(mtvec, ((unsigned long)&trap_entry | MTVEC_CLIC)); -#else - write_csr(mtvec, ((unsigned long)&TRAP_ENTRY | MTVEC_VECTORED)); -#endif - - #endif -} - -void _fini() -{ -} diff --git a/fpga_spn/bsp/env/coreplexip-e31-arty/openocd.cfg b/fpga_spn/bsp/env/coreplexip-e31-arty/openocd.cfg deleted file mode 100644 index 0481a72..0000000 --- a/fpga_spn/bsp/env/coreplexip-e31-arty/openocd.cfg +++ /dev/null @@ -1,31 +0,0 @@ -# JTAG adapter setup -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001 - -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -# Un-comment these two flash lines if you have a SPI flash and want to write -# it. -flash bank spi0 fespi 0x40000000 0 0 0 $_TARGETNAME.0 0x20004000 -init -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off -echo "Ready for Remote Connections" diff --git a/fpga_spn/bsp/env/coreplexip-e31-arty/platform.h b/fpga_spn/bsp/env/coreplexip-e31-arty/platform.h deleted file mode 100644 index 6fa79ea..0000000 --- a/fpga_spn/bsp/env/coreplexip-e31-arty/platform.h +++ /dev/null @@ -1,100 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h - -#if __riscv_xlen == 32 -#define MCAUSE_INT 0x80000000UL -#define MCAUSE_CAUSE 0x000003FFUL -#else -#define MCAUSE_INT 0x8000000000000000UL -#define MCAUSE_CAUSE 0x00000000000003FFUL -#endif - -#ifdef VECT_IRQ - #define MTVEC_VECTORED 0x01 -#else - #define MTVEC_VECTORED 0x00 -#endif -#define MTVEC_CLIC 0x02 -#define IRQ_M_LOCAL 16 -#define MIP_MLIP(x) (1 << (IRQ_M_LOCAL + x)) - -#include "sifive/const.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define GPIO_CTRL_ADDR _AC(0x20002000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define PWM0_CTRL_ADDR _AC(0x20005000,UL) -#define RAM_MEM_ADDR _AC(0x80000000,UL) -#define RAM_MEM_SIZE _AC(0x10000,UL) -#define SPI0_CTRL_ADDR _AC(0x20004000,UL) -#define SPI0_MEM_ADDR _AC(0x40000000,UL) -#define SPI0_MEM_SIZE _AC(0x20000000,UL) -#define TESTBENCH_MEM_ADDR _AC(0x20000000,UL) -#define TESTBENCH_MEM_SIZE _AC(0x10000000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define UART0_CTRL_ADDR _AC(0x20000000,UL) - -// IOF masks - -// Interrupt numbers -#define RESERVED_INT_BASE 0 -#define UART0_INT_BASE 1 -#define EXTERNAL_INT_BASE 2 -#define SPI0_INT_BASE 6 -#define GPIO_INT_BASE 7 -#define PWM0_INT_BASE 23 - -// Helper functions -#define _REG64(p, i) (*(volatile uint64_t *)((p) + (i))) -#define _REG32(p, i) (*(volatile uint32_t *)((p) + (i))) -#define _REG16(p, i) (*(volatile uint16_t *)((p) + (i))) -// Bulk set bits in `reg` to either 0 or 1. -// E.g. SET_BITS(MY_REG, 0x00000007, 0) would generate MY_REG &= ~0x7 -// E.g. SET_BITS(MY_REG, 0x00000007, 1) would generate MY_REG |= 0x7 -#define SET_BITS(reg, mask, value) if ((value) == 0) { (reg) &= ~(mask); } else { (reg) |= (mask); } -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG(offset) _REG32(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define CLINT_REG64(offset) _REG64(CLINT_CTRL_ADDR, offset) -#define GPIO_REG64(offset) _REG64(GPIO_CTRL_ADDR, offset) -#define PLIC_REG64(offset) _REG64(PLIC_CTRL_ADDR, offset) -#define PWM0_REG64(offset) _REG64(PWM0_CTRL_ADDR, offset) -#define SPI0_REG64(offset) _REG64(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG64(offset) _REG64(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG64(offset) _REG64(UART0_CTRL_ADDR, offset) - -// Misc - -#define NUM_GPIO 16 - -#define PLIC_NUM_INTERRUPTS 28 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS - -#include "coreplexip-arty.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/fpga_spn/bsp/env/coreplexip-e31-arty/scratchpad.lds b/fpga_spn/bsp/env/coreplexip-e31-arty/scratchpad.lds deleted file mode 100644 index 7887c13..0000000 --- a/fpga_spn/bsp/env/coreplexip-e31-arty/scratchpad.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreplexip-e31-arty/settings.mk b/fpga_spn/bsp/env/coreplexip-e31-arty/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/fpga_spn/bsp/env/coreplexip-e31-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/fpga_spn/bsp/env/coreplexip-e51-arty/dhrystone.lds b/fpga_spn/bsp/env/coreplexip-e51-arty/dhrystone.lds deleted file mode 100644 index 8f6527b..0000000 --- a/fpga_spn/bsp/env/coreplexip-e51-arty/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreplexip-e51-arty/flash.lds b/fpga_spn/bsp/env/coreplexip-e51-arty/flash.lds deleted file mode 100644 index 590c5b6..0000000 --- a/fpga_spn/bsp/env/coreplexip-e51-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreplexip-e51-arty/init.c b/fpga_spn/bsp/env/coreplexip-e51-arty/init.c deleted file mode 100644 index 1f8b679..0000000 --- a/fpga_spn/bsp/env/coreplexip-e51-arty/init.c +++ /dev/null @@ -1,122 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 65000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -#ifndef VECT_IRQ - #define TRAP_ENTRY trap_entry -#else - #define TRAP_ENTRY vtrap_entry -#endif - -extern int main(int argc, char** argv); -extern void TRAP_ENTRY(); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() / 2) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -#ifdef USE_LOCAL_ISR -typedef void (*my_interrupt_function_ptr_t) (void); -extern my_interrupt_function_ptr_t localISR[]; -#endif - -#ifndef VECT_IRQ -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) __attribute__((noinline)); -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif -#ifdef USE_LOCAL_ISR - } else if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} -#endif - -#ifdef USE_CLIC -void trap_entry(void) __attribute__((interrupt("SiFive-CLIC-preemptible"), aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - handle_trap(mcause, mepc); -} -#endif - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -#ifdef USE_CLIC - write_csr(mtvec, ((unsigned long)&trap_entry | MTVEC_CLIC)); -#else - write_csr(mtvec, ((unsigned long)&TRAP_ENTRY | MTVEC_VECTORED)); -#endif - - #endif -} - -void _fini() -{ -} diff --git a/fpga_spn/bsp/env/coreplexip-e51-arty/openocd.cfg b/fpga_spn/bsp/env/coreplexip-e51-arty/openocd.cfg deleted file mode 100644 index 0481a72..0000000 --- a/fpga_spn/bsp/env/coreplexip-e51-arty/openocd.cfg +++ /dev/null @@ -1,31 +0,0 @@ -# JTAG adapter setup -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001 - -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -# Un-comment these two flash lines if you have a SPI flash and want to write -# it. -flash bank spi0 fespi 0x40000000 0 0 0 $_TARGETNAME.0 0x20004000 -init -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off -echo "Ready for Remote Connections" diff --git a/fpga_spn/bsp/env/coreplexip-e51-arty/platform.h b/fpga_spn/bsp/env/coreplexip-e51-arty/platform.h deleted file mode 100644 index 6fa79ea..0000000 --- a/fpga_spn/bsp/env/coreplexip-e51-arty/platform.h +++ /dev/null @@ -1,100 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h - -#if __riscv_xlen == 32 -#define MCAUSE_INT 0x80000000UL -#define MCAUSE_CAUSE 0x000003FFUL -#else -#define MCAUSE_INT 0x8000000000000000UL -#define MCAUSE_CAUSE 0x00000000000003FFUL -#endif - -#ifdef VECT_IRQ - #define MTVEC_VECTORED 0x01 -#else - #define MTVEC_VECTORED 0x00 -#endif -#define MTVEC_CLIC 0x02 -#define IRQ_M_LOCAL 16 -#define MIP_MLIP(x) (1 << (IRQ_M_LOCAL + x)) - -#include "sifive/const.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define GPIO_CTRL_ADDR _AC(0x20002000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define PWM0_CTRL_ADDR _AC(0x20005000,UL) -#define RAM_MEM_ADDR _AC(0x80000000,UL) -#define RAM_MEM_SIZE _AC(0x10000,UL) -#define SPI0_CTRL_ADDR _AC(0x20004000,UL) -#define SPI0_MEM_ADDR _AC(0x40000000,UL) -#define SPI0_MEM_SIZE _AC(0x20000000,UL) -#define TESTBENCH_MEM_ADDR _AC(0x20000000,UL) -#define TESTBENCH_MEM_SIZE _AC(0x10000000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define UART0_CTRL_ADDR _AC(0x20000000,UL) - -// IOF masks - -// Interrupt numbers -#define RESERVED_INT_BASE 0 -#define UART0_INT_BASE 1 -#define EXTERNAL_INT_BASE 2 -#define SPI0_INT_BASE 6 -#define GPIO_INT_BASE 7 -#define PWM0_INT_BASE 23 - -// Helper functions -#define _REG64(p, i) (*(volatile uint64_t *)((p) + (i))) -#define _REG32(p, i) (*(volatile uint32_t *)((p) + (i))) -#define _REG16(p, i) (*(volatile uint16_t *)((p) + (i))) -// Bulk set bits in `reg` to either 0 or 1. -// E.g. SET_BITS(MY_REG, 0x00000007, 0) would generate MY_REG &= ~0x7 -// E.g. SET_BITS(MY_REG, 0x00000007, 1) would generate MY_REG |= 0x7 -#define SET_BITS(reg, mask, value) if ((value) == 0) { (reg) &= ~(mask); } else { (reg) |= (mask); } -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG(offset) _REG32(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define CLINT_REG64(offset) _REG64(CLINT_CTRL_ADDR, offset) -#define GPIO_REG64(offset) _REG64(GPIO_CTRL_ADDR, offset) -#define PLIC_REG64(offset) _REG64(PLIC_CTRL_ADDR, offset) -#define PWM0_REG64(offset) _REG64(PWM0_CTRL_ADDR, offset) -#define SPI0_REG64(offset) _REG64(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG64(offset) _REG64(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG64(offset) _REG64(UART0_CTRL_ADDR, offset) - -// Misc - -#define NUM_GPIO 16 - -#define PLIC_NUM_INTERRUPTS 28 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS - -#include "coreplexip-arty.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/fpga_spn/bsp/env/coreplexip-e51-arty/scratchpad.lds b/fpga_spn/bsp/env/coreplexip-e51-arty/scratchpad.lds deleted file mode 100644 index 7887c13..0000000 --- a/fpga_spn/bsp/env/coreplexip-e51-arty/scratchpad.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/coreplexip-e51-arty/settings.mk b/fpga_spn/bsp/env/coreplexip-e51-arty/settings.mk deleted file mode 100644 index 96aea84..0000000 --- a/fpga_spn/bsp/env/coreplexip-e51-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv64imac -RISCV_ABI := lp64 diff --git a/fpga_spn/bsp/env/encoding.h b/fpga_spn/bsp/env/encoding.h deleted file mode 100644 index 35e0f9f..0000000 --- a/fpga_spn/bsp/env/encoding.h +++ /dev/null @@ -1,1313 +0,0 @@ -// See LICENSE for license details. - -#ifndef RISCV_CSR_ENCODING_H -#define RISCV_CSR_ENCODING_H - -#define MSTATUS_UIE 0x00000001 -#define MSTATUS_SIE 0x00000002 -#define MSTATUS_HIE 0x00000004 -#define MSTATUS_MIE 0x00000008 -#define MSTATUS_UPIE 0x00000010 -#define MSTATUS_SPIE 0x00000020 -#define MSTATUS_HPIE 0x00000040 -#define MSTATUS_MPIE 0x00000080 -#define MSTATUS_SPP 0x00000100 -#define MSTATUS_HPP 0x00000600 -#define MSTATUS_MPP 0x00001800 -#define MSTATUS_FS 0x00006000 -#define MSTATUS_XS 0x00018000 -#define MSTATUS_MPRV 0x00020000 -#define MSTATUS_PUM 0x00040000 -#define MSTATUS_MXR 0x00080000 -#define MSTATUS_VM 0x1F000000 -#define MSTATUS32_SD 0x80000000 -#define MSTATUS64_SD 0x8000000000000000 - -#define SSTATUS_UIE 0x00000001 -#define SSTATUS_SIE 0x00000002 -#define SSTATUS_UPIE 0x00000010 -#define SSTATUS_SPIE 0x00000020 -#define SSTATUS_SPP 0x00000100 -#define SSTATUS_FS 0x00006000 -#define SSTATUS_XS 0x00018000 -#define SSTATUS_PUM 0x00040000 -#define SSTATUS32_SD 0x80000000 -#define SSTATUS64_SD 0x8000000000000000 - -#define DCSR_XDEBUGVER (3U<<30) -#define DCSR_NDRESET (1<<29) -#define DCSR_FULLRESET (1<<28) -#define DCSR_EBREAKM (1<<15) -#define DCSR_EBREAKH (1<<14) -#define DCSR_EBREAKS (1<<13) -#define DCSR_EBREAKU (1<<12) -#define DCSR_STOPCYCLE (1<<10) -#define DCSR_STOPTIME (1<<9) -#define DCSR_CAUSE (7<<6) -#define DCSR_DEBUGINT (1<<5) -#define DCSR_HALT (1<<3) -#define DCSR_STEP (1<<2) -#define DCSR_PRV (3<<0) - -#define DCSR_CAUSE_NONE 0 -#define DCSR_CAUSE_SWBP 1 -#define DCSR_CAUSE_HWBP 2 -#define DCSR_CAUSE_DEBUGINT 3 -#define DCSR_CAUSE_STEP 4 -#define DCSR_CAUSE_HALT 5 - -#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) -#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) -#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) - -#define MCONTROL_SELECT (1<<19) -#define MCONTROL_TIMING (1<<18) -#define MCONTROL_ACTION (0x3f<<12) -#define MCONTROL_CHAIN (1<<11) -#define MCONTROL_MATCH (0xf<<7) -#define MCONTROL_M (1<<6) -#define MCONTROL_H (1<<5) -#define MCONTROL_S (1<<4) -#define MCONTROL_U (1<<3) -#define MCONTROL_EXECUTE (1<<2) -#define MCONTROL_STORE (1<<1) -#define MCONTROL_LOAD (1<<0) - -#define MCONTROL_TYPE_NONE 0 -#define MCONTROL_TYPE_MATCH 2 - -#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 -#define MCONTROL_ACTION_DEBUG_MODE 1 -#define MCONTROL_ACTION_TRACE_START 2 -#define MCONTROL_ACTION_TRACE_STOP 3 -#define MCONTROL_ACTION_TRACE_EMIT 4 - -#define MCONTROL_MATCH_EQUAL 0 -#define MCONTROL_MATCH_NAPOT 1 -#define MCONTROL_MATCH_GE 2 -#define MCONTROL_MATCH_LT 3 -#define MCONTROL_MATCH_MASK_LOW 4 -#define MCONTROL_MATCH_MASK_HIGH 5 - -#define MIP_SSIP (1 << IRQ_S_SOFT) -#define MIP_HSIP (1 << IRQ_H_SOFT) -#define MIP_MSIP (1 << IRQ_M_SOFT) -#define MIP_STIP (1 << IRQ_S_TIMER) -#define MIP_HTIP (1 << IRQ_H_TIMER) -#define MIP_MTIP (1 << IRQ_M_TIMER) -#define MIP_SEIP (1 << IRQ_S_EXT) -#define MIP_HEIP (1 << IRQ_H_EXT) -#define MIP_MEIP (1 << IRQ_M_EXT) - -#define SIP_SSIP MIP_SSIP -#define SIP_STIP MIP_STIP - -#define PRV_U 0 -#define PRV_S 1 -#define PRV_H 2 -#define PRV_M 3 - -#define VM_MBARE 0 -#define VM_MBB 1 -#define VM_MBBID 2 -#define VM_SV32 8 -#define VM_SV39 9 -#define VM_SV48 10 - -#define IRQ_S_SOFT 1 -#define IRQ_H_SOFT 2 -#define IRQ_M_SOFT 3 -#define IRQ_S_TIMER 5 -#define IRQ_H_TIMER 6 -#define IRQ_M_TIMER 7 -#define IRQ_S_EXT 9 -#define IRQ_H_EXT 10 -#define IRQ_M_EXT 11 -#define IRQ_COP 12 -#define IRQ_HOST 13 - -#define DEFAULT_RSTVEC 0x00001000 -#define DEFAULT_NMIVEC 0x00001004 -#define DEFAULT_MTVEC 0x00001010 -#define CONFIG_STRING_ADDR 0x0000100C -#define EXT_IO_BASE 0x40000000 -#define DRAM_BASE 0x80000000 - -// page table entry (PTE) fields -#define PTE_V 0x001 // Valid -#define PTE_R 0x002 // Read -#define PTE_W 0x004 // Write -#define PTE_X 0x008 // Execute -#define PTE_U 0x010 // User -#define PTE_G 0x020 // Global -#define PTE_A 0x040 // Accessed -#define PTE_D 0x080 // Dirty -#define PTE_SOFT 0x300 // Reserved for Software - -#define PTE_PPN_SHIFT 10 - -#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) - -#ifdef __riscv - -#ifdef __riscv64 -# define MSTATUS_SD MSTATUS64_SD -# define SSTATUS_SD SSTATUS64_SD -# define RISCV_PGLEVEL_BITS 9 -#else -# define MSTATUS_SD MSTATUS32_SD -# define SSTATUS_SD SSTATUS32_SD -# define RISCV_PGLEVEL_BITS 10 -#endif -#define RISCV_PGSHIFT 12 -#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) - -#ifndef __ASSEMBLER__ - -#ifdef __GNUC__ - -#define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - -#define write_csr(reg, val) ({ \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrw " #reg ", %0" :: "i"(val)); \ - else \ - asm volatile ("csrw " #reg ", %0" :: "r"(val)); }) - -#define swap_csr(reg, val) ({ unsigned long __tmp; \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \ - else \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \ - __tmp; }) - -#define set_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ - __tmp; }) - -#define clear_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ - __tmp; }) - -#define rdtime() read_csr(time) -#define rdcycle() read_csr(cycle) -#define rdinstret() read_csr(instret) - -#endif - -#endif - -#endif - -#endif -/* Automatically generated by parse-opcodes */ -#ifndef RISCV_ENCODING_H -#define RISCV_ENCODING_H -#define MATCH_BEQ 0x63 -#define MASK_BEQ 0x707f -#define MATCH_BNE 0x1063 -#define MASK_BNE 0x707f -#define MATCH_BLT 0x4063 -#define MASK_BLT 0x707f -#define MATCH_BGE 0x5063 -#define MASK_BGE 0x707f -#define MATCH_BLTU 0x6063 -#define MASK_BLTU 0x707f -#define MATCH_BGEU 0x7063 -#define MASK_BGEU 0x707f -#define MATCH_JALR 0x67 -#define MASK_JALR 0x707f -#define MATCH_JAL 0x6f -#define MASK_JAL 0x7f -#define MATCH_LUI 0x37 -#define MASK_LUI 0x7f -#define MATCH_AUIPC 0x17 -#define MASK_AUIPC 0x7f -#define MATCH_ADDI 0x13 -#define MASK_ADDI 0x707f -#define MATCH_SLLI 0x1013 -#define MASK_SLLI 0xfc00707f -#define MATCH_SLTI 0x2013 -#define MASK_SLTI 0x707f -#define MATCH_SLTIU 0x3013 -#define MASK_SLTIU 0x707f -#define MATCH_XORI 0x4013 -#define MASK_XORI 0x707f -#define MATCH_SRLI 0x5013 -#define MASK_SRLI 0xfc00707f -#define MATCH_SRAI 0x40005013 -#define MASK_SRAI 0xfc00707f -#define MATCH_ORI 0x6013 -#define MASK_ORI 0x707f -#define MATCH_ANDI 0x7013 -#define MASK_ANDI 0x707f -#define MATCH_ADD 0x33 -#define MASK_ADD 0xfe00707f -#define MATCH_SUB 0x40000033 -#define MASK_SUB 0xfe00707f -#define MATCH_SLL 0x1033 -#define MASK_SLL 0xfe00707f -#define MATCH_SLT 0x2033 -#define MASK_SLT 0xfe00707f -#define MATCH_SLTU 0x3033 -#define MASK_SLTU 0xfe00707f -#define MATCH_XOR 0x4033 -#define MASK_XOR 0xfe00707f -#define MATCH_SRL 0x5033 -#define MASK_SRL 0xfe00707f -#define MATCH_SRA 0x40005033 -#define MASK_SRA 0xfe00707f -#define MATCH_OR 0x6033 -#define MASK_OR 0xfe00707f -#define MATCH_AND 0x7033 -#define MASK_AND 0xfe00707f -#define MATCH_ADDIW 0x1b -#define MASK_ADDIW 0x707f -#define MATCH_SLLIW 0x101b -#define MASK_SLLIW 0xfe00707f -#define MATCH_SRLIW 0x501b -#define MASK_SRLIW 0xfe00707f -#define MATCH_SRAIW 0x4000501b -#define MASK_SRAIW 0xfe00707f -#define MATCH_ADDW 0x3b -#define MASK_ADDW 0xfe00707f -#define MATCH_SUBW 0x4000003b -#define MASK_SUBW 0xfe00707f -#define MATCH_SLLW 0x103b -#define MASK_SLLW 0xfe00707f -#define MATCH_SRLW 0x503b -#define MASK_SRLW 0xfe00707f -#define MATCH_SRAW 0x4000503b -#define MASK_SRAW 0xfe00707f -#define MATCH_LB 0x3 -#define MASK_LB 0x707f -#define MATCH_LH 0x1003 -#define MASK_LH 0x707f -#define MATCH_LW 0x2003 -#define MASK_LW 0x707f -#define MATCH_LD 0x3003 -#define MASK_LD 0x707f -#define MATCH_LBU 0x4003 -#define MASK_LBU 0x707f -#define MATCH_LHU 0x5003 -#define MASK_LHU 0x707f -#define MATCH_LWU 0x6003 -#define MASK_LWU 0x707f -#define MATCH_SB 0x23 -#define MASK_SB 0x707f -#define MATCH_SH 0x1023 -#define MASK_SH 0x707f -#define MATCH_SW 0x2023 -#define MASK_SW 0x707f -#define MATCH_SD 0x3023 -#define MASK_SD 0x707f -#define MATCH_FENCE 0xf -#define MASK_FENCE 0x707f -#define MATCH_FENCE_I 0x100f -#define MASK_FENCE_I 0x707f -#define MATCH_MUL 0x2000033 -#define MASK_MUL 0xfe00707f -#define MATCH_MULH 0x2001033 -#define MASK_MULH 0xfe00707f -#define MATCH_MULHSU 0x2002033 -#define MASK_MULHSU 0xfe00707f -#define MATCH_MULHU 0x2003033 -#define MASK_MULHU 0xfe00707f -#define MATCH_DIV 0x2004033 -#define MASK_DIV 0xfe00707f -#define MATCH_DIVU 0x2005033 -#define MASK_DIVU 0xfe00707f -#define MATCH_REM 0x2006033 -#define MASK_REM 0xfe00707f -#define MATCH_REMU 0x2007033 -#define MASK_REMU 0xfe00707f -#define MATCH_MULW 0x200003b -#define MASK_MULW 0xfe00707f -#define MATCH_DIVW 0x200403b -#define MASK_DIVW 0xfe00707f -#define MATCH_DIVUW 0x200503b -#define MASK_DIVUW 0xfe00707f -#define MATCH_REMW 0x200603b -#define MASK_REMW 0xfe00707f -#define MATCH_REMUW 0x200703b -#define MASK_REMUW 0xfe00707f -#define MATCH_AMOADD_W 0x202f -#define MASK_AMOADD_W 0xf800707f -#define MATCH_AMOXOR_W 0x2000202f -#define MASK_AMOXOR_W 0xf800707f -#define MATCH_AMOOR_W 0x4000202f -#define MASK_AMOOR_W 0xf800707f -#define MATCH_AMOAND_W 0x6000202f -#define MASK_AMOAND_W 0xf800707f -#define MATCH_AMOMIN_W 0x8000202f -#define MASK_AMOMIN_W 0xf800707f -#define MATCH_AMOMAX_W 0xa000202f -#define MASK_AMOMAX_W 0xf800707f -#define MATCH_AMOMINU_W 0xc000202f -#define MASK_AMOMINU_W 0xf800707f -#define MATCH_AMOMAXU_W 0xe000202f -#define MASK_AMOMAXU_W 0xf800707f -#define MATCH_AMOSWAP_W 0x800202f -#define MASK_AMOSWAP_W 0xf800707f -#define MATCH_LR_W 0x1000202f -#define MASK_LR_W 0xf9f0707f -#define MATCH_SC_W 0x1800202f -#define MASK_SC_W 0xf800707f -#define MATCH_AMOADD_D 0x302f -#define MASK_AMOADD_D 0xf800707f -#define MATCH_AMOXOR_D 0x2000302f -#define MASK_AMOXOR_D 0xf800707f -#define MATCH_AMOOR_D 0x4000302f -#define MASK_AMOOR_D 0xf800707f -#define MATCH_AMOAND_D 0x6000302f -#define MASK_AMOAND_D 0xf800707f -#define MATCH_AMOMIN_D 0x8000302f -#define MASK_AMOMIN_D 0xf800707f -#define MATCH_AMOMAX_D 0xa000302f -#define MASK_AMOMAX_D 0xf800707f -#define MATCH_AMOMINU_D 0xc000302f -#define MASK_AMOMINU_D 0xf800707f -#define MATCH_AMOMAXU_D 0xe000302f -#define MASK_AMOMAXU_D 0xf800707f -#define MATCH_AMOSWAP_D 0x800302f -#define MASK_AMOSWAP_D 0xf800707f -#define MATCH_LR_D 0x1000302f -#define MASK_LR_D 0xf9f0707f -#define MATCH_SC_D 0x1800302f -#define MASK_SC_D 0xf800707f -#define MATCH_ECALL 0x73 -#define MASK_ECALL 0xffffffff -#define MATCH_EBREAK 0x100073 -#define MASK_EBREAK 0xffffffff -#define MATCH_URET 0x200073 -#define MASK_URET 0xffffffff -#define MATCH_SRET 0x10200073 -#define MASK_SRET 0xffffffff -#define MATCH_HRET 0x20200073 -#define MASK_HRET 0xffffffff -#define MATCH_MRET 0x30200073 -#define MASK_MRET 0xffffffff -#define MATCH_DRET 0x7b200073 -#define MASK_DRET 0xffffffff -#define MATCH_SFENCE_VM 0x10400073 -#define MASK_SFENCE_VM 0xfff07fff -#define MATCH_WFI 0x10500073 -#define MASK_WFI 0xffffffff -#define MATCH_CSRRW 0x1073 -#define MASK_CSRRW 0x707f -#define MATCH_CSRRS 0x2073 -#define MASK_CSRRS 0x707f -#define MATCH_CSRRC 0x3073 -#define MASK_CSRRC 0x707f -#define MATCH_CSRRWI 0x5073 -#define MASK_CSRRWI 0x707f -#define MATCH_CSRRSI 0x6073 -#define MASK_CSRRSI 0x707f -#define MATCH_CSRRCI 0x7073 -#define MASK_CSRRCI 0x707f -#define MATCH_FADD_S 0x53 -#define MASK_FADD_S 0xfe00007f -#define MATCH_FSUB_S 0x8000053 -#define MASK_FSUB_S 0xfe00007f -#define MATCH_FMUL_S 0x10000053 -#define MASK_FMUL_S 0xfe00007f -#define MATCH_FDIV_S 0x18000053 -#define MASK_FDIV_S 0xfe00007f -#define MATCH_FSGNJ_S 0x20000053 -#define MASK_FSGNJ_S 0xfe00707f -#define MATCH_FSGNJN_S 0x20001053 -#define MASK_FSGNJN_S 0xfe00707f -#define MATCH_FSGNJX_S 0x20002053 -#define MASK_FSGNJX_S 0xfe00707f -#define MATCH_FMIN_S 0x28000053 -#define MASK_FMIN_S 0xfe00707f -#define MATCH_FMAX_S 0x28001053 -#define MASK_FMAX_S 0xfe00707f -#define MATCH_FSQRT_S 0x58000053 -#define MASK_FSQRT_S 0xfff0007f -#define MATCH_FADD_D 0x2000053 -#define MASK_FADD_D 0xfe00007f -#define MATCH_FSUB_D 0xa000053 -#define MASK_FSUB_D 0xfe00007f -#define MATCH_FMUL_D 0x12000053 -#define MASK_FMUL_D 0xfe00007f -#define MATCH_FDIV_D 0x1a000053 -#define MASK_FDIV_D 0xfe00007f -#define MATCH_FSGNJ_D 0x22000053 -#define MASK_FSGNJ_D 0xfe00707f -#define MATCH_FSGNJN_D 0x22001053 -#define MASK_FSGNJN_D 0xfe00707f -#define MATCH_FSGNJX_D 0x22002053 -#define MASK_FSGNJX_D 0xfe00707f -#define MATCH_FMIN_D 0x2a000053 -#define MASK_FMIN_D 0xfe00707f -#define MATCH_FMAX_D 0x2a001053 -#define MASK_FMAX_D 0xfe00707f -#define MATCH_FCVT_S_D 0x40100053 -#define MASK_FCVT_S_D 0xfff0007f -#define MATCH_FCVT_D_S 0x42000053 -#define MASK_FCVT_D_S 0xfff0007f -#define MATCH_FSQRT_D 0x5a000053 -#define MASK_FSQRT_D 0xfff0007f -#define MATCH_FLE_S 0xa0000053 -#define MASK_FLE_S 0xfe00707f -#define MATCH_FLT_S 0xa0001053 -#define MASK_FLT_S 0xfe00707f -#define MATCH_FEQ_S 0xa0002053 -#define MASK_FEQ_S 0xfe00707f -#define MATCH_FLE_D 0xa2000053 -#define MASK_FLE_D 0xfe00707f -#define MATCH_FLT_D 0xa2001053 -#define MASK_FLT_D 0xfe00707f -#define MATCH_FEQ_D 0xa2002053 -#define MASK_FEQ_D 0xfe00707f -#define MATCH_FCVT_W_S 0xc0000053 -#define MASK_FCVT_W_S 0xfff0007f -#define MATCH_FCVT_WU_S 0xc0100053 -#define MASK_FCVT_WU_S 0xfff0007f -#define MATCH_FCVT_L_S 0xc0200053 -#define MASK_FCVT_L_S 0xfff0007f -#define MATCH_FCVT_LU_S 0xc0300053 -#define MASK_FCVT_LU_S 0xfff0007f -#define MATCH_FMV_X_S 0xe0000053 -#define MASK_FMV_X_S 0xfff0707f -#define MATCH_FCLASS_S 0xe0001053 -#define MASK_FCLASS_S 0xfff0707f -#define MATCH_FCVT_W_D 0xc2000053 -#define MASK_FCVT_W_D 0xfff0007f -#define MATCH_FCVT_WU_D 0xc2100053 -#define MASK_FCVT_WU_D 0xfff0007f -#define MATCH_FCVT_L_D 0xc2200053 -#define MASK_FCVT_L_D 0xfff0007f -#define MATCH_FCVT_LU_D 0xc2300053 -#define MASK_FCVT_LU_D 0xfff0007f -#define MATCH_FMV_X_D 0xe2000053 -#define MASK_FMV_X_D 0xfff0707f -#define MATCH_FCLASS_D 0xe2001053 -#define MASK_FCLASS_D 0xfff0707f -#define MATCH_FCVT_S_W 0xd0000053 -#define MASK_FCVT_S_W 0xfff0007f -#define MATCH_FCVT_S_WU 0xd0100053 -#define MASK_FCVT_S_WU 0xfff0007f -#define MATCH_FCVT_S_L 0xd0200053 -#define MASK_FCVT_S_L 0xfff0007f -#define MATCH_FCVT_S_LU 0xd0300053 -#define MASK_FCVT_S_LU 0xfff0007f -#define MATCH_FMV_S_X 0xf0000053 -#define MASK_FMV_S_X 0xfff0707f -#define MATCH_FCVT_D_W 0xd2000053 -#define MASK_FCVT_D_W 0xfff0007f -#define MATCH_FCVT_D_WU 0xd2100053 -#define MASK_FCVT_D_WU 0xfff0007f -#define MATCH_FCVT_D_L 0xd2200053 -#define MASK_FCVT_D_L 0xfff0007f -#define MATCH_FCVT_D_LU 0xd2300053 -#define MASK_FCVT_D_LU 0xfff0007f -#define MATCH_FMV_D_X 0xf2000053 -#define MASK_FMV_D_X 0xfff0707f -#define MATCH_FLW 0x2007 -#define MASK_FLW 0x707f -#define MATCH_FLD 0x3007 -#define MASK_FLD 0x707f -#define MATCH_FSW 0x2027 -#define MASK_FSW 0x707f -#define MATCH_FSD 0x3027 -#define MASK_FSD 0x707f -#define MATCH_FMADD_S 0x43 -#define MASK_FMADD_S 0x600007f -#define MATCH_FMSUB_S 0x47 -#define MASK_FMSUB_S 0x600007f -#define MATCH_FNMSUB_S 0x4b -#define MASK_FNMSUB_S 0x600007f -#define MATCH_FNMADD_S 0x4f -#define MASK_FNMADD_S 0x600007f -#define MATCH_FMADD_D 0x2000043 -#define MASK_FMADD_D 0x600007f -#define MATCH_FMSUB_D 0x2000047 -#define MASK_FMSUB_D 0x600007f -#define MATCH_FNMSUB_D 0x200004b -#define MASK_FNMSUB_D 0x600007f -#define MATCH_FNMADD_D 0x200004f -#define MASK_FNMADD_D 0x600007f -#define MATCH_C_NOP 0x1 -#define MASK_C_NOP 0xffff -#define MATCH_C_ADDI16SP 0x6101 -#define MASK_C_ADDI16SP 0xef83 -#define MATCH_C_JR 0x8002 -#define MASK_C_JR 0xf07f -#define MATCH_C_JALR 0x9002 -#define MASK_C_JALR 0xf07f -#define MATCH_C_EBREAK 0x9002 -#define MASK_C_EBREAK 0xffff -#define MATCH_C_LD 0x6000 -#define MASK_C_LD 0xe003 -#define MATCH_C_SD 0xe000 -#define MASK_C_SD 0xe003 -#define MATCH_C_ADDIW 0x2001 -#define MASK_C_ADDIW 0xe003 -#define MATCH_C_LDSP 0x6002 -#define MASK_C_LDSP 0xe003 -#define MATCH_C_SDSP 0xe002 -#define MASK_C_SDSP 0xe003 -#define MATCH_C_ADDI4SPN 0x0 -#define MASK_C_ADDI4SPN 0xe003 -#define MATCH_C_FLD 0x2000 -#define MASK_C_FLD 0xe003 -#define MATCH_C_LW 0x4000 -#define MASK_C_LW 0xe003 -#define MATCH_C_FLW 0x6000 -#define MASK_C_FLW 0xe003 -#define MATCH_C_FSD 0xa000 -#define MASK_C_FSD 0xe003 -#define MATCH_C_SW 0xc000 -#define MASK_C_SW 0xe003 -#define MATCH_C_FSW 0xe000 -#define MASK_C_FSW 0xe003 -#define MATCH_C_ADDI 0x1 -#define MASK_C_ADDI 0xe003 -#define MATCH_C_JAL 0x2001 -#define MASK_C_JAL 0xe003 -#define MATCH_C_LI 0x4001 -#define MASK_C_LI 0xe003 -#define MATCH_C_LUI 0x6001 -#define MASK_C_LUI 0xe003 -#define MATCH_C_SRLI 0x8001 -#define MASK_C_SRLI 0xec03 -#define MATCH_C_SRAI 0x8401 -#define MASK_C_SRAI 0xec03 -#define MATCH_C_ANDI 0x8801 -#define MASK_C_ANDI 0xec03 -#define MATCH_C_SUB 0x8c01 -#define MASK_C_SUB 0xfc63 -#define MATCH_C_XOR 0x8c21 -#define MASK_C_XOR 0xfc63 -#define MATCH_C_OR 0x8c41 -#define MASK_C_OR 0xfc63 -#define MATCH_C_AND 0x8c61 -#define MASK_C_AND 0xfc63 -#define MATCH_C_SUBW 0x9c01 -#define MASK_C_SUBW 0xfc63 -#define MATCH_C_ADDW 0x9c21 -#define MASK_C_ADDW 0xfc63 -#define MATCH_C_J 0xa001 -#define MASK_C_J 0xe003 -#define MATCH_C_BEQZ 0xc001 -#define MASK_C_BEQZ 0xe003 -#define MATCH_C_BNEZ 0xe001 -#define MASK_C_BNEZ 0xe003 -#define MATCH_C_SLLI 0x2 -#define MASK_C_SLLI 0xe003 -#define MATCH_C_FLDSP 0x2002 -#define MASK_C_FLDSP 0xe003 -#define MATCH_C_LWSP 0x4002 -#define MASK_C_LWSP 0xe003 -#define MATCH_C_FLWSP 0x6002 -#define MASK_C_FLWSP 0xe003 -#define MATCH_C_MV 0x8002 -#define MASK_C_MV 0xf003 -#define MATCH_C_ADD 0x9002 -#define MASK_C_ADD 0xf003 -#define MATCH_C_FSDSP 0xa002 -#define MASK_C_FSDSP 0xe003 -#define MATCH_C_SWSP 0xc002 -#define MASK_C_SWSP 0xe003 -#define MATCH_C_FSWSP 0xe002 -#define MASK_C_FSWSP 0xe003 -#define MATCH_CUSTOM0 0xb -#define MASK_CUSTOM0 0x707f -#define MATCH_CUSTOM0_RS1 0x200b -#define MASK_CUSTOM0_RS1 0x707f -#define MATCH_CUSTOM0_RS1_RS2 0x300b -#define MASK_CUSTOM0_RS1_RS2 0x707f -#define MATCH_CUSTOM0_RD 0x400b -#define MASK_CUSTOM0_RD 0x707f -#define MATCH_CUSTOM0_RD_RS1 0x600b -#define MASK_CUSTOM0_RD_RS1 0x707f -#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b -#define MASK_CUSTOM0_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM1 0x2b -#define MASK_CUSTOM1 0x707f -#define MATCH_CUSTOM1_RS1 0x202b -#define MASK_CUSTOM1_RS1 0x707f -#define MATCH_CUSTOM1_RS1_RS2 0x302b -#define MASK_CUSTOM1_RS1_RS2 0x707f -#define MATCH_CUSTOM1_RD 0x402b -#define MASK_CUSTOM1_RD 0x707f -#define MATCH_CUSTOM1_RD_RS1 0x602b -#define MASK_CUSTOM1_RD_RS1 0x707f -#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b -#define MASK_CUSTOM1_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM2 0x5b -#define MASK_CUSTOM2 0x707f -#define MATCH_CUSTOM2_RS1 0x205b -#define MASK_CUSTOM2_RS1 0x707f -#define MATCH_CUSTOM2_RS1_RS2 0x305b -#define MASK_CUSTOM2_RS1_RS2 0x707f -#define MATCH_CUSTOM2_RD 0x405b -#define MASK_CUSTOM2_RD 0x707f -#define MATCH_CUSTOM2_RD_RS1 0x605b -#define MASK_CUSTOM2_RD_RS1 0x707f -#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b -#define MASK_CUSTOM2_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM3 0x7b -#define MASK_CUSTOM3 0x707f -#define MATCH_CUSTOM3_RS1 0x207b -#define MASK_CUSTOM3_RS1 0x707f -#define MATCH_CUSTOM3_RS1_RS2 0x307b -#define MASK_CUSTOM3_RS1_RS2 0x707f -#define MATCH_CUSTOM3_RD 0x407b -#define MASK_CUSTOM3_RD 0x707f -#define MATCH_CUSTOM3_RD_RS1 0x607b -#define MASK_CUSTOM3_RD_RS1 0x707f -#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b -#define MASK_CUSTOM3_RD_RS1_RS2 0x707f -#define CSR_FFLAGS 0x1 -#define CSR_FRM 0x2 -#define CSR_FCSR 0x3 -#define CSR_CYCLE 0xc00 -#define CSR_TIME 0xc01 -#define CSR_INSTRET 0xc02 -#define CSR_HPMCOUNTER3 0xc03 -#define CSR_HPMCOUNTER4 0xc04 -#define CSR_HPMCOUNTER5 0xc05 -#define CSR_HPMCOUNTER6 0xc06 -#define CSR_HPMCOUNTER7 0xc07 -#define CSR_HPMCOUNTER8 0xc08 -#define CSR_HPMCOUNTER9 0xc09 -#define CSR_HPMCOUNTER10 0xc0a -#define CSR_HPMCOUNTER11 0xc0b -#define CSR_HPMCOUNTER12 0xc0c -#define CSR_HPMCOUNTER13 0xc0d -#define CSR_HPMCOUNTER14 0xc0e -#define CSR_HPMCOUNTER15 0xc0f -#define CSR_HPMCOUNTER16 0xc10 -#define CSR_HPMCOUNTER17 0xc11 -#define CSR_HPMCOUNTER18 0xc12 -#define CSR_HPMCOUNTER19 0xc13 -#define CSR_HPMCOUNTER20 0xc14 -#define CSR_HPMCOUNTER21 0xc15 -#define CSR_HPMCOUNTER22 0xc16 -#define CSR_HPMCOUNTER23 0xc17 -#define CSR_HPMCOUNTER24 0xc18 -#define CSR_HPMCOUNTER25 0xc19 -#define CSR_HPMCOUNTER26 0xc1a -#define CSR_HPMCOUNTER27 0xc1b -#define CSR_HPMCOUNTER28 0xc1c -#define CSR_HPMCOUNTER29 0xc1d -#define CSR_HPMCOUNTER30 0xc1e -#define CSR_HPMCOUNTER31 0xc1f -#define CSR_SSTATUS 0x100 -#define CSR_SIE 0x104 -#define CSR_STVEC 0x105 -#define CSR_SSCRATCH 0x140 -#define CSR_SEPC 0x141 -#define CSR_SCAUSE 0x142 -#define CSR_SBADADDR 0x143 -#define CSR_SIP 0x144 -#define CSR_SPTBR 0x180 -#define CSR_MSTATUS 0x300 -#define CSR_MISA 0x301 -#define CSR_MEDELEG 0x302 -#define CSR_MIDELEG 0x303 -#define CSR_MIE 0x304 -#define CSR_MTVEC 0x305 -#define CSR_MSCRATCH 0x340 -#define CSR_MEPC 0x341 -#define CSR_MCAUSE 0x342 -#define CSR_MBADADDR 0x343 -#define CSR_MIP 0x344 -#define CSR_TSELECT 0x7a0 -#define CSR_TDATA1 0x7a1 -#define CSR_TDATA2 0x7a2 -#define CSR_TDATA3 0x7a3 -#define CSR_DCSR 0x7b0 -#define CSR_DPC 0x7b1 -#define CSR_DSCRATCH 0x7b2 -#define CSR_MCYCLE 0xb00 -#define CSR_MINSTRET 0xb02 -#define CSR_MHPMCOUNTER3 0xb03 -#define CSR_MHPMCOUNTER4 0xb04 -#define CSR_MHPMCOUNTER5 0xb05 -#define CSR_MHPMCOUNTER6 0xb06 -#define CSR_MHPMCOUNTER7 0xb07 -#define CSR_MHPMCOUNTER8 0xb08 -#define CSR_MHPMCOUNTER9 0xb09 -#define CSR_MHPMCOUNTER10 0xb0a -#define CSR_MHPMCOUNTER11 0xb0b -#define CSR_MHPMCOUNTER12 0xb0c -#define CSR_MHPMCOUNTER13 0xb0d -#define CSR_MHPMCOUNTER14 0xb0e -#define CSR_MHPMCOUNTER15 0xb0f -#define CSR_MHPMCOUNTER16 0xb10 -#define CSR_MHPMCOUNTER17 0xb11 -#define CSR_MHPMCOUNTER18 0xb12 -#define CSR_MHPMCOUNTER19 0xb13 -#define CSR_MHPMCOUNTER20 0xb14 -#define CSR_MHPMCOUNTER21 0xb15 -#define CSR_MHPMCOUNTER22 0xb16 -#define CSR_MHPMCOUNTER23 0xb17 -#define CSR_MHPMCOUNTER24 0xb18 -#define CSR_MHPMCOUNTER25 0xb19 -#define CSR_MHPMCOUNTER26 0xb1a -#define CSR_MHPMCOUNTER27 0xb1b -#define CSR_MHPMCOUNTER28 0xb1c -#define CSR_MHPMCOUNTER29 0xb1d -#define CSR_MHPMCOUNTER30 0xb1e -#define CSR_MHPMCOUNTER31 0xb1f -#define CSR_MUCOUNTEREN 0x320 -#define CSR_MSCOUNTEREN 0x321 -#define CSR_MHPMEVENT3 0x323 -#define CSR_MHPMEVENT4 0x324 -#define CSR_MHPMEVENT5 0x325 -#define CSR_MHPMEVENT6 0x326 -#define CSR_MHPMEVENT7 0x327 -#define CSR_MHPMEVENT8 0x328 -#define CSR_MHPMEVENT9 0x329 -#define CSR_MHPMEVENT10 0x32a -#define CSR_MHPMEVENT11 0x32b -#define CSR_MHPMEVENT12 0x32c -#define CSR_MHPMEVENT13 0x32d -#define CSR_MHPMEVENT14 0x32e -#define CSR_MHPMEVENT15 0x32f -#define CSR_MHPMEVENT16 0x330 -#define CSR_MHPMEVENT17 0x331 -#define CSR_MHPMEVENT18 0x332 -#define CSR_MHPMEVENT19 0x333 -#define CSR_MHPMEVENT20 0x334 -#define CSR_MHPMEVENT21 0x335 -#define CSR_MHPMEVENT22 0x336 -#define CSR_MHPMEVENT23 0x337 -#define CSR_MHPMEVENT24 0x338 -#define CSR_MHPMEVENT25 0x339 -#define CSR_MHPMEVENT26 0x33a -#define CSR_MHPMEVENT27 0x33b -#define CSR_MHPMEVENT28 0x33c -#define CSR_MHPMEVENT29 0x33d -#define CSR_MHPMEVENT30 0x33e -#define CSR_MHPMEVENT31 0x33f -#define CSR_MVENDORID 0xf11 -#define CSR_MARCHID 0xf12 -#define CSR_MIMPID 0xf13 -#define CSR_MHARTID 0xf14 -#define CSR_CYCLEH 0xc80 -#define CSR_TIMEH 0xc81 -#define CSR_INSTRETH 0xc82 -#define CSR_HPMCOUNTER3H 0xc83 -#define CSR_HPMCOUNTER4H 0xc84 -#define CSR_HPMCOUNTER5H 0xc85 -#define CSR_HPMCOUNTER6H 0xc86 -#define CSR_HPMCOUNTER7H 0xc87 -#define CSR_HPMCOUNTER8H 0xc88 -#define CSR_HPMCOUNTER9H 0xc89 -#define CSR_HPMCOUNTER10H 0xc8a -#define CSR_HPMCOUNTER11H 0xc8b -#define CSR_HPMCOUNTER12H 0xc8c -#define CSR_HPMCOUNTER13H 0xc8d -#define CSR_HPMCOUNTER14H 0xc8e -#define CSR_HPMCOUNTER15H 0xc8f -#define CSR_HPMCOUNTER16H 0xc90 -#define CSR_HPMCOUNTER17H 0xc91 -#define CSR_HPMCOUNTER18H 0xc92 -#define CSR_HPMCOUNTER19H 0xc93 -#define CSR_HPMCOUNTER20H 0xc94 -#define CSR_HPMCOUNTER21H 0xc95 -#define CSR_HPMCOUNTER22H 0xc96 -#define CSR_HPMCOUNTER23H 0xc97 -#define CSR_HPMCOUNTER24H 0xc98 -#define CSR_HPMCOUNTER25H 0xc99 -#define CSR_HPMCOUNTER26H 0xc9a -#define CSR_HPMCOUNTER27H 0xc9b -#define CSR_HPMCOUNTER28H 0xc9c -#define CSR_HPMCOUNTER29H 0xc9d -#define CSR_HPMCOUNTER30H 0xc9e -#define CSR_HPMCOUNTER31H 0xc9f -#define CSR_MCYCLEH 0xb80 -#define CSR_MINSTRETH 0xb82 -#define CSR_MHPMCOUNTER3H 0xb83 -#define CSR_MHPMCOUNTER4H 0xb84 -#define CSR_MHPMCOUNTER5H 0xb85 -#define CSR_MHPMCOUNTER6H 0xb86 -#define CSR_MHPMCOUNTER7H 0xb87 -#define CSR_MHPMCOUNTER8H 0xb88 -#define CSR_MHPMCOUNTER9H 0xb89 -#define CSR_MHPMCOUNTER10H 0xb8a -#define CSR_MHPMCOUNTER11H 0xb8b -#define CSR_MHPMCOUNTER12H 0xb8c -#define CSR_MHPMCOUNTER13H 0xb8d -#define CSR_MHPMCOUNTER14H 0xb8e -#define CSR_MHPMCOUNTER15H 0xb8f -#define CSR_MHPMCOUNTER16H 0xb90 -#define CSR_MHPMCOUNTER17H 0xb91 -#define CSR_MHPMCOUNTER18H 0xb92 -#define CSR_MHPMCOUNTER19H 0xb93 -#define CSR_MHPMCOUNTER20H 0xb94 -#define CSR_MHPMCOUNTER21H 0xb95 -#define CSR_MHPMCOUNTER22H 0xb96 -#define CSR_MHPMCOUNTER23H 0xb97 -#define CSR_MHPMCOUNTER24H 0xb98 -#define CSR_MHPMCOUNTER25H 0xb99 -#define CSR_MHPMCOUNTER26H 0xb9a -#define CSR_MHPMCOUNTER27H 0xb9b -#define CSR_MHPMCOUNTER28H 0xb9c -#define CSR_MHPMCOUNTER29H 0xb9d -#define CSR_MHPMCOUNTER30H 0xb9e -#define CSR_MHPMCOUNTER31H 0xb9f -#define CAUSE_MISALIGNED_FETCH 0x0 -#define CAUSE_FAULT_FETCH 0x1 -#define CAUSE_ILLEGAL_INSTRUCTION 0x2 -#define CAUSE_BREAKPOINT 0x3 -#define CAUSE_MISALIGNED_LOAD 0x4 -#define CAUSE_FAULT_LOAD 0x5 -#define CAUSE_MISALIGNED_STORE 0x6 -#define CAUSE_FAULT_STORE 0x7 -#define CAUSE_USER_ECALL 0x8 -#define CAUSE_SUPERVISOR_ECALL 0x9 -#define CAUSE_HYPERVISOR_ECALL 0xa -#define CAUSE_MACHINE_ECALL 0xb -#endif -#ifdef DECLARE_INSN -DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) -DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) -DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) -DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) -DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) -DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) -DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) -DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) -DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) -DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) -DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) -DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) -DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) -DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) -DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) -DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) -DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) -DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) -DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) -DECLARE_INSN(add, MATCH_ADD, MASK_ADD) -DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) -DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) -DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) -DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) -DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) -DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) -DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) -DECLARE_INSN(or, MATCH_OR, MASK_OR) -DECLARE_INSN(and, MATCH_AND, MASK_AND) -DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) -DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) -DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) -DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) -DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) -DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) -DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) -DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) -DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) -DECLARE_INSN(lb, MATCH_LB, MASK_LB) -DECLARE_INSN(lh, MATCH_LH, MASK_LH) -DECLARE_INSN(lw, MATCH_LW, MASK_LW) -DECLARE_INSN(ld, MATCH_LD, MASK_LD) -DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) -DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) -DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) -DECLARE_INSN(sb, MATCH_SB, MASK_SB) -DECLARE_INSN(sh, MATCH_SH, MASK_SH) -DECLARE_INSN(sw, MATCH_SW, MASK_SW) -DECLARE_INSN(sd, MATCH_SD, MASK_SD) -DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) -DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) -DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) -DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) -DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) -DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) -DECLARE_INSN(div, MATCH_DIV, MASK_DIV) -DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) -DECLARE_INSN(rem, MATCH_REM, MASK_REM) -DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) -DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) -DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) -DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) -DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) -DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) -DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) -DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) -DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) -DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) -DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) -DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) -DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) -DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) -DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) -DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) -DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) -DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) -DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) -DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) -DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) -DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) -DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) -DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) -DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) -DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) -DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) -DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) -DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) -DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) -DECLARE_INSN(uret, MATCH_URET, MASK_URET) -DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) -DECLARE_INSN(hret, MATCH_HRET, MASK_HRET) -DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) -DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) -DECLARE_INSN(sfence_vm, MATCH_SFENCE_VM, MASK_SFENCE_VM) -DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) -DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) -DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) -DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) -DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) -DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) -DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) -DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) -DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) -DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) -DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) -DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) -DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) -DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) -DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) -DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) -DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) -DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) -DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) -DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) -DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) -DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) -DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) -DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) -DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) -DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) -DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) -DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) -DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) -DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) -DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) -DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) -DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) -DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) -DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) -DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) -DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) -DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) -DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) -DECLARE_INSN(fmv_x_s, MATCH_FMV_X_S, MASK_FMV_X_S) -DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) -DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) -DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) -DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) -DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) -DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) -DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) -DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) -DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) -DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) -DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) -DECLARE_INSN(fmv_s_x, MATCH_FMV_S_X, MASK_FMV_S_X) -DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) -DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) -DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) -DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) -DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) -DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) -DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) -DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) -DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) -DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) -DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) -DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) -DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) -DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) -DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) -DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) -DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) -DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) -DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) -DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) -DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) -DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) -DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) -DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) -DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) -DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) -DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) -DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) -DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) -DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) -DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) -DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) -DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) -DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) -DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) -DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) -DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) -DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) -DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) -DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) -DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) -DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) -DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) -DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) -DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) -DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) -DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) -DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) -DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) -DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) -DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) -DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) -DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) -DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) -DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) -DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) -DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) -DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) -DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) -DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) -DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) -DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) -DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) -DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) -DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) -DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) -DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) -DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) -DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) -DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) -DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) -DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) -DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) -DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) -DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) -DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) -DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) -DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) -DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) -DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) -DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) -DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) -DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) -#endif -#ifdef DECLARE_CSR -DECLARE_CSR(fflags, CSR_FFLAGS) -DECLARE_CSR(frm, CSR_FRM) -DECLARE_CSR(fcsr, CSR_FCSR) -DECLARE_CSR(cycle, CSR_CYCLE) -DECLARE_CSR(time, CSR_TIME) -DECLARE_CSR(instret, CSR_INSTRET) -DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) -DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) -DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) -DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) -DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) -DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) -DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) -DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) -DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) -DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) -DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) -DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) -DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) -DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) -DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) -DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) -DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) -DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) -DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) -DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) -DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) -DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) -DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) -DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) -DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) -DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) -DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) -DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) -DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) -DECLARE_CSR(sstatus, CSR_SSTATUS) -DECLARE_CSR(sie, CSR_SIE) -DECLARE_CSR(stvec, CSR_STVEC) -DECLARE_CSR(sscratch, CSR_SSCRATCH) -DECLARE_CSR(sepc, CSR_SEPC) -DECLARE_CSR(scause, CSR_SCAUSE) -DECLARE_CSR(sbadaddr, CSR_SBADADDR) -DECLARE_CSR(sip, CSR_SIP) -DECLARE_CSR(sptbr, CSR_SPTBR) -DECLARE_CSR(mstatus, CSR_MSTATUS) -DECLARE_CSR(misa, CSR_MISA) -DECLARE_CSR(medeleg, CSR_MEDELEG) -DECLARE_CSR(mideleg, CSR_MIDELEG) -DECLARE_CSR(mie, CSR_MIE) -DECLARE_CSR(mtvec, CSR_MTVEC) -DECLARE_CSR(mscratch, CSR_MSCRATCH) -DECLARE_CSR(mepc, CSR_MEPC) -DECLARE_CSR(mcause, CSR_MCAUSE) -DECLARE_CSR(mbadaddr, CSR_MBADADDR) -DECLARE_CSR(mip, CSR_MIP) -DECLARE_CSR(tselect, CSR_TSELECT) -DECLARE_CSR(tdata1, CSR_TDATA1) -DECLARE_CSR(tdata2, CSR_TDATA2) -DECLARE_CSR(tdata3, CSR_TDATA3) -DECLARE_CSR(dcsr, CSR_DCSR) -DECLARE_CSR(dpc, CSR_DPC) -DECLARE_CSR(dscratch, CSR_DSCRATCH) -DECLARE_CSR(mcycle, CSR_MCYCLE) -DECLARE_CSR(minstret, CSR_MINSTRET) -DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) -DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) -DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) -DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) -DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) -DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) -DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) -DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) -DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) -DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) -DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) -DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) -DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) -DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) -DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) -DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) -DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) -DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) -DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) -DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) -DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) -DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) -DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) -DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) -DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) -DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) -DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) -DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) -DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) -DECLARE_CSR(mucounteren, CSR_MUCOUNTEREN) -DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN) -DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) -DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) -DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) -DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) -DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) -DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) -DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) -DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) -DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) -DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) -DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) -DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) -DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) -DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) -DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) -DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) -DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) -DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) -DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) -DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) -DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) -DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) -DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) -DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) -DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) -DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) -DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) -DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) -DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) -DECLARE_CSR(mvendorid, CSR_MVENDORID) -DECLARE_CSR(marchid, CSR_MARCHID) -DECLARE_CSR(mimpid, CSR_MIMPID) -DECLARE_CSR(mhartid, CSR_MHARTID) -DECLARE_CSR(cycleh, CSR_CYCLEH) -DECLARE_CSR(timeh, CSR_TIMEH) -DECLARE_CSR(instreth, CSR_INSTRETH) -DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) -DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) -DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) -DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) -DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) -DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) -DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) -DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) -DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) -DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) -DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) -DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) -DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) -DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) -DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) -DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) -DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) -DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) -DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) -DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) -DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) -DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) -DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) -DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) -DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) -DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) -DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) -DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) -DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) -DECLARE_CSR(mcycleh, CSR_MCYCLEH) -DECLARE_CSR(minstreth, CSR_MINSTRETH) -DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) -DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) -DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) -DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) -DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) -DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) -DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) -DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) -DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) -DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) -DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) -DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) -DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) -DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) -DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) -DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) -DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) -DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) -DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) -DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) -DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) -DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) -DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) -DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) -DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) -DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) -DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) -DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) -DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) -#endif -#ifdef DECLARE_CAUSE -DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) -DECLARE_CAUSE("fault fetch", CAUSE_FAULT_FETCH) -DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) -DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) -DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) -DECLARE_CAUSE("fault load", CAUSE_FAULT_LOAD) -DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) -DECLARE_CAUSE("fault store", CAUSE_FAULT_STORE) -DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) -DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) -DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) -DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) -#endif diff --git a/fpga_spn/bsp/env/entry.S b/fpga_spn/bsp/env/entry.S deleted file mode 100644 index 261b2a4..0000000 --- a/fpga_spn/bsp/env/entry.S +++ /dev/null @@ -1,98 +0,0 @@ -// See LICENSE for license details - -#ifndef ENTRY_S -#define ENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - - .section .text.entry - .align 2 - .weak trap_entry - .global trap_entry -trap_entry: - addi sp, sp, -32*REGBYTES - - STORE x1, 1*REGBYTES(sp) - STORE x2, 2*REGBYTES(sp) - STORE x3, 3*REGBYTES(sp) - STORE x4, 4*REGBYTES(sp) - STORE x5, 5*REGBYTES(sp) - STORE x6, 6*REGBYTES(sp) - STORE x7, 7*REGBYTES(sp) - STORE x8, 8*REGBYTES(sp) - STORE x9, 9*REGBYTES(sp) - STORE x10, 10*REGBYTES(sp) - STORE x11, 11*REGBYTES(sp) - STORE x12, 12*REGBYTES(sp) - STORE x13, 13*REGBYTES(sp) - STORE x14, 14*REGBYTES(sp) - STORE x15, 15*REGBYTES(sp) - STORE x16, 16*REGBYTES(sp) - STORE x17, 17*REGBYTES(sp) - STORE x18, 18*REGBYTES(sp) - STORE x19, 19*REGBYTES(sp) - STORE x20, 20*REGBYTES(sp) - STORE x21, 21*REGBYTES(sp) - STORE x22, 22*REGBYTES(sp) - STORE x23, 23*REGBYTES(sp) - STORE x24, 24*REGBYTES(sp) - STORE x25, 25*REGBYTES(sp) - STORE x26, 26*REGBYTES(sp) - STORE x27, 27*REGBYTES(sp) - STORE x28, 28*REGBYTES(sp) - STORE x29, 29*REGBYTES(sp) - STORE x30, 30*REGBYTES(sp) - STORE x31, 31*REGBYTES(sp) - - csrr a0, mcause - csrr a1, mepc - mv a2, sp - call handle_trap - csrw mepc, a0 - - # Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 1*REGBYTES(sp) - LOAD x2, 2*REGBYTES(sp) - LOAD x3, 3*REGBYTES(sp) - LOAD x4, 4*REGBYTES(sp) - LOAD x5, 5*REGBYTES(sp) - LOAD x6, 6*REGBYTES(sp) - LOAD x7, 7*REGBYTES(sp) - LOAD x8, 8*REGBYTES(sp) - LOAD x9, 9*REGBYTES(sp) - LOAD x10, 10*REGBYTES(sp) - LOAD x11, 11*REGBYTES(sp) - LOAD x12, 12*REGBYTES(sp) - LOAD x13, 13*REGBYTES(sp) - LOAD x14, 14*REGBYTES(sp) - LOAD x15, 15*REGBYTES(sp) - LOAD x16, 16*REGBYTES(sp) - LOAD x17, 17*REGBYTES(sp) - LOAD x18, 18*REGBYTES(sp) - LOAD x19, 19*REGBYTES(sp) - LOAD x20, 20*REGBYTES(sp) - LOAD x21, 21*REGBYTES(sp) - LOAD x22, 22*REGBYTES(sp) - LOAD x23, 23*REGBYTES(sp) - LOAD x24, 24*REGBYTES(sp) - LOAD x25, 25*REGBYTES(sp) - LOAD x26, 26*REGBYTES(sp) - LOAD x27, 27*REGBYTES(sp) - LOAD x28, 28*REGBYTES(sp) - LOAD x29, 29*REGBYTES(sp) - LOAD x30, 30*REGBYTES(sp) - LOAD x31, 31*REGBYTES(sp) - - addi sp, sp, 32*REGBYTES - mret - -.weak handle_trap -handle_trap: -1: - j 1b - -#endif diff --git a/fpga_spn/bsp/env/freedom-e300-arty/flash.lds b/fpga_spn/bsp/env/freedom-e300-arty/flash.lds deleted file mode 100644 index 6b37141..0000000 --- a/fpga_spn/bsp/env/freedom-e300-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/freedom-e300-arty/init.c b/fpga_spn/bsp/env/freedom-e300-arty/init.c deleted file mode 100644 index a6f4b39..0000000 --- a/fpga_spn/bsp/env/freedom-e300-arty/init.c +++ /dev/null @@ -1,87 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long get_cpu_freq() -{ - return 65000000; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - #endif -} - -void _fini() -{ -} diff --git a/fpga_spn/bsp/env/freedom-e300-arty/openocd.cfg b/fpga_spn/bsp/env/freedom-e300-arty/openocd.cfg deleted file mode 100644 index f4b28ed..0000000 --- a/fpga_spn/bsp/env/freedom-e300-arty/openocd.cfg +++ /dev/null @@ -1,30 +0,0 @@ -adapter_khz 10000 - -#source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg] - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 -# - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off diff --git a/fpga_spn/bsp/env/freedom-e300-arty/platform.h b/fpga_spn/bsp/env/freedom-e300-arty/platform.h deleted file mode 100644 index 8ff7ae6..0000000 --- a/fpga_spn/bsp/env/freedom-e300-arty/platform.h +++ /dev/null @@ -1,124 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define AON_CTRL_ADDR _AC(0x10000000,UL) -#define GPIO_CTRL_ADDR _AC(0x10012000,UL) -#define UART0_CTRL_ADDR _AC(0x10013000,UL) -#define SPI0_CTRL_ADDR _AC(0x10014000,UL) -#define PWM0_CTRL_ADDR _AC(0x10015000,UL) -#define UART1_CTRL_ADDR _AC(0x10023000,UL) -#define SPI1_CTRL_ADDR _AC(0x10024000,UL) -#define PWM1_CTRL_ADDR _AC(0x10025000,UL) -#define SPI2_CTRL_ADDR _AC(0x10034000,UL) -#define PWM2_CTRL_ADDR _AC(0x10035000,UL) -#define SPI0_MMAP_ADDR _AC(0x20000000,UL) -#define MEM_CTRL_ADDR _AC(0x80000000,UL) - -// IOF Mappings -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt Numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_CTRL_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_CTRL_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_CTRL_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_CTRL_ADDR, offset) - -// Misc - -#include - - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS -#include "hifive1.h" - -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/fpga_spn/bsp/env/freedom-e300-arty/settings.mk b/fpga_spn/bsp/env/freedom-e300-arty/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/fpga_spn/bsp/env/freedom-e300-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/fpga_spn/bsp/env/freedom-e300-hifive1/dhrystone.lds b/fpga_spn/bsp/env/freedom-e300-hifive1/dhrystone.lds deleted file mode 100644 index cc9cd9b..0000000 --- a/fpga_spn/bsp/env/freedom-e300-hifive1/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/freedom-e300-hifive1/flash.lds b/fpga_spn/bsp/env/freedom-e300-hifive1/flash.lds deleted file mode 100644 index 22f90c6..0000000 --- a/fpga_spn/bsp/env/freedom-e300-hifive1/flash.lds +++ /dev/null @@ -1,166 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 512K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .except : - { - *(.gcc_except_table.*) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/fpga_spn/bsp/env/freedom-e300-hifive1/init.c b/fpga_spn/bsp/env/freedom-e300-hifive1/init.c deleted file mode 100644 index 621a6e2..0000000 --- a/fpga_spn/bsp/env/freedom-e300-hifive1/init.c +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long mtime_lo(void) -{ - return *(volatile unsigned long *)(CLINT_CTRL_ADDR + CLINT_MTIME); -} - -#ifdef __riscv32 - -static uint32_t mtime_hi(void) -{ - return *(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIME + 4); -} - -uint64_t get_timer_value() -{ - while (1) { - uint32_t hi = mtime_hi(); - uint32_t lo = mtime_lo(); - if (hi == mtime_hi()) - return ((uint64_t)hi << 32) | lo; - } -} - -#else /* __riscv32 */ - -uint64_t get_timer_value() -{ - return mtime_lo(); -} - -#endif - -unsigned long get_timer_freq() -{ - return 32768; -} - -static void use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0) ; - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -static void use_pll(int refsel, int bypass, int r, int f, int q) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if available. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - // In case we are executing from QSPI, - // (which is quite likely) we need to - // set the QSPI clock divider appropriately - // before boosting the clock frequency. - - // Div = f_sck/2 - SPI0_REG(SPI_REG_SCKDIV) = 8; - - // Set DIV Settings for PLL - // Both HFROSC and HFXOSC are modeled as ideal - // 16MHz sources (assuming dividers are set properly for - // HFROSC). - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = mtime_lo(); - while (mtime_lo() - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0) ; - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); -} - -static void use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - use_hfrosc(4, 16); -} - -static unsigned long __attribute__((noinline)) measure_cpu_freq(size_t n) -{ - unsigned long start_mtime, delta_mtime; - unsigned long mtime_freq = get_timer_freq(); - - // Don't start measuruing until we see an mtime tick - unsigned long tmp = mtime_lo(); - do { - start_mtime = mtime_lo(); - } while (start_mtime == tmp); - - unsigned long start_mcycle = read_csr(mcycle); - - do { - delta_mtime = mtime_lo() - start_mtime; - } while (delta_mtime < n); - - unsigned long delta_mcycle = read_csr(mcycle) - start_mcycle; - - return (delta_mcycle / delta_mtime) * mtime_freq - + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; -} - -unsigned long get_cpu_freq() -{ - static uint32_t cpu_freq; - - if (!cpu_freq) { - // warm up I$ - measure_cpu_freq(1); - // measure for real - cpu_freq = measure_cpu_freq(10); - } - - return cpu_freq; -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "trap\n", 5); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - - #ifndef NO_INIT - use_default_clocks(); - use_pll(0, 0, 1, 31, 1); - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } - #endif - -} - -void _fini() -{ -} diff --git a/fpga_spn/bsp/env/freedom-e300-hifive1/openocd.cfg b/fpga_spn/bsp/env/freedom-e300-hifive1/openocd.cfg deleted file mode 100644 index b531e9c..0000000 --- a/fpga_spn/bsp/env/freedom-e300-hifive1/openocd.cfg +++ /dev/null @@ -1,34 +0,0 @@ -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Dual RS232-HS" -ftdi_vid_pid 0x0403 0x6010 - -ftdi_layout_init 0x0008 0x001b -ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 - -#Reset Stretcher logic on FE310 is ~1 second long -#This doesn't apply if you use -# ftdi_set_signal, but still good to document -#adapter_nsrst_delay 1500 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -- This type of reset is not implemented yet -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z - #Wait for the reset stretcher - #It will work without this, but - #will incur lots of delays for later commands. - sleep 1500 -} -halt -#flash protect 0 64 last off diff --git a/fpga_spn/bsp/env/freedom-e300-hifive1/platform.h b/fpga_spn/bsp/env/freedom-e300-hifive1/platform.h deleted file mode 100644 index 806fcfc..0000000 --- a/fpga_spn/bsp/env/freedom-e300-hifive1/platform.h +++ /dev/null @@ -1,133 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/otp.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/prci.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define MASKROM_MEM_ADDR _AC(0x00001000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define OTP_MEM_ADDR _AC(0x00020000,UL) -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define AON_CTRL_ADDR _AC(0x10000000,UL) -#define PRCI_CTRL_ADDR _AC(0x10008000,UL) -#define OTP_CTRL_ADDR _AC(0x10010000,UL) -#define GPIO_CTRL_ADDR _AC(0x10012000,UL) -#define UART0_CTRL_ADDR _AC(0x10013000,UL) -#define SPI0_CTRL_ADDR _AC(0x10014000,UL) -#define PWM0_CTRL_ADDR _AC(0x10015000,UL) -#define UART1_CTRL_ADDR _AC(0x10023000,UL) -#define SPI1_CTRL_ADDR _AC(0x10024000,UL) -#define PWM1_CTRL_ADDR _AC(0x10025000,UL) -#define SPI2_CTRL_ADDR _AC(0x10034000,UL) -#define PWM2_CTRL_ADDR _AC(0x10035000,UL) -#define SPI0_MEM_ADDR _AC(0x20000000,UL) -#define MEM_CTRL_ADDR _AC(0x80000000,UL) - -// IOF masks -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -//#define IOF0_I2C_MASK _AC(0x00003000,UL) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_CTRL_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PRCI_REG(offset) _REG32(PRCI_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_CTRL_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_CTRL_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_CTRL_ADDR, offset) - -// Misc - -#include - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#include "hifive1.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/fpga_spn/bsp/env/freedom-e300-hifive1/settings.mk b/fpga_spn/bsp/env/freedom-e300-hifive1/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/fpga_spn/bsp/env/freedom-e300-hifive1/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/fpga_spn/bsp/env/hifive1.h b/fpga_spn/bsp/env/hifive1.h deleted file mode 100644 index 0db2f0f..0000000 --- a/fpga_spn/bsp/env/hifive1.h +++ /dev/null @@ -1,81 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_HIFIVE1_H -#define _SIFIVE_HIFIVE1_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the RGB LED on HiFive1 Board. -// These are also mapped to RGB LEDs on the Freedom E300 Arty -// FPGA -// Dev Kit. - -#define RED_LED_OFFSET 22 -#define GREEN_LED_OFFSET 19 -#define BLUE_LED_OFFSET 21 - -// These are the GPIO bit offsets for the differen digital pins -// on the headers for both the HiFive1 Board and the Freedom E300 Arty FPGA Dev Kit. -#define PIN_0_OFFSET 16 -#define PIN_1_OFFSET 17 -#define PIN_2_OFFSET 18 -#define PIN_3_OFFSET 19 -#define PIN_4_OFFSET 20 -#define PIN_5_OFFSET 21 -#define PIN_6_OFFSET 22 -#define PIN_7_OFFSET 23 -#define PIN_8_OFFSET 0 -#define PIN_9_OFFSET 1 -#define PIN_10_OFFSET 2 -#define PIN_11_OFFSET 3 -#define PIN_12_OFFSET 4 -#define PIN_13_OFFSET 5 -//#define PIN_14_OFFSET 8 //This pin is not connected on either board. -#define PIN_15_OFFSET 9 -#define PIN_16_OFFSET 10 -#define PIN_17_OFFSET 11 -#define PIN_18_OFFSET 12 -#define PIN_19_OFFSET 13 - -// These are *PIN* numbers, not -// GPIO Offset Numbers. -#define PIN_SPI1_SCK (13u) -#define PIN_SPI1_MISO (12u) -#define PIN_SPI1_MOSI (11u) -#define PIN_SPI1_SS0 (10u) -#define PIN_SPI1_SS1 (14u) -#define PIN_SPI1_SS2 (15u) -#define PIN_SPI1_SS3 (16u) - -#define SS_PIN_TO_CS_ID(x) \ - ((x==PIN_SPI1_SS0 ? 0 : \ - (x==PIN_SPI1_SS1 ? 1 : \ - (x==PIN_SPI1_SS2 ? 2 : \ - (x==PIN_SPI1_SS3 ? 3 : \ - -1))))) - - -// These buttons are present only on the Freedom E300 Arty Dev Kit. -#ifdef HAS_BOARD_BUTTONS -#define BUTTON_0_OFFSET 15 -#define BUTTON_1_OFFSET 30 -#define BUTTON_2_OFFSET 31 - -#define INT_DEVICE_BUTTON_0 (INT_GPIO_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (INT_GPIO_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (INT_GPIO_BASE + BUTTON_2_OFFSET) - -#endif - -#define HAS_HFXOSC 1 -#define HAS_LFROSC_BYPASS 1 - -#define RTC_FREQ 32768 - -void write_hex(int fd, unsigned long int hex); - -#endif /* _SIFIVE_HIFIVE1_H */ diff --git a/fpga_spn/bsp/env/start.S b/fpga_spn/bsp/env/start.S deleted file mode 100644 index 4e9f665..0000000 --- a/fpga_spn/bsp/env/start.S +++ /dev/null @@ -1,111 +0,0 @@ -// See LICENSE for license details. -#include - -/* This is defined in sifive/platform.h, but that can't be included from - * assembly. */ -#define CLINT_CTRL_ADDR 0x02000000 - - .section .init - .globl _start - .type _start,@function - -_start: - .cfi_startproc - .cfi_undefined ra -.option push -.option norelax - la gp, __global_pointer$ -.option pop - la sp, _sp - -#if defined(ENABLE_SMP) - smp_pause(t0, t1) -#endif - - /* Load data section */ - la a0, _data_lma - la a1, _data - la a2, _edata - bgeu a1, a2, 2f -1: - lw t0, (a0) - sw t0, (a1) - addi a0, a0, 4 - addi a1, a1, 4 - bltu a1, a2, 1b -2: - - /* Clear bss section */ - la a0, __bss_start - la a1, _end - bgeu a0, a1, 2f -1: - sw zero, (a0) - addi a0, a0, 4 - bltu a0, a1, 1b -2: - - /* Call global constructors */ - la a0, __libc_fini_array - call atexit - call __libc_init_array - -#ifndef __riscv_float_abi_soft - /* Enable FPU */ - li t0, MSTATUS_FS - csrs mstatus, t0 - csrr t1, mstatus - and t1, t1, t0 - beqz t1, 1f - fssr x0 -1: -#endif - -#if defined(ENABLE_SMP) - smp_resume(t0, t1) - - csrr a0, mhartid - bnez a0, 2f -#endif - - auipc ra, 0 - addi sp, sp, -16 -#if __riscv_xlen == 32 - sw ra, 8(sp) -#else - sd ra, 8(sp) -#endif - - /* argc = argv = 0 */ - li a0, 0 - li a1, 0 - call main - tail exit -1: - j 1b - -#if defined(ENABLE_SMP) -2: - la t0, trap_entry - csrw mtvec, t0 - - csrr a0, mhartid - la t1, _sp - slli t0, a0, 10 - sub sp, t1, t0 - - auipc ra, 0 - addi sp, sp, -16 -#if __riscv_xlen == 32 - sw ra, 8(sp) -#else - sd ra, 8(sp) -#endif - - call secondary_main - tail exit - -1: - j 1b -#endif - .cfi_endproc diff --git a/fpga_spn/bsp/env/ventry.S b/fpga_spn/bsp/env/ventry.S deleted file mode 100644 index 5c82c48..0000000 --- a/fpga_spn/bsp/env/ventry.S +++ /dev/null @@ -1,288 +0,0 @@ -// See LICENSE for license details - -#ifndef VENTRY_S -#define VENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - -#only save caller registers -.macro TRAP_ENTRY - addi sp, sp, -16*REGBYTES - - STORE x1, 0*REGBYTES(sp) - STORE x5, 1*REGBYTES(sp) - STORE x6, 2*REGBYTES(sp) - STORE x7, 3*REGBYTES(sp) - STORE x10, 4*REGBYTES(sp) - STORE x11, 5*REGBYTES(sp) - STORE x12, 6*REGBYTES(sp) - STORE x13, 7*REGBYTES(sp) - STORE x14, 8*REGBYTES(sp) - STORE x15, 9*REGBYTES(sp) - STORE x16, 10*REGBYTES(sp) - STORE x17, 11*REGBYTES(sp) - STORE x28, 12*REGBYTES(sp) - STORE x29, 13*REGBYTES(sp) - STORE x30, 14*REGBYTES(sp) - STORE x31, 15*REGBYTES(sp) -.endm - -#restore caller registers -.macro TRAP_EXIT -# Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 0*REGBYTES(sp) - LOAD x5, 1*REGBYTES(sp) - LOAD x6, 2*REGBYTES(sp) - LOAD x7, 3*REGBYTES(sp) - LOAD x10, 4*REGBYTES(sp) - LOAD x11, 5*REGBYTES(sp) - LOAD x12, 6*REGBYTES(sp) - LOAD x13, 7*REGBYTES(sp) - LOAD x14, 8*REGBYTES(sp) - LOAD x15, 9*REGBYTES(sp) - LOAD x16, 10*REGBYTES(sp) - LOAD x17, 11*REGBYTES(sp) - LOAD x28, 12*REGBYTES(sp) - LOAD x29, 13*REGBYTES(sp) - LOAD x30, 14*REGBYTES(sp) - LOAD x31, 15*REGBYTES(sp) - - addi sp, sp, 16*REGBYTES - mret -.endm - - - -#Vector table for E31/E51 - - .section .text.entry - .align 8 - .global vtrap_entry -vtrap_entry: - j sync_trap - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmsi_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmti_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmei_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vlip_Handler0 - .align 2 - j vlip_Handler1 - .align 2 - j vlip_Handler2 - .align 2 - j vlip_Handler3 - .align 2 - j vlip_Handler4 - .align 2 - j vlip_Handler5 - .align 2 - j vlip_Handler6 - .align 2 - j vlip_Handler7 - .align 2 - j vlip_Handler8 - .align 2 - j vlip_Handler9 - .align 2 - j vlip_Handler10 - .align 2 - j vlip_Handler11 - .align 2 - j vlip_Handler12 - .align 2 - j vlip_Handler13 - .align 2 - j vlip_Handler14 - .align 2 - j vlip_Handler15 - -#synchronous trap -sync_trap: - TRAP_ENTRY - jal handle_sync_trap - TRAP_EXIT - -#Machine Software Interrupt -vmsi_Handler: - TRAP_ENTRY - jal reserved - TRAP_EXIT - -#Machine Timer Interrupt -vmti_Handler: - TRAP_ENTRY - jal handle_m_time_interrupt - TRAP_EXIT - -#Machine External Interrupt -vmei_Handler: - TRAP_ENTRY - jal handle_m_external_interrupt - TRAP_EXIT - -#LIP0 -vlip_Handler0: - TRAP_ENTRY - jal handle_local_interrupt0 - TRAP_EXIT - -#LIP1 -vlip_Handler1: - TRAP_ENTRY - jal handle_local_interrupt1 - TRAP_EXIT - -#LIP2 -vlip_Handler2: - TRAP_ENTRY - jal handle_local_interrupt2 - TRAP_EXIT - -#LIP3 -vlip_Handler3: - TRAP_ENTRY - jal handle_local_interrupt3 - TRAP_EXIT - -#LIP4 -vlip_Handler4: - TRAP_ENTRY - jal handle_local_interrupt4 - TRAP_EXIT - -#LIP5 -vlip_Handler5: - TRAP_ENTRY - jal handle_local_interrupt5 - TRAP_EXIT - -#LIP6 -vlip_Handler6: - TRAP_ENTRY - jal handle_local_interrupt6 - TRAP_EXIT - -#LIP7 -vlip_Handler7: - TRAP_ENTRY - jal handle_local_interrupt7 - TRAP_EXIT - -#LIP8 -vlip_Handler8: - TRAP_ENTRY - jal handle_local_interrupt8 - TRAP_EXIT - -#LIP9 -vlip_Handler9: - TRAP_ENTRY - jal handle_local_interrupt9 - TRAP_EXIT - -#LIP10 -vlip_Handler10: - TRAP_ENTRY - jal handle_local_interrupt10 - TRAP_EXIT - -#LIP11 -vlip_Handler11: - TRAP_ENTRY - jal handle_local_interrupt11 - TRAP_EXIT - -#LIP12 -vlip_Handler12: - TRAP_ENTRY - jal handle_local_interrupt12 - TRAP_EXIT - -#LIP13 -vlip_Handler13: - TRAP_ENTRY - jal handle_local_interrupt13 - TRAP_EXIT - -#LIP14 -vlip_Handler14: - TRAP_ENTRY - jal handle_local_interrupt14 - TRAP_EXIT - -#LIP15 -vlip_Handler15: - TRAP_ENTRY - jal handle_local_interrupt15 - TRAP_EXIT - -#unimplemented ISRs trap here -.weak reserved -reserved: -.weak handle_local_interrupt0 -handle_local_interrupt0: -.weak handle_local_interrupt1 -handle_local_interrupt1: -.weak handle_local_interrupt2 -handle_local_interrupt2: -.weak handle_local_interrupt3 -handle_local_interrupt3: -.weak handle_local_interrupt4 -handle_local_interrupt4: -.weak handle_local_interrupt5 -handle_local_interrupt5: -.weak handle_local_interrupt6 -handle_local_interrupt6: -.weak handle_local_interrupt7 -handle_local_interrupt7: -.weak handle_local_interrupt8 -handle_local_interrupt8: -.weak handle_local_interrupt9 -handle_local_interrupt9: -.weak handle_local_interrupt10 -handle_local_interrupt10: -.weak handle_local_interrupt11 -handle_local_interrupt11: -.weak handle_local_interrupt12 -handle_local_interrupt12: -.weak handle_local_interrupt13 -handle_local_interrupt13: -.weak handle_local_interrupt14 -handle_local_interrupt14: -.weak handle_local_interrupt15 -handle_local_interrupt15: -1: - j 1b - -#endif diff --git a/fpga_spn/bsp/include/sifive/bits.h b/fpga_spn/bsp/include/sifive/bits.h deleted file mode 100644 index bfe656f..0000000 --- a/fpga_spn/bsp/include/sifive/bits.h +++ /dev/null @@ -1,36 +0,0 @@ -// See LICENSE for license details. -#ifndef _RISCV_BITS_H -#define _RISCV_BITS_H - -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) - -#define ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b)) -#define ROUNDDOWN(a, b) ((a)/(b)*(b)) - -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define CLAMP(a, lo, hi) MIN(MAX(a, lo), hi) - -#define EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1))) -#define INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1)))) - -#define STR(x) XSTR(x) -#define XSTR(x) #x - -#if __riscv_xlen == 64 -# define SLL32 sllw -# define STORE sd -# define LOAD ld -# define LWU lwu -# define LOG_REGBYTES 3 -#else -# define SLL32 sll -# define STORE sw -# define LOAD lw -# define LWU lw -# define LOG_REGBYTES 2 -#endif -#define REGBYTES (1 << LOG_REGBYTES) - -#endif diff --git a/fpga_spn/bsp/include/sifive/const.h b/fpga_spn/bsp/include/sifive/const.h deleted file mode 100644 index 8dcffbb..0000000 --- a/fpga_spn/bsp/include/sifive/const.h +++ /dev/null @@ -1,18 +0,0 @@ -// See LICENSE for license details. -/* Derived from */ - -#ifndef _SIFIVE_CONST_H -#define _SIFIVE_CONST_H - -#ifdef __ASSEMBLER__ -#define _AC(X,Y) X -#define _AT(T,X) X -#else -#define _AC(X,Y) (X##Y) -#define _AT(T,X) ((T)(X)) -#endif /* !__ASSEMBLER__*/ - -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) - -#endif /* _SIFIVE_CONST_H */ diff --git a/fpga_spn/bsp/include/sifive/devices/aon.h b/fpga_spn/bsp/include/sifive/devices/aon.h deleted file mode 100644 index 63f1db3..0000000 --- a/fpga_spn/bsp/include/sifive/devices/aon.h +++ /dev/null @@ -1,88 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_AON_H -#define _SIFIVE_AON_H - -/* Register offsets */ - -#define AON_WDOGCFG 0x000 -#define AON_WDOGCOUNT 0x008 -#define AON_WDOGS 0x010 -#define AON_WDOGFEED 0x018 -#define AON_WDOGKEY 0x01C -#define AON_WDOGCMP 0x020 - -#define AON_RTCCFG 0x040 -#define AON_RTCLO 0x048 -#define AON_RTCHI 0x04C -#define AON_RTCS 0x050 -#define AON_RTCCMP 0x060 - -#define AON_BACKUP0 0x080 -#define AON_BACKUP1 0x084 -#define AON_BACKUP2 0x088 -#define AON_BACKUP3 0x08C -#define AON_BACKUP4 0x090 -#define AON_BACKUP5 0x094 -#define AON_BACKUP6 0x098 -#define AON_BACKUP7 0x09C -#define AON_BACKUP8 0x0A0 -#define AON_BACKUP9 0x0A4 -#define AON_BACKUP10 0x0A8 -#define AON_BACKUP11 0x0AC -#define AON_BACKUP12 0x0B0 -#define AON_BACKUP13 0x0B4 -#define AON_BACKUP14 0x0B8 -#define AON_BACKUP15 0x0BC - -#define AON_PMUWAKEUPI0 0x100 -#define AON_PMUWAKEUPI1 0x104 -#define AON_PMUWAKEUPI2 0x108 -#define AON_PMUWAKEUPI3 0x10C -#define AON_PMUWAKEUPI4 0x110 -#define AON_PMUWAKEUPI5 0x114 -#define AON_PMUWAKEUPI6 0x118 -#define AON_PMUWAKEUPI7 0x11C -#define AON_PMUSLEEPI0 0x120 -#define AON_PMUSLEEPI1 0x124 -#define AON_PMUSLEEPI2 0x128 -#define AON_PMUSLEEPI3 0x12C -#define AON_PMUSLEEPI4 0x130 -#define AON_PMUSLEEPI5 0x134 -#define AON_PMUSLEEPI6 0x138 -#define AON_PMUSLEEPI7 0x13C -#define AON_PMUIE 0x140 -#define AON_PMUCAUSE 0x144 -#define AON_PMUSLEEP 0x148 -#define AON_PMUKEY 0x14C - -#define AON_LFROSC 0x070 -/* Constants */ - -#define AON_WDOGKEY_VALUE 0x51F15E -#define AON_WDOGFEED_VALUE 0xD09F00D - -#define AON_WDOGCFG_SCALE 0x0000000F -#define AON_WDOGCFG_RSTEN 0x00000100 -#define AON_WDOGCFG_ZEROCMP 0x00000200 -#define AON_WDOGCFG_ENALWAYS 0x00001000 -#define AON_WDOGCFG_ENCOREAWAKE 0x00002000 -#define AON_WDOGCFG_CMPIP 0x10000000 - -#define AON_RTCCFG_SCALE 0x0000000F -#define AON_RTCCFG_ENALWAYS 0x00001000 -#define AON_RTCCFG_CMPIP 0x10000000 - -#define AON_WAKEUPCAUSE_RESET 0x00 -#define AON_WAKEUPCAUSE_RTC 0x01 -#define AON_WAKEUPCAUSE_DWAKEUP 0x02 -#define AON_WAKEUPCAUSE_AWAKEUP 0x03 - -#define AON_RESETCAUSE_POWERON 0x0000 -#define AON_RESETCAUSE_EXTERNAL 0x0100 -#define AON_RESETCAUSE_WATCHDOG 0x0200 - -#define AON_PMUCAUSE_WAKEUPCAUSE 0x00FF -#define AON_PMUCAUSE_RESETCAUSE 0xFF00 - -#endif /* _SIFIVE_AON_H */ diff --git a/fpga_spn/bsp/include/sifive/devices/clic.h b/fpga_spn/bsp/include/sifive/devices/clic.h deleted file mode 100644 index e8dc2df..0000000 --- a/fpga_spn/bsp/include/sifive/devices/clic.h +++ /dev/null @@ -1,30 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_CLIC_H -#define _SIFIVE_CLIC_H - -#define CLIC_HART0 0x00800000 -#define CLIC_MSIP 0x0000 -#define CLIC_MSIP_size 0x4 -#define CLIC_MTIMECMP 0x4000 -#define CLIC_MTIMECMP_size 0x8 -#define CLIC_MTIME 0xBFF8 -#define CLIC_MTIME_size 0x8 - -#define CLIC_INTIP 0x000 -#define CLIC_INTIE 0x400 -#define CLIC_INTCFG 0x800 -#define CLIC_CFG 0xc00 - -// These interrupt IDs are consistent across old and new mtvec modes -#define SSIPID 1 -#define MSIPID 3 -#define STIPID 5 -#define MTIPID 7 -#define SEIPID 9 -#define MEIPID 11 -#define CSIPID 12 -#define LOCALINTIDBASE 16 - - -#endif /* _SIFIVE_CLIC_H */ diff --git a/fpga_spn/bsp/include/sifive/devices/clint.h b/fpga_spn/bsp/include/sifive/devices/clint.h deleted file mode 100644 index cd3e0c7..0000000 --- a/fpga_spn/bsp/include/sifive/devices/clint.h +++ /dev/null @@ -1,14 +0,0 @@ -// See LICENSE for license details - -#ifndef _SIFIVE_CLINT_H -#define _SIFIVE_CLINT_H - - -#define CLINT_MSIP 0x0000 -#define CLINT_MSIP_size 0x4 -#define CLINT_MTIMECMP 0x4000 -#define CLINT_MTIMECMP_size 0x8 -#define CLINT_MTIME 0xBFF8 -#define CLINT_MTIME_size 0x8 - -#endif /* _SIFIVE_CLINT_H */ diff --git a/fpga_spn/bsp/include/sifive/devices/gpio.h b/fpga_spn/bsp/include/sifive/devices/gpio.h deleted file mode 100644 index f7f0acb..0000000 --- a/fpga_spn/bsp/include/sifive/devices/gpio.h +++ /dev/null @@ -1,24 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_GPIO_H -#define _SIFIVE_GPIO_H - -#define GPIO_INPUT_VAL (0x00) -#define GPIO_INPUT_EN (0x04) -#define GPIO_OUTPUT_EN (0x08) -#define GPIO_OUTPUT_VAL (0x0C) -#define GPIO_PULLUP_EN (0x10) -#define GPIO_DRIVE (0x14) -#define GPIO_RISE_IE (0x18) -#define GPIO_RISE_IP (0x1C) -#define GPIO_FALL_IE (0x20) -#define GPIO_FALL_IP (0x24) -#define GPIO_HIGH_IE (0x28) -#define GPIO_HIGH_IP (0x2C) -#define GPIO_LOW_IE (0x30) -#define GPIO_LOW_IP (0x34) -#define GPIO_IOF_EN (0x38) -#define GPIO_IOF_SEL (0x3C) -#define GPIO_OUTPUT_XOR (0x40) - -#endif /* _SIFIVE_GPIO_H */ diff --git a/fpga_spn/bsp/include/sifive/devices/otp.h b/fpga_spn/bsp/include/sifive/devices/otp.h deleted file mode 100644 index 93833e2..0000000 --- a/fpga_spn/bsp/include/sifive/devices/otp.h +++ /dev/null @@ -1,23 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_OTP_H -#define _SIFIVE_OTP_H - -/* Register offsets */ - -#define OTP_LOCK 0x00 -#define OTP_CK 0x04 -#define OTP_OE 0x08 -#define OTP_SEL 0x0C -#define OTP_WE 0x10 -#define OTP_MR 0x14 -#define OTP_MRR 0x18 -#define OTP_MPP 0x1C -#define OTP_VRREN 0x20 -#define OTP_VPPEN 0x24 -#define OTP_A 0x28 -#define OTP_D 0x2C -#define OTP_Q 0x30 -#define OTP_READ_TIMINGS 0x34 - -#endif diff --git a/fpga_spn/bsp/include/sifive/devices/plic.h b/fpga_spn/bsp/include/sifive/devices/plic.h deleted file mode 100644 index e1ca5d6..0000000 --- a/fpga_spn/bsp/include/sifive/devices/plic.h +++ /dev/null @@ -1,31 +0,0 @@ -// See LICENSE for license details. - -#ifndef PLIC_H -#define PLIC_H - -#include - -// 32 bits per source -#define PLIC_PRIORITY_OFFSET _AC(0x0000,UL) -#define PLIC_PRIORITY_SHIFT_PER_SOURCE 2 -// 1 bit per source (1 address) -#define PLIC_PENDING_OFFSET _AC(0x1000,UL) -#define PLIC_PENDING_SHIFT_PER_SOURCE 0 - -//0x80 per target -#define PLIC_ENABLE_OFFSET _AC(0x2000,UL) -#define PLIC_ENABLE_SHIFT_PER_TARGET 7 - - -#define PLIC_THRESHOLD_OFFSET _AC(0x200000,UL) -#define PLIC_CLAIM_OFFSET _AC(0x200004,UL) -#define PLIC_THRESHOLD_SHIFT_PER_TARGET 12 -#define PLIC_CLAIM_SHIFT_PER_TARGET 12 - -#define PLIC_MAX_SOURCE 1023 -#define PLIC_SOURCE_MASK 0x3FF - -#define PLIC_MAX_TARGET 15871 -#define PLIC_TARGET_MASK 0x3FFF - -#endif /* PLIC_H */ diff --git a/fpga_spn/bsp/include/sifive/devices/prci.h b/fpga_spn/bsp/include/sifive/devices/prci.h deleted file mode 100644 index 1a3de58..0000000 --- a/fpga_spn/bsp/include/sifive/devices/prci.h +++ /dev/null @@ -1,56 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PRCI_H -#define _SIFIVE_PRCI_H - -/* Register offsets */ - -#define PRCI_HFROSCCFG (0x0000) -#define PRCI_HFXOSCCFG (0x0004) -#define PRCI_PLLCFG (0x0008) -#define PRCI_PLLDIV (0x000C) -#define PRCI_PROCMONCFG (0x00F0) - -/* Fields */ -#define ROSC_DIV(x) (((x) & 0x2F) << 0 ) -#define ROSC_TRIM(x) (((x) & 0x1F) << 16) -#define ROSC_EN(x) (((x) & 0x1 ) << 30) -#define ROSC_RDY(x) (((x) & 0x1 ) << 31) - -#define XOSC_EN(x) (((x) & 0x1) << 30) -#define XOSC_RDY(x) (((x) & 0x1) << 31) - -#define PLL_R(x) (((x) & 0x7) << 0) -// single reserved bit for F LSB. -#define PLL_F(x) (((x) & 0x3F) << 4) -#define PLL_Q(x) (((x) & 0x3) << 10) -#define PLL_SEL(x) (((x) & 0x1) << 16) -#define PLL_REFSEL(x) (((x) & 0x1) << 17) -#define PLL_BYPASS(x) (((x) & 0x1) << 18) -#define PLL_LOCK(x) (((x) & 0x1) << 31) - -#define PLL_R_default 0x1 -#define PLL_F_default 0x1F -#define PLL_Q_default 0x3 - -#define PLL_REFSEL_HFROSC 0x0 -#define PLL_REFSEL_HFXOSC 0x1 - -#define PLL_SEL_HFROSC 0x0 -#define PLL_SEL_PLL 0x1 - -#define PLL_FINAL_DIV(x) (((x) & 0x3F) << 0) -#define PLL_FINAL_DIV_BY_1(x) (((x) & 0x1 ) << 8) - -#define PROCMON_DIV(x) (((x) & 0x1F) << 0) -#define PROCMON_TRIM(x) (((x) & 0x1F) << 8) -#define PROCMON_EN(x) (((x) & 0x1) << 16) -#define PROCMON_SEL(x) (((x) & 0x3) << 24) -#define PROCMON_NT_EN(x) (((x) & 0x1) << 28) - -#define PROCMON_SEL_HFCLK 0 -#define PROCMON_SEL_HFXOSCIN 1 -#define PROCMON_SEL_PLLOUTDIV 2 -#define PROCMON_SEL_PROCMON 3 - -#endif // _SIFIVE_PRCI_H diff --git a/fpga_spn/bsp/include/sifive/devices/pwm.h b/fpga_spn/bsp/include/sifive/devices/pwm.h deleted file mode 100644 index 067889a..0000000 --- a/fpga_spn/bsp/include/sifive/devices/pwm.h +++ /dev/null @@ -1,37 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PWM_H -#define _SIFIVE_PWM_H - -/* Register offsets */ - -#define PWM_CFG 0x00 -#define PWM_COUNT 0x08 -#define PWM_S 0x10 -#define PWM_CMP0 0x20 -#define PWM_CMP1 0x24 -#define PWM_CMP2 0x28 -#define PWM_CMP3 0x2C - -/* Constants */ - -#define PWM_CFG_SCALE 0x0000000F -#define PWM_CFG_STICKY 0x00000100 -#define PWM_CFG_ZEROCMP 0x00000200 -#define PWM_CFG_DEGLITCH 0x00000400 -#define PWM_CFG_ENALWAYS 0x00001000 -#define PWM_CFG_ONESHOT 0x00002000 -#define PWM_CFG_CMP0CENTER 0x00010000 -#define PWM_CFG_CMP1CENTER 0x00020000 -#define PWM_CFG_CMP2CENTER 0x00040000 -#define PWM_CFG_CMP3CENTER 0x00080000 -#define PWM_CFG_CMP0GANG 0x01000000 -#define PWM_CFG_CMP1GANG 0x02000000 -#define PWM_CFG_CMP2GANG 0x04000000 -#define PWM_CFG_CMP3GANG 0x08000000 -#define PWM_CFG_CMP0IP 0x10000000 -#define PWM_CFG_CMP1IP 0x20000000 -#define PWM_CFG_CMP2IP 0x40000000 -#define PWM_CFG_CMP3IP 0x80000000 - -#endif /* _SIFIVE_PWM_H */ diff --git a/fpga_spn/bsp/include/sifive/devices/spi.h b/fpga_spn/bsp/include/sifive/devices/spi.h deleted file mode 100644 index 80ef345..0000000 --- a/fpga_spn/bsp/include/sifive/devices/spi.h +++ /dev/null @@ -1,80 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_SPI_H -#define _SIFIVE_SPI_H - -/* Register offsets */ - -#define SPI_REG_SCKDIV 0x00 -#define SPI_REG_SCKMODE 0x04 -#define SPI_REG_CSID 0x10 -#define SPI_REG_CSDEF 0x14 -#define SPI_REG_CSMODE 0x18 - -#define SPI_REG_DCSSCK 0x28 -#define SPI_REG_DSCKCS 0x2a -#define SPI_REG_DINTERCS 0x2c -#define SPI_REG_DINTERXFR 0x2e - -#define SPI_REG_FMT 0x40 -#define SPI_REG_TXFIFO 0x48 -#define SPI_REG_RXFIFO 0x4c -#define SPI_REG_TXCTRL 0x50 -#define SPI_REG_RXCTRL 0x54 - -#define SPI_REG_FCTRL 0x60 -#define SPI_REG_FFMT 0x64 - -#define SPI_REG_IE 0x70 -#define SPI_REG_IP 0x74 - -/* Fields */ - -#define SPI_SCK_PHA 0x1 -#define SPI_SCK_POL 0x2 - -#define SPI_FMT_PROTO(x) ((x) & 0x3) -#define SPI_FMT_ENDIAN(x) (((x) & 0x1) << 2) -#define SPI_FMT_DIR(x) (((x) & 0x1) << 3) -#define SPI_FMT_LEN(x) (((x) & 0xf) << 16) - -/* TXCTRL register */ -#define SPI_TXWM(x) ((x) & 0xffff) -/* RXCTRL register */ -#define SPI_RXWM(x) ((x) & 0xffff) - -#define SPI_IP_TXWM 0x1 -#define SPI_IP_RXWM 0x2 - -#define SPI_FCTRL_EN 0x1 - -#define SPI_INSN_CMD_EN 0x1 -#define SPI_INSN_ADDR_LEN(x) (((x) & 0x7) << 1) -#define SPI_INSN_PAD_CNT(x) (((x) & 0xf) << 4) -#define SPI_INSN_CMD_PROTO(x) (((x) & 0x3) << 8) -#define SPI_INSN_ADDR_PROTO(x) (((x) & 0x3) << 10) -#define SPI_INSN_DATA_PROTO(x) (((x) & 0x3) << 12) -#define SPI_INSN_CMD_CODE(x) (((x) & 0xff) << 16) -#define SPI_INSN_PAD_CODE(x) (((x) & 0xff) << 24) - -#define SPI_TXFIFO_FULL (1 << 31) -#define SPI_RXFIFO_EMPTY (1 << 31) - -/* Values */ - -#define SPI_CSMODE_AUTO 0 -#define SPI_CSMODE_HOLD 2 -#define SPI_CSMODE_OFF 3 - -#define SPI_DIR_RX 0 -#define SPI_DIR_TX 1 - -#define SPI_PROTO_S 0 -#define SPI_PROTO_D 1 -#define SPI_PROTO_Q 2 - -#define SPI_ENDIAN_MSB 0 -#define SPI_ENDIAN_LSB 1 - - -#endif /* _SIFIVE_SPI_H */ diff --git a/fpga_spn/bsp/include/sifive/devices/uart.h b/fpga_spn/bsp/include/sifive/devices/uart.h deleted file mode 100644 index 71bea6f..0000000 --- a/fpga_spn/bsp/include/sifive/devices/uart.h +++ /dev/null @@ -1,27 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_UART_H -#define _SIFIVE_UART_H - -/* Register offsets */ -#define UART_REG_TXFIFO 0x00 -#define UART_REG_RXFIFO 0x04 -#define UART_REG_TXCTRL 0x08 -#define UART_REG_RXCTRL 0x0c -#define UART_REG_IE 0x10 -#define UART_REG_IP 0x14 -#define UART_REG_DIV 0x18 - -/* TXCTRL register */ -#define UART_TXEN 0x1 -#define UART_TXWM(x) (((x) & 0xffff) << 16) - -/* RXCTRL register */ -#define UART_RXEN 0x1 -#define UART_RXWM(x) (((x) & 0xffff) << 16) - -/* IP register */ -#define UART_IP_TXWM 0x1 -#define UART_IP_RXWM 0x2 - -#endif /* _SIFIVE_UART_H */ diff --git a/fpga_spn/bsp/include/sifive/sections.h b/fpga_spn/bsp/include/sifive/sections.h deleted file mode 100644 index 6e1f051..0000000 --- a/fpga_spn/bsp/include/sifive/sections.h +++ /dev/null @@ -1,17 +0,0 @@ -// See LICENSE for license details. -#ifndef _SECTIONS_H -#define _SECTIONS_H - -extern unsigned char _rom[]; -extern unsigned char _rom_end[]; - -extern unsigned char _ram[]; -extern unsigned char _ram_end[]; - -extern unsigned char _ftext[]; -extern unsigned char _etext[]; -extern unsigned char _fbss[]; -extern unsigned char _ebss[]; -extern unsigned char _end[]; - -#endif /* _SECTIONS_H */ diff --git a/fpga_spn/bsp/include/sifive/smp.h b/fpga_spn/bsp/include/sifive/smp.h deleted file mode 100644 index 8e34388..0000000 --- a/fpga_spn/bsp/include/sifive/smp.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef SIFIVE_SMP -#define SIFIVE_SMP - -// The maximum number of HARTs this code supports -#ifndef MAX_HARTS -#define MAX_HARTS 32 -#endif -#define CLINT_END_HART_IPI CLINT_CTRL_ADDR + (MAX_HARTS*4) - -// The hart that non-SMP tests should run on -#ifndef NONSMP_HART -#define NONSMP_HART 0 -#endif - -/* If your test cannot handle multiple-threads, use this: - * smp_disable(reg1) - */ -#define smp_disable(reg1, reg2) \ - csrr reg1, mhartid ;\ - li reg2, NONSMP_HART ;\ - beq reg1, reg2, hart0_entry ;\ -42: ;\ - wfi ;\ - j 42b ;\ -hart0_entry: - -/* If your test needs to temporarily block multiple-threads, do this: - * smp_pause(reg1, reg2) - * ... single-threaded work ... - * smp_resume(reg1, reg2) - * ... multi-threaded work ... - */ - -#define smp_pause(reg1, reg2) \ - li reg2, 0x8 ;\ - csrw mie, reg2 ;\ - csrr reg2, mhartid ;\ - bnez reg2, 42f - -#define smp_resume(reg1, reg2) \ - li reg1, CLINT_CTRL_ADDR ;\ -41: ;\ - li reg2, 1 ;\ - sw reg2, 0(reg1) ;\ - addi reg1, reg1, 4 ;\ - li reg2, CLINT_END_HART_IPI ;\ - blt reg1, reg2, 41b ;\ -42: ;\ - wfi ;\ - csrr reg2, mip ;\ - andi reg2, reg2, 0x8 ;\ - beqz reg2, 42b ;\ - li reg1, CLINT_CTRL_ADDR ;\ - csrr reg2, mhartid ;\ - slli reg2, reg2, 2 ;\ - add reg2, reg2, reg1 ;\ - sw zero, 0(reg2) ;\ -41: ;\ - lw reg2, 0(reg1) ;\ - bnez reg2, 41b ;\ - addi reg1, reg1, 4 ;\ - li reg2, CLINT_END_HART_IPI ;\ - blt reg1, reg2, 41b - -#endif diff --git a/fpga_spn/bsp/libwrap/libwrap.mk b/fpga_spn/bsp/libwrap/libwrap.mk deleted file mode 100644 index 71bba3d..0000000 --- a/fpga_spn/bsp/libwrap/libwrap.mk +++ /dev/null @@ -1,56 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_LIBWRAP -_SIFIVE_MK_LIBWRAP := # defined - -LIBWRAP_DIR := $(dir $(lastword $(MAKEFILE_LIST))) -LIBWRAP_DIR := $(LIBWRAP_DIR:/=) - -LIBWRAP_SRCS := \ - stdlib/malloc.c \ - sys/open.c \ - sys/lseek.c \ - sys/read.c \ - sys/write.c \ - sys/fstat.c \ - sys/stat.c \ - sys/close.c \ - sys/link.c \ - sys/unlink.c \ - sys/execve.c \ - sys/fork.c \ - sys/getpid.c \ - sys/kill.c \ - sys/wait.c \ - sys/isatty.c \ - sys/times.c \ - sys/sbrk.c \ - sys/_exit.c \ - sys/puts.c \ - misc/write_hex.c - -LIBWRAP_SRCS := $(foreach f,$(LIBWRAP_SRCS),$(LIBWRAP_DIR)/$(f)) -LIBWRAP_OBJS := $(LIBWRAP_SRCS:.c=.o) - -LIBWRAP_SYMS := malloc free \ - open lseek read write fstat stat close link unlink \ - execve fork getpid kill wait \ - isatty times sbrk _exit puts - -LIBWRAP := libwrap.a - -LINK_DEPS += $(LIBWRAP) - -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=$(s)) -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=_$(s)) -LDFLAGS += -L. -Wl,--start-group -lwrap -lc -Wl,--end-group - -CLEAN_OBJS += $(LIBWRAP_OBJS) - -$(LIBWRAP_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(LIBWRAP): $(LIBWRAP_OBJS) - $(AR) rcs $@ $^ - -endif # _SIFIVE_MK_LIBWRAP diff --git a/fpga_spn/bsp/libwrap/misc/write_hex.c b/fpga_spn/bsp/libwrap/misc/write_hex.c deleted file mode 100644 index a35ad7a..0000000 --- a/fpga_spn/bsp/libwrap/misc/write_hex.c +++ /dev/null @@ -1,19 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "platform.h" - -void write_hex(int fd, unsigned long int hex) -{ - uint8_t ii; - uint8_t jj; - char towrite; - write(fd , "0x", 2); - for (ii = sizeof(unsigned long int) * 2 ; ii > 0; ii--) { - jj = ii - 1; - uint8_t digit = ((hex & (0xF << (jj*4))) >> (jj*4)); - towrite = digit < 0xA ? ('0' + digit) : ('A' + (digit - 0xA)); - write(fd, &towrite, 1); - } -} diff --git a/fpga_spn/bsp/libwrap/stdlib/malloc.c b/fpga_spn/bsp/libwrap/stdlib/malloc.c deleted file mode 100644 index 8f4f432..0000000 --- a/fpga_spn/bsp/libwrap/stdlib/malloc.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE for license details. */ - -/* These functions are intended for embedded RV32 systems and are - obviously incorrect in general. */ - -void* __wrap_malloc(unsigned long sz) -{ - extern void* sbrk(long); - void* res = sbrk(sz); - if ((long)res == -1) - return 0; - return res; -} - -void __wrap_free(void* ptr) -{ -} diff --git a/fpga_spn/bsp/libwrap/sys/_exit.c b/fpga_spn/bsp/libwrap/sys/_exit.c deleted file mode 100644 index 011464f..0000000 --- a/fpga_spn/bsp/libwrap/sys/_exit.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "platform.h" -#include "weak_under_alias.h" - -void __wrap_exit(int code) -{ - const char message[] = "\nProgam has exited with code:"; - - write(STDERR_FILENO, message, sizeof(message) - 1); - write_hex(STDERR_FILENO, code); - write(STDERR_FILENO, "\n", 1); - - for (;;); -} -weak_under_alias(exit); diff --git a/fpga_spn/bsp/libwrap/sys/close.c b/fpga_spn/bsp/libwrap/sys/close.c deleted file mode 100644 index 199fe51..0000000 --- a/fpga_spn/bsp/libwrap/sys/close.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_close(int fd) -{ - return _stub(EBADF); -} -weak_under_alias(close); diff --git a/fpga_spn/bsp/libwrap/sys/execve.c b/fpga_spn/bsp/libwrap/sys/execve.c deleted file mode 100644 index f7be25a..0000000 --- a/fpga_spn/bsp/libwrap/sys/execve.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_execve(const char* name, char* const argv[], char* const env[]) -{ - return _stub(ENOMEM); -} -weak_under_alias(execve); diff --git a/fpga_spn/bsp/libwrap/sys/fork.c b/fpga_spn/bsp/libwrap/sys/fork.c deleted file mode 100644 index 13a3e65..0000000 --- a/fpga_spn/bsp/libwrap/sys/fork.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int fork(void) -{ - return _stub(EAGAIN); -} diff --git a/fpga_spn/bsp/libwrap/sys/fstat.c b/fpga_spn/bsp/libwrap/sys/fstat.c deleted file mode 100644 index ff82bf9..0000000 --- a/fpga_spn/bsp/libwrap/sys/fstat.c +++ /dev/null @@ -1,18 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_fstat(int fd, struct stat* st) -{ - if (isatty(fd)) { - st->st_mode = S_IFCHR; - return 0; - } - - return _stub(EBADF); -} -weak_under_alias(fstat); diff --git a/fpga_spn/bsp/libwrap/sys/getpid.c b/fpga_spn/bsp/libwrap/sys/getpid.c deleted file mode 100644 index 195fbec..0000000 --- a/fpga_spn/bsp/libwrap/sys/getpid.c +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE of license details. */ -#include "weak_under_alias.h" - -int __wrap_getpid(void) -{ - return 1; -} -weak_under_alias(getpid); diff --git a/fpga_spn/bsp/libwrap/sys/isatty.c b/fpga_spn/bsp/libwrap/sys/isatty.c deleted file mode 100644 index 7bb82ab..0000000 --- a/fpga_spn/bsp/libwrap/sys/isatty.c +++ /dev/null @@ -1,13 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "weak_under_alias.h" - -int __wrap_isatty(int fd) -{ - if (fd == STDOUT_FILENO || fd == STDERR_FILENO) - return 1; - - return 0; -} -weak_under_alias(isatty); diff --git a/fpga_spn/bsp/libwrap/sys/kill.c b/fpga_spn/bsp/libwrap/sys/kill.c deleted file mode 100644 index 18b9bd4..0000000 --- a/fpga_spn/bsp/libwrap/sys/kill.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_kill(int pid, int sig) -{ - return _stub(EINVAL); -} -weak_under_alias(kill); diff --git a/fpga_spn/bsp/libwrap/sys/link.c b/fpga_spn/bsp/libwrap/sys/link.c deleted file mode 100644 index 0cad551..0000000 --- a/fpga_spn/bsp/libwrap/sys/link.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_link(const char *old_name, const char *new_name) -{ - return _stub(EMLINK); -} -weak_under_alias(link); diff --git a/fpga_spn/bsp/libwrap/sys/lseek.c b/fpga_spn/bsp/libwrap/sys/lseek.c deleted file mode 100644 index 4131449..0000000 --- a/fpga_spn/bsp/libwrap/sys/lseek.c +++ /dev/null @@ -1,16 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -off_t __wrap_lseek(int fd, off_t ptr, int dir) -{ - if (isatty(fd)) - return 0; - - return _stub(EBADF); -} -weak_under_alias(lseek); diff --git a/fpga_spn/bsp/libwrap/sys/open.c b/fpga_spn/bsp/libwrap/sys/open.c deleted file mode 100644 index c61415a..0000000 --- a/fpga_spn/bsp/libwrap/sys/open.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_open(const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} -weak_under_alias(open); diff --git a/fpga_spn/bsp/libwrap/sys/openat.c b/fpga_spn/bsp/libwrap/sys/openat.c deleted file mode 100644 index 227c956..0000000 --- a/fpga_spn/bsp/libwrap/sys/openat.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_openat(int dirfd, const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} -weak_under_alias(openat); diff --git a/fpga_spn/bsp/libwrap/sys/puts.c b/fpga_spn/bsp/libwrap/sys/puts.c deleted file mode 100644 index 50d6437..0000000 --- a/fpga_spn/bsp/libwrap/sys/puts.c +++ /dev/null @@ -1,28 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_puts(const char *s) -{ - while (*s != '\0') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = *s; - - if (*s == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - - ++s; - } - - return 0; -} -weak_under_alias(puts); diff --git a/fpga_spn/bsp/libwrap/sys/read.c b/fpga_spn/bsp/libwrap/sys/read.c deleted file mode 100644 index 3226cdb..0000000 --- a/fpga_spn/bsp/libwrap/sys/read.c +++ /dev/null @@ -1,32 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -ssize_t __wrap_read(int fd, void* ptr, size_t len) -{ - uint8_t * current = (uint8_t *)ptr; - volatile uint32_t * uart_rx = (uint32_t *)(UART0_CTRL_ADDR + UART_REG_RXFIFO); - volatile uint8_t * uart_rx_cnt = (uint8_t *)(UART0_CTRL_ADDR + UART_REG_RXCTRL + 2); - - ssize_t result = 0; - - if (isatty(fd)) { - for (current = (uint8_t *)ptr; - (current < ((uint8_t *)ptr) + len) && (*uart_rx_cnt > 0); - current ++) { - *current = *uart_rx; - result++; - } - return result; - } - - return _stub(EBADF); -} -weak_under_alias(read); diff --git a/fpga_spn/bsp/libwrap/sys/sbrk.c b/fpga_spn/bsp/libwrap/sys/sbrk.c deleted file mode 100644 index 12170b4..0000000 --- a/fpga_spn/bsp/libwrap/sys/sbrk.c +++ /dev/null @@ -1,18 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "weak_under_alias.h" - -void *__wrap_sbrk(ptrdiff_t incr) -{ - extern char _end[]; - extern char _heap_end[]; - static char *curbrk = _end; - - if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) - return NULL - 1; - - curbrk += incr; - return curbrk - incr; -} -weak_under_alias(sbrk); diff --git a/fpga_spn/bsp/libwrap/sys/stat.c b/fpga_spn/bsp/libwrap/sys/stat.c deleted file mode 100644 index 1576ca1..0000000 --- a/fpga_spn/bsp/libwrap/sys/stat.c +++ /dev/null @@ -1,12 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_stat(const char* file, struct stat* st) -{ - return _stub(EACCES); -} -weak_under_alias(stat); diff --git a/fpga_spn/bsp/libwrap/sys/stub.h b/fpga_spn/bsp/libwrap/sys/stub.h deleted file mode 100644 index fb5e5be..0000000 --- a/fpga_spn/bsp/libwrap/sys/stub.h +++ /dev/null @@ -1,10 +0,0 @@ -/* See LICENSE of license details. */ -#ifndef _SIFIVE_SYS_STUB_H -#define _SIFIVE_SYS_STUB_H - -static inline int _stub(int err) -{ - return -1; -} - -#endif /* _SIFIVE_SYS_STUB_H */ diff --git a/fpga_spn/bsp/libwrap/sys/times.c b/fpga_spn/bsp/libwrap/sys/times.c deleted file mode 100644 index 55969a7..0000000 --- a/fpga_spn/bsp/libwrap/sys/times.c +++ /dev/null @@ -1,12 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -clock_t __wrap_times(struct tms* buf) -{ - return _stub(EACCES); -} -weak_under_alias(times); diff --git a/fpga_spn/bsp/libwrap/sys/unlink.c b/fpga_spn/bsp/libwrap/sys/unlink.c deleted file mode 100644 index 09f4da7..0000000 --- a/fpga_spn/bsp/libwrap/sys/unlink.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_unlink(const char* name) -{ - return _stub(ENOENT); -} -weak_under_alias(unlink); diff --git a/fpga_spn/bsp/libwrap/sys/wait.c b/fpga_spn/bsp/libwrap/sys/wait.c deleted file mode 100644 index ea3225b..0000000 --- a/fpga_spn/bsp/libwrap/sys/wait.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int wait(int* status) -{ - return _stub(ECHILD); -} diff --git a/fpga_spn/bsp/libwrap/sys/weak_under_alias.h b/fpga_spn/bsp/libwrap/sys/weak_under_alias.h deleted file mode 100644 index 7629353..0000000 --- a/fpga_spn/bsp/libwrap/sys/weak_under_alias.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _BSP_LIBWRAP_WEAK_UNDER_ALIAS_H -#define _BSP_LIBWRAP_WEAK_UNDER_ALIAS_H - -#define weak_under_alias(name) \ - extern __typeof (__wrap_##name) __wrap__##name __attribute__ ((weak, alias ("__wrap_"#name))) - -#endif diff --git a/fpga_spn/bsp/libwrap/sys/write.c b/fpga_spn/bsp/libwrap/sys/write.c deleted file mode 100644 index b1e9a7e..0000000 --- a/fpga_spn/bsp/libwrap/sys/write.c +++ /dev/null @@ -1,31 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -ssize_t __wrap_write(int fd, const void* ptr, size_t len) -{ - const uint8_t * current = (const char *)ptr; - - if (isatty(fd)) { - for (size_t jj = 0; jj < len; jj++) { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = current[jj]; - - if (current[jj] == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - } - return len; - } - - return _stub(EBADF); -} -weak_under_alias(write); diff --git a/fpga_spn/raven_spn b/fpga_spn/raven_spn deleted file mode 100755 index db4b234afc3eefd25d074a835325e59d095c36db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272560 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 diff --git a/fpga_spn/src/bsp.h b/fpga_spn/src/bsp.h deleted file mode 100644 index f04f4f4..0000000 --- a/fpga_spn/src/bsp.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * bsp.h - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#ifndef BSP_H_ -#define BSP_H_ - -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -extern void trap_entry(); -#ifdef __cplusplus -} -#endif - -#endif /* BSP_H_ */ diff --git a/fpga_spn/src/delay.c b/fpga_spn/src/delay.c deleted file mode 100644 index 24070b4..0000000 --- a/fpga_spn/src/delay.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * delay.c - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#include "delay.h" - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -typedef struct { - uint32_t n; - uint32_t mult; - uint32_t shift; -} int_inverse ; - -int_inverse f_cpu_1000_inv; -int_inverse f_cpu_1000000_inv; - -uint32_t F_CPU=1000000; - -void calc_inv(uint32_t n, int_inverse * res){ - uint32_t one = ~0; - uint32_t d = one/n; - uint32_t r = one%n + 1; - if (r >= n) ++d; - if (d == 0) --d; - uint32_t shift = 0; - while ((d & 0x80000000) == 0){ - d <<= 1; - ++shift; - } - res->n = n; - res->mult = d; - res->shift = shift; -} - -uint32_t divide32_using_inverse(uint32_t n, int_inverse *inv){ - uint32_t d = (uint32_t)(((uint64_t)n * inv->mult) >> 32); - d >>= inv->shift; - if (n - d*inv->n >= inv->n) ++d; - return d; -} - -// Almost full-range 64/32 divide. -// If divisor-1 has i bits, then the answer is exact for n of up to 64-i bits -// e.g. for divisors up to a million, n can have up to 45 bits -// On RV32IM with divide32_using_inverse inlines this uses 5 multiplies, -// 33 instructions, zero branches, 3 loads, 0 stores. -uint64_t divide64_using_inverse(uint64_t n, int_inverse *inv){ - uint32_t preshift = (31 - inv->shift) & 31; - uint64_t d = (uint64_t)divide32_using_inverse(n >> preshift, inv) << preshift; - uint32_t r = n - d * inv->n; - d += divide32_using_inverse(r, inv); - return d; -} - - -uint32_t millis(){ - uint64_t x; - rdmcycle(&x); - x = divide64_using_inverse(x, &f_cpu_1000_inv); - return((uint32_t) (x & 0xFFFFFFFF)); -} - -uint32_t micros(void){ - uint64_t x; - rdmcycle(&x); - // For Power-of-two MHz F_CPU, - // this compiles into a simple shift, - // and is faster than the general solution. -#if F_CPU==16000000 - x = x / (F_CPU / 1000000); -#else -#if F_CPU==256000000 - x = x / (F_CPU / 1000000); -#else - x = divide64_using_inverse(x, &f_cpu_1000000_inv); -#endif -#endif - return((uint32_t) (x & 0xFFFFFFFF)); -} - - -void delayMS(uint32_t dwMs){ - uint64_t current, later; - rdmcycle(¤t); - later = current + dwMs * (F_CPU/1000); - if (later > current){ // usual case - while (later > current) - rdmcycle(¤t); - } else { // wrap. Though this is unlikely to be hit w/ 64-bit mcycle - while (later < current) - rdmcycle(¤t); - while (current < later) - rdmcycle(¤t); - } -} - -void delayUS(uint32_t dwUs){ - uint64_t current, later; - rdmcycle(¤t); - later = current + dwUs * (F_CPU/1000000); - if (later > current){ // usual case - while (later > current) - rdmcycle(¤t); - } else {// wrap. Though this is unlikely to be hit w/ 64-bit mcycle - while (later < current) - rdmcycle(¤t); - while (current < later) - rdmcycle(¤t); - } -} diff --git a/fpga_spn/src/delay.h b/fpga_spn/src/delay.h deleted file mode 100644 index 36ce098..0000000 --- a/fpga_spn/src/delay.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * delay.h - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#ifndef DELAY_H_ -#define DELAY_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif -extern uint32_t F_CPU; - -void delayMS(uint32_t dwMs); -void delayUS(uint32_t dwUs); - -#ifdef __cplusplus -} -#endif - -#endif /* DELAY_H_ */ diff --git a/fpga_spn/src/dma_regs.h b/fpga_spn/src/dma_regs.h deleted file mode 100644 index 6886f5e..0000000 --- a/fpga_spn/src/dma_regs.h +++ /dev/null @@ -1,62 +0,0 @@ - -#ifndef _DMA_REGS_H_ -#define _DMA_REGS_H_ - -#include -#include - -#define DMA_REG_START 0x00 -#define DMA_REG_CLEAR_INTERRUPT 0x0C -#define DMA_REG_FPGA_ADDRESS 0x10 -#define DMA_REG_SC_ADDRESS 0x20 -#define DMA_REG_OPERATION 0x30 // 0 = READ, 1 = WRITE, 2 = ALLOC, 3 = FREE -#define DMA_REG_BYTES 0x40 -#define DMA_REG_ALLOC_ADDRESS 0x50 - -template -class dma_regs { -public: - // storage declarations -// BEGIN_BF_DECL(start_t, uint32_t); -// BF_FIELD(start, 0, 1); -// END_BF_DECL() r_start; - uint32_t r_start; - - uint32_t r_address; - - uint32_t r_operation; - - uint32_t r_bytes; - - static inline uint32_t& start_reg(){ - return *reinterpret_cast(BASE_ADDR+DMA_REG_START); - } - - static inline uint32_t& clear_interrupt_reg(){ - return *reinterpret_cast(BASE_ADDR+DMA_REG_CLEAR_INTERRUPT); - } - - static inline uint32_t & fpga_address_reg(){ - return *reinterpret_cast(BASE_ADDR+DMA_REG_FPGA_ADDRESS); - } - - static inline uint32_t & sc_address_reg(){ - return *reinterpret_cast(BASE_ADDR+DMA_REG_SC_ADDRESS); - } - - static inline uint32_t & operation_reg(){ - return *reinterpret_cast(BASE_ADDR+DMA_REG_OPERATION); - } - - static inline uint32_t & bytes_reg(){ - return *reinterpret_cast(BASE_ADDR+DMA_REG_BYTES); - } - - static inline uint32_t & alloc_address_reg(){ - return *reinterpret_cast(BASE_ADDR+DMA_REG_ALLOC_ADDRESS); - } - - -}; - -#endif // _SPN_REGS_H_ diff --git a/fpga_spn/src/init.h b/fpga_spn/src/init.h deleted file mode 100644 index 8515496..0000000 --- a/fpga_spn/src/init.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef SRC_INIT_H_ -#define SRC_INIT_H_ - -#include -#include - -#include "delay.h" -#include "bsp.h" -#include "plic/plic_driver.h" - -typedef void (*function_ptr_t) (void); -//! Instance data for the PLIC. -plic_instance_t g_plic; -std::array g_ext_interrupt_handlers; -bool hw_interrupt{true}; -bool dma_interrupt{true}; - - -/*! \brief external interrupt handler - * - * routes the peripheral interrupts to the the respective handler - * - */ -extern "C" void handle_m_ext_interrupt() { - plic_source int_num = PLIC_claim_interrupt(&g_plic); - if ((int_num >=1 ) && (int_num < PLIC_NUM_INTERRUPTS)) - g_ext_interrupt_handlers[int_num](); - else - exit(1 + (uintptr_t) int_num); - PLIC_complete_interrupt(&g_plic, int_num); -} -/*! \brief dummy interrupt handler - * - */ -void no_interrupt_handler (void) {}; -/*! \brief configure the per-interrupt handler - * - */ -void configure_irq(size_t irq_num, function_ptr_t handler, unsigned char prio=1) { - g_ext_interrupt_handlers[irq_num] = handler; - // Priority must be set > 0 to trigger the interrupt. - PLIC_set_priority(&g_plic, irq_num, prio); - // Have to enable the interrupt both at the GPIO level, and at the PLIC level. - PLIC_enable_interrupt(&g_plic, irq_num); -} - -void wait_for_spn_interrupt() { - // wait until HW is done - if(hw_interrupt) { - do{ - asm("wfi"); - asm("nop"); - }while(hw_interrupt); - } - hw_interrupt=true; -} - -void wait_for_dma_interrupt() { - // wait until HW is done - if(dma_interrupt) { - do{ - asm("wfi"); - asm("nop"); - }while(dma_interrupt); - } - dma_interrupt=true; -} - -/*!\brief initializes platform - * - */ -void platform_init(){ - // UART init section TODO: clarify how to get the functions from init.c? - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; - - F_CPU=PRCI_measure_mcycle_freq(20, RTC_FREQ); - printf("core freq at %d Hz\n", F_CPU); - // initialie interupt & trap handling - write_csr(mtvec, &trap_entry); - - PLIC_init(&g_plic, PLIC_CTRL_ADDR, PLIC_NUM_INTERRUPTS, PLIC_NUM_PRIORITIES, 0); - // Disable the machine & timer interrupts until setup is done. - clear_csr(mie, MIP_MEIP); - clear_csr(mie, MIP_MTIP); - for (auto& h:g_ext_interrupt_handlers) h=no_interrupt_handler; - // Enable interrupts in general. - set_csr(mstatus, MSTATUS_MIE); - // Enable the Machine-External bit in MIE - set_csr(mie, MIP_MEIP); - - //hw_interrupt = false; -} - -#endif /* SRC_INIT_H_ */ diff --git a/fpga_spn/src/io/gpio.h b/fpga_spn/src/io/gpio.h deleted file mode 100644 index 466f2d2..0000000 --- a/fpga_spn/src/io/gpio.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * gpio.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef GPIO_H_ -#define GPIO_H_ - -#include -#include - -template -class gpio_regs { -public: - static inline uint32_t& value_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_INPUT_VAL); - } - - static inline uint32_t& input_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_INPUT_EN); - } - - static inline uint32_t& output_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_EN); - } - - static inline uint32_t& port_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_VAL); - } - - static inline uint32_t& pue_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_PULLUP_EN); - } - - static inline uint32_t& ds_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_DRIVE); - } - - static inline uint32_t& rise_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_RISE_IE); - } - - static inline uint32_t& rise_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_RISE_IP); - } - - static inline uint32_t& fall_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_FALL_IE); - } - - static inline uint32_t& fall_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_FALL_IP); - } - - static inline uint32_t& high_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_HIGH_IE); - } - - static inline uint32_t& high_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_HIGH_IP); - } - - static inline uint32_t& low_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_LOW_IE); - } - - static inline uint32_t& low_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_LOW_IP); - } - - static inline uint32_t& iof_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_IOF_EN); - } - - static inline uint32_t& iof_sel_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_IOF_SEL); - } - - static inline uint32_t& out_xor_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_XOR); - } - -}; - - - -#endif /* GPIO_H_ */ diff --git a/fpga_spn/src/io/pwm.h b/fpga_spn/src/io/pwm.h deleted file mode 100644 index 2aab61b..0000000 --- a/fpga_spn/src/io/pwm.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * pwm.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef PWM_H_ -#define PWM_H_ - -#include -#include "util/bit_field.h" -#include -#include - -template -class pwm_regs { -public: - BEGIN_BF_DECL(pwmcfg_t, uint32_t); - BF_FIELD(scale, 0, 4); - BF_FIELD(sticky, 8, 1); - BF_FIELD(zerocmp, 9, 1); - BF_FIELD(deglitch, 10, 1); - BF_FIELD(enalways, 12, 1); - BF_FIELD(enoneshot, 13, 1); - BF_FIELD(cmp0center, 16, 1); - BF_FIELD(cmp1center, 17, 1); - BF_FIELD(cmp2center, 18, 1); - BF_FIELD(cmp3center, 19, 1); - BF_FIELD(cmp0gang, 24, 1); - BF_FIELD(cmp1gang, 25, 1); - BF_FIELD(cmp2gang, 26, 1); - BF_FIELD(cmp3gang, 27, 1); - BF_FIELD(cmp0ip, 28, 1); - BF_FIELD(cmp1ip, 29, 1); - BF_FIELD(cmp2ip, 30, 1); - BF_FIELD(cmp3ip, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(pwms_t, uint32_t); - BF_FIELD(s, 0, 16); - END_BF_DECL() r_pwms; - - BEGIN_BF_DECL(pwmcmp0_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp0; - - BEGIN_BF_DECL(pwmcmp1_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp1; - - BEGIN_BF_DECL(pwmcmp2_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp2; - - BEGIN_BF_DECL(pwmcmp3_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp3; - - static inline pwmcfg_t& cfg_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CFG); - } - - static inline uint32_t& count_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_COUNT); - } - - static inline pwms_t& s_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_S); - } - - static inline pwmcmp0_t& cmp0_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP0); - } - - static inline pwmcmp1_t& cmp1_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP1); - } - - static inline pwmcmp2_t& cmp2_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP2); - } - - static inline pwmcmp3_t& cmp3_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP3); - } - - static inline bool oneshot_delay(long delay_us){ - auto scaling_factor=0; - while(delay_us/(1< std::numeric_limits::max()){ - scaling_factor++; - } - cfg_reg()=0; - count_reg()=0; - cfg_reg().scale=4+scaling_factor; // divide by 16 so we get 1us per pwm clock - cmp0_reg().cmp0 = delay_us/(1< -#include "util/bit_field.h" -#include -#include - -template -class spi_regs { -public: - // storage declarations - BEGIN_BF_DECL(sckdiv_t, uint32_t); - BF_FIELD(div, 0, 12); - END_BF_DECL(); - - BEGIN_BF_DECL(sckmode_t, uint32_t); - BF_FIELD(pha, 0, 1); - BF_FIELD(pol, 1, 1); - END_BF_DECL(); - - uint32_t r_csid; - - uint32_t r_csdef; - - BEGIN_BF_DECL(csmode_t, uint32_t); - BF_FIELD(mode, 0, 2); - END_BF_DECL(); - - BEGIN_BF_DECL(delay0_t, uint32_t); - BF_FIELD(cssck, 0, 8); - BF_FIELD(sckcs, 16, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(delay1_t, uint32_t); - BF_FIELD(intercs, 0, 16); - BF_FIELD(interxfr, 16, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(fmt_t, uint32_t); - BF_FIELD(proto, 0, 2); - BF_FIELD(endian, 2, 1); - BF_FIELD(dir, 3, 1); - BF_FIELD(len, 16, 4); - END_BF_DECL(); - - BEGIN_BF_DECL(txdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(full, 31, 1); - END_BF_DECL() r_txdata; - - BEGIN_BF_DECL(rxdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(empty, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(txmark_t, uint32_t); - BF_FIELD(txmark, 0, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(rxmark_t, uint32_t); - BF_FIELD(rxmark, 0, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(fctrl_t, uint32_t); - BF_FIELD(en, 0, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ffmt_t, uint32_t); - BF_FIELD(cmd_en, 0, 1); - BF_FIELD(addr_len, 1, 2); - BF_FIELD(pad_cnt, 3, 4); - BF_FIELD(cmd_proto, 7, 2); - BF_FIELD(addr_proto, 9, 2); - BF_FIELD(data_proto, 11, 2); - BF_FIELD(cmd_code, 16, 8); - BF_FIELD(pad_code, 24, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(ie_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ip_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - static inline sckdiv_t& sckdiv_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_SCKDIV); - } - - static inline sckmode_t& sckmode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_SCKMODE); - } - - static inline uint32_t& csid_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSID); - } - - static inline uint32_t& csdef_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSDEF); - } - - static inline csmode_t& csmode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSMODE); - } - - static inline delay0_t& dcssck_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DCSSCK); - } - - static inline uint32_t& dsckcs_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DSCKCS); - } - - static inline delay1_t& dintercs_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DINTERCS); - } - - static inline uint32_t& dinterxfr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DINTERXFR); - } - - static inline fmt_t& fmt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FMT); - } - - static inline txdata_t& txfifo_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_TXFIFO); - } - - static inline rxdata_t& rxfifo_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_RXFIFO); - } - - static inline txmark_t& txctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_TXCTRL); - } - - static inline rxmark_t& rxctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_RXCTRL); - } - - static inline fctrl_t& fctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FCTRL); - } - - static inline ffmt_t& ffmt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FFMT); - } - - static inline ie_t& ie_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_IE); - } - - static inline ip_t& ip_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_IP); - } - - template - static bool transfer(std::array& bytes){ - csmode_reg().mode=2; // HOLD mode - rxctrl_reg().rxmark=bytes.size()-1; // trigger irq if more than 2 bytes are received; - ie_reg().rxwm=1; - // write data bytes - for(size_t i=0; i -#include "util/bit_field.h" -#include - -template -class uart_regs { -public: - BEGIN_BF_DECL(txdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(full, 31, 1); - END_BF_DECL() ; - - BEGIN_BF_DECL(rxdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(empty, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(txctrl_t, uint32_t); - BF_FIELD(txen, 0, 1); - BF_FIELD(nstop, 1, 1); - BF_FIELD(txcnt, 16, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(rxctrl_t, uint32_t); - BF_FIELD(rxen, 0, 1); - BF_FIELD(rxcnt, 16, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(ie_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ip_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(div_t, uint32_t); - BF_FIELD(div, 0, 16); - END_BF_DECL(); - - static inline txdata_t& txdata_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_TXFIFO); - } - - static inline rxdata_t& rxdata_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_RXFIFO); - } - - static inline txctrl_t& txctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_TXCTRL); - } - - static inline rxctrl_t& rxctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_RXCTRL); - } - - static inline ie_t& ie_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_IE); - } - - static inline ip_t& ip_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_IP); - } - - static inline div_t& div_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_DIV); - } - -}; - -#endif /* SPI_H_ */ diff --git a/fpga_spn/src/raven_spn.cpp b/fpga_spn/src/raven_spn.cpp deleted file mode 100644 index 5399d85..0000000 --- a/fpga_spn/src/raven_spn.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#include "raven_spn.h" -#include "spn_regs.h" -#include "dma_regs.h" -#include "init.h" -#include "spn_checker_regs.h" - -using spn = spn_regs<0x90000000>; -using dma = dma_regs<0xB0000000>; -using spn_checker = spn_checker_regs<0x10040000>; - -void run_xspn(int in_addr, int out_addr, int num_samples, int in_beats, int out_beats) { - spn::mode_reg() = 0; - spn::input_length_reg() = num_samples; // each sample consists of 5 uint8 values - spn::input_addr_reg() = in_addr; - spn::output_addr_reg() = out_addr; - spn::num_of_in_beats_reg() = in_beats; // Number of AXI4 burst beats needed to load all input data - spn::num_of_out_beats_reg() = out_beats; // Number of AXI4 burst beats needed to store all result data - printf("Starting XSPN\n"); - spn::start_reg() = 1; -} - -void fpga_dma(int direction, int fpga_address, int sc_address, int num_bytes) { - dma::operation_reg() = direction; - dma::fpga_address_reg() = fpga_address; - dma::sc_address_reg() = sc_address; - dma::bytes_reg() = num_bytes; - dma::start_reg() = 1; - wait_for_dma_interrupt(); - dma::clear_interrupt_reg() = 1; -} - -int fpga_alloc(int num_bytes) { - dma::operation_reg() = 2; - dma::bytes_reg() = num_bytes; - dma::start_reg() = 1; - wait_for_dma_interrupt(); - dma::clear_interrupt_reg() = 1; - return dma::alloc_address_reg(); -} - -void fpga_free(int address) { - dma::operation_reg() = 3; - dma::fpga_address_reg() = address; - dma::start_reg() = 1; - wait_for_dma_interrupt(); - dma::clear_interrupt_reg() = 1; -} - -static void spn_interrupt_handler(){ - printf("spn_interrupt_handler\n"); - hw_interrupt = false; -} - -static void dma_interrupt_handler(){ - printf("dma_interrupt_handler\n"); - dma_interrupt = false; -} - -/*! \brief main function - * - */ -int main() { - - - platform_init(); - configure_irq(2, spn_interrupt_handler); - configure_irq(22, dma_interrupt_handler); - - - - uint32_t batch_size = spn_checker::batch_size_reg(); - uint32_t iterations = spn_checker::num_iterations_reg(); - - printf("BATCH SIZE: %d\n", batch_size); - printf("ITERATIONS: %d\n", iterations); - - - - int in_addr = 0x30000000; // place input samples in the SPI memory - int out_addr = 0x3C000000; - int out_addr2 = 0x3E000000; - - - - spn::mode_reg() = 1; - spn::start_reg() = 1; - wait_for_spn_interrupt(); - spn::interrupt_reg() = 1; - uint32_t readout = spn::readout_reg(); - printf("READOUT HW:0x%x\n", readout); - - uint32_t axi_bytes = readout; - axi_bytes = axi_bytes & 0xff; - axi_bytes = 1 << axi_bytes; - - printf("AXI Bytes: %d\n", axi_bytes); - - uint32_t sample_bytes = readout; - sample_bytes = sample_bytes >> 16; - sample_bytes = sample_bytes / 8; - - printf("Sample Bytes: %d\n", sample_bytes); - - uint32_t result_bytes = 8; - - printf("Result Bytes: %d\n", result_bytes); - - uint32_t in_bytes = batch_size * sample_bytes; - uint32_t out_bytes = batch_size * result_bytes; - - uint32_t total_in = in_bytes * iterations; - - if (total_in > (out_addr - in_addr)) { - printf("ERROR: input data requires %d bytes, only %d bytes available\n", total_in, out_addr - in_addr); - return 1; - } - if (out_bytes > (out_addr2 - out_addr)) { - printf("ERROR: output data requires %d bytes, only %d bytes available\n", out_bytes, out_addr2 - out_addr); - return 1; - } - - - uint32_t in_beats = in_bytes / axi_bytes; - if (in_beats * axi_bytes < batch_size * sample_bytes) in_beats++; - uint32_t out_beats = out_bytes / axi_bytes; - if (out_beats * axi_bytes < batch_size * result_bytes) out_beats++; - - uint32_t current_in_addr = in_addr; - int fpga_address_in = fpga_alloc(batch_size * sample_bytes + 64); - int fpga_address_out = fpga_alloc(batch_size * result_bytes + 64); - - // inject SPN input data - spn_checker::input_addr_reg() = current_in_addr; - spn_checker::num_input_samples_reg() = sample_bytes * batch_size * iterations; - spn_checker::start_data_trans_reg() = 1; - spn_checker::output_addr_reg() = out_addr; - - //run_xspn(in_addr, out_addr); - for (int k = 0; k < iterations*batch_size; k+=batch_size) { - fpga_dma(1, fpga_address_in, current_in_addr, batch_size * sample_bytes); - run_xspn(fpga_address_in, fpga_address_out, batch_size, in_beats, out_beats); - wait_for_spn_interrupt(); - spn::interrupt_reg() = 1; - printf("XSPN finished\n"); - fpga_dma(0, fpga_address_out, out_addr, batch_size * result_bytes); - spn_checker::offset_reg() = k; - spn_checker::length_reg() = batch_size; - spn_checker::start_result_check_reg() = 1; - - current_in_addr += batch_size * sample_bytes; // 5 bytes in each sample - } - - fpga_free(fpga_address_in); - fpga_free(fpga_address_out); - - return 0; -} diff --git a/fpga_spn/src/raven_spn.h b/fpga_spn/src/raven_spn.h deleted file mode 100644 index 14ff1a8..0000000 --- a/fpga_spn/src/raven_spn.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef RAVEN_SPN_H_ -#define RAVEN_SPN_H_ - -extern "C" void handle_m_ext_interrupt(); - -#endif /* RAVEN_SPN_H_ */ diff --git a/fpga_spn/src/spn_checker_regs.h b/fpga_spn/src/spn_checker_regs.h deleted file mode 100644 index ff9e250..0000000 --- a/fpga_spn/src/spn_checker_regs.h +++ /dev/null @@ -1,125 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017, MINRES Technologies GmbH -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// Created on: Thu Oct 01 15:45:55 CEST 2020 -// * spn_regs.h Author: -// -//////////////////////////////////////////////////////////////////////////////// -#pragma once - -#include -#include - -#define SPN_CNTL_REG_START_RESULT_CHECK 0x00 -#define SPN_CNTL_REG_OFFSET 0x10 -#define SPN_CNTL_REG_LENGTH 0x20 -#define SPN_CNTL_REG_OUTPUT_ADDR 0x30 -#define SPN_CNTL_REG_INPUT_ADDR 0x40 -#define SPN_CNTL_REG_NUM_INPUT_SAMPLES 0x50 -#define SPN_CNTL_REG_START_DATA_TRANS 0x60 -#define SPN_CNTL_REG_OUTPUT_ADDR2 0x70 -#define SPN_CNTL_REG_XSPN_COUNT 0x80 -#define SPN_CNTL_REG_BATCH_SIZE 0x90 -#define SPN_CNTL_REG_NUM_ITERATIONS 0xA0 - -template -class spn_checker_regs { -public: - // storage declarations -// BEGIN_BF_DECL(start_t, uint32_t); -// BF_FIELD(start, 0, 1); -// END_BF_DECL() r_start; - uint32_t r_start_result_check; - - uint32_t r_offset; - - uint32_t r_length; - - uint32_t r_output_addr; - - uint32_t r_output_addr2; - - uint32_t r_input_addr; - - uint32_t r_num_input_samples; - - uint32_t r_start_data_trans; - - uint32_t r_xspn_count; - - uint32_t r_batch_size; - - uint32_t r_num_iterations; - - static inline uint32_t& start_result_check_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_START_RESULT_CHECK); - } - - static inline uint32_t & offset_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_OFFSET); - } - - static inline uint32_t & length_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_LENGTH); - } - - static inline uint32_t & output_addr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_OUTPUT_ADDR); - } - - static inline uint32_t & output_addr2_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_OUTPUT_ADDR2); - } - - static inline uint32_t & input_addr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_INPUT_ADDR); - } - - static inline uint32_t & num_input_samples_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_NUM_INPUT_SAMPLES); - } - - static inline uint32_t& start_data_trans_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_START_DATA_TRANS); - } - - static inline uint32_t& xspn_count_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_XSPN_COUNT); - } - - static inline uint32_t& batch_size_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_BATCH_SIZE); - } - - static inline uint32_t& num_iterations_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_NUM_ITERATIONS); - } - -}; diff --git a/fpga_spn/src/spn_regs.h b/fpga_spn/src/spn_regs.h deleted file mode 100644 index a733586..0000000 --- a/fpga_spn/src/spn_regs.h +++ /dev/null @@ -1,116 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017, MINRES Technologies GmbH -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// Created on: Thu Oct 01 15:45:55 CEST 2020 -// * spn_regs.h Author: -// -//////////////////////////////////////////////////////////////////////////////// - -#ifndef _SPN_REGS_H_ -#define _SPN_REGS_H_ - -#include -#include - -#define SPN_REG_START 0x00 -#define SPN_REG_READOUT 0x10 -#define SPN_REG_MODE 0x20 -#define SPN_REG_INPUT_LENGTH 0x30 -#define SPN_REG_INPUT_ADDR 0x40 -#define SPN_REG_OUTPUT_ADDR 0x50 -#define SPN_REG_NUM_OF_INPUT_BEATS 0x60 -#define SPN_REG_NUM_OF_OUTPUT_BEATS 0x70 -#define SPN_REG_INTERRUPT 0x0C - -template -class spn_regs { -public: - // storage declarations -// BEGIN_BF_DECL(start_t, uint32_t); -// BF_FIELD(start, 0, 1); -// END_BF_DECL() r_start; - uint32_t r_start; - - uint32_t r_readout; - - uint32_t r_mode; - - uint32_t r_input_length; - - uint32_t r_input_addr; - - uint32_t r_output_addr; - - uint32_t r_num_of_input_beats; - - uint32_t r_num_of_output_beats; - -// static inline start_t& start_reg(){ -// return *reinterpret_cast(BASE_ADDR+SPN_REG_START); -// } - static inline uint32_t& start_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_START); - } - - static inline uint32_t & readout_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_READOUT); - } - - static inline uint32_t & mode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_MODE); - } - - static inline uint32_t & input_length_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_INPUT_LENGTH); - } - - static inline uint32_t & input_addr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_INPUT_ADDR); - } - - static inline uint32_t & output_addr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_OUTPUT_ADDR); - } - - static inline uint32_t & num_of_in_beats_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_NUM_OF_INPUT_BEATS); - } - - static inline uint32_t & num_of_out_beats_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_NUM_OF_OUTPUT_BEATS); - } - - static inline uint32_t & interrupt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_INTERRUPT); - } - -}; - -#endif // _SPN_REGS_H_ diff --git a/fpga_spn/src/util/bit_field.h b/fpga_spn/src/util/bit_field.h deleted file mode 100644 index d4aff48..0000000 --- a/fpga_spn/src/util/bit_field.h +++ /dev/null @@ -1,179 +0,0 @@ -/*--------------------------------------------------------- -Copyright (c) 2015 Jeff Preshing - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgement in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. ----------------------------------------------------------*/ - -#ifndef BIT_FIELD_H_ -#define BIT_FIELD_H_ - -#ifndef __CPP11OM_BITFIELD_H__ -#define __CPP11OM_BITFIELD_H__ - -#include - -//--------------------------------------------------------- -// BitFieldMember<>: Used internally by ADD_BITFIELD_MEMBER macro. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -template struct BitFieldMember { - T value; - - static_assert(Offset + Bits <= (int)sizeof(T) * 8, "Member exceeds bitfield boundaries"); - static_assert(Bits < (int)sizeof(T) * 8, "Can't fill entire bitfield with one member"); - - static const T Maximum = (T(1) << Bits) - 1; - static const T Mask = Maximum << Offset; - T maximum() const { return Maximum; } - T one() const { return T(1) << Offset; } - - operator T() const { return (value >> Offset) & Maximum; } - - BitFieldMember &operator=(T v) { - assert(v <= Maximum); // v must fit inside the bitfield member - value = (value & ~Mask) | (v << Offset); - return *this; - } - - BitFieldMember &operator+=(T v) { - assert(T(*this) + v <= Maximum); // result must fit inside the bitfield member - value += v << Offset; - return *this; - } - - BitFieldMember &operator-=(T v) { - assert(T(*this) >= v); // result must not underflow - value -= v << Offset; - return *this; - } - - BitFieldMember &operator++() { return *this += 1; } - BitFieldMember operator++(int) { // postfix form - BitFieldMember tmp(*this); - operator++(); - return tmp; - } - BitFieldMember &operator--() { return *this -= 1; } - BitFieldMember operator--(int) { // postfix form - BitFieldMember tmp(*this); - operator--(); - return tmp; - } -}; - -//--------------------------------------------------------- -// BitFieldArray<>: Used internally by ADD_BITFIELD_ARRAY macro. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -template class BitFieldArray { -public: - T value; - - static_assert(BaseOffset + BitsPerItem * NumItems <= (int)sizeof(T) * 8, "Array exceeds bitfield boundaries"); - static_assert(BitsPerItem < (int)sizeof(T) * 8, "Can't fill entire bitfield with one array element"); - - static const T Maximum = (T(1) << BitsPerItem) - 1; - T maximum() const { return Maximum; } - int numItems() const { return NumItems; } - - class Element { - private: - T &value; - int offset; - - public: - Element(T &value, int offset) - : value(value) - , offset(offset) {} - T mask() const { return Maximum << offset; } - - operator T() const { return (value >> offset) & Maximum; } - - Element &operator=(T v) { - assert(v <= Maximum); // v must fit inside the bitfield member - value = (value & ~mask()) | (v << offset); - return *this; - } - - Element &operator+=(T v) { - assert(T(*this) + v <= Maximum); // result must fit inside the bitfield member - value += v << offset; - return *this; - } - - Element &operator-=(T v) { - assert(T(*this) >= v); // result must not underflow - value -= v << offset; - return *this; - } - - Element &operator++() { return *this += 1; } - Element operator++(int) { // postfix form - Element tmp(*this); - operator++(); - return tmp; - } - Element &operator--() { return *this -= 1; } - Element operator--(int) { // postfix form - Element tmp(*this); - operator--(); - return tmp; - } - }; - - Element operator[](int i) { - assert(i >= 0 && i < NumItems); // array index must be in range - return Element(value, BaseOffset + BitsPerItem * i); - } - - const Element operator[](int i) const { - assert(i >= 0 && i < NumItems); // array index must be in range - return Element(value, BaseOffset + BitsPerItem * i); - } -}; - -//--------------------------------------------------------- -// Bitfield definition macros. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -#define BEGIN_BF_DECL(typeName, T) \ - union typeName { \ - struct Wrapper { \ - T value; \ - }; \ - Wrapper flat; \ - typeName(T v = 0) { flat.value = v; } \ - typeName &operator=(T v) { \ - flat.value = v; \ - return *this; \ - } \ - operator T &() { return flat.value; } \ - operator T() const { return flat.value; } \ - using StorageType = T; - -#define BF_FIELD(memberName, offset, bits) BitFieldMember memberName; - -#define BF_ARRAY(memberName, offset, bits, numItems) BitFieldArray memberName; - -#define END_BF_DECL() } - -#endif // __CPP11OM_BITFIELD_H__ - -#endif /* BIT_FIELD_H_ */ diff --git a/fpga_spn/src/xspn_data.cpp b/fpga_spn/src/xspn_data.cpp deleted file mode 100644 index 0b57e2a..0000000 --- a/fpga_spn/src/xspn_data.cpp +++ /dev/null @@ -1,20007 +0,0 @@ -#include -#include - -constexpr auto ln2 = std::log(2); -std::array input_data = { -0,0,0,1,0, -0,1,5,2,0, -0,0,8,0,0, -0,0,5,4,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,8,0,0, -0,0,5,0,0, -0,0,12,20,0, -0,0,4,2,0, -0,0,26,1,0, -0,0,45,0,0, -0,0,0,1,0, -0,0,6,4,0, -0,2,0,2,0, -0,0,0,2,0, -19,0,7,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,11,0,0, -0,2,0,0,0, -0,0,1,0,0, -0,0,1,0,0, -0,0,2,1,0, -0,0,0,2,0, -0,0,15,1,0, -0,0,0,0,0, -0,3,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,17,1,0, -0,0,0,0,0, -0,1,14,0,0, -0,0,21,0,0, -0,0,21,2,0, -0,0,0,0,0, -0,0,0,0,0, -1,0,10,1,0, -0,1,1,1,0, -0,1,14,1,0, -0,0,1,0,0, -0,0,17,1,0, -0,0,21,2,0, -0,0,14,0,0, -0,0,0,4,0, -0,0,2,0,0, -0,0,44,1,0, -0,1,0,0,0, -0,0,0,3,0, -0,0,1,1,0, -0,0,11,0,0, -0,0,8,2,0, -0,2,0,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,17,0,0, -0,0,19,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,4,0,0, -0,0,16,0,0, -0,0,0,2,0, -0,0,9,0,0, -0,0,14,0,0, -0,0,71,1,0, -0,0,16,0,0, -0,0,0,2,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,3,0,0, -0,1,0,4,0, -0,0,19,3,0, -0,2,5,6,0, -2,0,9,2,0, -0,0,31,0,0, -0,1,0,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,17,0,0, -0,0,15,1,0, -0,0,3,1,0, -0,0,7,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,10,2,0, -0,2,0,2,0, -0,0,0,0,0, -0,1,5,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,24,0,0, -0,0,11,0,0, -0,0,21,0,0, -0,0,0,0,0, -0,1,0,4,0, -0,0,1,2,0, -0,0,9,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,19,1,0, -1,0,1,2,0, -0,0,7,0,0, -0,0,15,5,0, -0,2,9,1,0, -0,0,20,8,0, -0,0,5,0,0, -0,0,8,2,0, -0,0,17,0,0, -0,0,0,0,0, -0,0,20,0,0, -3,0,0,10,0, -0,1,0,1,0, -0,2,0,7,0, -0,1,0,0,0, -0,0,10,0,0, -0,1,3,4,0, -0,1,6,0,0, -0,0,24,0,0, -0,0,13,2,0, -0,0,9,0,0, -0,0,30,0,0, -0,0,43,1,0, -0,0,2,0,0, -0,1,5,7,0, -0,0,0,1,0, -0,0,10,0,0, -0,0,1,0,0, -0,0,28,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,2,5,6,0, -0,0,8,9,0, -0,0,8,0,0, -0,0,3,1,0, -0,0,4,1,0, -0,1,0,4,0, -0,0,25,1,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,0,0,0, -0,1,6,0,0, -0,0,11,0,0, -0,0,6,1,0, -0,0,13,2,0, -0,0,11,0,0, -1,1,10,1,0, -0,1,0,0,0, -0,0,1,1,0, -0,0,0,1,0, -0,1,7,0,0, -0,0,0,11,0, -0,0,18,1,0, -0,0,22,0,0, -0,0,8,0,0, -0,0,12,1,0, -0,1,2,4,0, -0,0,0,1,0, -31,0,0,1,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,14,0,0, -0,0,24,0,0, -0,0,0,0,0, -0,0,4,4,0, -0,0,71,1,0, -0,1,1,0,0, -0,0,17,0,0, -0,0,7,0,0, -0,0,9,0,0, -0,0,0,3,0, -0,0,10,0,0, -0,0,16,0,0, -0,3,0,2,0, -0,0,8,2,0, -0,0,1,24,0, -0,1,4,4,0, -0,0,1,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,3,0, -5,0,0,0,0, -0,0,0,1,0, -0,1,0,0,0, -0,1,0,1,0, -0,0,44,1,0, -0,0,0,0,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,23,1,0, -0,0,25,1,0, -0,0,17,0,0, -0,0,0,0,0, -0,0,8,0,0, -48,0,4,2,0, -5,0,3,1,0, -0,0,0,0,0, -1,0,0,2,0, -0,1,1,0,0, -0,0,0,0,0, -0,0,12,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,28,1,0, -0,0,16,0,0, -0,0,10,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,24,1,0, -0,0,5,0,0, -0,0,7,0,0, -0,0,0,1,0, -0,0,7,3,0, -0,0,0,0,0, -0,0,5,0,0, -0,3,23,4,46, -0,2,4,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,10,0,0, -0,0,0,0,0, -0,3,12,0,0, -1,0,11,3,0, -0,2,6,0,0, -0,2,0,5,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,4,3,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,6,1,0, -0,0,19,1,0, -0,0,0,1,0, -0,0,9,1,0, -0,0,17,5,0, -0,0,1,3,0, -0,3,8,1,0, -0,1,1,0,0, -0,1,23,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,71, -0,1,16,2,0, -0,0,2,0,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,1,3,1, -0,2,0,2,0, -0,0,0,3,0, -0,0,16,1,0, -1,0,1,3,0, -0,0,3,0,0, -0,1,1,1,0, -0,1,1,1,0, -0,0,0,0,6, -0,0,0,1,0, -0,0,7,1,0, -0,0,7,0,0, -0,0,12,0,0, -0,1,7,3,0, -0,0,3,3,0, -19,0,7,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,38,0,0, -0,0,13,0,0, -0,0,5,0,0, -0,0,2,1,0, -0,1,0,1,0, -0,1,0,0,0, -0,0,35,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,16,2,0, -0,0,3,0,0, -0,2,7,0,0, -0,1,0,4,0, -0,0,22,6,0, -0,0,13,0,0, -0,0,3,1,0, -0,0,6,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,14,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,25,6,0, -0,0,0,1,0, -0,0,15,1,0, -4,0,2,2,0, -0,0,2,0,0, -0,0,23,3,0, -0,0,0,0,0, -0,0,1,4,0, -0,0,0,0,0, -0,1,0,1,0, -0,1,16,2,0, -0,0,1,3,0, -0,0,0,3,0, -0,0,0,3,0, -0,2,0,0,0, -0,0,2,0,0, -0,0,19,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,2,0,0, -0,0,0,0,0, -2,0,9,2,0, -0,0,19,2,0, -0,0,5,0,0, -0,1,2,4,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,8,1,0, -0,0,14,0,0, -0,0,42,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,3,1,0, -0,0,42,0,0, -0,0,1,0,0, -0,0,8,0,0, -0,0,10,0,0, -0,1,0,1,0, -1,0,1,3,0, -0,0,24,0,0, -0,0,6,2,0, -0,0,21,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,2,2,0, -0,0,14,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,18,0,0, -0,0,14,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,48,4,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,2,1,0, -0,1,19,2,0, -0,0,4,0,0, -0,1,0,2,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,22,6,0, -0,0,7,2,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,8,2,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,14,0,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,33,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,32,0,0, -0,0,3,12,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,11,1,0, -0,0,11,1,0, -0,0,0,2,0, -0,0,16,0,0, -0,0,0,3,0, -0,2,5,6,0, -0,0,18,0,0, -0,0,0,0,0, -0,1,11,4,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,21,5,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,8,0, -0,1,0,4,3, -0,0,0,1,0, -0,0,0,0,0, -0,0,1,2,0, -0,0,4,1,0, -0,0,4,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,33,2,0, -0,0,0,2,0, -0,0,1,0,0, -0,0,0,0,0, -2,0,4,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,4,0, -6,0,4,0,0, -0,5,0,4,0, -0,0,0,0,0, -0,0,14,0,0, -0,0,1,0,0, -5,0,15,1,0, -0,0,6,2,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,4,1,0, -0,0,17,0,0, -0,0,4,4,0, -0,0,1,2,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,43,1,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,16,1,0, -0,0,2,1,0, -0,0,2,1,0, -0,0,5,0,0, -0,1,0,1,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,4,3,0, -0,0,5,7,0, -0,0,0,3,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,8,9,0, -0,2,28,0,0, -0,0,21,0,0, -18,0,5,1,0, -1,0,10,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,21,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,1,8,0,0, -0,0,0,3,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,13,1,0, -0,0,0,3,0, -0,0,21,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,2,0,2,0, -0,0,0,0,0, -0,0,8,9,0, -0,0,13,0,0, -0,0,22,0,0, -0,0,3,0,0, -0,0,20,1,0, -0,0,0,0,0, -0,3,2,3,0, -0,0,18,1,0, -0,0,2,2,0, -0,0,5,0,0, -0,0,3,2,0, -0,0,4,1,0, -0,1,1,1,0, -0,3,18,1,0, -0,0,0,2,0, -0,0,3,8,0, -0,0,0,5,0, -0,0,12,2,0, -0,0,9,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,2,0,1,0, -0,14,11,2,0, -0,0,1,0,0, -11,0,2,0,0, -0,0,0,0,0, -0,1,2,4,0, -0,2,11,2,0, -0,0,15,0,0, -3,0,9,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,33,2,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,39,0,0, -0,0,2,2,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,1,0,0, -0,3,12,0,0, -0,0,5,0,0, -0,0,2,2,0, -0,0,12,1,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,0,1,0, -0,0,8,2,0, -0,0,1,0,0, -0,0,32,1,0, -0,0,15,0,0, -0,0,15,1,0, -0,1,16,0,0, -0,0,0,1,0, -0,0,18,0,0, -0,0,0,3,0, -0,0,0,12,0, -0,0,0,3,0, -0,0,4,4,0, -0,0,1,0,0, -0,1,1,1,0, -24,0,2,0,0, -3,0,0,10,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,24,0,0, -5,0,0,0,0, -0,1,0,3,0, -0,0,0,3,0, -0,1,16,2,0, -0,0,0,0,0, -0,0,0,1,71, -0,0,0,2,0, -0,0,11,0,0, -0,0,1,0,0, -0,0,8,1,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,9,1,0, -0,0,4,2,0, -0,0,13,0,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,12,1,0, -0,0,0,2,0, -0,0,1,3,0, -0,0,0,1,0, -0,0,17,0,0, -0,0,6,0,0, -0,1,7,1,0, -0,0,0,2,0, -0,0,0,0,6, -0,0,7,0,0, -0,0,0,1,0, -0,0,1,2,0, -0,0,5,2,0, -16,0,2,0,0, -0,0,20,0,0, -0,0,0,4,0, -0,0,2,1,0, -0,0,0,1,0, -0,1,7,1,0, -0,0,8,1,0, -0,0,3,0,0, -0,0,11,0,0, -0,0,0,2,0, -0,0,1,1,0, -0,1,7,1,0, -8,0,8,1,0, -0,1,16,0,0, -0,0,1,0,0, -0,0,21,1,0, -0,0,17,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,23,1,0, -1,0,10,2,0, -0,0,0,10,0, -1,0,2,1,0, -0,1,5,0,0, -0,0,1,5,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,29,0,0, -0,1,33,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,11,0,0, -0,0,0,1,0, -0,0,7,0,0, -0,0,24,0,0, -0,0,15,0,0, -0,1,13,1,0, -0,0,14,1,0, -0,0,0,5,0, -0,0,40,0,0, -0,0,1,0,0, -0,0,21,1,0, -0,0,15,0,0, -0,0,10,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,1,3,0, -0,0,5,0,0, -0,0,0,0,0, -0,1,2,4,0, -0,1,18,3,0, -0,0,0,0,0, -17,0,0,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,16,0,0, -0,4,0,2,0, -0,0,30,5,0, -0,0,3,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,1,1,0, -0,0,5,4,0, -0,0,9,1,0, -0,0,4,1,0, -0,1,38,2,0, -0,0,6,0,0, -0,0,21,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,11,0,0, -0,0,21,0,0, -0,0,4,2,0, -0,0,11,1,0, -0,0,10,4,0, -0,0,22,0,0, -0,0,22,6,0, -0,0,11,1,0, -0,0,5,0,0, -0,0,0,4,0, -0,0,0,3,0, -0,0,4,2,0, -0,0,15,1,0, -0,0,1,2,0, -0,0,0,0,0, -0,1,18,0,0, -0,0,0,0,0, -0,2,0,10,0, -0,0,1,0,0, -0,0,16,1,0, -2,0,0,0,0, -0,0,13,3,0, -0,0,0,1,0, -0,1,8,1,0, -0,2,0,2,0, -0,0,0,3,0, -0,0,2,0,0, -0,0,2,1,0, -0,0,14,0,0, -38,0,6,1,0, -0,0,14,0,0, -0,1,1,1,0, -0,0,7,1,0, -0,0,0,3,0, -0,0,39,0,0, -0,0,0,0,0, -0,2,0,0,0, -0,0,2,0,0, -0,0,0,2,0, -0,0,15,1,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,14,0,0, -0,0,0,1,0, -0,0,11,0,0, -0,1,22,0,0, -0,0,21,2,0, -0,4,33,2,1, -0,0,3,1,0, -0,0,0,3,0, -0,0,1,3,1, -0,0,1,0,0, -0,1,9,0,0, -0,0,23,3,0, -0,0,11,2,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,5,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,21,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,3,1,0, -0,0,28,1,0, -0,0,17,1,0, -0,0,6,2,0, -0,0,0,3,0, -0,0,0,8,0, -0,0,0,5,0, -0,0,8,1,0, -0,0,4,4,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,10,0, -0,0,4,2,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,10,0,0, -0,0,0,1,0, -0,0,26,1,0, -0,0,12,0,0, -0,0,26,0,0, -0,0,0,0,0, -0,0,0,2,0, -20,0,10,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,1,2,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,3,0,0, -0,0,7,1,0, -0,0,0,0,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,11,0,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,10,1,0, -0,0,2,0,0, -0,0,6,2,0, -1,1,9,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,1,1,0, -0,0,3,0,0, -0,1,0,3,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,6,1,0, -0,0,13,0,0, -0,0,7,1,0, -1,1,9,0,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,6,1,0, -0,0,2,1,0, -0,0,8,0,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,10,0,0, -0,2,42,0,0, -0,0,0,2,0, -0,0,8,3,0, -0,1,0,4,0, -0,0,10,2,0, -0,0,0,0,0, -0,0,10,1,0, -0,0,5,0,0, -0,0,45,0,0, -0,1,0,4,0, -0,0,4,3,0, -0,0,7,2,0, -0,0,5,1,0, -0,0,3,0,0, -0,0,17,0,0, -0,2,0,5,0, -0,0,9,1,0, -0,0,18,0,0, -0,0,3,2,0, -1,0,18,0,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,2,1,0, -0,0,0,0,0, -0,1,2,4,0, -0,0,9,1,0, -0,0,19,2,0, -0,0,3,0,0, -8,0,8,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,3,4,0, -0,0,0,0,0, -0,0,2,4,0, -0,0,1,1,0, -0,0,17,1,0, -0,0,3,1,0, -0,0,1,0,0, -0,0,3,0,0, -0,0,18,2,0, -0,0,2,1,0, -0,1,11,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,2,0,0,0, -0,0,9,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,1,2,0, -0,0,0,2,0, -0,1,19,1,0, -0,0,0,2,0, -0,0,20,0,0, -0,0,0,2,2, -0,0,16,2,0, -0,1,18,0,0, -0,0,9,2,0, -5,0,0,0,0, -0,0,8,9,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,9,4,0, -0,1,8,2,0, -0,1,0,1,0, -0,0,25,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,3,0,0, -0,0,20,5,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,0,1,0, -71,0,11,0,0, -0,0,0,2,0, -5,0,0,0,0, -0,1,16,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,13,2,0, -0,0,15,0,0, -0,0,23,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,9,2,0, -0,0,5,0,0, -0,0,32,1,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,40,0,0, -0,0,0,1,0, -48,0,4,2,0, -0,0,7,1,0, -0,0,3,2,0, -0,0,28,1,0, -0,0,4,0,0, -0,0,2,0,0, -0,1,0,1,0, -0,0,0,5,0, -0,0,2,1,0, -0,0,3,2,0, -0,0,7,3,0, -0,2,11,2,0, -0,0,9,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,1,10,4,0, -0,0,0,1,0, -0,0,12,0,0, -0,5,0,4,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,3,2,3,0, -0,0,1,3,0, -0,0,3,2,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,11,0,0, -0,0,1,1,0, -48,0,4,2,0, -0,0,2,0,0, -0,0,0,3,0, -0,0,24,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,24,0,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,5,0,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,17,1,0, -0,1,0,0,0, -0,0,12,0,0, -0,0,2,3,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,2,0,0, -0,0,5,0,0, -0,0,14,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,2,0,0, -0,0,0,0,0, -2,0,6,0,0, -0,0,0,0,0, -0,3,12,0,0, -0,2,0,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,17,0,0, -0,0,6,3,0, -0,0,0,1,0, -0,0,8,0,0, -1,0,10,2,0, -0,1,0,4,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,1,12,0,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,7,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,0,1,0, -0,0,25,1,0, -5,0,15,1,0, -0,3,9,2,0, -0,1,4,0,0, -0,0,3,1,0, -0,0,2,1,0, -0,0,10,0,0, -0,0,0,0,0, -0,2,8,0,0, -0,0,0,5,0, -0,3,0,5,0, -0,0,0,3,0, -0,0,57,1,0, -0,0,0,0,0, -0,0,1,2,0, -0,0,22,2,0, -0,0,0,0,0, -0,1,3,1,0, -0,0,8,4,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,0,0,0, -0,1,0,1,0, -0,14,11,2,0, -0,1,0,0,0, -0,0,9,1,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,20,0,0, -1,0,1,3,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,12,0,0, -0,0,10,0,0, -0,0,8,0,0, -0,0,6,2,0, -0,0,19,1,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,0,1,0, -0,0,3,1,0, -0,1,13,2,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,5,3,0, -0,0,21,5,0, -0,0,0,4,0, -0,0,15,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,1,1,1,0, -0,14,11,2,0, -0,1,1,0,0, -0,0,0,1,0, -0,0,14,1,0, -0,0,1,0,0, -0,0,1,1,0, -0,0,17,0,0, -0,0,13,1,0, -19,0,7,0,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,28,0,0, -0,0,1,2,0, -0,0,0,0,0, -20,0,10,0,0, -0,2,1,1,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,11,1,0, -0,0,26,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,4,2,0, -0,0,1,1,0, -0,0,12,0,0, -0,0,7,0,0, -0,0,0,0,0, -0,1,0,1,0, -1,0,3,1,0, -0,0,10,0,0, -0,0,8,5,0, -0,0,1,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,25,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,3,1,0, -0,0,8,0,0, -0,0,4,2,0, -0,0,7,0,0, -0,1,5,0,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,17,0,0, -0,1,25,7,0, -9,0,5,1,0, -0,0,3,1,0, -0,2,0,0,0, -0,0,0,0,0, -0,0,10,4,0, -0,0,28,0,0, -4,0,5,1,0, -0,0,10,0,0, -0,0,10,4,0, -0,0,0,2,0, -0,2,4,0,0, -0,0,0,0,0, -0,0,10,1,0, -0,0,4,3,0, -0,0,0,3,0, -0,0,7,2,0, -0,0,6,1,0, -8,1,0,0,0, -0,0,3,1,0, -0,0,16,0,0, -0,0,1,3,0, -0,0,0,8,0, -0,0,0,1,0, -0,0,11,2,0, -0,0,4,3,0, -1,0,0,2,0, -0,0,0,1,0, -0,0,23,0,0, -0,0,11,0,0, -0,0,0,2,0, -0,0,15,0,0, -3,0,0,10,0, -0,0,10,0,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,11,0,0, -0,0,5,7,0, -0,0,0,2,0, -0,2,14,0,0, -0,0,0,1,0, -0,0,18,1,0, -0,0,15,2,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,14,1,0, -0,0,21,1,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,0,0,0, -4,0,5,1,0, -0,0,0,1,0, -0,0,1,3,0, -0,0,6,2,0, -0,0,0,1,0, -0,0,10,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,2,1,0, -0,0,5,7,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,21,0,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,7,1,0, -0,2,42,0,0, -0,1,18,0,0, -0,3,2,2,0, -0,0,5,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,1,0, -24,0,2,0,0, -0,2,0,0,0, -0,0,13,2,0, -0,1,16,0,0, -0,0,0,0,0, -0,3,0,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,25,0,0, -0,0,0,2,0, -0,0,25,1,0, -0,0,38,0,0, -0,1,4,0,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,8,1,0, -0,0,23,0,0, -0,0,12,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,3,1,0, -0,1,11,1,0, -6,0,2,2,0, -0,0,0,2,0, -0,0,4,4,0, -0,0,0,2,0, -0,0,28,0,0, -0,0,3,0,0, -0,2,0,2,0, -0,0,3,0,0, -0,0,0,3,0, -0,3,2,2,0, -0,0,9,0,0, -0,2,42,0,0, -0,0,0,0,0, -0,0,2,3,0, -0,0,9,6,0, -0,0,0,3,0, -0,0,4,0,0, -0,0,0,3,0, -0,0,11,3,0, -0,0,1,2,0, -1,0,0,0,0, -0,0,2,2,0, -0,0,1,0,0, -0,0,10,2,0, -0,0,0,0,0, -0,0,11,1,0, -0,0,0,0,0, -0,1,15,3,0, -0,1,0,10,0, -0,0,0,0,0, -0,0,3,4,0, -24,0,2,0,0, -0,1,13,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,2,20,7,0, -0,0,3,0,0, -0,1,2,2,0, -0,0,8,8,0, -0,0,7,1,0, -0,0,6,1,0, -0,0,8,2,0, -0,0,21,0,0, -0,0,7,2,0, -0,0,0,1,0, -0,0,5,0,0, -0,1,9,0,0, -0,0,3,1,0, -0,0,3,4,0, -0,0,5,1,0, -0,2,7,0,0, -0,0,19,0,0, -0,0,9,0,0, -0,1,10,5,0, -0,0,9,1,0, -0,0,20,0,0, -0,0,11,1,0, -0,0,14,0,0, -0,0,0,0,0, -0,0,8,2,0, -0,0,30,0,0, -0,0,4,1,0, -0,0,1,2,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,2,0,0, -0,0,1,1,0, -0,0,42,0,0, -0,0,11,0,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,3,3,0, -0,1,28,1,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,1,0,0, -0,3,0,1,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,1,0,1,0, -0,0,0,1,0, -0,0,7,1,0, -0,0,5,0,0, -0,0,17,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,7,3,0, -0,0,1,2,0, -0,0,0,2,0, -0,0,13,1,0, -0,3,8,1,0, -0,0,17,0,0, -0,0,32,1,0, -0,0,0,2,0, -0,0,0,2,0, -0,1,1,2,0, -15,0,7,0,0, -0,0,12,2,0, -0,0,19,0,0, -0,0,6,1,0, -0,0,3,4,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,28,1,0, -0,0,7,1,0, -0,3,6,4,0, -0,0,5,0,0, -0,0,8,0,0, -0,0,13,2,0, -0,0,16,1,0, -31,0,0,1,0, -0,0,20,0,0, -0,0,0,3,0, -0,0,21,0,0, -0,0,4,0,0, -0,0,2,0,0, -0,0,15,1,0, -0,0,3,0,0, -0,0,21,1,0, -0,1,0,2,0, -0,3,9,2,0, -0,0,7,1,0, -0,0,2,0,0, -0,0,8,1,0, -0,0,0,3,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,30,5,0, -0,0,1,1,0, -0,0,2,2,0, -0,0,0,1,0, -0,1,1,1,0, -0,0,14,0,0, -0,0,11,0,0, -0,0,0,3,0, -0,0,24,0,0, -0,71,0,3,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,2,0,0, -0,0,0,2,0, -0,0,6,1,0, -0,0,2,1,0, -0,2,4,0,0, -0,0,11,0,0, -0,0,5,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,3,4,0, -0,0,13,0,0, -0,0,2,3,0, -0,0,0,4,0, -0,0,0,0,0, -0,3,0,2,0, -0,0,0,16,0, -0,0,0,0,0, -0,0,4,2,0, -0,0,1,0,0, -0,0,9,2,0, -0,0,1,1,0, -0,0,1,2,0, -0,0,0,1,0, -0,0,13,1,0, -0,1,5,0,0, -0,0,0,0,0, -0,0,29,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,1,7,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,40,1,0, -0,0,0,0,0, -0,1,4,0,0, -0,1,1,0,0, -0,12,0,7,0, -0,0,7,1,0, -0,0,0,2,0, -0,0,1,0,0, -0,0,3,0,0, -0,0,29,0,0, -0,0,1,0,0, -0,0,1,0,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,8,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -1,0,30,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,4,0, -0,0,0,0,0, -0,0,3,1,0, -20,0,10,0,0, -0,0,6,0,0, -0,0,18,1,0, -0,0,20,0,0, -0,0,7,0,0, -0,0,4,3,0, -0,0,18,2,0, -0,0,14,3,0, -0,0,19,1,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,46,0, -0,0,8,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,28,0,0, -0,0,0,1,0, -0,2,8,0,0, -0,1,21,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,25,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,2,4,0, -0,0,3,0,0, -15,0,7,0,0, -0,1,2,0,0, -1,0,10,2,0, -0,0,0,0,0, -0,0,33,2,0, -0,3,0,1,0, -0,0,32,1,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,5,10,0, -0,0,1,3,0, -0,0,2,1,0, -0,0,0,1,0, -16,0,2,0,0, -0,0,9,0,0, -0,0,9,0,0, -0,0,2,1,0, -0,0,1,1,0, -0,0,16,0,0, -0,0,11,1,0, -0,0,0,5,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,7,3,0, -0,0,2,0,0, -0,1,13,2,0, -0,0,0,0,0, -0,1,10,4,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,13,1,0, -0,0,0,0,0, -0,0,3,1,0, -0,1,0,2,0, -0,0,15,1,0, -17,0,0,0,0, -0,0,0,0,0, -0,0,9,4,0, -0,0,1,2,0, -0,0,4,1,0, -0,0,0,0,0, -0,1,3,0,0, -0,0,0,1,0, -15,0,17,1,0, -0,0,0,4,0, -0,0,16,0,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,2,0,0, -0,1,4,0,0, -0,0,8,2,0, -0,0,1,0,0, -0,0,18,0,0, -0,0,7,2,0, -0,0,0,1,0, -0,1,5,1,0, -0,0,8,1,0, -0,0,9,1,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,55,0,0, -0,1,1,0,0, -0,0,7,2,0, -0,0,1,2,0, -0,0,16,0,0, -0,0,12,20,0, -0,0,0,2,0, -0,0,12,1,0, -0,0,1,0,0, -0,0,2,1,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,15,0,0, -0,0,35,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,18,0,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,1,0,0, -0,0,9,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,2,0,0,0, -0,0,0,4,0, -0,0,0,0,0, -1,0,1,3,0, -0,0,9,1,0, -0,0,1,0,0, -0,0,21,1,0, -0,0,20,0,0, -0,1,12,0,0, -0,0,9,1,0, -0,0,0,0,0, -1,0,10,1,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,29,0,0, -0,1,14,1,0, -71,0,11,0,0, -0,0,12,0,0, -0,0,32,0,0, -0,0,48,1,0, -0,1,5,0,0, -0,0,7,1,0, -0,0,0,2,0, -0,1,1,1,0, -0,0,29,0,0, -0,0,0,0,0, -0,1,7,1,0, -0,1,0,1,0, -0,2,4,0,0, -0,0,1,3,0, -5,0,15,1,0, -1,0,2,1,0, -0,0,3,0,0, -0,0,0,1,71, -0,0,6,0,0, -0,1,0,0,0, -0,1,5,0,0, -0,0,4,3,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,0,1,0, -16,0,2,0,0, -0,0,0,2,0, -0,0,0,3,0, -0,1,14,3,0, -0,0,0,4,0, -0,0,10,0,0, -0,0,21,5,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,21,1,0, -0,0,38,0,0, -18,0,5,1,0, -0,0,0,0,0, -0,2,0,10,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,28,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,19,1,0, -0,0,0,0,0, -0,0,7,4,0, -0,0,4,1,0, -0,0,2,0,0, -0,0,1,1,0, -0,0,2,0,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,12,1,0, -0,0,40,0,0, -0,0,0,8,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,11,0,0, -0,1,0,1,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,28,0,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,6,0,0, -0,0,0,0,0, -0,1,0,4,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,3,0,0, -2,0,4,1,0, -0,0,11,0,0, -0,0,11,1,0, -0,3,8,1,0, -0,0,8,0,0, -0,0,5,9,0, -0,0,0,1,0, -0,1,18,0,0, -0,0,3,0,0, -0,0,38,0,0, -0,0,19,0,0, -0,1,0,1,0, -0,1,4,0,0, -0,0,0,1,0, -1,0,2,1,0, -0,0,8,0,0, -0,0,0,3,0, -0,0,7,2,0, -0,0,0,6,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,2,0,0, -0,0,16,0,0, -0,0,0,3,0, -0,0,7,2,0, -0,0,0,4,0, -0,0,7,2,0, -0,3,18,1,0, -0,0,2,0,0, -0,0,7,4,0, -0,0,10,1,0, -0,0,0,0,0, -0,0,19,1,0, -0,0,19,1,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,6,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,2,25,1,0, -0,0,0,1,0, -0,0,11,3,0, -0,0,0,4,0, -0,0,28,0,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,6,2,0, -0,0,2,1,0, -0,1,1,1,0, -0,0,12,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,12,4,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,23,0,0, -0,4,0,2,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,5,7,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,2,2,0, -1,0,8,1,0, -0,0,12,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,13,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,25,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,19,2,0, -1,0,10,1,0, -0,0,22,0,0, -0,0,0,0,0, -0,0,11,1,0, -2,0,2,0,0, -0,0,21,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,18,0,0, -0,0,0,1,0, -0,0,0,6,0, -0,0,44,1,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,2,2,0, -0,0,3,7,0, -0,0,4,2,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,10,2,0, -0,1,14,0,0, -0,1,4,2,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,0,0,0, -0,0,22,0,0, -0,0,5,2,0, -0,0,3,0,0, -0,0,8,0,0, -0,0,0,0,0, -1,0,11,1,0, -0,0,31,2,0, -0,0,24,0,0, -0,1,2,4,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,29,1,0, -0,0,0,0,0, -0,0,12,1,0, -0,0,25,1,0, -0,0,1,0,0, -0,1,11,2,0, -0,0,0,5,0, -0,0,8,1,0, -2,0,9,2,0, -0,0,39,0,0, -0,0,4,3,0, -0,0,0,3,0, -0,0,17,0,0, -0,0,0,0,0, -1,0,1,2,0, -0,0,0,3,0, -0,0,29,0,0, -0,0,0,0,0, -0,1,7,1,0, -0,0,28,2,0, -48,0,4,2,0, -31,0,0,1,0, -0,0,0,2,0, -0,0,15,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,0,0,0, -0,1,7,0,0, -0,0,15,0,0, -0,0,4,0,0, -0,0,1,0,0, -0,0,16,1,0, -0,0,1,0,0, -0,0,4,4,0, -0,0,14,0,0, -0,0,14,1,0, -0,0,0,1,0, -0,0,7,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,1,19,1,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,11,3,0, -0,0,3,0,0, -0,0,10,2,0, -0,0,11,1,0, -0,1,7,1,0, -0,1,18,3,0, -0,0,0,0,0, -0,0,3,0,0, -1,0,0,2,0, -0,0,14,3,0, -0,0,8,0,0, -0,0,0,3,0, -0,0,3,0,0, -0,0,8,1,0, -0,0,6,1,0, -0,0,9,0,0, -1,0,2,1,0, -0,0,8,1,0, -0,1,14,1,0, -0,0,42,0,0, -0,0,10,2,0, -0,0,5,9,0, -0,0,31,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,0,1,0, -0,0,2,1,0, -0,0,0,2,0, -0,0,2,0,0, -4,0,15,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,1,0,0, -0,0,8,0,0, -0,0,12,4,0, -0,0,29,0,0, -0,0,7,2,0, -27,0,19,0,0, -0,0,0,0,0, -24,0,2,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,17,1,0, -0,0,3,12,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,7,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,1,1,0, -0,0,7,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,0,1,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,13,1,0, -0,0,12,0,2, -0,0,26,1,0, -0,0,7,0,0, -0,0,1,3,0, -0,1,7,3,0, -0,0,2,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,1,5,0, -0,0,0,0,0, -0,0,32,1,0, -0,0,0,0,0, -14,0,4,0,0, -0,0,0,2,0, -0,2,4,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,6,4,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,3,1,0, -0,0,10,0,0, -0,0,5,0,0, -0,0,8,1,0, -0,0,0,2,0, -0,0,8,0,0, -0,2,0,10,0, -0,0,0,1,0, -0,0,1,2,0, -0,0,11,0,0, -0,0,19,1,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,0,3,0, -0,0,0,2,0, -1,0,1,3,0, -0,0,9,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,3,4,0, -0,0,0,1,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,4,0,0, -0,0,8,5,0, -0,0,12,0,0, -0,0,23,3,0, -0,0,16,2,0, -0,0,8,0,0, -0,0,9,0,0, -0,0,13,2,0, -0,0,8,0,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -3,0,8,2,0, -0,0,0,0,0, -0,0,2,1,0, -0,1,0,2,0, -0,1,11,2,0, -0,0,0,1,0, -0,1,0,3,0, -0,1,3,4,0, -0,1,1,1,0, -0,0,0,0,0, -0,0,24,1,0, -0,0,0,0,0, -0,0,22,0,0, -0,0,11,0,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,17,0,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,1,0, -1,0,1,3,0, -0,0,4,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,19,0,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,4,1,0, -0,0,28,0,0, -0,0,2,0,0, -0,0,11,0,0, -0,0,21,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,1,12,0,0, -0,0,0,2,0, -0,0,22,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,2,0,0, -0,2,4,1,0, -0,0,1,1,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,15,2,0, -0,1,4,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,0,1,0, -0,0,0,4,0, -0,0,0,1,0, -0,0,6,1,0, -0,0,21,1,0, -0,0,3,1,0, -0,0,4,3,0, -0,0,0,1,0, -0,1,28,0,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,9,1,0, -0,0,0,3,0, -0,0,71,1,0, -0,1,15,3,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,6,1,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,12,0,0, -0,0,3,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,2,0, -0,14,11,2,0, -9,0,0,2,0, -0,0,1,0,0, -0,0,0,3,0, -0,0,0,0,0, -31,0,0,1,0, -0,0,2,3,0, -0,0,5,0,0, -0,1,14,1,0, -0,0,5,0,0, -0,0,7,0,0, -0,0,13,0,0, -0,0,0,2,0, -0,0,12,20,0, -0,0,1,3,0, -0,0,18,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,32,0,0, -0,0,5,1,0, -0,0,8,1,0, -0,0,5,2,0, -0,0,7,1,0, -0,0,1,2,0, -0,1,0,1,0, -0,0,9,0,0, -0,0,2,0,0, -0,0,55,0,0, -0,1,27,2,0, -0,3,12,2,0, -0,0,16,0,0, -0,0,0,1,0, -0,0,8,0,0, -1,0,30,2,0, -0,0,2,1,0, -0,0,0,1,0, -0,0,0,1,0, -6,0,4,0,0, -0,1,0,4,3, -0,0,0,0,0, -48,0,4,2,0, -0,0,1,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,0,0,0, -0,1,1,0,0, -0,2,0,10,0, -0,2,4,0,0, -0,0,6,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,4,21,1,0, -0,0,1,0,0, -0,0,2,0,0, -0,0,3,0,0, -0,1,5,7,0, -0,0,5,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,13,1,0, -0,0,0,1,0, -0,0,20,0,0, -10,0,1,1,0, -3,0,0,10,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,15,0,0, -0,0,0,1,0, -0,0,11,0,0, -0,0,5,9,0, -38,0,6,1,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,0,0, -0,0,3,1,0, -0,0,1,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,1,0,0, -0,0,4,4,0, -0,0,11,1,0, -0,0,0,0,0, -0,1,3,0,0, -0,0,0,0,0, -0,0,4,0,0, -0,1,16,0,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,14,1,0, -0,0,9,0,0, -0,0,5,1,0, -0,0,0,0,0, -5,0,0,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,2,9,1,0, -0,0,14,0,0, -0,0,0,1,0, -0,0,13,0,0, -0,0,13,2,0, -0,0,20,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,13,3,0, -0,0,0,2,0, -0,2,0,2,0, -0,0,39,0,0, -0,0,0,1,0, -0,1,0,1,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,3,2,0, -0,0,10,0,0, -2,0,4,1,0, -0,1,5,1,0, -0,0,17,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,10,1,0, -0,0,0,2,0, -0,0,17,0,0, -0,0,0,0,0, -0,1,4,2,0, -0,0,4,0,0, -0,0,21,5,0, -0,0,28,1,0, -0,1,3,0,0, -0,0,28,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,2,0,7,0, -5,0,0,1,0, -0,0,2,0,0, -0,0,1,1,0, -0,0,0,1,0, -0,14,11,2,0, -0,0,19,0,0, -0,0,13,0,0, -6,0,2,2,0, -1,0,4,0,0, -0,0,17,1,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,23,0,0, -0,0,0,0,0, -0,0,23,3,0, -0,0,0,2,0, -0,0,4,2,0, -0,0,7,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,0,1,0, -0,0,4,0,0, -0,1,7,0,0, -0,0,1,0,0, -0,0,5,1,0, -0,0,11,0,0, -0,0,0,1,0, -0,0,14,0,0, -0,0,15,0,0, -0,0,9,6,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,13,41,0, -0,0,45,2,0, -0,0,0,5,0, -0,0,1,0,0, -0,0,17,1,0, -0,0,0,0,0, -0,0,33,2,0, -0,0,10,0,0, -31,0,0,1,0, -0,0,0,1,0, -1,0,10,2,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,0,3,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,17,1,0, -0,0,0,0,0, -0,0,25,1,0, -0,0,4,2,0, -0,0,2,1,0, -0,0,11,0,0, -0,0,0,3,0, -0,0,0,0,0, -32,0,1,1,0, -0,0,4,0,0, -0,0,6,0,0, -0,0,10,0,0, -0,0,9,4,0, -0,0,21,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,7,2,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,3,0,0, -0,2,4,1,0, -9,0,0,2,0, -0,0,19,1,0, -0,1,11,0,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,19,0,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,6,0,0, -0,0,5,1,0, -0,0,23,0,0, -0,0,23,0,0, -0,0,6,1,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,14,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,13,2,0, -0,0,11,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,0,1,0, -0,0,18,0,0, -0,0,5,0,0, -0,0,1,0,0, -5,0,0,1,0, -0,0,3,0,0, -0,0,6,1,0, -0,0,1,2,0, -0,0,0,3,0, -0,0,0,0,0, -0,1,22,0,0, -0,0,0,1,0, -0,0,6,4,0, -0,1,25,7,0, -0,0,0,1,0, -0,0,14,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,16,1,0, -0,0,12,4,0, -0,0,25,2,0, -0,0,24,0,0, -0,1,14,0,0, -0,0,23,0,0, -0,0,5,9,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,1,1,0,0, -0,0,1,0,0, -0,0,10,4,0, -0,1,6,0,0, -0,0,39,0,0, -0,0,0,3,0, -0,0,5,7,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,19,0,0, -0,0,0,1,0, -0,0,0,10,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,1,1,0, -0,0,12,1,0, -0,0,0,3,0, -0,0,6,1,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,0,1,0, -0,0,12,0,0, -15,0,7,0,0, -0,0,0,2,0, -0,0,20,0,0, -0,0,10,2,0, -0,0,1,1,0, -0,0,7,0,0, -0,1,14,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,1,5,7,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,12,2,0, -0,0,1,2,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,1,7,1,0, -0,1,0,3,0, -0,0,0,0,0, -0,0,25,1,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,41,0,0, -0,0,3,1,0, -0,0,28,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,1,1,0, -0,0,3,1,0, -0,0,45,0,0, -9,0,5,1,0, -0,0,38,0,0, -0,0,3,0,0, -0,0,2,0,0, -0,0,4,0,0, -0,0,0,2,0, -0,4,33,2,1, -0,0,23,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,4,0,0, -0,0,7,4,0, -0,0,1,0,0, -0,0,1,1,0, -0,0,7,1,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,6,2,0, -0,1,3,1,0, -0,0,0,1,0, -0,3,2,2,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,48,1,0, -0,0,48,1,0, -0,2,25,5,0, -0,0,16,4,0, -0,0,5,1,0, -0,0,15,1,0, -0,0,4,1,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,21,1,0, -0,0,19,3,0, -0,0,3,0,0, -0,0,8,1,0, -0,0,6,2,0, -0,0,5,2,0, -0,0,12,20,0, -0,0,15,0,0, -0,0,1,0,0, -0,0,16,0,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,0,3,0, -0,0,1,0,0, -0,0,9,0,0, -0,0,38,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,19,3,0, -0,0,7,2,0, -0,0,0,2,0, -0,0,54,0,0, -0,0,3,0,0, -0,0,0,5,0, -0,0,17,0,0, -0,0,11,0,0, -0,3,0,1,0, -0,1,10,1,0, -0,0,1,0,0, -1,0,10,2,0, -0,0,0,1,0, -0,0,0,5,0, -0,3,12,0,0, -0,0,7,4,0, -0,0,3,0,0, -5,0,0,1,0, -0,0,11,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,22,6,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,2,25,1,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,15,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,13,0,0, -0,1,5,0,0, -0,0,17,0,0, -0,4,1,1,0, -15,0,7,0,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,3,0,2,0, -0,1,19,1,0, -0,0,8,1,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,14,0,0, -0,0,0,1,0, -0,0,4,1,0, -0,0,5,1,0, -0,0,1,2,0, -1,0,0,1,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,5,1,0, -0,0,6,1,0, -0,0,30,0,0, -0,0,20,0,0, -0,0,3,0,0, -0,0,25,0,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,19,1,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,2,1,0, -0,0,12,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,3,0,1,0, -0,0,8,0,0, -0,0,7,1,0, -0,0,0,0,0, -19,0,7,0,0, -0,0,5,0,0, -0,0,2,0,0, -0,0,29,4,0, -0,1,0,3,0, -0,0,11,0,0, -0,0,22,0,0, -0,0,0,0,0, -0,1,10,1,0, -0,0,7,0,0, -0,0,27,0,0, -0,0,0,0,0, -0,0,3,4,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,0,0, -0,0,2,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,9,0,0, -0,1,11,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,14,0,0, -0,0,3,4,0, -2,0,0,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,9,0,0, -0,0,5,0,0, -0,1,8,2,0, -10,0,6,4,0, -0,0,0,0,0, -0,0,13,1,0, -0,0,28,0,0, -0,0,1,0,0, -0,0,30,0,0, -0,0,2,0,0, -0,0,5,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,14,1,0, -0,0,11,0,0, -0,0,0,2,0, -0,1,0,1,0, -0,0,21,0,0, -0,0,0,1,0, -0,0,2,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,8,0,0, -0,1,14,1,0, -0,0,21,5,0, -0,1,0,2,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,5,7,0, -0,1,3,1,0, -0,0,23,0,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,2,4,0, -0,1,8,1,0, -0,0,23,0,0, -0,0,0,0,0, -0,2,14,0,0, -0,3,0,1,0, -0,0,7,0,0, -0,1,0,0,0, -0,0,17,0,0, -0,1,2,2,0, -0,1,9,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,2,0, -0,0,8,4,0, -2,0,6,0,0, -0,0,9,0,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,3,2,0, -0,0,2,2,0, -0,0,19,1,0, -0,0,1,0,0, -0,1,4,0,0, -0,0,7,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,0,4,0, -0,0,0,0,0, -0,2,0,2,0, -0,2,8,0,0, -0,0,0,0,0, -0,3,0,2,0, -0,0,0,0,0, -0,0,22,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,2,14,0,0, -0,0,0,0,0, -0,0,22,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,2,2,0, -0,0,10,0,0, -0,0,0,4,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,0,5,0, -0,0,10,1,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,13,2,0, -0,0,9,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,13,41,0, -0,0,19,1,0, -0,0,11,0,0, -0,0,1,0,0, -0,0,13,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,14,1,0, -0,1,0,1,0, -0,1,10,1,0, -0,0,15,0,0, -0,0,0,1,0, -0,0,12,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,18,1,0, -0,0,0,0,0, -0,1,8,0,0, -0,1,2,4,0, -0,0,1,0,0, -0,0,2,0,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,32,0,0, -20,0,10,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,4,3,0, -0,0,0,0,0, -0,1,2,0,0, -0,0,30,0,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,0,3,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,17,2,0, -0,0,12,0,0, -0,0,23,0,0, -0,0,1,1,0, -0,0,5,1,0, -0,0,0,1,0, -0,0,3,0,0, -0,1,15,3,0, -0,1,4,0,0, -0,5,0,4,0, -0,1,11,0,0, -0,0,9,0,0, -0,1,5,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,7,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,16,1,0, -0,0,0,1,0, -0,0,25,1,0, -0,0,48,1,0, -0,0,10,0,0, -0,2,0,2,0, -0,0,7,0,0, -0,0,39,0,0, -0,0,0,2,0, -0,0,20,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,4,1,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,16,0,0, -0,1,0,2,0, -0,0,24,1,0, -0,0,6,1,0, -0,0,0,3,0, -0,2,25,5,0, -0,0,15,1,0, -0,0,6,1,0, -0,0,16,0,0, -0,0,4,2,0, -0,1,19,1,0, -0,0,0,0,0, -0,0,12,2,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,5,1,0, -0,0,31,0,0, -0,0,4,1,0, -0,0,2,0,0, -0,0,11,3,6, -0,0,3,1,0, -0,0,8,2,0, -0,1,12,0,0, -0,0,0,1,0, -0,2,0,2,0, -1,0,10,1,0, -0,0,6,1,0, -0,0,18,0,0, -0,0,6,2,0, -0,0,17,5,0, -0,0,0,0,0, -0,0,10,2,0, -0,0,49,3,0, -0,0,11,1,0, -0,2,0,0,0, -0,0,0,0,0, -0,1,16,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,20,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,40,0,0, -0,71,0,3,0, -0,0,30,5,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,14,1,0, -0,0,3,0,0, -0,0,22,0,0, -0,0,2,1,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,25,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,17,2,0, -0,0,49,2,0, -0,0,15,0,0, -0,0,10,1,0, -0,2,9,1,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,8,1,0, -0,0,3,1,0, -0,2,0,2,0, -0,1,9,0,0, -0,0,0,2,0, -0,0,0,0,0, -5,0,0,1,0, -0,0,0,0,0, -0,0,14,0,0, -0,0,0,2,0, -0,0,2,3,0, -0,0,6,2,0, -0,0,10,4,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,16,0,0, -0,1,0,0,0, -0,0,3,2,0, -0,0,2,0,0, -0,0,10,4,0, -0,0,0,0,0, -0,0,0,12,0, -0,0,3,0,0, -0,0,11,0,0, -0,1,11,2,0, -0,0,35,1,0, -0,0,0,1,0, -15,0,7,0,0, -0,0,1,2,0, -0,0,6,2,0, -0,0,6,1,0, -0,0,10,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,1,0,0,0, -0,1,1,1,0, -0,0,1,1,0, -0,0,13,0,0, -0,0,9,1,0, -0,1,0,1,0, -0,0,17,1,0, -0,0,8,2,0, -0,0,0,0,0, -0,1,0,3,0, -0,0,0,4,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,30,0,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,9,2,0, -0,0,20,0,0, -0,0,15,1,0, -0,0,3,7,0, -0,0,1,0,0, -0,0,38,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,2,1,0, -0,0,1,0,0, -0,0,7,3,0, -0,0,0,12,0, -0,0,20,0,0, -0,0,2,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,5,1,0, -0,0,3,1,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,7,4,0, -0,0,7,1,0, -0,0,0,10,0, -0,0,23,2,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,9,0,0, -0,0,19,0,0, -0,0,0,2,0, -0,0,3,1,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,12,4,0, -0,1,4,0,0, -0,2,0,2,0, -0,0,0,2,0, -0,0,11,1,0, -0,0,3,0,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,20,8,0, -0,0,0,0,0, -2,0,0,0,0, -0,0,0,0,0, -0,0,1,3,0, -0,0,0,3,0, -0,0,3,7,0, -0,0,11,0,0, -0,0,2,3,0, -0,1,11,0,0, -0,1,9,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,22,2,0, -0,0,17,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,25,7,0, -0,0,0,1,0, -0,0,8,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -4,0,5,1,0, -0,0,6,1,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,0,5,0, -0,0,1,0,0, -0,0,8,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,2,0,0, -0,0,18,0,0, -0,0,11,1,0, -0,0,20,0,0, -0,0,3,0,0, -0,0,19,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,4,0,2,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,0,4,0, -0,0,15,0,0, -0,0,1,3,0, -0,0,8,0,0, -0,0,3,0,0, -0,0,7,1,0, -0,0,0,2,0, -0,1,0,3,0, -0,0,22,0,0, -0,0,6,1,0, -0,0,13,3,0, -24,0,2,0,0, -11,0,2,0,0, -0,0,0,1,0, -0,0,11,1,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,10,3,0, -0,3,2,2,0, -0,0,4,1,0, -0,0,3,0,0, -0,0,4,0,0, -0,0,0,0,0, -0,0,2,3,0, -0,0,17,1,0, -0,0,7,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,15,0,0, -0,1,23,0,0, -0,0,15,0,0, -0,0,19,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,49,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,2,0, -0,0,4,0,0, -0,0,0,46,0, -0,0,0,0,0, -0,0,13,2,0, -0,0,1,0,0, -0,0,0,0,0, -2,0,4,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,7,1,0, -0,3,0,1,0, -0,0,5,1,0, -0,0,7,2,0, -0,0,0,1,0, -0,1,13,0,0, -0,0,13,1,0, -0,0,28,1,0, -0,1,2,2,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,6,2,0, -0,0,3,0,0, -0,0,7,1,0, -0,1,28,1,0, -0,0,32,1,0, -0,0,5,1,0, -0,0,5,0,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,2,3,0, -0,0,12,0,0, -0,0,4,0,0, -0,0,0,0,0, -0,0,19,1,0, -0,0,7,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,2,9,1,0, -0,0,4,4,0, -0,0,21,1,0, -0,0,12,2,0, -0,0,11,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,7,0,0, -0,0,4,0,0, -0,0,3,1,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,7,3,0, -0,2,0,7,0, -0,1,0,0,0, -0,0,0,0,0, -0,4,21,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,12,0,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,27,0,0, -0,0,6,0,0, -0,0,0,4,0, -0,0,0,3,0, -0,0,0,0,0, -5,0,3,1,0, -0,0,33,1,0, -0,0,7,3,0, -0,0,16,1,0, -0,0,2,1,0, -15,0,7,0,0, -0,0,5,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,1,2,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,23,0,0, -0,0,1,0,0, -0,0,19,0,0, -0,0,23,1,0, -0,0,8,0,0, -0,0,14,1,0, -0,2,4,0,0, -0,0,3,2,0, -0,0,28,2,0, -0,1,14,1,0, -0,0,2,4,0, -0,0,3,0,0, -0,2,0,2,0, -0,1,0,1,0, -0,0,0,1,0, -0,1,27,2,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,7,1,0, -0,3,18,1,0, -0,0,6,1,0, -1,0,10,3,0, -0,0,4,0,0, -0,0,0,0,0, -0,1,7,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,10,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,35,1,0, -0,0,0,1,0, -10,1,4,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,9,1,0, -0,0,0,1,0, -0,1,0,1,0, -0,0,26,0,0, -0,0,15,1,0, -0,0,0,1,0, -0,0,1,0,0, -3,0,8,2,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,3,2,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,9,0,0, -0,1,28,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,3,2,0, -0,0,12,1,0, -0,3,0,5,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,1,0, -2,0,6,0,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,21,0,0, -0,2,0,2,0, -0,0,0,2,0, -0,0,6,4,0, -0,1,0,0,0, -0,0,3,1,0, -0,0,0,2,0, -0,0,8,1,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,12,4,0, -0,0,4,3,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,0,1,0, -0,0,8,0,0, -0,1,2,2,0, -0,0,7,1,0, -0,0,2,0,0, -0,0,0,8,0, -0,0,8,0,0, -0,0,1,2,0, -0,0,1,3,0, -0,0,4,4,0, -0,0,15,1,0, -0,0,0,0,0, -0,0,21,0,0, -0,0,0,3,0, -0,0,15,0,0, -0,0,1,0,0, -15,0,7,0,0, -0,1,0,0,0, -0,1,0,10,0, -0,0,8,5,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,4,0, -0,5,0,4,0, -0,0,9,1,0, -0,0,57,1,0, -0,0,6,3,0, -0,0,10,0,0, -0,0,0,1,0, -0,1,15,3,0, -0,0,7,1,0, -0,0,9,0,0, -0,0,2,0,0, -0,0,3,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,6,0,0, -0,0,1,1,0, -0,0,25,1,0, -0,2,0,0,0, -0,0,10,0,0, -0,1,0,1,0, -0,0,7,0,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,4,4,0, -0,0,11,1,0, -0,1,5,1,0, -0,0,7,2,0, -0,0,0,2,0, -0,0,0,1,0, -1,0,18,0,0, -0,0,0,2,0, -0,0,5,0,0, -0,0,0,4,0, -0,0,3,7,0, -0,0,6,1,0, -0,0,12,20,0, -0,0,15,0,0, -0,0,16,1,0, -0,2,7,0,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,0,0,0, -0,2,0,1,0, -0,0,0,1,0, -0,0,28,1,0, -0,0,0,0,0, -0,0,29,0,0, -0,0,13,0,0, -0,0,5,0,0, -0,1,7,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,4,0,0, -0,0,21,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,1,0, -0,0,0,1,0, -0,2,1,1,0, -0,0,0,0,0, -0,1,13,1,0, -0,1,0,1,0, -0,0,2,1,0, -1,0,8,1,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,6,4,0, -0,1,15,6,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,11,1,0, -0,0,2,0,0, -0,0,0,2,0, -0,0,7,1,0, -0,0,17,1,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,1,1,0, -0,0,4,0,0, -24,0,2,0,0, -0,0,0,0,0, -0,0,14,0,0, -0,1,0,0,0, -9,0,5,1,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,22,0,0, -0,0,0,0,0, -0,0,19,1,0, -0,0,1,1,0, -0,0,0,0,0, -16,0,2,0,0, -0,0,29,0,0, -0,0,9,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,1,24,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,5,4,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,49,3,0, -0,0,2,0,0, -0,0,5,0,0, -0,1,13,2,0, -0,0,16,0,0, -0,0,48,4,0, -0,0,5,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,9,4,0, -0,0,0,1,0, -0,2,0,2,0, -0,0,0,2,0, -0,0,3,2,0, -0,1,9,0,0, -0,0,3,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,0,1,0, -0,1,4,0,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,2,1,0, -0,1,2,1,0, -0,0,13,0,0, -0,0,5,2,0, -0,0,29,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,5,1,0, -0,1,0,0,0, -0,0,3,1,0, -0,0,4,0,0, -0,0,0,1,0, -0,0,12,1,0, -0,0,7,3,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,0,2,2, -0,0,0,0,0, -0,0,35,1,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,2,0,2,0, -0,0,1,0,0, -0,0,9,0,0, -0,0,1,0,0, -0,0,30,5,0, -0,0,11,1,0, -0,0,11,2,0, -0,0,14,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,11,0,0, -0,0,16,0,0, -0,0,0,2,0, -0,0,11,1,0, -0,0,1,2,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,3,0,0, -0,0,1,3,0, -0,0,0,1,0, -0,0,19,1,0, -3,0,0,10,0, -0,0,3,0,0, -0,2,14,0,0, -0,0,0,0,0, -0,2,42,0,0, -0,0,13,1,0, -1,0,18,0,0, -0,0,1,0,0, -0,0,2,0,0, -0,0,0,3,0, -0,1,4,0,0, -0,0,13,0,0, -0,0,23,3,0, -0,0,13,0,0, -0,0,16,1,0, -0,0,2,0,0, -0,3,2,3,0, -0,0,14,0,0, -0,0,0,1,0, -0,0,12,2,0, -0,0,9,1,0, -1,0,2,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,13,3,0, -0,0,18,0,0, -0,0,31,2,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,28,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,1,1,0, -0,0,0,4,0, -0,2,5,6,0, -9,0,0,2,0, -0,1,0,0,0, -0,0,9,1,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,3,0,2,0, -0,0,0,3,0, -9,0,5,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,2,0,0, -0,0,38,0,0, -0,0,5,0,0, -0,0,5,0,0, -0,1,11,2,0, -0,0,4,2,0, -0,0,1,3,1, -0,0,1,2,0, -0,1,14,1,0, -0,0,1,0,0, -0,0,28,1,0, -0,0,8,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,1,3,1,0, -0,0,7,0,0, -0,0,42,0,0, -0,1,1,0,0, -0,0,14,0,0, -0,0,21,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,19,2,0, -0,1,0,3,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,2,4,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,11,0,0, -16,0,2,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,24,0,0, -0,3,12,2,0, -0,0,6,2,0, -0,0,0,2,0, -0,0,2,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,10,0,0, -8,1,0,0,0, -0,0,1,0,0, -0,0,8,4,0, -0,0,0,1,0, -0,0,10,0,0, -0,0,0,0,0, -27,0,19,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,1,2,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,12,1,0, -0,0,7,0,0, -0,0,5,0,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,24,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,3,1,0, -0,0,9,0,0, -0,0,13,1,0, -0,0,7,3,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,0,0,0, -5,0,3,1,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,1,0,0, -0,2,0,2,0, -0,0,5,1,0, -0,0,0,2,0, -0,0,0,1,0, -0,1,0,1,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,14,0,0, -0,0,0,1,0, -0,0,8,4,0, -0,0,7,0,0, -0,0,0,2,0, -1,0,0,1,0, -0,0,5,0,0, -1,0,0,0,0, -0,0,19,1,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,2,0,0, -0,0,1,24,0, -0,0,5,1,0, -0,0,5,0,0, -0,0,9,0,0, -0,0,39,0,0, -0,0,8,9,0, -0,0,35,1,0, -0,0,15,1,0, -0,0,1,0,0, -1,0,1,3,0, -0,0,11,0,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,4,3,0, -0,1,0,1,0, -0,0,0,1,0, -0,0,21,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,0,5,0, -0,0,3,0,0, -0,4,0,2,0, -0,0,0,8,0, -0,0,1,1,0, -0,1,0,0,0, -0,0,6,1,0, -0,0,4,2,0, -0,0,4,2,0, -0,0,9,0,0, -0,0,19,0,0, -0,0,0,1,0, -0,0,29,0,0, -1,0,18,0,0, -0,0,40,0,0, -0,0,4,1,0, -0,0,15,1,0, -0,0,0,1,0, -0,0,11,0,0, -0,0,13,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,22,0,0, -0,0,0,12,0, -0,0,1,0,0, -0,1,0,0,0, -0,0,5,0,0, -0,0,2,0,0, -0,0,14,0,0, -0,1,1,1,0, -0,1,27,2,0, -0,1,0,1,0, -1,1,10,1,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,14,1,0, -0,0,0,10,0, -0,0,42,0,0, -0,0,3,0,0, -20,0,10,0,0, -0,0,9,0,0, -0,0,2,0,0, -0,1,0,1,0, -0,0,3,0,0, -0,0,12,0,0, -0,0,0,2,0, -0,0,8,1,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,3,12,0, -0,0,7,1,0, -0,0,12,0,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,15,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,13,3,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,28,4,0, -0,2,25,5,0, -0,0,1,1,0, -0,0,22,6,0, -0,0,0,2,0, -0,0,8,1,0, -0,0,9,1,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -5,0,0,1,0, -0,0,0,2,0, -0,4,0,2,0, -0,0,3,0,0, -9,0,0,2,0, -0,0,2,0,0, -0,0,10,2,0, -0,0,26,1,0, -0,0,26,3,0, -0,1,11,0,0, -0,0,10,1,0, -0,0,0,0,0, -0,1,28,1,0, -0,0,0,1,0, -0,0,22,0,0, -0,0,4,0,0, -0,0,16,2,0, -0,0,2,0,0, -0,0,0,2,0, -0,1,38,2,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,19,1,0, -0,1,2,1,0, -0,0,0,0,0, -5,0,0,1,0, -0,0,0,0,0, -0,2,8,0,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,0,0,0, -0,1,0,0,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,20,0,0, -1,0,10,2,0, -0,0,16,0,0, -1,0,4,0,0, -0,0,5,1,0, -0,0,20,0,0, -0,0,4,0,0, -0,0,1,2,0, -0,0,11,0,0, -0,0,4,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,1,14,0,0, -0,0,1,2,0, -0,0,16,4,0, -0,1,0,0,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,2,0,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,0,3,0, -0,0,1,0,0, -0,3,9,2,0, -0,0,11,0,0, -0,0,44,1,0, -0,0,5,1,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,1,0, -2,0,0,0,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,12,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,3,2,0, -0,1,0,10,0, -0,0,1,0,0, -5,0,0,0,0, -0,0,7,1,0, -0,0,0,1,0, -0,0,2,1,0, -0,0,1,1,0, -0,0,4,1,0, -0,0,7,2,0, -0,0,11,3,0, -0,0,0,3,0, -16,0,2,0,0, -0,0,39,0,0, -0,0,11,0,0, -0,0,8,2,0, -0,1,18,0,0, -0,0,20,0,0, -0,4,0,2,0, -0,0,7,1,0, -2,0,0,0,0, -0,1,0,3,0, -0,0,11,1,0, -0,0,7,1,0, -0,0,1,1,0, -0,1,0,0,0, -0,0,0,2,0, -0,0,5,4,0, -0,1,2,3,0, -0,0,22,0,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,10,0,0, -0,1,30,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,30,5,0, -0,0,1,0,0, -0,0,0,3,0, -0,0,9,2,0, -0,0,9,0,0, -0,0,0,0,0, -0,1,10,5,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,0,1,0, -3,0,8,2,0, -0,0,5,9,0, -0,0,1,24,0, -0,0,11,0,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,15,1,0, -0,0,20,0,0, -0,0,7,1,0, -0,0,1,1,0, -0,1,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,2,0,0,0, -0,0,15,0,0, -0,0,12,2,0, -0,0,6,2,0, -0,0,1,1,0, -0,0,1,3,0, -0,0,5,1,0, -0,1,3,1,0, -0,0,10,1,0, -0,2,6,4,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,3,0, -0,1,1,1,0, -1,0,4,0,0, -0,0,17,5,0, -0,0,4,1,0, -5,0,0,0,0, -0,0,19,3,0, -0,0,9,0,0, -0,1,7,0,0, -0,0,1,0,0, -0,3,2,2,0, -0,0,1,3,0, -0,1,7,1,0, -0,0,0,1,0, -0,0,5,2,0, -48,0,4,2,0, -0,0,11,1,0, -0,0,0,5,0, -0,0,3,0,0, -1,0,1,2,0, -0,0,3,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,22,0,0, -0,0,0,0,0, -0,0,7,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,22,0,0, -0,0,0,1,0, -5,0,0,1,0, -0,0,18,1,0, -0,0,1,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,2,3,0, -0,1,22,0,0, -0,0,16,0,0, -0,0,0,1,0, -0,1,11,1,0, -0,0,0,1,0, -0,0,14,0,0, -0,0,0,1,0, -0,0,9,2,0, -0,2,6,0,0, -0,1,1,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,3,0,0, -0,1,0,1,0, -0,0,1,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,12,2,0, -0,0,0,1,0, -0,1,10,4,0, -0,0,0,0,0, -0,0,4,2,0, -0,1,15,1,0, -0,0,2,0,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,6,0,0, -0,0,38,0,0, -0,0,0,2,0, -0,0,12,1,0, -0,0,6,2,0, -0,1,1,1,0, -0,0,11,0,0, -0,0,0,3,0, -0,0,25,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,4,1,0, -0,1,9,1,0, -0,0,16,1,0, -0,1,11,4,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,45,2,0, -0,1,0,1,0, -0,0,15,0,0, -0,0,0,1,0, -0,0,0,6,0, -0,1,0,0,0, -0,0,3,0,0, -0,0,1,0,0, -0,0,15,1,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,17,0,0, -0,0,22,2,0, -0,0,0,0,0, -0,0,23,3,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,16,0,0, -0,0,19,0,0, -0,0,7,1,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,13,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,2,0, -0,0,3,1,0, -0,3,2,2,0, -0,0,0,1,0, -0,0,2,0,0, -0,0,4,1,0, -0,0,10,0,0, -0,0,13,0,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,4,1,0, -0,0,1,0,0, -0,0,6,2,0, -0,0,15,0,0, -0,0,7,0,0, -0,0,0,0,0, -1,0,11,3,0, -0,0,1,0,0, -0,1,13,0,0, -0,0,1,3,0, -0,0,0,0,0, -0,1,5,1,0, -0,0,11,0,0, -0,0,0,1,0, -0,0,2,0,0, -0,0,20,0,0, -0,0,0,0,0, -0,2,14,0,0, -0,0,1,0,0, -0,0,10,0,0, -0,0,1,0,0, -0,0,24,0,0, -0,1,15,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,20,5,0, -0,0,11,0,0, -0,0,0,1,0, -0,1,0,1,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,2,0, -9,0,0,2,0, -0,0,4,0,0, -0,1,1,1,0, -0,0,3,1,0, -0,0,0,3,0, -0,1,11,0,0, -0,0,0,2,0, -0,0,6,0,0, -0,0,1,0,0, -0,2,0,2,0, -0,0,1,0,0, -0,0,18,0,0, -0,0,25,6,0, -0,0,0,0,0, -0,0,1,1,0, -0,1,0,1,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,6,2,0, -0,1,5,0,0, -0,0,31,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,5,2,0, -0,0,18,0,0, -0,0,0,0,0, -0,0,14,0,0, -0,0,8,0,0, -0,0,12,1,0, -0,0,4,1,0, -0,0,0,2,0, -0,3,6,4,0, -0,0,12,0,0, -0,0,20,0,3, -0,1,0,1,0, -0,0,2,4,0, -0,0,0,1,0, -0,0,0,4,0, -0,0,2,0,0, -0,0,3,2,0, -0,0,0,0,0, -0,2,0,2,0, -0,0,6,1,0, -0,0,1,1,0, -0,0,0,5,0, -0,1,0,0,0, -0,0,0,2,0, -0,0,3,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,10,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,12,20,0, -0,2,0,0,0, -0,0,3,0,0, -0,0,28,0,0, -0,0,7,2,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,71, -0,0,1,1,0, -0,0,0,0,0, -0,0,5,7,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,19,1,0, -0,0,0,1,0, -0,1,1,1,0, -0,0,20,1,0, -0,0,0,1,0, -0,0,13,3,0, -0,1,0,0,0, -0,1,11,1,0, -0,0,13,6,0, -0,1,1,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,15,1,0, -0,0,0,0,0, -0,1,1,1,0, -0,0,24,1,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,3,0,0, -0,0,15,1,0, -0,0,10,0,0, -0,0,0,5,0, -0,0,16,0,0, -0,0,10,2,0, -0,0,11,1,0, -0,0,12,0,0, -0,0,15,1,0, -0,1,21,0,0, -0,0,5,1,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,8,0,0, -0,0,1,3,0, -0,0,0,2,0, -0,0,3,8,0, -0,0,0,1,0, -0,0,13,6,0, -0,0,4,3,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,0,5,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,5,4,0, -0,0,26,0,0, -1,0,10,2,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,18,0,0, -0,1,4,0,0, -0,0,0,4,0, -0,0,2,0,0, -0,0,0,0,0, -0,1,2,4,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,5,4,0, -0,0,7,1,0, -0,0,1,0,0, -0,0,5,2,0, -0,0,0,0,0, -0,0,4,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,19,0,0, -0,0,8,1,0, -0,0,20,8,0, -0,0,5,7,0, -0,0,13,0,0, -0,0,2,0,0, -0,0,42,0,0, -0,0,0,2,0, -0,0,23,0,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,1,1,0, -0,0,2,0,0, -0,0,9,0,0, -0,0,0,2,2, -0,0,5,1,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,1,0,0, -0,0,4,0,0, -0,0,9,4,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,12,2,0, -0,0,0,1,0, -0,0,0,2,0, -0,2,7,0,0, -0,1,12,0,0, -0,0,24,1,0, -0,0,1,0,0, -0,0,15,0,0, -0,0,0,2,0, -0,0,13,1,0, -0,0,2,0,0, -0,0,2,4,0, -0,0,3,0,0, -0,0,0,3,0, -0,1,13,0,0, -0,0,5,0,0, -0,1,13,1,0, -0,0,0,2,0, -0,0,22,0,0, -0,1,1,0,0, -0,0,5,0,0, -0,0,14,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,3,0,0, -0,0,54,0,0, -0,0,0,0,0, -0,0,8,2,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,20,8,0, -0,0,16,1,0, -4,0,2,2,0, -0,0,0,0,0, -0,0,13,2,0, -0,0,10,3,0, -0,2,0,1,0, -0,0,1,3,0, -0,1,0,0,0, -71,0,11,0,0, -0,0,2,0,0, -0,1,21,0,0, -0,0,14,0,0, -0,0,7,4,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,5,4,0, -0,2,0,2,0, -0,1,38,2,0, -0,0,0,2,0, -0,1,0,1,0, -0,0,16,0,0, -0,0,8,0,0, -10,1,4,1,0, -0,0,3,0,0, -0,0,3,0,0, -0,0,15,0,0, -0,0,23,0,0, -0,0,0,0,0, -0,0,5,2,0, -0,0,0,1,0, -0,0,0,6,0, -0,2,0,2,0, -0,0,6,4,0, -0,0,3,0,0, -0,0,14,0,0, -0,0,9,1,0, -0,3,12,2,0, -0,0,0,2,0, -0,71,0,3,0, -0,0,0,1,0, -0,0,17,1,0, -0,0,15,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,19,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,6,0, -0,0,1,1,0, -0,1,9,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,1,2,0, -0,0,14,0,0, -0,0,17,1,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,45,2,0, -0,0,8,2,0, -0,0,3,0,0, -0,1,8,1,0, -0,0,49,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,20,0,0, -0,1,0,2,0, -0,0,1,1,0, -0,0,7,1,0, -0,0,10,0,0, -0,1,10,1,0, -0,0,0,0,0, -0,0,4,2,0, -0,0,22,0,0, -0,0,0,1,0, -0,0,11,1,0, -0,0,8,1,0, -0,0,12,0,0, -0,0,3,0,0, -0,0,3,0,0, -0,2,0,2,0, -0,0,23,3,0, -0,0,14,0,0, -0,0,0,0,0, -1,0,10,2,0, -0,1,9,0,0, -0,0,0,0,0, -0,0,12,1,0, -0,0,0,0,0, -0,0,9,3,0, -0,0,4,1,0, -0,1,12,0,0, -0,1,1,1,0, -0,1,11,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,21,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,16,0,0, -0,0,4,0,0, -0,0,24,0,0, -0,0,23,0,0, -0,1,7,0,0, -0,1,10,1,0, -0,0,4,1,0, -0,0,10,0,0, -0,1,0,1,0, -0,0,3,0,0, -5,0,0,1,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,1,16,0,0, -0,0,0,2,0, -0,0,2,2,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,12,0,7,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,1,0,0, -0,0,1,2,0, -0,0,0,1,0, -0,1,10,5,0, -1,0,30,2,0, -0,0,1,2,0, -0,0,17,1,0, -0,0,3,0,0, -0,0,20,0,0, -0,1,0,1,0, -0,1,0,3,0, -0,0,2,2,0, -0,0,8,4,0, -0,0,12,0,2, -0,0,12,0,0, -0,0,15,2,0, -0,0,20,0,0, -0,0,0,0,0, -0,1,5,2,0, -0,1,1,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,8,1,0, -0,0,14,0,0, -0,1,5,2,0, -0,0,14,0,0, -0,1,0,1,0, -0,0,38,0,0, -0,0,39,0,0, -0,0,0,1,0, -0,0,22,0,0, -0,0,21,5,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,7,0,0, -0,1,11,1,0, -0,0,22,2,0, -0,0,0,0,0, -0,0,13,3,0, -0,0,3,1,0, -0,0,14,1,0, -0,0,4,2,0, -0,1,5,0,0, -0,0,25,1,0, -0,0,0,2,0, -0,0,5,10,0, -0,1,3,0,0, -0,1,1,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,0,2,0, -0,0,0,2,0, -0,0,9,0,0, -0,0,2,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,25,1,0, -0,0,17,2,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,26,0,0, -0,0,0,8,0, -0,1,12,2,0, -0,0,0,0,0, -0,0,0,2,2, -0,0,14,0,0, -0,0,29,2,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,2,2,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,4,0,0, -0,0,2,0,0, -0,0,14,1,0, -0,3,9,2,0, -0,0,10,0,0, -0,0,7,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,1,5,2,0, -0,0,0,1,0, -0,0,11,0,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,4,0,0, -0,1,12,0,0, -0,1,0,0,0, -0,0,0,8,0, -0,0,3,0,0, -0,0,6,1,0, -0,0,6,0,0, -0,0,13,1,0, -0,1,13,2,0, -0,0,1,0,0, -1,0,8,1,0, -0,0,1,0,0, -0,0,6,2,0, -0,0,2,0,0, -0,0,39,0,0, -0,0,10,0,0, -0,0,3,0,0, -0,0,2,0,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,8,1,0, -0,0,5,3,0, -0,0,10,0,0, -0,0,0,2,0, -0,1,14,1,0, -0,0,0,0,0, -0,0,7,1,0, -0,2,0,0,0, -0,0,0,1,0, -0,0,5,2,0, -0,0,1,0,0, -0,0,10,0,0, -2,0,2,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,16,0,0, -0,0,2,0,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,32,0,0, -0,1,4,4,0, -0,0,4,0,0, -0,0,39,0,0, -0,0,5,1,0, -0,0,15,2,0, -0,0,0,5,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,5,0,0, -0,0,0,0,0, -0,0,15,0,0, -0,0,0,1,0, -0,0,48,4,0, -0,0,0,0,0, -0,0,19,1,0, -0,0,24,0,0, -0,1,12,2,0, -0,0,13,0,0, -0,1,23,0,0, -0,0,5,1,0, -0,1,9,1,0, -0,2,20,7,0, -0,0,0,0,0, -0,1,0,0,0, -0,1,28,4,0, -0,0,8,3,0, -0,1,0,3,0, -0,0,0,5,0, -0,0,10,0,0, -0,0,8,2,0, -0,0,0,2,0, -0,0,8,0,0, -0,0,71,1,0, -0,1,5,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,3,23,4,46, -0,0,21,0,0, -0,3,0,2,0, -0,0,6,1,0, -0,0,12,20,0, -38,0,6,1,0, -0,0,0,1,0, -0,0,28,1,0, -0,0,0,0,0, -0,0,5,7,0, -0,0,8,9,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,3,0,0, -0,0,39,0,0, -0,0,0,1,0, -0,0,9,2,0, -0,0,2,4,0, -0,2,5,6,0, -0,0,4,0,0, -0,2,0,2,0, -0,0,0,2,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,19,0,0, -0,0,1,3,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,16,0,0, -0,2,27,4,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,1,0,1,0, -0,1,4,4,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,14,3,0, -0,0,3,1,0, -0,0,19,2,0, -0,0,35,0,0, -0,0,5,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,11,1,0, -0,0,0,1,0, -0,1,10,4,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,20,1,0, -0,0,11,0,0, -0,1,1,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,4,1,0, -0,0,8,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,5,0, -0,0,12,4,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,0,2,0, -0,0,15,1,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,45,0,0, -0,0,6,1,0, -0,0,0,4,0, -0,0,0,1,0, -0,0,7,0,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,32,1,0, -0,0,24,0,0, -27,0,19,0,0, -0,0,22,6,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,11,1,0, -0,3,18,1,0, -5,0,0,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,3,7,0, -0,0,2,1,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,2,0,0, -0,0,30,5,0, -0,0,3,1,0, -0,0,11,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,1,0,0,0, -1,0,11,3,0, -0,1,3,4,0, -0,0,9,1,0, -0,0,3,1,0, -0,0,7,0,0, -0,0,24,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,1,1,0, -0,0,2,2,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,2,0,0, -0,0,6,2,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,0,1,0, -0,1,21,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,3,0, -0,0,32,0,0, -0,0,45,0,0, -0,1,1,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,15,1,0, -0,0,17,0,0, -0,0,0,0,0, -0,0,11,0,0, -0,2,0,0,0, -0,0,9,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,8,2,0, -0,0,0,1,0, -0,1,0,3,0, -0,0,0,2,0, -0,0,4,0,0, -0,2,27,4,0, -0,0,1,0,0, -0,0,10,2,0, -0,0,10,0,0, -0,0,2,0,0, -0,1,0,4,0, -0,1,0,0,0, -0,1,0,0,0, -0,0,13,6,0, -0,0,22,0,0, -0,0,1,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,4,0,0, -0,0,10,0,0, -0,0,30,5,0, -0,0,8,1,0, -0,0,2,3,0, -0,1,27,2,0, -6,0,4,0,0, -0,0,6,2,0, -0,0,49,2,0, -0,0,21,0,0, -0,0,0,1,0, -0,0,21,0,0, -0,0,0,2,0, -0,0,30,0,0, -0,1,15,3,0, -0,0,0,1,0, -0,0,20,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,11,1,0, -0,0,0,1,0, -0,0,16,2,0, -0,0,2,1,0, -0,0,0,1,0, -0,0,1,2,0, -0,1,2,2,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,28,0,0, -0,0,9,0,0, -0,1,0,0,0, -0,1,0,1,0, -0,0,0,2,0, -0,1,28,0,0, -1,0,2,1,0, -0,0,5,0,0, -0,0,0,0,0, -0,2,20,7,0, -0,0,8,0,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,13,6,0, -0,0,28,0,0, -0,0,7,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,5,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,3,0,0, -0,0,10,0,0, -0,0,20,0,0, -0,0,2,1,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,0,0,0, -0,1,8,1,0, -0,0,5,2,0, -0,0,0,1,0, -0,0,32,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,1,0,3,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,7,1,0, -0,0,0,1,0, -1,1,10,1,0, -0,0,17,0,0, -0,0,6,0,0, -0,0,55,0,0, -0,0,2,2,0, -0,0,21,2,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,10,0,0, -20,0,10,0,0, -0,0,31,0,0, -0,0,11,0,0, -0,0,5,0,0, -0,0,0,1,0, -0,1,5,0,0, -0,0,20,0,0, -0,0,17,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,1,0,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,7,1,0, -0,0,14,0,0, -0,1,13,2,0, -0,0,0,1,0, -0,0,2,0,0, -0,0,13,0,0, -0,0,7,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,8,2,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,2,14,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,0,2,0, -0,1,3,1,0, -0,1,4,2,0, -0,2,0,7,0, -0,0,13,2,0, -0,0,1,2,0, -0,0,6,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,1,14,1,0, -0,0,13,0,0, -0,1,13,0,0, -0,0,0,0,0, -0,0,1,2,0, -0,0,11,1,0, -0,0,18,0,0, -0,0,1,3,0, -0,0,48,1,0, -0,2,9,1,0, -0,0,3,0,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,8,2,0, -0,0,0,1,0, -0,0,21,0,0, -0,0,12,0,0, -0,0,0,2,0, -0,1,15,0,0, -0,0,49,2,0, -0,0,7,1,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,2,3,0, -0,0,3,0,0, -0,1,30,0,0, -0,0,1,0,0, -0,0,20,0,0, -0,0,0,1,0, -0,0,10,1,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,5,1,0, -0,0,1,1,0, -0,0,1,3,0, -0,0,10,2,0, -0,0,6,1,0, -0,0,12,0,0, -0,0,20,5,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,18,1,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,8,1,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,9,2,0, -0,0,0,46,0, -0,0,15,0,0, -0,0,10,2,0, -0,0,12,2,0, -0,0,0,0,0, -1,0,11,1,0, -0,0,22,0,0, -0,0,4,0,0, -0,1,0,2,0, -1,0,10,3,0, -0,0,0,1,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,25,1,0, -0,0,7,2,0, -0,0,11,0,0, -0,1,4,0,0, -0,1,0,4,0, -0,0,3,0,0, -0,0,14,0,0, -0,0,7,1,0, -0,0,11,3,6, -0,0,28,0,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,20,0,0, -10,1,4,1,0, -0,0,1,1,0, -0,0,2,2,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,20,1,0, -0,0,0,0,0, -0,1,14,1,0, -0,1,3,0,0, -4,0,15,0,0, -0,0,5,0,0, -0,0,2,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,0,5,0, -0,0,0,1,0, -0,1,38,2,0, -0,0,0,1,0, -0,0,17,0,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,45,1,0, -0,1,18,0,0, -0,0,23,3,0, -0,0,0,2,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,11,0,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,7,2,0, -0,0,19,1,0, -0,0,1,1,0, -0,0,24,0,0, -0,0,49,2,0, -0,0,17,1,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,0,0,0, -0,4,0,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,5,1,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,14,3,0, -0,0,0,1,0, -0,0,0,5,0, -0,2,4,1,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,14,1,0, -0,0,0,1,0, -0,0,20,0,0, -0,0,21,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,0,3,0, -0,0,18,0,0, -0,0,49,3,0, -0,0,4,0,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,0,0,0, -18,0,5,1,0, -0,0,4,2,0, -0,0,21,0,0, -0,0,8,1,0, -0,0,0,0,0, -0,2,5,6,0, -0,0,11,0,0, -0,0,5,0,0, -0,0,21,0,0, -0,0,9,0,0, -0,0,3,0,0, -0,0,20,0,0, -0,0,3,1,0, -0,0,25,1,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,14,0,0, -0,0,2,2,0, -0,2,0,2,0, -26,0,8,1,0, -0,1,2,0,0, -0,0,1,0,0, -0,0,16,0,0, -0,2,4,0,0, -0,1,16,0,0, -20,0,10,0,0, -0,0,20,0,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,6,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,3,0,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,12,1,0, -0,0,12,4,0, -2,0,4,1,0, -0,0,6,0,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,15,1,0, -0,0,20,0,0, -0,0,10,0,0, -0,0,8,0,0, -0,0,8,1,0, -0,0,11,3,6, -0,0,2,0,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,19,2,0, -0,0,1,1,0, -0,0,55,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,1,0, -38,0,6,1,0, -0,0,7,1,0, -0,0,3,0,0, -0,0,12,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,12,4,0, -0,0,0,5,0, -0,0,3,0,0, -0,0,11,3,0, -0,0,0,1,0, -0,0,0,1,0, -2,0,6,0,0, -0,0,0,0,0, -0,0,6,1,0, -1,0,11,1,0, -0,0,0,0,0, -71,0,11,0,0, -0,0,13,0,0, -0,1,23,1,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,14,0,0, -5,0,3,1,0, -0,0,5,0,0, -0,0,0,0,0, -0,1,8,0,0, -2,0,0,0,0, -0,1,2,3,0, -16,0,2,0,0, -0,0,5,3,0, -0,1,0,0,0, -0,0,10,0,0, -0,0,21,0,0, -0,0,2,0,0, -0,1,10,1,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,20,8,0, -0,0,13,0,0, -0,0,4,1,0, -0,0,1,0,0, -0,1,0,0,0, -0,0,3,0,0, -0,0,1,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,6,0,0, -0,2,0,7,0, -0,1,6,0,0, -0,0,19,1,0, -71,0,11,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,8,0, -0,0,1,0,0, -0,0,1,0,0, -0,0,5,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,23,2,0, -0,0,0,1,0, -26,0,8,1,0, -0,0,13,0,0, -0,0,0,1,0, -0,2,25,1,0, -0,1,0,3,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,21,1,0, -0,0,17,0,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,1,0,0, -0,0,41,0,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,6,1,0, -0,0,6,0,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,2,3,0, -0,0,15,1,0, -0,0,29,0,0, -0,0,0,2,0, -0,0,71,1,0, -0,0,7,1,0, -0,1,5,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,6,3,0, -10,1,4,1,0, -0,0,1,1,0, -0,0,0,1,0, -0,1,11,0,0, -0,0,12,2,0, -0,0,24,0,0, -0,0,1,0,0, -0,0,6,1,0, -1,0,4,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,28,1,0, -0,0,13,0,0, -0,0,9,2,0, -0,0,3,1,0, -0,0,39,0,0, -0,0,8,0,0, -0,1,25,7,0, -0,1,33,3,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,38,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,3,1,0, -0,0,13,41,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,38,2,0, -0,0,1,3,0, -0,1,11,2,0, -0,0,8,0,0, -0,0,13,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,2,11,2,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,11,1,0, -10,0,1,1,0, -0,0,0,0,0, -0,0,7,3,0, -1,0,10,1,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,7,2,0, -0,0,2,2,0, -0,0,1,1,0, -1,1,10,1,0, -0,0,3,0,0, -0,0,31,2,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,12,0,2, -0,2,7,0,0, -0,0,21,1,0, -0,0,17,0,0, -0,0,5,1,0, -0,1,38,2,0, -0,0,0,0,0, -0,0,16,1,0, -0,0,2,0,0, -0,0,44,1,0, -0,0,0,0,0, -2,0,6,0,0, -0,0,8,0,0, -0,0,8,3,0, -0,0,17,0,0, -0,0,1,0,0, -0,0,28,1,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,28,1,0, -0,0,4,1,0, -0,0,4,1,0, -0,1,10,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,12,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,20,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,5,1,0, -0,0,0,2,0, -0,0,7,2,0, -0,1,22,0,0, -0,0,0,1,0, -0,0,9,2,0, -0,0,7,1,0, -0,0,2,2,0, -0,0,4,2,0, -0,0,14,0,0, -0,0,4,2,0, -1,0,10,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,30,0,0, -0,0,13,6,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,19,1,0, -0,3,2,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,1,3,0, -10,1,4,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,5,7,0, -0,0,5,56,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,19,1,0, -0,0,6,1,0, -0,0,9,1,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,20,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,1,5,0, -0,0,0,1,0, -0,1,3,0,0, -0,0,0,1,0, -0,0,5,1,0, -0,0,4,0,0, -0,1,5,0,0, -0,0,0,3,0, -0,0,2,1,0, -0,0,13,0,0, -0,0,3,0,0, -0,3,2,2,0, -0,0,3,2,0, -0,0,10,2,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,4,4,0, -0,0,3,1,0, -0,0,41,0,0, -0,0,24,0,0, -0,0,2,1,0, -0,0,3,0,0, -0,1,7,1,0, -0,0,17,0,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,19,1,0, -0,0,0,12,0, -0,0,1,2,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,5,1,0, -0,0,7,0,0, -0,1,1,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,25,0,0, -0,0,29,0,0, -0,0,4,3,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,0,2,0, -0,0,8,0,0, -0,0,8,0,0, -0,1,18,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,14,0,0, -0,0,0,1,0, -0,1,2,4,0, -0,0,11,3,0, -0,1,0,2,0, -0,0,0,1,0, -0,0,10,0,0, -0,4,0,2,0, -0,1,2,4,0, -0,0,10,9,0, -0,0,30,0,0, -0,0,4,2,0, -0,0,0,1,0, -0,0,10,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,45,0,0, -0,0,0,2,0, -15,0,7,0,0, -0,0,18,0,0, -0,0,2,0,0, -14,0,4,0,0, -0,0,4,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,18,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,1,3,0, -0,0,0,0,0, -0,1,0,1,0, -0,0,7,2,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,12,0,0, -0,0,0,2,0, -0,0,1,6,0, -0,0,0,3,0, -0,0,0,2,0, -0,1,14,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,8,2,0, -0,1,7,0,0, -0,0,10,1,0, -0,0,0,0,0, -0,0,4,4,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,7,0,0, -0,0,24,0,0, -0,0,0,2,0, -0,0,2,1,0, -0,1,0,1,0, -0,1,0,2,0, -0,3,2,2,0, -0,0,0,2,0, -0,0,19,1,0, -0,0,0,2,0, -0,0,13,0,0, -0,0,45,2,0, -0,0,9,1,0, -0,1,12,0,0, -0,0,5,1,0, -0,0,0,2,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,0,2,0, -0,0,8,0,0, -0,0,5,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,3,0, -0,4,33,2,1, -0,0,0,1,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,14,1,0, -0,0,8,4,0, -0,0,35,0,0, -0,0,3,1,0, -0,0,22,6,0, -0,0,5,0,0, -0,1,0,0,0, -0,0,6,1,0, -0,0,24,1,0, -0,2,6,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,22,0,0, -2,0,6,0,0, -0,0,19,0,0, -0,0,16,1,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,10,3,0, -1,0,30,2,0, -0,4,33,2,1, -0,0,0,0,0, -0,0,1,1,0, -0,0,6,3,0, -0,0,2,2,0, -0,0,1,0,0, -0,0,0,0,0, -1,1,9,0,0, -0,0,3,1,0, -0,0,20,0,0, -0,0,7,0,0, -0,0,0,1,0, -0,0,13,0,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,1,23,1,0, -0,1,0,1,0, -0,0,4,3,0, -0,0,6,0,0, -0,0,8,2,0, -0,0,0,2,0, -0,0,9,0,0, -0,0,3,0,0, -0,1,14,1,0, -0,0,1,0,0, -0,1,0,0,0, -0,1,7,1,0, -0,0,14,0,0, -0,0,0,0,0, -0,2,0,2,0, -0,0,3,0,0, -0,0,4,3,0, -0,0,12,4,0, -0,0,0,3,0, -0,0,20,0,0, -0,0,0,0,0, -5,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,1,10,5,0, -0,0,10,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,48,1,0, -0,0,20,0,3, -0,0,1,0,0, -0,0,6,2,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,15,1,0, -26,0,8,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,1,0, -0,0,12,0,0, -0,0,11,0,0, -0,0,3,0,0, -0,0,16,1,0, -0,0,5,0,0, -0,3,0,2,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,3,0,0, -0,0,0,0,0, -5,0,0,1,0, -0,0,1,6,0, -0,1,19,2,0, -0,1,0,1,0, -0,1,0,0,0, -1,0,10,3,0, -0,0,0,0,0, -0,0,12,20,0, -0,0,1,3,0, -0,2,0,10,0, -0,1,2,2,0, -0,0,1,0,0, -0,0,0,0,0, -0,1,11,2,0, -0,0,0,0,0, -0,1,15,6,0, -0,0,0,0,0, -0,0,21,0,0, -15,0,17,1,0, -0,0,22,2,0, -0,0,10,0,0, -0,0,16,2,0, -0,0,2,0,0, -0,0,38,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,2,0,0, -1,0,0,0,0, -0,1,14,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,14,1,0, -0,0,5,1,0, -0,0,28,1,0, -0,0,16,4,0, -0,0,19,0,0, -0,1,0,4,0, -15,0,17,1,0, -0,0,0,0,0, -0,0,19,0,0, -0,1,0,4,3, -0,0,0,0,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,48,1,0, -0,0,5,0,0, -0,0,0,2,0, -0,1,27,2,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,1,11,2,0, -5,0,15,1,0, -0,0,0,1,0, -0,0,21,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,5,0,0, -0,0,0,2,0, -0,0,28,1,0, -0,1,3,4,0, -0,0,0,2,0, -0,0,20,0,0, -0,1,14,3,0, -0,0,0,0,0, -0,1,6,0,0, -0,0,0,2,0, -0,0,10,9,0, -0,0,9,2,0, -0,1,0,4,0, -0,0,30,0,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,2,1,0, -0,0,20,1,0, -0,0,1,5,0, -0,0,0,1,0, -0,0,28,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,20,0,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,0,1,0, -0,2,14,0,0, -1,0,4,0,0, -0,0,0,0,0, -0,1,14,0,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,1,2,4,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,1,0,0, -0,0,0,5,0, -0,0,8,2,0, -0,0,48,4,0, -18,0,5,1,0, -0,0,6,2,0, -0,0,5,0,0, -0,0,31,0,0, -0,0,0,0,0, -10,1,4,1,0, -0,0,23,0,0, -0,0,10,0,0, -0,0,1,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,33,2,0, -0,5,0,4,0, -0,0,16,1,0, -0,0,29,4,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,2,2,0, -0,0,0,3,0, -0,0,24,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,25,1,0, -0,0,39,0,0, -0,0,0,3,0, -0,1,4,0,0, -0,0,5,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,18,0,0, -0,0,2,1,0, -0,3,8,1,0, -0,2,9,1,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,4,2,0, -31,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,3,1,0, -0,2,1,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,15,0,0, -0,0,11,0,0, -0,14,11,2,0, -0,0,1,0,0, -0,0,29,4,0, -0,0,0,1,0, -1,0,0,2,0, -0,0,0,1,0, -0,0,10,2,0, -0,0,15,0,0, -0,0,27,0,0, -0,0,0,0,0, -19,0,7,0,0, -0,0,0,3,0, -0,0,10,0,0, -0,0,31,2,0, -0,0,0,1,0, -0,0,2,2,0, -0,0,2,1,0, -0,0,4,1,0, -0,0,18,0,0, -0,0,9,2,0, -0,0,14,71,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,1,6,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,0,0, -1,0,10,3,0, -0,0,0,0,0, -0,1,5,0,0, -0,0,5,2,0, -0,0,4,0,0, -0,1,14,0,0, -0,0,11,1,0, -0,0,4,1,0, -0,0,0,3,0, -19,0,7,0,0, -0,0,30,0,0, -0,0,22,0,0, -0,1,4,0,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,3,2,3,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,8,0, -0,0,5,0,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,15,0,0, -0,0,0,5,0, -0,0,4,0,0, -0,0,2,2,0, -0,0,8,0,0, -0,0,1,0,0, -0,0,5,0,0, -0,0,38,0,0, -0,0,0,0,0, -0,0,21,0,0, -0,0,0,2,0, -0,0,18,0,0, -0,0,0,1,0, -0,0,0,1,0, -5,0,0,1,0, -0,0,0,0,0, -0,0,13,3,0, -0,1,10,1,0, -0,0,0,0,0, -10,0,1,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,32,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,1,13,2,0, -0,2,7,0,0, -0,1,3,0,0, -0,0,24,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,1,14,1,0, -0,0,0,0,0, -0,0,4,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,8,1,0, -0,0,1,1,0, -0,0,0,5,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,1,1,0, -0,1,18,3,0, -0,0,10,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,5,1,0, -0,0,10,0,0, -0,0,4,1,0, -0,0,5,2,0, -0,1,7,0,0, -0,0,0,2,0, -0,0,6,1,0, -0,0,49,2,0, -0,0,7,1,0, -0,0,12,4,0, -0,0,6,1,0, -0,1,4,4,0, -0,0,21,0,0, -0,0,22,0,0, -0,0,16,1,0, -0,0,0,2,0, -0,0,3,8,0, -0,3,0,5,0, -0,0,17,0,0, -0,0,1,2,0, -0,3,0,1,0, -0,0,0,7,0, -0,0,0,1,0, -0,1,8,1,0, -0,2,9,1,0, -0,0,0,1,0, -0,0,0,4,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,7,3,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,6,2,0, -0,0,5,1,0, -0,0,7,0,0, -0,1,0,0,0, -6,0,2,2,0, -0,0,0,8,0, -0,0,23,2,0, -0,0,2,0,0, -0,0,0,2,0, -0,0,13,0,0, -0,0,19,1,0, -0,4,1,1,0, -0,0,49,3,0, -0,1,4,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,0,1,0, -1,0,0,0,0, -0,0,0,1,0, -0,0,8,3,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,14,3,0, -0,0,0,1,0, -8,1,0,0,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,12,4,0, -0,0,6,0,0, -0,0,9,6,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,7,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,2,9,0,0, -0,0,5,0,0, -0,1,0,10,0, -0,0,12,0,0, -0,0,0,3,0, -0,0,23,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,9,3,0, -0,3,8,1,0, -0,0,35,0,0, -0,1,28,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,2,2,0, -0,0,8,2,0, -0,1,0,0,0, -0,0,12,4,0, -2,0,9,2,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,2,0,0, -0,0,21,5,0, -0,0,2,1,0, -0,0,16,4,0, -0,0,1,1,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,26,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,14,1,0, -0,0,0,1,0, -0,1,0,1,0, -0,1,1,2,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,1,0,0, -0,0,1,3,0, -0,0,18,2,0, -0,2,0,1,0, -0,0,22,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,7,1,0, -0,0,0,0,0, -0,0,0,1,0, -4,0,2,2,0, -0,0,0,3,0, -0,1,0,1,0, -0,0,11,0,0, -0,0,3,2,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,2,2,0, -0,0,16,0,0, -0,0,45,1,0, -0,0,2,1,0, -38,0,6,1,0, -1,0,3,1,0, -0,3,12,2,0, -0,0,11,1,0, -0,0,16,1,0, -0,0,12,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,9,2,0, -0,0,8,2,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,40,0,0, -0,0,3,0,0, -71,0,11,0,0, -0,0,16,0,0, -0,0,8,9,0, -0,1,1,0,0, -0,0,13,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,29,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,24,0,0, -0,0,26,0,0, -0,1,2,1,0, -0,0,0,1,0, -5,0,0,0,0, -0,0,23,3,0, -0,0,2,0,0, -0,0,11,0,0, -0,0,7,0,0, -0,0,0,1,0, -0,0,8,9,0, -0,0,1,5,0, -0,0,7,0,0, -0,0,0,1,0, -0,0,12,0,2, -0,1,13,2,0, -0,0,6,2,0, -0,0,1,0,0, -0,0,30,0,0, -0,0,0,16,0, -0,0,1,1,0, -0,0,71,1,0, -0,2,0,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,4,0, -16,0,2,0,0, -0,0,7,1,0, -0,1,0,1,0, -0,0,21,0,0, -0,1,4,4,0, -0,0,0,4,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,25,1,0, -0,1,2,2,0, -0,0,12,0,2, -5,0,0,0,0, -0,0,19,0,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,2,0,0, -0,1,1,1,0, -0,0,9,0,0, -0,1,3,0,0, -0,2,11,2,0, -0,3,0,2,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,1,0, -16,0,2,0,0, -0,0,24,0,0, -0,0,29,0,0, -0,0,3,1,0, -0,0,1,1,0, -0,0,7,3,0, -0,0,2,4,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,29,2,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,24,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,0,1,0, -0,0,19,0,0, -0,0,15,0,0, -0,0,0,1,0, -0,0,19,2,0, -0,0,5,4,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,41,0,0, -0,0,0,0,0, -0,0,2,0,0, -2,0,2,0,0, -0,1,7,1,0, -0,0,3,0,0, -0,0,17,2,0, -0,0,0,1,0, -0,0,10,0,0, -0,0,1,3,0, -0,0,0,0,0, -0,0,0,2,0, -1,0,10,3,0, -0,1,16,0,0, -0,0,15,0,0, -0,0,14,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,9,4,0, -0,0,2,0,0, -0,0,11,0,0, -0,0,11,4,0, -0,0,9,4,0, -0,1,0,0,0, -0,0,4,0,0, -0,0,0,10,0, -0,0,0,3,0, -0,0,0,1,0, -0,3,0,1,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,2,0,0, -1,0,0,2,0, -0,0,8,5,0, -11,0,2,0,0, -0,0,6,4,0, -0,0,4,3,0, -0,0,19,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,8,2,0, -1,0,9,1,0, -0,0,7,3,0, -0,0,0,1,0, -0,2,0,2,0, -0,0,6,2,0, -0,1,1,1,0, -0,0,0,4,0, -0,0,0,2,0, -0,0,6,2,0, -0,0,5,0,0, -9,0,5,1,0, -0,0,6,2,0, -0,0,0,5,0, -0,2,5,6,0, -0,0,0,0,0, -0,0,30,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,9,1,0, -0,0,31,2,0, -0,0,15,0,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,0,0, -2,0,9,2,0, -0,0,0,0,0, -0,0,12,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,12,1,0, -0,0,42,0,0, -0,0,0,3,0, -5,0,15,1,0, -0,0,18,0,0, -0,1,5,0,0, -0,0,0,2,0, -0,0,5,1,0, -0,0,23,3,0, -0,0,0,3,0, -0,0,14,0,0, -0,0,17,0,0, -0,0,1,0,0, -0,0,9,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,22,0,0, -0,0,0,1,0, -71,0,11,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,40,1,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,0,3,0, -0,1,11,0,0, -0,0,0,2,0, -0,0,17,0,0, -0,0,12,0,0, -0,0,19,0,0, -0,0,3,1,0, -0,0,1,1,0, -0,0,1,2,0, -0,0,1,2,0, -0,0,6,4,0, -0,0,0,1,0, -0,14,11,2,0, -0,0,11,3,6, -0,0,6,1,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,1,1,0, -0,1,0,1,0, -0,0,10,1,0, -0,0,0,0,0, -0,0,16,2,0, -3,0,8,2,0, -0,0,8,0,0, -0,0,0,0,0, -11,0,2,0,0, -0,0,0,0,0, -0,0,10,2,0, -0,1,7,1,0, -0,0,0,1,0, -0,0,7,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,10,1,0, -0,0,0,1,0, -0,1,7,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -1,0,10,2,0, -0,0,14,71,0, -0,0,0,1,0, -0,0,8,8,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,0,0,0, -0,0,13,2,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,13,6,0, -0,0,12,0,0, -0,0,6,0,0, -0,0,1,0,0, -0,1,1,1,0, -0,0,1,0,0, -1,0,4,0,0, -0,0,0,2,0, -0,0,3,1,0, -0,0,2,0,0, -0,0,2,1,0, -4,0,5,1,0, -0,0,13,0,0, -0,0,11,2,0, -0,0,0,0,0, -0,0,5,1,0, -0,0,14,0,0, -0,0,20,0,0, -0,0,13,1,0, -0,0,17,0,0, -0,0,0,0,0, -0,3,23,4,46, -0,0,1,0,0, -0,0,7,4,0, -5,0,0,1,0, -0,0,6,2,0, -0,0,20,0,0, -0,0,3,4,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,2,2,0, -0,3,12,2,0, -0,1,2,1,0, -0,2,11,2,0, -0,1,14,0,0, -0,4,1,1,0, -0,0,40,0,0, -0,0,0,0,0, -0,0,0,0,0, -10,0,1,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,2,0, -0,0,0,0,0, -0,1,14,0,0, -0,0,0,0,0, -0,0,4,0,0, -0,2,42,0,0, -0,0,0,2,0, -16,0,2,0,0, -0,0,0,0,0, -0,0,3,1,0, -1,0,11,1,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,14,1,0, -0,0,48,4,0, -0,1,0,0,0, -0,0,3,0,0, -0,0,17,0,0, -0,0,0,0,0, -0,0,5,2,0, -0,0,5,2,0, -0,1,0,4,0, -0,0,8,1,0, -0,0,0,2,0, -0,0,45,0,0, -0,0,4,0,0, -0,1,7,3,0, -0,0,6,3,0, -0,0,0,0,0, -0,1,1,1,0, -0,0,5,2,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,1,4,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,2,25,5,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,2,2,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,15,0,0, -0,4,0,2,0, -0,0,4,1,0, -0,0,0,3,0, -10,0,6,4,0, -0,1,28,0,0, -0,0,0,1,0, -0,0,8,1,0, -0,0,12,0,0, -0,0,0,1,0, -0,0,24,0,0, -0,0,2,1,0, -0,0,1,1,0, -0,0,13,1,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,4,0,0, -0,2,28,0,0, -0,0,18,0,0, -0,0,3,1,0, -0,0,17,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,2,3,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,5,2,0, -0,0,3,0,0, -0,1,16,0,0, -0,0,16,1,0, -0,0,11,0,0, -0,1,0,3,0, -0,0,13,0,0, -0,0,8,0,0, -0,0,0,10,0, -0,0,0,12,0, -0,0,0,0,0, -2,0,4,1,0, -0,0,23,0,0, -0,0,0,1,0, -0,0,18,0,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,12,0,0, -0,4,1,1,0, -0,0,2,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,7,3,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,5,0,0, -0,0,6,3,0, -0,0,0,1,0, -0,0,29,4,0, -0,0,2,2,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,2,0,5,0, -0,0,20,0,0, -0,0,0,2,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,28,2,0, -0,0,14,0,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,17,0,0, -0,0,9,2,0, -0,0,0,1,0, -0,0,1,2,0, -0,0,4,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,3,0, -0,0,3,0,0, -0,1,0,4,3, -0,0,8,3,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,29,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,5,0, -0,0,0,1,0, -0,0,13,0,0, -0,0,4,0,0, -0,0,0,2,0, -10,0,6,4,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,2,25,5,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,6,1,0, -0,0,24,0,0, -0,0,11,0,0, -0,0,20,1,0, -0,0,4,2,0, -1,0,30,2,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,28,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,1,0,0,0, -0,0,20,8,0, -0,0,0,3,0, -0,0,6,3,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,0,3,0, -0,0,3,0,0, -0,0,10,2,0, -0,0,1,1,0, -1,1,10,1,0, -0,0,4,1,0, -0,1,15,6,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,21,0,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,13,0,0, -0,0,2,0,0, -0,0,12,0,0, -0,0,28,1,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,14,1,0, -0,0,14,1,0, -0,0,0,1,0, -0,0,0,12,0, -0,0,1,0,0, -0,0,42,0,0, -0,0,7,0,0, -6,0,2,2,0, -0,0,11,0,0, -0,0,9,0,0, -0,0,17,0,0, -0,0,23,3,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,5,0, -4,0,5,1,0, -0,0,0,0,0, -0,0,7,2,0, -0,0,0,1,0, -0,0,7,2,0, -0,0,6,2,0, -0,1,2,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,7,2,0, -0,0,15,5,0, -1,1,9,0,0, -0,0,0,5,0, -0,0,4,2,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,2,0, -0,0,0,1,0, -0,0,4,1,0, -0,0,29,0,0, -0,0,0,0,0, -0,3,9,2,0, -1,0,8,1,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,18,0,0, -0,0,2,1,0, -9,0,0,2,0, -3,0,0,10,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,5,7,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,1,10,1,0, -0,0,7,2,0, -0,0,20,0,0, -0,0,0,2,0, -0,0,43,1,0, -0,0,0,0,0, -0,3,12,0,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,1,0,0, -0,0,5,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,11,1,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,0,2,0, -0,0,8,2,0, -0,0,4,0,0, -0,1,23,1,0, -0,0,7,3,0, -0,0,0,2,0, -0,0,1,3,0, -0,1,5,1,0, -0,0,15,1,0, -0,0,4,0,0, -0,0,9,1,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,6,2,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,3,2,0, -0,0,10,0,0, -0,0,5,0,0, -0,1,0,0,0, -0,0,8,0,0, -0,0,4,1,0, -0,0,14,0,0, -0,0,0,1,0, -0,0,30,0,0, -0,0,7,0,0, -0,0,3,1,0, -0,0,22,0,0, -0,0,10,2,0, -0,0,3,4,0, -0,0,0,1,0, -0,0,24,1,0, -0,0,0,0,0, -0,0,10,1,0, -0,1,1,1,0, -0,0,32,0,0, -0,0,19,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,8,1,0, -0,0,28,1,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,7,2,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,5,0,0, -0,0,26,1,0, -0,0,0,1,0, -0,0,31,0,0, -0,1,4,2,0, -5,0,0,0,0, -0,0,6,1,0, -0,4,33,2,1, -0,0,8,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,8,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,3,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,19,0,0, -0,0,30,0,0, -0,0,0,0,0, -0,2,1,1,0, -0,0,21,1,0, -0,0,0,0,0, -0,0,8,2,0, -0,0,1,1,0, -0,0,0,16,0, -0,0,10,4,0, -0,0,31,2,0, -0,0,1,0,0, -2,0,2,0,0, -0,0,0,1,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,5,1,0, -0,2,0,5,0, -1,0,11,3,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,6,2,0, -0,0,15,2,0, -0,1,0,1,0, -10,1,4,1,0, -0,0,13,6,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,8,4,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,6,2,0, -0,0,21,5,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,21,5,0, -0,0,14,0,0, -0,0,21,0,0, -8,0,8,1,0, -0,1,10,1,0, -0,0,2,1,0, -0,0,26,1,0, -0,0,8,2,0, -0,1,4,0,0, -0,0,16,2,0, -0,0,0,1,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,22,2,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,11,0,0, -0,0,12,4,0, -0,0,31,2,0, -0,0,11,2,0, -0,2,4,0,0, -1,1,10,1,0, -0,2,4,0,0, -0,0,8,1,0, -19,0,7,0,0, -0,0,11,4,0, -0,0,1,3,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,14,1,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,10,1,0, -0,2,0,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,19,0,0, -0,0,1,0,0, -0,0,11,3,6, -0,0,0,0,0, -0,0,23,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,8,5,0, -0,0,9,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,12,0,0, -0,0,17,2,0, -0,0,24,0,0, -0,0,48,4,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,1,1,0, -0,0,1,0,0, -0,0,26,1,0, -0,0,5,0,0, -0,0,9,0,0, -0,1,11,4,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,13,0,0, -0,2,0,7,0, -0,0,1,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,1,0,1,0, -0,0,13,0,0, -0,0,2,0,0, -0,0,15,0,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,21,0,0, -0,3,2,3,0, -0,0,14,1,0, -0,0,0,1,0, -0,0,2,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,28,1,0, -0,0,6,1,0, -0,0,3,1,0, -0,0,5,0,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,1,3,1, -0,0,5,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,21,1,0, -0,0,7,3,0, -15,0,7,0,0, -0,0,1,1,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,2,0,0, -0,1,0,0,0, -0,0,22,0,0, -0,0,3,0,0, -0,0,3,1,0, -0,0,0,2,0, -0,0,6,2,0, -0,0,2,0,0, -38,0,6,1,0, -0,0,0,0,0, -0,0,0,0,0, -5,0,0,1,0, -2,0,0,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,2,3,0, -0,0,33,1,0, -0,0,0,0,0, -0,1,2,1,0, -0,0,22,2,0, -0,3,0,1,0, -0,0,0,1,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,1,0,0, -0,0,3,1,0, -0,0,12,1,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,12,0,0, -0,0,0,1,0, -0,0,16,1,0, -0,1,0,0,0, -0,0,4,1,0, -0,0,23,2,0, -0,0,1,0,0, -0,1,19,1,0, -0,0,0,0,0, -0,0,13,2,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,0,0,0, -0,1,15,1,0, -0,0,2,0,0, -0,0,31,0,0, -0,0,3,0,0, -2,0,0,0,0, -0,0,6,0,0, -0,0,11,0,0, -0,0,9,0,0, -0,0,5,0,0, -0,0,0,1,0, -1,0,1,2,0, -0,0,0,0,0, -0,0,3,7,0, -0,0,0,1,0, -24,0,2,0,0, -0,0,3,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,26,3,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,14,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,3,1,0, -0,0,18,2,0, -0,0,19,0,0, -0,0,3,2,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,2,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,15,1,0, -17,0,0,0,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,6,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,2,2,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,0,4,0, -0,1,14,3,0, -0,0,7,1,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,35,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,2,0,7,0, -0,0,10,1,0, -0,0,0,1,0, -0,2,0,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,14,0,0, -0,1,0,0,0, -0,0,5,0,0, -0,0,4,3,0, -0,0,9,4,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,6,1,0, -0,1,12,2,0, -0,0,5,0,0, -0,0,4,2,0, -0,0,2,0,0, -0,0,9,3,0, -0,0,1,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,14,0,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,17,0,0, -0,0,17,1,0, -0,0,6,0,0, -0,1,2,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,9,2,0, -32,0,1,1,0, -0,0,0,46,0, -0,0,3,0,0, -0,3,8,1,0, -0,0,0,0,0, -3,0,8,2,0, -0,0,22,0,0, -0,0,1,0,0, -0,0,3,2,0, -0,0,45,1,0, -0,0,14,0,0, -0,0,0,0,0, -0,4,21,1,0, -0,0,0,2,0, -0,0,2,1,0, -0,0,0,12,0, -0,0,0,1,0, -0,0,14,3,0, -0,0,0,2,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,48,1,0, -0,0,19,0,0, -0,0,0,1,0, -0,0,8,2,0, -0,2,27,4,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,38,0,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,48,1,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,1,71, -0,1,0,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,0,16,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,0,5,0, -0,1,18,0,0, -0,1,0,0,0, -0,1,4,0,0, -0,0,10,0,0, -0,1,8,1,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,1,5,7,0, -0,0,0,3,0, -0,2,0,1,0, -0,0,0,0,0, -0,0,7,1,0, -0,0,8,0,0, -0,3,0,1,0, -0,3,18,1,0, -0,0,25,1,0, -1,0,1,3,0, -0,0,9,2,0, -0,0,1,0,0, -0,0,11,1,0, -0,0,0,0,0, -0,1,28,4,0, -0,0,0,46,0, -0,0,3,0,0, -0,0,0,2,0, -0,0,19,0,0, -10,1,4,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,4,0,0, -0,0,12,0,0, -0,0,4,3,0, -0,0,14,0,0, -0,0,11,0,0, -0,0,19,0,0, -0,0,15,0,0, -0,0,1,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,2,1,0, -0,1,21,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,0,0,0, -0,4,21,1,0, -0,0,12,0,0, -0,0,8,1,0, -0,0,17,0,0, -0,0,7,3,0, -0,0,15,5,0, -0,2,1,1,0, -0,0,6,0,0, -0,1,9,1,0, -0,0,14,1,0, -0,0,16,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,1,0,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,30,0,0, -0,2,0,2,0, -1,0,9,1,0, -0,0,19,2,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,10,0,0, -0,0,11,0,0, -0,0,13,0,0, -0,2,14,0,0, -0,0,0,0,0, -0,0,4,2,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,3,4,0, -0,0,0,1,0, -0,0,2,2,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,5,1,0, -0,1,7,1,0, -0,0,11,3,0, -0,0,2,2,0, -0,0,20,1,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,8,0,0, -0,0,4,1,0, -0,0,0,2,0, -0,0,5,0,0, -0,0,12,1,0, -0,1,11,0,0, -0,0,1,0,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,7,2,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,46,0, -0,2,9,1,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,0,6, -0,0,0,3,0, -0,0,39,0,0, -0,0,0,2,0, -0,0,25,0,0, -0,0,19,1,0, -0,0,12,0,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,3,8,0, -0,0,18,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,40,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,4,1,0, -0,0,15,0,0, -0,0,0,0,0, -0,3,23,4,46, -0,0,3,1,0, -0,2,42,0,0, -0,3,0,2,0, -0,0,3,0,0, -0,0,2,0,0, -0,0,0,6,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,14,1,0, -0,0,2,0,0, -0,0,0,0,0, -31,0,0,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,1,5,0,0, -0,0,16,4,0, -0,0,0,0,0, -0,0,10,2,0, -0,0,4,0,0, -0,1,0,0,0, -5,0,0,1,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,23,0,0, -0,0,0,0,0, -0,2,8,0,0, -0,0,33,2,0, -0,0,0,1,0, -0,0,20,0,0, -0,0,29,0,0, -0,0,0,7,0, -0,0,0,0,0, -0,1,5,2,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,26,0,0, -0,0,1,0,0, -0,2,0,7,0, -0,1,1,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,8,1,0, -0,0,2,3,0, -0,0,0,0,0, -0,0,5,10,0, -0,0,1,1,0, -0,1,0,1,0, -0,0,8,0,0, -0,0,18,2,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,2,0, -0,2,25,5,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,12,2,0, -0,0,3,0,0, -0,0,1,1,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,0,0, -0,2,1,1,0, -0,0,19,0,0, -0,0,20,0,0, -0,0,15,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,6,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,0,1,0, -0,0,45,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,19,1,0, -0,0,0,3,0, -0,0,2,0,0, -0,0,5,56,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,5,2,0, -0,0,0,1,0, -0,0,5,3,0, -0,1,2,0,0, -0,0,1,2,0, -0,0,12,0,0, -0,0,2,2,0, -0,1,9,1,0, -0,0,5,2,0, -0,0,23,3,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,3,0,0, -0,1,0,1,0, -0,0,7,0,0, -0,0,19,3,0, -0,0,5,2,0, -0,0,0,2,0, -0,0,21,2,0, -0,0,18,2,0, -0,0,18,0,0, -0,0,0,2,0, -0,1,11,0,0, -0,4,0,2,0, -0,2,6,0,0, -0,1,7,0,0, -0,0,13,0,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,7,1,0, -0,2,25,5,0, -0,0,29,0,0, -0,0,0,0,0, -5,0,0,0,0, -0,0,5,0,0, -0,0,5,1,0, -0,0,6,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,4,0,0, -0,0,1,1,0, -0,0,0,2,0, -0,1,19,2,0, -0,0,6,2,0, -0,0,19,1,0, -0,0,0,0,0, -0,0,1,5,0, -0,1,5,1,0, -0,0,6,2,0, -0,0,1,0,0, -0,1,2,4,0, -0,0,5,0,0, -0,0,8,0,0, -0,1,8,2,0, -0,0,0,1,0, -0,0,14,0,0, -0,0,3,0,0, -0,0,7,0,0, -0,0,0,2,0, -0,3,0,2,0, -0,0,1,3,0, -0,0,1,0,0, -0,0,5,4,0, -0,0,4,3,0, -0,0,7,0,0, -0,0,17,2,0, -0,1,6,0,0, -0,1,1,1,0, -0,0,5,1,0, -0,0,0,4,0, -0,0,3,4,0, -0,0,0,0,0, -0,1,0,1,0, -0,0,38,0,0, -0,0,0,2,0, -0,0,16,1,0, -0,0,5,0,0, -0,0,35,1,0, -0,0,1,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,4,0, -0,0,2,0,0, -0,0,1,1,0, -0,0,15,0,0, -2,0,2,0,0, -0,0,28,2,0, -0,0,71,1,0, -0,0,0,0,0, -0,1,9,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,1,33,3,0, -0,0,22,0,0, -0,0,30,0,0, -0,0,0,1,0, -0,0,11,0,0, -0,1,0,1,0, -0,1,0,0,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,5,3,0, -0,0,2,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,5,0,0, -20,0,10,0,0, -0,0,6,1,0, -0,0,14,0,0, -0,0,38,0,0, -0,0,0,0,0, -0,1,11,2,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,12,0,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,33,3,0, -0,0,2,0,0, -0,0,7,1,0, -0,0,0,0,0, -0,0,0,5,0, -0,0,0,0,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,21,5,0, -0,0,0,0,0, -0,0,3,2,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,21,5,0, -0,0,11,3,6, -0,0,14,0,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,4,4,0, -0,0,0,1,0, -0,3,12,0,0, -0,0,7,0,0, -0,0,12,0,0, -0,0,18,0,0, -0,0,1,3,0, -0,0,17,2,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,22,6,0, -0,0,0,0,0, -0,0,21,0,0, -0,0,11,0,0, -0,0,0,0,0, -5,0,0,0,0, -0,0,10,0,0, -1,0,8,1,0, -0,0,0,1,0, -0,0,0,0,0, -4,0,5,1,0, -0,0,0,1,0, -0,0,13,0,0, -0,1,11,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,19,2,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,8,5,0, -0,0,0,1,0, -0,0,9,1,0, -0,0,10,1,0, -0,1,0,0,0, -0,0,9,0,0, -0,0,21,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,17,5,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,1,1,0, -3,0,8,2,0, -0,0,0,1,0, -0,0,12,4,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,0,5,0, -0,0,8,2,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,10,3,0, -0,3,6,4,0, -0,0,1,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,23,0,0, -0,0,14,0,0, -0,0,15,2,0, -0,0,11,1,0, -0,0,0,16,0, -0,0,0,0,0, -0,0,21,5,0, -0,1,5,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,3,18,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,5,2,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,8,1,0, -0,0,33,2,0, -0,0,0,2,0, -0,2,14,0,0, -0,2,42,0,0, -0,0,8,2,0, -0,0,10,0,0, -0,0,3,2,0, -0,1,2,1,0, -0,0,9,0,0, -0,0,16,4,0, -1,0,9,1,0, -0,0,1,1,0, -0,2,28,0,0, -0,0,0,1,0, -0,0,10,0,0, -0,0,1,3,0, -0,0,1,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,1,28,1,0, -0,0,19,2,0, -0,0,45,0,0, -0,1,1,2,0, -0,0,6,0,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,5,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,1,0,2,0, -0,0,6,0,0, -0,3,12,2,0, -0,0,2,1,0, -0,0,9,6,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,11,1,0, -0,1,3,1,0, -0,0,0,0,0, -0,0,25,0,0, -0,0,0,2,0, -0,0,7,2,0, -0,0,23,0,0, -0,0,1,2,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,21,5,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,11,0,0, -0,0,2,0,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,0,0,0, -1,0,0,0,0, -0,0,1,1,0, -0,0,6,1,0, -0,0,0,2,0, -0,0,0,4,0, -8,1,0,0,0, -0,0,11,1,0, -0,0,7,0,0, -0,0,1,0,0, -0,0,7,0,0, -0,0,20,0,0, -0,0,7,0,0, -0,0,20,5,0, -0,0,0,0,0, -0,3,0,2,0, -0,1,5,1,0, -0,0,2,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,2,2, -0,0,0,0,0, -26,0,8,1,0, -0,0,14,0,0, -0,0,7,4,0, -0,0,0,5,0, -48,0,4,2,0, -0,0,0,3,0, -0,0,0,5,0, -0,0,0,1,0, -0,0,16,2,0, -0,2,5,6,0, -0,0,3,1,0, -0,0,0,1,0, -0,1,4,0,0, -0,0,0,0,0, -0,71,0,3,0, -0,0,29,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,1,28,4,0, -0,0,2,0,0, -0,0,28,2,0, -0,1,1,1,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,1,3,0, -2,0,4,1,0, -0,1,5,7,0, -0,0,29,0,0, -0,0,1,2,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,4,2,0, -0,0,8,1,0, -0,0,48,1,0, -0,0,1,1,0, -0,0,10,0,0, -0,0,0,0,0, -0,0,5,3,0, -1,0,0,0,0, -0,0,3,2,0, -0,2,0,5,0, -0,0,10,1,0, -0,0,18,1,0, -0,0,2,0,0, -0,0,2,0,0, -0,0,1,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,5,0,4,0, -0,1,0,1,0, -0,0,0,2,0, -0,0,14,1,0, -26,0,8,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,28,1,0, -0,0,11,2,0, -0,0,12,3,0, -0,0,2,1,0, -0,0,0,0,0, -0,1,10,4,0, -0,0,3,2,0, -0,0,5,0,0, -0,0,2,0,0, -0,0,10,1,0, -0,2,11,2,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,0,0,0, -0,1,0,1,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,8,1,0, -0,0,0,6,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,4,0, -0,0,15,0,0, -0,0,5,0,0, -0,0,7,1,0, -0,0,0,1,0, -5,0,0,1,0, -0,0,5,2,0, -0,0,2,3,0, -0,0,0,2,0, -0,0,5,0,0, -0,0,0,6,0, -0,1,0,0,0, -0,0,11,0,0, -0,0,13,0,0, -0,1,14,0,0, -0,0,3,1,0, -0,0,11,1,0, -0,0,5,1,0, -0,0,23,1,0, -1,0,2,1,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,18,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,2,0,10,0, -0,0,12,4,0, -0,0,0,0,0, -5,0,0,0,0, -1,0,30,2,0, -0,0,1,0,0, -0,0,9,1,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,16,0,0, -0,0,1,1,0, -0,0,10,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,3,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,9,6,0, -16,0,2,0,0, -0,0,5,10,0, -0,0,0,0,0, -0,0,30,0,0, -0,1,5,7,0, -0,0,21,0,0, -0,0,19,1,0, -0,1,0,1,0, -0,0,1,1,0, -0,1,2,1,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,5,2,0, -0,0,0,0,0, -0,0,6,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,4,0,2,0, -0,0,0,1,0, -0,0,11,3,6, -0,1,0,3,0, -0,0,3,7,0, -0,1,0,3,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,7,4,0, -0,0,2,1,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,6,0, -0,0,0,5,0, -0,1,10,5,0, -5,0,0,0,0, -0,0,3,2,0, -0,0,28,0,0, -0,0,28,2,0, -0,0,41,0,0, -0,0,20,0,0, -0,0,0,1,0, -0,1,1,1,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,19,1,0, -0,1,5,2,0, -0,0,1,0,0, -0,2,0,0,0, -0,0,12,1,0, -0,0,1,2,0, -0,0,0,2,0, -0,0,19,1,0, -0,0,18,2,0, -0,1,4,0,0, -0,0,5,10,0, -0,0,9,2,0, -0,1,11,0,0, -0,0,0,1,0, -0,0,21,0,0, -0,0,10,0,0, -0,0,0,0,0, -9,0,5,1,0, -0,0,0,0,0, -0,2,0,2,0, -0,0,3,0,0, -0,0,12,4,0, -0,0,9,0,0, -0,0,7,0,0, -0,1,0,10,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,7,1,0, -0,0,1,1,0, -0,0,6,0,0, -0,0,5,0,0, -0,0,1,0,0, -0,0,8,2,0, -0,0,0,0,0, -0,0,24,0,0, -0,0,4,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,1,1,1,0, -0,0,24,0,0, -0,0,4,1,0, -10,0,1,1,0, -0,0,8,0,0, -0,0,8,1,0, -0,1,30,0,0, -0,0,0,1,0, -0,1,10,4,0, -0,0,17,1,0, -0,0,3,0,0, -0,0,40,0,0, -0,0,0,2,0, -0,0,2,2,0, -0,0,8,0,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,28,0,0, -0,0,0,0,0, -0,0,8,0,0, -0,1,7,0,0, -0,1,23,1,0, -0,0,7,1,0, -0,0,0,2,0, -0,0,2,0,0, -0,0,11,0,0, -0,0,0,1,0, -0,0,9,0,0, -0,1,28,4,0, -0,0,19,0,0, -0,0,0,0,0, -0,1,16,2,0, -0,0,1,0,0, -0,4,0,2,0, -0,0,3,1,0, -0,1,1,1,0, -0,0,0,3,0, -0,3,0,2,0, -0,0,25,2,0, -0,0,14,0,0, -0,0,15,0,0, -0,0,5,0,0, -0,0,17,1,0, -0,0,6,1,0, -0,0,2,0,0, -0,0,15,2,0, -0,1,30,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,9,0,0, -0,0,0,1,0, -0,2,4,1,0, -0,0,0,1,0, -0,1,38,2,0, -0,0,22,2,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,21,5,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,0,0,0, -0,1,1,1,0, -0,0,8,2,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,6,0,0, -0,1,0,0,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,8,3,0, -0,0,16,0,0, -0,0,1,1,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,1,1,0, -16,0,2,0,0, -0,0,17,0,0, -71,0,11,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,10,2,0, -0,0,18,2,0, -0,0,14,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,23,1,0, -0,0,8,4,0, -0,0,0,0,0, -0,0,16,4,0, -0,0,0,0,0, -0,0,26,0,0, -0,0,11,4,0, -0,0,10,9,0, -0,0,24,0,0, -0,0,1,5,0, -0,0,1,3,1, -0,0,11,0,0, -0,0,1,0,0, -0,2,4,1,0, -0,0,0,1,0, -0,0,12,3,0, -0,0,18,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,8,0,0, -0,1,0,0,0, -0,0,4,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,12,4,0, -0,0,7,0,0, -0,0,9,0,0, -0,0,9,1,0, -0,0,0,0,0, -0,0,18,1,0, -0,0,0,1,0, -0,0,13,0,0, -0,1,28,0,0, -0,0,4,0,0, -0,0,19,1,0, -0,0,3,0,0, -0,0,5,0,0, -0,1,0,0,0, -0,0,23,0,0, -0,1,14,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,6,0,0, -0,0,5,0,0, -0,0,0,5,0, -0,0,4,3,0, -0,0,0,3,0, -0,0,10,0,0, -0,0,0,0,0, -0,1,1,0,0, -0,0,6,1,0, -0,0,7,0,0, -8,0,8,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,9,1,0, -0,0,0,1,0, -0,0,18,0,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,1,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,21,1,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,3,0, -0,1,7,1,0, -0,0,25,2,0, -0,0,8,0,0, -0,0,3,7,0, -0,0,3,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,1,1,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,9,1,0, -0,0,12,4,0, -0,1,13,2,0, -0,0,11,0,0, -0,0,7,0,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,0,8,0, -0,0,0,16,0, -0,0,24,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,0,3,0, -0,1,0,1,0, -0,0,0,0,0, -0,2,0,0,0, -0,0,14,1,0, -0,2,27,4,0, -0,1,2,4,0, -0,0,0,1,0, -0,1,1,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,2,2,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,0,2,0, -0,0,19,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,2,42,0,0, -0,1,18,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,4,0,0, -0,0,0,0,0, -0,0,1,3,0, -0,0,20,0,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,22,0,0, -0,0,20,1,0, -2,0,6,0,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,2,4,0, -0,0,13,0,0, -0,0,35,1,0, -0,0,4,1,0, -0,0,13,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,28,2,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,0,4,0, -0,0,28,1,0, -0,0,0,0,0, -5,0,15,1,0, -0,0,6,0,0, -0,0,0,1,0, -0,0,11,0,0, -0,0,0,46,0, -0,0,0,2,0, -0,0,40,1,0, -0,0,54,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,20,0,3, -0,0,7,3,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,2,0,0, -0,1,3,1,0, -0,0,4,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,0,11,0, -0,0,8,8,0, -4,0,5,1,0, -0,0,3,1,0, -0,0,5,1,0, -0,0,23,3,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,18,0,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,23,0,0, -0,1,16,0,0, -0,1,16,0,0, -0,0,0,0,0, -0,0,0,12,0, -1,0,0,1,0, -0,1,15,1,0, -0,0,0,3,0, -0,0,7,1,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,20,0,0, -0,0,1,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,4,4,0, -0,0,2,0,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,28,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,1,8,2,0, -0,14,11,2,0, -0,1,5,1,0, -20,0,10,0,0, -0,0,9,1,0, -0,0,4,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,11,0,0, -0,2,0,2,0, -0,0,23,0,0, -1,0,9,1,0, -0,0,15,1,0, -0,0,0,0,0, -0,0,38,0,0, -0,0,11,4,0, -1,0,9,1,0, -0,0,0,1,0, -5,0,0,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,2,14,0,0, -0,0,0,0,0, -8,1,0,0,0, -0,0,6,2,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,4,2,0, -0,0,21,0,0, -0,0,3,1,0, -0,1,14,1,0, -0,1,0,4,3, -0,1,22,0,0, -0,0,0,2,0, -0,0,0,4,0, -0,2,0,2,0, -0,0,0,0,0, -0,0,6,1,0, -0,3,2,2,0, -0,1,2,2,0, -0,0,0,2,0, -0,0,9,3,0, -0,0,3,1,0, -0,1,0,1,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,11,0,0, -0,2,14,0,0, -0,0,3,0,0, -0,0,0,0,0, -48,0,4,2,0, -0,0,0,1,0, -0,0,10,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,6,0,0, -0,0,0,1,0, -0,1,13,0,0, -0,0,3,0,0, -0,0,7,0,0, -0,1,18,0,0, -0,0,0,0,0, -10,1,4,1,0, -0,0,2,0,0, -0,0,1,0,0, -0,0,0,2,0, -0,1,0,0,0, -0,0,10,0,0, -0,0,0,1,0, -0,0,30,0,0, -0,0,41,0,0, -0,0,6,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,0,10,0, -0,0,3,0,0, -0,0,11,0,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,42,0,0, -0,5,0,4,0, -0,0,27,0,0, -0,1,15,1,0, -0,0,0,1,0, -0,2,42,0,0, -0,0,16,1,0, -0,1,10,1,0, -0,0,0,1,0, -0,1,15,0,0, -0,2,0,2,0, -0,0,0,1,0, -0,0,3,0,0, -0,0,17,0,0, -0,0,9,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,19,1,0, -0,0,0,1,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,11,1,0, -0,0,21,5,0, -0,0,4,3,0, -0,0,5,1,0, -0,0,1,0,0, -0,0,24,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,15,0,0, -31,0,0,1,0, -0,1,13,1,0, -0,0,1,0,0, -0,0,23,0,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,8,0,0, -24,0,2,0,0, -0,0,14,0,0, -0,0,1,3,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,4,2,0, -0,0,13,0,0, -0,0,5,7,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,23,1,0, -0,0,13,3,0, -0,14,11,2,0, -0,0,5,0,0, -0,0,6,1,0, -0,0,1,0,0, -0,0,5,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,10,0,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,1,0,0,0, -0,1,1,0,0, -0,0,0,3,0, -0,0,32,1,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,0,0,6, -0,0,0,0,0, -0,1,28,0,0, -0,0,4,2,0, -0,0,20,0,0, -0,0,1,0,0, -0,0,17,2,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,2,1,0, -0,0,16,4,0, -0,0,0,2,0, -31,0,0,1,0, -0,0,9,0,0, -0,0,12,0,0, -0,0,0,0,0, -0,0,14,0,0, -0,1,13,0,0, -0,0,8,0,0, -0,0,23,3,0, -0,0,0,0,0, -10,1,4,1,0, -0,0,0,3,0, -0,0,40,0,0, -0,0,11,0,0, -0,0,26,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,8,2,0, -0,0,1,0,0, -2,0,4,1,0, -0,0,0,1,0, -0,1,5,0,0, -0,0,0,0,0, -0,0,17,1,0, -0,0,0,3,0, -0,0,24,1,0, -0,0,1,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,15,1,0, -0,1,0,0,0, -0,0,2,2,0, -0,0,6,0,0, -0,1,10,5,0, -0,0,1,0,0, -0,0,5,0,0, -0,0,1,3,0, -0,0,7,1,0, -0,0,0,2,0, -0,2,0,0,0, -0,1,16,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,2,0,5,0, -0,0,4,3,0, -0,0,25,1,0, -0,1,0,4,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,19,0,0, -0,0,0,0,0, -0,0,40,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,21,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,28,1,0, -0,0,0,0,0, -0,0,5,4,0, -0,0,6,3,0, -0,0,1,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -18,0,5,1,0, -0,0,1,3,0, -0,1,1,0,0, -0,1,0,0,0, -0,0,40,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,3,0, -0,0,20,0,0, -0,0,9,0,0, -0,0,22,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,3,4,0, -0,0,7,2,0, -0,0,20,0,0, -1,0,3,1,0, -0,0,12,0,0, -0,0,13,2,0, -0,2,5,6,0, -0,0,6,2,0, -0,0,5,4,0, -0,0,14,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,7,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,1,9,1,0, -0,2,28,0,0, -1,0,9,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,2,1,0, -0,0,12,0,2, -0,0,0,1,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,7,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,1,1,0, -0,0,3,0,0, -0,0,1,1,0, -0,0,2,1,0, -0,0,2,1,0, -0,1,0,0,0, -0,0,13,1,0, -0,0,4,1,0, -0,0,5,1,0, -0,0,7,2,0, -17,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,29,2,0, -0,0,1,0,0, -0,1,5,2,0, -0,0,16,0,0, -0,0,0,0,0, -1,1,10,1,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,12,2,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,3,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,5,2,0, -0,4,0,2,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,13,0,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,4,1,0, -0,1,0,0,0, -0,0,1,0,0, -0,0,11,0,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,28,1,0, -0,0,19,0,0, -0,0,0,2,0, -0,1,4,0,0, -0,0,45,1,0, -0,1,0,1,0, -0,1,0,1,0, -0,0,22,0,0, -0,0,24,0,0, -0,0,3,0,0, -0,0,7,0,0, -0,1,5,2,0, -0,0,0,11,0, -0,0,0,3,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,3,2,0, -0,0,0,0,0, -0,0,4,2,0, -0,1,38,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,13,1,0, -0,0,0,2,0, -0,0,12,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,16,0,0, -0,0,5,1,0, -0,0,1,2,0, -0,0,71,1,0, -0,0,0,5,0, -0,1,0,1,0, -0,0,1,0,0, -0,0,26,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,20,0,0, -0,1,11,2,0, -0,0,15,0,0, -0,0,3,0,0, -0,0,1,1,0, -0,0,2,2,0, -0,0,0,2,0, -0,0,0,1,0, -0,1,18,0,0, -0,1,5,1,0, -0,0,5,0,0, -0,0,20,0,0, -0,0,6,1,0, -0,0,13,0,0, -0,0,32,0,0, -0,1,7,1,0, -0,2,0,2,0, -0,0,1,0,0, -11,0,2,0,0, -0,0,24,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,2,2,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,15,1,0, -0,0,24,0,0, -0,0,1,2,0, -0,0,1,1,0, -0,0,12,0,0, -0,0,6,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,3,4,0, -0,0,0,0,0, -0,0,25,6,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,5,0,0, -0,0,19,3,0, -0,1,0,0,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,5,3,0, -0,0,13,2,0, -0,0,3,0,0, -0,0,16,1,0, -0,0,0,1,0, -0,0,16,0,0, -0,0,7,1,0, -0,1,0,0,0, -0,0,5,2,0, -0,0,25,0,0, -0,0,3,0,0, -0,0,3,0,0, -0,2,0,2,0, -0,2,0,2,0, -0,0,9,0,0, -0,0,0,2,0, -0,0,3,0,0, -0,0,16,0,0, -0,1,2,2,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,3,4,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,14,0,0, -0,1,0,0,0, -0,0,3,0,0, -0,0,21,5,0, -0,0,0,0,0, -0,0,8,3,0, -0,0,0,5,0, -0,0,2,0,0, -0,0,12,0,0, -0,0,8,1,0, -0,0,21,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,25,7,0, -0,0,17,0,0, -0,0,1,0,0, -0,0,11,0,0, -0,3,0,1,0, -0,1,15,1,0, -0,0,6,3,0, -0,0,22,2,0, -0,0,3,0,0, -0,0,3,0,0, -0,0,14,3,0, -0,0,2,2,0, -0,0,0,2,0, -0,0,19,0,0, -0,0,12,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,5,0,0, -0,0,0,0,0, -0,4,33,2,1, -0,2,14,0,0, -0,0,1,0,0, -0,1,0,4,0, -0,0,0,2,0, -0,0,26,1,0, -0,1,7,1,0, -0,0,3,12,0, -0,3,6,4,0, -0,2,27,4,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,4,3,0, -0,0,3,0,0, -0,0,12,3,0, -0,0,0,10,0, -0,0,1,3,0, -0,0,25,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,1,3,0, -0,0,2,0,0, -0,0,1,4,0, -0,0,14,3,0, -0,0,15,1,0, -0,0,4,0,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,3,8,0, -0,0,16,1,0, -0,1,18,0,0, -0,0,2,0,0, -0,1,0,1,0, -0,1,0,0,0, -0,0,0,2,0, -0,0,8,0,0, -0,0,17,0,0, -5,0,0,0,0, -2,0,0,0,0, -0,0,8,1,0, -0,1,16,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,24,0,0, -0,1,1,1,0, -0,0,3,2,0, -0,0,11,0,0, -0,3,0,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,0,1,0, -0,0,13,0,0, -0,0,15,5,0, -5,0,0,1,0, -0,0,18,0,0, -0,0,13,0,0, -0,1,2,4,0, -0,0,13,1,0, -0,0,0,0,0, -0,0,13,0,0, -0,0,19,0,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,16,0,0, -0,0,0,5,0, -0,1,9,0,0, -0,0,6,1,0, -0,0,16,2,0, -0,0,0,2,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,9,1,0, -0,0,2,0,0, -0,1,9,0,0, -0,0,17,0,0, -0,0,0,1,0, -0,0,45,0,0, -1,0,1,3,0, -0,0,0,1,0, -0,0,12,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,25,0,0, -0,0,38,0,0, -0,0,26,1,0, -0,0,0,0,0, -0,0,14,0,0, -0,0,13,1,0, -0,0,0,1,0, -0,0,9,0,0, -5,0,0,1,0, -0,0,20,0,0, -0,0,0,2,0, -0,0,14,0,0, -0,0,6,1,0, -0,1,6,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,4,0,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,2,2,0, -0,0,0,2,0, -0,0,0,3,0, -0,0,25,1,0, -0,0,0,1,0, -0,0,3,8,0, -0,0,4,0,0, -0,0,21,0,0, -0,0,2,3,0, -0,1,0,2,0, -0,0,8,1,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,23,1,0, -0,0,9,0,0, -0,0,0,2,0, -0,0,40,0,0, -0,0,7,2,0, -0,1,28,4,0, -0,0,42,0,0, -0,0,7,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,7,0,0, -0,0,17,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,12,0,7,0, -0,0,6,1,0, -0,0,12,0,0, -0,0,20,0,3, -0,0,7,4,0, -0,0,24,0,0, -0,0,7,2,0, -0,0,13,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,2,0,0, -0,0,8,2,0, -0,0,0,3,0, -0,0,3,1,0, -0,0,0,2,0, -0,0,2,4,0, -0,0,11,0,0, -0,0,1,1,0, -0,0,8,1,0, -0,0,0,1,0, -0,1,2,2,0, -0,0,16,2,0, -0,1,0,4,0, -0,0,8,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,18,1,0, -0,0,0,0,0, -0,0,14,0,0, -0,0,10,0,0, -0,0,4,1,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,9,0,0, -0,0,15,0,0, -0,0,23,3,0, -0,0,3,0,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,3,2,0, -0,0,2,1,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,6,3,0, -0,0,0,1,0, -0,1,11,2,0, -0,2,0,0,0, -4,0,15,0,0, -0,0,0,3,0, -0,0,25,1,0, -0,1,5,0,0, -0,2,0,2,0, -0,0,1,0,0, -0,0,28,1,0, -0,0,0,4,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,9,0,0, -1,0,18,0,0, -0,0,1,0,0, -0,0,6,1,0, -9,0,0,2,0, -0,0,5,2,0, -0,0,11,1,0, -0,0,41,0,0, -0,0,10,1,0, -0,1,0,0,0, -0,0,7,1,0, -0,0,0,12,0, -0,0,18,1,0, -0,0,17,2,0, -0,0,2,0,0, -0,0,1,3,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,0,1,0, -1,0,4,0,0, -0,0,23,3,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,2,0, -1,0,18,0,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,12,0,0, -0,0,14,0,0, -0,0,49,2,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,10,2,0, -0,0,0,1,0, -0,0,19,0,0, -0,0,0,1,0, -0,0,31,0,0, -0,0,6,1,0, -0,0,2,3,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,18,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,5,1,0, -0,0,4,0,0, -0,0,13,3,0, -0,0,15,0,0, -0,0,25,6,0, -0,0,1,0,0, -0,0,0,5,0, -0,0,0,1,0, -0,0,22,6,0, -0,0,3,1,0, -0,0,71,1,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,19,0,0, -18,0,5,1,0, -0,0,0,4,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,20,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,1,10,5,0, -0,0,16,0,0, -0,0,0,1,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,9,2,0, -0,0,1,5,0, -0,0,2,2,0, -0,0,0,2,0, -0,2,6,0,0, -0,3,0,1,0, -0,0,0,2,0, -0,1,0,0,0, -0,0,15,1,0, -0,0,12,0,0, -0,0,0,0,0, -0,0,2,1,0, -0,0,5,0,0, -0,0,0,2,0, -0,0,11,0,0, -0,0,14,0,0, -0,1,0,0,0, -0,2,0,2,0, -0,0,0,0,0, -0,2,6,4,0, -0,0,42,0,0, -0,0,11,0,0, -0,0,9,0,0, -0,0,2,0,0, -0,0,0,8,0, -0,1,19,2,0, -0,0,3,1,0, -0,1,1,1,0, -0,0,14,1,0, -0,0,1,2,0, -0,0,9,0,0, -0,0,11,0,0, -0,0,1,1,0, -0,0,7,0,0, -0,2,0,2,0, -0,1,0,3,0, -0,0,18,1,0, -0,1,3,1,0, -1,0,3,1,0, -0,0,0,3,0, -0,0,11,0,0, -0,0,27,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,17,0,0, -0,0,7,1,0, -0,0,26,1,0, -0,0,0,1,0, -0,0,16,0,0, -0,0,5,0,0, -0,0,9,0,0, -0,0,19,0,0, -0,0,0,0,0, -0,1,13,2,0, -0,0,6,1,0, -0,0,1,3,0, -0,0,0,1,0, -0,1,6,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,1,15,3,0, -0,0,0,0,0, -0,0,17,0,0, -0,0,3,1,0, -0,0,9,1,0, -0,0,0,1,0, -0,0,5,2,0, -1,0,1,2,0, -0,0,10,1,0, -0,0,8,1,0, -0,0,3,1,0, -0,0,1,0,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,29,1,0, -0,1,0,2,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,3,4,0, -0,0,5,0,0, -17,0,0,0,0, -0,0,15,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,5,1,0, -9,0,5,1,0, -0,1,5,0,0, -0,0,0,2,0, -0,1,28,1,0, -0,0,0,1,0, -0,0,0,2,0, -0,2,0,1,0, -0,0,12,0,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,1,3,0, -0,0,1,1,0, -0,0,11,0,0, -0,0,3,0,0, -19,0,7,0,0, -0,0,38,0,0, -0,0,0,2,0, -0,3,23,4,46, -0,0,0,0,0, -0,2,0,2,0, -0,0,0,0,0, -0,0,0,12,0, -0,0,0,1,0, -0,0,0,1,0, -1,0,10,3,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,11,3,6, -0,0,29,0,0, -0,0,5,2,0, -2,0,9,2,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,10,2,0, -0,0,2,0,0, -0,0,0,8,0, -0,0,7,0,0, -0,0,11,0,0, -0,2,7,0,0, -0,0,1,1,0, -0,0,2,0,0, -0,2,25,1,0, -0,0,14,1,0, -0,2,0,2,0, -0,0,0,1,0, -0,2,0,2,0, -0,2,9,0,0, -0,0,0,1,0, -0,1,1,0,0, -0,0,4,1,0, -0,0,5,0,0, -0,0,0,1,0, -0,0,6,1,0, -0,0,0,0,0, -48,0,4,2,0, -0,0,0,0,0, -0,0,15,0,0, -0,0,0,0,0, -0,0,12,1,0, -0,0,25,0,0, -0,1,0,4,0, -0,0,0,0,0, -0,0,11,0,0, -0,0,0,2,0, -0,0,5,1,0, -0,0,0,10,0, -0,0,20,1,0, -0,0,21,1,0, -0,0,1,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,3,0,0, -0,4,1,1,0, -0,0,11,0,0, -0,0,0,0,0, -0,0,45,0,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,8,3,0, -1,0,0,1,0, -0,0,8,0,0, -0,0,0,0,0, -0,1,9,0,0, -0,0,0,1,0, -0,0,40,1,0, -0,0,0,0,0, -0,0,25,0,0, -0,0,2,2,0, -0,0,0,0,0, -0,0,13,2,0, -0,1,11,0,0, -0,0,0,5,0, -0,0,1,1,0, -0,1,3,1,0, -0,0,14,1,0, -0,0,26,1,0, -0,0,7,0,0, -0,0,1,1,0, -0,1,2,3,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,0,2,0, -0,1,4,0,0, -0,0,0,2,0, -0,0,24,0,0, -0,0,0,0,0, -0,0,9,6,0, -0,0,0,1,0, -0,1,2,3,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,6,3,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,15,1,0, -1,0,30,2,0, -0,0,18,2,0, -0,0,0,0,0, -0,0,28,2,0, -1,1,9,0,0, -0,1,0,0,0, -0,0,0,3,0, -0,0,0,3,0, -0,0,4,3,0, -0,0,0,2,0, -0,0,0,5,0, -0,0,28,2,0, -0,0,13,3,0, -0,0,25,1,0, -0,0,0,0,0, -0,0,4,2,0, -0,0,0,0,0, -0,3,9,2,0, -0,0,18,0,0, -0,0,16,2,0, -0,0,57,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,14,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,10,0,0, -0,0,44,1,0, -0,0,0,1,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,6,1,0, -0,0,0,0,0, -0,1,28,1,0, -0,0,9,1,0, -0,0,8,2,0, -0,0,19,0,0, -0,1,12,0,0, -0,0,0,1,0, -0,0,8,0,0, -0,0,7,1,0, -0,0,26,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,3,0, -0,0,1,0,0, -0,1,30,0,0, -0,0,11,0,0, -0,2,0,2,0, -0,0,0,0,0, -0,0,19,1,0, -0,0,6,1,0, -0,0,26,1,0, -0,1,0,0,0, -0,0,5,2,0, -0,0,0,1,0, -0,1,16,0,0, -0,0,0,1,0, -0,0,45,0,0, -0,0,0,1,0, -0,0,2,0,0, -0,3,0,2,0, -0,0,0,1,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,25,1,0, -0,0,1,2,0, -0,0,0,7,0, -0,0,5,1,0, -0,0,45,0,0, -0,0,29,0,0, -0,0,1,0,0, -0,3,0,1,0, -0,0,12,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,21,0,0, -0,2,0,0,0, -0,0,3,1,0, -0,1,7,1,0, -0,0,10,1,0, -0,1,9,0,0, -0,0,6,0,0, -0,0,0,3,0, -0,2,0,0,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,1,2,0, -0,0,4,1,0, -0,0,18,2,0, -0,2,20,7,0, -0,0,0,3,0, -0,0,0,0,0, -0,0,29,0,0, -0,0,7,0,0, -0,0,6,0,0, -0,0,8,3,0, -0,0,0,0,0, -0,0,13,2,0, -0,0,11,1,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,3,3,0, -0,1,0,2,0, -1,0,9,1,0, -0,0,7,2,0, -0,1,9,1,0, -0,0,11,3,6, -0,2,0,1,0, -0,1,1,1,0, -0,0,39,0,0, -0,0,10,2,0, -0,0,6,1,0, -8,0,8,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,4,0,0, -0,0,0,10,0, -0,0,1,3,0, -0,1,14,1,0, -0,1,0,4,3, -0,0,19,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,35,0,0, -0,0,24,0,0, -0,0,25,0,0, -0,0,5,4,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,0,2,0, -0,0,17,1,0, -0,2,0,2,0, -0,0,3,1,0, -0,0,0,3,0, -0,0,1,0,0, -0,0,1,1,0, -0,0,7,1,0, -0,0,4,2,0, -0,1,2,4,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,21,0,0, -0,0,8,1,0, -0,0,4,0,0, -0,0,12,0,0, -0,0,9,2,0, -0,0,0,0,0, -0,0,16,4,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,11,1,0, -0,0,5,0,0, -0,0,1,0,0, -0,0,29,4,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,1,3,0,0, -0,0,1,1,0, -2,0,9,2,0, -0,0,3,7,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,12,20,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,0,2,0, -2,0,2,0,0, -0,0,1,1,0, -0,0,32,1,0, -0,0,0,4,0, -0,0,4,1,0, -0,0,12,0,0, -0,0,2,1,0, -0,0,0,0,0, -0,0,10,1,0, -0,0,0,2,0, -0,1,0,3,0, -0,0,15,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,10,0,0, -0,0,0,0,0, -15,0,7,0,0, -0,0,18,2,0, -0,0,0,3,0, -0,0,1,1,0, -0,0,18,2,0, -0,0,3,0,0, -0,0,20,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,3,0,0, -0,1,3,1,0, -0,0,13,1,0, -0,0,16,0,0, -0,1,28,0,0, -0,2,5,6,0, -0,0,0,0,0, -0,0,1,1,0, -0,1,0,0,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,2,0,0, -0,0,2,2,0, -0,0,1,3,0, -0,2,14,0,0, -0,0,3,0,0, -0,1,7,3,0, -0,1,2,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,26,3,0, -0,2,0,2,0, -0,0,35,0,0, -0,0,0,5,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,0,0,0, -0,0,0,12,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,11,2,0, -0,0,1,3,0, -0,0,3,0,0, -0,0,5,2,0, -0,0,0,3,0, -0,0,12,4,0, -0,0,0,0,0, -0,0,7,1,0, -0,1,0,1,0, -0,0,0,4,0, -0,0,0,1,0, -0,0,19,1,0, -0,0,30,0,0, -0,0,21,0,0, -0,0,0,3,0, -0,0,11,2,0, -1,0,4,0,0, -0,0,13,0,0, -0,0,11,0,0, -0,0,0,1,0, -0,0,4,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,1,1,0, -0,0,6,1,0, -0,0,12,1,0, -0,0,8,4,0, -0,0,0,0,0, -0,0,15,0,0, -0,0,2,0,0, -0,0,0,4,0, -0,0,0,1,0, -0,0,0,3,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,19,1,0, -0,0,6,3,0, -0,0,1,1,0, -0,1,11,4,0, -0,0,1,2,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,1,3,0, -0,0,6,0,0, -0,0,7,3,0, -0,0,0,4,0, -0,0,7,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,0,1,0, -0,1,33,3,0, -0,3,8,1,0, -0,0,0,1,0, -0,0,16,0,0, -0,0,5,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,1,2,0, -0,0,0,0,0, -0,0,27,2,0, -1,1,9,0,0, -0,1,3,0,0, -0,0,1,0,0, -3,0,8,2,0, -0,0,28,2,0, -0,0,7,1,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,1,2,0, -0,0,14,0,0, -0,0,0,3,0, -0,0,11,0,0, -0,0,4,2,0, -71,0,11,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,0,0,3,0, -0,0,1,0,0, -0,1,0,3,0, -0,1,16,2,0, -0,0,4,1,0, -0,0,7,0,0, -0,0,27,0,0, -0,0,13,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,2,0, -32,0,1,1,0, -1,0,10,3,0, -0,1,5,1,0, -0,0,0,0,0, -0,2,4,1,0, -0,0,8,1,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,21,1,0, -0,0,1,0,0, -0,0,4,0,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,1,15,6,0, -0,0,25,6,0, -0,0,16,1,0, -0,0,1,0,0, -0,0,5,7,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,18,3,0, -0,0,1,0,0, -1,0,10,3,0, -0,0,29,0,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,9,3,0, -0,0,1,0,0, -0,0,5,3,0, -0,0,0,1,0, -0,0,6,2,0, -0,0,2,0,0, -0,0,0,3,0, -0,0,16,4,0, -0,0,14,0,0, -0,0,0,0,0, -0,0,23,1,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,0,10,0, -0,0,0,2,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,17,1,0, -0,0,9,2,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,1,1,0, -0,0,7,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,1,5,2,0, -0,0,1,5,0, -0,1,2,0,0, -0,0,21,0,0, -1,0,11,1,0, -0,0,2,0,0, -0,4,0,2,0, -0,0,0,0,0, -0,0,12,4,0, -0,0,2,0,0, -0,1,19,1,0, -0,3,0,1,0, -0,2,25,5,0, -27,0,19,0,0, -0,0,29,0,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,13,3,0, -0,0,9,4,0, -5,0,15,1,0, -0,0,14,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -2,0,4,1,0, -0,0,15,0,0, -0,0,0,2,0, -0,0,0,1,0, -0,2,0,10,0, -0,0,4,1,0, -15,0,7,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,7,2,0, -0,0,0,1,0, -0,0,7,0,0, -0,0,6,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,19,1,0, -0,4,33,2,1, -0,0,0,0,0, -0,0,10,1,0, -0,0,2,1,0, -0,1,4,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,7,0,0, -0,0,0,0,0, -0,0,3,1,0, -0,0,1,4,0, -0,0,0,1,0, -0,1,11,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,0,1,0, -0,0,7,1,0, -0,0,4,0,0, -0,0,12,0,0, -0,0,24,0,0, -0,0,4,1,0, -0,0,5,0,0, -0,0,9,0,0, -1,0,8,1,0, -0,0,6,2,0, -0,2,9,1,0, -0,0,7,1,0, -0,0,13,1,0, -0,0,3,2,0, -0,0,20,1,0, -1,0,0,0,0, -0,0,15,0,0, -1,0,8,1,0, -0,0,2,1,0, -4,0,2,2,0, -0,1,2,2,0, -0,0,0,0,0, -0,0,15,0,0, -0,1,15,0,0, -0,2,7,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,4,0,0, -0,0,0,0,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,16,0,0, -0,0,0,0,0, -0,0,0,1,0, -5,0,0,0,0, -0,2,0,10,0, -0,0,0,0,0, -0,0,0,0,0, -0,2,4,1,0, -0,1,5,0,0, -0,0,6,2,0, -0,0,0,0,0, -1,0,1,3,0, -0,0,0,2,0, -0,0,11,1,0, -0,0,6,0,0, -0,0,45,2,0, -0,2,6,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,2,4,1,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,43,1,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,14,0,0, -0,1,0,1,0, -0,0,5,0,0, -0,0,14,0,0, -0,0,9,1,0, -0,0,0,0,0, -0,0,4,0,0, -0,0,0,1,0, -0,3,6,4,0, -0,0,13,0,0, -5,0,3,1,0, -0,0,0,0,0, -0,0,0,2,2, -0,1,5,2,0, -0,0,0,4,0, -0,0,1,0,0, -0,0,4,0,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,1,6,0, -9,0,0,2,0, -0,1,14,3,0, -0,0,8,1,0, -24,0,2,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,9,0,0, -0,0,12,2,0, -1,0,0,2,0, -0,0,1,0,0, -0,0,7,1,0, -0,0,20,0,3, -0,0,3,1,0, -0,0,49,3,0, -0,0,2,0,0, -0,0,18,0,0, -0,0,2,0,0, -0,0,5,4,0, -0,0,23,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,7,2,0, -0,0,0,0,0, -0,1,18,0,0, -0,0,6,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,0,1,0, -0,0,0,1,0, -0,1,1,1,0, -0,0,1,0,0, -0,1,7,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,6,0,0, -0,0,5,0,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,5,2,0, -0,0,0,4,0, -0,0,41,0,0, -0,0,0,0,0, -0,0,3,0,0, -0,0,0,3,0, -0,1,8,0,0, -0,0,4,4,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,20,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,24,0,0, -0,0,1,0,0, -0,0,5,1,0, -0,2,14,0,0, -0,0,39,0,0, -0,0,2,2,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,10,2,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,1,1,0, -0,1,0,2,0, -0,0,0,1,0, -0,0,3,1,0, -0,0,6,0,0, -0,0,10,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,11,4,0, -0,0,0,0,0, -0,2,20,7,0, -0,0,4,4,0, -0,3,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,1,24,0, -0,0,0,3,0, -0,2,11,2,0, -0,0,16,4,0, -0,0,20,8,0, -0,0,0,0,0, -0,1,3,0,0, -0,0,14,71,0, -0,5,0,4,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,3,3,0, -0,0,0,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,5,0,0, -0,0,1,0,0, -0,0,15,0,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,4,1,0, -0,1,11,0,0, -0,0,14,1,0, -0,0,0,0,0, -0,0,4,0,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,1,0,3,0, -0,0,0,0,0, -0,0,0,1,0, -0,1,1,1,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,0,0, -0,0,1,1,0, -0,0,8,0,0, -0,0,26,0,0, -0,0,0,2,0, -1,0,8,1,0, -0,0,0,2,0, -0,0,9,2,0, -0,1,5,1,0, -0,0,24,0,0, -0,0,27,2,0, -0,0,0,2,0, -0,3,9,2,0, -0,0,0,1,0, -0,3,0,2,0, -0,0,20,1,0, -0,0,0,1,71, -0,0,1,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,0,0,0, -0,0,7,4,0, -0,0,0,0,0, -0,0,1,0,0, -0,0,30,5,0, -5,0,15,1,0, -0,0,7,0,0, -0,1,4,0,0, -0,0,28,2,0, -0,1,16,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,5,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,20,0,3, -0,1,0,0,0, -0,0,7,1,0, -0,0,17,0,0, -19,0,7,0,0, -0,0,0,1,0, -0,0,13,2,0, -0,2,1,1,0, -0,0,3,0,0, -0,0,15,0,0, -0,0,18,0,0, -0,2,0,10,0, -0,1,0,0,0, -0,0,14,1,0, -0,0,20,8,0, -0,2,20,7,0, -1,0,11,1,0, -0,1,0,0,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,0,1,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,16,0,0, -0,1,4,2,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,39,0,0, -0,0,1,1,0, -0,1,0,0,0, -0,0,0,5,0, -0,0,19,1,0, -0,0,3,12,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,19,0,0, -0,0,11,1,0, -0,0,0,0,0, -0,0,9,1,0, -0,0,14,0,0, -0,0,1,2,0, -0,0,5,0,0, -0,0,3,1,0, -0,0,7,1,0, -0,0,0,3,0, -0,0,26,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,1,10,1,0, -0,0,1,0,0, -0,0,9,2,0, -0,0,3,0,0, -0,0,0,0,0, -0,0,29,4,0, -1,0,10,2,0, -0,0,3,1,0, -0,0,0,2,0, -0,0,10,2,0, -0,0,8,1,0, -0,0,0,0,0, -0,0,20,0,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,4,2,0, -0,0,4,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,6,1,0, -0,0,0,1,0, -0,0,23,0,0, -0,1,8,1,0, -0,0,0,2,0, -1,0,3,1,0, -0,0,6,1,0, -0,0,13,0,0, -0,0,31,2,0, -0,0,8,1,0, -0,0,0,1,0, -0,0,0,4,0, -0,1,4,0,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,6,2,0, -0,0,8,3,0, -0,0,0,5,0, -0,0,0,0,0, -0,0,14,0,0, -0,0,0,0,0, -5,0,0,0,0, -0,0,0,1,0, -0,0,6,1,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,3,1,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,1,0,0, -0,0,12,0,0, -0,0,7,3,0, -0,0,0,1,0, -0,0,0,0,6, -0,0,15,0,0, -0,0,1,1,0, -0,0,0,0,0, -0,0,20,1,0, -0,0,1,2,0, -0,0,28,1,0, -0,2,14,0,0, -0,0,0,0,0, -0,0,23,1,0, -0,0,3,1,0, -0,0,8,0,0, -0,0,11,3,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,2,0,0, -0,1,4,0,0, -0,0,0,2,0, -0,0,7,2,0, -0,0,12,1,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,28,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,1,0,3,0, -0,0,11,0,0, -0,0,2,2,0, -0,0,4,0,0, -0,1,0,1,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,0,0,0, -0,1,9,1,0, -0,0,13,1,0, -0,0,3,0,0, -0,0,14,1,0, -0,0,9,1,0, -0,0,9,0,0, -0,0,11,1,0, -0,0,45,0,0, -0,0,1,0,0, -0,0,10,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,0,1,0, -0,0,9,0,0, -0,0,8,0,0, -0,0,2,0,0, -0,0,0,1,0, -0,0,40,0,0, -0,1,28,4,0, -0,0,11,0,0, -0,1,7,1,0, -0,0,15,1,0, -0,1,0,3,0, -5,0,3,1,0, -0,0,4,0,0, -0,0,0,1,0, -0,0,22,0,0, -0,1,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,2,0,0, -0,1,2,2,0, -0,0,2,0,0, -0,0,1,2,0, -0,0,3,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,10,0,0, -0,0,0,0,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,0,3,0, -0,1,11,0,0, -0,0,23,3,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,1,0,0, -0,0,11,1,0, -0,0,4,3,0, -0,0,5,1,0, -0,0,0,3,0, -0,0,0,1,0, -0,0,9,4,0, -0,0,6,2,0, -0,0,24,0,0, -0,1,0,0,0, -0,0,28,0,0, -0,0,3,0,0, -0,0,2,0,0, -0,0,20,0,0, -0,0,10,0,0, -0,3,12,0,0, -0,0,21,1,0, -0,0,6,1,0, -0,0,48,1,0, -0,0,4,1,0, -0,0,0,0,0, -0,0,1,6,0, -0,0,0,1,0, -0,0,3,2,0, -0,0,11,1,0, -0,0,5,2,0, -0,0,10,0,0, -0,0,0,0,0, -0,0,49,2,0, -0,0,28,2,0, -0,0,4,4,0, -0,0,10,0,0, -0,0,6,1,0, -0,0,0,0,0, -0,0,38,0,0, -0,1,8,1,0, -0,0,5,0,0, -0,0,1,0,0, -0,0,8,0,0, -0,0,3,1,0, -0,0,1,0,0, -0,0,2,2,0, -0,0,28,2,0, -0,0,10,0,0, -0,0,18,2,0, -0,0,6,4,0, -0,0,10,0,0, -0,0,0,1,0, -0,0,4,2,0, -0,0,3,1,0, -0,0,5,1,0, -0,0,11,4,0, -0,0,9,0,0, -0,0,9,0,0, -0,0,0,2,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,0,0,0, -18,0,5,1,0, -0,0,11,1,0, -0,0,2,0,0, -0,0,12,4,0, -0,0,4,3,0, -0,0,0,12,0, -0,0,0,1,0, -0,0,7,2,0, -0,0,0,0,0, -0,0,5,0,0, -0,0,31,2,0, -0,0,12,0,0, -0,0,0,0,0, -0,0,12,0,2, -0,0,10,2,0, -0,1,0,0,0, -0,0,8,3,0, -0,0,32,0,0, -0,2,5,6,0, -0,3,12,0,0, -0,0,0,3,0, -0,0,3,0,0, -0,0,3,7,0, -0,0,0,1,0, -0,0,4,4,0, -0,0,8,5,0, -0,0,5,0,0, -0,0,0,1,0, -0,1,22,0,0, -0,0,0,1,0, -0,0,15,0,0, -0,0,5,0,0, -1,0,0,2,0, -0,0,9,0,0, -0,0,0,2,0, -0,0,20,0,0, -6,0,2,2,0, -0,0,0,0,0, -0,0,5,10,0, -0,0,3,0,0, -0,0,0,2,0, -5,0,0,1,0, -0,1,0,2,0, -0,0,11,1,0, -0,1,2,1,0, -0,0,5,4,0, -0,0,0,1,0, -0,0,24,0,0, -0,0,10,2,0, -0,0,0,0,0, -0,0,4,0,0, -0,0,6,1,0, -0,0,14,1,0, -0,0,8,1,0, -0,0,0,2,0, -0,1,22,0,0, -0,0,7,1,0, -0,0,11,0,0, -0,0,6,0,0, -0,0,1,2,0, -0,1,14,1,0, -0,0,7,0,0, -0,1,8,0,0, -0,0,16,0,0, -0,0,3,2,0, -0,2,5,6,0, -0,0,13,0,0, -0,0,0,1,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,8,0,0, -0,0,0,1,0, -0,0,2,0,0, -0,0,5,0,0, -0,0,9,1,0, -0,0,23,0,0, -0,0,11,0,0, -0,0,1,3,0, -0,0,0,2,0, -0,0,1,0,0, -0,0,0,0,0, -0,0,0,1,0, -0,0,3,0,0, -0,1,4,0,0, -0,0,0,0,0, -0,0,6,2,0, -0,0,0,0,0, -0,0,7,2,0, -0,0,0,1,0, -0,2,25,1,0, -0,0,44,1,0, -0,0,4,3,0, -0,0,26,1,0, -0,0,14,0,0, -0,0,11,1,0, -0,0,14,0,0, -0,0,13,6,0, -0,0,21,0,0, -0,0,0,1,0, -1,0,10,3,0, -0,0,0,0,0, -0,0,19,0,0, -0,0,12,0,0, -0,1,15,0,0, -27,0,19,0,0, -0,0,0,1,0, -5,0,0,0,0, -0,0,1,1,0, -0,0,8,0,0, -0,3,6,4,0, -0,0,2,0,0, -0,1,18,0,0, -0,0,1,0,0, -0,0,0,3,0, -0,0,0,2,0, -0,0,5,2,0, -0,0,7,0,0, -0,0,0,8,0, -0,0,0,0,0, -0,0,24,1,0, -0,0,44,1,0, -0,0,25,1,0, -0,0,3,0,0, -0,0,0,0,0, -0,1,0,0,0, -0,0,0,0,0, -0,0,0,0,0, -0,0,0,2,0, -0,0,9,1,0, -0,0,0,2,0, -0,0,0,2,0, -0,0,6,2,0, -0,0,5,9,0, -0,0,19,0,0, -0,1,0,0,0, -0,0,0,1,0, -0,0,2,0,0, -0,0,12,2,0, -0,0,0,0,0, -0,0,0,0,0}; - -std::array ref_data = { --2.462783453866639771e+00 / ln2, --7.789351191264211494e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.763732050866829049e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.160925916687072679e+00 / ln2, --1.095979992273871417e+01 / ln2, --5.861249608063488381e+00 / ln2, --6.885183121012873109e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.210947893307020351e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.061406875134344041e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.798856991358857016e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.511251163267971265e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.909176526836401599e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.278597058620684734e+00 / ln2, --5.617458030859222795e+00 / ln2, --7.223375476872481826e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.670124616416384100e+00 / ln2, --6.425466655005584116e+00 / ln2, --7.959852224170357538e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.674700103110665417e+00 / ln2, --7.223375476872481826e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.091764045676016259e+00 / ln2, --8.098608047708514945e+00 / ln2, --4.424715454340284460e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.949336081541920507e+00 / ln2, --6.215435559384440367e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.284098860888144067e+00 / ln2, --7.766312407968571918e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.021711310391386185e+00 / ln2, --7.711929296494973940e+00 / ln2, --1.278432279724004239e+01 / ln2, --1.105715580744062621e+01 / ln2, --6.694546051260094721e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.152879364568431875e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.789351191264211494e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.021711310391386185e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.223992983953650970e+00 / ln2, --9.230539968036323373e+00 / ln2, --4.498412758302154479e+00 / ln2, --8.417223922976480921e+00 / ln2, --8.746627133441950974e+00 / ln2, --9.484310506563019771e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.949336081541920507e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --1.194242396538278683e+01 / ln2, --4.841396924932839241e+00 / ln2, --9.662729593866675515e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.893167479319754598e+00 / ln2, --9.121101243974623074e+00 / ln2, --6.971660331060701488e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.812113812154088954e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.909735959825669127e+00 / ln2, --7.766312407968571918e+00 / ln2, --4.091764045676016259e+00 / ln2, --1.039337502338793939e+01 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.758886612591042287e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.278432279724004239e+01 / ln2, --9.370236207688265040e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.021711310391386185e+00 / ln2, --6.584033785323046395e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.971660331060701488e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.812113812154088954e+00 / ln2, --4.754337034915018023e+00 / ln2, --1.204137922631861990e+01 / ln2, --4.424715454340284460e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.867084829257056988e+00 / ln2, --7.413281563246960637e+00 / ln2, --6.352896081343149426e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.621647006643879507e+00 / ln2, --9.069538553398722058e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.598045803528568953e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.284098860888144067e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.210947893307020351e+00 / ln2, --7.766312407968571918e+00 / ln2, --6.006187732178176475e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.332499360388146314e+00 / ln2, --7.742568993938474087e+00 / ln2, --5.949336081541920507e+00 / ln2, --9.615348029313974365e+00 / ln2, --9.583781920109638364e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.267062386635592119e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.841396924932839241e+00 / ln2, --8.098608047708514945e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.605315052977417167e+00 / ln2, --6.584033785323046395e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --1.264380688290192367e+01 / ln2, --9.785577344871311922e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.641510812793480767e+00 / ln2, --6.006187732178176475e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.621647006643879507e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.424166483534085259e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.893167479319754598e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --1.925486712770660702e+01 / ln2, --8.350828230729891999e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.648035504600203538e+00 / ln2, --1.101578299844018893e+01 / ln2, --8.350828230729891999e+00 / ln2, --9.294588429854087508e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.998325418845404933e+00 / ln2, --9.257233588034425864e+00 / ln2, --5.536137450497251145e+00 / ln2, --9.563168690224490120e+00 / ln2, --6.006187732178176475e+00 / ln2, --7.934968049655386935e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.636130365971254719e+00 / ln2, --8.951382076635610474e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --1.168986496391243612e+01 / ln2, --7.048892879291960512e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.007365244407383287e+00 / ln2, --9.883349451013705433e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.425466655005584116e+00 / ln2, --6.425466655005584116e+00 / ln2, --8.884045802498089728e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.195119186325862337e+00 / ln2, --8.777444697110189153e+00 / ln2, --6.049433957816686913e+00 / ln2, --1.061406875134344041e+01 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.694546051260094721e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.424715454340284460e+00 / ln2, --7.865295069725402044e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.947297936873974677e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.245710019274113733e+00 / ln2, --7.021711310391386185e+00 / ln2, --9.442907637099850149e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.447790001659071457e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.224702791393450951e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.871019786565007337e+00 / ln2, --1.145387772643075230e+01 / ln2, --4.091764045676016259e+00 / ln2, --8.071909107879246648e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.231247566439284569e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --8.951382076635610474e+00 / ln2, --5.536137450497251145e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.223992983953650970e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.105715580744062621e+01 / ln2, --7.161725488083725111e+00 / ln2, --4.160925916687072679e+00 / ln2, --9.069538553398722058e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.483355190078385455e+00 / ln2, --5.284098860888144067e+00 / ln2, --6.909735959825669127e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.909735959825669127e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.841396924932839241e+00 / ln2, --9.883349451013705433e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.286368968884687547e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.345707246405288160e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.907309388480081580e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.511251163267971265e+00 / ln2, --9.172628873852490372e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.674889513884615155e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.442907637099850149e+00 / ln2, --5.754707819725457085e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.949336081541920507e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --8.537479860740265991e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.909735959825669127e+00 / ln2, --9.779642293724309710e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.177102904471855283e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.278432279724004239e+01 / ln2, --5.685674146241039395e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.734695089071365715e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --8.847574884292626507e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.807386367050035858e+00 / ln2, --1.359735121802292568e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --8.537479860740265991e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.025011173880692184e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --1.098983619591661487e+01 / ln2, --1.125542566348871354e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.130525701277283801e+01 / ln2, --5.861249608063488381e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.017498482476998589e+00 / ln2, --7.210947893307020351e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.766312407968571918e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.512580640245118957e+00 / ln2, --8.022806380334262855e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --9.370236207688265040e+00 / ln2, --9.294209431283057654e+00 / ln2, --5.617458030859222795e+00 / ln2, --1.070585939587089008e+01 / ln2, --9.670124616416384100e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.057958593457523300e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.370236207688265040e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.044570027672111756e+01 / ln2, --6.352896081343149426e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.397372105698754474e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.425466655005584116e+00 / ln2, --1.094874312386789583e+01 / ln2, --3.296199802569410142e+00 / ln2, --8.807386367050035858e+00 / ln2, --5.542219003269678979e+00 / ln2, --6.458537022627602653e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.215435559384440367e+00 / ln2, --1.268608111131628036e+01 / ln2, --3.631360480608693209e+00 / ln2, --1.087984978545612869e+01 / ln2, --2.046324443145273619e+00 / ln2, --9.069538553398722058e+00 / ln2, --9.760673288736205322e+00 / ln2, --5.193805121009943626e+00 / ln2, --1.002033673403993674e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.537479860740265991e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.184300953920424782e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.648035504600203538e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.345707246405288160e+00 / ln2, --5.621647006643879507e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.949336081541920507e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.517325864764372589e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.871019786565007337e+00 / ln2, --7.327920672174300876e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.685674146241039395e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.699896352130231492e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.210947893307020351e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.425466655005584116e+00 / ln2, --1.087984978545612869e+01 / ln2, --1.194242396538278683e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --7.267062386635592119e+00 / ln2, --6.327963919515099178e+00 / ln2, --3.949349394517413181e+00 / ln2, --8.951382076635610474e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.636130365971254719e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.621647006643879507e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.290844047540147699e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.884045802498089728e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.415204418624045779e+00 / ln2, --1.021438454248509764e+01 / ln2, --5.332499360388146314e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.290844047540147699e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.290844047540147699e+00 / ln2, --1.083865141940506760e+01 / ln2, --7.327920672174300876e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.286368968884687547e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.584033785323046395e+00 / ln2, --1.050516998695719195e+01 / ln2, --6.498914935067912069e+00 / ln2, --8.859835387901323855e+00 / ln2, --6.532634035752141521e+00 / ln2, --7.124880459954479939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.517562281884773157e+00 / ln2, --1.123286076255336674e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.119927210762653225e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.868991888563591885e+00 / ln2, --5.959821016291367179e+00 / ln2, --5.542219003269678979e+00 / ln2, --6.694546051260094721e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.286368968884687547e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.152879364568431875e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.069538553398722058e+00 / ln2, --9.852642968671261769e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.181145976660216590e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.332499360388146314e+00 / ln2, --8.657273747556139654e+00 / ln2, --1.019261621630061398e+01 / ln2, --5.397372105698754474e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.763732050866829049e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.031514943090967940e+01 / ln2, --4.604168121450740614e+00 / ln2, --6.286368968884687547e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.617458030859222795e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.177102904471855283e+00 / ln2, --7.503680464488466484e+00 / ln2, --6.121057297107224571e+00 / ln2, --9.442907637099850149e+00 / ln2, --5.177102904471855283e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.642897843502046484e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.689409517815276374e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.025159966901359709e+01 / ln2, --3.631360480608693209e+00 / ln2, --6.007365244407383287e+00 / ln2, --7.267062386635592119e+00 / ln2, --7.358997954444022938e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.483355190078385455e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.284098860888144067e+00 / ln2, --1.171395710922925026e+01 / ln2, --5.284098860888144067e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.754337034915018023e+00 / ln2, --8.140218559980493040e+00 / ln2, --7.223375476872481826e+00 / ln2, --1.836307946957008141e+01 / ln2, --4.562852777492357070e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.168986496391243612e+01 / ln2, --3.631360480608693209e+00 / ln2, --6.944473462017027643e+00 / ln2, --8.071909107879246648e+00 / ln2, --6.012689565822368465e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.067243984851346639e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.286368968884687547e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.424166483534085259e+00 / ln2, --6.674700103110665417e+00 / ln2, --5.861249608063488381e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.720134407192276171e+00 / ln2, --5.542219003269678979e+00 / ln2, --5.113891938530826131e+00 / ln2, --7.210947893307020351e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.617690255987351833e+00 / ln2, --5.861249608063488381e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.885183121012873109e+00 / ln2, --5.195119186325862337e+00 / ln2, --6.236592765249644010e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.143258596730222187e+01 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.883577810848264811e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.316943408775147262e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.861249608063488381e+00 / ln2, --1.130108731959751189e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.327963919515099178e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.919649166968065757e+00 / ln2, --1.130108731959751189e+01 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.691538586043964010e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.893167479319754598e+00 / ln2, --1.048696560647437082e+01 / ln2, --3.296199802569410142e+00 / ln2, --6.600485884087979649e+00 / ln2, --7.021711310391386185e+00 / ln2, --6.152879364568431875e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.316943408775147262e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.184300953920424782e+00 / ln2, --7.021711310391386185e+00 / ln2, --6.512580640245118957e+00 / ln2, --5.754707819725457085e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.017498482476998589e+00 / ln2, --9.294588429854087508e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.397372105698754474e+00 / ln2, --1.040237040920392531e+01 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.069538553398722058e+00 / ln2, --4.998325418845404933e+00 / ln2, --7.161725488083725111e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.083865141940506760e+01 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.745862952448395511e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.694095152899173229e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.289077351069391142e+00 / ln2, --4.511251163267971265e+00 / ln2, --7.119927210762653225e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.883577810848264811e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.231385546183886959e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --9.469708295055941250e+00 / ln2, --6.947297936873974677e+00 / ln2, --7.689409517815276374e+00 / ln2, --5.833531233360072399e+00 / ln2, --7.267062386635592119e+00 / ln2, --9.370236207688265040e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.183140534972725533e+00 / ln2, --8.319852591139634157e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.584033785323046395e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.557802589052355913e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.150475124638018443e+01 / ln2, --3.296199802569410142e+00 / ln2, --7.267062386635592119e+00 / ln2, --7.327920672174300876e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.812611176663798673e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.833531233360072399e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.517325864764372589e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.264380688290192367e+01 / ln2, --4.919649166968065757e+00 / ln2, --5.397372105698754474e+00 / ln2, --6.424166483534085259e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.397372105698754474e+00 / ln2, --6.406237793012392601e+00 / ln2, --9.760673288736205322e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.874321064688381000e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.195119186325862337e+00 / ln2, --1.125542566348871354e+01 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.044570027672111756e+01 / ln2, --5.536137450497251145e+00 / ln2, --5.397372105698754474e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.049563242290908249e+00 / ln2, --1.264380688290192367e+01 / ln2, --4.091764045676016259e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.997831470194255665e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.284098860888144067e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.829467623163949952e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.648035504600203538e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --1.050516998695719195e+01 / ln2, --7.021711310391386185e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.553188966816772876e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.584033785323046395e+00 / ln2, --1.130525701277283801e+01 / ln2, --1.028217115906610246e+01 / ln2, --6.971660331060701488e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.437619382108458410e+00 / ln2, --5.542219003269678979e+00 / ln2, --9.988776888454795611e+00 / ln2, --3.949349394517413181e+00 / ln2, --8.070842469545034703e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.883577810848264811e+00 / ln2, --7.703898338055121364e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.936476480951127677e+00 / ln2, --7.299334151304765150e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --1.268608111131628036e+01 / ln2, --4.424715454340284460e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --9.883349451013705433e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.223992983953650970e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --8.812611176663798673e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.067243984851346639e+00 / ln2, --8.847574884292626507e+00 / ln2, --4.642897843502046484e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --1.268608111131628036e+01 / ln2, --6.006187732178176475e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.959821016291367179e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.871019786565007337e+00 / ln2, --1.061406875134344041e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.143258596730222187e+01 / ln2, --7.800758034760048254e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.177102904471855283e+00 / ln2, --6.236592765249644010e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --8.911633169851866043e+00 / ln2, --4.893167479319754598e+00 / ln2, --8.179445530167162914e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.584033785323046395e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.532634035752141521e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.017498482476998589e+00 / ln2, --1.166627883103860697e+01 / ln2, --1.030807112927032776e+01 / ln2, --4.562852777492357070e+00 / ln2, --5.798856991358857016e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.503680464488466484e+00 / ln2, --5.758886612591042287e+00 / ln2, --1.068317631220670449e+01 / ln2, --4.893167479319754598e+00 / ln2, --7.503680464488466484e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.350828230729891999e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.316943408775147262e+00 / ln2, --6.512580640245118957e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.015500071551313432e+01 / ln2, --4.562852777492357070e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.536137450497251145e+00 / ln2, --6.720134407192276171e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.012689565822368465e+00 / ln2, --6.512580640245118957e+00 / ln2, --7.641510812793480767e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.923664837455273613e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.193805121009943626e+00 / ln2, --1.194242396538278683e+01 / ln2, --4.893167479319754598e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.754337034915018023e+00 / ln2, --8.022806380334262855e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.812268409318086526e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.352896081343149426e+00 / ln2, --6.812113812154088954e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.959821016291367179e+00 / ln2, --6.286368968884687547e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.068317631220670449e+01 / ln2, --2.462783453866639771e+00 / ln2, --5.536137450497251145e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.152879364568431875e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.511251163267971265e+00 / ln2, --8.022806380334262855e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --1.048696560647437082e+01 / ln2, --7.689409517815276374e+00 / ln2, --9.793394681581565564e+00 / ln2, --6.067243984851346639e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.087984978545612869e+01 / ln2, --5.798856991358857016e+00 / ln2, --6.812113812154088954e+00 / ln2, --7.327920672174300876e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.742568993938474087e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.923664837455273613e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.584033785323046395e+00 / ln2, --6.694546051260094721e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.923664837455273613e+00 / ln2, --5.621647006643879507e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.545926888317382009e+00 / ln2, --1.175414779598468940e+01 / ln2, --3.296199802569410142e+00 / ln2, --7.210947893307020351e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.048892879291960512e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.949349394517413181e+00 / ln2, --9.793394681581565564e+00 / ln2, --4.576662416349575935e+00 / ln2, --1.048696560647437082e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.997831470194255665e+00 / ln2, --9.434248995347461531e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.663698816176689910e+00 / ln2, --4.883577810848264811e+00 / ln2, --6.391839193742723246e+00 / ln2, --5.345707246405288160e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.152879364568431875e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.357001407991552000e+00 / ln2, --8.877589121715919518e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.745862952448395511e+00 / ln2, --1.087984978545612869e+01 / ln2, --7.186698218369051538e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.258907280406040030e+01 / ln2, --4.143181862813722027e+00 / ln2, --7.720199943466562686e+00 / ln2, --9.347814457090896312e+00 / ln2, --4.919649166968065757e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.949336081541920507e+00 / ln2, --5.617458030859222795e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.944473462017027643e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.745862952448395511e+00 / ln2, --4.580662492468392522e+00 / ln2, --8.245710019274113733e+00 / ln2, --5.553599664845023653e+00 / ln2, --4.576662416349575935e+00 / ln2, --1.073778889043102325e+01 / ln2, --4.998325418845404933e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.949336081541920507e+00 / ln2, --6.909735959825669127e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.883577810848264811e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.909735959825669127e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.049433957816686913e+00 / ln2, --8.438636990658810788e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.909176526836401599e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.406237793012392601e+00 / ln2, --4.883577810848264811e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.871019786565007337e+00 / ln2, --9.563168690224490120e+00 / ln2, --6.017498482476998589e+00 / ln2, --7.517325864764372589e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.259851116637276114e+00 / ln2, --1.057306084326360640e+01 / ln2, --6.458537022627602653e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.745862952448395511e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.424166483534085259e+00 / ln2, --4.919649166968065757e+00 / ln2, --1.165915831016035398e+01 / ln2, --4.160925916687072679e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.812113812154088954e+00 / ln2, --6.007365244407383287e+00 / ln2, --8.598045803528568953e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.617458030859222795e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.286368968884687547e+00 / ln2, --5.674889513884615155e+00 / ln2, --1.028217115906610246e+01 / ln2, --4.919649166968065757e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.113891938530826131e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.019261621630061398e+01 / ln2, --4.049563242290908249e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.017498482476998589e+00 / ln2, --1.000340241762609317e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.511251163267971265e+00 / ln2, --8.350828230729891999e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.745862952448395511e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.997831470194255665e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.742568993938474087e+00 / ln2, --7.881364862260915594e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.833531233360072399e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.871019786565007337e+00 / ln2, --6.532634035752141521e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.152114117370445001e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.867084829257056988e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.318139382317166763e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.971660331060701488e+00 / ln2, --6.006187732178176475e+00 / ln2, --1.224969357884932641e+01 / ln2, --4.919649166968065757e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.517562281884773157e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.301233579505205462e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.694095152899173229e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --1.143258596730222187e+01 / ln2, --4.604168121450740614e+00 / ln2, --6.352896081343149426e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.512580640245118957e+00 / ln2, --7.289077351069391142e+00 / ln2, --7.447790001659071457e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.103230206446424333e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.758886612591042287e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.437619382108458410e+00 / ln2, --7.619344887229415164e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.694095152899173229e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.057306084326360640e+01 / ln2, --6.463978470342545357e+00 / ln2, --1.050516998695719195e+01 / ln2, --2.046324443145273619e+00 / ln2, --8.537479860740265991e+00 / ln2, --6.909176526836401599e+00 / ln2, --7.517325864764372589e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.617690255987351833e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.021438454248509764e+01 / ln2, --4.576662416349575935e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.542219003269678979e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.406237793012392601e+00 / ln2, --4.091764045676016259e+00 / ln2, --8.812611176663798673e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.874321064688381000e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.674889513884615155e+00 / ln2, --5.871019786565007337e+00 / ln2, --8.181145976660216590e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.183140534972725533e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.515023211937145398e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.154814228758357153e+01 / ln2, --4.642897843502046484e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.971660331060701488e+00 / ln2, --5.949336081541920507e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.954184282296374420e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.356251338206809542e+00 / ln2, --6.006187732178176475e+00 / ln2, --5.754707819725457085e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.332499360388146314e+00 / ln2, --1.095979992273871417e+01 / ln2, --3.296199802569410142e+00 / ln2, --5.621647006643879507e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.295589409525732094e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.685674146241039395e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.833531233360072399e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.883349451013705433e+00 / ln2, --4.998325418845404933e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.286368968884687547e+00 / ln2, --5.332499360388146314e+00 / ln2, --7.553188966816772876e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.670124616416384100e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.517562281884773157e+00 / ln2, --7.959852224170357538e+00 / ln2, --1.150475124638018443e+01 / ln2, --5.195119186325862337e+00 / ln2, --6.909735959825669127e+00 / ln2, --7.517325864764372589e+00 / ln2, --6.532634035752141521e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.425466655005584116e+00 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.290844047540147699e+00 / ln2, --4.841396924932839241e+00 / ln2, --8.350828230729891999e+00 / ln2, --5.536137450497251145e+00 / ln2, --1.130525701277283801e+01 / ln2, --8.859835387901323855e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.636130365971254719e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.532634035752141521e+00 / ln2, --6.512580640245118957e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.021438454248509764e+01 / ln2, --3.296199802569410142e+00 / ln2, --3.949349394517413181e+00 / ln2, --9.447855320106350874e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.893167479319754598e+00 / ln2, --8.847574884292626507e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.286368968884687547e+00 / ln2, --6.694546051260094721e+00 / ln2, --1.070585939587089008e+01 / ln2, --2.046324443145273619e+00 / ln2, --1.025159966901359709e+01 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.424166483534085259e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.104077188637425877e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.621647006643879507e+00 / ln2, --6.694546051260094721e+00 / ln2, --6.720134407192276171e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.021711310391386185e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.025011173880692184e+01 / ln2, --4.754337034915018023e+00 / ln2, --5.177102904471855283e+00 / ln2, --9.563168690224490120e+00 / ln2, --4.691538586043964010e+00 / ln2, --8.838166443014722873e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.689409517815276374e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.694546051260094721e+00 / ln2, --5.553599664845023653e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.859835387901323855e+00 / ln2, --4.691538586043964010e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.754707819725457085e+00 / ln2, --7.000368956169869428e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.754707819725457085e+00 / ln2, --4.642897843502046484e+00 / ln2, --5.754707819725457085e+00 / ln2, --1.094874312386789583e+01 / ln2, --4.091764045676016259e+00 / ln2, --7.104077188637425877e+00 / ln2, --5.316943408775147262e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.223992983953650970e+00 / ln2, --6.223992983953650970e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.012900414694919959e+01 / ln2, --2.462783453866639771e+00 / ln2, --6.663698816176689910e+00 / ln2, --4.642897843502046484e+00 / ln2, --5.758886612591042287e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.511251163267971265e+00 / ln2, --6.425466655005584116e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.810898878696857395e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --5.923664837455273613e+00 / ln2, --8.657273747556139654e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.022806380334262855e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.345707246405288160e+00 / ln2, --9.465543819552042493e+00 / ln2, --5.195119186325862337e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.516887900787997623e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.172628873852490372e+00 / ln2, --9.670124616416384100e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.177102904471855283e+00 / ln2, --9.315078460598257948e+00 / ln2, --6.286368968884687547e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.685674146241039395e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.000368956169869428e+00 / ln2, --8.098608047708514945e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.345707246405288160e+00 / ln2, --8.005103642565483568e+00 / ln2, --5.861249608063488381e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.152879364568431875e+00 / ln2, --7.278597058620684734e+00 / ln2, --8.232504733803645891e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.121057297107224571e+00 / ln2, --5.415204418624045779e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.529197793097948121e+00 / ln2, --8.233702486883688110e+00 / ln2, --6.017498482476998589e+00 / ln2, --9.069538553398722058e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.152114117370445001e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.621647006643879507e+00 / ln2, --6.584033785323046395e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.382633526813590308e+00 / ln2, --5.542219003269678979e+00 / ln2, --5.113891938530826131e+00 / ln2, --1.105715580744062621e+01 / ln2, --7.184300953920424782e+00 / ln2, --6.512580640245118957e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.230539968036323373e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.290844047540147699e+00 / ln2, --7.359401430306112601e+00 / ln2, --1.264380688290192367e+01 / ln2, --8.598045803528568953e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.867084829257056988e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.007365244407383287e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.210947893307020351e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.231385546183886959e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.663698816176689910e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.152879364568431875e+00 / ln2, --5.177102904471855283e+00 / ln2, --7.290844047540147699e+00 / ln2, --9.852642968671261769e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.641510812793480767e+00 / ln2, --7.447790001659071457e+00 / ln2, --4.691538586043964010e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.576662416349575935e+00 / ln2, --8.859835387901323855e+00 / ln2, --5.113891938530826131e+00 / ln2, --7.959852224170357538e+00 / ln2, --6.909735959825669127e+00 / ln2, --6.152879364568431875e+00 / ln2, --8.838166443014722873e+00 / ln2, --6.694546051260094721e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.511251163267971265e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.091764045676016259e+00 / ln2, --9.990045079829323882e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.691538586043964010e+00 / ln2, --7.810898878696857395e+00 / ln2, --6.517562281884773157e+00 / ln2, --5.754707819725457085e+00 / ln2, --1.106006057964308731e+01 / ln2, --2.046324443145273619e+00 / ln2, --1.087984978545612869e+01 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.674700103110665417e+00 / ln2, --9.779642293724309710e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.290844047540147699e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.871019786565007337e+00 / ln2, --1.132541823088126165e+01 / ln2, --6.885183121012873109e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.536137450497251145e+00 / ln2, --8.777444697110189153e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.124880459954479939e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.517325864764372589e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.071750970431373773e+01 / ln2, --3.296199802569410142e+00 / ln2, --8.350828230729891999e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.210947893307020351e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.113891938530826131e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.691538586043964010e+00 / ln2, --1.025159966901359709e+01 / ln2, --2.462783453866639771e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --9.883349451013705433e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.745862952448395511e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --8.179445530167162914e+00 / ln2, --5.195119186325862337e+00 / ln2, --8.071909107879246648e+00 / ln2, --6.947297936873974677e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.812113812154088954e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.139296906381306052e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.674889513884615155e+00 / ln2, --8.382633526813590308e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.327963919515099178e+00 / ln2, --9.121101243974623074e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.883349451013705433e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.553599664845023653e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.553188966816772876e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.091764045676016259e+00 / ln2, --8.774158714333733400e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.812113812154088954e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.286368968884687547e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.764755566332865122e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.998325418845404933e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.766312407968571918e+00 / ln2, --9.357001407991552000e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.268608111131628036e+01 / ln2, --9.026976322186319734e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.598045803528568953e+00 / ln2, --5.997831470194255665e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.959852224170357538e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.193805121009943626e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.095979992273871417e+01 / ln2, --5.536137450497251145e+00 / ln2, --5.685674146241039395e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.909735959825669127e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.415204418624045779e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.356251338206809542e+00 / ln2, --1.013779020202142256e+01 / ln2, --1.090932255574468179e+01 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --1.301233579505205462e+01 / ln2, --4.511251163267971265e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.098983619591661487e+01 / ln2, --1.359735121802292568e+01 / ln2, --2.046324443145273619e+00 / ln2, --1.264380688290192367e+01 / ln2, --3.631360480608693209e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.006187732178176475e+00 / ln2, --1.025159966901359709e+01 / ln2, --8.350828230729891999e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.095496646895064785e+01 / ln2, --3.631360480608693209e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.039337502338793939e+01 / ln2, --5.415204418624045779e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.868991888563591885e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --9.493114258108283465e+00 / ln2, --1.194242396538278683e+01 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.754337034915018023e+00 / ln2, --8.838166443014722873e+00 / ln2, --1.171395710922925026e+01 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.210947893307020351e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.515023211937145398e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.327920672174300876e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.267062386635592119e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --8.746627133441950974e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.812113812154088954e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.358997954444022938e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.048892879291960512e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.397372105698754474e+00 / ln2, --4.893167479319754598e+00 / ln2, --1.025011173880692184e+01 / ln2, --6.954184282296374420e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.316943408775147262e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.232504733803645891e+00 / ln2, --4.604168121450740614e+00 / ln2, --8.847574884292626507e+00 / ln2, --6.424166483534085259e+00 / ln2, --6.515023211937145398e+00 / ln2, --5.758886612591042287e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.662729593866675515e+00 / ln2, --7.683429021422371719e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.268608111131628036e+01 / ln2, --5.553599664845023653e+00 / ln2, --5.193805121009943626e+00 / ln2, --1.175414779598468940e+01 / ln2, --8.957187461268130590e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.071909107879246648e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.867084829257056988e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.193805121009943626e+00 / ln2, --9.434248995347461531e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.005049580306630475e+01 / ln2, --8.663408750741215414e+00 / ln2, --5.542219003269678979e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.537479860740265991e+00 / ln2, --4.893167479319754598e+00 / ln2, --8.598045803528568953e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.050516998695719195e+01 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.584033785323046395e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.085914756101938572e+01 / ln2, --4.604168121450740614e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.893167479319754598e+00 / ln2, --7.183140534972725533e+00 / ln2, --6.286368968884687547e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.754707819725457085e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.774158714333733400e+00 / ln2, --9.026976322186319734e+00 / ln2, --6.223992983953650970e+00 / ln2, --7.119927210762653225e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.553599664845023653e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.923664837455273613e+00 / ln2, --5.923664837455273613e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.812113812154088954e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.685674146241039395e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.683429021422371719e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.883577810848264811e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.140218559980493040e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.210947893307020351e+00 / ln2, --1.166627883103860697e+01 / ln2, --2.462783453866639771e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.007365244407383287e+00 / ln2, --7.810898878696857395e+00 / ln2, --7.516887900787997623e+00 / ln2, --6.017498482476998589e+00 / ln2, --7.278597058620684734e+00 / ln2, --5.923664837455273613e+00 / ln2, --8.838166443014722873e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.006187732178176475e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.503680464488466484e+00 / ln2, --6.971660331060701488e+00 / ln2, --7.184300953920424782e+00 / ln2, --3.949349394517413181e+00 / ln2, --8.022806380334262855e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.498914935067912069e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.425466655005584116e+00 / ln2, --5.621647006643879507e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.195119186325862337e+00 / ln2, --1.057306084326360640e+01 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.152879364568431875e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.278597058620684734e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --1.039337502338793939e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.458537022627602653e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.290844047540147699e+00 / ln2, --6.327963919515099178e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.584033785323046395e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.564037047890797894e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.424166483534085259e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.184300953920424782e+00 / ln2, --1.030807112927032776e+01 / ln2, --6.694546051260094721e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.836307946957008141e+01 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.104077188637425877e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.936476480951127677e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.793394681581565564e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.517325864764372589e+00 / ln2, --7.517325864764372589e+00 / ln2, --1.269438761816860683e+01 / ln2, --8.495410644101937692e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.286368968884687547e+00 / ln2, --7.711929296494973940e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.415204418624045779e+00 / ln2, --1.095979992273871417e+01 / ln2, --5.193805121009943626e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.711929296494973940e+00 / ln2, --5.754707819725457085e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.184300953920424782e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.542219003269678979e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.909176526836401599e+00 / ln2, --7.684202738748299844e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.050516998695719195e+01 / ln2, --2.462783453866639771e+00 / ln2, --5.542219003269678979e+00 / ln2, --9.648035504600203538e+00 / ln2, --7.104077188637425877e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.683429021422371719e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.442907637099850149e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.012900414694919959e+01 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.532634035752141521e+00 / ln2, --6.017498482476998589e+00 / ln2, --9.404417952869394526e+00 / ln2, --1.057306084326360640e+01 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.742568993938474087e+00 / ln2, --8.231385546183886959e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.278597058620684734e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.883577810848264811e+00 / ln2, --6.808146457075214819e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.909735959825669127e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.223992983953650970e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.909176526836401599e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.061406875134344041e+01 / ln2, --4.160925916687072679e+00 / ln2, --4.091764045676016259e+00 / ln2, --9.579468945846944194e+00 / ln2, --6.327963919515099178e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.684202738748299844e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.745862952448395511e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.511251163267971265e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.944473462017027643e+00 / ln2, --7.119927210762653225e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.278597058620684734e+00 / ln2, --6.745862952448395511e+00 / ln2, --7.267062386635592119e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.160925916687072679e+00 / ln2, --8.319852591139634157e+00 / ln2, --1.265454555757358079e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.758886612591042287e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.909735959825669127e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --7.959852224170357538e+00 / ln2, --8.847574884292626507e+00 / ln2, --5.674889513884615155e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.039337502338793939e+01 / ln2, --6.936476480951127677e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.069538553398722058e+00 / ln2, --7.483355190078385455e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.812268409318086526e+00 / ln2, --6.909176526836401599e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.017498482476998589e+00 / ln2, --7.720199943466562686e+00 / ln2, --7.368858813512747297e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.345707246405288160e+00 / ln2, --7.299334151304765150e+00 / ln2, --9.829467623163949952e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.397372105698754474e+00 / ln2, --5.345707246405288160e+00 / ln2, --6.223992983953650970e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.971660331060701488e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.021711310391386185e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.048892879291960512e+00 / ln2, --8.437619382108458410e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.742568993938474087e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.812268409318086526e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.121057297107224571e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.642897843502046484e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.542219003269678979e+00 / ln2, --5.316943408775147262e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.812113812154088954e+00 / ln2, --5.833531233360072399e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.005049580306630475e+01 / ln2, --6.223992983953650970e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.841396924932839241e+00 / ln2, --7.684202738748299844e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.352896081343149426e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.057958593457523300e+00 / ln2, --9.069538553398722058e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.909735959825669127e+00 / ln2, --1.143258596730222187e+01 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.463978470342545357e+00 / ln2, --6.909735959825669127e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.606027863309607895e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.923664837455273613e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --9.357001407991552000e+00 / ln2, --6.971660331060701488e+00 / ln2, --1.125542566348871354e+01 / ln2, --7.119927210762653225e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.532634035752141521e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.022806380334262855e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.584033785323046395e+00 / ln2, --7.517325864764372589e+00 / ln2, --4.893167479319754598e+00 / ln2, --7.048892879291960512e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.184300953920424782e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.674889513884615155e+00 / ln2, --6.674700103110665417e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.269438761816860683e+01 / ln2, --5.871019786565007337e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.861249608063488381e+00 / ln2, --8.231385546183886959e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.458537022627602653e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.580662492468392522e+00 / ln2, --6.694546051260094721e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.091764045676016259e+00 / ln2, --1.344520137693501916e+01 / ln2, --4.562852777492357070e+00 / ln2, --5.949336081541920507e+00 / ln2, --7.553188966816772876e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.048892879291960512e+00 / ln2, --9.670124616416384100e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.861249608063488381e+00 / ln2, --9.257233588034425864e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.152879364568431875e+00 / ln2, --9.439487004418870342e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.798856991358857016e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.951382076635610474e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.694546051260094721e+00 / ln2, --1.000340241762609317e+01 / ln2, --1.019261621630061398e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.511251163267971265e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.606027863309607895e+00 / ln2, --8.839003156104606518e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.316943408775147262e+00 / ln2, --8.746627133441950974e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.048892879291960512e+00 / ln2, --6.944473462017027643e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.683429021422371719e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.997831470194255665e+00 / ln2, --5.861249608063488381e+00 / ln2, --7.503680464488466484e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.397372105698754474e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.503680464488466484e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.699896352130231492e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.754337034915018023e+00 / ln2, --8.382633526813590308e+00 / ln2, --7.865295069725402044e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.057306084326360640e+01 / ln2, --4.883577810848264811e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.893167479319754598e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.674700103110665417e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.327963919515099178e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.909735959825669127e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.833531233360072399e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.871019786565007337e+00 / ln2, --8.005103642565483568e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.511251163267971265e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.406237793012392601e+00 / ln2, --7.699896352130231492e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.104077188637425877e+00 / ln2, --4.919649166968065757e+00 / ln2, --6.498914935067912069e+00 / ln2, --7.516887900787997623e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.553599664845023653e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.810898878696857395e+00 / ln2, --6.971660331060701488e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.177102904471855283e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.484310506563019771e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.267062386635592119e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.536137450497251145e+00 / ln2, --3.949349394517413181e+00 / ln2, --8.005103642565483568e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.997831470194255665e+00 / ln2, --7.119927210762653225e+00 / ln2, --6.944473462017027643e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.703898338055121364e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.166627883103860697e+01 / ln2, --2.462783453866639771e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.068317631220670449e+01 / ln2, --5.025989230275349939e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --5.542219003269678979e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.657273747556139654e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.642897843502046484e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.327963919515099178e+00 / ln2, --6.121057297107224571e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.358997954444022938e+00 / ln2, --1.087984978545612869e+01 / ln2, --1.087984978545612869e+01 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.803544138091067062e+00 / ln2, --9.793394681581565564e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.997831470194255665e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.498412758302154479e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.934968049655386935e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.839003156104606518e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --8.103230206446424333e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.812113812154088954e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.025011173880692184e+01 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.919649166968065757e+00 / ln2, --6.909176526836401599e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.186698218369051538e+00 / ln2, --5.871019786565007337e+00 / ln2, --6.424166483534085259e+00 / ln2, --7.720199943466562686e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.919649166968065757e+00 / ln2, --8.438636990658810788e+00 / ln2, --7.517325864764372589e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.997831470194255665e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.223992983953650970e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --8.746627133441950974e+00 / ln2, --7.210947893307020351e+00 / ln2, --6.286368968884687547e+00 / ln2, --6.458537022627602653e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.406237793012392601e+00 / ln2, --9.662729593866675515e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.095496646895064785e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.517562281884773157e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.642897843502046484e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.785577344871311922e+00 / ln2, --7.634089783838128973e+00 / ln2, --6.406237793012392601e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.511251163267971265e+00 / ln2, --1.057306084326360640e+01 / ln2, --4.160925916687072679e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.923664837455273613e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.553599664845023653e+00 / ln2, --6.584033785323046395e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.959821016291367179e+00 / ln2, --8.350828230729891999e+00 / ln2, --5.397372105698754474e+00 / ln2, --7.359401430306112601e+00 / ln2, --7.959852224170357538e+00 / ln2, --6.694095152899173229e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.048892879291960512e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.013779020202142256e+01 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --1.094874312386789583e+01 / ln2, --5.025989230275349939e+00 / ln2, --1.115671305913878442e+01 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.867084829257056988e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.316943408775147262e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.865295069725402044e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.283998021384489974e+01 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.236592765249644010e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.139296906381306052e+01 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.397372105698754474e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.576662416349575935e+00 / ln2, --7.764755566332865122e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.397372105698754474e+00 / ln2, --5.621647006643879507e+00 / ln2, --9.988776888454795611e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.829467623163949952e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.210947893307020351e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.810898878696857395e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.691538586043964010e+00 / ln2, --7.720199943466562686e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.720134407192276171e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.536137450497251145e+00 / ln2, --7.210947893307020351e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.193805121009943626e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.057306084326360640e+01 / ln2, --4.424715454340284460e+00 / ln2, --8.877589121715919518e+00 / ln2, --8.179445530167162914e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.231247566439284569e+00 / ln2, --1.125542566348871354e+01 / ln2, --4.998325418845404933e+00 / ln2, --8.070842469545034703e+00 / ln2, --6.512580640245118957e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.357001407991552000e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.584033785323046395e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.210947893307020351e+00 / ln2, --5.177102904471855283e+00 / ln2, --6.954184282296374420e+00 / ln2, --5.754707819725457085e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.040237040920392531e+01 / ln2, --3.296199802569410142e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.642897843502046484e+00 / ln2, --8.005103642565483568e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.095979992273871417e+01 / ln2, --5.193805121009943626e+00 / ln2, --6.007365244407383287e+00 / ln2, --8.245710019274113733e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.215435559384440367e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.424166483534085259e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.517562281884773157e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.160925916687072679e+00 / ln2, --8.777444697110189153e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.800758034760048254e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.868991888563591885e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.511251163267971265e+00 / ln2, --9.465543819552042493e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.210947893307020351e+00 / ln2, --1.042619382222219038e+01 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.177102904471855283e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.919649166968065757e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.604168121450740614e+00 / ln2, --1.087984978545612869e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.424715454340284460e+00 / ln2, --1.030807112927032776e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.223992983953650970e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.021438454248509764e+01 / ln2, --6.517562281884773157e+00 / ln2, --4.998325418845404933e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.615348029313974365e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.763732050866829049e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.439487004418870342e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.160925916687072679e+00 / ln2, --8.812611176663798673e+00 / ln2, --5.332499360388146314e+00 / ln2, --9.907309388480081580e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.183140534972725533e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.397372105698754474e+00 / ln2, --6.944473462017027643e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.511251163267971265e+00 / ln2, --6.885160160725777523e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.415204418624045779e+00 / ln2, --6.517562281884773157e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.621647006643879507e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.469708295055941250e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.865295069725402044e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.019261621630061398e+01 / ln2, --5.177102904471855283e+00 / ln2, --6.012689565822368465e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.177102904471855283e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.223992983953650970e+00 / ln2, --1.194242396538278683e+01 / ln2, --4.143181862813722027e+00 / ln2, --8.812268409318086526e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.048696560647437082e+01 / ln2, --5.871019786565007337e+00 / ln2, --1.040237040920392531e+01 / ln2, --3.631360480608693209e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.971660331060701488e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.071909107879246648e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.091764045676016259e+00 / ln2, --1.044570027672111756e+01 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.458537022627602653e+00 / ln2, --4.998325418845404933e+00 / ln2, --8.859835387901323855e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.358997954444022938e+00 / ln2, --5.685674146241039395e+00 / ln2, --8.233702486883688110e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.424166483534085259e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.642897843502046484e+00 / ln2, --1.278432279724004239e+01 / ln2, --9.026976322186319734e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.742568993938474087e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.030807112927032776e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.694546051260094721e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.160925916687072679e+00 / ln2, --8.382633526813590308e+00 / ln2, --5.861249608063488381e+00 / ln2, --1.168986496391243612e+01 / ln2, --4.883577810848264811e+00 / ln2, --7.959852224170357538e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.424166483534085259e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.936476480951127677e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.909735959825669127e+00 / ln2, --6.006187732178176475e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.161725488083725111e+00 / ln2, --6.327963919515099178e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.694095152899173229e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --1.021438454248509764e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.017498482476998589e+00 / ln2, --1.090932255574468179e+01 / ln2, --5.861249608063488381e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --1.015500071551313432e+01 / ln2, --3.631360480608693209e+00 / ln2, --7.299334151304765150e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.106006057964308731e+01 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.621647006643879507e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.871019786565007337e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.785577344871311922e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.048892879291960512e+00 / ln2, --4.580662492468392522e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.841396924932839241e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.299334151304765150e+00 / ln2, --4.498412758302154479e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.808146457075214819e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.391839193742723246e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --9.615348029313974365e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.576662416349575935e+00 / ln2, --7.184300953920424782e+00 / ln2, --9.370236207688265040e+00 / ln2, --7.865295069725402044e+00 / ln2, --5.871019786565007337e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.883349451013705433e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.512580640245118957e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.617458030859222795e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.657273747556139654e+00 / ln2, --6.720134407192276171e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.517562281884773157e+00 / ln2, --1.040237040920392531e+01 / ln2, --6.694546051260094721e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --6.121057297107224571e+00 / ln2, --7.699896352130231492e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.284098860888144067e+00 / ln2, --6.425466655005584116e+00 / ln2, --1.013779020202142256e+01 / ln2, --4.841396924932839241e+00 / ln2, --1.204137922631861990e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.959821016291367179e+00 / ln2, --6.498914935067912069e+00 / ln2, --6.909735959825669127e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.143258596730222187e+01 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.195119186325862337e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.779642293724309710e+00 / ln2, --4.919649166968065757e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.358997954444022938e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.092512541773554879e+01 / ln2, --1.269438761816860683e+01 / ln2, --4.049563242290908249e+00 / ln2, --9.442907637099850149e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.683429021422371719e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.657273747556139654e+00 / ln2, --4.143181862813722027e+00 / ln2, --9.026976322186319734e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.152879364568431875e+00 / ln2, --6.885183121012873109e+00 / ln2, --8.372987562155319807e+00 / ln2, --7.119927210762653225e+00 / ln2, --5.316943408775147262e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.438636990658810788e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.947297936873974677e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.031514943090967940e+01 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.223992983953650970e+00 / ln2, --6.885160160725777523e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.683429021422371719e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.437619382108458410e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.332499360388146314e+00 / ln2, --1.050516998695719195e+01 / ln2, --5.332499360388146314e+00 / ln2, --8.957187461268130590e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.861249608063488381e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.278597058620684734e+00 / ln2, --4.883577810848264811e+00 / ln2, --8.495410644101937692e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.463978470342545357e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.028217115906610246e+01 / ln2, --4.754337034915018023e+00 / ln2, --8.098608047708514945e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.267062386635592119e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.108260886292240066e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.397372105698754474e+00 / ln2, --8.877589121715919518e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.267062386635592119e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.754707819725457085e+00 / ln2, --6.663698816176689910e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.021438454248509764e+01 / ln2, --7.184300953920424782e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.949336081541920507e+00 / ln2, --7.689409517815276374e+00 / ln2, --5.332499360388146314e+00 / ln2, --8.657273747556139654e+00 / ln2, --4.919649166968065757e+00 / ln2, --7.267062386635592119e+00 / ln2, --6.327963919515099178e+00 / ln2, --5.177102904471855283e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.424715454340284460e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.763732050866829049e+00 / ln2, --8.371748526324319428e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.893167479319754598e+00 / ln2, --8.983215916499753817e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.019261621630061398e+01 / ln2, --3.631360480608693209e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.833531233360072399e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.073778889043102325e+01 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.139296906381306052e+01 / ln2, --8.838166443014722873e+00 / ln2, --9.615348029313974365e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.798856991358857016e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.458537022627602653e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.580662492468392522e+00 / ln2, --6.936476480951127677e+00 / ln2, --5.316943408775147262e+00 / ln2, --1.096048994255763454e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.067243984851346639e+00 / ln2, --6.425466655005584116e+00 / ln2, --8.957187461268130590e+00 / ln2, --9.257233588034425864e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.267062386635592119e+00 / ln2, --7.711929296494973940e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.867084829257056988e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.793394681581565564e+00 / ln2, --5.536137450497251145e+00 / ln2, --7.290844047540147699e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.415204418624045779e+00 / ln2, --1.264380688290192367e+01 / ln2, --5.177102904471855283e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.143181862813722027e+00 / ln2, --9.230539968036323373e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.683429021422371719e+00 / ln2, --6.352896081343149426e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.371748526324319428e+00 / ln2, --8.140218559980493040e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.545926888317382009e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.833531233360072399e+00 / ln2, --8.350828230729891999e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.841396924932839241e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.458537022627602653e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.874321064688381000e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --7.868991888563591885e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.694546051260094721e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.621647006643879507e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.584033785323046395e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.368858813512747297e+00 / ln2, --6.007365244407383287e+00 / ln2, --9.734695089071365715e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.663408750741215414e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.000368956169869428e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.871019786565007337e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.017498482476998589e+00 / ln2, --7.703898338055121364e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.071909107879246648e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.553599664845023653e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.562852777492357070e+00 / ln2, --9.793394681581565564e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.101578299844018893e+01 / ln2, --3.631360480608693209e+00 / ln2, --7.186698218369051538e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.954184282296374420e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.812268409318086526e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.893167479319754598e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.017498482476998589e+00 / ln2, --9.357001407991552000e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.557802589052355913e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.841396924932839241e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --9.026976322186319734e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.119927210762653225e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.685674146241039395e+00 / ln2, --9.224702791393450951e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.532634035752141521e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.415204418624045779e+00 / ln2, --5.685674146241039395e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.621647006643879507e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.165915831016035398e+01 / ln2, --5.195119186325862337e+00 / ln2, --1.054482717141193682e+01 / ln2, --4.841396924932839241e+00 / ln2, --6.694095152899173229e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.397372105698754474e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.048892879291960512e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.424715454340284460e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.397372105698754474e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.316943408775147262e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --1.095979992273871417e+01 / ln2, --5.798856991358857016e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.758886612591042287e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.636130365971254719e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.022806380334262855e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.358997954444022938e+00 / ln2, --4.424715454340284460e+00 / ln2, --7.545926888317382009e+00 / ln2, --8.447106204735684187e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.425466655005584116e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.542219003269678979e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.152879364568431875e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.871019786565007337e+00 / ln2, --7.619344887229415164e+00 / ln2, --4.580662492468392522e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.536137450497251145e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.807386367050035858e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.447106204735684187e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --5.542219003269678979e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.763732050866829049e+00 / ln2, --6.236592765249644010e+00 / ln2, --1.050516998695719195e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.685674146241039395e+00 / ln2, --6.971660331060701488e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.069538553398722058e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.763732050866829049e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.113891938530826131e+00 / ln2, --9.484310506563019771e+00 / ln2, --8.022806380334262855e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.909735959825669127e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.576662416349575935e+00 / ln2, --9.469708295055941250e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.183140534972725533e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.458537022627602653e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.245710019274113733e+00 / ln2, --7.553188966816772876e+00 / ln2, --6.674700103110665417e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.193805121009943626e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.694095152899173229e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.186698218369051538e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.868991888563591885e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.121057297107224571e+00 / ln2, --6.006187732178176475e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.484310506563019771e+00 / ln2, --6.007365244407383287e+00 / ln2, --1.145387772643075230e+01 / ln2, --2.046324443145273619e+00 / ln2, --6.812113812154088954e+00 / ln2, --6.803544138091067062e+00 / ln2, --6.215435559384440367e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.424715454340284460e+00 / ln2, --1.150475124638018443e+01 / ln2, --4.091764045676016259e+00 / ln2, --7.619344887229415164e+00 / ln2, --5.284098860888144067e+00 / ln2, --7.104077188637425877e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.763732050866829049e+00 / ln2, --7.048892879291960512e+00 / ln2, --1.031514943090967940e+01 / ln2, --3.296199802569410142e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.691538586043964010e+00 / ln2, --1.283998021384489974e+01 / ln2, --4.143181862813722027e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.000368956169869428e+00 / ln2, --7.048892879291960512e+00 / ln2, --7.210947893307020351e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.998325418845404933e+00 / ln2, --1.090932255574468179e+01 / ln2, --3.296199802569410142e+00 / ln2, --1.000340241762609317e+01 / ln2, --2.462783453866639771e+00 / ln2, --6.674700103110665417e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.000368956169869428e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.944473462017027643e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.284098860888144067e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.663408750741215414e+00 / ln2, --5.949336081541920507e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.483355190078385455e+00 / ln2, --8.839003156104606518e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.674889513884615155e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.893167479319754598e+00 / ln2, --7.684202738748299844e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.048892879291960512e+00 / ln2, --8.071909107879246648e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.050516998695719195e+01 / ln2, --6.944473462017027643e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.621647006643879507e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.484916075864178175e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.553188966816772876e+00 / ln2, --6.425466655005584116e+00 / ln2, --7.119927210762653225e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.327920672174300876e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.923664837455273613e+00 / ln2, --6.867084829257056988e+00 / ln2, --7.684202738748299844e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.683429021422371719e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.327920672174300876e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.224969357884932641e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.006187732178176475e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.073778889043102325e+01 / ln2, --1.301233579505205462e+01 / ln2, --4.883577810848264811e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.327963919515099178e+00 / ln2, --5.345707246405288160e+00 / ln2, --7.299334151304765150e+00 / ln2, --1.132541823088126165e+01 / ln2, --5.195119186325862337e+00 / ln2, --6.812113812154088954e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.789351191264211494e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.284098860888144067e+00 / ln2, --7.789351191264211494e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.694546051260094721e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.121057297107224571e+00 / ln2, --8.847574884292626507e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.545926888317382009e+00 / ln2, --7.703898338055121364e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.358997954444022938e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.959821016291367179e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.532634035752141521e+00 / ln2, --6.584033785323046395e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.617690255987351833e+00 / ln2, --6.515023211937145398e+00 / ln2, --6.006187732178176475e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.674889513884615155e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.584033785323046395e+00 / ln2, --7.606027863309607895e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.236592765249644010e+00 / ln2, --6.720134407192276171e+00 / ln2, --8.823256313576475662e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.469708295055941250e+00 / ln2, --5.284098860888144067e+00 / ln2, --8.072732339370881860e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.971660331060701488e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.959821016291367179e+00 / ln2, --1.028217115906610246e+01 / ln2, --4.893167479319754598e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.789351191264211494e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.553188966816772876e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.720134407192276171e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.871019786565007337e+00 / ln2, --8.812611176663798673e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.465543819552042493e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.184300953920424782e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.483355190078385455e+00 / ln2, --6.067243984851346639e+00 / ln2, --4.893167479319754598e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.959852224170357538e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --5.798856991358857016e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.415204418624045779e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.893167479319754598e+00 / ln2, --9.315078460598257948e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.909735959825669127e+00 / ln2, --9.583781920109638364e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.184300953920424782e+00 / ln2, --4.580662492468392522e+00 / ln2, --6.812113812154088954e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.532634035752141521e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.907309388480081580e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.223992983953650970e+00 / ln2, --6.017498482476998589e+00 / ln2, --8.823256313576475662e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.934968049655386935e+00 / ln2, --4.580662492468392522e+00 / ln2, --7.368858813512747297e+00 / ln2, --1.258907280406040030e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --1.092512541773554879e+01 / ln2, --6.600485884087979649e+00 / ln2, --6.327963919515099178e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.949336081541920507e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.691538586043964010e+00 / ln2, --7.766312407968571918e+00 / ln2, --6.954184282296374420e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.925486712770660702e+01 / ln2, --5.617458030859222795e+00 / ln2, --7.742568993938474087e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.095979992273871417e+01 / ln2, --1.171395710922925026e+01 / ln2, --2.462783453866639771e+00 / ln2, --6.424166483534085259e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.022806380334262855e+00 / ln2, --9.370236207688265040e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.515023211937145398e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.833531233360072399e+00 / ln2, --6.694095152899173229e+00 / ln2, --1.278432279724004239e+01 / ln2, --4.604168121450740614e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.332499360388146314e+00 / ln2, --1.316151932531392532e+01 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --9.583781920109638364e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.447790001659071457e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.161725488083725111e+00 / ln2, --7.295589409525732094e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.874321064688381000e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.542219003269678979e+00 / ln2, --7.810898878696857395e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --7.184300953920424782e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.498412758302154479e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --7.517325864764372589e+00 / ln2, --6.017498482476998589e+00 / ln2, --1.106006057964308731e+01 / ln2, --9.442907637099850149e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --1.094874312386789583e+01 / ln2, --7.267062386635592119e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.005103642565483568e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.091764045676016259e+00 / ln2, --1.019261621630061398e+01 / ln2, --4.562852777492357070e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --1.101578299844018893e+01 / ln2, --9.121101243974623074e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.861249608063488381e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.619344887229415164e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.909735959825669127e+00 / ln2, --7.184300953920424782e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.871019786565007337e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.327963919515099178e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --1.316151932531392532e+01 / ln2, --3.631360480608693209e+00 / ln2, --6.152879364568431875e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.021711310391386185e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.424715454340284460e+00 / ln2, --8.447106204735684187e+00 / ln2, --6.121057297107224571e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.893167479319754598e+00 / ln2, --1.019261621630061398e+01 / ln2, --5.113891938530826131e+00 / ln2, --5.997831470194255665e+00 / ln2, --1.013779020202142256e+01 / ln2, --1.098983619591661487e+01 / ln2, --5.861249608063488381e+00 / ln2, --8.839003156104606518e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.617458030859222795e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.909735959825669127e+00 / ln2, --9.357001407991552000e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.947297936873974677e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.883577810848264811e+00 / ln2, --7.720199943466562686e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.841396924932839241e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.764755566332865122e+00 / ln2, --8.859835387901323855e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.258907280406040030e+01 / ln2, --4.691538586043964010e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.447106204735684187e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.498412758302154479e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.483355190078385455e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.517325864764372589e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.327963919515099178e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.204137922631861990e+01 / ln2, --6.017498482476998589e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.356251338206809542e+00 / ln2, --5.345707246405288160e+00 / ln2, --7.223375476872481826e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --1.143258596730222187e+01 / ln2, --6.694546051260094721e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.532634035752141521e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --5.284098860888144067e+00 / ln2, --8.812611176663798673e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.498412758302154479e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.812268409318086526e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.936476480951127677e+00 / ln2, --8.232504733803645891e+00 / ln2, --9.662729593866675515e+00 / ln2, --6.812113812154088954e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.959852224170357538e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.186698218369051538e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.536137450497251145e+00 / ln2, --7.517325864764372589e+00 / ln2, --8.746627133441950974e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.617458030859222795e+00 / ln2, --5.195119186325862337e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.186698218369051538e+00 / ln2, --8.839003156104606518e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.997831470194255665e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.983215916499753817e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.316943408775147262e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.536137450497251145e+00 / ln2, --6.152879364568431875e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.195119186325862337e+00 / ln2, --8.557802589052355913e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --6.352896081343149426e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.833531233360072399e+00 / ln2, --8.103230206446424333e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.152879364568431875e+00 / ln2, --6.458537022627602653e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.529197793097948121e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.674889513884615155e+00 / ln2, --1.115671305913878442e+01 / ln2, --2.462783453866639771e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.584033785323046395e+00 / ln2, --5.754707819725457085e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.971660331060701488e+00 / ln2, --7.021711310391386185e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.919649166968065757e+00 / ln2, --1.344520137693501916e+01 / ln2, --5.758886612591042287e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.332499360388146314e+00 / ln2, --1.283998021384489974e+01 / ln2, --4.049563242290908249e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.959852224170357538e+00 / ln2, --6.515023211937145398e+00 / ln2, --9.990045079829323882e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.031514943090967940e+01 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.766312407968571918e+00 / ln2, --7.689409517815276374e+00 / ln2, --8.071909107879246648e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.754707819725457085e+00 / ln2, --6.223992983953650970e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.017498482476998589e+00 / ln2, --8.839003156104606518e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.657273747556139654e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --7.447790001659071457e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.542219003269678979e+00 / ln2, --8.774158714333733400e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.286368968884687547e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.685674146241039395e+00 / ln2, --9.439487004418870342e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.070585939587089008e+01 / ln2, --5.861249608063488381e+00 / ln2, --5.617458030859222795e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.278432279724004239e+01 / ln2, --4.754337034915018023e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.617458030859222795e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.584033785323046395e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.345707246405288160e+00 / ln2, --7.048892879291960512e+00 / ln2, --1.123110138025548643e+01 / ln2, --6.463978470342545357e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.332499360388146314e+00 / ln2, --8.350828230729891999e+00 / ln2, --7.327920672174300876e+00 / ln2, --1.143258596730222187e+01 / ln2, --5.332499360388146314e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.515023211937145398e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.621647006643879507e+00 / ln2, --7.810898878696857395e+00 / ln2, --1.025011173880692184e+01 / ln2, --4.604168121450740614e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.113891938530826131e+00 / ln2, --1.344520137693501916e+01 / ln2, --4.091764045676016259e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --7.161725488083725111e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.356251338206809542e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.171395710922925026e+01 / ln2, --4.919649166968065757e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.810898878696857395e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.663698816176689910e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.829467623163949952e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --9.529197793097948121e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.150475124638018443e+01 / ln2, --5.193805121009943626e+00 / ln2, --8.605315052977417167e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.284098860888144067e+00 / ln2, --9.785577344871311922e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.057958593457523300e+00 / ln2, --7.267062386635592119e+00 / ln2, --8.371748526324319428e+00 / ln2, --1.021438454248509764e+01 / ln2, --6.067243984851346639e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.617458030859222795e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.684202738748299844e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.484310506563019771e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.604168121450740614e+00 / ln2, --9.662729593866675515e+00 / ln2, --6.971660331060701488e+00 / ln2, --6.223992983953650970e+00 / ln2, --1.150475124638018443e+01 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.720134407192276171e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.516887900787997623e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.123110138025548643e+01 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.012900414694919959e+01 / ln2, --6.327963919515099178e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.286368968884687547e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.564037047890797894e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.371748526324319428e+00 / ln2, --5.871019786565007337e+00 / ln2, --6.517562281884773157e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.766312407968571918e+00 / ln2, --4.919649166968065757e+00 / ln2, --6.532634035752141521e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.512580640245118957e+00 / ln2, --1.283998021384489974e+01 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.119927210762653225e+00 / ln2, --6.458537022627602653e+00 / ln2, --6.017498482476998589e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.025989230275349939e+00 / ln2, --8.957187461268130590e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.424166483534085259e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.833531233360072399e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.184300953920424782e+00 / ln2, --4.691538586043964010e+00 / ln2, --1.166627883103860697e+01 / ln2, --1.123286076255336674e+01 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.562852777492357070e+00 / ln2, --1.005049580306630475e+01 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.031514943090967940e+01 / ln2, --5.536137450497251145e+00 / ln2, --8.382633526813590308e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.760673288736205322e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.177102904471855283e+00 / ln2, --9.493114258108283465e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.406237793012392601e+00 / ln2, --9.670124616416384100e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.049563242290908249e+00 / ln2, --1.204137922631861990e+01 / ln2, --4.143181862813722027e+00 / ln2, --8.233702486883688110e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.132541823088126165e+01 / ln2, --8.245710019274113733e+00 / ln2, --6.286368968884687547e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.580662492468392522e+00 / ln2, --1.031514943090967940e+01 / ln2, --2.046324443145273619e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.091764045676016259e+00 / ln2, --8.098608047708514945e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.829467623163949952e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.600485884087979649e+00 / ln2, --6.017498482476998589e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.424166483534085259e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.424166483534085259e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.684202738748299844e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.580662492468392522e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.754707819725457085e+00 / ln2, --8.140218559980493040e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.833531233360072399e+00 / ln2, --4.919649166968065757e+00 / ln2, --5.345707246405288160e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.861249608063488381e+00 / ln2, --1.115671305913878442e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.909735959825669127e+00 / ln2, --8.447106204735684187e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.223992983953650970e+00 / ln2, --1.044570027672111756e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.536137450497251145e+00 / ln2, --1.283998021384489974e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.022806380334262855e+00 / ln2, --1.012394981767910984e+01 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.223992983953650970e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.998325418845404933e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.124880459954479939e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.515023211937145398e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.532634035752141521e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.143181862813722027e+00 / ln2, --9.793394681581565564e+00 / ln2, --5.397372105698754474e+00 / ln2, --6.152879364568431875e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --7.210947893307020351e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.564037047890797894e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.290844047540147699e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.223992983953650970e+00 / ln2, --7.699896352130231492e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.259851116637276114e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.923664837455273613e+00 / ln2, --6.517562281884773157e+00 / ln2, --6.512580640245118957e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.691538586043964010e+00 / ln2, --7.689409517815276374e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.069538553398722058e+00 / ln2, --6.663698816176689910e+00 / ln2, --5.674889513884615155e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --8.657273747556139654e+00 / ln2, --9.069538553398722058e+00 / ln2, --9.572656522993996830e+00 / ln2, --6.909735959825669127e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.184300953920424782e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.057306084326360640e+01 / ln2, --5.685674146241039395e+00 / ln2, --4.091764045676016259e+00 / ln2, --1.071750970431373773e+01 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.685674146241039395e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.195119186325862337e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.551979924991755411e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.959852224170357538e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.949336081541920507e+00 / ln2, --6.867084829257056988e+00 / ln2, --5.316943408775147262e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.210947893307020351e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.017498482476998589e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.674889513884615155e+00 / ln2, --9.793394681581565564e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.223992983953650970e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.663408750741215414e+00 / ln2, --4.998325418845404933e+00 / ln2, --7.553188966816772876e+00 / ln2, --4.580662492468392522e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.836307946957008141e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.959821016291367179e+00 / ln2, --7.299334151304765150e+00 / ln2, --7.295589409525732094e+00 / ln2, --4.562852777492357070e+00 / ln2, --9.442907637099850149e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.674700103110665417e+00 / ln2, --8.350828230729891999e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.121057297107224571e+00 / ln2, --9.829467623163949952e+00 / ln2, --5.553599664845023653e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.803544138091067062e+00 / ln2, --1.301233579505205462e+01 / ln2, --1.836307946957008141e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.512580640245118957e+00 / ln2, --5.345707246405288160e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.130108731959751189e+01 / ln2, --4.562852777492357070e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --8.605315052977417167e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.512580640245118957e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.949336081541920507e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.959852224170357538e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.424715454340284460e+00 / ln2, --7.290844047540147699e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.048892879291960512e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.512580640245118957e+00 / ln2, --7.810898878696857395e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.267062386635592119e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.073778889043102325e+01 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.517325864764372589e+00 / ln2, --1.054482717141193682e+01 / ln2, --3.631360480608693209e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.871019786565007337e+00 / ln2, --1.123110138025548643e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.742568993938474087e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.683429021422371719e+00 / ln2, --8.551979924991755411e+00 / ln2, --9.172628873852490372e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.424715454340284460e+00 / ln2, --1.115671305913878442e+01 / ln2, --2.046324443145273619e+00 / ln2, --1.095979992273871417e+01 / ln2, --5.536137450497251145e+00 / ln2, --1.025159966901359709e+01 / ln2, --7.720199943466562686e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.382633526813590308e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.042619382222219038e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --1.154814228758357153e+01 / ln2, --7.703898338055121364e+00 / ln2, --4.893167479319754598e+00 / ln2, --6.947297936873974677e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.694546051260094721e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.391839193742723246e+00 / ln2, --7.959852224170357538e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.959852224170357538e+00 / ln2, --4.580662492468392522e+00 / ln2, --6.424166483534085259e+00 / ln2, --8.495410644101937692e+00 / ln2, --5.553599664845023653e+00 / ln2, --7.021711310391386185e+00 / ln2, --1.154814228758357153e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.553599664845023653e+00 / ln2, --1.359735121802292568e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.517325864764372589e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.013779020202142256e+01 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.382633526813590308e+00 / ln2, --1.130525701277283801e+01 / ln2, --2.462783453866639771e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.424166483534085259e+00 / ln2, --9.121101243974623074e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --9.447855320106350874e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.971660331060701488e+00 / ln2, --3.296199802569410142e+00 / ln2, --9.572656522993996830e+00 / ln2, --5.833531233360072399e+00 / ln2, --7.021711310391386185e+00 / ln2, --6.909735959825669127e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.511251163267971265e+00 / ln2, --6.007365244407383287e+00 / ln2, --7.124880459954479939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.812268409318086526e+00 / ln2, --8.957187461268130590e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.278597058620684734e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.069538553398722058e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.542219003269678979e+00 / ln2, --5.949336081541920507e+00 / ln2, --9.907309388480081580e+00 / ln2, --1.070585939587089008e+01 / ln2, --5.861249608063488381e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.283998021384489974e+01 / ln2, --5.923664837455273613e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.537479860740265991e+00 / ln2, --1.125542566348871354e+01 / ln2, --6.007365244407383287e+00 / ln2, --9.579468945846944194e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.345707246405288160e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.584033785323046395e+00 / ln2, --7.184300953920424782e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.971660331060701488e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.685674146241039395e+00 / ln2, --4.511251163267971265e+00 / ln2, --9.563168690224490120e+00 / ln2, --8.746627133441950974e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --8.598045803528568953e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.800758034760048254e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.754337034915018023e+00 / ln2, --1.268608111131628036e+01 / ln2, --3.631360480608693209e+00 / ln2, --9.579468945846944194e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.641510812793480767e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.152879364568431875e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.061406875134344041e+01 / ln2, --3.949349394517413181e+00 / ln2, --4.893167479319754598e+00 / ln2, --8.233702486883688110e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.833531233360072399e+00 / ln2, --1.014429960148050647e+01 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.551979924991755411e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.115671305913878442e+01 / ln2, --2.046324443145273619e+00 / ln2, --6.532634035752141521e+00 / ln2, --5.415204418624045779e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.278597058620684734e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.061406875134344041e+01 / ln2, --6.909735959825669127e+00 / ln2, --6.121057297107224571e+00 / ln2, --6.971660331060701488e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --1.044570027672111756e+01 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.720134407192276171e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.691538586043964010e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.685674146241039395e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.683429021422371719e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.358997954444022938e+00 / ln2, --7.684202738748299844e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.493114258108283465e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.909735959825669127e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --8.812611176663798673e+00 / ln2, --8.245710019274113733e+00 / ln2, --6.515023211937145398e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.959852224170357538e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.542219003269678979e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --9.852642968671261769e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.415204418624045779e+00 / ln2, --6.867084829257056988e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.025989230275349939e+00 / ln2, --8.839003156104606518e+00 / ln2, --4.919649166968065757e+00 / ln2, --7.810898878696857395e+00 / ln2, --5.025989230275349939e+00 / ln2, --9.583781920109638364e+00 / ln2, --5.617458030859222795e+00 / ln2, --6.121057297107224571e+00 / ln2, --6.007365244407383287e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.807386367050035858e+00 / ln2, --9.988776888454795611e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.883577810848264811e+00 / ln2, --6.909176526836401599e+00 / ln2, --5.910272666779689210e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.483355190078385455e+00 / ln2, --8.746627133441950974e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.424715454340284460e+00 / ln2, --1.175414779598468940e+01 / ln2, --6.720134407192276171e+00 / ln2, --7.516887900787997623e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.223992983953650970e+00 / ln2, --9.404417952869394526e+00 / ln2, --9.439487004418870342e+00 / ln2, --6.971660331060701488e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.391839193742723246e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.600485884087979649e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.447790001659071457e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.015500071551313432e+01 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.810898878696857395e+00 / ln2, --4.604168121450740614e+00 / ln2, --9.434248995347461531e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.323494738374519031e+00 / ln2, --4.160925916687072679e+00 / ln2, --8.877589121715919518e+00 / ln2, --5.195119186325862337e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.484916075864178175e+00 / ln2, --9.563168690224490120e+00 / ln2, --7.295589409525732094e+00 / ln2, --8.438636990658810788e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.345707246405288160e+00 / ln2, --5.949336081541920507e+00 / ln2, --4.424715454340284460e+00 / ln2, --7.810898878696857395e+00 / ln2, --1.105715580744062621e+01 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --8.847574884292626507e+00 / ln2, --4.511251163267971265e+00 / ln2, --8.495410644101937692e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.236592765249644010e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.841396924932839241e+00 / ln2, --7.259851116637276114e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.536137450497251145e+00 / ln2, --7.289077351069391142e+00 / ln2, --6.215435559384440367e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.145387772643075230e+01 / ln2, --3.949349394517413181e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.397372105698754474e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.345707246405288160e+00 / ln2, --5.332499360388146314e+00 / ln2, --7.766312407968571918e+00 / ln2, --4.511251163267971265e+00 / ln2, --1.171395710922925026e+01 / ln2, --8.911633169851866043e+00 / ln2, --1.090932255574468179e+01 / ln2, --5.177102904471855283e+00 / ln2, --6.007365244407383287e+00 / ln2, --5.195119186325862337e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.833531233360072399e+00 / ln2, --5.949336081541920507e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.694546051260094721e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.150475124638018443e+01 / ln2, --5.332499360388146314e+00 / ln2, --9.370236207688265040e+00 / ln2, --6.006187732178176475e+00 / ln2, --5.871019786565007337e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.517562281884773157e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.236592765249644010e+00 / ln2, --6.885160160725777523e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.267062386635592119e+00 / ln2, --8.071909107879246648e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.370236207688265040e+00 / ln2, --7.124880459954479939e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.132541823088126165e+01 / ln2, --8.812611176663798673e+00 / ln2, --5.861249608063488381e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.909735959825669127e+00 / ln2, --7.881364862260915594e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.766312407968571918e+00 / ln2, --6.215435559384440367e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.642897843502046484e+00 / ln2, --1.021438454248509764e+01 / ln2, --4.919649166968065757e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.617458030859222795e+00 / ln2, --9.583781920109638364e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.584033785323046395e+00 / ln2, --7.720199943466562686e+00 / ln2, --1.132541823088126165e+01 / ln2, --7.267062386635592119e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.515023211937145398e+00 / ln2, --9.760673288736205322e+00 / ln2, --7.742568993938474087e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.021438454248509764e+01 / ln2, --6.017498482476998589e+00 / ln2, --6.517562281884773157e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.406237793012392601e+00 / ln2, --6.694095152899173229e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.072732339370881860e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.017498482476998589e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.161725488083725111e+00 / ln2, --6.763732050866829049e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.564037047890797894e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --9.315078460598257948e+00 / ln2, --7.290844047540147699e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.606027863309607895e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.115671305913878442e+01 / ln2, --7.327920672174300876e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.284098860888144067e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.183140534972725533e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.754337034915018023e+00 / ln2, --7.362920232037894586e+00 / ln2, --7.183140534972725533e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.498914935067912069e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.909176526836401599e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.641510812793480767e+00 / ln2, --8.179445530167162914e+00 / ln2, --1.087984978545612869e+01 / ln2, --7.210947893307020351e+00 / ln2, --6.512580640245118957e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.949336081541920507e+00 / ln2, --9.349236770827415555e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.048892879291960512e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.642897843502046484e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.160925916687072679e+00 / ln2, --1.030807112927032776e+01 / ln2, --5.861249608063488381e+00 / ln2, --5.542219003269678979e+00 / ln2, --1.278432279724004239e+01 / ln2, --2.046324443145273619e+00 / ln2, --6.909735959825669127e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.998325418845404933e+00 / ln2, --8.233702486883688110e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.105715580744062621e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.621647006643879507e+00 / ln2, --6.909735959825669127e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.130525701277283801e+01 / ln2, --5.685674146241039395e+00 / ln2, --6.532634035752141521e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.580662492468392522e+00 / ln2, --8.071909107879246648e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.284098860888144067e+00 / ln2, --6.017498482476998589e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.121057297107224571e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.150475124638018443e+01 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.318139382317166763e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.119927210762653225e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.553599664845023653e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.883577810848264811e+00 / ln2, --7.210947893307020351e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.268608111131628036e+01 / ln2, --1.344520137693501916e+01 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.316943408775147262e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.947297936873974677e+00 / ln2, --1.139296906381306052e+01 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.087984978545612869e+01 / ln2, --2.046324443145273619e+00 / ln2, --6.152879364568431875e+00 / ln2, --7.290844047540147699e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.316943408775147262e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.867084829257056988e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.050516998695719195e+01 / ln2, --1.014429960148050647e+01 / ln2, --2.462783453866639771e+00 / ln2, --9.347814457090896312e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.812113812154088954e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.447106204735684187e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.425466655005584116e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.957187461268130590e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.511251163267971265e+00 / ln2, --1.068317631220670449e+01 / ln2, --5.193805121009943626e+00 / ln2, --6.012689565822368465e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.871019786565007337e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.925486712770660702e+01 / ln2, --3.631360480608693209e+00 / ln2, --7.104077188637425877e+00 / ln2, --7.683429021422371719e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.745862952448395511e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.345707246405288160e+00 / ln2, --1.090932255574468179e+01 / ln2, --6.885160160725777523e+00 / ln2, --9.760673288736205322e+00 / ln2, --7.278597058620684734e+00 / ln2, --9.404417952869394526e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.493114258108283465e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.278597058620684734e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --1.048696560647437082e+01 / ln2, --3.296199802569410142e+00 / ln2, --1.021438454248509764e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --9.529197793097948121e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.959821016291367179e+00 / ln2, --9.907309388480081580e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.415204418624045779e+00 / ln2, --5.415204418624045779e+00 / ln2, --7.021711310391386185e+00 / ln2, --5.113891938530826131e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.184300953920424782e+00 / ln2, --4.604168121450740614e+00 / ln2, --8.777444697110189153e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.425466655005584116e+00 / ln2, --5.415204418624045779e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.231247566439284569e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.269438761816860683e+01 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.657273747556139654e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.949349394517413181e+00 / ln2, --1.265454555757358079e+01 / ln2, --7.764755566332865122e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.604168121450740614e+00 / ln2, --9.294209431283057654e+00 / ln2, --5.685674146241039395e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.997831470194255665e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.415204418624045779e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.327920672174300876e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.327963919515099178e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.498914935067912069e+00 / ln2, --7.699896352130231492e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.025011173880692184e+01 / ln2, --5.923664837455273613e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.195119186325862337e+00 / ln2, --9.404417952869394526e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.579468945846944194e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.294588429854087508e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.359401430306112601e+00 / ln2, --5.284098860888144067e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.833531233360072399e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.067243984851346639e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.359735121802292568e+01 / ln2, --6.600485884087979649e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.124880459954479939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.265454555757358079e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.269438761816860683e+01 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.007365244407383287e+00 / ln2, --5.861249608063488381e+00 / ln2, --1.301233579505205462e+01 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.764755566332865122e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.424715454340284460e+00 / ln2, --9.484310506563019771e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.152879364568431875e+00 / ln2, --4.049563242290908249e+00 / ln2, --1.204137922631861990e+01 / ln2, --5.025989230275349939e+00 / ln2, --1.042619382222219038e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.195119186325862337e+00 / ln2, --6.424166483534085259e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.959821016291367179e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.699896352130231492e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.909735959825669127e+00 / ln2, --4.498412758302154479e+00 / ln2, --1.175414779598468940e+01 / ln2, --4.754337034915018023e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.017498482476998589e+00 / ln2, --8.071909107879246648e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.542219003269678979e+00 / ln2, --1.068317631220670449e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.463978470342545357e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.754707819725457085e+00 / ln2, --8.417223922976480921e+00 / ln2, --1.130108731959751189e+01 / ln2, --5.542219003269678979e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.028217115906610246e+01 / ln2, --9.465543819552042493e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.685674146241039395e+00 / ln2, --4.511251163267971265e+00 / ln2, --9.026976322186319734e+00 / ln2, --1.194242396538278683e+01 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --8.022806380334262855e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.684202738748299844e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.766312407968571918e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.648035504600203538e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.949336081541920507e+00 / ln2, --4.604168121450740614e+00 / ln2, --8.605315052977417167e+00 / ln2, --6.406237793012392601e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.536137450497251145e+00 / ln2, --6.954184282296374420e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.998325418845404933e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.397372105698754474e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.909735959825669127e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.121057297107224571e+00 / ln2, --6.152879364568431875e+00 / ln2, --6.745862952448395511e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.674700103110665417e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.316943408775147262e+00 / ln2, --6.425466655005584116e+00 / ln2, --6.909735959825669127e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.113891938530826131e+00 / ln2, --6.424166483534085259e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.754707819725457085e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.885183121012873109e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.694546051260094721e+00 / ln2, --8.232504733803645891e+00 / ln2, --7.267062386635592119e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.836307946957008141e+01 / ln2, --4.691538586043964010e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.553599664845023653e+00 / ln2, --6.909735959825669127e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.800758034760048254e+00 / ln2, --6.286368968884687547e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.949336081541920507e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.881364862260915594e+00 / ln2, --7.503680464488466484e+00 / ln2, --8.233702486883688110e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.315078460598257948e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --9.294588429854087508e+00 / ln2, --1.101578299844018893e+01 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.812113812154088954e+00 / ln2, --4.841396924932839241e+00 / ln2, --1.283998021384489974e+01 / ln2, --8.447106204735684187e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.299334151304765150e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.861249608063488381e+00 / ln2, --8.847574884292626507e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.847574884292626507e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.617458030859222795e+00 / ln2, --1.083865141940506760e+01 / ln2, --7.684202738748299844e+00 / ln2, --4.511251163267971265e+00 / ln2, --6.885183121012873109e+00 / ln2, --5.949336081541920507e+00 / ln2, --6.971660331060701488e+00 / ln2, --6.947297936873974677e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.703898338055121364e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.754337034915018023e+00 / ln2, --7.810898878696857395e+00 / ln2, --8.233702486883688110e+00 / ln2, --6.012689565822368465e+00 / ln2, --8.350828230729891999e+00 / ln2, --1.204137922631861990e+01 / ln2, --8.350828230729891999e+00 / ln2, --5.113891938530826131e+00 / ln2, --1.061406875134344041e+01 / ln2, --7.362920232037894586e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.316943408775147262e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.553599664845023653e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.344520137693501916e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.179445530167162914e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.195119186325862337e+00 / ln2, --7.606027863309607895e+00 / ln2, --6.017498482476998589e+00 / ln2, --9.907309388480081580e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.885183121012873109e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.576662416349575935e+00 / ln2, --9.734695089071365715e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.193805121009943626e+00 / ln2, --9.662729593866675515e+00 / ln2, --4.883577810848264811e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.617458030859222795e+00 / ln2, --1.044570027672111756e+01 / ln2, --5.959821016291367179e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.438636990658810788e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --1.168986496391243612e+01 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.286368968884687547e+00 / ln2, --6.406237793012392601e+00 / ln2, --1.057306084326360640e+01 / ln2, --4.049563242290908249e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.091764045676016259e+00 / ln2, --1.171395710922925026e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.683429021422371719e+00 / ln2, --7.267062386635592119e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.997831470194255665e+00 / ln2, --7.634089783838128973e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.885160160725777523e+00 / ln2, --7.703898338055121364e+00 / ln2, --6.909176526836401599e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.621647006643879507e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.553188966816772876e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.516887900787997623e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.231385546183886959e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.812113812154088954e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.868991888563591885e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.694546051260094721e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.267062386635592119e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.230539968036323373e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.005103642565483568e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.087984978545612869e+01 / ln2, --4.143181862813722027e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.372987562155319807e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.289077351069391142e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.397372105698754474e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.871019786565007337e+00 / ln2, --8.181145976660216590e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.345707246405288160e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.642897843502046484e+00 / ln2, --9.447855320106350874e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.865295069725402044e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.662729593866675515e+00 / ln2, --5.316943408775147262e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.512580640245118957e+00 / ln2, --7.183140534972725533e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --8.823256313576475662e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.484916075864178175e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.604168121450740614e+00 / ln2, --8.371748526324319428e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.833531233360072399e+00 / ln2, --1.085914756101938572e+01 / ln2, --8.103230206446424333e+00 / ln2, --4.143181862813722027e+00 / ln2, --9.563168690224490120e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.139296906381306052e+01 / ln2, --6.121057297107224571e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.397372105698754474e+00 / ln2, --7.766312407968571918e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.095496646895064785e+01 / ln2, --3.296199802569410142e+00 / ln2, --4.511251163267971265e+00 / ln2, --7.699896352130231492e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.447790001659071457e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.517325864764372589e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.949336081541920507e+00 / ln2, --1.316151932531392532e+01 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.517325864764372589e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.636130365971254719e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.881364862260915594e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.542219003269678979e+00 / ln2, --7.689409517815276374e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.971660331060701488e+00 / ln2, --4.893167479319754598e+00 / ln2, --7.483355190078385455e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.039337502338793939e+01 / ln2, --3.949349394517413181e+00 / ln2, --6.215435559384440367e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.909176526836401599e+00 / ln2, --1.094874312386789583e+01 / ln2, --6.584033785323046395e+00 / ln2, --9.883349451013705433e+00 / ln2, --5.833531233360072399e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.092512541773554879e+01 / ln2, --8.103230206446424333e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.553599664845023653e+00 / ln2, --1.283998021384489974e+01 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.971660331060701488e+00 / ln2, --5.195119186325862337e+00 / ln2, --6.512580640245118957e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.193805121009943626e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.885160160725777523e+00 / ln2, --7.619344887229415164e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.095496646895064785e+01 / ln2, --5.195119186325862337e+00 / ln2, --5.113891938530826131e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.406237793012392601e+00 / ln2, --8.417223922976480921e+00 / ln2, --7.800758034760048254e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.368858813512747297e+00 / ln2, --5.959821016291367179e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.909735959825669127e+00 / ln2, --7.048892879291960512e+00 / ln2, --9.349236770827415555e+00 / ln2, --7.161725488083725111e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.812268409318086526e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.745862952448395511e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.345707246405288160e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.580662492468392522e+00 / ln2, --7.290844047540147699e+00 / ln2, --6.663698816176689910e+00 / ln2, --5.345707246405288160e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.621647006643879507e+00 / ln2, --7.119927210762653225e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.103230206446424333e+00 / ln2, --8.746627133441950974e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.884045802498089728e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.184300953920424782e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.923664837455273613e+00 / ln2, --6.223992983953650970e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.807386367050035858e+00 / ln2, --5.685674146241039395e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.925486712770660702e+01 / ln2, --4.562852777492357070e+00 / ln2, --1.048696560647437082e+01 / ln2, --7.742568993938474087e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.000368956169869428e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.598045803528568953e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.532634035752141521e+00 / ln2, --8.495410644101937692e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.152879364568431875e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.424715454340284460e+00 / ln2, --7.683429021422371719e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.437619382108458410e+00 / ln2, --8.537479860740265991e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.517562281884773157e+00 / ln2, --5.910272666779689210e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.789351191264211494e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.236592765249644010e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.662729593866675515e+00 / ln2, --6.006187732178176475e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.997831470194255665e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.617690255987351833e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.691538586043964010e+00 / ln2, --7.289077351069391142e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.269438761816860683e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.458537022627602653e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.800758034760048254e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.000368956169869428e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.223992983953650970e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.091764045676016259e+00 / ln2, --1.012394981767910984e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.067243984851346639e+00 / ln2, --6.463978470342545357e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.345707246405288160e+00 / ln2, --7.368858813512747297e+00 / ln2, --5.415204418624045779e+00 / ln2, --8.071909107879246648e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.711929296494973940e+00 / ln2, --5.415204418624045779e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.223375476872481826e+00 / ln2, --7.289077351069391142e+00 / ln2, --5.685674146241039395e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.119927210762653225e+00 / ln2, --8.657273747556139654e+00 / ln2, --8.350828230729891999e+00 / ln2, --6.867084829257056988e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --1.269438761816860683e+01 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.267062386635592119e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --9.172628873852490372e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.124880459954479939e+00 / ln2, --6.954184282296374420e+00 / ln2, --5.861249608063488381e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.069538553398722058e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.691538586043964010e+00 / ln2, --8.319852591139634157e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.498412758302154479e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.742568993938474087e+00 / ln2, --5.536137450497251145e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.763732050866829049e+00 / ln2, --6.512580640245118957e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.606027863309607895e+00 / ln2, --6.971660331060701488e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.642897843502046484e+00 / ln2, --6.745862952448395511e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.694546051260094721e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.865295069725402044e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.193805121009943626e+00 / ln2, --9.315078460598257948e+00 / ln2, --7.359401430306112601e+00 / ln2, --7.766312407968571918e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.368858813512747297e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.123286076255336674e+01 / ln2, --6.121057297107224571e+00 / ln2, --6.909735959825669127e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.067243984851346639e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.160925916687072679e+00 / ln2, --1.143258596730222187e+01 / ln2, --5.025989230275349939e+00 / ln2, --5.284098860888144067e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.382633526813590308e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.123286076255336674e+01 / ln2, --4.091764045676016259e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.847574884292626507e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.397372105698754474e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.847574884292626507e+00 / ln2, --1.344520137693501916e+01 / ln2, --5.284098860888144067e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.210947893307020351e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.648035504600203538e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.536137450497251145e+00 / ln2, --7.606027863309607895e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.442907637099850149e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.267062386635592119e+00 / ln2, --4.893167479319754598e+00 / ln2, --9.465543819552042493e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.068317631220670449e+01 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.382633526813590308e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.161725488083725111e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.179445530167162914e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.316943408775147262e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --9.257233588034425864e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --1.139296906381306052e+01 / ln2, --2.462783453866639771e+00 / ln2, --7.810898878696857395e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.542219003269678979e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.803544138091067062e+00 / ln2, --1.165915831016035398e+01 / ln2, --3.631360480608693209e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.923664837455273613e+00 / ln2, --5.284098860888144067e+00 / ln2, --6.812113812154088954e+00 / ln2, --5.177102904471855283e+00 / ln2, --7.881364862260915594e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.847574884292626507e+00 / ln2, --6.954184282296374420e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.094874312386789583e+01 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.113891938530826131e+00 / ln2, --8.537479860740265991e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.812268409318086526e+00 / ln2, --1.048696560647437082e+01 / ln2, --5.949336081541920507e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.397372105698754474e+00 / ln2, --6.885160160725777523e+00 / ln2, --4.576662416349575935e+00 / ln2, --8.495410644101937692e+00 / ln2, --9.349236770827415555e+00 / ln2, --4.049563242290908249e+00 / ln2, --9.294209431283057654e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.438636990658810788e+00 / ln2, --7.161725488083725111e+00 / ln2, --7.184300953920424782e+00 / ln2, --7.259851116637276114e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.674889513884615155e+00 / ln2, --4.604168121450740614e+00 / ln2, --1.090932255574468179e+01 / ln2, --4.511251163267971265e+00 / ln2, --9.434248995347461531e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.415204418624045779e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.177102904471855283e+00 / ln2, --6.936476480951127677e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.923664837455273613e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.923664837455273613e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.847574884292626507e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.391839193742723246e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.642897843502046484e+00 / ln2, --1.015500071551313432e+01 / ln2, --5.177102904471855283e+00 / ln2, --4.498412758302154479e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.498412758302154479e+00 / ln2, --8.557802589052355913e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.742568993938474087e+00 / ln2, --6.954184282296374420e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.469708295055941250e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.123110138025548643e+01 / ln2, --5.284098860888144067e+00 / ln2, --7.104077188637425877e+00 / ln2, --5.542219003269678979e+00 / ln2, --1.264380688290192367e+01 / ln2, --3.949349394517413181e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.947297936873974677e+00 / ln2, --1.278432279724004239e+01 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.000340241762609317e+01 / ln2, --6.517562281884773157e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.092512541773554879e+01 / ln2, --4.091764045676016259e+00 / ln2, --7.359401430306112601e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.536137450497251145e+00 / ln2, --1.025011173880692184e+01 / ln2, --1.039337502338793939e+01 / ln2, --6.517562281884773157e+00 / ln2, --4.883577810848264811e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.113891938530826131e+00 / ln2, --7.517325864764372589e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.067243984851346639e+00 / ln2, --6.391839193742723246e+00 / ln2, --5.397372105698754474e+00 / ln2, --9.294588429854087508e+00 / ln2, --5.316943408775147262e+00 / ln2, --6.352896081343149426e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.125542566348871354e+01 / ln2, --4.841396924932839241e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.959821016291367179e+00 / ln2, --1.123110138025548643e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.424166483534085259e+00 / ln2, --6.012689565822368465e+00 / ln2, --7.108260886292240066e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.874321064688381000e+00 / ln2, --5.397372105698754474e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.316943408775147262e+00 / ln2, --9.760673288736205322e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.113891938530826131e+00 / ln2, --7.000368956169869428e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.745862952448395511e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.683429021422371719e+00 / ln2, --5.415204418624045779e+00 / ln2, --5.997831470194255665e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.000368956169869428e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.278597058620684734e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.177102904471855283e+00 / ln2, --4.580662492468392522e+00 / ln2, --6.584033785323046395e+00 / ln2, --8.859835387901323855e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.685674146241039395e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.025159966901359709e+01 / ln2, --7.810898878696857395e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.267062386635592119e+00 / ln2, --1.301233579505205462e+01 / ln2, --3.631360480608693209e+00 / ln2, --4.998325418845404933e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.434248995347461531e+00 / ln2, --1.021438454248509764e+01 / ln2, --8.617690255987351833e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.909735959825669127e+00 / ln2, --1.039337502338793939e+01 / ln2, --5.617458030859222795e+00 / ln2, --6.223992983953650970e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.885160160725777523e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.657273747556139654e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.344520137693501916e+01 / ln2, --6.327963919515099178e+00 / ln2, --8.005103642565483568e+00 / ln2, --6.327963919515099178e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.104077188637425877e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.000368956169869428e+00 / ln2, --5.542219003269678979e+00 / ln2, --1.073778889043102325e+01 / ln2, --7.267062386635592119e+00 / ln2, --5.397372105698754474e+00 / ln2, --5.758886612591042287e+00 / ln2, --7.359401430306112601e+00 / ln2, --7.564037047890797894e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.223992983953650970e+00 / ln2, --7.789351191264211494e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.798856991358857016e+00 / ln2, --5.621647006643879507e+00 / ln2, --4.883577810848264811e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.223992983953650970e+00 / ln2, --7.289077351069391142e+00 / ln2, --6.971660331060701488e+00 / ln2, --8.617690255987351833e+00 / ln2, --5.833531233360072399e+00 / ln2, --7.119927210762653225e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.617458030859222795e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.030807112927032776e+01 / ln2, --2.046324443145273619e+00 / ln2, --7.048892879291960512e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.810898878696857395e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.498412758302154479e+00 / ln2, --8.877589121715919518e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.949336081541920507e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.025989230275349939e+00 / ln2, --9.493114258108283465e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.113891938530826131e+00 / ln2, --8.983215916499753817e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.874321064688381000e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.694546051260094721e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.691538586043964010e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.758886612591042287e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.867084829257056988e+00 / ln2, --8.605315052977417167e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --1.092512541773554879e+01 / ln2, --5.553599664845023653e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.951382076635610474e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.657273747556139654e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.425466655005584116e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.742568993938474087e+00 / ln2, --7.516887900787997623e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.674700103110665417e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.812113812154088954e+00 / ln2, --8.983215916499753817e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.944473462017027643e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.774158714333733400e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.031514943090967940e+01 / ln2, --7.703898338055121364e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.847574884292626507e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.425466655005584116e+00 / ln2, --5.949336081541920507e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.600485884087979649e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --1.021438454248509764e+01 / ln2, --6.017498482476998589e+00 / ln2, --1.150475124638018443e+01 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.152879364568431875e+00 / ln2, --7.289077351069391142e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --6.584033785323046395e+00 / ln2, --7.299334151304765150e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.495410644101937692e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.236592765249644010e+00 / ln2, --7.362920232037894586e+00 / ln2, --9.572656522993996830e+00 / ln2, --6.017498482476998589e+00 / ln2, --7.124880459954479939e+00 / ln2, --1.168986496391243612e+01 / ln2, --4.754337034915018023e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.774158714333733400e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.108260886292240066e+00 / ln2, --5.685674146241039395e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.810898878696857395e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.352896081343149426e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.764755566332865122e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.223992983953650970e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.923664837455273613e+00 / ln2, --7.278597058620684734e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.542219003269678979e+00 / ln2, --6.512580640245118957e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.006187732178176475e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.498412758302154479e+00 / ln2, --1.083865141940506760e+01 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.286368968884687547e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.290844047540147699e+00 / ln2, --7.516887900787997623e+00 / ln2, --4.691538586043964010e+00 / ln2, --8.005103642565483568e+00 / ln2, --5.397372105698754474e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.998325418845404933e+00 / ln2, --7.810898878696857395e+00 / ln2, --8.812611176663798673e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.720134407192276171e+00 / ln2, --7.881364862260915594e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.798856991358857016e+00 / ln2, --5.959821016291367179e+00 / ln2, --1.316151932531392532e+01 / ln2, --9.069538553398722058e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.006187732178176475e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.720199943466562686e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.048696560647437082e+01 / ln2, --9.852642968671261769e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.536137450497251145e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.121057297107224571e+00 / ln2, --6.007365244407383287e+00 / ln2, --9.829467623163949952e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.694095152899173229e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.865295069725402044e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.359401430306112601e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.021711310391386185e+00 / ln2, --6.424166483534085259e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.130525701277283801e+01 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.754337034915018023e+00 / ln2, --8.103230206446424333e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.318139382317166763e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.054482717141193682e+01 / ln2, --6.406237793012392601e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.936476480951127677e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.413281563246960637e+00 / ln2, --9.347814457090896312e+00 / ln2, --1.068317631220670449e+01 / ln2, --4.562852777492357070e+00 / ln2, --4.580662492468392522e+00 / ln2, --8.071909107879246648e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.685674146241039395e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.923664837455273613e+00 / ln2, --7.327920672174300876e+00 / ln2, --7.327920672174300876e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.699896352130231492e+00 / ln2, --6.808146457075214819e+00 / ln2, --7.868991888563591885e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.210947893307020351e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.319852591139634157e+00 / ln2, --1.268608111131628036e+01 / ln2, --6.954184282296374420e+00 / ln2, --1.143258596730222187e+01 / ln2, --4.998325418845404933e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --7.048892879291960512e+00 / ln2, --5.923664837455273613e+00 / ln2, --9.349236770827415555e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.694546051260094721e+00 / ln2, --7.362920232037894586e+00 / ln2, --9.349236770827415555e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.267062386635592119e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.812268409318086526e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.015500071551313432e+01 / ln2, --5.861249608063488381e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.617458030859222795e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.959852224170357538e+00 / ln2, --1.359735121802292568e+01 / ln2, --8.140218559980493040e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.642897843502046484e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --9.793394681581565564e+00 / ln2, --7.720199943466562686e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.484916075864178175e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --8.812268409318086526e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.264380688290192367e+01 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.186698218369051538e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.689409517815276374e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.283998021384489974e+01 / ln2, --4.091764045676016259e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.909735959825669127e+00 / ln2, --7.564037047890797894e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.877589121715919518e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.909735959825669127e+00 / ln2, --1.125542566348871354e+01 / ln2, --6.517562281884773157e+00 / ln2, --7.868991888563591885e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.048696560647437082e+01 / ln2, --6.007365244407383287e+00 / ln2, --7.684202738748299844e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.186698218369051538e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.223992983953650970e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.177102904471855283e+00 / ln2, --8.847574884292626507e+00 / ln2, --6.512580640245118957e+00 / ln2, --4.580662492468392522e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.186698218369051538e+00 / ln2, --8.598045803528568953e+00 / ln2, --7.868991888563591885e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.691538586043964010e+00 / ln2, --1.087984978545612869e+01 / ln2, --5.284098860888144067e+00 / ln2, --5.536137450497251145e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.022806380334262855e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.584033785323046395e+00 / ln2, --7.358997954444022938e+00 / ln2, --1.268608111131628036e+01 / ln2, --4.160925916687072679e+00 / ln2, --5.025989230275349939e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.893167479319754598e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.006187732178176475e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.517325864764372589e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.884045802498089728e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.764755566332865122e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.606027863309607895e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.511251163267971265e+00 / ln2, --8.495410644101937692e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.598045803528568953e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --7.186698218369051538e+00 / ln2, --4.691538586043964010e+00 / ln2, --8.071909107879246648e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.283998021384489974e+01 / ln2, --3.949349394517413181e+00 / ln2, --6.694546051260094721e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.236592765249644010e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.949336081541920507e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.025011173880692184e+01 / ln2, --2.462783453866639771e+00 / ln2, --6.532634035752141521e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.674700103110665417e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.674700103110665417e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.604168121450740614e+00 / ln2, --1.073778889043102325e+01 / ln2, --3.631360480608693209e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.798856991358857016e+00 / ln2, --8.951382076635610474e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.294588429854087508e+00 / ln2, --6.512580640245118957e+00 / ln2, --6.584033785323046395e+00 / ln2, --7.021711310391386185e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.619344887229415164e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.424166483534085259e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.763732050866829049e+00 / ln2, --6.512580640245118957e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.070585939587089008e+01 / ln2, --5.536137450497251145e+00 / ln2, --6.006187732178176475e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.694546051260094721e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.536137450497251145e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.576662416349575935e+00 / ln2, --7.703898338055121364e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.745862952448395511e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.332499360388146314e+00 / ln2, --8.911633169851866043e+00 / ln2, --5.195119186325862337e+00 / ln2, --6.812113812154088954e+00 / ln2, --1.278432279724004239e+01 / ln2, --5.861249608063488381e+00 / ln2, --6.763732050866829049e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.368858813512747297e+00 / ln2, --9.294209431283057654e+00 / ln2, --9.349236770827415555e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.511251163267971265e+00 / ln2, --1.132541823088126165e+01 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.580662492468392522e+00 / ln2, --5.754707819725457085e+00 / ln2, --8.181145976660216590e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.072732339370881860e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.789351191264211494e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.204137922631861990e+01 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.458537022627602653e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.415204418624045779e+00 / ln2, --8.657273747556139654e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.424715454340284460e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.424166483534085259e+00 / ln2, --5.553599664845023653e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.971660331060701488e+00 / ln2, --7.766312407968571918e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.841396924932839241e+00 / ln2, --6.121057297107224571e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.789351191264211494e+00 / ln2, --7.413281563246960637e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.397372105698754474e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --1.031514943090967940e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.871019786565007337e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.621647006643879507e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.883577810848264811e+00 / ln2, --7.766312407968571918e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.841396924932839241e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.236592765249644010e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.332499360388146314e+00 / ln2, --8.382633526813590308e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.345707246405288160e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.689409517815276374e+00 / ln2, --6.954184282296374420e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.193805121009943626e+00 / ln2, --6.909735959825669127e+00 / ln2, --7.290844047540147699e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.087984978545612869e+01 / ln2, --6.017498482476998589e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.871019786565007337e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.745862952448395511e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.224702791393450951e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.711929296494973940e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.067243984851346639e+00 / ln2, --6.812113812154088954e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.007365244407383287e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.415204418624045779e+00 / ln2, --5.923664837455273613e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.048892879291960512e+00 / ln2, --7.048892879291960512e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.332499360388146314e+00 / ln2, --7.720199943466562686e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.745862952448395511e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.847574884292626507e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.600485884087979649e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.617458030859222795e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.166627883103860697e+01 / ln2, --6.017498482476998589e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.909176526836401599e+00 / ln2, --7.868991888563591885e+00 / ln2, --6.512580640245118957e+00 / ln2, --7.703898338055121364e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.447790001659071457e+00 / ln2, --5.345707246405288160e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.836307946957008141e+01 / ln2, --8.812268409318086526e+00 / ln2, --3.631360480608693209e+00 / ln2, --7.021711310391386185e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.885183121012873109e+00 / ln2, --7.290844047540147699e+00 / ln2, --9.779642293724309710e+00 / ln2, --1.165915831016035398e+01 / ln2, --1.316151932531392532e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.512580640245118957e+00 / ln2, --4.143181862813722027e+00 / ln2, --7.108260886292240066e+00 / ln2, --6.498914935067912069e+00 / ln2, --5.536137450497251145e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.231247566439284569e+00 / ln2, --7.447790001659071457e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.807386367050035858e+00 / ln2, --6.007365244407383287e+00 / ln2, --7.689409517815276374e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.424715454340284460e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.017498482476998589e+00 / ln2, --7.267062386635592119e+00 / ln2, --7.267062386635592119e+00 / ln2, --5.113891938530826131e+00 / ln2, --7.327920672174300876e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.425466655005584116e+00 / ln2, --5.397372105698754474e+00 / ln2, --4.754337034915018023e+00 / ln2, --7.742568993938474087e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.417223922976480921e+00 / ln2, --7.683429021422371719e+00 / ln2, --5.685674146241039395e+00 / ln2, --5.193805121009943626e+00 / ln2, --9.069538553398722058e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.553599664845023653e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.542219003269678979e+00 / ln2, --6.944473462017027643e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.947297936873974677e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.944473462017027643e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.184300953920424782e+00 / ln2, --9.883349451013705433e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.108260886292240066e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.923664837455273613e+00 / ln2, --6.694546051260094721e+00 / ln2, --6.885183121012873109e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --7.683429021422371719e+00 / ln2, --5.332499360388146314e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.657273747556139654e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.345707246405288160e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.584033785323046395e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.807386367050035858e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.617458030859222795e+00 / ln2, --5.997831470194255665e+00 / ln2, --5.674889513884615155e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.605315052977417167e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.694546051260094721e+00 / ln2, --5.754707819725457085e+00 / ln2, --1.092512541773554879e+01 / ln2, --6.909735959825669127e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.017498482476998589e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.224969357884932641e+01 / ln2, --5.025989230275349939e+00 / ln2, --5.195119186325862337e+00 / ln2, --1.054482717141193682e+01 / ln2, --7.104077188637425877e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.193805121009943626e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.949336081541920507e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.694095152899173229e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.720199943466562686e+00 / ln2, --6.947297936873974677e+00 / ln2, --7.021711310391386185e+00 / ln2, --4.691538586043964010e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.352896081343149426e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.071909107879246648e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.397372105698754474e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.382633526813590308e+00 / ln2, --5.798856991358857016e+00 / ln2, --9.990045079829323882e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.584033785323046395e+00 / ln2, --6.532634035752141521e+00 / ln2, --7.048892879291960512e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.424166483534085259e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --1.040237040920392531e+01 / ln2, --3.631360480608693209e+00 / ln2, --5.025989230275349939e+00 / ln2, --9.026976322186319734e+00 / ln2, --5.415204418624045779e+00 / ln2, --5.177102904471855283e+00 / ln2, --7.564037047890797894e+00 / ln2, --5.316943408775147262e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.919649166968065757e+00 / ln2, --7.699896352130231492e+00 / ln2, --6.352896081343149426e+00 / ln2, --7.606027863309607895e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.536137450497251145e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.957187461268130590e+00 / ln2, --8.071909107879246648e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.040237040920392531e+01 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.284098860888144067e+00 / ln2, --8.839003156104606518e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.152879364568431875e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.694546051260094721e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.997831470194255665e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.685674146241039395e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.580662492468392522e+00 / ln2, --4.604168121450740614e+00 / ln2, --7.358997954444022938e+00 / ln2, --5.193805121009943626e+00 / ln2, --9.224702791393450951e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.442907637099850149e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.766312407968571918e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.553599664845023653e+00 / ln2, --1.070585939587089008e+01 / ln2, --4.642897843502046484e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.073778889043102325e+01 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.833531233360072399e+00 / ln2, --7.124880459954479939e+00 / ln2, --5.345707246405288160e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.350828230729891999e+00 / ln2, --6.909176526836401599e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.511251163267971265e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.424715454340284460e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.096048994255763454e+01 / ln2, --6.909735959825669127e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.720134407192276171e+00 / ln2, --9.172628873852490372e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.425466655005584116e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.048892879291960512e+00 / ln2, --6.327963919515099178e+00 / ln2, --6.352896081343149426e+00 / ln2, --6.936476480951127677e+00 / ln2, --8.911633169851866043e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.754337034915018023e+00 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.919649166968065757e+00 / ln2, --6.885183121012873109e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.553599664845023653e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.812611176663798673e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.536137450497251145e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.357001407991552000e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.415204418624045779e+00 / ln2, --9.230539968036323373e+00 / ln2, --5.316943408775147262e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.152114117370445001e+00 / ln2, --5.674889513884615155e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.745862952448395511e+00 / ln2, --4.160925916687072679e+00 / ln2, --8.181145976660216590e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.580662492468392522e+00 / ln2, --1.030807112927032776e+01 / ln2, --6.532634035752141521e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.438636990658810788e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.215435559384440367e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.143181862813722027e+00 / ln2, --1.061406875134344041e+01 / ln2, --6.694546051260094721e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.925486712770660702e+01 / ln2, --2.046324443145273619e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.699896352130231492e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.115671305913878442e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.344520137693501916e+01 / ln2, --6.517562281884773157e+00 / ln2, --5.415204418624045779e+00 / ln2, --1.105715580744062621e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --6.152879364568431875e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.720134407192276171e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.754337034915018023e+00 / ln2, --8.245710019274113733e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.091764045676016259e+00 / ln2, --1.012900414694919959e+01 / ln2, --5.959821016291367179e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.048892879291960512e+00 / ln2, --8.323494738374519031e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.006187732178176475e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.264380688290192367e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.621647006643879507e+00 / ln2, --5.923664837455273613e+00 / ln2, --7.021711310391386185e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.754337034915018023e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.580662492468392522e+00 / ln2, --6.498914935067912069e+00 / ln2, --6.007365244407383287e+00 / ln2, --6.286368968884687547e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --9.404417952869394526e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.600485884087979649e+00 / ln2, --6.808146457075214819e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.944473462017027643e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.318139382317166763e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.923664837455273613e+00 / ln2, --5.345707246405288160e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.812113812154088954e+00 / ln2, --7.119927210762653225e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.936476480951127677e+00 / ln2, --5.959821016291367179e+00 / ln2, --6.885183121012873109e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.049563242290908249e+00 / ln2, --8.371748526324319428e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.971660331060701488e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.017498482476998589e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.434248995347461531e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.371748526324319428e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.512580640245118957e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.871019786565007337e+00 / ln2, --1.301233579505205462e+01 / ln2, --7.289077351069391142e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.359401430306112601e+00 / ln2, --1.130108731959751189e+01 / ln2, --4.424715454340284460e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.512580640245118957e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.542219003269678979e+00 / ln2, --7.359401430306112601e+00 / ln2, --7.358997954444022938e+00 / ln2, --6.584033785323046395e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.028217115906610246e+01 / ln2, --5.685674146241039395e+00 / ln2, --6.947297936873974677e+00 / ln2, --8.070842469545034703e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.893167479319754598e+00 / ln2, --8.098608047708514945e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.438636990658810788e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.949336081541920507e+00 / ln2, --5.553599664845023653e+00 / ln2, --7.553188966816772876e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.919649166968065757e+00 / ln2, --6.885183121012873109e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.067243984851346639e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.983215916499753817e+00 / ln2, --4.754337034915018023e+00 / ln2, --7.048892879291960512e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.223992983953650970e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.885183121012873109e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.415204418624045779e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.327920672174300876e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.184300953920424782e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.742568993938474087e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.584033785323046395e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.910272666779689210e+00 / ln2, --4.580662492468392522e+00 / ln2, --7.184300953920424782e+00 / ln2, --6.517562281884773157e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.909176526836401599e+00 / ln2, --5.621647006643879507e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.617458030859222795e+00 / ln2, --5.798856991358857016e+00 / ln2, --4.562852777492357070e+00 / ln2, --7.290844047540147699e+00 / ln2, --5.316943408775147262e+00 / ln2, --6.944473462017027643e+00 / ln2, --4.604168121450740614e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.798856991358857016e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.289077351069391142e+00 / ln2, --1.258907280406040030e+01 / ln2, --3.949349394517413181e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.517562281884773157e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.600485884087979649e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.812113812154088954e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.049433957816686913e+00 / ln2, --5.674889513884615155e+00 / ln2, --9.349236770827415555e+00 / ln2, --5.754707819725457085e+00 / ln2, --7.368858813512747297e+00 / ln2, --1.344520137693501916e+01 / ln2, --6.215435559384440367e+00 / ln2, --6.425466655005584116e+00 / ln2, --7.184300953920424782e+00 / ln2, --6.152879364568431875e+00 / ln2, --5.025989230275349939e+00 / ln2, --1.083865141940506760e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.498914935067912069e+00 / ln2, --5.536137450497251145e+00 / ln2, --7.959852224170357538e+00 / ln2, --1.359735121802292568e+01 / ln2, --6.223992983953650970e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.295589409525732094e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.923664837455273613e+00 / ln2, --6.763732050866829049e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.674700103110665417e+00 / ln2, --7.048892879291960512e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.919649166968065757e+00 / ln2, --5.861249608063488381e+00 / ln2, --9.069538553398722058e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.617458030859222795e+00 / ln2, --5.113891938530826131e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.195119186325862337e+00 / ln2, --5.833531233360072399e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.495410644101937692e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.177102904471855283e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.631360480608693209e+00 / ln2, --9.579468945846944194e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --6.515023211937145398e+00 / ln2, --4.049563242290908249e+00 / ln2, --1.105715580744062621e+01 / ln2, --8.005103642565483568e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.095979992273871417e+01 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --9.315078460598257948e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.517325864764372589e+00 / ln2, --4.642897843502046484e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.195119186325862337e+00 / ln2, --4.511251163267971265e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.316943408775147262e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.327963919515099178e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.057306084326360640e+01 / ln2, --7.289077351069391142e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.289077351069391142e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.936476480951127677e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.332499360388146314e+00 / ln2, --7.764755566332865122e+00 / ln2, --1.278432279724004239e+01 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.345707246405288160e+00 / ln2, --5.536137450497251145e+00 / ln2, --8.812268409318086526e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.777444697110189153e+00 / ln2, --6.463978470342545357e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.372987562155319807e+00 / ln2, --7.048892879291960512e+00 / ln2, --7.295589409525732094e+00 / ln2, --5.542219003269678979e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.699896352130231492e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --6.012689565822368465e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.415204418624045779e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.810898878696857395e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.223992983953650970e+00 / ln2, --6.909735959825669127e+00 / ln2, --5.617458030859222795e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.012689565822368465e+00 / ln2, --8.957187461268130590e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.754337034915018023e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.621647006643879507e+00 / ln2, --7.299334151304765150e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.642897843502046484e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.223992983953650970e+00 / ln2, --6.512580640245118957e+00 / ln2, --4.049563242290908249e+00 / ln2, --9.734695089071365715e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.536137450497251145e+00 / ln2, --4.604168121450740614e+00 / ln2, --6.406237793012392601e+00 / ln2, --4.642897843502046484e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --1.123286076255336674e+01 / ln2, --9.563168690224490120e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.580662492468392522e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.259851116637276114e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.072732339370881860e+00 / ln2, --1.130108731959751189e+01 / ln2, --6.515023211937145398e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.139296906381306052e+01 / ln2, --7.359401430306112601e+00 / ln2, --4.919649166968065757e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.883577810848264811e+00 / ln2, --5.284098860888144067e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.861249608063488381e+00 / ln2, --1.150475124638018443e+01 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.327963919515099178e+00 / ln2, --8.951382076635610474e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.517562281884773157e+00 / ln2, --5.871019786565007337e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.345707246405288160e+00 / ln2, --1.085914756101938572e+01 / ln2, --1.115671305913878442e+01 / ln2, --6.954184282296374420e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.774158714333733400e+00 / ln2, --5.113891938530826131e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.286368968884687547e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.042619382222219038e+01 / ln2, --9.224702791393450951e+00 / ln2, --6.007365244407383287e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.022806380334262855e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --9.852642968671261769e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.115671305913878442e+01 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --6.484916075864178175e+00 / ln2, --3.631360480608693209e+00 / ln2, --6.067243984851346639e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.091764045676016259e+00 / ln2, --3.949349394517413181e+00 / ln2, --8.495410644101937692e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.584033785323046395e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.498914935067912069e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.674700103110665417e+00 / ln2, --5.833531233360072399e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.049563242290908249e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --7.789351191264211494e+00 / ln2, --7.124880459954479939e+00 / ln2, --6.463978470342545357e+00 / ln2, --5.617458030859222795e+00 / ln2, --9.529197793097948121e+00 / ln2, --4.091764045676016259e+00 / ln2, --8.657273747556139654e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.810898878696857395e+00 / ln2, --4.091764045676016259e+00 / ln2, --8.231385546183886959e+00 / ln2, --6.909176526836401599e+00 / ln2, --1.269438761816860683e+01 / ln2, --1.106006057964308731e+01 / ln2, --6.517562281884773157e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.358997954444022938e+00 / ln2, --7.183140534972725533e+00 / ln2, --1.130525701277283801e+01 / ln2, --5.959821016291367179e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.025011173880692184e+01 / ln2, --5.193805121009943626e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.025159966901359709e+01 / ln2, --5.025989230275349939e+00 / ln2, --1.057306084326360640e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.498412758302154479e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.223992983953650970e+00 / ln2, --1.836307946957008141e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.316943408775147262e+00 / ln2, --4.511251163267971265e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.498412758302154479e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.562852777492357070e+00 / ln2, --6.231247566439284569e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.119927210762653225e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.195119186325862337e+00 / ln2, --6.017498482476998589e+00 / ln2, --5.025989230275349939e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.576662416349575935e+00 / ln2, --9.465543819552042493e+00 / ln2, --5.861249608063488381e+00 / ln2, --8.746627133441950974e+00 / ln2, --4.919649166968065757e+00 / ln2, --5.871019786565007337e+00 / ln2, --5.397372105698754474e+00 / ln2, --6.007365244407383287e+00 / ln2, --6.391839193742723246e+00 / ln2, --5.193805121009943626e+00 / ln2, --9.465543819552042493e+00 / ln2, --4.511251163267971265e+00 / ln2, --1.145387772643075230e+01 / ln2, --7.720199943466562686e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.193805121009943626e+00 / ln2, --7.186698218369051538e+00 / ln2, --8.245710019274113733e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.332499360388146314e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.267062386635592119e+00 / ln2, --1.025159966901359709e+01 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.774158714333733400e+00 / ln2, --6.532634035752141521e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.883349451013705433e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.177102904471855283e+00 / ln2, --4.604168121450740614e+00 / ln2, --8.663408750741215414e+00 / ln2, --8.350828230729891999e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.774158714333733400e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.766312407968571918e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.841396924932839241e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.998325418845404933e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.165915831016035398e+01 / ln2, --5.193805121009943626e+00 / ln2, --9.785577344871311922e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.469708295055941250e+00 / ln2, --7.789351191264211494e+00 / ln2, --4.642897843502046484e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --8.551979924991755411e+00 / ln2, --9.026976322186319734e+00 / ln2, --9.447855320106350874e+00 / ln2, --5.113891938530826131e+00 / ln2, --1.087984978545612869e+01 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.576662416349575935e+00 / ln2, --6.458537022627602653e+00 / ln2, --7.641510812793480767e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.919649166968065757e+00 / ln2, --1.054482717141193682e+01 / ln2, --4.562852777492357070e+00 / ln2, --9.439487004418870342e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.685674146241039395e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.763732050866829049e+00 / ln2, --5.923664837455273613e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.689409517815276374e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --3.631360480608693209e+00 / ln2, --8.777444697110189153e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.160925916687072679e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.415204418624045779e+00 / ln2, --4.642897843502046484e+00 / ln2, --7.564037047890797894e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.057958593457523300e+00 / ln2, --7.210947893307020351e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.017498482476998589e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.580662492468392522e+00 / ln2, --8.812268409318086526e+00 / ln2, --7.184300953920424782e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.152879364568431875e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.049563242290908249e+00 / ln2, --5.674889513884615155e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.362920232037894586e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.258907280406040030e+01 / ln2, --7.210947893307020351e+00 / ln2, --6.909176526836401599e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.615348029313974365e+00 / ln2, --3.949349394517413181e+00 / ln2, --9.760673288736205322e+00 / ln2, --8.495410644101937692e+00 / ln2, --9.484310506563019771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.515023211937145398e+00 / ln2, --1.014429960148050647e+01 / ln2, --1.125542566348871354e+01 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.049433957816686913e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.119927210762653225e+00 / ln2, --5.959821016291367179e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.327963919515099178e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.425466655005584116e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.236592765249644010e+00 / ln2, --3.296199802569410142e+00 / ln2, --9.465543819552042493e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.833531233360072399e+00 / ln2, --6.954184282296374420e+00 / ln2, --6.017498482476998589e+00 / ln2, --8.072732339370881860e+00 / ln2, --3.296199802569410142e+00 / ln2, --1.028217115906610246e+01 / ln2, --2.462783453866639771e+00 / ln2, --7.742568993938474087e+00 / ln2, --6.007365244407383287e+00 / ln2, --8.636130365971254719e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.104077188637425877e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.631360480608693209e+00 / ln2, --1.019261621630061398e+01 / ln2, --1.130525701277283801e+01 / ln2, --4.498412758302154479e+00 / ln2, --6.971660331060701488e+00 / ln2, --7.359401430306112601e+00 / ln2, --8.951382076635610474e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.580662492468392522e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.054482717141193682e+01 / ln2, --4.424715454340284460e+00 / ln2, --4.919649166968065757e+00 / ln2, --6.017498482476998589e+00 / ln2, --1.061406875134344041e+01 / ln2, --2.462783453866639771e+00 / ln2, --6.812113812154088954e+00 / ln2, --7.800758034760048254e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.193805121009943626e+00 / ln2, --5.685674146241039395e+00 / ln2, --1.025159966901359709e+01 / ln2, --4.424715454340284460e+00 / ln2, --5.959821016291367179e+00 / ln2, --9.484310506563019771e+00 / ln2, --1.258907280406040030e+01 / ln2, --9.529197793097948121e+00 / ln2, --4.424715454340284460e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --8.232504733803645891e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.184300953920424782e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.542219003269678979e+00 / ln2, --6.223992983953650970e+00 / ln2, --9.779642293724309710e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.177102904471855283e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.284098860888144067e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.919649166968065757e+00 / ln2, --3.949349394517413181e+00 / ln2, --6.885183121012873109e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.684202738748299844e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.833531233360072399e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --9.579468945846944194e+00 / ln2, --1.050516998695719195e+01 / ln2, --4.562852777492357070e+00 / ln2, --3.296199802569410142e+00 / ln2, --6.152879364568431875e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.923664837455273613e+00 / ln2, --7.483355190078385455e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.911633169851866043e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.193805121009943626e+00 / ln2, --8.233702486883688110e+00 / ln2, --5.113891938530826131e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.642897843502046484e+00 / ln2, --6.971660331060701488e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.600485884087979649e+00 / ln2, --5.542219003269678979e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.284098860888144067e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.267062386635592119e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.562852777492357070e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.195119186325862337e+00 / ln2, --6.406237793012392601e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.884045802498089728e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.049563242290908249e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.007365244407383287e+00 / ln2, --4.883577810848264811e+00 / ln2, --6.424166483534085259e+00 / ln2, --8.812268409318086526e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.584033785323046395e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.691538586043964010e+00 / ln2, --6.663698816176689910e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.971660331060701488e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.754707819725457085e+00 / ln2, --5.621647006643879507e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --5.758886612591042287e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.327963919515099178e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.345707246405288160e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.841396924932839241e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --7.368858813512747297e+00 / ln2, --5.871019786565007337e+00 / ln2, --4.143181862813722027e+00 / ln2, --5.959821016291367179e+00 / ln2, --4.998325418845404933e+00 / ln2, --4.576662416349575935e+00 / ln2, --5.177102904471855283e+00 / ln2, --7.184300953920424782e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.091764045676016259e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.694546051260094721e+00 / ln2, --1.092512541773554879e+01 / ln2, --4.754337034915018023e+00 / ln2, --7.290844047540147699e+00 / ln2, --5.871019786565007337e+00 / ln2, --6.327963919515099178e+00 / ln2, --9.785577344871311922e+00 / ln2, --4.604168121450740614e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.121057297107224571e+00 / ln2, --4.424715454340284460e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.720199943466562686e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.883577810848264811e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.949349394517413181e+00 / ln2, --7.119927210762653225e+00 / ln2, --8.071909107879246648e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.177102904471855283e+00 / ln2, --6.512580640245118957e+00 / ln2, --4.580662492468392522e+00 / ln2, --3.949349394517413181e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.183140534972725533e+00 / ln2, --5.861249608063488381e+00 / ln2, --6.017498482476998589e+00 / ln2, --4.424715454340284460e+00 / ln2, --5.758886612591042287e+00 / ln2, --4.143181862813722027e+00 / ln2, --4.091764045676016259e+00 / ln2, --5.332499360388146314e+00 / ln2, --4.893167479319754598e+00 / ln2, --9.648035504600203538e+00 / ln2, --6.286368968884687547e+00 / ln2, --5.025989230275349939e+00 / ln2, --7.517325864764372589e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.551979924991755411e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.397372105698754474e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.415204418624045779e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.046324443145273619e+00 / ln2, --8.839003156104606518e+00 / ln2, --7.359401430306112601e+00 / ln2, --7.210947893307020351e+00 / ln2, --4.893167479319754598e+00 / ln2, --5.025989230275349939e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.694546051260094721e+00 / ln2, --7.483355190078385455e+00 / ln2, --4.160925916687072679e+00 / ln2, --3.631360480608693209e+00 / ln2, --4.691538586043964010e+00 / ln2, --4.562852777492357070e+00 / ln2, --3.631360480608693209e+00 / ln2, --5.345707246405288160e+00 / ln2, --7.359401430306112601e+00 / ln2, --4.893167479319754598e+00 / ln2, --7.289077351069391142e+00 / ln2, --7.210947893307020351e+00 / ln2, --4.893167479319754598e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.861249608063488381e+00 / ln2, --4.562852777492357070e+00 / ln2, --4.580662492468392522e+00 / ln2, --7.362920232037894586e+00 / ln2, --4.576662416349575935e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.070585939587089008e+01 / ln2, --5.177102904471855283e+00 / ln2, --4.091764045676016259e+00 / ln2, --7.810898878696857395e+00 / ln2, --6.512580640245118957e+00 / ln2, --7.699896352130231492e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.160925916687072679e+00 / ln2, --8.233702486883688110e+00 / ln2, --5.195119186325862337e+00 / ln2, --2.046324443145273619e+00 / ln2, --1.132541823088126165e+01 / ln2, --6.152879364568431875e+00 / ln2, --4.424715454340284460e+00 / ln2, --6.600485884087979649e+00 / ln2, --6.909735959825669127e+00 / ln2, --1.278432279724004239e+01 / ln2, --9.648035504600203538e+00 / ln2, --3.949349394517413181e+00 / ln2, --4.143181862813722027e+00 / ln2, --8.005103642565483568e+00 / ln2, --2.462783453866639771e+00 / ln2, --7.210947893307020351e+00 / ln2, --8.179445530167162914e+00 / ln2, --4.160925916687072679e+00 / ln2, --2.462783453866639771e+00 / ln2, --8.140218559980493040e+00 / ln2, --2.462783453866639771e+00 / ln2, --5.193805121009943626e+00 / ln2, --4.160925916687072679e+00 / ln2, --7.641510812793480767e+00 / ln2, --4.576662416349575935e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.332499360388146314e+00 / ln2, --1.175414779598468940e+01 / ln2, --2.046324443145273619e+00 / ln2, --8.617690255987351833e+00 / ln2, --4.143181862813722027e+00 / ln2, --3.296199802569410142e+00 / ln2, --7.683429021422371719e+00 / ln2, --5.674889513884615155e+00 / ln2, --5.177102904471855283e+00 / ln2, --6.885160160725777523e+00 / ln2, --6.763732050866829049e+00 / ln2, --2.462783453866639771e+00 / ln2, --6.017498482476998589e+00 / ln2, --6.152879364568431875e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.604168121450740614e+00 / ln2, --5.025989230275349939e+00 / ln2, --5.959821016291367179e+00 / ln2, --5.113891938530826131e+00 / ln2, --3.296199802569410142e+00 / ln2, --8.140218559980493040e+00 / ln2, --4.919649166968065757e+00 / ln2, --4.754337034915018023e+00 / ln2, --4.604168121450740614e+00 / ln2, --4.883577810848264811e+00 / ln2, --7.959852224170357538e+00 / ln2, --4.498412758302154479e+00 / ln2, --7.057958593457523300e+00 / ln2, --5.332499360388146314e+00 / ln2, --5.397372105698754474e+00 / ln2, --1.278432279724004239e+01 / ln2, --5.193805121009943626e+00 / ln2, --2.462783453866639771e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.691538586043964010e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --4.160925916687072679e+00 / ln2, --4.998325418845404933e+00 / ln2, --5.923664837455273613e+00 / ln2, --4.754337034915018023e+00 / ln2, --5.536137450497251145e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.631360480608693209e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.143181862813722027e+00 / ln2, --6.971660331060701488e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.861249608063488381e+00 / ln2, --2.046324443145273619e+00 / ln2, --5.754707819725457085e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.012900414694919959e+01 / ln2, --8.098608047708514945e+00 / ln2, --6.512580640245118957e+00 / ln2, --6.885183121012873109e+00 / ln2, --5.284098860888144067e+00 / ln2, --5.177102904471855283e+00 / ln2, --5.284098860888144067e+00 / ln2, --8.447106204735684187e+00 / ln2, --5.617458030859222795e+00 / ln2, --2.462783453866639771e+00 / ln2, --1.115671305913878442e+01 / ln2, --2.046324443145273619e+00 / ln2, --5.553599664845023653e+00 / ln2, --5.195119186325862337e+00 / ln2, --7.186698218369051538e+00 / ln2, --1.106006057964308731e+01 / ln2, --2.462783453866639771e+00 / ln2, --7.267062386635592119e+00 / ln2, --4.049563242290908249e+00 / ln2, --4.691538586043964010e+00 / ln2, --1.165915831016035398e+01 / ln2, --4.091764045676016259e+00 / ln2, --7.689409517815276374e+00 / ln2, --3.631360480608693209e+00 / ln2, --3.949349394517413181e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.415204418624045779e+00 / ln2, --4.498412758302154479e+00 / ln2, --6.720134407192276171e+00 / ln2, --2.046324443145273619e+00 / ln2, --6.674700103110665417e+00 / ln2, --8.098608047708514945e+00 / ln2, --6.584033785323046395e+00 / ln2, --4.143181862813722027e+00 / ln2, --2.046324443145273619e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2, --3.296199802569410142e+00 / ln2, --4.998325418845404933e+00 / ln2, --3.296199802569410142e+00 / ln2, --3.296199802569410142e+00 / ln2, --5.861249608063488381e+00 / ln2, --8.838166443014722873e+00 / ln2, --5.553599664845023653e+00 / ln2, --4.424715454340284460e+00 / ln2, --2.462783453866639771e+00 / ln2, --4.091764045676016259e+00 / ln2, --6.458537022627602653e+00 / ln2, --2.046324443145273619e+00 / ln2, --2.046324443145273619e+00 / ln2}; diff --git a/fpga_spn/toolchain-rv32.cmake b/fpga_spn/toolchain-rv32.cmake deleted file mode 100644 index bd5ee3b..0000000 --- a/fpga_spn/toolchain-rv32.cmake +++ /dev/null @@ -1,33 +0,0 @@ -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_VERSION 1) -set(CMAKE_SYSTEM_PROCESSOR riscv) - -set(TOOLCHAIN_DIR /opt/riscv/tools) -set(ARCHITECTURE riscv64-unknown-elf) - -set(CMAKE_C_COMPILER ${ARCHITECTURE}-gcc -set(CMAKE_CXX_COMPILER ${ARCHITECTURE}-g++ -set(RISCV_LINUX_SYSROOT /opt/riscv/tools CACHE PATH "RISC-V cross compilation system root") # search path for the cross compile toolchain - -set(CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags") -set(CMAKE_C_FLAGS "" CACHE STRING "c flags") -set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags") -set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags") -set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "executable linker flags") - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv32imac -mabi=ilp32") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv32imac -mabi=ilp32") -#set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") -#set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -march=rv32imac -mabi=ilp32") - -set(COMPILER_IS_RV32 "1") #flags for the CMakeList.txt -#add_definitions(-D_ARM_TEGRA3) # C/C++ preprocessor macro, which will be used in many many files - -set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/${ARCHITECTURE}) - -include_directories(${TOOLCHAIN_DIR}/${ARCHITECTURE}/include) - -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) \ No newline at end of file diff --git a/raven/.cproject b/raven/.cproject deleted file mode 100644 index 1135715..0000000 --- a/raven/.cproject +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - make - - all - true - true - true - - - make - - clean - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/raven/.project b/raven/.project deleted file mode 100644 index b930e99..0000000 --- a/raven/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - hello_raven - - - bsp - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/raven/Makefile b/raven/Makefile deleted file mode 100644 index 44033b3..0000000 --- a/raven/Makefile +++ /dev/null @@ -1,28 +0,0 @@ - -TARGET = hello_raven -C_SRCS = $(wildcard src/*.c) $(BSP_BASE)/drivers/fe300prci/fe300prci_driver.c $(BSP_BASE)/drivers/plic/plic_driver.c -CXX_SRCS = $(wildcard src/*.cpp) -HEADERS = $(wildcard src/*.h) -CFLAGS = -g -fno-builtin-printf -DUSE_PLIC -I./src -CXXFLAGS = -fno-use-cxa-atexit -LDFLAGS = -Wl,--wrap=printf -LDFLAGS += -g -lstdc++ -fno-use-cxa-atexit -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=medany - - -BOARD=freedom-e300-hifive1 -LINK_TARGET=flash -RISCV_ARCH=rv32imac -RISCV_ABI=ilp32 - -TOOL_DIR=/opt/shared/riscv/tools/Ubuntu/riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-linux-ubuntu14/bin - -BSP_BASE = ./bsp -include $(BSP_BASE)/env/common.mk - -.PHONY: all -all: $(TARGET).dump - -$(TARGET).dump: $(TARGET) - $(TOOL_DIR)/$(TRIPLET)-objdump -d -S -C $< > $@ - - diff --git a/raven/bsp/drivers/clic/clic_driver.c b/raven/bsp/drivers/clic/clic_driver.c deleted file mode 100644 index 0612e58..0000000 --- a/raven/bsp/drivers/clic/clic_driver.c +++ /dev/null @@ -1,163 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/clic.h" -#include "clic/clic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -void volatile_memzero(uint8_t * base, unsigned int size) { - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -// Note that there are no assertions or bounds checking on these -// parameter values. -void clic_init ( - clic_instance_t * this_clic, - uintptr_t hart_addr, - interrupt_function_ptr_t* vect_table, - interrupt_function_ptr_t default_handler, - uint32_t num_irq, - uint32_t num_config_bits - ) -{ - this_clic->hart_addr= hart_addr; - this_clic->vect_table= vect_table; - this_clic->num_config_bits= num_config_bits; - - //initialize vector table - for(int i=0;i++;ivect_table[i] = default_handler; - } - - //set base vectors - write_csr(mtvt, vect_table); - - - //clear all interrupt enables and pending - volatile_memzero((uint8_t*)(this_clic->hart_addr+CLIC_INTIE), num_irq); - volatile_memzero((uint8_t*)(this_clic->hart_addr+CLIC_INTIP), num_irq); - - //clear nlbits and nvbits; all interrupts trap to level 15 - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG)=0; - -} - -void clic_install_handler (clic_instance_t * this_clic, uint32_t source, interrupt_function_ptr_t handler) { - this_clic->vect_table[source] = handler; -} - -void clic_enable_interrupt (clic_instance_t * this_clic, uint32_t source) { - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIE+source) = 1; -} - -void clic_disable_interrupt (clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIE+source) = 0; -} - -void clic_set_pending(clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIP+source) = 1; -} - -void clic_clear_pending(clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIP+source) = 0; -} - -void clic_set_intcfg (clic_instance_t * this_clic, uint32_t source, uint32_t intcfg){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTCFG+source) = intcfg; -} - -uint8_t clic_get_intcfg (clic_instance_t * this_clic, uint32_t source){ - return *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTCFG+source); -} - -void clic_set_cliccfg (clic_instance_t * this_clic, uint32_t cfg){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG) = cfg; -} - -uint8_t clic_get_cliccfg (clic_instance_t * this_clic){ - return *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG); -} - -//sets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_set_int_level( clic_instance_t * this_clic, uint32_t source, uint8_t level) { - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift level right to mask off unused bits - level = level>>((this_clic->num_config_bits)-nlbits); //plus this_clic->nmbits which is always 0 for now. - //shift level into correct bit position - level = level << (8-this_clic->num_config_bits) + (this_clic->num_config_bits - nlbits); - - //write to clicintcfg - uint8_t current_intcfg = clic_get_intcfg(this_clic, source); - clic_set_intcfg(this_clic, source, (current_intcfg | level)); - - return level; -} - -//gets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_get_int_level( clic_instance_t * this_clic, uint32_t source) { - uint8_t level; - level = clic_get_intcfg(this_clic, source); - - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift level - level = level >> (8-(this_clic->num_config_bits)); - - //shift level right to mask off priority bits - level = level>>(this_clic->num_config_bits-nlbits); //this_clic->nmbits which is always 0 for now. - - return level; -} - -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_set_int_priority( clic_instance_t * this_clic, uint32_t source, uint8_t priority) { - //priority bits = num_config_bits - nlbits - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - uint8_t priority_bits = this_clic->num_config_bits-nlbits; - if(priority_bits = 0) { - //no bits to set - return 0; - } - //mask off unused bits - priority = priority >> (8-priority_bits); - //shift into the correct bit position - priority = priority << (8-(this_clic->num_config_bits)); - - //write to clicintcfg - uint8_t current_intcfg = clic_get_intcfg(this_clic, source); - clic_set_intcfg(this_clic, source, (current_intcfg | priority)); - return current_intcfg; -} - -//gets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_get_int_priority( clic_instance_t * this_clic, uint32_t source) { - uint8_t priority; - priority = clic_get_intcfg(this_clic, source); - - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift left to mask off level bits - priority = priority << nlbits; - - //shift priority - priority = priority >> (8-((this_clic->num_config_bits)+nlbits)); - - return priority; -} - - diff --git a/raven/bsp/drivers/clic/clic_driver.h b/raven/bsp/drivers/clic/clic_driver.h deleted file mode 100644 index 27c34c2..0000000 --- a/raven/bsp/drivers/clic/clic_driver.h +++ /dev/null @@ -1,44 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef void (*interrupt_function_ptr_t) (void); - -typedef struct __clic_instance_t -{ - uintptr_t hart_addr; - interrupt_function_ptr_t* vect_table; - uint32_t num_config_bits; - uint32_t num_sources; -} clic_instance_t; - -// Note that there are no assertions or bounds checking on these -// parameter values. -void clic_init (clic_instance_t * this_clic, uintptr_t hart_addr, interrupt_function_ptr_t* vect_table, interrupt_function_ptr_t default_handler, uint32_t num_irq,uint32_t num_config_bits); -void clic_install_handler (clic_instance_t * this_clic, uint32_t source, interrupt_function_ptr_t handler); -void clic_enable_interrupt (clic_instance_t * this_clic, uint32_t source); -void clic_disable_interrupt (clic_instance_t * this_clic, uint32_t source); -void clic_set_pending(clic_instance_t * this_clic, uint32_t source); -void clic_clear_pending(clic_instance_t * this_clic, uint32_t source); -void clic_set_intcfg (clic_instance_t * this_clic, uint32_t source, uint32_t intcfg); -uint8_t clic_get_intcfg (clic_instance_t * this_clic, uint32_t source); -void clic_set_cliccfg (clic_instance_t * this_clic, uint32_t cfg); -uint8_t clic_get_cliccfg (clic_instance_t * this_clic); -//sets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_set_int_level( clic_instance_t * this_clic, uint32_t source, uint8_t level); -//get an interrupt level based encoding of nmbits, nlbits -uint8_t clic_get_int_level( clic_instance_t * this_clic, uint32_t source); -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_set_int_priority( clic_instance_t * this_clic, uint32_t source, uint8_t priority); -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_get_int_priority( clic_instance_t * this_clic, uint32_t source); - -__END_DECLS - -#endif diff --git a/raven/bsp/drivers/fe300prci/fe300prci_driver.c b/raven/bsp/drivers/fe300prci/fe300prci_driver.c deleted file mode 100644 index 8eeaafc..0000000 --- a/raven/bsp/drivers/fe300prci/fe300prci_driver.c +++ /dev/null @@ -1,252 +0,0 @@ -// See LICENSE file for license details - -#include "platform.h" - -#ifdef PRCI_CTRL_ADDR -#include "fe300prci/fe300prci_driver.h" -#include - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq) -{ - - uint32_t start_mtime = CLINT_REG(CLINT_MTIME); - uint32_t end_mtime = start_mtime + mtime_ticks + 1; - - // Make sure we won't get rollover. - while (end_mtime < start_mtime){ - start_mtime = CLINT_REG(CLINT_MTIME); - end_mtime = start_mtime + mtime_ticks + 1; - } - - // Don't start measuring until mtime edge. - uint32_t tmp = start_mtime; - do { - start_mtime = CLINT_REG(CLINT_MTIME); - } while (start_mtime == tmp); - - uint64_t start_mcycle; - rdmcycle(&start_mcycle); - - while (CLINT_REG(CLINT_MTIME) < end_mtime) ; - - uint64_t end_mcycle; - rdmcycle(&end_mcycle); - uint32_t difference = (uint32_t) (end_mcycle - start_mcycle); - - uint64_t freq = ((uint64_t) difference * mtime_freq) / mtime_ticks; - return (uint32_t) freq & 0xFFFFFFFF; - -} - - -void PRCI_use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - // It is OK to change this even if we are running off of it. - - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0); - - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - PRCI_use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if desired. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - - // To overclock, use the hfrosc - if (hfrosctrim >= 0 && hfroscdiv >= 0) { - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - } - - // Set DIV Settings for PLL - - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - if (finaldiv == 1){ - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV(finaldiv-1)); - } - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = CLINT_REG(CLINT_MTIME); - while (CLINT_REG(CLINT_MTIME) - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0); - - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); - - // If we're running off HFXOSC, turn off the HFROSC to - // save power. - if (refsel) { - PRCI_REG(PRCI_HFROSCCFG) &= ~ROSC_EN(1); - } - -} - -void PRCI_use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - PRCI_use_hfrosc(4, 16); -} - -void PRCI_use_hfxosc(uint32_t finaldiv) -{ - - PRCI_use_pll(1, // Use HFXTAL - 1, // Bypass = 1 - 0, // PLL settings don't matter - 0, // PLL settings don't matter - 0, // PLL settings don't matter - finaldiv, - -1, - -1); -} - -// This is a generic function, which -// doesn't span the entire range of HFROSC settings. -// It only adjusts the trim, which can span a hundred MHz or so. -// This function does not check the legality of the PLL settings -// at all, and it is quite possible to configure invalid PLL settings -// this way. -// It returns the actual measured CPU frequency. - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target ) -{ - - uint32_t hfrosctrim = 0; - uint32_t hfroscdiv = 4; - uint32_t prev_trim = 0; - - // In this function we use PLL settings which - // will give us a 32x multiplier from the output - // of the HFROSC source to the output of the - // PLL. We first measure our HFROSC to get the - // right trim, then finally use it as the PLL source. - // We should really check here that the f_cpu - // requested is something in the limit of the PLL. For - // now that is up to the user. - - // This will undershoot for frequencies not divisible by 16. - uint32_t desired_hfrosc_freq = (f_cpu/ 16); - - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - - // Ignore the first run (for icache reasons) - uint32_t cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - uint32_t prev_freq = cpu_freq; - - while ((cpu_freq < desired_hfrosc_freq) && (hfrosctrim < 0x1F)){ - prev_trim = hfrosctrim; - prev_freq = cpu_freq; - hfrosctrim ++; - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - } - - // We couldn't go low enough - if (prev_freq > desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // We couldn't go high enough - if (cpu_freq < desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // Check for over/undershoot - switch(target) { - case(PRCI_FREQ_CLOSEST): - if ((desired_hfrosc_freq - prev_freq) < (cpu_freq - desired_hfrosc_freq)) { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - } else { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - break; - case(PRCI_FREQ_UNDERSHOOT): - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - break; - default: - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - -} - -#endif diff --git a/raven/bsp/drivers/fe300prci/fe300prci_driver.h b/raven/bsp/drivers/fe300prci/fe300prci_driver.h deleted file mode 100644 index 7100f46..0000000 --- a/raven/bsp/drivers/fe300prci/fe300prci_driver.h +++ /dev/null @@ -1,79 +0,0 @@ -// See LICENSE file for license details - -#ifndef _FE300PRCI_DRIVER_H_ -#define _FE300PRCI_DRIVER_H_ - -__BEGIN_DECLS - -#include - -typedef enum prci_freq_target { - - PRCI_FREQ_OVERSHOOT, - PRCI_FREQ_CLOSEST, - PRCI_FREQ_UNDERSHOOT - -} PRCI_freq_target; - -/* Measure and return the approximate frequency of the - * CPU, as given by measuring the mcycle counter against - * the mtime ticks. - */ -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq); - -/* Safely switch over to the HFROSC using the given div - * and trim settings. - */ -void PRCI_use_hfrosc(int div, int trim); - -/* Safely switch over to the 16MHz HFXOSC, - * applying the finaldiv clock divider (1 is the lowest - * legal value). - */ -void PRCI_use_hfxosc(uint32_t finaldiv); - -/* Safely switch over to the PLL using the given - * settings. - * - * Note that not all combinations of the inputs are actually - * legal, and this function does not check for their - * legality ("safely" means that this function won't turn off - * or glitch the clock the CPU is actually running off, but - * doesn't protect against you making it too fast or slow.) - */ - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim); - -/* Use the default clocks configured at reset. - * This is ~16Mhz HFROSC and turns off the LFROSC - * (on the current FE310 Dev Platforms, an external LFROSC is - * used as it is more power efficient). - */ -void PRCI_use_default_clocks(); - -/* This routine will adjust the HFROSC trim - * while using HFROSC as the clock source, - * measure the resulting frequency, then - * use it as the PLL clock source, - * in an attempt to get over, under, or close to the - * requested frequency. It returns the actual measured - * frequency. - * - * Note that the requested frequency must be within the - * range supported by the PLL so not all values are - * achievable with this function, and not all - * are guaranteed to actually work. The PLL - * is rated higher than the hardware. - * - * There is no check on the desired f_cpu frequency, it - * is up to the user to specify something reasonable. - */ - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target); - -__END_DECLS - -#endif - diff --git a/raven/bsp/drivers/plic/plic_driver.c b/raven/bsp/drivers/plic/plic_driver.c deleted file mode 100644 index 4f41bda..0000000 --- a/raven/bsp/drivers/plic/plic_driver.c +++ /dev/null @@ -1,122 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/plic.h" -#include "plic/plic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -// Note that there are no assertions or bounds checking on these -// parameter values. - -void volatile_memzero(uint8_t * base, unsigned int size) -{ - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities, - uint32_t target_hartid - ) -{ - - this_plic->base_addr = base_addr; - this_plic->num_sources = num_sources; - this_plic->num_priorities = num_priorities; - this_plic->target_hartid = target_hartid; - - // Disable all interrupts (don't assume that these registers are reset). - volatile_memzero((uint8_t*) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET)), - (num_sources + 8) / 8); - - // Set all priorities to 0 (equal priority -- don't assume that these are reset). - volatile_memzero ((uint8_t *)(this_plic->base_addr + - PLIC_PRIORITY_OFFSET), - (num_sources + 1) << PLIC_PRIORITY_SHIFT_PER_SOURCE); - - // Set the threshold to 0. - volatile plic_threshold* threshold = (plic_threshold*) - (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (this_plic->target_hartid << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold = 0; - -} - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold){ - - volatile plic_threshold* threshold_ptr = (plic_threshold*) (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (this_plic->target_hartid << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold_ptr = threshold; - -} - - -void PLIC_enable_interrupt (plic_instance_t * this_plic, plic_source source){ - - volatile uint8_t * current_ptr = (volatile uint8_t *)(this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current | ( 1 << (source & 0x7)); - *current_ptr = current; - -} - -void PLIC_disable_interrupt (plic_instance_t * this_plic, plic_source source){ - - volatile uint8_t * current_ptr = (volatile uint8_t *) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current & ~(( 1 << (source & 0x7))); - *current_ptr = current; - -} - -void PLIC_set_priority (plic_instance_t * this_plic, plic_source source, plic_priority priority){ - - if (this_plic->num_priorities > 0) { - volatile plic_priority * priority_ptr = (volatile plic_priority *) - (this_plic->base_addr + - PLIC_PRIORITY_OFFSET + - (source << PLIC_PRIORITY_SHIFT_PER_SOURCE)); - *priority_ptr = priority; - } -} - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic){ - - volatile plic_source * claim_addr = (volatile plic_source * ) - (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (this_plic->target_hartid << PLIC_CLAIM_SHIFT_PER_TARGET)); - - return *claim_addr; - -} - -void PLIC_complete_interrupt(plic_instance_t * this_plic, plic_source source){ - - volatile plic_source * claim_addr = (volatile plic_source *) (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (this_plic->target_hartid << PLIC_CLAIM_SHIFT_PER_TARGET)); - *claim_addr = source; - -} - diff --git a/raven/bsp/drivers/plic/plic_driver.h b/raven/bsp/drivers/plic/plic_driver.h deleted file mode 100644 index f7201ee..0000000 --- a/raven/bsp/drivers/plic/plic_driver.h +++ /dev/null @@ -1,52 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef struct __plic_instance_t -{ - uintptr_t base_addr; - - uint32_t num_sources; - uint32_t num_priorities; - uint32_t target_hartid; -} plic_instance_t; - -typedef uint32_t plic_source; -typedef uint32_t plic_priority; -typedef uint32_t plic_threshold; - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities, - uint32_t target_hartid - ); - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold); - -void PLIC_enable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_disable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_set_priority (plic_instance_t * this_plic, - plic_source source, - plic_priority priority); - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic); - -void PLIC_complete_interrupt(plic_instance_t * this_plic, - plic_source source); - -__END_DECLS - -#endif diff --git a/raven/bsp/env/common.mk b/raven/bsp/env/common.mk deleted file mode 100644 index 0ca2c70..0000000 --- a/raven/bsp/env/common.mk +++ /dev/null @@ -1,66 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_COMMON -_SIFIVE_MK_COMMON := # defined - -.PHONY: all -all: $(TARGET) - -include $(BSP_BASE)/libwrap/libwrap.mk - -ENV_DIR = $(BSP_BASE)/env -PLATFORM_DIR = $(ENV_DIR)/$(BOARD) - -ASM_SRCS += $(ENV_DIR)/start.S -ASM_SRCS += $(ENV_DIR)/entry.S -C_SRCS += $(PLATFORM_DIR)/init.c - -LINKER_SCRIPT := $(PLATFORM_DIR)/$(LINK_TARGET).lds - -INCLUDES += -I$(BSP_BASE)/include -INCLUDES += -I$(BSP_BASE)/drivers/ -INCLUDES += -I$(ENV_DIR) -INCLUDES += -I$(PLATFORM_DIR) - -TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin - -LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles -LDFLAGS += -L$(ENV_DIR) --specs=nano.specs - -ASM_OBJS := $(ASM_SRCS:.S=.o) -C_OBJS := $(C_SRCS:.c=.o) -CXX_OBJS := $(CXX_SRCS:.cpp=.o) - -LINK_OBJS += $(ASM_OBJS) $(C_OBJS) $(CXX_OBJS) -LINK_DEPS += $(LINKER_SCRIPT) - -CLEAN_OBJS += $(TARGET) $(LINK_OBJS) - -CFLAGS += -march=$(RISCV_ARCH) -CFLAGS += -mabi=$(RISCV_ABI) -CFLAGS += -mcmodel=medany - -TRIPLET?=riscv64-unknown-elf -CXX=$(TOOL_DIR)/$(TRIPLET)-c++ -CC=$(TOOL_DIR)/$(TRIPLET)-gcc -LD=$(TOOL_DIR)/$(TRIPLET)-gcc -AR=$(TOOL_DIR)/$(TRIPLET)-ar - - -$(TARGET): $(LINK_OBJS) $(LINK_DEPS) - $(LD) $(LINK_OBJS) $(LDFLAGS) $(LIBWRAP) -o $@ - -$(ASM_OBJS): %.o: %.S $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(C_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -$(CXX_OBJS): %.o: %.cpp $(HEADERS) - $(CXX) $(CFLAGS) $(CXXFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -.PHONY: clean -clean: - rm -f $(CLEAN_OBJS) $(LIBWRAP) - -endif # _SIFIVE_MK_COMMON diff --git a/raven/bsp/env/coreip-e2-arty/flash.lds b/raven/bsp/env/coreip-e2-arty/flash.lds deleted file mode 100644 index 2d5eb01..0000000 --- a/raven/bsp/env/coreip-e2-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreip-e2-arty/init.c b/raven/bsp/env/coreip-e2-arty/init.c deleted file mode 100644 index 3a4c77c..0000000 --- a/raven/bsp/env/coreip-e2-arty/init.c +++ /dev/null @@ -1,98 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 32000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -extern int main(int argc, char** argv); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() ) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -typedef void (*interrupt_function_ptr_t) (void); -interrupt_function_ptr_t localISR[CLIC_NUM_INTERRUPTS] __attribute__((aligned(64))); - - -void trap_entry(void) __attribute__((interrupt, aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); - } else { - while(1); - } -} - -#ifdef CLIC_DIRECT -#else -void default_handler(void)__attribute__((interrupt));; -#endif -void default_handler(void) -{ - puts("default handler\n"); - while(1); -} - -void _init() -{ -#ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -//initialize vector table - int i=0; - while(iflash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreip-e2-arty/tim.lds b/raven/bsp/env/coreip-e2-arty/tim.lds deleted file mode 100644 index 7dfb36b..0000000 --- a/raven/bsp/env/coreip-e2-arty/tim.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreplexip-arty.h b/raven/bsp/env/coreplexip-arty.h deleted file mode 100644 index eedcaa5..0000000 --- a/raven/bsp/env/coreplexip-arty.h +++ /dev/null @@ -1,102 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_COREPLEXIP_ARTY_H -#define _SIFIVE_COREPLEXIP_ARTY_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the directly driven -// RGB LEDs on the Freedom Exx Coreplex IP Evaluation Arty FPGA Dev Kit. -// Additional RGB LEDs are driven by the 3 PWM outputs. - -#define RED_LED_OFFSET 0 -#define GREEN_LED_OFFSET 1 -#define BLUE_LED_OFFSET 2 - -// Switch 3 is used as a GPIO input. (Switch 0 is used to set -// the reset vector, the other switches are unused). - -#define SW_3_OFFSET 3 - -// These are the buttons which are mapped as inputs. - -#define HAS_BOARD_BUTTONS - -#define BUTTON_0_OFFSET 4 -#define BUTTON_1_OFFSET 5 -#define BUTTON_2_OFFSET 6 -#define BUTTON_3_OFFSET 7 - -// These are the bit offsets for the different GPIO pins -// mapped onto the PMOD A header. - -#define JA_0_OFFSET 8 -#define JA_1_OFFSET 9 -#define JA_2_OFFSET 10 -#define JA_3_OFFSET 11 -#define JA_4_OFFSET 12 -#define JA_5_OFFSET 13 -#define JA_6_OFFSET 14 -#define JA_7_OFFSET 15 - -// The below gives a mapping between global interrupt -// sources and their number. Note that on the coreplex -// deliverable, the io_global_interrupts go directly into -// the PLIC. The evaluation image on the FPGA mimics a -// system with peripheral devices which are driving the -// global interrupt lines. -// So, on this image, in order to get an interrupt from -// e.g. pressing BUTTON_0: -// 1) Steps which are external to the delivery coreplex: -// a) The corresponding GPIO pin must be configured as in input -// b) The "interrupt on fall" bit must be set for the GPIO pin -// 2) Steps which would also need to be performed for the delivery coreplex: -// a) The corresponding global interrupt, priority, and threshold must be configured in the PLIC. -// b) The external interrupt bit must be enabled in MSTATUS -// c) Interrupts must be enabled globally in the core. - -// Any of the above GPIO pins can be used as global interrupt -// sources by adding their offset to the INT_GPIO_BASE. -// For example, the buttons are shown here: - -#define INT_DEVICE_BUTTON_0 (GPIO_INT_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (GPIO_INT_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (GPIO_INT_BASE + BUTTON_2_OFFSET) -#define INT_DEVICE_BUTTON_3 (GPIO_INT_BASE + BUTTON_3_OFFSET) - -// In addition, the Switches are mapped directly to -// the PLIC (without going through the GPIO Peripheral). - -#define INT_EXT_DEVICE_SW_0 (EXTERNAL_INT_BASE + 0) -#define INT_EXT_DEVICE_SW_1 (EXTERNAL_INT_BASE + 1) -#define INT_EXT_DEVICE_SW_2 (EXTERNAL_INT_BASE + 2) -#define INT_EXT_DEVICE_SW_3 (EXTERNAL_INT_BASE + 3) - -// This gives the mapping from inputs to LOCAL interrupts. - -#define LOCAL_INT_SW_0 0 -#define LOCAL_INT_SW_1 1 -#define LOCAL_INT_SW_2 2 -#define LOCAL_INT_SW_3 3 -#define LOCAL_INT_BTN_0 4 -#define LOCAL_INT_BTN_1 5 -#define LOCAL_INT_BTN_2 6 -#define LOCAL_INT_BTN_3 7 -#define LOCAL_INT_JA_0 8 -#define LOCAL_INT_JA_1 9 -#define LOCAL_INT_JA_2 10 -#define LOCAL_INT_JA_3 11 -#define LOCAL_INT_JA_4 12 -#define LOCAL_INT_JA_5 13 -#define LOCAL_INT_JA_6 14 -#define LOCAL_INT_JA_7 15 - -#define RTC_FREQ 32768 - -void write_hex(int fd, unsigned long int hex); - -#endif /* _SIFIVE_COREPLEXIP_ARTY_H */ diff --git a/raven/bsp/env/coreplexip-e31-arty/dhrystone.lds b/raven/bsp/env/coreplexip-e31-arty/dhrystone.lds deleted file mode 100644 index 8f6527b..0000000 --- a/raven/bsp/env/coreplexip-e31-arty/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreplexip-e31-arty/flash.lds b/raven/bsp/env/coreplexip-e31-arty/flash.lds deleted file mode 100644 index 590c5b6..0000000 --- a/raven/bsp/env/coreplexip-e31-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreplexip-e31-arty/init.c b/raven/bsp/env/coreplexip-e31-arty/init.c deleted file mode 100644 index 1f8b679..0000000 --- a/raven/bsp/env/coreplexip-e31-arty/init.c +++ /dev/null @@ -1,122 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 65000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -#ifndef VECT_IRQ - #define TRAP_ENTRY trap_entry -#else - #define TRAP_ENTRY vtrap_entry -#endif - -extern int main(int argc, char** argv); -extern void TRAP_ENTRY(); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() / 2) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -#ifdef USE_LOCAL_ISR -typedef void (*my_interrupt_function_ptr_t) (void); -extern my_interrupt_function_ptr_t localISR[]; -#endif - -#ifndef VECT_IRQ -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) __attribute__((noinline)); -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif -#ifdef USE_LOCAL_ISR - } else if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} -#endif - -#ifdef USE_CLIC -void trap_entry(void) __attribute__((interrupt("SiFive-CLIC-preemptible"), aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - handle_trap(mcause, mepc); -} -#endif - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -#ifdef USE_CLIC - write_csr(mtvec, ((unsigned long)&trap_entry | MTVEC_CLIC)); -#else - write_csr(mtvec, ((unsigned long)&TRAP_ENTRY | MTVEC_VECTORED)); -#endif - - #endif -} - -void _fini() -{ -} diff --git a/raven/bsp/env/coreplexip-e31-arty/openocd.cfg b/raven/bsp/env/coreplexip-e31-arty/openocd.cfg deleted file mode 100644 index 0481a72..0000000 --- a/raven/bsp/env/coreplexip-e31-arty/openocd.cfg +++ /dev/null @@ -1,31 +0,0 @@ -# JTAG adapter setup -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001 - -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -# Un-comment these two flash lines if you have a SPI flash and want to write -# it. -flash bank spi0 fespi 0x40000000 0 0 0 $_TARGETNAME.0 0x20004000 -init -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off -echo "Ready for Remote Connections" diff --git a/raven/bsp/env/coreplexip-e31-arty/platform.h b/raven/bsp/env/coreplexip-e31-arty/platform.h deleted file mode 100644 index 6fa79ea..0000000 --- a/raven/bsp/env/coreplexip-e31-arty/platform.h +++ /dev/null @@ -1,100 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h - -#if __riscv_xlen == 32 -#define MCAUSE_INT 0x80000000UL -#define MCAUSE_CAUSE 0x000003FFUL -#else -#define MCAUSE_INT 0x8000000000000000UL -#define MCAUSE_CAUSE 0x00000000000003FFUL -#endif - -#ifdef VECT_IRQ - #define MTVEC_VECTORED 0x01 -#else - #define MTVEC_VECTORED 0x00 -#endif -#define MTVEC_CLIC 0x02 -#define IRQ_M_LOCAL 16 -#define MIP_MLIP(x) (1 << (IRQ_M_LOCAL + x)) - -#include "sifive/const.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define GPIO_CTRL_ADDR _AC(0x20002000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define PWM0_CTRL_ADDR _AC(0x20005000,UL) -#define RAM_MEM_ADDR _AC(0x80000000,UL) -#define RAM_MEM_SIZE _AC(0x10000,UL) -#define SPI0_CTRL_ADDR _AC(0x20004000,UL) -#define SPI0_MEM_ADDR _AC(0x40000000,UL) -#define SPI0_MEM_SIZE _AC(0x20000000,UL) -#define TESTBENCH_MEM_ADDR _AC(0x20000000,UL) -#define TESTBENCH_MEM_SIZE _AC(0x10000000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define UART0_CTRL_ADDR _AC(0x20000000,UL) - -// IOF masks - -// Interrupt numbers -#define RESERVED_INT_BASE 0 -#define UART0_INT_BASE 1 -#define EXTERNAL_INT_BASE 2 -#define SPI0_INT_BASE 6 -#define GPIO_INT_BASE 7 -#define PWM0_INT_BASE 23 - -// Helper functions -#define _REG64(p, i) (*(volatile uint64_t *)((p) + (i))) -#define _REG32(p, i) (*(volatile uint32_t *)((p) + (i))) -#define _REG16(p, i) (*(volatile uint16_t *)((p) + (i))) -// Bulk set bits in `reg` to either 0 or 1. -// E.g. SET_BITS(MY_REG, 0x00000007, 0) would generate MY_REG &= ~0x7 -// E.g. SET_BITS(MY_REG, 0x00000007, 1) would generate MY_REG |= 0x7 -#define SET_BITS(reg, mask, value) if ((value) == 0) { (reg) &= ~(mask); } else { (reg) |= (mask); } -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG(offset) _REG32(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define CLINT_REG64(offset) _REG64(CLINT_CTRL_ADDR, offset) -#define GPIO_REG64(offset) _REG64(GPIO_CTRL_ADDR, offset) -#define PLIC_REG64(offset) _REG64(PLIC_CTRL_ADDR, offset) -#define PWM0_REG64(offset) _REG64(PWM0_CTRL_ADDR, offset) -#define SPI0_REG64(offset) _REG64(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG64(offset) _REG64(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG64(offset) _REG64(UART0_CTRL_ADDR, offset) - -// Misc - -#define NUM_GPIO 16 - -#define PLIC_NUM_INTERRUPTS 28 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS - -#include "coreplexip-arty.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/raven/bsp/env/coreplexip-e31-arty/scratchpad.lds b/raven/bsp/env/coreplexip-e31-arty/scratchpad.lds deleted file mode 100644 index 7887c13..0000000 --- a/raven/bsp/env/coreplexip-e31-arty/scratchpad.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreplexip-e31-arty/settings.mk b/raven/bsp/env/coreplexip-e31-arty/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/raven/bsp/env/coreplexip-e31-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/raven/bsp/env/coreplexip-e51-arty/dhrystone.lds b/raven/bsp/env/coreplexip-e51-arty/dhrystone.lds deleted file mode 100644 index 8f6527b..0000000 --- a/raven/bsp/env/coreplexip-e51-arty/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreplexip-e51-arty/flash.lds b/raven/bsp/env/coreplexip-e51-arty/flash.lds deleted file mode 100644 index 590c5b6..0000000 --- a/raven/bsp/env/coreplexip-e51-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreplexip-e51-arty/init.c b/raven/bsp/env/coreplexip-e51-arty/init.c deleted file mode 100644 index 1f8b679..0000000 --- a/raven/bsp/env/coreplexip-e51-arty/init.c +++ /dev/null @@ -1,122 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 65000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -#ifndef VECT_IRQ - #define TRAP_ENTRY trap_entry -#else - #define TRAP_ENTRY vtrap_entry -#endif - -extern int main(int argc, char** argv); -extern void TRAP_ENTRY(); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() / 2) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -#ifdef USE_LOCAL_ISR -typedef void (*my_interrupt_function_ptr_t) (void); -extern my_interrupt_function_ptr_t localISR[]; -#endif - -#ifndef VECT_IRQ -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) __attribute__((noinline)); -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif -#ifdef USE_LOCAL_ISR - } else if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} -#endif - -#ifdef USE_CLIC -void trap_entry(void) __attribute__((interrupt("SiFive-CLIC-preemptible"), aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - handle_trap(mcause, mepc); -} -#endif - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -#ifdef USE_CLIC - write_csr(mtvec, ((unsigned long)&trap_entry | MTVEC_CLIC)); -#else - write_csr(mtvec, ((unsigned long)&TRAP_ENTRY | MTVEC_VECTORED)); -#endif - - #endif -} - -void _fini() -{ -} diff --git a/raven/bsp/env/coreplexip-e51-arty/openocd.cfg b/raven/bsp/env/coreplexip-e51-arty/openocd.cfg deleted file mode 100644 index 0481a72..0000000 --- a/raven/bsp/env/coreplexip-e51-arty/openocd.cfg +++ /dev/null @@ -1,31 +0,0 @@ -# JTAG adapter setup -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001 - -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -# Un-comment these two flash lines if you have a SPI flash and want to write -# it. -flash bank spi0 fespi 0x40000000 0 0 0 $_TARGETNAME.0 0x20004000 -init -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off -echo "Ready for Remote Connections" diff --git a/raven/bsp/env/coreplexip-e51-arty/platform.h b/raven/bsp/env/coreplexip-e51-arty/platform.h deleted file mode 100644 index 6fa79ea..0000000 --- a/raven/bsp/env/coreplexip-e51-arty/platform.h +++ /dev/null @@ -1,100 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h - -#if __riscv_xlen == 32 -#define MCAUSE_INT 0x80000000UL -#define MCAUSE_CAUSE 0x000003FFUL -#else -#define MCAUSE_INT 0x8000000000000000UL -#define MCAUSE_CAUSE 0x00000000000003FFUL -#endif - -#ifdef VECT_IRQ - #define MTVEC_VECTORED 0x01 -#else - #define MTVEC_VECTORED 0x00 -#endif -#define MTVEC_CLIC 0x02 -#define IRQ_M_LOCAL 16 -#define MIP_MLIP(x) (1 << (IRQ_M_LOCAL + x)) - -#include "sifive/const.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define GPIO_CTRL_ADDR _AC(0x20002000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define PWM0_CTRL_ADDR _AC(0x20005000,UL) -#define RAM_MEM_ADDR _AC(0x80000000,UL) -#define RAM_MEM_SIZE _AC(0x10000,UL) -#define SPI0_CTRL_ADDR _AC(0x20004000,UL) -#define SPI0_MEM_ADDR _AC(0x40000000,UL) -#define SPI0_MEM_SIZE _AC(0x20000000,UL) -#define TESTBENCH_MEM_ADDR _AC(0x20000000,UL) -#define TESTBENCH_MEM_SIZE _AC(0x10000000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define UART0_CTRL_ADDR _AC(0x20000000,UL) - -// IOF masks - -// Interrupt numbers -#define RESERVED_INT_BASE 0 -#define UART0_INT_BASE 1 -#define EXTERNAL_INT_BASE 2 -#define SPI0_INT_BASE 6 -#define GPIO_INT_BASE 7 -#define PWM0_INT_BASE 23 - -// Helper functions -#define _REG64(p, i) (*(volatile uint64_t *)((p) + (i))) -#define _REG32(p, i) (*(volatile uint32_t *)((p) + (i))) -#define _REG16(p, i) (*(volatile uint16_t *)((p) + (i))) -// Bulk set bits in `reg` to either 0 or 1. -// E.g. SET_BITS(MY_REG, 0x00000007, 0) would generate MY_REG &= ~0x7 -// E.g. SET_BITS(MY_REG, 0x00000007, 1) would generate MY_REG |= 0x7 -#define SET_BITS(reg, mask, value) if ((value) == 0) { (reg) &= ~(mask); } else { (reg) |= (mask); } -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG(offset) _REG32(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define CLINT_REG64(offset) _REG64(CLINT_CTRL_ADDR, offset) -#define GPIO_REG64(offset) _REG64(GPIO_CTRL_ADDR, offset) -#define PLIC_REG64(offset) _REG64(PLIC_CTRL_ADDR, offset) -#define PWM0_REG64(offset) _REG64(PWM0_CTRL_ADDR, offset) -#define SPI0_REG64(offset) _REG64(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG64(offset) _REG64(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG64(offset) _REG64(UART0_CTRL_ADDR, offset) - -// Misc - -#define NUM_GPIO 16 - -#define PLIC_NUM_INTERRUPTS 28 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS - -#include "coreplexip-arty.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/raven/bsp/env/coreplexip-e51-arty/scratchpad.lds b/raven/bsp/env/coreplexip-e51-arty/scratchpad.lds deleted file mode 100644 index 7887c13..0000000 --- a/raven/bsp/env/coreplexip-e51-arty/scratchpad.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/coreplexip-e51-arty/settings.mk b/raven/bsp/env/coreplexip-e51-arty/settings.mk deleted file mode 100644 index 96aea84..0000000 --- a/raven/bsp/env/coreplexip-e51-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv64imac -RISCV_ABI := lp64 diff --git a/raven/bsp/env/encoding.h b/raven/bsp/env/encoding.h deleted file mode 100644 index 35e0f9f..0000000 --- a/raven/bsp/env/encoding.h +++ /dev/null @@ -1,1313 +0,0 @@ -// See LICENSE for license details. - -#ifndef RISCV_CSR_ENCODING_H -#define RISCV_CSR_ENCODING_H - -#define MSTATUS_UIE 0x00000001 -#define MSTATUS_SIE 0x00000002 -#define MSTATUS_HIE 0x00000004 -#define MSTATUS_MIE 0x00000008 -#define MSTATUS_UPIE 0x00000010 -#define MSTATUS_SPIE 0x00000020 -#define MSTATUS_HPIE 0x00000040 -#define MSTATUS_MPIE 0x00000080 -#define MSTATUS_SPP 0x00000100 -#define MSTATUS_HPP 0x00000600 -#define MSTATUS_MPP 0x00001800 -#define MSTATUS_FS 0x00006000 -#define MSTATUS_XS 0x00018000 -#define MSTATUS_MPRV 0x00020000 -#define MSTATUS_PUM 0x00040000 -#define MSTATUS_MXR 0x00080000 -#define MSTATUS_VM 0x1F000000 -#define MSTATUS32_SD 0x80000000 -#define MSTATUS64_SD 0x8000000000000000 - -#define SSTATUS_UIE 0x00000001 -#define SSTATUS_SIE 0x00000002 -#define SSTATUS_UPIE 0x00000010 -#define SSTATUS_SPIE 0x00000020 -#define SSTATUS_SPP 0x00000100 -#define SSTATUS_FS 0x00006000 -#define SSTATUS_XS 0x00018000 -#define SSTATUS_PUM 0x00040000 -#define SSTATUS32_SD 0x80000000 -#define SSTATUS64_SD 0x8000000000000000 - -#define DCSR_XDEBUGVER (3U<<30) -#define DCSR_NDRESET (1<<29) -#define DCSR_FULLRESET (1<<28) -#define DCSR_EBREAKM (1<<15) -#define DCSR_EBREAKH (1<<14) -#define DCSR_EBREAKS (1<<13) -#define DCSR_EBREAKU (1<<12) -#define DCSR_STOPCYCLE (1<<10) -#define DCSR_STOPTIME (1<<9) -#define DCSR_CAUSE (7<<6) -#define DCSR_DEBUGINT (1<<5) -#define DCSR_HALT (1<<3) -#define DCSR_STEP (1<<2) -#define DCSR_PRV (3<<0) - -#define DCSR_CAUSE_NONE 0 -#define DCSR_CAUSE_SWBP 1 -#define DCSR_CAUSE_HWBP 2 -#define DCSR_CAUSE_DEBUGINT 3 -#define DCSR_CAUSE_STEP 4 -#define DCSR_CAUSE_HALT 5 - -#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) -#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) -#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) - -#define MCONTROL_SELECT (1<<19) -#define MCONTROL_TIMING (1<<18) -#define MCONTROL_ACTION (0x3f<<12) -#define MCONTROL_CHAIN (1<<11) -#define MCONTROL_MATCH (0xf<<7) -#define MCONTROL_M (1<<6) -#define MCONTROL_H (1<<5) -#define MCONTROL_S (1<<4) -#define MCONTROL_U (1<<3) -#define MCONTROL_EXECUTE (1<<2) -#define MCONTROL_STORE (1<<1) -#define MCONTROL_LOAD (1<<0) - -#define MCONTROL_TYPE_NONE 0 -#define MCONTROL_TYPE_MATCH 2 - -#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 -#define MCONTROL_ACTION_DEBUG_MODE 1 -#define MCONTROL_ACTION_TRACE_START 2 -#define MCONTROL_ACTION_TRACE_STOP 3 -#define MCONTROL_ACTION_TRACE_EMIT 4 - -#define MCONTROL_MATCH_EQUAL 0 -#define MCONTROL_MATCH_NAPOT 1 -#define MCONTROL_MATCH_GE 2 -#define MCONTROL_MATCH_LT 3 -#define MCONTROL_MATCH_MASK_LOW 4 -#define MCONTROL_MATCH_MASK_HIGH 5 - -#define MIP_SSIP (1 << IRQ_S_SOFT) -#define MIP_HSIP (1 << IRQ_H_SOFT) -#define MIP_MSIP (1 << IRQ_M_SOFT) -#define MIP_STIP (1 << IRQ_S_TIMER) -#define MIP_HTIP (1 << IRQ_H_TIMER) -#define MIP_MTIP (1 << IRQ_M_TIMER) -#define MIP_SEIP (1 << IRQ_S_EXT) -#define MIP_HEIP (1 << IRQ_H_EXT) -#define MIP_MEIP (1 << IRQ_M_EXT) - -#define SIP_SSIP MIP_SSIP -#define SIP_STIP MIP_STIP - -#define PRV_U 0 -#define PRV_S 1 -#define PRV_H 2 -#define PRV_M 3 - -#define VM_MBARE 0 -#define VM_MBB 1 -#define VM_MBBID 2 -#define VM_SV32 8 -#define VM_SV39 9 -#define VM_SV48 10 - -#define IRQ_S_SOFT 1 -#define IRQ_H_SOFT 2 -#define IRQ_M_SOFT 3 -#define IRQ_S_TIMER 5 -#define IRQ_H_TIMER 6 -#define IRQ_M_TIMER 7 -#define IRQ_S_EXT 9 -#define IRQ_H_EXT 10 -#define IRQ_M_EXT 11 -#define IRQ_COP 12 -#define IRQ_HOST 13 - -#define DEFAULT_RSTVEC 0x00001000 -#define DEFAULT_NMIVEC 0x00001004 -#define DEFAULT_MTVEC 0x00001010 -#define CONFIG_STRING_ADDR 0x0000100C -#define EXT_IO_BASE 0x40000000 -#define DRAM_BASE 0x80000000 - -// page table entry (PTE) fields -#define PTE_V 0x001 // Valid -#define PTE_R 0x002 // Read -#define PTE_W 0x004 // Write -#define PTE_X 0x008 // Execute -#define PTE_U 0x010 // User -#define PTE_G 0x020 // Global -#define PTE_A 0x040 // Accessed -#define PTE_D 0x080 // Dirty -#define PTE_SOFT 0x300 // Reserved for Software - -#define PTE_PPN_SHIFT 10 - -#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) - -#ifdef __riscv - -#ifdef __riscv64 -# define MSTATUS_SD MSTATUS64_SD -# define SSTATUS_SD SSTATUS64_SD -# define RISCV_PGLEVEL_BITS 9 -#else -# define MSTATUS_SD MSTATUS32_SD -# define SSTATUS_SD SSTATUS32_SD -# define RISCV_PGLEVEL_BITS 10 -#endif -#define RISCV_PGSHIFT 12 -#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) - -#ifndef __ASSEMBLER__ - -#ifdef __GNUC__ - -#define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - -#define write_csr(reg, val) ({ \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrw " #reg ", %0" :: "i"(val)); \ - else \ - asm volatile ("csrw " #reg ", %0" :: "r"(val)); }) - -#define swap_csr(reg, val) ({ unsigned long __tmp; \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \ - else \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \ - __tmp; }) - -#define set_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ - __tmp; }) - -#define clear_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ - __tmp; }) - -#define rdtime() read_csr(time) -#define rdcycle() read_csr(cycle) -#define rdinstret() read_csr(instret) - -#endif - -#endif - -#endif - -#endif -/* Automatically generated by parse-opcodes */ -#ifndef RISCV_ENCODING_H -#define RISCV_ENCODING_H -#define MATCH_BEQ 0x63 -#define MASK_BEQ 0x707f -#define MATCH_BNE 0x1063 -#define MASK_BNE 0x707f -#define MATCH_BLT 0x4063 -#define MASK_BLT 0x707f -#define MATCH_BGE 0x5063 -#define MASK_BGE 0x707f -#define MATCH_BLTU 0x6063 -#define MASK_BLTU 0x707f -#define MATCH_BGEU 0x7063 -#define MASK_BGEU 0x707f -#define MATCH_JALR 0x67 -#define MASK_JALR 0x707f -#define MATCH_JAL 0x6f -#define MASK_JAL 0x7f -#define MATCH_LUI 0x37 -#define MASK_LUI 0x7f -#define MATCH_AUIPC 0x17 -#define MASK_AUIPC 0x7f -#define MATCH_ADDI 0x13 -#define MASK_ADDI 0x707f -#define MATCH_SLLI 0x1013 -#define MASK_SLLI 0xfc00707f -#define MATCH_SLTI 0x2013 -#define MASK_SLTI 0x707f -#define MATCH_SLTIU 0x3013 -#define MASK_SLTIU 0x707f -#define MATCH_XORI 0x4013 -#define MASK_XORI 0x707f -#define MATCH_SRLI 0x5013 -#define MASK_SRLI 0xfc00707f -#define MATCH_SRAI 0x40005013 -#define MASK_SRAI 0xfc00707f -#define MATCH_ORI 0x6013 -#define MASK_ORI 0x707f -#define MATCH_ANDI 0x7013 -#define MASK_ANDI 0x707f -#define MATCH_ADD 0x33 -#define MASK_ADD 0xfe00707f -#define MATCH_SUB 0x40000033 -#define MASK_SUB 0xfe00707f -#define MATCH_SLL 0x1033 -#define MASK_SLL 0xfe00707f -#define MATCH_SLT 0x2033 -#define MASK_SLT 0xfe00707f -#define MATCH_SLTU 0x3033 -#define MASK_SLTU 0xfe00707f -#define MATCH_XOR 0x4033 -#define MASK_XOR 0xfe00707f -#define MATCH_SRL 0x5033 -#define MASK_SRL 0xfe00707f -#define MATCH_SRA 0x40005033 -#define MASK_SRA 0xfe00707f -#define MATCH_OR 0x6033 -#define MASK_OR 0xfe00707f -#define MATCH_AND 0x7033 -#define MASK_AND 0xfe00707f -#define MATCH_ADDIW 0x1b -#define MASK_ADDIW 0x707f -#define MATCH_SLLIW 0x101b -#define MASK_SLLIW 0xfe00707f -#define MATCH_SRLIW 0x501b -#define MASK_SRLIW 0xfe00707f -#define MATCH_SRAIW 0x4000501b -#define MASK_SRAIW 0xfe00707f -#define MATCH_ADDW 0x3b -#define MASK_ADDW 0xfe00707f -#define MATCH_SUBW 0x4000003b -#define MASK_SUBW 0xfe00707f -#define MATCH_SLLW 0x103b -#define MASK_SLLW 0xfe00707f -#define MATCH_SRLW 0x503b -#define MASK_SRLW 0xfe00707f -#define MATCH_SRAW 0x4000503b -#define MASK_SRAW 0xfe00707f -#define MATCH_LB 0x3 -#define MASK_LB 0x707f -#define MATCH_LH 0x1003 -#define MASK_LH 0x707f -#define MATCH_LW 0x2003 -#define MASK_LW 0x707f -#define MATCH_LD 0x3003 -#define MASK_LD 0x707f -#define MATCH_LBU 0x4003 -#define MASK_LBU 0x707f -#define MATCH_LHU 0x5003 -#define MASK_LHU 0x707f -#define MATCH_LWU 0x6003 -#define MASK_LWU 0x707f -#define MATCH_SB 0x23 -#define MASK_SB 0x707f -#define MATCH_SH 0x1023 -#define MASK_SH 0x707f -#define MATCH_SW 0x2023 -#define MASK_SW 0x707f -#define MATCH_SD 0x3023 -#define MASK_SD 0x707f -#define MATCH_FENCE 0xf -#define MASK_FENCE 0x707f -#define MATCH_FENCE_I 0x100f -#define MASK_FENCE_I 0x707f -#define MATCH_MUL 0x2000033 -#define MASK_MUL 0xfe00707f -#define MATCH_MULH 0x2001033 -#define MASK_MULH 0xfe00707f -#define MATCH_MULHSU 0x2002033 -#define MASK_MULHSU 0xfe00707f -#define MATCH_MULHU 0x2003033 -#define MASK_MULHU 0xfe00707f -#define MATCH_DIV 0x2004033 -#define MASK_DIV 0xfe00707f -#define MATCH_DIVU 0x2005033 -#define MASK_DIVU 0xfe00707f -#define MATCH_REM 0x2006033 -#define MASK_REM 0xfe00707f -#define MATCH_REMU 0x2007033 -#define MASK_REMU 0xfe00707f -#define MATCH_MULW 0x200003b -#define MASK_MULW 0xfe00707f -#define MATCH_DIVW 0x200403b -#define MASK_DIVW 0xfe00707f -#define MATCH_DIVUW 0x200503b -#define MASK_DIVUW 0xfe00707f -#define MATCH_REMW 0x200603b -#define MASK_REMW 0xfe00707f -#define MATCH_REMUW 0x200703b -#define MASK_REMUW 0xfe00707f -#define MATCH_AMOADD_W 0x202f -#define MASK_AMOADD_W 0xf800707f -#define MATCH_AMOXOR_W 0x2000202f -#define MASK_AMOXOR_W 0xf800707f -#define MATCH_AMOOR_W 0x4000202f -#define MASK_AMOOR_W 0xf800707f -#define MATCH_AMOAND_W 0x6000202f -#define MASK_AMOAND_W 0xf800707f -#define MATCH_AMOMIN_W 0x8000202f -#define MASK_AMOMIN_W 0xf800707f -#define MATCH_AMOMAX_W 0xa000202f -#define MASK_AMOMAX_W 0xf800707f -#define MATCH_AMOMINU_W 0xc000202f -#define MASK_AMOMINU_W 0xf800707f -#define MATCH_AMOMAXU_W 0xe000202f -#define MASK_AMOMAXU_W 0xf800707f -#define MATCH_AMOSWAP_W 0x800202f -#define MASK_AMOSWAP_W 0xf800707f -#define MATCH_LR_W 0x1000202f -#define MASK_LR_W 0xf9f0707f -#define MATCH_SC_W 0x1800202f -#define MASK_SC_W 0xf800707f -#define MATCH_AMOADD_D 0x302f -#define MASK_AMOADD_D 0xf800707f -#define MATCH_AMOXOR_D 0x2000302f -#define MASK_AMOXOR_D 0xf800707f -#define MATCH_AMOOR_D 0x4000302f -#define MASK_AMOOR_D 0xf800707f -#define MATCH_AMOAND_D 0x6000302f -#define MASK_AMOAND_D 0xf800707f -#define MATCH_AMOMIN_D 0x8000302f -#define MASK_AMOMIN_D 0xf800707f -#define MATCH_AMOMAX_D 0xa000302f -#define MASK_AMOMAX_D 0xf800707f -#define MATCH_AMOMINU_D 0xc000302f -#define MASK_AMOMINU_D 0xf800707f -#define MATCH_AMOMAXU_D 0xe000302f -#define MASK_AMOMAXU_D 0xf800707f -#define MATCH_AMOSWAP_D 0x800302f -#define MASK_AMOSWAP_D 0xf800707f -#define MATCH_LR_D 0x1000302f -#define MASK_LR_D 0xf9f0707f -#define MATCH_SC_D 0x1800302f -#define MASK_SC_D 0xf800707f -#define MATCH_ECALL 0x73 -#define MASK_ECALL 0xffffffff -#define MATCH_EBREAK 0x100073 -#define MASK_EBREAK 0xffffffff -#define MATCH_URET 0x200073 -#define MASK_URET 0xffffffff -#define MATCH_SRET 0x10200073 -#define MASK_SRET 0xffffffff -#define MATCH_HRET 0x20200073 -#define MASK_HRET 0xffffffff -#define MATCH_MRET 0x30200073 -#define MASK_MRET 0xffffffff -#define MATCH_DRET 0x7b200073 -#define MASK_DRET 0xffffffff -#define MATCH_SFENCE_VM 0x10400073 -#define MASK_SFENCE_VM 0xfff07fff -#define MATCH_WFI 0x10500073 -#define MASK_WFI 0xffffffff -#define MATCH_CSRRW 0x1073 -#define MASK_CSRRW 0x707f -#define MATCH_CSRRS 0x2073 -#define MASK_CSRRS 0x707f -#define MATCH_CSRRC 0x3073 -#define MASK_CSRRC 0x707f -#define MATCH_CSRRWI 0x5073 -#define MASK_CSRRWI 0x707f -#define MATCH_CSRRSI 0x6073 -#define MASK_CSRRSI 0x707f -#define MATCH_CSRRCI 0x7073 -#define MASK_CSRRCI 0x707f -#define MATCH_FADD_S 0x53 -#define MASK_FADD_S 0xfe00007f -#define MATCH_FSUB_S 0x8000053 -#define MASK_FSUB_S 0xfe00007f -#define MATCH_FMUL_S 0x10000053 -#define MASK_FMUL_S 0xfe00007f -#define MATCH_FDIV_S 0x18000053 -#define MASK_FDIV_S 0xfe00007f -#define MATCH_FSGNJ_S 0x20000053 -#define MASK_FSGNJ_S 0xfe00707f -#define MATCH_FSGNJN_S 0x20001053 -#define MASK_FSGNJN_S 0xfe00707f -#define MATCH_FSGNJX_S 0x20002053 -#define MASK_FSGNJX_S 0xfe00707f -#define MATCH_FMIN_S 0x28000053 -#define MASK_FMIN_S 0xfe00707f -#define MATCH_FMAX_S 0x28001053 -#define MASK_FMAX_S 0xfe00707f -#define MATCH_FSQRT_S 0x58000053 -#define MASK_FSQRT_S 0xfff0007f -#define MATCH_FADD_D 0x2000053 -#define MASK_FADD_D 0xfe00007f -#define MATCH_FSUB_D 0xa000053 -#define MASK_FSUB_D 0xfe00007f -#define MATCH_FMUL_D 0x12000053 -#define MASK_FMUL_D 0xfe00007f -#define MATCH_FDIV_D 0x1a000053 -#define MASK_FDIV_D 0xfe00007f -#define MATCH_FSGNJ_D 0x22000053 -#define MASK_FSGNJ_D 0xfe00707f -#define MATCH_FSGNJN_D 0x22001053 -#define MASK_FSGNJN_D 0xfe00707f -#define MATCH_FSGNJX_D 0x22002053 -#define MASK_FSGNJX_D 0xfe00707f -#define MATCH_FMIN_D 0x2a000053 -#define MASK_FMIN_D 0xfe00707f -#define MATCH_FMAX_D 0x2a001053 -#define MASK_FMAX_D 0xfe00707f -#define MATCH_FCVT_S_D 0x40100053 -#define MASK_FCVT_S_D 0xfff0007f -#define MATCH_FCVT_D_S 0x42000053 -#define MASK_FCVT_D_S 0xfff0007f -#define MATCH_FSQRT_D 0x5a000053 -#define MASK_FSQRT_D 0xfff0007f -#define MATCH_FLE_S 0xa0000053 -#define MASK_FLE_S 0xfe00707f -#define MATCH_FLT_S 0xa0001053 -#define MASK_FLT_S 0xfe00707f -#define MATCH_FEQ_S 0xa0002053 -#define MASK_FEQ_S 0xfe00707f -#define MATCH_FLE_D 0xa2000053 -#define MASK_FLE_D 0xfe00707f -#define MATCH_FLT_D 0xa2001053 -#define MASK_FLT_D 0xfe00707f -#define MATCH_FEQ_D 0xa2002053 -#define MASK_FEQ_D 0xfe00707f -#define MATCH_FCVT_W_S 0xc0000053 -#define MASK_FCVT_W_S 0xfff0007f -#define MATCH_FCVT_WU_S 0xc0100053 -#define MASK_FCVT_WU_S 0xfff0007f -#define MATCH_FCVT_L_S 0xc0200053 -#define MASK_FCVT_L_S 0xfff0007f -#define MATCH_FCVT_LU_S 0xc0300053 -#define MASK_FCVT_LU_S 0xfff0007f -#define MATCH_FMV_X_S 0xe0000053 -#define MASK_FMV_X_S 0xfff0707f -#define MATCH_FCLASS_S 0xe0001053 -#define MASK_FCLASS_S 0xfff0707f -#define MATCH_FCVT_W_D 0xc2000053 -#define MASK_FCVT_W_D 0xfff0007f -#define MATCH_FCVT_WU_D 0xc2100053 -#define MASK_FCVT_WU_D 0xfff0007f -#define MATCH_FCVT_L_D 0xc2200053 -#define MASK_FCVT_L_D 0xfff0007f -#define MATCH_FCVT_LU_D 0xc2300053 -#define MASK_FCVT_LU_D 0xfff0007f -#define MATCH_FMV_X_D 0xe2000053 -#define MASK_FMV_X_D 0xfff0707f -#define MATCH_FCLASS_D 0xe2001053 -#define MASK_FCLASS_D 0xfff0707f -#define MATCH_FCVT_S_W 0xd0000053 -#define MASK_FCVT_S_W 0xfff0007f -#define MATCH_FCVT_S_WU 0xd0100053 -#define MASK_FCVT_S_WU 0xfff0007f -#define MATCH_FCVT_S_L 0xd0200053 -#define MASK_FCVT_S_L 0xfff0007f -#define MATCH_FCVT_S_LU 0xd0300053 -#define MASK_FCVT_S_LU 0xfff0007f -#define MATCH_FMV_S_X 0xf0000053 -#define MASK_FMV_S_X 0xfff0707f -#define MATCH_FCVT_D_W 0xd2000053 -#define MASK_FCVT_D_W 0xfff0007f -#define MATCH_FCVT_D_WU 0xd2100053 -#define MASK_FCVT_D_WU 0xfff0007f -#define MATCH_FCVT_D_L 0xd2200053 -#define MASK_FCVT_D_L 0xfff0007f -#define MATCH_FCVT_D_LU 0xd2300053 -#define MASK_FCVT_D_LU 0xfff0007f -#define MATCH_FMV_D_X 0xf2000053 -#define MASK_FMV_D_X 0xfff0707f -#define MATCH_FLW 0x2007 -#define MASK_FLW 0x707f -#define MATCH_FLD 0x3007 -#define MASK_FLD 0x707f -#define MATCH_FSW 0x2027 -#define MASK_FSW 0x707f -#define MATCH_FSD 0x3027 -#define MASK_FSD 0x707f -#define MATCH_FMADD_S 0x43 -#define MASK_FMADD_S 0x600007f -#define MATCH_FMSUB_S 0x47 -#define MASK_FMSUB_S 0x600007f -#define MATCH_FNMSUB_S 0x4b -#define MASK_FNMSUB_S 0x600007f -#define MATCH_FNMADD_S 0x4f -#define MASK_FNMADD_S 0x600007f -#define MATCH_FMADD_D 0x2000043 -#define MASK_FMADD_D 0x600007f -#define MATCH_FMSUB_D 0x2000047 -#define MASK_FMSUB_D 0x600007f -#define MATCH_FNMSUB_D 0x200004b -#define MASK_FNMSUB_D 0x600007f -#define MATCH_FNMADD_D 0x200004f -#define MASK_FNMADD_D 0x600007f -#define MATCH_C_NOP 0x1 -#define MASK_C_NOP 0xffff -#define MATCH_C_ADDI16SP 0x6101 -#define MASK_C_ADDI16SP 0xef83 -#define MATCH_C_JR 0x8002 -#define MASK_C_JR 0xf07f -#define MATCH_C_JALR 0x9002 -#define MASK_C_JALR 0xf07f -#define MATCH_C_EBREAK 0x9002 -#define MASK_C_EBREAK 0xffff -#define MATCH_C_LD 0x6000 -#define MASK_C_LD 0xe003 -#define MATCH_C_SD 0xe000 -#define MASK_C_SD 0xe003 -#define MATCH_C_ADDIW 0x2001 -#define MASK_C_ADDIW 0xe003 -#define MATCH_C_LDSP 0x6002 -#define MASK_C_LDSP 0xe003 -#define MATCH_C_SDSP 0xe002 -#define MASK_C_SDSP 0xe003 -#define MATCH_C_ADDI4SPN 0x0 -#define MASK_C_ADDI4SPN 0xe003 -#define MATCH_C_FLD 0x2000 -#define MASK_C_FLD 0xe003 -#define MATCH_C_LW 0x4000 -#define MASK_C_LW 0xe003 -#define MATCH_C_FLW 0x6000 -#define MASK_C_FLW 0xe003 -#define MATCH_C_FSD 0xa000 -#define MASK_C_FSD 0xe003 -#define MATCH_C_SW 0xc000 -#define MASK_C_SW 0xe003 -#define MATCH_C_FSW 0xe000 -#define MASK_C_FSW 0xe003 -#define MATCH_C_ADDI 0x1 -#define MASK_C_ADDI 0xe003 -#define MATCH_C_JAL 0x2001 -#define MASK_C_JAL 0xe003 -#define MATCH_C_LI 0x4001 -#define MASK_C_LI 0xe003 -#define MATCH_C_LUI 0x6001 -#define MASK_C_LUI 0xe003 -#define MATCH_C_SRLI 0x8001 -#define MASK_C_SRLI 0xec03 -#define MATCH_C_SRAI 0x8401 -#define MASK_C_SRAI 0xec03 -#define MATCH_C_ANDI 0x8801 -#define MASK_C_ANDI 0xec03 -#define MATCH_C_SUB 0x8c01 -#define MASK_C_SUB 0xfc63 -#define MATCH_C_XOR 0x8c21 -#define MASK_C_XOR 0xfc63 -#define MATCH_C_OR 0x8c41 -#define MASK_C_OR 0xfc63 -#define MATCH_C_AND 0x8c61 -#define MASK_C_AND 0xfc63 -#define MATCH_C_SUBW 0x9c01 -#define MASK_C_SUBW 0xfc63 -#define MATCH_C_ADDW 0x9c21 -#define MASK_C_ADDW 0xfc63 -#define MATCH_C_J 0xa001 -#define MASK_C_J 0xe003 -#define MATCH_C_BEQZ 0xc001 -#define MASK_C_BEQZ 0xe003 -#define MATCH_C_BNEZ 0xe001 -#define MASK_C_BNEZ 0xe003 -#define MATCH_C_SLLI 0x2 -#define MASK_C_SLLI 0xe003 -#define MATCH_C_FLDSP 0x2002 -#define MASK_C_FLDSP 0xe003 -#define MATCH_C_LWSP 0x4002 -#define MASK_C_LWSP 0xe003 -#define MATCH_C_FLWSP 0x6002 -#define MASK_C_FLWSP 0xe003 -#define MATCH_C_MV 0x8002 -#define MASK_C_MV 0xf003 -#define MATCH_C_ADD 0x9002 -#define MASK_C_ADD 0xf003 -#define MATCH_C_FSDSP 0xa002 -#define MASK_C_FSDSP 0xe003 -#define MATCH_C_SWSP 0xc002 -#define MASK_C_SWSP 0xe003 -#define MATCH_C_FSWSP 0xe002 -#define MASK_C_FSWSP 0xe003 -#define MATCH_CUSTOM0 0xb -#define MASK_CUSTOM0 0x707f -#define MATCH_CUSTOM0_RS1 0x200b -#define MASK_CUSTOM0_RS1 0x707f -#define MATCH_CUSTOM0_RS1_RS2 0x300b -#define MASK_CUSTOM0_RS1_RS2 0x707f -#define MATCH_CUSTOM0_RD 0x400b -#define MASK_CUSTOM0_RD 0x707f -#define MATCH_CUSTOM0_RD_RS1 0x600b -#define MASK_CUSTOM0_RD_RS1 0x707f -#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b -#define MASK_CUSTOM0_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM1 0x2b -#define MASK_CUSTOM1 0x707f -#define MATCH_CUSTOM1_RS1 0x202b -#define MASK_CUSTOM1_RS1 0x707f -#define MATCH_CUSTOM1_RS1_RS2 0x302b -#define MASK_CUSTOM1_RS1_RS2 0x707f -#define MATCH_CUSTOM1_RD 0x402b -#define MASK_CUSTOM1_RD 0x707f -#define MATCH_CUSTOM1_RD_RS1 0x602b -#define MASK_CUSTOM1_RD_RS1 0x707f -#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b -#define MASK_CUSTOM1_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM2 0x5b -#define MASK_CUSTOM2 0x707f -#define MATCH_CUSTOM2_RS1 0x205b -#define MASK_CUSTOM2_RS1 0x707f -#define MATCH_CUSTOM2_RS1_RS2 0x305b -#define MASK_CUSTOM2_RS1_RS2 0x707f -#define MATCH_CUSTOM2_RD 0x405b -#define MASK_CUSTOM2_RD 0x707f -#define MATCH_CUSTOM2_RD_RS1 0x605b -#define MASK_CUSTOM2_RD_RS1 0x707f -#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b -#define MASK_CUSTOM2_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM3 0x7b -#define MASK_CUSTOM3 0x707f -#define MATCH_CUSTOM3_RS1 0x207b -#define MASK_CUSTOM3_RS1 0x707f -#define MATCH_CUSTOM3_RS1_RS2 0x307b -#define MASK_CUSTOM3_RS1_RS2 0x707f -#define MATCH_CUSTOM3_RD 0x407b -#define MASK_CUSTOM3_RD 0x707f -#define MATCH_CUSTOM3_RD_RS1 0x607b -#define MASK_CUSTOM3_RD_RS1 0x707f -#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b -#define MASK_CUSTOM3_RD_RS1_RS2 0x707f -#define CSR_FFLAGS 0x1 -#define CSR_FRM 0x2 -#define CSR_FCSR 0x3 -#define CSR_CYCLE 0xc00 -#define CSR_TIME 0xc01 -#define CSR_INSTRET 0xc02 -#define CSR_HPMCOUNTER3 0xc03 -#define CSR_HPMCOUNTER4 0xc04 -#define CSR_HPMCOUNTER5 0xc05 -#define CSR_HPMCOUNTER6 0xc06 -#define CSR_HPMCOUNTER7 0xc07 -#define CSR_HPMCOUNTER8 0xc08 -#define CSR_HPMCOUNTER9 0xc09 -#define CSR_HPMCOUNTER10 0xc0a -#define CSR_HPMCOUNTER11 0xc0b -#define CSR_HPMCOUNTER12 0xc0c -#define CSR_HPMCOUNTER13 0xc0d -#define CSR_HPMCOUNTER14 0xc0e -#define CSR_HPMCOUNTER15 0xc0f -#define CSR_HPMCOUNTER16 0xc10 -#define CSR_HPMCOUNTER17 0xc11 -#define CSR_HPMCOUNTER18 0xc12 -#define CSR_HPMCOUNTER19 0xc13 -#define CSR_HPMCOUNTER20 0xc14 -#define CSR_HPMCOUNTER21 0xc15 -#define CSR_HPMCOUNTER22 0xc16 -#define CSR_HPMCOUNTER23 0xc17 -#define CSR_HPMCOUNTER24 0xc18 -#define CSR_HPMCOUNTER25 0xc19 -#define CSR_HPMCOUNTER26 0xc1a -#define CSR_HPMCOUNTER27 0xc1b -#define CSR_HPMCOUNTER28 0xc1c -#define CSR_HPMCOUNTER29 0xc1d -#define CSR_HPMCOUNTER30 0xc1e -#define CSR_HPMCOUNTER31 0xc1f -#define CSR_SSTATUS 0x100 -#define CSR_SIE 0x104 -#define CSR_STVEC 0x105 -#define CSR_SSCRATCH 0x140 -#define CSR_SEPC 0x141 -#define CSR_SCAUSE 0x142 -#define CSR_SBADADDR 0x143 -#define CSR_SIP 0x144 -#define CSR_SPTBR 0x180 -#define CSR_MSTATUS 0x300 -#define CSR_MISA 0x301 -#define CSR_MEDELEG 0x302 -#define CSR_MIDELEG 0x303 -#define CSR_MIE 0x304 -#define CSR_MTVEC 0x305 -#define CSR_MSCRATCH 0x340 -#define CSR_MEPC 0x341 -#define CSR_MCAUSE 0x342 -#define CSR_MBADADDR 0x343 -#define CSR_MIP 0x344 -#define CSR_TSELECT 0x7a0 -#define CSR_TDATA1 0x7a1 -#define CSR_TDATA2 0x7a2 -#define CSR_TDATA3 0x7a3 -#define CSR_DCSR 0x7b0 -#define CSR_DPC 0x7b1 -#define CSR_DSCRATCH 0x7b2 -#define CSR_MCYCLE 0xb00 -#define CSR_MINSTRET 0xb02 -#define CSR_MHPMCOUNTER3 0xb03 -#define CSR_MHPMCOUNTER4 0xb04 -#define CSR_MHPMCOUNTER5 0xb05 -#define CSR_MHPMCOUNTER6 0xb06 -#define CSR_MHPMCOUNTER7 0xb07 -#define CSR_MHPMCOUNTER8 0xb08 -#define CSR_MHPMCOUNTER9 0xb09 -#define CSR_MHPMCOUNTER10 0xb0a -#define CSR_MHPMCOUNTER11 0xb0b -#define CSR_MHPMCOUNTER12 0xb0c -#define CSR_MHPMCOUNTER13 0xb0d -#define CSR_MHPMCOUNTER14 0xb0e -#define CSR_MHPMCOUNTER15 0xb0f -#define CSR_MHPMCOUNTER16 0xb10 -#define CSR_MHPMCOUNTER17 0xb11 -#define CSR_MHPMCOUNTER18 0xb12 -#define CSR_MHPMCOUNTER19 0xb13 -#define CSR_MHPMCOUNTER20 0xb14 -#define CSR_MHPMCOUNTER21 0xb15 -#define CSR_MHPMCOUNTER22 0xb16 -#define CSR_MHPMCOUNTER23 0xb17 -#define CSR_MHPMCOUNTER24 0xb18 -#define CSR_MHPMCOUNTER25 0xb19 -#define CSR_MHPMCOUNTER26 0xb1a -#define CSR_MHPMCOUNTER27 0xb1b -#define CSR_MHPMCOUNTER28 0xb1c -#define CSR_MHPMCOUNTER29 0xb1d -#define CSR_MHPMCOUNTER30 0xb1e -#define CSR_MHPMCOUNTER31 0xb1f -#define CSR_MUCOUNTEREN 0x320 -#define CSR_MSCOUNTEREN 0x321 -#define CSR_MHPMEVENT3 0x323 -#define CSR_MHPMEVENT4 0x324 -#define CSR_MHPMEVENT5 0x325 -#define CSR_MHPMEVENT6 0x326 -#define CSR_MHPMEVENT7 0x327 -#define CSR_MHPMEVENT8 0x328 -#define CSR_MHPMEVENT9 0x329 -#define CSR_MHPMEVENT10 0x32a -#define CSR_MHPMEVENT11 0x32b -#define CSR_MHPMEVENT12 0x32c -#define CSR_MHPMEVENT13 0x32d -#define CSR_MHPMEVENT14 0x32e -#define CSR_MHPMEVENT15 0x32f -#define CSR_MHPMEVENT16 0x330 -#define CSR_MHPMEVENT17 0x331 -#define CSR_MHPMEVENT18 0x332 -#define CSR_MHPMEVENT19 0x333 -#define CSR_MHPMEVENT20 0x334 -#define CSR_MHPMEVENT21 0x335 -#define CSR_MHPMEVENT22 0x336 -#define CSR_MHPMEVENT23 0x337 -#define CSR_MHPMEVENT24 0x338 -#define CSR_MHPMEVENT25 0x339 -#define CSR_MHPMEVENT26 0x33a -#define CSR_MHPMEVENT27 0x33b -#define CSR_MHPMEVENT28 0x33c -#define CSR_MHPMEVENT29 0x33d -#define CSR_MHPMEVENT30 0x33e -#define CSR_MHPMEVENT31 0x33f -#define CSR_MVENDORID 0xf11 -#define CSR_MARCHID 0xf12 -#define CSR_MIMPID 0xf13 -#define CSR_MHARTID 0xf14 -#define CSR_CYCLEH 0xc80 -#define CSR_TIMEH 0xc81 -#define CSR_INSTRETH 0xc82 -#define CSR_HPMCOUNTER3H 0xc83 -#define CSR_HPMCOUNTER4H 0xc84 -#define CSR_HPMCOUNTER5H 0xc85 -#define CSR_HPMCOUNTER6H 0xc86 -#define CSR_HPMCOUNTER7H 0xc87 -#define CSR_HPMCOUNTER8H 0xc88 -#define CSR_HPMCOUNTER9H 0xc89 -#define CSR_HPMCOUNTER10H 0xc8a -#define CSR_HPMCOUNTER11H 0xc8b -#define CSR_HPMCOUNTER12H 0xc8c -#define CSR_HPMCOUNTER13H 0xc8d -#define CSR_HPMCOUNTER14H 0xc8e -#define CSR_HPMCOUNTER15H 0xc8f -#define CSR_HPMCOUNTER16H 0xc90 -#define CSR_HPMCOUNTER17H 0xc91 -#define CSR_HPMCOUNTER18H 0xc92 -#define CSR_HPMCOUNTER19H 0xc93 -#define CSR_HPMCOUNTER20H 0xc94 -#define CSR_HPMCOUNTER21H 0xc95 -#define CSR_HPMCOUNTER22H 0xc96 -#define CSR_HPMCOUNTER23H 0xc97 -#define CSR_HPMCOUNTER24H 0xc98 -#define CSR_HPMCOUNTER25H 0xc99 -#define CSR_HPMCOUNTER26H 0xc9a -#define CSR_HPMCOUNTER27H 0xc9b -#define CSR_HPMCOUNTER28H 0xc9c -#define CSR_HPMCOUNTER29H 0xc9d -#define CSR_HPMCOUNTER30H 0xc9e -#define CSR_HPMCOUNTER31H 0xc9f -#define CSR_MCYCLEH 0xb80 -#define CSR_MINSTRETH 0xb82 -#define CSR_MHPMCOUNTER3H 0xb83 -#define CSR_MHPMCOUNTER4H 0xb84 -#define CSR_MHPMCOUNTER5H 0xb85 -#define CSR_MHPMCOUNTER6H 0xb86 -#define CSR_MHPMCOUNTER7H 0xb87 -#define CSR_MHPMCOUNTER8H 0xb88 -#define CSR_MHPMCOUNTER9H 0xb89 -#define CSR_MHPMCOUNTER10H 0xb8a -#define CSR_MHPMCOUNTER11H 0xb8b -#define CSR_MHPMCOUNTER12H 0xb8c -#define CSR_MHPMCOUNTER13H 0xb8d -#define CSR_MHPMCOUNTER14H 0xb8e -#define CSR_MHPMCOUNTER15H 0xb8f -#define CSR_MHPMCOUNTER16H 0xb90 -#define CSR_MHPMCOUNTER17H 0xb91 -#define CSR_MHPMCOUNTER18H 0xb92 -#define CSR_MHPMCOUNTER19H 0xb93 -#define CSR_MHPMCOUNTER20H 0xb94 -#define CSR_MHPMCOUNTER21H 0xb95 -#define CSR_MHPMCOUNTER22H 0xb96 -#define CSR_MHPMCOUNTER23H 0xb97 -#define CSR_MHPMCOUNTER24H 0xb98 -#define CSR_MHPMCOUNTER25H 0xb99 -#define CSR_MHPMCOUNTER26H 0xb9a -#define CSR_MHPMCOUNTER27H 0xb9b -#define CSR_MHPMCOUNTER28H 0xb9c -#define CSR_MHPMCOUNTER29H 0xb9d -#define CSR_MHPMCOUNTER30H 0xb9e -#define CSR_MHPMCOUNTER31H 0xb9f -#define CAUSE_MISALIGNED_FETCH 0x0 -#define CAUSE_FAULT_FETCH 0x1 -#define CAUSE_ILLEGAL_INSTRUCTION 0x2 -#define CAUSE_BREAKPOINT 0x3 -#define CAUSE_MISALIGNED_LOAD 0x4 -#define CAUSE_FAULT_LOAD 0x5 -#define CAUSE_MISALIGNED_STORE 0x6 -#define CAUSE_FAULT_STORE 0x7 -#define CAUSE_USER_ECALL 0x8 -#define CAUSE_SUPERVISOR_ECALL 0x9 -#define CAUSE_HYPERVISOR_ECALL 0xa -#define CAUSE_MACHINE_ECALL 0xb -#endif -#ifdef DECLARE_INSN -DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) -DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) -DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) -DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) -DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) -DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) -DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) -DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) -DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) -DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) -DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) -DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) -DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) -DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) -DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) -DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) -DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) -DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) -DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) -DECLARE_INSN(add, MATCH_ADD, MASK_ADD) -DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) -DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) -DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) -DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) -DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) -DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) -DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) -DECLARE_INSN(or, MATCH_OR, MASK_OR) -DECLARE_INSN(and, MATCH_AND, MASK_AND) -DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) -DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) -DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) -DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) -DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) -DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) -DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) -DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) -DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) -DECLARE_INSN(lb, MATCH_LB, MASK_LB) -DECLARE_INSN(lh, MATCH_LH, MASK_LH) -DECLARE_INSN(lw, MATCH_LW, MASK_LW) -DECLARE_INSN(ld, MATCH_LD, MASK_LD) -DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) -DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) -DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) -DECLARE_INSN(sb, MATCH_SB, MASK_SB) -DECLARE_INSN(sh, MATCH_SH, MASK_SH) -DECLARE_INSN(sw, MATCH_SW, MASK_SW) -DECLARE_INSN(sd, MATCH_SD, MASK_SD) -DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) -DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) -DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) -DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) -DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) -DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) -DECLARE_INSN(div, MATCH_DIV, MASK_DIV) -DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) -DECLARE_INSN(rem, MATCH_REM, MASK_REM) -DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) -DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) -DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) -DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) -DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) -DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) -DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) -DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) -DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) -DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) -DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) -DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) -DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) -DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) -DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) -DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) -DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) -DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) -DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) -DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) -DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) -DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) -DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) -DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) -DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) -DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) -DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) -DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) -DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) -DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) -DECLARE_INSN(uret, MATCH_URET, MASK_URET) -DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) -DECLARE_INSN(hret, MATCH_HRET, MASK_HRET) -DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) -DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) -DECLARE_INSN(sfence_vm, MATCH_SFENCE_VM, MASK_SFENCE_VM) -DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) -DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) -DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) -DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) -DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) -DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) -DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) -DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) -DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) -DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) -DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) -DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) -DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) -DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) -DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) -DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) -DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) -DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) -DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) -DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) -DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) -DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) -DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) -DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) -DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) -DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) -DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) -DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) -DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) -DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) -DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) -DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) -DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) -DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) -DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) -DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) -DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) -DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) -DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) -DECLARE_INSN(fmv_x_s, MATCH_FMV_X_S, MASK_FMV_X_S) -DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) -DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) -DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) -DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) -DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) -DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) -DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) -DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) -DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) -DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) -DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) -DECLARE_INSN(fmv_s_x, MATCH_FMV_S_X, MASK_FMV_S_X) -DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) -DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) -DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) -DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) -DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) -DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) -DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) -DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) -DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) -DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) -DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) -DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) -DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) -DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) -DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) -DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) -DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) -DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) -DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) -DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) -DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) -DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) -DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) -DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) -DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) -DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) -DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) -DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) -DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) -DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) -DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) -DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) -DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) -DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) -DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) -DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) -DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) -DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) -DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) -DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) -DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) -DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) -DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) -DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) -DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) -DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) -DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) -DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) -DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) -DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) -DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) -DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) -DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) -DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) -DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) -DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) -DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) -DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) -DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) -DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) -DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) -DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) -DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) -DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) -DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) -DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) -DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) -DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) -DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) -DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) -DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) -DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) -DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) -DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) -DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) -DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) -DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) -DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) -DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) -DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) -DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) -DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) -DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) -#endif -#ifdef DECLARE_CSR -DECLARE_CSR(fflags, CSR_FFLAGS) -DECLARE_CSR(frm, CSR_FRM) -DECLARE_CSR(fcsr, CSR_FCSR) -DECLARE_CSR(cycle, CSR_CYCLE) -DECLARE_CSR(time, CSR_TIME) -DECLARE_CSR(instret, CSR_INSTRET) -DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) -DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) -DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) -DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) -DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) -DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) -DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) -DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) -DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) -DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) -DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) -DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) -DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) -DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) -DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) -DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) -DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) -DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) -DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) -DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) -DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) -DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) -DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) -DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) -DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) -DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) -DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) -DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) -DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) -DECLARE_CSR(sstatus, CSR_SSTATUS) -DECLARE_CSR(sie, CSR_SIE) -DECLARE_CSR(stvec, CSR_STVEC) -DECLARE_CSR(sscratch, CSR_SSCRATCH) -DECLARE_CSR(sepc, CSR_SEPC) -DECLARE_CSR(scause, CSR_SCAUSE) -DECLARE_CSR(sbadaddr, CSR_SBADADDR) -DECLARE_CSR(sip, CSR_SIP) -DECLARE_CSR(sptbr, CSR_SPTBR) -DECLARE_CSR(mstatus, CSR_MSTATUS) -DECLARE_CSR(misa, CSR_MISA) -DECLARE_CSR(medeleg, CSR_MEDELEG) -DECLARE_CSR(mideleg, CSR_MIDELEG) -DECLARE_CSR(mie, CSR_MIE) -DECLARE_CSR(mtvec, CSR_MTVEC) -DECLARE_CSR(mscratch, CSR_MSCRATCH) -DECLARE_CSR(mepc, CSR_MEPC) -DECLARE_CSR(mcause, CSR_MCAUSE) -DECLARE_CSR(mbadaddr, CSR_MBADADDR) -DECLARE_CSR(mip, CSR_MIP) -DECLARE_CSR(tselect, CSR_TSELECT) -DECLARE_CSR(tdata1, CSR_TDATA1) -DECLARE_CSR(tdata2, CSR_TDATA2) -DECLARE_CSR(tdata3, CSR_TDATA3) -DECLARE_CSR(dcsr, CSR_DCSR) -DECLARE_CSR(dpc, CSR_DPC) -DECLARE_CSR(dscratch, CSR_DSCRATCH) -DECLARE_CSR(mcycle, CSR_MCYCLE) -DECLARE_CSR(minstret, CSR_MINSTRET) -DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) -DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) -DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) -DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) -DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) -DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) -DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) -DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) -DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) -DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) -DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) -DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) -DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) -DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) -DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) -DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) -DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) -DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) -DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) -DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) -DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) -DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) -DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) -DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) -DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) -DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) -DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) -DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) -DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) -DECLARE_CSR(mucounteren, CSR_MUCOUNTEREN) -DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN) -DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) -DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) -DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) -DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) -DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) -DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) -DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) -DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) -DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) -DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) -DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) -DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) -DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) -DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) -DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) -DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) -DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) -DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) -DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) -DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) -DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) -DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) -DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) -DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) -DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) -DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) -DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) -DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) -DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) -DECLARE_CSR(mvendorid, CSR_MVENDORID) -DECLARE_CSR(marchid, CSR_MARCHID) -DECLARE_CSR(mimpid, CSR_MIMPID) -DECLARE_CSR(mhartid, CSR_MHARTID) -DECLARE_CSR(cycleh, CSR_CYCLEH) -DECLARE_CSR(timeh, CSR_TIMEH) -DECLARE_CSR(instreth, CSR_INSTRETH) -DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) -DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) -DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) -DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) -DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) -DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) -DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) -DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) -DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) -DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) -DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) -DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) -DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) -DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) -DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) -DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) -DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) -DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) -DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) -DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) -DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) -DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) -DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) -DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) -DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) -DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) -DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) -DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) -DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) -DECLARE_CSR(mcycleh, CSR_MCYCLEH) -DECLARE_CSR(minstreth, CSR_MINSTRETH) -DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) -DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) -DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) -DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) -DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) -DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) -DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) -DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) -DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) -DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) -DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) -DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) -DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) -DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) -DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) -DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) -DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) -DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) -DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) -DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) -DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) -DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) -DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) -DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) -DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) -DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) -DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) -DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) -DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) -#endif -#ifdef DECLARE_CAUSE -DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) -DECLARE_CAUSE("fault fetch", CAUSE_FAULT_FETCH) -DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) -DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) -DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) -DECLARE_CAUSE("fault load", CAUSE_FAULT_LOAD) -DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) -DECLARE_CAUSE("fault store", CAUSE_FAULT_STORE) -DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) -DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) -DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) -DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) -#endif diff --git a/raven/bsp/env/entry.S b/raven/bsp/env/entry.S deleted file mode 100644 index 261b2a4..0000000 --- a/raven/bsp/env/entry.S +++ /dev/null @@ -1,98 +0,0 @@ -// See LICENSE for license details - -#ifndef ENTRY_S -#define ENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - - .section .text.entry - .align 2 - .weak trap_entry - .global trap_entry -trap_entry: - addi sp, sp, -32*REGBYTES - - STORE x1, 1*REGBYTES(sp) - STORE x2, 2*REGBYTES(sp) - STORE x3, 3*REGBYTES(sp) - STORE x4, 4*REGBYTES(sp) - STORE x5, 5*REGBYTES(sp) - STORE x6, 6*REGBYTES(sp) - STORE x7, 7*REGBYTES(sp) - STORE x8, 8*REGBYTES(sp) - STORE x9, 9*REGBYTES(sp) - STORE x10, 10*REGBYTES(sp) - STORE x11, 11*REGBYTES(sp) - STORE x12, 12*REGBYTES(sp) - STORE x13, 13*REGBYTES(sp) - STORE x14, 14*REGBYTES(sp) - STORE x15, 15*REGBYTES(sp) - STORE x16, 16*REGBYTES(sp) - STORE x17, 17*REGBYTES(sp) - STORE x18, 18*REGBYTES(sp) - STORE x19, 19*REGBYTES(sp) - STORE x20, 20*REGBYTES(sp) - STORE x21, 21*REGBYTES(sp) - STORE x22, 22*REGBYTES(sp) - STORE x23, 23*REGBYTES(sp) - STORE x24, 24*REGBYTES(sp) - STORE x25, 25*REGBYTES(sp) - STORE x26, 26*REGBYTES(sp) - STORE x27, 27*REGBYTES(sp) - STORE x28, 28*REGBYTES(sp) - STORE x29, 29*REGBYTES(sp) - STORE x30, 30*REGBYTES(sp) - STORE x31, 31*REGBYTES(sp) - - csrr a0, mcause - csrr a1, mepc - mv a2, sp - call handle_trap - csrw mepc, a0 - - # Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 1*REGBYTES(sp) - LOAD x2, 2*REGBYTES(sp) - LOAD x3, 3*REGBYTES(sp) - LOAD x4, 4*REGBYTES(sp) - LOAD x5, 5*REGBYTES(sp) - LOAD x6, 6*REGBYTES(sp) - LOAD x7, 7*REGBYTES(sp) - LOAD x8, 8*REGBYTES(sp) - LOAD x9, 9*REGBYTES(sp) - LOAD x10, 10*REGBYTES(sp) - LOAD x11, 11*REGBYTES(sp) - LOAD x12, 12*REGBYTES(sp) - LOAD x13, 13*REGBYTES(sp) - LOAD x14, 14*REGBYTES(sp) - LOAD x15, 15*REGBYTES(sp) - LOAD x16, 16*REGBYTES(sp) - LOAD x17, 17*REGBYTES(sp) - LOAD x18, 18*REGBYTES(sp) - LOAD x19, 19*REGBYTES(sp) - LOAD x20, 20*REGBYTES(sp) - LOAD x21, 21*REGBYTES(sp) - LOAD x22, 22*REGBYTES(sp) - LOAD x23, 23*REGBYTES(sp) - LOAD x24, 24*REGBYTES(sp) - LOAD x25, 25*REGBYTES(sp) - LOAD x26, 26*REGBYTES(sp) - LOAD x27, 27*REGBYTES(sp) - LOAD x28, 28*REGBYTES(sp) - LOAD x29, 29*REGBYTES(sp) - LOAD x30, 30*REGBYTES(sp) - LOAD x31, 31*REGBYTES(sp) - - addi sp, sp, 32*REGBYTES - mret - -.weak handle_trap -handle_trap: -1: - j 1b - -#endif diff --git a/raven/bsp/env/freedom-e300-arty/flash.lds b/raven/bsp/env/freedom-e300-arty/flash.lds deleted file mode 100644 index 6b37141..0000000 --- a/raven/bsp/env/freedom-e300-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/freedom-e300-arty/init.c b/raven/bsp/env/freedom-e300-arty/init.c deleted file mode 100644 index a6f4b39..0000000 --- a/raven/bsp/env/freedom-e300-arty/init.c +++ /dev/null @@ -1,87 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long get_cpu_freq() -{ - return 65000000; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - #endif -} - -void _fini() -{ -} diff --git a/raven/bsp/env/freedom-e300-arty/openocd.cfg b/raven/bsp/env/freedom-e300-arty/openocd.cfg deleted file mode 100644 index f4b28ed..0000000 --- a/raven/bsp/env/freedom-e300-arty/openocd.cfg +++ /dev/null @@ -1,30 +0,0 @@ -adapter_khz 10000 - -#source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg] - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 -# - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off diff --git a/raven/bsp/env/freedom-e300-arty/platform.h b/raven/bsp/env/freedom-e300-arty/platform.h deleted file mode 100644 index 8ff7ae6..0000000 --- a/raven/bsp/env/freedom-e300-arty/platform.h +++ /dev/null @@ -1,124 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define AON_CTRL_ADDR _AC(0x10000000,UL) -#define GPIO_CTRL_ADDR _AC(0x10012000,UL) -#define UART0_CTRL_ADDR _AC(0x10013000,UL) -#define SPI0_CTRL_ADDR _AC(0x10014000,UL) -#define PWM0_CTRL_ADDR _AC(0x10015000,UL) -#define UART1_CTRL_ADDR _AC(0x10023000,UL) -#define SPI1_CTRL_ADDR _AC(0x10024000,UL) -#define PWM1_CTRL_ADDR _AC(0x10025000,UL) -#define SPI2_CTRL_ADDR _AC(0x10034000,UL) -#define PWM2_CTRL_ADDR _AC(0x10035000,UL) -#define SPI0_MMAP_ADDR _AC(0x20000000,UL) -#define MEM_CTRL_ADDR _AC(0x80000000,UL) - -// IOF Mappings -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt Numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_CTRL_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_CTRL_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_CTRL_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_CTRL_ADDR, offset) - -// Misc - -#include - - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS -#include "hifive1.h" - -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/raven/bsp/env/freedom-e300-arty/settings.mk b/raven/bsp/env/freedom-e300-arty/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/raven/bsp/env/freedom-e300-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/raven/bsp/env/freedom-e300-hifive1/dhrystone.lds b/raven/bsp/env/freedom-e300-hifive1/dhrystone.lds deleted file mode 100644 index cc9cd9b..0000000 --- a/raven/bsp/env/freedom-e300-hifive1/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/freedom-e300-hifive1/flash.lds b/raven/bsp/env/freedom-e300-hifive1/flash.lds deleted file mode 100644 index 6b37141..0000000 --- a/raven/bsp/env/freedom-e300-hifive1/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven/bsp/env/freedom-e300-hifive1/init.c b/raven/bsp/env/freedom-e300-hifive1/init.c deleted file mode 100644 index 621a6e2..0000000 --- a/raven/bsp/env/freedom-e300-hifive1/init.c +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long mtime_lo(void) -{ - return *(volatile unsigned long *)(CLINT_CTRL_ADDR + CLINT_MTIME); -} - -#ifdef __riscv32 - -static uint32_t mtime_hi(void) -{ - return *(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIME + 4); -} - -uint64_t get_timer_value() -{ - while (1) { - uint32_t hi = mtime_hi(); - uint32_t lo = mtime_lo(); - if (hi == mtime_hi()) - return ((uint64_t)hi << 32) | lo; - } -} - -#else /* __riscv32 */ - -uint64_t get_timer_value() -{ - return mtime_lo(); -} - -#endif - -unsigned long get_timer_freq() -{ - return 32768; -} - -static void use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0) ; - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -static void use_pll(int refsel, int bypass, int r, int f, int q) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if available. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - // In case we are executing from QSPI, - // (which is quite likely) we need to - // set the QSPI clock divider appropriately - // before boosting the clock frequency. - - // Div = f_sck/2 - SPI0_REG(SPI_REG_SCKDIV) = 8; - - // Set DIV Settings for PLL - // Both HFROSC and HFXOSC are modeled as ideal - // 16MHz sources (assuming dividers are set properly for - // HFROSC). - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = mtime_lo(); - while (mtime_lo() - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0) ; - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); -} - -static void use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - use_hfrosc(4, 16); -} - -static unsigned long __attribute__((noinline)) measure_cpu_freq(size_t n) -{ - unsigned long start_mtime, delta_mtime; - unsigned long mtime_freq = get_timer_freq(); - - // Don't start measuruing until we see an mtime tick - unsigned long tmp = mtime_lo(); - do { - start_mtime = mtime_lo(); - } while (start_mtime == tmp); - - unsigned long start_mcycle = read_csr(mcycle); - - do { - delta_mtime = mtime_lo() - start_mtime; - } while (delta_mtime < n); - - unsigned long delta_mcycle = read_csr(mcycle) - start_mcycle; - - return (delta_mcycle / delta_mtime) * mtime_freq - + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; -} - -unsigned long get_cpu_freq() -{ - static uint32_t cpu_freq; - - if (!cpu_freq) { - // warm up I$ - measure_cpu_freq(1); - // measure for real - cpu_freq = measure_cpu_freq(10); - } - - return cpu_freq; -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "trap\n", 5); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - - #ifndef NO_INIT - use_default_clocks(); - use_pll(0, 0, 1, 31, 1); - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } - #endif - -} - -void _fini() -{ -} diff --git a/raven/bsp/env/freedom-e300-hifive1/openocd.cfg b/raven/bsp/env/freedom-e300-hifive1/openocd.cfg deleted file mode 100644 index b531e9c..0000000 --- a/raven/bsp/env/freedom-e300-hifive1/openocd.cfg +++ /dev/null @@ -1,34 +0,0 @@ -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Dual RS232-HS" -ftdi_vid_pid 0x0403 0x6010 - -ftdi_layout_init 0x0008 0x001b -ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 - -#Reset Stretcher logic on FE310 is ~1 second long -#This doesn't apply if you use -# ftdi_set_signal, but still good to document -#adapter_nsrst_delay 1500 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -- This type of reset is not implemented yet -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z - #Wait for the reset stretcher - #It will work without this, but - #will incur lots of delays for later commands. - sleep 1500 -} -halt -#flash protect 0 64 last off diff --git a/raven/bsp/env/freedom-e300-hifive1/platform.h b/raven/bsp/env/freedom-e300-hifive1/platform.h deleted file mode 100644 index 806fcfc..0000000 --- a/raven/bsp/env/freedom-e300-hifive1/platform.h +++ /dev/null @@ -1,133 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/otp.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/prci.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define MASKROM_MEM_ADDR _AC(0x00001000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define OTP_MEM_ADDR _AC(0x00020000,UL) -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define AON_CTRL_ADDR _AC(0x10000000,UL) -#define PRCI_CTRL_ADDR _AC(0x10008000,UL) -#define OTP_CTRL_ADDR _AC(0x10010000,UL) -#define GPIO_CTRL_ADDR _AC(0x10012000,UL) -#define UART0_CTRL_ADDR _AC(0x10013000,UL) -#define SPI0_CTRL_ADDR _AC(0x10014000,UL) -#define PWM0_CTRL_ADDR _AC(0x10015000,UL) -#define UART1_CTRL_ADDR _AC(0x10023000,UL) -#define SPI1_CTRL_ADDR _AC(0x10024000,UL) -#define PWM1_CTRL_ADDR _AC(0x10025000,UL) -#define SPI2_CTRL_ADDR _AC(0x10034000,UL) -#define PWM2_CTRL_ADDR _AC(0x10035000,UL) -#define SPI0_MEM_ADDR _AC(0x20000000,UL) -#define MEM_CTRL_ADDR _AC(0x80000000,UL) - -// IOF masks -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -//#define IOF0_I2C_MASK _AC(0x00003000,UL) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_CTRL_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PRCI_REG(offset) _REG32(PRCI_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_CTRL_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_CTRL_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_CTRL_ADDR, offset) - -// Misc - -#include - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#include "hifive1.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/raven/bsp/env/freedom-e300-hifive1/settings.mk b/raven/bsp/env/freedom-e300-hifive1/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/raven/bsp/env/freedom-e300-hifive1/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/raven/bsp/env/hifive1.h b/raven/bsp/env/hifive1.h deleted file mode 100644 index 0db2f0f..0000000 --- a/raven/bsp/env/hifive1.h +++ /dev/null @@ -1,81 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_HIFIVE1_H -#define _SIFIVE_HIFIVE1_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the RGB LED on HiFive1 Board. -// These are also mapped to RGB LEDs on the Freedom E300 Arty -// FPGA -// Dev Kit. - -#define RED_LED_OFFSET 22 -#define GREEN_LED_OFFSET 19 -#define BLUE_LED_OFFSET 21 - -// These are the GPIO bit offsets for the differen digital pins -// on the headers for both the HiFive1 Board and the Freedom E300 Arty FPGA Dev Kit. -#define PIN_0_OFFSET 16 -#define PIN_1_OFFSET 17 -#define PIN_2_OFFSET 18 -#define PIN_3_OFFSET 19 -#define PIN_4_OFFSET 20 -#define PIN_5_OFFSET 21 -#define PIN_6_OFFSET 22 -#define PIN_7_OFFSET 23 -#define PIN_8_OFFSET 0 -#define PIN_9_OFFSET 1 -#define PIN_10_OFFSET 2 -#define PIN_11_OFFSET 3 -#define PIN_12_OFFSET 4 -#define PIN_13_OFFSET 5 -//#define PIN_14_OFFSET 8 //This pin is not connected on either board. -#define PIN_15_OFFSET 9 -#define PIN_16_OFFSET 10 -#define PIN_17_OFFSET 11 -#define PIN_18_OFFSET 12 -#define PIN_19_OFFSET 13 - -// These are *PIN* numbers, not -// GPIO Offset Numbers. -#define PIN_SPI1_SCK (13u) -#define PIN_SPI1_MISO (12u) -#define PIN_SPI1_MOSI (11u) -#define PIN_SPI1_SS0 (10u) -#define PIN_SPI1_SS1 (14u) -#define PIN_SPI1_SS2 (15u) -#define PIN_SPI1_SS3 (16u) - -#define SS_PIN_TO_CS_ID(x) \ - ((x==PIN_SPI1_SS0 ? 0 : \ - (x==PIN_SPI1_SS1 ? 1 : \ - (x==PIN_SPI1_SS2 ? 2 : \ - (x==PIN_SPI1_SS3 ? 3 : \ - -1))))) - - -// These buttons are present only on the Freedom E300 Arty Dev Kit. -#ifdef HAS_BOARD_BUTTONS -#define BUTTON_0_OFFSET 15 -#define BUTTON_1_OFFSET 30 -#define BUTTON_2_OFFSET 31 - -#define INT_DEVICE_BUTTON_0 (INT_GPIO_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (INT_GPIO_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (INT_GPIO_BASE + BUTTON_2_OFFSET) - -#endif - -#define HAS_HFXOSC 1 -#define HAS_LFROSC_BYPASS 1 - -#define RTC_FREQ 32768 - -void write_hex(int fd, unsigned long int hex); - -#endif /* _SIFIVE_HIFIVE1_H */ diff --git a/raven/bsp/env/start.S b/raven/bsp/env/start.S deleted file mode 100644 index 4e9f665..0000000 --- a/raven/bsp/env/start.S +++ /dev/null @@ -1,111 +0,0 @@ -// See LICENSE for license details. -#include - -/* This is defined in sifive/platform.h, but that can't be included from - * assembly. */ -#define CLINT_CTRL_ADDR 0x02000000 - - .section .init - .globl _start - .type _start,@function - -_start: - .cfi_startproc - .cfi_undefined ra -.option push -.option norelax - la gp, __global_pointer$ -.option pop - la sp, _sp - -#if defined(ENABLE_SMP) - smp_pause(t0, t1) -#endif - - /* Load data section */ - la a0, _data_lma - la a1, _data - la a2, _edata - bgeu a1, a2, 2f -1: - lw t0, (a0) - sw t0, (a1) - addi a0, a0, 4 - addi a1, a1, 4 - bltu a1, a2, 1b -2: - - /* Clear bss section */ - la a0, __bss_start - la a1, _end - bgeu a0, a1, 2f -1: - sw zero, (a0) - addi a0, a0, 4 - bltu a0, a1, 1b -2: - - /* Call global constructors */ - la a0, __libc_fini_array - call atexit - call __libc_init_array - -#ifndef __riscv_float_abi_soft - /* Enable FPU */ - li t0, MSTATUS_FS - csrs mstatus, t0 - csrr t1, mstatus - and t1, t1, t0 - beqz t1, 1f - fssr x0 -1: -#endif - -#if defined(ENABLE_SMP) - smp_resume(t0, t1) - - csrr a0, mhartid - bnez a0, 2f -#endif - - auipc ra, 0 - addi sp, sp, -16 -#if __riscv_xlen == 32 - sw ra, 8(sp) -#else - sd ra, 8(sp) -#endif - - /* argc = argv = 0 */ - li a0, 0 - li a1, 0 - call main - tail exit -1: - j 1b - -#if defined(ENABLE_SMP) -2: - la t0, trap_entry - csrw mtvec, t0 - - csrr a0, mhartid - la t1, _sp - slli t0, a0, 10 - sub sp, t1, t0 - - auipc ra, 0 - addi sp, sp, -16 -#if __riscv_xlen == 32 - sw ra, 8(sp) -#else - sd ra, 8(sp) -#endif - - call secondary_main - tail exit - -1: - j 1b -#endif - .cfi_endproc diff --git a/raven/bsp/env/ventry.S b/raven/bsp/env/ventry.S deleted file mode 100644 index 5c82c48..0000000 --- a/raven/bsp/env/ventry.S +++ /dev/null @@ -1,288 +0,0 @@ -// See LICENSE for license details - -#ifndef VENTRY_S -#define VENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - -#only save caller registers -.macro TRAP_ENTRY - addi sp, sp, -16*REGBYTES - - STORE x1, 0*REGBYTES(sp) - STORE x5, 1*REGBYTES(sp) - STORE x6, 2*REGBYTES(sp) - STORE x7, 3*REGBYTES(sp) - STORE x10, 4*REGBYTES(sp) - STORE x11, 5*REGBYTES(sp) - STORE x12, 6*REGBYTES(sp) - STORE x13, 7*REGBYTES(sp) - STORE x14, 8*REGBYTES(sp) - STORE x15, 9*REGBYTES(sp) - STORE x16, 10*REGBYTES(sp) - STORE x17, 11*REGBYTES(sp) - STORE x28, 12*REGBYTES(sp) - STORE x29, 13*REGBYTES(sp) - STORE x30, 14*REGBYTES(sp) - STORE x31, 15*REGBYTES(sp) -.endm - -#restore caller registers -.macro TRAP_EXIT -# Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 0*REGBYTES(sp) - LOAD x5, 1*REGBYTES(sp) - LOAD x6, 2*REGBYTES(sp) - LOAD x7, 3*REGBYTES(sp) - LOAD x10, 4*REGBYTES(sp) - LOAD x11, 5*REGBYTES(sp) - LOAD x12, 6*REGBYTES(sp) - LOAD x13, 7*REGBYTES(sp) - LOAD x14, 8*REGBYTES(sp) - LOAD x15, 9*REGBYTES(sp) - LOAD x16, 10*REGBYTES(sp) - LOAD x17, 11*REGBYTES(sp) - LOAD x28, 12*REGBYTES(sp) - LOAD x29, 13*REGBYTES(sp) - LOAD x30, 14*REGBYTES(sp) - LOAD x31, 15*REGBYTES(sp) - - addi sp, sp, 16*REGBYTES - mret -.endm - - - -#Vector table for E31/E51 - - .section .text.entry - .align 8 - .global vtrap_entry -vtrap_entry: - j sync_trap - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmsi_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmti_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmei_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vlip_Handler0 - .align 2 - j vlip_Handler1 - .align 2 - j vlip_Handler2 - .align 2 - j vlip_Handler3 - .align 2 - j vlip_Handler4 - .align 2 - j vlip_Handler5 - .align 2 - j vlip_Handler6 - .align 2 - j vlip_Handler7 - .align 2 - j vlip_Handler8 - .align 2 - j vlip_Handler9 - .align 2 - j vlip_Handler10 - .align 2 - j vlip_Handler11 - .align 2 - j vlip_Handler12 - .align 2 - j vlip_Handler13 - .align 2 - j vlip_Handler14 - .align 2 - j vlip_Handler15 - -#synchronous trap -sync_trap: - TRAP_ENTRY - jal handle_sync_trap - TRAP_EXIT - -#Machine Software Interrupt -vmsi_Handler: - TRAP_ENTRY - jal reserved - TRAP_EXIT - -#Machine Timer Interrupt -vmti_Handler: - TRAP_ENTRY - jal handle_m_time_interrupt - TRAP_EXIT - -#Machine External Interrupt -vmei_Handler: - TRAP_ENTRY - jal handle_m_external_interrupt - TRAP_EXIT - -#LIP0 -vlip_Handler0: - TRAP_ENTRY - jal handle_local_interrupt0 - TRAP_EXIT - -#LIP1 -vlip_Handler1: - TRAP_ENTRY - jal handle_local_interrupt1 - TRAP_EXIT - -#LIP2 -vlip_Handler2: - TRAP_ENTRY - jal handle_local_interrupt2 - TRAP_EXIT - -#LIP3 -vlip_Handler3: - TRAP_ENTRY - jal handle_local_interrupt3 - TRAP_EXIT - -#LIP4 -vlip_Handler4: - TRAP_ENTRY - jal handle_local_interrupt4 - TRAP_EXIT - -#LIP5 -vlip_Handler5: - TRAP_ENTRY - jal handle_local_interrupt5 - TRAP_EXIT - -#LIP6 -vlip_Handler6: - TRAP_ENTRY - jal handle_local_interrupt6 - TRAP_EXIT - -#LIP7 -vlip_Handler7: - TRAP_ENTRY - jal handle_local_interrupt7 - TRAP_EXIT - -#LIP8 -vlip_Handler8: - TRAP_ENTRY - jal handle_local_interrupt8 - TRAP_EXIT - -#LIP9 -vlip_Handler9: - TRAP_ENTRY - jal handle_local_interrupt9 - TRAP_EXIT - -#LIP10 -vlip_Handler10: - TRAP_ENTRY - jal handle_local_interrupt10 - TRAP_EXIT - -#LIP11 -vlip_Handler11: - TRAP_ENTRY - jal handle_local_interrupt11 - TRAP_EXIT - -#LIP12 -vlip_Handler12: - TRAP_ENTRY - jal handle_local_interrupt12 - TRAP_EXIT - -#LIP13 -vlip_Handler13: - TRAP_ENTRY - jal handle_local_interrupt13 - TRAP_EXIT - -#LIP14 -vlip_Handler14: - TRAP_ENTRY - jal handle_local_interrupt14 - TRAP_EXIT - -#LIP15 -vlip_Handler15: - TRAP_ENTRY - jal handle_local_interrupt15 - TRAP_EXIT - -#unimplemented ISRs trap here -.weak reserved -reserved: -.weak handle_local_interrupt0 -handle_local_interrupt0: -.weak handle_local_interrupt1 -handle_local_interrupt1: -.weak handle_local_interrupt2 -handle_local_interrupt2: -.weak handle_local_interrupt3 -handle_local_interrupt3: -.weak handle_local_interrupt4 -handle_local_interrupt4: -.weak handle_local_interrupt5 -handle_local_interrupt5: -.weak handle_local_interrupt6 -handle_local_interrupt6: -.weak handle_local_interrupt7 -handle_local_interrupt7: -.weak handle_local_interrupt8 -handle_local_interrupt8: -.weak handle_local_interrupt9 -handle_local_interrupt9: -.weak handle_local_interrupt10 -handle_local_interrupt10: -.weak handle_local_interrupt11 -handle_local_interrupt11: -.weak handle_local_interrupt12 -handle_local_interrupt12: -.weak handle_local_interrupt13 -handle_local_interrupt13: -.weak handle_local_interrupt14 -handle_local_interrupt14: -.weak handle_local_interrupt15 -handle_local_interrupt15: -1: - j 1b - -#endif diff --git a/raven/bsp/include/sifive/bits.h b/raven/bsp/include/sifive/bits.h deleted file mode 100644 index bfe656f..0000000 --- a/raven/bsp/include/sifive/bits.h +++ /dev/null @@ -1,36 +0,0 @@ -// See LICENSE for license details. -#ifndef _RISCV_BITS_H -#define _RISCV_BITS_H - -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) - -#define ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b)) -#define ROUNDDOWN(a, b) ((a)/(b)*(b)) - -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define CLAMP(a, lo, hi) MIN(MAX(a, lo), hi) - -#define EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1))) -#define INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1)))) - -#define STR(x) XSTR(x) -#define XSTR(x) #x - -#if __riscv_xlen == 64 -# define SLL32 sllw -# define STORE sd -# define LOAD ld -# define LWU lwu -# define LOG_REGBYTES 3 -#else -# define SLL32 sll -# define STORE sw -# define LOAD lw -# define LWU lw -# define LOG_REGBYTES 2 -#endif -#define REGBYTES (1 << LOG_REGBYTES) - -#endif diff --git a/raven/bsp/include/sifive/const.h b/raven/bsp/include/sifive/const.h deleted file mode 100644 index 8dcffbb..0000000 --- a/raven/bsp/include/sifive/const.h +++ /dev/null @@ -1,18 +0,0 @@ -// See LICENSE for license details. -/* Derived from */ - -#ifndef _SIFIVE_CONST_H -#define _SIFIVE_CONST_H - -#ifdef __ASSEMBLER__ -#define _AC(X,Y) X -#define _AT(T,X) X -#else -#define _AC(X,Y) (X##Y) -#define _AT(T,X) ((T)(X)) -#endif /* !__ASSEMBLER__*/ - -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) - -#endif /* _SIFIVE_CONST_H */ diff --git a/raven/bsp/include/sifive/devices/aon.h b/raven/bsp/include/sifive/devices/aon.h deleted file mode 100644 index 63f1db3..0000000 --- a/raven/bsp/include/sifive/devices/aon.h +++ /dev/null @@ -1,88 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_AON_H -#define _SIFIVE_AON_H - -/* Register offsets */ - -#define AON_WDOGCFG 0x000 -#define AON_WDOGCOUNT 0x008 -#define AON_WDOGS 0x010 -#define AON_WDOGFEED 0x018 -#define AON_WDOGKEY 0x01C -#define AON_WDOGCMP 0x020 - -#define AON_RTCCFG 0x040 -#define AON_RTCLO 0x048 -#define AON_RTCHI 0x04C -#define AON_RTCS 0x050 -#define AON_RTCCMP 0x060 - -#define AON_BACKUP0 0x080 -#define AON_BACKUP1 0x084 -#define AON_BACKUP2 0x088 -#define AON_BACKUP3 0x08C -#define AON_BACKUP4 0x090 -#define AON_BACKUP5 0x094 -#define AON_BACKUP6 0x098 -#define AON_BACKUP7 0x09C -#define AON_BACKUP8 0x0A0 -#define AON_BACKUP9 0x0A4 -#define AON_BACKUP10 0x0A8 -#define AON_BACKUP11 0x0AC -#define AON_BACKUP12 0x0B0 -#define AON_BACKUP13 0x0B4 -#define AON_BACKUP14 0x0B8 -#define AON_BACKUP15 0x0BC - -#define AON_PMUWAKEUPI0 0x100 -#define AON_PMUWAKEUPI1 0x104 -#define AON_PMUWAKEUPI2 0x108 -#define AON_PMUWAKEUPI3 0x10C -#define AON_PMUWAKEUPI4 0x110 -#define AON_PMUWAKEUPI5 0x114 -#define AON_PMUWAKEUPI6 0x118 -#define AON_PMUWAKEUPI7 0x11C -#define AON_PMUSLEEPI0 0x120 -#define AON_PMUSLEEPI1 0x124 -#define AON_PMUSLEEPI2 0x128 -#define AON_PMUSLEEPI3 0x12C -#define AON_PMUSLEEPI4 0x130 -#define AON_PMUSLEEPI5 0x134 -#define AON_PMUSLEEPI6 0x138 -#define AON_PMUSLEEPI7 0x13C -#define AON_PMUIE 0x140 -#define AON_PMUCAUSE 0x144 -#define AON_PMUSLEEP 0x148 -#define AON_PMUKEY 0x14C - -#define AON_LFROSC 0x070 -/* Constants */ - -#define AON_WDOGKEY_VALUE 0x51F15E -#define AON_WDOGFEED_VALUE 0xD09F00D - -#define AON_WDOGCFG_SCALE 0x0000000F -#define AON_WDOGCFG_RSTEN 0x00000100 -#define AON_WDOGCFG_ZEROCMP 0x00000200 -#define AON_WDOGCFG_ENALWAYS 0x00001000 -#define AON_WDOGCFG_ENCOREAWAKE 0x00002000 -#define AON_WDOGCFG_CMPIP 0x10000000 - -#define AON_RTCCFG_SCALE 0x0000000F -#define AON_RTCCFG_ENALWAYS 0x00001000 -#define AON_RTCCFG_CMPIP 0x10000000 - -#define AON_WAKEUPCAUSE_RESET 0x00 -#define AON_WAKEUPCAUSE_RTC 0x01 -#define AON_WAKEUPCAUSE_DWAKEUP 0x02 -#define AON_WAKEUPCAUSE_AWAKEUP 0x03 - -#define AON_RESETCAUSE_POWERON 0x0000 -#define AON_RESETCAUSE_EXTERNAL 0x0100 -#define AON_RESETCAUSE_WATCHDOG 0x0200 - -#define AON_PMUCAUSE_WAKEUPCAUSE 0x00FF -#define AON_PMUCAUSE_RESETCAUSE 0xFF00 - -#endif /* _SIFIVE_AON_H */ diff --git a/raven/bsp/include/sifive/devices/clic.h b/raven/bsp/include/sifive/devices/clic.h deleted file mode 100644 index e8dc2df..0000000 --- a/raven/bsp/include/sifive/devices/clic.h +++ /dev/null @@ -1,30 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_CLIC_H -#define _SIFIVE_CLIC_H - -#define CLIC_HART0 0x00800000 -#define CLIC_MSIP 0x0000 -#define CLIC_MSIP_size 0x4 -#define CLIC_MTIMECMP 0x4000 -#define CLIC_MTIMECMP_size 0x8 -#define CLIC_MTIME 0xBFF8 -#define CLIC_MTIME_size 0x8 - -#define CLIC_INTIP 0x000 -#define CLIC_INTIE 0x400 -#define CLIC_INTCFG 0x800 -#define CLIC_CFG 0xc00 - -// These interrupt IDs are consistent across old and new mtvec modes -#define SSIPID 1 -#define MSIPID 3 -#define STIPID 5 -#define MTIPID 7 -#define SEIPID 9 -#define MEIPID 11 -#define CSIPID 12 -#define LOCALINTIDBASE 16 - - -#endif /* _SIFIVE_CLIC_H */ diff --git a/raven/bsp/include/sifive/devices/clint.h b/raven/bsp/include/sifive/devices/clint.h deleted file mode 100644 index cd3e0c7..0000000 --- a/raven/bsp/include/sifive/devices/clint.h +++ /dev/null @@ -1,14 +0,0 @@ -// See LICENSE for license details - -#ifndef _SIFIVE_CLINT_H -#define _SIFIVE_CLINT_H - - -#define CLINT_MSIP 0x0000 -#define CLINT_MSIP_size 0x4 -#define CLINT_MTIMECMP 0x4000 -#define CLINT_MTIMECMP_size 0x8 -#define CLINT_MTIME 0xBFF8 -#define CLINT_MTIME_size 0x8 - -#endif /* _SIFIVE_CLINT_H */ diff --git a/raven/bsp/include/sifive/devices/gpio.h b/raven/bsp/include/sifive/devices/gpio.h deleted file mode 100644 index f7f0acb..0000000 --- a/raven/bsp/include/sifive/devices/gpio.h +++ /dev/null @@ -1,24 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_GPIO_H -#define _SIFIVE_GPIO_H - -#define GPIO_INPUT_VAL (0x00) -#define GPIO_INPUT_EN (0x04) -#define GPIO_OUTPUT_EN (0x08) -#define GPIO_OUTPUT_VAL (0x0C) -#define GPIO_PULLUP_EN (0x10) -#define GPIO_DRIVE (0x14) -#define GPIO_RISE_IE (0x18) -#define GPIO_RISE_IP (0x1C) -#define GPIO_FALL_IE (0x20) -#define GPIO_FALL_IP (0x24) -#define GPIO_HIGH_IE (0x28) -#define GPIO_HIGH_IP (0x2C) -#define GPIO_LOW_IE (0x30) -#define GPIO_LOW_IP (0x34) -#define GPIO_IOF_EN (0x38) -#define GPIO_IOF_SEL (0x3C) -#define GPIO_OUTPUT_XOR (0x40) - -#endif /* _SIFIVE_GPIO_H */ diff --git a/raven/bsp/include/sifive/devices/otp.h b/raven/bsp/include/sifive/devices/otp.h deleted file mode 100644 index 93833e2..0000000 --- a/raven/bsp/include/sifive/devices/otp.h +++ /dev/null @@ -1,23 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_OTP_H -#define _SIFIVE_OTP_H - -/* Register offsets */ - -#define OTP_LOCK 0x00 -#define OTP_CK 0x04 -#define OTP_OE 0x08 -#define OTP_SEL 0x0C -#define OTP_WE 0x10 -#define OTP_MR 0x14 -#define OTP_MRR 0x18 -#define OTP_MPP 0x1C -#define OTP_VRREN 0x20 -#define OTP_VPPEN 0x24 -#define OTP_A 0x28 -#define OTP_D 0x2C -#define OTP_Q 0x30 -#define OTP_READ_TIMINGS 0x34 - -#endif diff --git a/raven/bsp/include/sifive/devices/plic.h b/raven/bsp/include/sifive/devices/plic.h deleted file mode 100644 index e1ca5d6..0000000 --- a/raven/bsp/include/sifive/devices/plic.h +++ /dev/null @@ -1,31 +0,0 @@ -// See LICENSE for license details. - -#ifndef PLIC_H -#define PLIC_H - -#include - -// 32 bits per source -#define PLIC_PRIORITY_OFFSET _AC(0x0000,UL) -#define PLIC_PRIORITY_SHIFT_PER_SOURCE 2 -// 1 bit per source (1 address) -#define PLIC_PENDING_OFFSET _AC(0x1000,UL) -#define PLIC_PENDING_SHIFT_PER_SOURCE 0 - -//0x80 per target -#define PLIC_ENABLE_OFFSET _AC(0x2000,UL) -#define PLIC_ENABLE_SHIFT_PER_TARGET 7 - - -#define PLIC_THRESHOLD_OFFSET _AC(0x200000,UL) -#define PLIC_CLAIM_OFFSET _AC(0x200004,UL) -#define PLIC_THRESHOLD_SHIFT_PER_TARGET 12 -#define PLIC_CLAIM_SHIFT_PER_TARGET 12 - -#define PLIC_MAX_SOURCE 1023 -#define PLIC_SOURCE_MASK 0x3FF - -#define PLIC_MAX_TARGET 15871 -#define PLIC_TARGET_MASK 0x3FFF - -#endif /* PLIC_H */ diff --git a/raven/bsp/include/sifive/devices/prci.h b/raven/bsp/include/sifive/devices/prci.h deleted file mode 100644 index 1a3de58..0000000 --- a/raven/bsp/include/sifive/devices/prci.h +++ /dev/null @@ -1,56 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PRCI_H -#define _SIFIVE_PRCI_H - -/* Register offsets */ - -#define PRCI_HFROSCCFG (0x0000) -#define PRCI_HFXOSCCFG (0x0004) -#define PRCI_PLLCFG (0x0008) -#define PRCI_PLLDIV (0x000C) -#define PRCI_PROCMONCFG (0x00F0) - -/* Fields */ -#define ROSC_DIV(x) (((x) & 0x2F) << 0 ) -#define ROSC_TRIM(x) (((x) & 0x1F) << 16) -#define ROSC_EN(x) (((x) & 0x1 ) << 30) -#define ROSC_RDY(x) (((x) & 0x1 ) << 31) - -#define XOSC_EN(x) (((x) & 0x1) << 30) -#define XOSC_RDY(x) (((x) & 0x1) << 31) - -#define PLL_R(x) (((x) & 0x7) << 0) -// single reserved bit for F LSB. -#define PLL_F(x) (((x) & 0x3F) << 4) -#define PLL_Q(x) (((x) & 0x3) << 10) -#define PLL_SEL(x) (((x) & 0x1) << 16) -#define PLL_REFSEL(x) (((x) & 0x1) << 17) -#define PLL_BYPASS(x) (((x) & 0x1) << 18) -#define PLL_LOCK(x) (((x) & 0x1) << 31) - -#define PLL_R_default 0x1 -#define PLL_F_default 0x1F -#define PLL_Q_default 0x3 - -#define PLL_REFSEL_HFROSC 0x0 -#define PLL_REFSEL_HFXOSC 0x1 - -#define PLL_SEL_HFROSC 0x0 -#define PLL_SEL_PLL 0x1 - -#define PLL_FINAL_DIV(x) (((x) & 0x3F) << 0) -#define PLL_FINAL_DIV_BY_1(x) (((x) & 0x1 ) << 8) - -#define PROCMON_DIV(x) (((x) & 0x1F) << 0) -#define PROCMON_TRIM(x) (((x) & 0x1F) << 8) -#define PROCMON_EN(x) (((x) & 0x1) << 16) -#define PROCMON_SEL(x) (((x) & 0x3) << 24) -#define PROCMON_NT_EN(x) (((x) & 0x1) << 28) - -#define PROCMON_SEL_HFCLK 0 -#define PROCMON_SEL_HFXOSCIN 1 -#define PROCMON_SEL_PLLOUTDIV 2 -#define PROCMON_SEL_PROCMON 3 - -#endif // _SIFIVE_PRCI_H diff --git a/raven/bsp/include/sifive/devices/pwm.h b/raven/bsp/include/sifive/devices/pwm.h deleted file mode 100644 index 067889a..0000000 --- a/raven/bsp/include/sifive/devices/pwm.h +++ /dev/null @@ -1,37 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PWM_H -#define _SIFIVE_PWM_H - -/* Register offsets */ - -#define PWM_CFG 0x00 -#define PWM_COUNT 0x08 -#define PWM_S 0x10 -#define PWM_CMP0 0x20 -#define PWM_CMP1 0x24 -#define PWM_CMP2 0x28 -#define PWM_CMP3 0x2C - -/* Constants */ - -#define PWM_CFG_SCALE 0x0000000F -#define PWM_CFG_STICKY 0x00000100 -#define PWM_CFG_ZEROCMP 0x00000200 -#define PWM_CFG_DEGLITCH 0x00000400 -#define PWM_CFG_ENALWAYS 0x00001000 -#define PWM_CFG_ONESHOT 0x00002000 -#define PWM_CFG_CMP0CENTER 0x00010000 -#define PWM_CFG_CMP1CENTER 0x00020000 -#define PWM_CFG_CMP2CENTER 0x00040000 -#define PWM_CFG_CMP3CENTER 0x00080000 -#define PWM_CFG_CMP0GANG 0x01000000 -#define PWM_CFG_CMP1GANG 0x02000000 -#define PWM_CFG_CMP2GANG 0x04000000 -#define PWM_CFG_CMP3GANG 0x08000000 -#define PWM_CFG_CMP0IP 0x10000000 -#define PWM_CFG_CMP1IP 0x20000000 -#define PWM_CFG_CMP2IP 0x40000000 -#define PWM_CFG_CMP3IP 0x80000000 - -#endif /* _SIFIVE_PWM_H */ diff --git a/raven/bsp/include/sifive/devices/spi.h b/raven/bsp/include/sifive/devices/spi.h deleted file mode 100644 index 80ef345..0000000 --- a/raven/bsp/include/sifive/devices/spi.h +++ /dev/null @@ -1,80 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_SPI_H -#define _SIFIVE_SPI_H - -/* Register offsets */ - -#define SPI_REG_SCKDIV 0x00 -#define SPI_REG_SCKMODE 0x04 -#define SPI_REG_CSID 0x10 -#define SPI_REG_CSDEF 0x14 -#define SPI_REG_CSMODE 0x18 - -#define SPI_REG_DCSSCK 0x28 -#define SPI_REG_DSCKCS 0x2a -#define SPI_REG_DINTERCS 0x2c -#define SPI_REG_DINTERXFR 0x2e - -#define SPI_REG_FMT 0x40 -#define SPI_REG_TXFIFO 0x48 -#define SPI_REG_RXFIFO 0x4c -#define SPI_REG_TXCTRL 0x50 -#define SPI_REG_RXCTRL 0x54 - -#define SPI_REG_FCTRL 0x60 -#define SPI_REG_FFMT 0x64 - -#define SPI_REG_IE 0x70 -#define SPI_REG_IP 0x74 - -/* Fields */ - -#define SPI_SCK_PHA 0x1 -#define SPI_SCK_POL 0x2 - -#define SPI_FMT_PROTO(x) ((x) & 0x3) -#define SPI_FMT_ENDIAN(x) (((x) & 0x1) << 2) -#define SPI_FMT_DIR(x) (((x) & 0x1) << 3) -#define SPI_FMT_LEN(x) (((x) & 0xf) << 16) - -/* TXCTRL register */ -#define SPI_TXWM(x) ((x) & 0xffff) -/* RXCTRL register */ -#define SPI_RXWM(x) ((x) & 0xffff) - -#define SPI_IP_TXWM 0x1 -#define SPI_IP_RXWM 0x2 - -#define SPI_FCTRL_EN 0x1 - -#define SPI_INSN_CMD_EN 0x1 -#define SPI_INSN_ADDR_LEN(x) (((x) & 0x7) << 1) -#define SPI_INSN_PAD_CNT(x) (((x) & 0xf) << 4) -#define SPI_INSN_CMD_PROTO(x) (((x) & 0x3) << 8) -#define SPI_INSN_ADDR_PROTO(x) (((x) & 0x3) << 10) -#define SPI_INSN_DATA_PROTO(x) (((x) & 0x3) << 12) -#define SPI_INSN_CMD_CODE(x) (((x) & 0xff) << 16) -#define SPI_INSN_PAD_CODE(x) (((x) & 0xff) << 24) - -#define SPI_TXFIFO_FULL (1 << 31) -#define SPI_RXFIFO_EMPTY (1 << 31) - -/* Values */ - -#define SPI_CSMODE_AUTO 0 -#define SPI_CSMODE_HOLD 2 -#define SPI_CSMODE_OFF 3 - -#define SPI_DIR_RX 0 -#define SPI_DIR_TX 1 - -#define SPI_PROTO_S 0 -#define SPI_PROTO_D 1 -#define SPI_PROTO_Q 2 - -#define SPI_ENDIAN_MSB 0 -#define SPI_ENDIAN_LSB 1 - - -#endif /* _SIFIVE_SPI_H */ diff --git a/raven/bsp/include/sifive/devices/uart.h b/raven/bsp/include/sifive/devices/uart.h deleted file mode 100644 index 71bea6f..0000000 --- a/raven/bsp/include/sifive/devices/uart.h +++ /dev/null @@ -1,27 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_UART_H -#define _SIFIVE_UART_H - -/* Register offsets */ -#define UART_REG_TXFIFO 0x00 -#define UART_REG_RXFIFO 0x04 -#define UART_REG_TXCTRL 0x08 -#define UART_REG_RXCTRL 0x0c -#define UART_REG_IE 0x10 -#define UART_REG_IP 0x14 -#define UART_REG_DIV 0x18 - -/* TXCTRL register */ -#define UART_TXEN 0x1 -#define UART_TXWM(x) (((x) & 0xffff) << 16) - -/* RXCTRL register */ -#define UART_RXEN 0x1 -#define UART_RXWM(x) (((x) & 0xffff) << 16) - -/* IP register */ -#define UART_IP_TXWM 0x1 -#define UART_IP_RXWM 0x2 - -#endif /* _SIFIVE_UART_H */ diff --git a/raven/bsp/include/sifive/sections.h b/raven/bsp/include/sifive/sections.h deleted file mode 100644 index 6e1f051..0000000 --- a/raven/bsp/include/sifive/sections.h +++ /dev/null @@ -1,17 +0,0 @@ -// See LICENSE for license details. -#ifndef _SECTIONS_H -#define _SECTIONS_H - -extern unsigned char _rom[]; -extern unsigned char _rom_end[]; - -extern unsigned char _ram[]; -extern unsigned char _ram_end[]; - -extern unsigned char _ftext[]; -extern unsigned char _etext[]; -extern unsigned char _fbss[]; -extern unsigned char _ebss[]; -extern unsigned char _end[]; - -#endif /* _SECTIONS_H */ diff --git a/raven/bsp/include/sifive/smp.h b/raven/bsp/include/sifive/smp.h deleted file mode 100644 index 8e34388..0000000 --- a/raven/bsp/include/sifive/smp.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef SIFIVE_SMP -#define SIFIVE_SMP - -// The maximum number of HARTs this code supports -#ifndef MAX_HARTS -#define MAX_HARTS 32 -#endif -#define CLINT_END_HART_IPI CLINT_CTRL_ADDR + (MAX_HARTS*4) - -// The hart that non-SMP tests should run on -#ifndef NONSMP_HART -#define NONSMP_HART 0 -#endif - -/* If your test cannot handle multiple-threads, use this: - * smp_disable(reg1) - */ -#define smp_disable(reg1, reg2) \ - csrr reg1, mhartid ;\ - li reg2, NONSMP_HART ;\ - beq reg1, reg2, hart0_entry ;\ -42: ;\ - wfi ;\ - j 42b ;\ -hart0_entry: - -/* If your test needs to temporarily block multiple-threads, do this: - * smp_pause(reg1, reg2) - * ... single-threaded work ... - * smp_resume(reg1, reg2) - * ... multi-threaded work ... - */ - -#define smp_pause(reg1, reg2) \ - li reg2, 0x8 ;\ - csrw mie, reg2 ;\ - csrr reg2, mhartid ;\ - bnez reg2, 42f - -#define smp_resume(reg1, reg2) \ - li reg1, CLINT_CTRL_ADDR ;\ -41: ;\ - li reg2, 1 ;\ - sw reg2, 0(reg1) ;\ - addi reg1, reg1, 4 ;\ - li reg2, CLINT_END_HART_IPI ;\ - blt reg1, reg2, 41b ;\ -42: ;\ - wfi ;\ - csrr reg2, mip ;\ - andi reg2, reg2, 0x8 ;\ - beqz reg2, 42b ;\ - li reg1, CLINT_CTRL_ADDR ;\ - csrr reg2, mhartid ;\ - slli reg2, reg2, 2 ;\ - add reg2, reg2, reg1 ;\ - sw zero, 0(reg2) ;\ -41: ;\ - lw reg2, 0(reg1) ;\ - bnez reg2, 41b ;\ - addi reg1, reg1, 4 ;\ - li reg2, CLINT_END_HART_IPI ;\ - blt reg1, reg2, 41b - -#endif diff --git a/raven/bsp/libwrap/libwrap.mk b/raven/bsp/libwrap/libwrap.mk deleted file mode 100644 index 71bba3d..0000000 --- a/raven/bsp/libwrap/libwrap.mk +++ /dev/null @@ -1,56 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_LIBWRAP -_SIFIVE_MK_LIBWRAP := # defined - -LIBWRAP_DIR := $(dir $(lastword $(MAKEFILE_LIST))) -LIBWRAP_DIR := $(LIBWRAP_DIR:/=) - -LIBWRAP_SRCS := \ - stdlib/malloc.c \ - sys/open.c \ - sys/lseek.c \ - sys/read.c \ - sys/write.c \ - sys/fstat.c \ - sys/stat.c \ - sys/close.c \ - sys/link.c \ - sys/unlink.c \ - sys/execve.c \ - sys/fork.c \ - sys/getpid.c \ - sys/kill.c \ - sys/wait.c \ - sys/isatty.c \ - sys/times.c \ - sys/sbrk.c \ - sys/_exit.c \ - sys/puts.c \ - misc/write_hex.c - -LIBWRAP_SRCS := $(foreach f,$(LIBWRAP_SRCS),$(LIBWRAP_DIR)/$(f)) -LIBWRAP_OBJS := $(LIBWRAP_SRCS:.c=.o) - -LIBWRAP_SYMS := malloc free \ - open lseek read write fstat stat close link unlink \ - execve fork getpid kill wait \ - isatty times sbrk _exit puts - -LIBWRAP := libwrap.a - -LINK_DEPS += $(LIBWRAP) - -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=$(s)) -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=_$(s)) -LDFLAGS += -L. -Wl,--start-group -lwrap -lc -Wl,--end-group - -CLEAN_OBJS += $(LIBWRAP_OBJS) - -$(LIBWRAP_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(LIBWRAP): $(LIBWRAP_OBJS) - $(AR) rcs $@ $^ - -endif # _SIFIVE_MK_LIBWRAP diff --git a/raven/bsp/libwrap/misc/write_hex.c b/raven/bsp/libwrap/misc/write_hex.c deleted file mode 100644 index a35ad7a..0000000 --- a/raven/bsp/libwrap/misc/write_hex.c +++ /dev/null @@ -1,19 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "platform.h" - -void write_hex(int fd, unsigned long int hex) -{ - uint8_t ii; - uint8_t jj; - char towrite; - write(fd , "0x", 2); - for (ii = sizeof(unsigned long int) * 2 ; ii > 0; ii--) { - jj = ii - 1; - uint8_t digit = ((hex & (0xF << (jj*4))) >> (jj*4)); - towrite = digit < 0xA ? ('0' + digit) : ('A' + (digit - 0xA)); - write(fd, &towrite, 1); - } -} diff --git a/raven/bsp/libwrap/stdlib/malloc.c b/raven/bsp/libwrap/stdlib/malloc.c deleted file mode 100644 index 8f4f432..0000000 --- a/raven/bsp/libwrap/stdlib/malloc.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE for license details. */ - -/* These functions are intended for embedded RV32 systems and are - obviously incorrect in general. */ - -void* __wrap_malloc(unsigned long sz) -{ - extern void* sbrk(long); - void* res = sbrk(sz); - if ((long)res == -1) - return 0; - return res; -} - -void __wrap_free(void* ptr) -{ -} diff --git a/raven/bsp/libwrap/sys/_exit.c b/raven/bsp/libwrap/sys/_exit.c deleted file mode 100644 index 011464f..0000000 --- a/raven/bsp/libwrap/sys/_exit.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "platform.h" -#include "weak_under_alias.h" - -void __wrap_exit(int code) -{ - const char message[] = "\nProgam has exited with code:"; - - write(STDERR_FILENO, message, sizeof(message) - 1); - write_hex(STDERR_FILENO, code); - write(STDERR_FILENO, "\n", 1); - - for (;;); -} -weak_under_alias(exit); diff --git a/raven/bsp/libwrap/sys/close.c b/raven/bsp/libwrap/sys/close.c deleted file mode 100644 index 199fe51..0000000 --- a/raven/bsp/libwrap/sys/close.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_close(int fd) -{ - return _stub(EBADF); -} -weak_under_alias(close); diff --git a/raven/bsp/libwrap/sys/execve.c b/raven/bsp/libwrap/sys/execve.c deleted file mode 100644 index f7be25a..0000000 --- a/raven/bsp/libwrap/sys/execve.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_execve(const char* name, char* const argv[], char* const env[]) -{ - return _stub(ENOMEM); -} -weak_under_alias(execve); diff --git a/raven/bsp/libwrap/sys/fork.c b/raven/bsp/libwrap/sys/fork.c deleted file mode 100644 index 13a3e65..0000000 --- a/raven/bsp/libwrap/sys/fork.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int fork(void) -{ - return _stub(EAGAIN); -} diff --git a/raven/bsp/libwrap/sys/fstat.c b/raven/bsp/libwrap/sys/fstat.c deleted file mode 100644 index ff82bf9..0000000 --- a/raven/bsp/libwrap/sys/fstat.c +++ /dev/null @@ -1,18 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_fstat(int fd, struct stat* st) -{ - if (isatty(fd)) { - st->st_mode = S_IFCHR; - return 0; - } - - return _stub(EBADF); -} -weak_under_alias(fstat); diff --git a/raven/bsp/libwrap/sys/getpid.c b/raven/bsp/libwrap/sys/getpid.c deleted file mode 100644 index 195fbec..0000000 --- a/raven/bsp/libwrap/sys/getpid.c +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE of license details. */ -#include "weak_under_alias.h" - -int __wrap_getpid(void) -{ - return 1; -} -weak_under_alias(getpid); diff --git a/raven/bsp/libwrap/sys/isatty.c b/raven/bsp/libwrap/sys/isatty.c deleted file mode 100644 index 7bb82ab..0000000 --- a/raven/bsp/libwrap/sys/isatty.c +++ /dev/null @@ -1,13 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "weak_under_alias.h" - -int __wrap_isatty(int fd) -{ - if (fd == STDOUT_FILENO || fd == STDERR_FILENO) - return 1; - - return 0; -} -weak_under_alias(isatty); diff --git a/raven/bsp/libwrap/sys/kill.c b/raven/bsp/libwrap/sys/kill.c deleted file mode 100644 index 18b9bd4..0000000 --- a/raven/bsp/libwrap/sys/kill.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_kill(int pid, int sig) -{ - return _stub(EINVAL); -} -weak_under_alias(kill); diff --git a/raven/bsp/libwrap/sys/link.c b/raven/bsp/libwrap/sys/link.c deleted file mode 100644 index 0cad551..0000000 --- a/raven/bsp/libwrap/sys/link.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_link(const char *old_name, const char *new_name) -{ - return _stub(EMLINK); -} -weak_under_alias(link); diff --git a/raven/bsp/libwrap/sys/lseek.c b/raven/bsp/libwrap/sys/lseek.c deleted file mode 100644 index 4131449..0000000 --- a/raven/bsp/libwrap/sys/lseek.c +++ /dev/null @@ -1,16 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -off_t __wrap_lseek(int fd, off_t ptr, int dir) -{ - if (isatty(fd)) - return 0; - - return _stub(EBADF); -} -weak_under_alias(lseek); diff --git a/raven/bsp/libwrap/sys/open.c b/raven/bsp/libwrap/sys/open.c deleted file mode 100644 index c61415a..0000000 --- a/raven/bsp/libwrap/sys/open.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_open(const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} -weak_under_alias(open); diff --git a/raven/bsp/libwrap/sys/openat.c b/raven/bsp/libwrap/sys/openat.c deleted file mode 100644 index 227c956..0000000 --- a/raven/bsp/libwrap/sys/openat.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_openat(int dirfd, const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} -weak_under_alias(openat); diff --git a/raven/bsp/libwrap/sys/puts.c b/raven/bsp/libwrap/sys/puts.c deleted file mode 100644 index 50d6437..0000000 --- a/raven/bsp/libwrap/sys/puts.c +++ /dev/null @@ -1,28 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_puts(const char *s) -{ - while (*s != '\0') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = *s; - - if (*s == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - - ++s; - } - - return 0; -} -weak_under_alias(puts); diff --git a/raven/bsp/libwrap/sys/read.c b/raven/bsp/libwrap/sys/read.c deleted file mode 100644 index 3226cdb..0000000 --- a/raven/bsp/libwrap/sys/read.c +++ /dev/null @@ -1,32 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -ssize_t __wrap_read(int fd, void* ptr, size_t len) -{ - uint8_t * current = (uint8_t *)ptr; - volatile uint32_t * uart_rx = (uint32_t *)(UART0_CTRL_ADDR + UART_REG_RXFIFO); - volatile uint8_t * uart_rx_cnt = (uint8_t *)(UART0_CTRL_ADDR + UART_REG_RXCTRL + 2); - - ssize_t result = 0; - - if (isatty(fd)) { - for (current = (uint8_t *)ptr; - (current < ((uint8_t *)ptr) + len) && (*uart_rx_cnt > 0); - current ++) { - *current = *uart_rx; - result++; - } - return result; - } - - return _stub(EBADF); -} -weak_under_alias(read); diff --git a/raven/bsp/libwrap/sys/sbrk.c b/raven/bsp/libwrap/sys/sbrk.c deleted file mode 100644 index 12170b4..0000000 --- a/raven/bsp/libwrap/sys/sbrk.c +++ /dev/null @@ -1,18 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "weak_under_alias.h" - -void *__wrap_sbrk(ptrdiff_t incr) -{ - extern char _end[]; - extern char _heap_end[]; - static char *curbrk = _end; - - if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) - return NULL - 1; - - curbrk += incr; - return curbrk - incr; -} -weak_under_alias(sbrk); diff --git a/raven/bsp/libwrap/sys/stat.c b/raven/bsp/libwrap/sys/stat.c deleted file mode 100644 index 1576ca1..0000000 --- a/raven/bsp/libwrap/sys/stat.c +++ /dev/null @@ -1,12 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_stat(const char* file, struct stat* st) -{ - return _stub(EACCES); -} -weak_under_alias(stat); diff --git a/raven/bsp/libwrap/sys/stub.h b/raven/bsp/libwrap/sys/stub.h deleted file mode 100644 index fb5e5be..0000000 --- a/raven/bsp/libwrap/sys/stub.h +++ /dev/null @@ -1,10 +0,0 @@ -/* See LICENSE of license details. */ -#ifndef _SIFIVE_SYS_STUB_H -#define _SIFIVE_SYS_STUB_H - -static inline int _stub(int err) -{ - return -1; -} - -#endif /* _SIFIVE_SYS_STUB_H */ diff --git a/raven/bsp/libwrap/sys/times.c b/raven/bsp/libwrap/sys/times.c deleted file mode 100644 index 55969a7..0000000 --- a/raven/bsp/libwrap/sys/times.c +++ /dev/null @@ -1,12 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -clock_t __wrap_times(struct tms* buf) -{ - return _stub(EACCES); -} -weak_under_alias(times); diff --git a/raven/bsp/libwrap/sys/unlink.c b/raven/bsp/libwrap/sys/unlink.c deleted file mode 100644 index 09f4da7..0000000 --- a/raven/bsp/libwrap/sys/unlink.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_unlink(const char* name) -{ - return _stub(ENOENT); -} -weak_under_alias(unlink); diff --git a/raven/bsp/libwrap/sys/wait.c b/raven/bsp/libwrap/sys/wait.c deleted file mode 100644 index ea3225b..0000000 --- a/raven/bsp/libwrap/sys/wait.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int wait(int* status) -{ - return _stub(ECHILD); -} diff --git a/raven/bsp/libwrap/sys/weak_under_alias.h b/raven/bsp/libwrap/sys/weak_under_alias.h deleted file mode 100644 index 7629353..0000000 --- a/raven/bsp/libwrap/sys/weak_under_alias.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _BSP_LIBWRAP_WEAK_UNDER_ALIAS_H -#define _BSP_LIBWRAP_WEAK_UNDER_ALIAS_H - -#define weak_under_alias(name) \ - extern __typeof (__wrap_##name) __wrap__##name __attribute__ ((weak, alias ("__wrap_"#name))) - -#endif diff --git a/raven/bsp/libwrap/sys/write.c b/raven/bsp/libwrap/sys/write.c deleted file mode 100644 index b1e9a7e..0000000 --- a/raven/bsp/libwrap/sys/write.c +++ /dev/null @@ -1,31 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -ssize_t __wrap_write(int fd, const void* ptr, size_t len) -{ - const uint8_t * current = (const char *)ptr; - - if (isatty(fd)) { - for (size_t jj = 0; jj < len; jj++) { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = current[jj]; - - if (current[jj] == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - } - return len; - } - - return _stub(EBADF); -} -weak_under_alias(write); diff --git a/raven/hello_raven b/raven/hello_raven deleted file mode 100755 index 27d4b39676e99d3bf409eb6b78eecbd2310e62cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117196 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 -#include -#include -extern void trap_entry(); -#ifdef __cplusplus -} -#endif - -#endif /* BSP_H_ */ diff --git a/raven/src/delay.c b/raven/src/delay.c deleted file mode 100644 index 24070b4..0000000 --- a/raven/src/delay.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * delay.c - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#include "delay.h" - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -typedef struct { - uint32_t n; - uint32_t mult; - uint32_t shift; -} int_inverse ; - -int_inverse f_cpu_1000_inv; -int_inverse f_cpu_1000000_inv; - -uint32_t F_CPU=1000000; - -void calc_inv(uint32_t n, int_inverse * res){ - uint32_t one = ~0; - uint32_t d = one/n; - uint32_t r = one%n + 1; - if (r >= n) ++d; - if (d == 0) --d; - uint32_t shift = 0; - while ((d & 0x80000000) == 0){ - d <<= 1; - ++shift; - } - res->n = n; - res->mult = d; - res->shift = shift; -} - -uint32_t divide32_using_inverse(uint32_t n, int_inverse *inv){ - uint32_t d = (uint32_t)(((uint64_t)n * inv->mult) >> 32); - d >>= inv->shift; - if (n - d*inv->n >= inv->n) ++d; - return d; -} - -// Almost full-range 64/32 divide. -// If divisor-1 has i bits, then the answer is exact for n of up to 64-i bits -// e.g. for divisors up to a million, n can have up to 45 bits -// On RV32IM with divide32_using_inverse inlines this uses 5 multiplies, -// 33 instructions, zero branches, 3 loads, 0 stores. -uint64_t divide64_using_inverse(uint64_t n, int_inverse *inv){ - uint32_t preshift = (31 - inv->shift) & 31; - uint64_t d = (uint64_t)divide32_using_inverse(n >> preshift, inv) << preshift; - uint32_t r = n - d * inv->n; - d += divide32_using_inverse(r, inv); - return d; -} - - -uint32_t millis(){ - uint64_t x; - rdmcycle(&x); - x = divide64_using_inverse(x, &f_cpu_1000_inv); - return((uint32_t) (x & 0xFFFFFFFF)); -} - -uint32_t micros(void){ - uint64_t x; - rdmcycle(&x); - // For Power-of-two MHz F_CPU, - // this compiles into a simple shift, - // and is faster than the general solution. -#if F_CPU==16000000 - x = x / (F_CPU / 1000000); -#else -#if F_CPU==256000000 - x = x / (F_CPU / 1000000); -#else - x = divide64_using_inverse(x, &f_cpu_1000000_inv); -#endif -#endif - return((uint32_t) (x & 0xFFFFFFFF)); -} - - -void delayMS(uint32_t dwMs){ - uint64_t current, later; - rdmcycle(¤t); - later = current + dwMs * (F_CPU/1000); - if (later > current){ // usual case - while (later > current) - rdmcycle(¤t); - } else { // wrap. Though this is unlikely to be hit w/ 64-bit mcycle - while (later < current) - rdmcycle(¤t); - while (current < later) - rdmcycle(¤t); - } -} - -void delayUS(uint32_t dwUs){ - uint64_t current, later; - rdmcycle(¤t); - later = current + dwUs * (F_CPU/1000000); - if (later > current){ // usual case - while (later > current) - rdmcycle(¤t); - } else {// wrap. Though this is unlikely to be hit w/ 64-bit mcycle - while (later < current) - rdmcycle(¤t); - while (current < later) - rdmcycle(¤t); - } -} diff --git a/raven/src/delay.h b/raven/src/delay.h deleted file mode 100644 index 36ce098..0000000 --- a/raven/src/delay.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * delay.h - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#ifndef DELAY_H_ -#define DELAY_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif -extern uint32_t F_CPU; - -void delayMS(uint32_t dwMs); -void delayUS(uint32_t dwUs); - -#ifdef __cplusplus -} -#endif - -#endif /* DELAY_H_ */ diff --git a/raven/src/hello_raven.cpp b/raven/src/hello_raven.cpp deleted file mode 100644 index baac273..0000000 --- a/raven/src/hello_raven.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "hello_raven.h" -#include "delay.h" -#include "bsp.h" -#include "plic/plic_driver.h" - -#include -#include -#include - -#define IOF_ENABLE_TERMINAL (0x30000) - - -typedef void (*function_ptr_t) (void); -//! Instance data for the PLIC. -plic_instance_t g_plic; -std::array g_ext_interrupt_handlers; - - -char * end = (char *)0x80001000; // TODO: end supposed to be a RAM section according to the linker file falsh.lds, but for some reason it's not initialized - -/*! \brief external interrupt handler - * - * routes the peripheral interrupts to the the respective handler - * - */ -extern "C" void handle_m_ext_interrupt() { - plic_source int_num = PLIC_claim_interrupt(&g_plic); - if ((int_num >=1 ) && (int_num < PLIC_NUM_INTERRUPTS)) - g_ext_interrupt_handlers[int_num](); - else - exit(1 + (uintptr_t) int_num); - PLIC_complete_interrupt(&g_plic, int_num); -} -/*! \brief dummy interrupt handler - * - */ -void no_interrupt_handler (void) {}; -/*! \brief configure the per-interrupt handler - * - */ -void configure_irq(size_t irq_num, function_ptr_t handler, unsigned char prio=1) { - g_ext_interrupt_handlers[irq_num] = handler; - // Priority must be set > 0 to trigger the interrupt. - PLIC_set_priority(&g_plic, irq_num, prio); - // Have to enable the interrupt both at the GPIO level, and at the PLIC level. - PLIC_enable_interrupt(&g_plic, irq_num); -} - -static void msi_interrupt_handler(){ - int * local_mem_base = (int *) end; - int hartid = read_csr(mhartid); - - int val_a = *local_mem_base; - int val_b = *(local_mem_base+1); - int sum = val_a + val_b; - *(local_mem_base+100) = sum; - if (sum == 0xF) - printf("HW thread ID %d: sum of A+B=0x%x\n", hartid, sum); - else { - printf("HW thread ID %d: sum of A+B is not 0x%x. Test FAILED!!!\n", hartid, sum); - } -} - -/*!\brief initializes platform - * - */ -void platform_init(){ - // UART init section TODO: clarify how to get the functions from init.c? - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; - - F_CPU=PRCI_measure_mcycle_freq(20, RTC_FREQ); - printf("core freq at %d Hz\n", F_CPU); - // initialie interupt & trap handling - write_csr(mtvec, &trap_entry); - - PLIC_init(&g_plic, PLIC_CTRL_ADDR, PLIC_NUM_INTERRUPTS, PLIC_NUM_PRIORITIES, 0); - // Disable the machine & timer interrupts until setup is done. - clear_csr(mie, MIP_MEIP); - clear_csr(mie, MIP_MTIP); - for (auto& h:g_ext_interrupt_handlers) h=no_interrupt_handler; - configure_irq(1, msi_interrupt_handler); - // Enable interrupts in general. - set_csr(mstatus, MSTATUS_MIE); - // Enable the Machine-External bit in MIE - set_csr(mie, MIP_MEIP); -} - -/*! \brief main function - * - */ -int main() { - volatile int * target_mem_base = (int *)(end + 0x10000000); - int * local_mem_base = (int *) end; - int * plic_b_pending = (int *)(0xC0000000+PLIC_PENDING_OFFSET); - - int hartid = read_csr(mhartid); - - platform_init(); - - if (hartid == 0) { - int val_a = 5; - int val_b = 0xA; - *target_mem_base = val_a; - *(target_mem_base+1) = val_b; - *(plic_b_pending) = 2; - printf("HW thread ID %d: write value A=0x%x and value B=0x%x to thread 1\n", hartid, val_a, val_b); - } - - delayUS(100); - - printf("End of execution"); - return 0; -} diff --git a/raven/src/hello_raven.h b/raven/src/hello_raven.h deleted file mode 100644 index f19e20f..0000000 --- a/raven/src/hello_raven.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef HELLO_RAVEN_H_ -#define HELLO_RAVEN_H_ - -extern "C" void handle_m_ext_interrupt(); - -#endif /* HELLO_RAVEN_H_ */ diff --git a/raven/src/io/gpio.h b/raven/src/io/gpio.h deleted file mode 100644 index 466f2d2..0000000 --- a/raven/src/io/gpio.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * gpio.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef GPIO_H_ -#define GPIO_H_ - -#include -#include - -template -class gpio_regs { -public: - static inline uint32_t& value_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_INPUT_VAL); - } - - static inline uint32_t& input_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_INPUT_EN); - } - - static inline uint32_t& output_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_EN); - } - - static inline uint32_t& port_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_VAL); - } - - static inline uint32_t& pue_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_PULLUP_EN); - } - - static inline uint32_t& ds_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_DRIVE); - } - - static inline uint32_t& rise_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_RISE_IE); - } - - static inline uint32_t& rise_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_RISE_IP); - } - - static inline uint32_t& fall_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_FALL_IE); - } - - static inline uint32_t& fall_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_FALL_IP); - } - - static inline uint32_t& high_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_HIGH_IE); - } - - static inline uint32_t& high_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_HIGH_IP); - } - - static inline uint32_t& low_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_LOW_IE); - } - - static inline uint32_t& low_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_LOW_IP); - } - - static inline uint32_t& iof_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_IOF_EN); - } - - static inline uint32_t& iof_sel_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_IOF_SEL); - } - - static inline uint32_t& out_xor_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_XOR); - } - -}; - - - -#endif /* GPIO_H_ */ diff --git a/raven/src/io/pwm.h b/raven/src/io/pwm.h deleted file mode 100644 index 2aab61b..0000000 --- a/raven/src/io/pwm.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * pwm.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef PWM_H_ -#define PWM_H_ - -#include -#include "util/bit_field.h" -#include -#include - -template -class pwm_regs { -public: - BEGIN_BF_DECL(pwmcfg_t, uint32_t); - BF_FIELD(scale, 0, 4); - BF_FIELD(sticky, 8, 1); - BF_FIELD(zerocmp, 9, 1); - BF_FIELD(deglitch, 10, 1); - BF_FIELD(enalways, 12, 1); - BF_FIELD(enoneshot, 13, 1); - BF_FIELD(cmp0center, 16, 1); - BF_FIELD(cmp1center, 17, 1); - BF_FIELD(cmp2center, 18, 1); - BF_FIELD(cmp3center, 19, 1); - BF_FIELD(cmp0gang, 24, 1); - BF_FIELD(cmp1gang, 25, 1); - BF_FIELD(cmp2gang, 26, 1); - BF_FIELD(cmp3gang, 27, 1); - BF_FIELD(cmp0ip, 28, 1); - BF_FIELD(cmp1ip, 29, 1); - BF_FIELD(cmp2ip, 30, 1); - BF_FIELD(cmp3ip, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(pwms_t, uint32_t); - BF_FIELD(s, 0, 16); - END_BF_DECL() r_pwms; - - BEGIN_BF_DECL(pwmcmp0_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp0; - - BEGIN_BF_DECL(pwmcmp1_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp1; - - BEGIN_BF_DECL(pwmcmp2_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp2; - - BEGIN_BF_DECL(pwmcmp3_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp3; - - static inline pwmcfg_t& cfg_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CFG); - } - - static inline uint32_t& count_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_COUNT); - } - - static inline pwms_t& s_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_S); - } - - static inline pwmcmp0_t& cmp0_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP0); - } - - static inline pwmcmp1_t& cmp1_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP1); - } - - static inline pwmcmp2_t& cmp2_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP2); - } - - static inline pwmcmp3_t& cmp3_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP3); - } - - static inline bool oneshot_delay(long delay_us){ - auto scaling_factor=0; - while(delay_us/(1< std::numeric_limits::max()){ - scaling_factor++; - } - cfg_reg()=0; - count_reg()=0; - cfg_reg().scale=4+scaling_factor; // divide by 16 so we get 1us per pwm clock - cmp0_reg().cmp0 = delay_us/(1< -#include "util/bit_field.h" -#include -#include - -template -class spi_regs { -public: - // storage declarations - BEGIN_BF_DECL(sckdiv_t, uint32_t); - BF_FIELD(div, 0, 12); - END_BF_DECL(); - - BEGIN_BF_DECL(sckmode_t, uint32_t); - BF_FIELD(pha, 0, 1); - BF_FIELD(pol, 1, 1); - END_BF_DECL(); - - uint32_t r_csid; - - uint32_t r_csdef; - - BEGIN_BF_DECL(csmode_t, uint32_t); - BF_FIELD(mode, 0, 2); - END_BF_DECL(); - - BEGIN_BF_DECL(delay0_t, uint32_t); - BF_FIELD(cssck, 0, 8); - BF_FIELD(sckcs, 16, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(delay1_t, uint32_t); - BF_FIELD(intercs, 0, 16); - BF_FIELD(interxfr, 16, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(fmt_t, uint32_t); - BF_FIELD(proto, 0, 2); - BF_FIELD(endian, 2, 1); - BF_FIELD(dir, 3, 1); - BF_FIELD(len, 16, 4); - END_BF_DECL(); - - BEGIN_BF_DECL(txdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(full, 31, 1); - END_BF_DECL() r_txdata; - - BEGIN_BF_DECL(rxdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(empty, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(txmark_t, uint32_t); - BF_FIELD(txmark, 0, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(rxmark_t, uint32_t); - BF_FIELD(rxmark, 0, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(fctrl_t, uint32_t); - BF_FIELD(en, 0, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ffmt_t, uint32_t); - BF_FIELD(cmd_en, 0, 1); - BF_FIELD(addr_len, 1, 2); - BF_FIELD(pad_cnt, 3, 4); - BF_FIELD(cmd_proto, 7, 2); - BF_FIELD(addr_proto, 9, 2); - BF_FIELD(data_proto, 11, 2); - BF_FIELD(cmd_code, 16, 8); - BF_FIELD(pad_code, 24, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(ie_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ip_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - static inline sckdiv_t& sckdiv_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_SCKDIV); - } - - static inline sckmode_t& sckmode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_SCKMODE); - } - - static inline uint32_t& csid_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSID); - } - - static inline uint32_t& csdef_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSDEF); - } - - static inline csmode_t& csmode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSMODE); - } - - static inline delay0_t& dcssck_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DCSSCK); - } - - static inline uint32_t& dsckcs_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DSCKCS); - } - - static inline delay1_t& dintercs_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DINTERCS); - } - - static inline uint32_t& dinterxfr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DINTERXFR); - } - - static inline fmt_t& fmt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FMT); - } - - static inline txdata_t& txfifo_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_TXFIFO); - } - - static inline rxdata_t& rxfifo_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_RXFIFO); - } - - static inline txmark_t& txctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_TXCTRL); - } - - static inline rxmark_t& rxctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_RXCTRL); - } - - static inline fctrl_t& fctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FCTRL); - } - - static inline ffmt_t& ffmt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FFMT); - } - - static inline ie_t& ie_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_IE); - } - - static inline ip_t& ip_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_IP); - } - - template - static bool transfer(std::array& bytes){ - csmode_reg().mode=2; // HOLD mode - rxctrl_reg().rxmark=bytes.size()-1; // trigger irq if more than 2 bytes are received; - ie_reg().rxwm=1; - // write data bytes - for(size_t i=0; i -#include "util/bit_field.h" -#include - -template -class uart_regs { -public: - BEGIN_BF_DECL(txdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(full, 31, 1); - END_BF_DECL() ; - - BEGIN_BF_DECL(rxdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(empty, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(txctrl_t, uint32_t); - BF_FIELD(txen, 0, 1); - BF_FIELD(nstop, 1, 1); - BF_FIELD(txcnt, 16, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(rxctrl_t, uint32_t); - BF_FIELD(rxen, 0, 1); - BF_FIELD(rxcnt, 16, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(ie_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ip_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(div_t, uint32_t); - BF_FIELD(div, 0, 16); - END_BF_DECL(); - - static inline txdata_t& txdata_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_TXFIFO); - } - - static inline rxdata_t& rxdata_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_RXFIFO); - } - - static inline txctrl_t& txctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_TXCTRL); - } - - static inline rxctrl_t& rxctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_RXCTRL); - } - - static inline ie_t& ie_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_IE); - } - - static inline ip_t& ip_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_IP); - } - - static inline div_t& div_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_DIV); - } - -}; - -#endif /* SPI_H_ */ diff --git a/raven/src/util/bit_field.h b/raven/src/util/bit_field.h deleted file mode 100644 index d4aff48..0000000 --- a/raven/src/util/bit_field.h +++ /dev/null @@ -1,179 +0,0 @@ -/*--------------------------------------------------------- -Copyright (c) 2015 Jeff Preshing - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgement in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. ----------------------------------------------------------*/ - -#ifndef BIT_FIELD_H_ -#define BIT_FIELD_H_ - -#ifndef __CPP11OM_BITFIELD_H__ -#define __CPP11OM_BITFIELD_H__ - -#include - -//--------------------------------------------------------- -// BitFieldMember<>: Used internally by ADD_BITFIELD_MEMBER macro. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -template struct BitFieldMember { - T value; - - static_assert(Offset + Bits <= (int)sizeof(T) * 8, "Member exceeds bitfield boundaries"); - static_assert(Bits < (int)sizeof(T) * 8, "Can't fill entire bitfield with one member"); - - static const T Maximum = (T(1) << Bits) - 1; - static const T Mask = Maximum << Offset; - T maximum() const { return Maximum; } - T one() const { return T(1) << Offset; } - - operator T() const { return (value >> Offset) & Maximum; } - - BitFieldMember &operator=(T v) { - assert(v <= Maximum); // v must fit inside the bitfield member - value = (value & ~Mask) | (v << Offset); - return *this; - } - - BitFieldMember &operator+=(T v) { - assert(T(*this) + v <= Maximum); // result must fit inside the bitfield member - value += v << Offset; - return *this; - } - - BitFieldMember &operator-=(T v) { - assert(T(*this) >= v); // result must not underflow - value -= v << Offset; - return *this; - } - - BitFieldMember &operator++() { return *this += 1; } - BitFieldMember operator++(int) { // postfix form - BitFieldMember tmp(*this); - operator++(); - return tmp; - } - BitFieldMember &operator--() { return *this -= 1; } - BitFieldMember operator--(int) { // postfix form - BitFieldMember tmp(*this); - operator--(); - return tmp; - } -}; - -//--------------------------------------------------------- -// BitFieldArray<>: Used internally by ADD_BITFIELD_ARRAY macro. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -template class BitFieldArray { -public: - T value; - - static_assert(BaseOffset + BitsPerItem * NumItems <= (int)sizeof(T) * 8, "Array exceeds bitfield boundaries"); - static_assert(BitsPerItem < (int)sizeof(T) * 8, "Can't fill entire bitfield with one array element"); - - static const T Maximum = (T(1) << BitsPerItem) - 1; - T maximum() const { return Maximum; } - int numItems() const { return NumItems; } - - class Element { - private: - T &value; - int offset; - - public: - Element(T &value, int offset) - : value(value) - , offset(offset) {} - T mask() const { return Maximum << offset; } - - operator T() const { return (value >> offset) & Maximum; } - - Element &operator=(T v) { - assert(v <= Maximum); // v must fit inside the bitfield member - value = (value & ~mask()) | (v << offset); - return *this; - } - - Element &operator+=(T v) { - assert(T(*this) + v <= Maximum); // result must fit inside the bitfield member - value += v << offset; - return *this; - } - - Element &operator-=(T v) { - assert(T(*this) >= v); // result must not underflow - value -= v << offset; - return *this; - } - - Element &operator++() { return *this += 1; } - Element operator++(int) { // postfix form - Element tmp(*this); - operator++(); - return tmp; - } - Element &operator--() { return *this -= 1; } - Element operator--(int) { // postfix form - Element tmp(*this); - operator--(); - return tmp; - } - }; - - Element operator[](int i) { - assert(i >= 0 && i < NumItems); // array index must be in range - return Element(value, BaseOffset + BitsPerItem * i); - } - - const Element operator[](int i) const { - assert(i >= 0 && i < NumItems); // array index must be in range - return Element(value, BaseOffset + BitsPerItem * i); - } -}; - -//--------------------------------------------------------- -// Bitfield definition macros. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -#define BEGIN_BF_DECL(typeName, T) \ - union typeName { \ - struct Wrapper { \ - T value; \ - }; \ - Wrapper flat; \ - typeName(T v = 0) { flat.value = v; } \ - typeName &operator=(T v) { \ - flat.value = v; \ - return *this; \ - } \ - operator T &() { return flat.value; } \ - operator T() const { return flat.value; } \ - using StorageType = T; - -#define BF_FIELD(memberName, offset, bits) BitFieldMember memberName; - -#define BF_ARRAY(memberName, offset, bits, numItems) BitFieldArray memberName; - -#define END_BF_DECL() } - -#endif // __CPP11OM_BITFIELD_H__ - -#endif /* BIT_FIELD_H_ */ diff --git a/raven/src/wrap_printf.c b/raven/src/wrap_printf.c deleted file mode 100644 index af23b1a..0000000 --- a/raven/src/wrap_printf.c +++ /dev/null @@ -1,271 +0,0 @@ -/* The functions in this file are only meant to support Dhrystone on an - * embedded RV32 system and are obviously incorrect in general. */ - -#include -#include -#include -#include -#include -#include - -#undef putchar -int putchar(int ch) -{ - return write(STDOUT_FILENO, &ch, 1) == 1 ? ch : -1; -} - -static void sprintf_putch(int ch, void** data) -{ - char** pstr = (char**)data; - **pstr = ch; - (*pstr)++; -} - -static unsigned long getuint(va_list *ap, int lflag) -{ - if (lflag) - return va_arg(*ap, unsigned long); - else - return va_arg(*ap, unsigned int); -} - -static long getint(va_list *ap, int lflag) -{ - if (lflag) - return va_arg(*ap, long); - else - return va_arg(*ap, int); -} - -static inline void printnum(void (*putch)(int, void**), void **putdat, - unsigned long num, unsigned base, int width, int padc) -{ - unsigned digs[sizeof(num)*8]; - int pos = 0; - - while (1) - { - digs[pos++] = num % base; - if (num < base) - break; - num /= base; - } - - while (width-- > pos) - putch(padc, putdat); - - while (pos-- > 0) - putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); -} - -static inline void print_double(void (*putch)(int, void**), void **putdat, - double num, int width, int prec) -{ - union { - double d; - uint64_t u; - } u; - u.d = num; - - if (u.u & (1ULL << 63)) { - putch('-', putdat); - u.u &= ~(1ULL << 63); - } - - for (int i = 0; i < prec; i++) - u.d *= 10; - - char buf[32], *pbuf = buf; - printnum(sprintf_putch, (void**)&pbuf, (unsigned long)u.d, 10, 0, 0); - if (prec > 0) { - for (int i = 0; i < prec; i++) { - pbuf[-i] = pbuf[-i-1]; - } - pbuf[-prec] = '.'; - pbuf++; - } - - for (char* p = buf; p < pbuf; p++) - putch(*p, putdat); -} - -static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) -{ - register const char* p; - const char* last_fmt; - register int ch, err; - unsigned long num; - int base, lflag, width, precision, altflag; - char padc; - - while (1) { - while ((ch = *(unsigned char *) fmt) != '%') { - if (ch == '\0') - return; - fmt++; - putch(ch, putdat); - } - fmt++; - - // Process a %-escape sequence - last_fmt = fmt; - padc = ' '; - width = -1; - precision = -1; - lflag = 0; - altflag = 0; - reswitch: - switch (ch = *(unsigned char *) fmt++) { - - // flag to pad on the right - case '-': - padc = '-'; - goto reswitch; - - // flag to pad with 0's instead of spaces - case '0': - padc = '0'; - goto reswitch; - - // width field - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - for (precision = 0; ; ++fmt) { - precision = precision * 10 + ch - '0'; - ch = *fmt; - if (ch < '0' || ch > '9') - break; - } - goto process_precision; - - case '*': - precision = va_arg(ap, int); - goto process_precision; - - case '.': - if (width < 0) - width = 0; - goto reswitch; - - case '#': - altflag = 1; - goto reswitch; - - process_precision: - if (width < 0) - width = precision, precision = -1; - goto reswitch; - - // long flag - case 'l': - if (lflag) - goto bad; - goto reswitch; - - // character - case 'c': - putch(va_arg(ap, int), putdat); - break; - - // double - case 'f': - print_double(putch, putdat, va_arg(ap, double), width, precision); - break; - - // string - case 's': - if ((p = va_arg(ap, char *)) == NULL) - p = "(null)"; - if (width > 0 && padc != '-') - for (width -= strnlen(p, precision); width > 0; width--) - putch(padc, putdat); - for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { - putch(ch, putdat); - p++; - } - for (; width > 0; width--) - putch(' ', putdat); - break; - - // (signed) decimal - case 'd': - num = getint(&ap, lflag); - if ((long) num < 0) { - putch('-', putdat); - num = -(long) num; - } - base = 10; - goto signed_number; - - // unsigned decimal - case 'u': - base = 10; - goto unsigned_number; - - // (unsigned) octal - case 'o': - // should do something with padding so it's always 3 octits - base = 8; - goto unsigned_number; - - // pointer - case 'p': - lflag = 1; - putch('0', putdat); - putch('x', putdat); - /* fall through to 'x' */ - - // (unsigned) hexadecimal - case 'x': - base = 16; - unsigned_number: - num = getuint(&ap, lflag); - signed_number: - printnum(putch, putdat, num, base, width, padc); - break; - - // escaped '%' character - case '%': - putch(ch, putdat); - break; - - // unrecognized escape sequence - just print it literally - default: - bad: - putch('%', putdat); - fmt = last_fmt; - break; - } - } -} - -int __wrap_printf(const char* fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - - vprintfmt((void*)putchar, 0, fmt, ap); - - va_end(ap); - return 0; // incorrect return value, but who cares, anyway? -} - -int __wrap_sprintf(char* str, const char* fmt, ...) -{ - va_list ap; - char* str0 = str; - va_start(ap, fmt); - - vprintfmt(sprintf_putch, (void**)&str, fmt, ap); - *str = 0; - - va_end(ap); - return str - str0; -} diff --git a/raven/toolchain-rv32.cmake b/raven/toolchain-rv32.cmake deleted file mode 100644 index bd5ee3b..0000000 --- a/raven/toolchain-rv32.cmake +++ /dev/null @@ -1,33 +0,0 @@ -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_VERSION 1) -set(CMAKE_SYSTEM_PROCESSOR riscv) - -set(TOOLCHAIN_DIR /opt/riscv/tools) -set(ARCHITECTURE riscv64-unknown-elf) - -set(CMAKE_C_COMPILER ${ARCHITECTURE}-gcc -set(CMAKE_CXX_COMPILER ${ARCHITECTURE}-g++ -set(RISCV_LINUX_SYSROOT /opt/riscv/tools CACHE PATH "RISC-V cross compilation system root") # search path for the cross compile toolchain - -set(CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags") -set(CMAKE_C_FLAGS "" CACHE STRING "c flags") -set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags") -set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags") -set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "executable linker flags") - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv32imac -mabi=ilp32") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv32imac -mabi=ilp32") -#set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") -#set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -march=rv32imac -mabi=ilp32") - -set(COMPILER_IS_RV32 "1") #flags for the CMakeList.txt -#add_definitions(-D_ARM_TEGRA3) # C/C++ preprocessor macro, which will be used in many many files - -set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/${ARCHITECTURE}) - -include_directories(${TOOLCHAIN_DIR}/${ARCHITECTURE}/include) - -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) \ No newline at end of file diff --git a/raven_spn/.cproject b/raven_spn/.cproject deleted file mode 100644 index 1135715..0000000 --- a/raven_spn/.cproject +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - make - - all - true - true - true - - - make - - clean - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/raven_spn/Makefile b/raven_spn/Makefile deleted file mode 100644 index ad85959..0000000 --- a/raven_spn/Makefile +++ /dev/null @@ -1,27 +0,0 @@ - -TARGET = raven_spn -C_SRCS = $(wildcard src/*.c) $(BSP_BASE)/drivers/fe300prci/fe300prci_driver.c $(BSP_BASE)/drivers/plic/plic_driver.c -CXX_SRCS = $(wildcard src/*.cpp) -HEADERS = $(wildcard src/*.h) -CFLAGS = -g -fno-builtin-printf -DUSE_PLIC -I./src -CXXFLAGS = -fno-use-cxa-atexit -LDFLAGS += -g -lstdc++ -fno-use-cxa-atexit -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=medany - - -BOARD=freedom-e300-hifive1 -LINK_TARGET=flash -RISCV_ARCH=rv32imac -RISCV_ABI=ilp32 - -TOOL_DIR=/opt/shared/riscv/tools/Ubuntu/riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-linux-ubuntu14/bin - -BSP_BASE = ./bsp -include $(BSP_BASE)/env/common.mk - -.PHONY: all -all: $(TARGET).dump - -$(TARGET).dump: $(TARGET) - $(TOOL_DIR)/$(TRIPLET)-objdump -d -S -C $< > $@ - - diff --git a/raven_spn/bsp/drivers/clic/clic_driver.c b/raven_spn/bsp/drivers/clic/clic_driver.c deleted file mode 100644 index 0612e58..0000000 --- a/raven_spn/bsp/drivers/clic/clic_driver.c +++ /dev/null @@ -1,163 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/clic.h" -#include "clic/clic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -void volatile_memzero(uint8_t * base, unsigned int size) { - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -// Note that there are no assertions or bounds checking on these -// parameter values. -void clic_init ( - clic_instance_t * this_clic, - uintptr_t hart_addr, - interrupt_function_ptr_t* vect_table, - interrupt_function_ptr_t default_handler, - uint32_t num_irq, - uint32_t num_config_bits - ) -{ - this_clic->hart_addr= hart_addr; - this_clic->vect_table= vect_table; - this_clic->num_config_bits= num_config_bits; - - //initialize vector table - for(int i=0;i++;ivect_table[i] = default_handler; - } - - //set base vectors - write_csr(mtvt, vect_table); - - - //clear all interrupt enables and pending - volatile_memzero((uint8_t*)(this_clic->hart_addr+CLIC_INTIE), num_irq); - volatile_memzero((uint8_t*)(this_clic->hart_addr+CLIC_INTIP), num_irq); - - //clear nlbits and nvbits; all interrupts trap to level 15 - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG)=0; - -} - -void clic_install_handler (clic_instance_t * this_clic, uint32_t source, interrupt_function_ptr_t handler) { - this_clic->vect_table[source] = handler; -} - -void clic_enable_interrupt (clic_instance_t * this_clic, uint32_t source) { - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIE+source) = 1; -} - -void clic_disable_interrupt (clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIE+source) = 0; -} - -void clic_set_pending(clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIP+source) = 1; -} - -void clic_clear_pending(clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIP+source) = 0; -} - -void clic_set_intcfg (clic_instance_t * this_clic, uint32_t source, uint32_t intcfg){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTCFG+source) = intcfg; -} - -uint8_t clic_get_intcfg (clic_instance_t * this_clic, uint32_t source){ - return *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTCFG+source); -} - -void clic_set_cliccfg (clic_instance_t * this_clic, uint32_t cfg){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG) = cfg; -} - -uint8_t clic_get_cliccfg (clic_instance_t * this_clic){ - return *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG); -} - -//sets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_set_int_level( clic_instance_t * this_clic, uint32_t source, uint8_t level) { - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift level right to mask off unused bits - level = level>>((this_clic->num_config_bits)-nlbits); //plus this_clic->nmbits which is always 0 for now. - //shift level into correct bit position - level = level << (8-this_clic->num_config_bits) + (this_clic->num_config_bits - nlbits); - - //write to clicintcfg - uint8_t current_intcfg = clic_get_intcfg(this_clic, source); - clic_set_intcfg(this_clic, source, (current_intcfg | level)); - - return level; -} - -//gets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_get_int_level( clic_instance_t * this_clic, uint32_t source) { - uint8_t level; - level = clic_get_intcfg(this_clic, source); - - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift level - level = level >> (8-(this_clic->num_config_bits)); - - //shift level right to mask off priority bits - level = level>>(this_clic->num_config_bits-nlbits); //this_clic->nmbits which is always 0 for now. - - return level; -} - -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_set_int_priority( clic_instance_t * this_clic, uint32_t source, uint8_t priority) { - //priority bits = num_config_bits - nlbits - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - uint8_t priority_bits = this_clic->num_config_bits-nlbits; - if(priority_bits = 0) { - //no bits to set - return 0; - } - //mask off unused bits - priority = priority >> (8-priority_bits); - //shift into the correct bit position - priority = priority << (8-(this_clic->num_config_bits)); - - //write to clicintcfg - uint8_t current_intcfg = clic_get_intcfg(this_clic, source); - clic_set_intcfg(this_clic, source, (current_intcfg | priority)); - return current_intcfg; -} - -//gets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_get_int_priority( clic_instance_t * this_clic, uint32_t source) { - uint8_t priority; - priority = clic_get_intcfg(this_clic, source); - - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift left to mask off level bits - priority = priority << nlbits; - - //shift priority - priority = priority >> (8-((this_clic->num_config_bits)+nlbits)); - - return priority; -} - - diff --git a/raven_spn/bsp/drivers/clic/clic_driver.h b/raven_spn/bsp/drivers/clic/clic_driver.h deleted file mode 100644 index 27c34c2..0000000 --- a/raven_spn/bsp/drivers/clic/clic_driver.h +++ /dev/null @@ -1,44 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef void (*interrupt_function_ptr_t) (void); - -typedef struct __clic_instance_t -{ - uintptr_t hart_addr; - interrupt_function_ptr_t* vect_table; - uint32_t num_config_bits; - uint32_t num_sources; -} clic_instance_t; - -// Note that there are no assertions or bounds checking on these -// parameter values. -void clic_init (clic_instance_t * this_clic, uintptr_t hart_addr, interrupt_function_ptr_t* vect_table, interrupt_function_ptr_t default_handler, uint32_t num_irq,uint32_t num_config_bits); -void clic_install_handler (clic_instance_t * this_clic, uint32_t source, interrupt_function_ptr_t handler); -void clic_enable_interrupt (clic_instance_t * this_clic, uint32_t source); -void clic_disable_interrupt (clic_instance_t * this_clic, uint32_t source); -void clic_set_pending(clic_instance_t * this_clic, uint32_t source); -void clic_clear_pending(clic_instance_t * this_clic, uint32_t source); -void clic_set_intcfg (clic_instance_t * this_clic, uint32_t source, uint32_t intcfg); -uint8_t clic_get_intcfg (clic_instance_t * this_clic, uint32_t source); -void clic_set_cliccfg (clic_instance_t * this_clic, uint32_t cfg); -uint8_t clic_get_cliccfg (clic_instance_t * this_clic); -//sets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_set_int_level( clic_instance_t * this_clic, uint32_t source, uint8_t level); -//get an interrupt level based encoding of nmbits, nlbits -uint8_t clic_get_int_level( clic_instance_t * this_clic, uint32_t source); -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_set_int_priority( clic_instance_t * this_clic, uint32_t source, uint8_t priority); -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_get_int_priority( clic_instance_t * this_clic, uint32_t source); - -__END_DECLS - -#endif diff --git a/raven_spn/bsp/drivers/fe300prci/fe300prci_driver.c b/raven_spn/bsp/drivers/fe300prci/fe300prci_driver.c deleted file mode 100644 index 8eeaafc..0000000 --- a/raven_spn/bsp/drivers/fe300prci/fe300prci_driver.c +++ /dev/null @@ -1,252 +0,0 @@ -// See LICENSE file for license details - -#include "platform.h" - -#ifdef PRCI_CTRL_ADDR -#include "fe300prci/fe300prci_driver.h" -#include - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq) -{ - - uint32_t start_mtime = CLINT_REG(CLINT_MTIME); - uint32_t end_mtime = start_mtime + mtime_ticks + 1; - - // Make sure we won't get rollover. - while (end_mtime < start_mtime){ - start_mtime = CLINT_REG(CLINT_MTIME); - end_mtime = start_mtime + mtime_ticks + 1; - } - - // Don't start measuring until mtime edge. - uint32_t tmp = start_mtime; - do { - start_mtime = CLINT_REG(CLINT_MTIME); - } while (start_mtime == tmp); - - uint64_t start_mcycle; - rdmcycle(&start_mcycle); - - while (CLINT_REG(CLINT_MTIME) < end_mtime) ; - - uint64_t end_mcycle; - rdmcycle(&end_mcycle); - uint32_t difference = (uint32_t) (end_mcycle - start_mcycle); - - uint64_t freq = ((uint64_t) difference * mtime_freq) / mtime_ticks; - return (uint32_t) freq & 0xFFFFFFFF; - -} - - -void PRCI_use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - // It is OK to change this even if we are running off of it. - - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0); - - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - PRCI_use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if desired. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - - // To overclock, use the hfrosc - if (hfrosctrim >= 0 && hfroscdiv >= 0) { - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - } - - // Set DIV Settings for PLL - - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - if (finaldiv == 1){ - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV(finaldiv-1)); - } - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = CLINT_REG(CLINT_MTIME); - while (CLINT_REG(CLINT_MTIME) - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0); - - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); - - // If we're running off HFXOSC, turn off the HFROSC to - // save power. - if (refsel) { - PRCI_REG(PRCI_HFROSCCFG) &= ~ROSC_EN(1); - } - -} - -void PRCI_use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - PRCI_use_hfrosc(4, 16); -} - -void PRCI_use_hfxosc(uint32_t finaldiv) -{ - - PRCI_use_pll(1, // Use HFXTAL - 1, // Bypass = 1 - 0, // PLL settings don't matter - 0, // PLL settings don't matter - 0, // PLL settings don't matter - finaldiv, - -1, - -1); -} - -// This is a generic function, which -// doesn't span the entire range of HFROSC settings. -// It only adjusts the trim, which can span a hundred MHz or so. -// This function does not check the legality of the PLL settings -// at all, and it is quite possible to configure invalid PLL settings -// this way. -// It returns the actual measured CPU frequency. - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target ) -{ - - uint32_t hfrosctrim = 0; - uint32_t hfroscdiv = 4; - uint32_t prev_trim = 0; - - // In this function we use PLL settings which - // will give us a 32x multiplier from the output - // of the HFROSC source to the output of the - // PLL. We first measure our HFROSC to get the - // right trim, then finally use it as the PLL source. - // We should really check here that the f_cpu - // requested is something in the limit of the PLL. For - // now that is up to the user. - - // This will undershoot for frequencies not divisible by 16. - uint32_t desired_hfrosc_freq = (f_cpu/ 16); - - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - - // Ignore the first run (for icache reasons) - uint32_t cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - uint32_t prev_freq = cpu_freq; - - while ((cpu_freq < desired_hfrosc_freq) && (hfrosctrim < 0x1F)){ - prev_trim = hfrosctrim; - prev_freq = cpu_freq; - hfrosctrim ++; - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - } - - // We couldn't go low enough - if (prev_freq > desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // We couldn't go high enough - if (cpu_freq < desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // Check for over/undershoot - switch(target) { - case(PRCI_FREQ_CLOSEST): - if ((desired_hfrosc_freq - prev_freq) < (cpu_freq - desired_hfrosc_freq)) { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - } else { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - break; - case(PRCI_FREQ_UNDERSHOOT): - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - break; - default: - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - -} - -#endif diff --git a/raven_spn/bsp/drivers/fe300prci/fe300prci_driver.h b/raven_spn/bsp/drivers/fe300prci/fe300prci_driver.h deleted file mode 100644 index 7100f46..0000000 --- a/raven_spn/bsp/drivers/fe300prci/fe300prci_driver.h +++ /dev/null @@ -1,79 +0,0 @@ -// See LICENSE file for license details - -#ifndef _FE300PRCI_DRIVER_H_ -#define _FE300PRCI_DRIVER_H_ - -__BEGIN_DECLS - -#include - -typedef enum prci_freq_target { - - PRCI_FREQ_OVERSHOOT, - PRCI_FREQ_CLOSEST, - PRCI_FREQ_UNDERSHOOT - -} PRCI_freq_target; - -/* Measure and return the approximate frequency of the - * CPU, as given by measuring the mcycle counter against - * the mtime ticks. - */ -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq); - -/* Safely switch over to the HFROSC using the given div - * and trim settings. - */ -void PRCI_use_hfrosc(int div, int trim); - -/* Safely switch over to the 16MHz HFXOSC, - * applying the finaldiv clock divider (1 is the lowest - * legal value). - */ -void PRCI_use_hfxosc(uint32_t finaldiv); - -/* Safely switch over to the PLL using the given - * settings. - * - * Note that not all combinations of the inputs are actually - * legal, and this function does not check for their - * legality ("safely" means that this function won't turn off - * or glitch the clock the CPU is actually running off, but - * doesn't protect against you making it too fast or slow.) - */ - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim); - -/* Use the default clocks configured at reset. - * This is ~16Mhz HFROSC and turns off the LFROSC - * (on the current FE310 Dev Platforms, an external LFROSC is - * used as it is more power efficient). - */ -void PRCI_use_default_clocks(); - -/* This routine will adjust the HFROSC trim - * while using HFROSC as the clock source, - * measure the resulting frequency, then - * use it as the PLL clock source, - * in an attempt to get over, under, or close to the - * requested frequency. It returns the actual measured - * frequency. - * - * Note that the requested frequency must be within the - * range supported by the PLL so not all values are - * achievable with this function, and not all - * are guaranteed to actually work. The PLL - * is rated higher than the hardware. - * - * There is no check on the desired f_cpu frequency, it - * is up to the user to specify something reasonable. - */ - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target); - -__END_DECLS - -#endif - diff --git a/raven_spn/bsp/drivers/plic/plic_driver.c b/raven_spn/bsp/drivers/plic/plic_driver.c deleted file mode 100644 index 4f41bda..0000000 --- a/raven_spn/bsp/drivers/plic/plic_driver.c +++ /dev/null @@ -1,122 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/plic.h" -#include "plic/plic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -// Note that there are no assertions or bounds checking on these -// parameter values. - -void volatile_memzero(uint8_t * base, unsigned int size) -{ - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities, - uint32_t target_hartid - ) -{ - - this_plic->base_addr = base_addr; - this_plic->num_sources = num_sources; - this_plic->num_priorities = num_priorities; - this_plic->target_hartid = target_hartid; - - // Disable all interrupts (don't assume that these registers are reset). - volatile_memzero((uint8_t*) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET)), - (num_sources + 8) / 8); - - // Set all priorities to 0 (equal priority -- don't assume that these are reset). - volatile_memzero ((uint8_t *)(this_plic->base_addr + - PLIC_PRIORITY_OFFSET), - (num_sources + 1) << PLIC_PRIORITY_SHIFT_PER_SOURCE); - - // Set the threshold to 0. - volatile plic_threshold* threshold = (plic_threshold*) - (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (this_plic->target_hartid << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold = 0; - -} - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold){ - - volatile plic_threshold* threshold_ptr = (plic_threshold*) (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (this_plic->target_hartid << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold_ptr = threshold; - -} - - -void PLIC_enable_interrupt (plic_instance_t * this_plic, plic_source source){ - - volatile uint8_t * current_ptr = (volatile uint8_t *)(this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current | ( 1 << (source & 0x7)); - *current_ptr = current; - -} - -void PLIC_disable_interrupt (plic_instance_t * this_plic, plic_source source){ - - volatile uint8_t * current_ptr = (volatile uint8_t *) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (this_plic->target_hartid << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current & ~(( 1 << (source & 0x7))); - *current_ptr = current; - -} - -void PLIC_set_priority (plic_instance_t * this_plic, plic_source source, plic_priority priority){ - - if (this_plic->num_priorities > 0) { - volatile plic_priority * priority_ptr = (volatile plic_priority *) - (this_plic->base_addr + - PLIC_PRIORITY_OFFSET + - (source << PLIC_PRIORITY_SHIFT_PER_SOURCE)); - *priority_ptr = priority; - } -} - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic){ - - volatile plic_source * claim_addr = (volatile plic_source * ) - (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (this_plic->target_hartid << PLIC_CLAIM_SHIFT_PER_TARGET)); - - return *claim_addr; - -} - -void PLIC_complete_interrupt(plic_instance_t * this_plic, plic_source source){ - - volatile plic_source * claim_addr = (volatile plic_source *) (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (this_plic->target_hartid << PLIC_CLAIM_SHIFT_PER_TARGET)); - *claim_addr = source; - -} - diff --git a/raven_spn/bsp/drivers/plic/plic_driver.h b/raven_spn/bsp/drivers/plic/plic_driver.h deleted file mode 100644 index f7201ee..0000000 --- a/raven_spn/bsp/drivers/plic/plic_driver.h +++ /dev/null @@ -1,52 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef struct __plic_instance_t -{ - uintptr_t base_addr; - - uint32_t num_sources; - uint32_t num_priorities; - uint32_t target_hartid; -} plic_instance_t; - -typedef uint32_t plic_source; -typedef uint32_t plic_priority; -typedef uint32_t plic_threshold; - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities, - uint32_t target_hartid - ); - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold); - -void PLIC_enable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_disable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_set_priority (plic_instance_t * this_plic, - plic_source source, - plic_priority priority); - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic); - -void PLIC_complete_interrupt(plic_instance_t * this_plic, - plic_source source); - -__END_DECLS - -#endif diff --git a/raven_spn/bsp/env/common.mk b/raven_spn/bsp/env/common.mk deleted file mode 100644 index 0ca2c70..0000000 --- a/raven_spn/bsp/env/common.mk +++ /dev/null @@ -1,66 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_COMMON -_SIFIVE_MK_COMMON := # defined - -.PHONY: all -all: $(TARGET) - -include $(BSP_BASE)/libwrap/libwrap.mk - -ENV_DIR = $(BSP_BASE)/env -PLATFORM_DIR = $(ENV_DIR)/$(BOARD) - -ASM_SRCS += $(ENV_DIR)/start.S -ASM_SRCS += $(ENV_DIR)/entry.S -C_SRCS += $(PLATFORM_DIR)/init.c - -LINKER_SCRIPT := $(PLATFORM_DIR)/$(LINK_TARGET).lds - -INCLUDES += -I$(BSP_BASE)/include -INCLUDES += -I$(BSP_BASE)/drivers/ -INCLUDES += -I$(ENV_DIR) -INCLUDES += -I$(PLATFORM_DIR) - -TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin - -LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles -LDFLAGS += -L$(ENV_DIR) --specs=nano.specs - -ASM_OBJS := $(ASM_SRCS:.S=.o) -C_OBJS := $(C_SRCS:.c=.o) -CXX_OBJS := $(CXX_SRCS:.cpp=.o) - -LINK_OBJS += $(ASM_OBJS) $(C_OBJS) $(CXX_OBJS) -LINK_DEPS += $(LINKER_SCRIPT) - -CLEAN_OBJS += $(TARGET) $(LINK_OBJS) - -CFLAGS += -march=$(RISCV_ARCH) -CFLAGS += -mabi=$(RISCV_ABI) -CFLAGS += -mcmodel=medany - -TRIPLET?=riscv64-unknown-elf -CXX=$(TOOL_DIR)/$(TRIPLET)-c++ -CC=$(TOOL_DIR)/$(TRIPLET)-gcc -LD=$(TOOL_DIR)/$(TRIPLET)-gcc -AR=$(TOOL_DIR)/$(TRIPLET)-ar - - -$(TARGET): $(LINK_OBJS) $(LINK_DEPS) - $(LD) $(LINK_OBJS) $(LDFLAGS) $(LIBWRAP) -o $@ - -$(ASM_OBJS): %.o: %.S $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(C_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -$(CXX_OBJS): %.o: %.cpp $(HEADERS) - $(CXX) $(CFLAGS) $(CXXFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -.PHONY: clean -clean: - rm -f $(CLEAN_OBJS) $(LIBWRAP) - -endif # _SIFIVE_MK_COMMON diff --git a/raven_spn/bsp/env/coreip-e2-arty/flash.lds b/raven_spn/bsp/env/coreip-e2-arty/flash.lds deleted file mode 100644 index 2d5eb01..0000000 --- a/raven_spn/bsp/env/coreip-e2-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreip-e2-arty/init.c b/raven_spn/bsp/env/coreip-e2-arty/init.c deleted file mode 100644 index 3a4c77c..0000000 --- a/raven_spn/bsp/env/coreip-e2-arty/init.c +++ /dev/null @@ -1,98 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 32000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -extern int main(int argc, char** argv); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() ) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -typedef void (*interrupt_function_ptr_t) (void); -interrupt_function_ptr_t localISR[CLIC_NUM_INTERRUPTS] __attribute__((aligned(64))); - - -void trap_entry(void) __attribute__((interrupt, aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); - } else { - while(1); - } -} - -#ifdef CLIC_DIRECT -#else -void default_handler(void)__attribute__((interrupt));; -#endif -void default_handler(void) -{ - puts("default handler\n"); - while(1); -} - -void _init() -{ -#ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -//initialize vector table - int i=0; - while(iflash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreip-e2-arty/tim.lds b/raven_spn/bsp/env/coreip-e2-arty/tim.lds deleted file mode 100644 index 7dfb36b..0000000 --- a/raven_spn/bsp/env/coreip-e2-arty/tim.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreplexip-arty.h b/raven_spn/bsp/env/coreplexip-arty.h deleted file mode 100644 index eedcaa5..0000000 --- a/raven_spn/bsp/env/coreplexip-arty.h +++ /dev/null @@ -1,102 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_COREPLEXIP_ARTY_H -#define _SIFIVE_COREPLEXIP_ARTY_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the directly driven -// RGB LEDs on the Freedom Exx Coreplex IP Evaluation Arty FPGA Dev Kit. -// Additional RGB LEDs are driven by the 3 PWM outputs. - -#define RED_LED_OFFSET 0 -#define GREEN_LED_OFFSET 1 -#define BLUE_LED_OFFSET 2 - -// Switch 3 is used as a GPIO input. (Switch 0 is used to set -// the reset vector, the other switches are unused). - -#define SW_3_OFFSET 3 - -// These are the buttons which are mapped as inputs. - -#define HAS_BOARD_BUTTONS - -#define BUTTON_0_OFFSET 4 -#define BUTTON_1_OFFSET 5 -#define BUTTON_2_OFFSET 6 -#define BUTTON_3_OFFSET 7 - -// These are the bit offsets for the different GPIO pins -// mapped onto the PMOD A header. - -#define JA_0_OFFSET 8 -#define JA_1_OFFSET 9 -#define JA_2_OFFSET 10 -#define JA_3_OFFSET 11 -#define JA_4_OFFSET 12 -#define JA_5_OFFSET 13 -#define JA_6_OFFSET 14 -#define JA_7_OFFSET 15 - -// The below gives a mapping between global interrupt -// sources and their number. Note that on the coreplex -// deliverable, the io_global_interrupts go directly into -// the PLIC. The evaluation image on the FPGA mimics a -// system with peripheral devices which are driving the -// global interrupt lines. -// So, on this image, in order to get an interrupt from -// e.g. pressing BUTTON_0: -// 1) Steps which are external to the delivery coreplex: -// a) The corresponding GPIO pin must be configured as in input -// b) The "interrupt on fall" bit must be set for the GPIO pin -// 2) Steps which would also need to be performed for the delivery coreplex: -// a) The corresponding global interrupt, priority, and threshold must be configured in the PLIC. -// b) The external interrupt bit must be enabled in MSTATUS -// c) Interrupts must be enabled globally in the core. - -// Any of the above GPIO pins can be used as global interrupt -// sources by adding their offset to the INT_GPIO_BASE. -// For example, the buttons are shown here: - -#define INT_DEVICE_BUTTON_0 (GPIO_INT_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (GPIO_INT_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (GPIO_INT_BASE + BUTTON_2_OFFSET) -#define INT_DEVICE_BUTTON_3 (GPIO_INT_BASE + BUTTON_3_OFFSET) - -// In addition, the Switches are mapped directly to -// the PLIC (without going through the GPIO Peripheral). - -#define INT_EXT_DEVICE_SW_0 (EXTERNAL_INT_BASE + 0) -#define INT_EXT_DEVICE_SW_1 (EXTERNAL_INT_BASE + 1) -#define INT_EXT_DEVICE_SW_2 (EXTERNAL_INT_BASE + 2) -#define INT_EXT_DEVICE_SW_3 (EXTERNAL_INT_BASE + 3) - -// This gives the mapping from inputs to LOCAL interrupts. - -#define LOCAL_INT_SW_0 0 -#define LOCAL_INT_SW_1 1 -#define LOCAL_INT_SW_2 2 -#define LOCAL_INT_SW_3 3 -#define LOCAL_INT_BTN_0 4 -#define LOCAL_INT_BTN_1 5 -#define LOCAL_INT_BTN_2 6 -#define LOCAL_INT_BTN_3 7 -#define LOCAL_INT_JA_0 8 -#define LOCAL_INT_JA_1 9 -#define LOCAL_INT_JA_2 10 -#define LOCAL_INT_JA_3 11 -#define LOCAL_INT_JA_4 12 -#define LOCAL_INT_JA_5 13 -#define LOCAL_INT_JA_6 14 -#define LOCAL_INT_JA_7 15 - -#define RTC_FREQ 32768 - -void write_hex(int fd, unsigned long int hex); - -#endif /* _SIFIVE_COREPLEXIP_ARTY_H */ diff --git a/raven_spn/bsp/env/coreplexip-e31-arty/dhrystone.lds b/raven_spn/bsp/env/coreplexip-e31-arty/dhrystone.lds deleted file mode 100644 index 8f6527b..0000000 --- a/raven_spn/bsp/env/coreplexip-e31-arty/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreplexip-e31-arty/flash.lds b/raven_spn/bsp/env/coreplexip-e31-arty/flash.lds deleted file mode 100644 index 590c5b6..0000000 --- a/raven_spn/bsp/env/coreplexip-e31-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreplexip-e31-arty/init.c b/raven_spn/bsp/env/coreplexip-e31-arty/init.c deleted file mode 100644 index 1f8b679..0000000 --- a/raven_spn/bsp/env/coreplexip-e31-arty/init.c +++ /dev/null @@ -1,122 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 65000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -#ifndef VECT_IRQ - #define TRAP_ENTRY trap_entry -#else - #define TRAP_ENTRY vtrap_entry -#endif - -extern int main(int argc, char** argv); -extern void TRAP_ENTRY(); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() / 2) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -#ifdef USE_LOCAL_ISR -typedef void (*my_interrupt_function_ptr_t) (void); -extern my_interrupt_function_ptr_t localISR[]; -#endif - -#ifndef VECT_IRQ -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) __attribute__((noinline)); -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif -#ifdef USE_LOCAL_ISR - } else if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} -#endif - -#ifdef USE_CLIC -void trap_entry(void) __attribute__((interrupt("SiFive-CLIC-preemptible"), aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - handle_trap(mcause, mepc); -} -#endif - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -#ifdef USE_CLIC - write_csr(mtvec, ((unsigned long)&trap_entry | MTVEC_CLIC)); -#else - write_csr(mtvec, ((unsigned long)&TRAP_ENTRY | MTVEC_VECTORED)); -#endif - - #endif -} - -void _fini() -{ -} diff --git a/raven_spn/bsp/env/coreplexip-e31-arty/openocd.cfg b/raven_spn/bsp/env/coreplexip-e31-arty/openocd.cfg deleted file mode 100644 index 0481a72..0000000 --- a/raven_spn/bsp/env/coreplexip-e31-arty/openocd.cfg +++ /dev/null @@ -1,31 +0,0 @@ -# JTAG adapter setup -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001 - -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -# Un-comment these two flash lines if you have a SPI flash and want to write -# it. -flash bank spi0 fespi 0x40000000 0 0 0 $_TARGETNAME.0 0x20004000 -init -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off -echo "Ready for Remote Connections" diff --git a/raven_spn/bsp/env/coreplexip-e31-arty/platform.h b/raven_spn/bsp/env/coreplexip-e31-arty/platform.h deleted file mode 100644 index 6fa79ea..0000000 --- a/raven_spn/bsp/env/coreplexip-e31-arty/platform.h +++ /dev/null @@ -1,100 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h - -#if __riscv_xlen == 32 -#define MCAUSE_INT 0x80000000UL -#define MCAUSE_CAUSE 0x000003FFUL -#else -#define MCAUSE_INT 0x8000000000000000UL -#define MCAUSE_CAUSE 0x00000000000003FFUL -#endif - -#ifdef VECT_IRQ - #define MTVEC_VECTORED 0x01 -#else - #define MTVEC_VECTORED 0x00 -#endif -#define MTVEC_CLIC 0x02 -#define IRQ_M_LOCAL 16 -#define MIP_MLIP(x) (1 << (IRQ_M_LOCAL + x)) - -#include "sifive/const.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define GPIO_CTRL_ADDR _AC(0x20002000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define PWM0_CTRL_ADDR _AC(0x20005000,UL) -#define RAM_MEM_ADDR _AC(0x80000000,UL) -#define RAM_MEM_SIZE _AC(0x10000,UL) -#define SPI0_CTRL_ADDR _AC(0x20004000,UL) -#define SPI0_MEM_ADDR _AC(0x40000000,UL) -#define SPI0_MEM_SIZE _AC(0x20000000,UL) -#define TESTBENCH_MEM_ADDR _AC(0x20000000,UL) -#define TESTBENCH_MEM_SIZE _AC(0x10000000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define UART0_CTRL_ADDR _AC(0x20000000,UL) - -// IOF masks - -// Interrupt numbers -#define RESERVED_INT_BASE 0 -#define UART0_INT_BASE 1 -#define EXTERNAL_INT_BASE 2 -#define SPI0_INT_BASE 6 -#define GPIO_INT_BASE 7 -#define PWM0_INT_BASE 23 - -// Helper functions -#define _REG64(p, i) (*(volatile uint64_t *)((p) + (i))) -#define _REG32(p, i) (*(volatile uint32_t *)((p) + (i))) -#define _REG16(p, i) (*(volatile uint16_t *)((p) + (i))) -// Bulk set bits in `reg` to either 0 or 1. -// E.g. SET_BITS(MY_REG, 0x00000007, 0) would generate MY_REG &= ~0x7 -// E.g. SET_BITS(MY_REG, 0x00000007, 1) would generate MY_REG |= 0x7 -#define SET_BITS(reg, mask, value) if ((value) == 0) { (reg) &= ~(mask); } else { (reg) |= (mask); } -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG(offset) _REG32(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define CLINT_REG64(offset) _REG64(CLINT_CTRL_ADDR, offset) -#define GPIO_REG64(offset) _REG64(GPIO_CTRL_ADDR, offset) -#define PLIC_REG64(offset) _REG64(PLIC_CTRL_ADDR, offset) -#define PWM0_REG64(offset) _REG64(PWM0_CTRL_ADDR, offset) -#define SPI0_REG64(offset) _REG64(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG64(offset) _REG64(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG64(offset) _REG64(UART0_CTRL_ADDR, offset) - -// Misc - -#define NUM_GPIO 16 - -#define PLIC_NUM_INTERRUPTS 28 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS - -#include "coreplexip-arty.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/raven_spn/bsp/env/coreplexip-e31-arty/scratchpad.lds b/raven_spn/bsp/env/coreplexip-e31-arty/scratchpad.lds deleted file mode 100644 index 7887c13..0000000 --- a/raven_spn/bsp/env/coreplexip-e31-arty/scratchpad.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreplexip-e31-arty/settings.mk b/raven_spn/bsp/env/coreplexip-e31-arty/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/raven_spn/bsp/env/coreplexip-e31-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/raven_spn/bsp/env/coreplexip-e51-arty/dhrystone.lds b/raven_spn/bsp/env/coreplexip-e51-arty/dhrystone.lds deleted file mode 100644 index 8f6527b..0000000 --- a/raven_spn/bsp/env/coreplexip-e51-arty/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreplexip-e51-arty/flash.lds b/raven_spn/bsp/env/coreplexip-e51-arty/flash.lds deleted file mode 100644 index 590c5b6..0000000 --- a/raven_spn/bsp/env/coreplexip-e51-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreplexip-e51-arty/init.c b/raven_spn/bsp/env/coreplexip-e51-arty/init.c deleted file mode 100644 index 1f8b679..0000000 --- a/raven_spn/bsp/env/coreplexip-e51-arty/init.c +++ /dev/null @@ -1,122 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 65000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -#ifndef VECT_IRQ - #define TRAP_ENTRY trap_entry -#else - #define TRAP_ENTRY vtrap_entry -#endif - -extern int main(int argc, char** argv); -extern void TRAP_ENTRY(); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() / 2) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -#ifdef USE_LOCAL_ISR -typedef void (*my_interrupt_function_ptr_t) (void); -extern my_interrupt_function_ptr_t localISR[]; -#endif - -#ifndef VECT_IRQ -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) __attribute__((noinline)); -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif -#ifdef USE_LOCAL_ISR - } else if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} -#endif - -#ifdef USE_CLIC -void trap_entry(void) __attribute__((interrupt("SiFive-CLIC-preemptible"), aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - handle_trap(mcause, mepc); -} -#endif - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -#ifdef USE_CLIC - write_csr(mtvec, ((unsigned long)&trap_entry | MTVEC_CLIC)); -#else - write_csr(mtvec, ((unsigned long)&TRAP_ENTRY | MTVEC_VECTORED)); -#endif - - #endif -} - -void _fini() -{ -} diff --git a/raven_spn/bsp/env/coreplexip-e51-arty/openocd.cfg b/raven_spn/bsp/env/coreplexip-e51-arty/openocd.cfg deleted file mode 100644 index 0481a72..0000000 --- a/raven_spn/bsp/env/coreplexip-e51-arty/openocd.cfg +++ /dev/null @@ -1,31 +0,0 @@ -# JTAG adapter setup -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001 - -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -# Un-comment these two flash lines if you have a SPI flash and want to write -# it. -flash bank spi0 fespi 0x40000000 0 0 0 $_TARGETNAME.0 0x20004000 -init -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off -echo "Ready for Remote Connections" diff --git a/raven_spn/bsp/env/coreplexip-e51-arty/platform.h b/raven_spn/bsp/env/coreplexip-e51-arty/platform.h deleted file mode 100644 index 6fa79ea..0000000 --- a/raven_spn/bsp/env/coreplexip-e51-arty/platform.h +++ /dev/null @@ -1,100 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h - -#if __riscv_xlen == 32 -#define MCAUSE_INT 0x80000000UL -#define MCAUSE_CAUSE 0x000003FFUL -#else -#define MCAUSE_INT 0x8000000000000000UL -#define MCAUSE_CAUSE 0x00000000000003FFUL -#endif - -#ifdef VECT_IRQ - #define MTVEC_VECTORED 0x01 -#else - #define MTVEC_VECTORED 0x00 -#endif -#define MTVEC_CLIC 0x02 -#define IRQ_M_LOCAL 16 -#define MIP_MLIP(x) (1 << (IRQ_M_LOCAL + x)) - -#include "sifive/const.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define GPIO_CTRL_ADDR _AC(0x20002000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define PWM0_CTRL_ADDR _AC(0x20005000,UL) -#define RAM_MEM_ADDR _AC(0x80000000,UL) -#define RAM_MEM_SIZE _AC(0x10000,UL) -#define SPI0_CTRL_ADDR _AC(0x20004000,UL) -#define SPI0_MEM_ADDR _AC(0x40000000,UL) -#define SPI0_MEM_SIZE _AC(0x20000000,UL) -#define TESTBENCH_MEM_ADDR _AC(0x20000000,UL) -#define TESTBENCH_MEM_SIZE _AC(0x10000000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define UART0_CTRL_ADDR _AC(0x20000000,UL) - -// IOF masks - -// Interrupt numbers -#define RESERVED_INT_BASE 0 -#define UART0_INT_BASE 1 -#define EXTERNAL_INT_BASE 2 -#define SPI0_INT_BASE 6 -#define GPIO_INT_BASE 7 -#define PWM0_INT_BASE 23 - -// Helper functions -#define _REG64(p, i) (*(volatile uint64_t *)((p) + (i))) -#define _REG32(p, i) (*(volatile uint32_t *)((p) + (i))) -#define _REG16(p, i) (*(volatile uint16_t *)((p) + (i))) -// Bulk set bits in `reg` to either 0 or 1. -// E.g. SET_BITS(MY_REG, 0x00000007, 0) would generate MY_REG &= ~0x7 -// E.g. SET_BITS(MY_REG, 0x00000007, 1) would generate MY_REG |= 0x7 -#define SET_BITS(reg, mask, value) if ((value) == 0) { (reg) &= ~(mask); } else { (reg) |= (mask); } -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG(offset) _REG32(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define CLINT_REG64(offset) _REG64(CLINT_CTRL_ADDR, offset) -#define GPIO_REG64(offset) _REG64(GPIO_CTRL_ADDR, offset) -#define PLIC_REG64(offset) _REG64(PLIC_CTRL_ADDR, offset) -#define PWM0_REG64(offset) _REG64(PWM0_CTRL_ADDR, offset) -#define SPI0_REG64(offset) _REG64(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG64(offset) _REG64(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG64(offset) _REG64(UART0_CTRL_ADDR, offset) - -// Misc - -#define NUM_GPIO 16 - -#define PLIC_NUM_INTERRUPTS 28 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS - -#include "coreplexip-arty.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/raven_spn/bsp/env/coreplexip-e51-arty/scratchpad.lds b/raven_spn/bsp/env/coreplexip-e51-arty/scratchpad.lds deleted file mode 100644 index 7887c13..0000000 --- a/raven_spn/bsp/env/coreplexip-e51-arty/scratchpad.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/coreplexip-e51-arty/settings.mk b/raven_spn/bsp/env/coreplexip-e51-arty/settings.mk deleted file mode 100644 index 96aea84..0000000 --- a/raven_spn/bsp/env/coreplexip-e51-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv64imac -RISCV_ABI := lp64 diff --git a/raven_spn/bsp/env/encoding.h b/raven_spn/bsp/env/encoding.h deleted file mode 100644 index 35e0f9f..0000000 --- a/raven_spn/bsp/env/encoding.h +++ /dev/null @@ -1,1313 +0,0 @@ -// See LICENSE for license details. - -#ifndef RISCV_CSR_ENCODING_H -#define RISCV_CSR_ENCODING_H - -#define MSTATUS_UIE 0x00000001 -#define MSTATUS_SIE 0x00000002 -#define MSTATUS_HIE 0x00000004 -#define MSTATUS_MIE 0x00000008 -#define MSTATUS_UPIE 0x00000010 -#define MSTATUS_SPIE 0x00000020 -#define MSTATUS_HPIE 0x00000040 -#define MSTATUS_MPIE 0x00000080 -#define MSTATUS_SPP 0x00000100 -#define MSTATUS_HPP 0x00000600 -#define MSTATUS_MPP 0x00001800 -#define MSTATUS_FS 0x00006000 -#define MSTATUS_XS 0x00018000 -#define MSTATUS_MPRV 0x00020000 -#define MSTATUS_PUM 0x00040000 -#define MSTATUS_MXR 0x00080000 -#define MSTATUS_VM 0x1F000000 -#define MSTATUS32_SD 0x80000000 -#define MSTATUS64_SD 0x8000000000000000 - -#define SSTATUS_UIE 0x00000001 -#define SSTATUS_SIE 0x00000002 -#define SSTATUS_UPIE 0x00000010 -#define SSTATUS_SPIE 0x00000020 -#define SSTATUS_SPP 0x00000100 -#define SSTATUS_FS 0x00006000 -#define SSTATUS_XS 0x00018000 -#define SSTATUS_PUM 0x00040000 -#define SSTATUS32_SD 0x80000000 -#define SSTATUS64_SD 0x8000000000000000 - -#define DCSR_XDEBUGVER (3U<<30) -#define DCSR_NDRESET (1<<29) -#define DCSR_FULLRESET (1<<28) -#define DCSR_EBREAKM (1<<15) -#define DCSR_EBREAKH (1<<14) -#define DCSR_EBREAKS (1<<13) -#define DCSR_EBREAKU (1<<12) -#define DCSR_STOPCYCLE (1<<10) -#define DCSR_STOPTIME (1<<9) -#define DCSR_CAUSE (7<<6) -#define DCSR_DEBUGINT (1<<5) -#define DCSR_HALT (1<<3) -#define DCSR_STEP (1<<2) -#define DCSR_PRV (3<<0) - -#define DCSR_CAUSE_NONE 0 -#define DCSR_CAUSE_SWBP 1 -#define DCSR_CAUSE_HWBP 2 -#define DCSR_CAUSE_DEBUGINT 3 -#define DCSR_CAUSE_STEP 4 -#define DCSR_CAUSE_HALT 5 - -#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) -#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) -#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) - -#define MCONTROL_SELECT (1<<19) -#define MCONTROL_TIMING (1<<18) -#define MCONTROL_ACTION (0x3f<<12) -#define MCONTROL_CHAIN (1<<11) -#define MCONTROL_MATCH (0xf<<7) -#define MCONTROL_M (1<<6) -#define MCONTROL_H (1<<5) -#define MCONTROL_S (1<<4) -#define MCONTROL_U (1<<3) -#define MCONTROL_EXECUTE (1<<2) -#define MCONTROL_STORE (1<<1) -#define MCONTROL_LOAD (1<<0) - -#define MCONTROL_TYPE_NONE 0 -#define MCONTROL_TYPE_MATCH 2 - -#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 -#define MCONTROL_ACTION_DEBUG_MODE 1 -#define MCONTROL_ACTION_TRACE_START 2 -#define MCONTROL_ACTION_TRACE_STOP 3 -#define MCONTROL_ACTION_TRACE_EMIT 4 - -#define MCONTROL_MATCH_EQUAL 0 -#define MCONTROL_MATCH_NAPOT 1 -#define MCONTROL_MATCH_GE 2 -#define MCONTROL_MATCH_LT 3 -#define MCONTROL_MATCH_MASK_LOW 4 -#define MCONTROL_MATCH_MASK_HIGH 5 - -#define MIP_SSIP (1 << IRQ_S_SOFT) -#define MIP_HSIP (1 << IRQ_H_SOFT) -#define MIP_MSIP (1 << IRQ_M_SOFT) -#define MIP_STIP (1 << IRQ_S_TIMER) -#define MIP_HTIP (1 << IRQ_H_TIMER) -#define MIP_MTIP (1 << IRQ_M_TIMER) -#define MIP_SEIP (1 << IRQ_S_EXT) -#define MIP_HEIP (1 << IRQ_H_EXT) -#define MIP_MEIP (1 << IRQ_M_EXT) - -#define SIP_SSIP MIP_SSIP -#define SIP_STIP MIP_STIP - -#define PRV_U 0 -#define PRV_S 1 -#define PRV_H 2 -#define PRV_M 3 - -#define VM_MBARE 0 -#define VM_MBB 1 -#define VM_MBBID 2 -#define VM_SV32 8 -#define VM_SV39 9 -#define VM_SV48 10 - -#define IRQ_S_SOFT 1 -#define IRQ_H_SOFT 2 -#define IRQ_M_SOFT 3 -#define IRQ_S_TIMER 5 -#define IRQ_H_TIMER 6 -#define IRQ_M_TIMER 7 -#define IRQ_S_EXT 9 -#define IRQ_H_EXT 10 -#define IRQ_M_EXT 11 -#define IRQ_COP 12 -#define IRQ_HOST 13 - -#define DEFAULT_RSTVEC 0x00001000 -#define DEFAULT_NMIVEC 0x00001004 -#define DEFAULT_MTVEC 0x00001010 -#define CONFIG_STRING_ADDR 0x0000100C -#define EXT_IO_BASE 0x40000000 -#define DRAM_BASE 0x80000000 - -// page table entry (PTE) fields -#define PTE_V 0x001 // Valid -#define PTE_R 0x002 // Read -#define PTE_W 0x004 // Write -#define PTE_X 0x008 // Execute -#define PTE_U 0x010 // User -#define PTE_G 0x020 // Global -#define PTE_A 0x040 // Accessed -#define PTE_D 0x080 // Dirty -#define PTE_SOFT 0x300 // Reserved for Software - -#define PTE_PPN_SHIFT 10 - -#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) - -#ifdef __riscv - -#ifdef __riscv64 -# define MSTATUS_SD MSTATUS64_SD -# define SSTATUS_SD SSTATUS64_SD -# define RISCV_PGLEVEL_BITS 9 -#else -# define MSTATUS_SD MSTATUS32_SD -# define SSTATUS_SD SSTATUS32_SD -# define RISCV_PGLEVEL_BITS 10 -#endif -#define RISCV_PGSHIFT 12 -#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) - -#ifndef __ASSEMBLER__ - -#ifdef __GNUC__ - -#define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - -#define write_csr(reg, val) ({ \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrw " #reg ", %0" :: "i"(val)); \ - else \ - asm volatile ("csrw " #reg ", %0" :: "r"(val)); }) - -#define swap_csr(reg, val) ({ unsigned long __tmp; \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \ - else \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \ - __tmp; }) - -#define set_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ - __tmp; }) - -#define clear_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ - __tmp; }) - -#define rdtime() read_csr(time) -#define rdcycle() read_csr(cycle) -#define rdinstret() read_csr(instret) - -#endif - -#endif - -#endif - -#endif -/* Automatically generated by parse-opcodes */ -#ifndef RISCV_ENCODING_H -#define RISCV_ENCODING_H -#define MATCH_BEQ 0x63 -#define MASK_BEQ 0x707f -#define MATCH_BNE 0x1063 -#define MASK_BNE 0x707f -#define MATCH_BLT 0x4063 -#define MASK_BLT 0x707f -#define MATCH_BGE 0x5063 -#define MASK_BGE 0x707f -#define MATCH_BLTU 0x6063 -#define MASK_BLTU 0x707f -#define MATCH_BGEU 0x7063 -#define MASK_BGEU 0x707f -#define MATCH_JALR 0x67 -#define MASK_JALR 0x707f -#define MATCH_JAL 0x6f -#define MASK_JAL 0x7f -#define MATCH_LUI 0x37 -#define MASK_LUI 0x7f -#define MATCH_AUIPC 0x17 -#define MASK_AUIPC 0x7f -#define MATCH_ADDI 0x13 -#define MASK_ADDI 0x707f -#define MATCH_SLLI 0x1013 -#define MASK_SLLI 0xfc00707f -#define MATCH_SLTI 0x2013 -#define MASK_SLTI 0x707f -#define MATCH_SLTIU 0x3013 -#define MASK_SLTIU 0x707f -#define MATCH_XORI 0x4013 -#define MASK_XORI 0x707f -#define MATCH_SRLI 0x5013 -#define MASK_SRLI 0xfc00707f -#define MATCH_SRAI 0x40005013 -#define MASK_SRAI 0xfc00707f -#define MATCH_ORI 0x6013 -#define MASK_ORI 0x707f -#define MATCH_ANDI 0x7013 -#define MASK_ANDI 0x707f -#define MATCH_ADD 0x33 -#define MASK_ADD 0xfe00707f -#define MATCH_SUB 0x40000033 -#define MASK_SUB 0xfe00707f -#define MATCH_SLL 0x1033 -#define MASK_SLL 0xfe00707f -#define MATCH_SLT 0x2033 -#define MASK_SLT 0xfe00707f -#define MATCH_SLTU 0x3033 -#define MASK_SLTU 0xfe00707f -#define MATCH_XOR 0x4033 -#define MASK_XOR 0xfe00707f -#define MATCH_SRL 0x5033 -#define MASK_SRL 0xfe00707f -#define MATCH_SRA 0x40005033 -#define MASK_SRA 0xfe00707f -#define MATCH_OR 0x6033 -#define MASK_OR 0xfe00707f -#define MATCH_AND 0x7033 -#define MASK_AND 0xfe00707f -#define MATCH_ADDIW 0x1b -#define MASK_ADDIW 0x707f -#define MATCH_SLLIW 0x101b -#define MASK_SLLIW 0xfe00707f -#define MATCH_SRLIW 0x501b -#define MASK_SRLIW 0xfe00707f -#define MATCH_SRAIW 0x4000501b -#define MASK_SRAIW 0xfe00707f -#define MATCH_ADDW 0x3b -#define MASK_ADDW 0xfe00707f -#define MATCH_SUBW 0x4000003b -#define MASK_SUBW 0xfe00707f -#define MATCH_SLLW 0x103b -#define MASK_SLLW 0xfe00707f -#define MATCH_SRLW 0x503b -#define MASK_SRLW 0xfe00707f -#define MATCH_SRAW 0x4000503b -#define MASK_SRAW 0xfe00707f -#define MATCH_LB 0x3 -#define MASK_LB 0x707f -#define MATCH_LH 0x1003 -#define MASK_LH 0x707f -#define MATCH_LW 0x2003 -#define MASK_LW 0x707f -#define MATCH_LD 0x3003 -#define MASK_LD 0x707f -#define MATCH_LBU 0x4003 -#define MASK_LBU 0x707f -#define MATCH_LHU 0x5003 -#define MASK_LHU 0x707f -#define MATCH_LWU 0x6003 -#define MASK_LWU 0x707f -#define MATCH_SB 0x23 -#define MASK_SB 0x707f -#define MATCH_SH 0x1023 -#define MASK_SH 0x707f -#define MATCH_SW 0x2023 -#define MASK_SW 0x707f -#define MATCH_SD 0x3023 -#define MASK_SD 0x707f -#define MATCH_FENCE 0xf -#define MASK_FENCE 0x707f -#define MATCH_FENCE_I 0x100f -#define MASK_FENCE_I 0x707f -#define MATCH_MUL 0x2000033 -#define MASK_MUL 0xfe00707f -#define MATCH_MULH 0x2001033 -#define MASK_MULH 0xfe00707f -#define MATCH_MULHSU 0x2002033 -#define MASK_MULHSU 0xfe00707f -#define MATCH_MULHU 0x2003033 -#define MASK_MULHU 0xfe00707f -#define MATCH_DIV 0x2004033 -#define MASK_DIV 0xfe00707f -#define MATCH_DIVU 0x2005033 -#define MASK_DIVU 0xfe00707f -#define MATCH_REM 0x2006033 -#define MASK_REM 0xfe00707f -#define MATCH_REMU 0x2007033 -#define MASK_REMU 0xfe00707f -#define MATCH_MULW 0x200003b -#define MASK_MULW 0xfe00707f -#define MATCH_DIVW 0x200403b -#define MASK_DIVW 0xfe00707f -#define MATCH_DIVUW 0x200503b -#define MASK_DIVUW 0xfe00707f -#define MATCH_REMW 0x200603b -#define MASK_REMW 0xfe00707f -#define MATCH_REMUW 0x200703b -#define MASK_REMUW 0xfe00707f -#define MATCH_AMOADD_W 0x202f -#define MASK_AMOADD_W 0xf800707f -#define MATCH_AMOXOR_W 0x2000202f -#define MASK_AMOXOR_W 0xf800707f -#define MATCH_AMOOR_W 0x4000202f -#define MASK_AMOOR_W 0xf800707f -#define MATCH_AMOAND_W 0x6000202f -#define MASK_AMOAND_W 0xf800707f -#define MATCH_AMOMIN_W 0x8000202f -#define MASK_AMOMIN_W 0xf800707f -#define MATCH_AMOMAX_W 0xa000202f -#define MASK_AMOMAX_W 0xf800707f -#define MATCH_AMOMINU_W 0xc000202f -#define MASK_AMOMINU_W 0xf800707f -#define MATCH_AMOMAXU_W 0xe000202f -#define MASK_AMOMAXU_W 0xf800707f -#define MATCH_AMOSWAP_W 0x800202f -#define MASK_AMOSWAP_W 0xf800707f -#define MATCH_LR_W 0x1000202f -#define MASK_LR_W 0xf9f0707f -#define MATCH_SC_W 0x1800202f -#define MASK_SC_W 0xf800707f -#define MATCH_AMOADD_D 0x302f -#define MASK_AMOADD_D 0xf800707f -#define MATCH_AMOXOR_D 0x2000302f -#define MASK_AMOXOR_D 0xf800707f -#define MATCH_AMOOR_D 0x4000302f -#define MASK_AMOOR_D 0xf800707f -#define MATCH_AMOAND_D 0x6000302f -#define MASK_AMOAND_D 0xf800707f -#define MATCH_AMOMIN_D 0x8000302f -#define MASK_AMOMIN_D 0xf800707f -#define MATCH_AMOMAX_D 0xa000302f -#define MASK_AMOMAX_D 0xf800707f -#define MATCH_AMOMINU_D 0xc000302f -#define MASK_AMOMINU_D 0xf800707f -#define MATCH_AMOMAXU_D 0xe000302f -#define MASK_AMOMAXU_D 0xf800707f -#define MATCH_AMOSWAP_D 0x800302f -#define MASK_AMOSWAP_D 0xf800707f -#define MATCH_LR_D 0x1000302f -#define MASK_LR_D 0xf9f0707f -#define MATCH_SC_D 0x1800302f -#define MASK_SC_D 0xf800707f -#define MATCH_ECALL 0x73 -#define MASK_ECALL 0xffffffff -#define MATCH_EBREAK 0x100073 -#define MASK_EBREAK 0xffffffff -#define MATCH_URET 0x200073 -#define MASK_URET 0xffffffff -#define MATCH_SRET 0x10200073 -#define MASK_SRET 0xffffffff -#define MATCH_HRET 0x20200073 -#define MASK_HRET 0xffffffff -#define MATCH_MRET 0x30200073 -#define MASK_MRET 0xffffffff -#define MATCH_DRET 0x7b200073 -#define MASK_DRET 0xffffffff -#define MATCH_SFENCE_VM 0x10400073 -#define MASK_SFENCE_VM 0xfff07fff -#define MATCH_WFI 0x10500073 -#define MASK_WFI 0xffffffff -#define MATCH_CSRRW 0x1073 -#define MASK_CSRRW 0x707f -#define MATCH_CSRRS 0x2073 -#define MASK_CSRRS 0x707f -#define MATCH_CSRRC 0x3073 -#define MASK_CSRRC 0x707f -#define MATCH_CSRRWI 0x5073 -#define MASK_CSRRWI 0x707f -#define MATCH_CSRRSI 0x6073 -#define MASK_CSRRSI 0x707f -#define MATCH_CSRRCI 0x7073 -#define MASK_CSRRCI 0x707f -#define MATCH_FADD_S 0x53 -#define MASK_FADD_S 0xfe00007f -#define MATCH_FSUB_S 0x8000053 -#define MASK_FSUB_S 0xfe00007f -#define MATCH_FMUL_S 0x10000053 -#define MASK_FMUL_S 0xfe00007f -#define MATCH_FDIV_S 0x18000053 -#define MASK_FDIV_S 0xfe00007f -#define MATCH_FSGNJ_S 0x20000053 -#define MASK_FSGNJ_S 0xfe00707f -#define MATCH_FSGNJN_S 0x20001053 -#define MASK_FSGNJN_S 0xfe00707f -#define MATCH_FSGNJX_S 0x20002053 -#define MASK_FSGNJX_S 0xfe00707f -#define MATCH_FMIN_S 0x28000053 -#define MASK_FMIN_S 0xfe00707f -#define MATCH_FMAX_S 0x28001053 -#define MASK_FMAX_S 0xfe00707f -#define MATCH_FSQRT_S 0x58000053 -#define MASK_FSQRT_S 0xfff0007f -#define MATCH_FADD_D 0x2000053 -#define MASK_FADD_D 0xfe00007f -#define MATCH_FSUB_D 0xa000053 -#define MASK_FSUB_D 0xfe00007f -#define MATCH_FMUL_D 0x12000053 -#define MASK_FMUL_D 0xfe00007f -#define MATCH_FDIV_D 0x1a000053 -#define MASK_FDIV_D 0xfe00007f -#define MATCH_FSGNJ_D 0x22000053 -#define MASK_FSGNJ_D 0xfe00707f -#define MATCH_FSGNJN_D 0x22001053 -#define MASK_FSGNJN_D 0xfe00707f -#define MATCH_FSGNJX_D 0x22002053 -#define MASK_FSGNJX_D 0xfe00707f -#define MATCH_FMIN_D 0x2a000053 -#define MASK_FMIN_D 0xfe00707f -#define MATCH_FMAX_D 0x2a001053 -#define MASK_FMAX_D 0xfe00707f -#define MATCH_FCVT_S_D 0x40100053 -#define MASK_FCVT_S_D 0xfff0007f -#define MATCH_FCVT_D_S 0x42000053 -#define MASK_FCVT_D_S 0xfff0007f -#define MATCH_FSQRT_D 0x5a000053 -#define MASK_FSQRT_D 0xfff0007f -#define MATCH_FLE_S 0xa0000053 -#define MASK_FLE_S 0xfe00707f -#define MATCH_FLT_S 0xa0001053 -#define MASK_FLT_S 0xfe00707f -#define MATCH_FEQ_S 0xa0002053 -#define MASK_FEQ_S 0xfe00707f -#define MATCH_FLE_D 0xa2000053 -#define MASK_FLE_D 0xfe00707f -#define MATCH_FLT_D 0xa2001053 -#define MASK_FLT_D 0xfe00707f -#define MATCH_FEQ_D 0xa2002053 -#define MASK_FEQ_D 0xfe00707f -#define MATCH_FCVT_W_S 0xc0000053 -#define MASK_FCVT_W_S 0xfff0007f -#define MATCH_FCVT_WU_S 0xc0100053 -#define MASK_FCVT_WU_S 0xfff0007f -#define MATCH_FCVT_L_S 0xc0200053 -#define MASK_FCVT_L_S 0xfff0007f -#define MATCH_FCVT_LU_S 0xc0300053 -#define MASK_FCVT_LU_S 0xfff0007f -#define MATCH_FMV_X_S 0xe0000053 -#define MASK_FMV_X_S 0xfff0707f -#define MATCH_FCLASS_S 0xe0001053 -#define MASK_FCLASS_S 0xfff0707f -#define MATCH_FCVT_W_D 0xc2000053 -#define MASK_FCVT_W_D 0xfff0007f -#define MATCH_FCVT_WU_D 0xc2100053 -#define MASK_FCVT_WU_D 0xfff0007f -#define MATCH_FCVT_L_D 0xc2200053 -#define MASK_FCVT_L_D 0xfff0007f -#define MATCH_FCVT_LU_D 0xc2300053 -#define MASK_FCVT_LU_D 0xfff0007f -#define MATCH_FMV_X_D 0xe2000053 -#define MASK_FMV_X_D 0xfff0707f -#define MATCH_FCLASS_D 0xe2001053 -#define MASK_FCLASS_D 0xfff0707f -#define MATCH_FCVT_S_W 0xd0000053 -#define MASK_FCVT_S_W 0xfff0007f -#define MATCH_FCVT_S_WU 0xd0100053 -#define MASK_FCVT_S_WU 0xfff0007f -#define MATCH_FCVT_S_L 0xd0200053 -#define MASK_FCVT_S_L 0xfff0007f -#define MATCH_FCVT_S_LU 0xd0300053 -#define MASK_FCVT_S_LU 0xfff0007f -#define MATCH_FMV_S_X 0xf0000053 -#define MASK_FMV_S_X 0xfff0707f -#define MATCH_FCVT_D_W 0xd2000053 -#define MASK_FCVT_D_W 0xfff0007f -#define MATCH_FCVT_D_WU 0xd2100053 -#define MASK_FCVT_D_WU 0xfff0007f -#define MATCH_FCVT_D_L 0xd2200053 -#define MASK_FCVT_D_L 0xfff0007f -#define MATCH_FCVT_D_LU 0xd2300053 -#define MASK_FCVT_D_LU 0xfff0007f -#define MATCH_FMV_D_X 0xf2000053 -#define MASK_FMV_D_X 0xfff0707f -#define MATCH_FLW 0x2007 -#define MASK_FLW 0x707f -#define MATCH_FLD 0x3007 -#define MASK_FLD 0x707f -#define MATCH_FSW 0x2027 -#define MASK_FSW 0x707f -#define MATCH_FSD 0x3027 -#define MASK_FSD 0x707f -#define MATCH_FMADD_S 0x43 -#define MASK_FMADD_S 0x600007f -#define MATCH_FMSUB_S 0x47 -#define MASK_FMSUB_S 0x600007f -#define MATCH_FNMSUB_S 0x4b -#define MASK_FNMSUB_S 0x600007f -#define MATCH_FNMADD_S 0x4f -#define MASK_FNMADD_S 0x600007f -#define MATCH_FMADD_D 0x2000043 -#define MASK_FMADD_D 0x600007f -#define MATCH_FMSUB_D 0x2000047 -#define MASK_FMSUB_D 0x600007f -#define MATCH_FNMSUB_D 0x200004b -#define MASK_FNMSUB_D 0x600007f -#define MATCH_FNMADD_D 0x200004f -#define MASK_FNMADD_D 0x600007f -#define MATCH_C_NOP 0x1 -#define MASK_C_NOP 0xffff -#define MATCH_C_ADDI16SP 0x6101 -#define MASK_C_ADDI16SP 0xef83 -#define MATCH_C_JR 0x8002 -#define MASK_C_JR 0xf07f -#define MATCH_C_JALR 0x9002 -#define MASK_C_JALR 0xf07f -#define MATCH_C_EBREAK 0x9002 -#define MASK_C_EBREAK 0xffff -#define MATCH_C_LD 0x6000 -#define MASK_C_LD 0xe003 -#define MATCH_C_SD 0xe000 -#define MASK_C_SD 0xe003 -#define MATCH_C_ADDIW 0x2001 -#define MASK_C_ADDIW 0xe003 -#define MATCH_C_LDSP 0x6002 -#define MASK_C_LDSP 0xe003 -#define MATCH_C_SDSP 0xe002 -#define MASK_C_SDSP 0xe003 -#define MATCH_C_ADDI4SPN 0x0 -#define MASK_C_ADDI4SPN 0xe003 -#define MATCH_C_FLD 0x2000 -#define MASK_C_FLD 0xe003 -#define MATCH_C_LW 0x4000 -#define MASK_C_LW 0xe003 -#define MATCH_C_FLW 0x6000 -#define MASK_C_FLW 0xe003 -#define MATCH_C_FSD 0xa000 -#define MASK_C_FSD 0xe003 -#define MATCH_C_SW 0xc000 -#define MASK_C_SW 0xe003 -#define MATCH_C_FSW 0xe000 -#define MASK_C_FSW 0xe003 -#define MATCH_C_ADDI 0x1 -#define MASK_C_ADDI 0xe003 -#define MATCH_C_JAL 0x2001 -#define MASK_C_JAL 0xe003 -#define MATCH_C_LI 0x4001 -#define MASK_C_LI 0xe003 -#define MATCH_C_LUI 0x6001 -#define MASK_C_LUI 0xe003 -#define MATCH_C_SRLI 0x8001 -#define MASK_C_SRLI 0xec03 -#define MATCH_C_SRAI 0x8401 -#define MASK_C_SRAI 0xec03 -#define MATCH_C_ANDI 0x8801 -#define MASK_C_ANDI 0xec03 -#define MATCH_C_SUB 0x8c01 -#define MASK_C_SUB 0xfc63 -#define MATCH_C_XOR 0x8c21 -#define MASK_C_XOR 0xfc63 -#define MATCH_C_OR 0x8c41 -#define MASK_C_OR 0xfc63 -#define MATCH_C_AND 0x8c61 -#define MASK_C_AND 0xfc63 -#define MATCH_C_SUBW 0x9c01 -#define MASK_C_SUBW 0xfc63 -#define MATCH_C_ADDW 0x9c21 -#define MASK_C_ADDW 0xfc63 -#define MATCH_C_J 0xa001 -#define MASK_C_J 0xe003 -#define MATCH_C_BEQZ 0xc001 -#define MASK_C_BEQZ 0xe003 -#define MATCH_C_BNEZ 0xe001 -#define MASK_C_BNEZ 0xe003 -#define MATCH_C_SLLI 0x2 -#define MASK_C_SLLI 0xe003 -#define MATCH_C_FLDSP 0x2002 -#define MASK_C_FLDSP 0xe003 -#define MATCH_C_LWSP 0x4002 -#define MASK_C_LWSP 0xe003 -#define MATCH_C_FLWSP 0x6002 -#define MASK_C_FLWSP 0xe003 -#define MATCH_C_MV 0x8002 -#define MASK_C_MV 0xf003 -#define MATCH_C_ADD 0x9002 -#define MASK_C_ADD 0xf003 -#define MATCH_C_FSDSP 0xa002 -#define MASK_C_FSDSP 0xe003 -#define MATCH_C_SWSP 0xc002 -#define MASK_C_SWSP 0xe003 -#define MATCH_C_FSWSP 0xe002 -#define MASK_C_FSWSP 0xe003 -#define MATCH_CUSTOM0 0xb -#define MASK_CUSTOM0 0x707f -#define MATCH_CUSTOM0_RS1 0x200b -#define MASK_CUSTOM0_RS1 0x707f -#define MATCH_CUSTOM0_RS1_RS2 0x300b -#define MASK_CUSTOM0_RS1_RS2 0x707f -#define MATCH_CUSTOM0_RD 0x400b -#define MASK_CUSTOM0_RD 0x707f -#define MATCH_CUSTOM0_RD_RS1 0x600b -#define MASK_CUSTOM0_RD_RS1 0x707f -#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b -#define MASK_CUSTOM0_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM1 0x2b -#define MASK_CUSTOM1 0x707f -#define MATCH_CUSTOM1_RS1 0x202b -#define MASK_CUSTOM1_RS1 0x707f -#define MATCH_CUSTOM1_RS1_RS2 0x302b -#define MASK_CUSTOM1_RS1_RS2 0x707f -#define MATCH_CUSTOM1_RD 0x402b -#define MASK_CUSTOM1_RD 0x707f -#define MATCH_CUSTOM1_RD_RS1 0x602b -#define MASK_CUSTOM1_RD_RS1 0x707f -#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b -#define MASK_CUSTOM1_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM2 0x5b -#define MASK_CUSTOM2 0x707f -#define MATCH_CUSTOM2_RS1 0x205b -#define MASK_CUSTOM2_RS1 0x707f -#define MATCH_CUSTOM2_RS1_RS2 0x305b -#define MASK_CUSTOM2_RS1_RS2 0x707f -#define MATCH_CUSTOM2_RD 0x405b -#define MASK_CUSTOM2_RD 0x707f -#define MATCH_CUSTOM2_RD_RS1 0x605b -#define MASK_CUSTOM2_RD_RS1 0x707f -#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b -#define MASK_CUSTOM2_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM3 0x7b -#define MASK_CUSTOM3 0x707f -#define MATCH_CUSTOM3_RS1 0x207b -#define MASK_CUSTOM3_RS1 0x707f -#define MATCH_CUSTOM3_RS1_RS2 0x307b -#define MASK_CUSTOM3_RS1_RS2 0x707f -#define MATCH_CUSTOM3_RD 0x407b -#define MASK_CUSTOM3_RD 0x707f -#define MATCH_CUSTOM3_RD_RS1 0x607b -#define MASK_CUSTOM3_RD_RS1 0x707f -#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b -#define MASK_CUSTOM3_RD_RS1_RS2 0x707f -#define CSR_FFLAGS 0x1 -#define CSR_FRM 0x2 -#define CSR_FCSR 0x3 -#define CSR_CYCLE 0xc00 -#define CSR_TIME 0xc01 -#define CSR_INSTRET 0xc02 -#define CSR_HPMCOUNTER3 0xc03 -#define CSR_HPMCOUNTER4 0xc04 -#define CSR_HPMCOUNTER5 0xc05 -#define CSR_HPMCOUNTER6 0xc06 -#define CSR_HPMCOUNTER7 0xc07 -#define CSR_HPMCOUNTER8 0xc08 -#define CSR_HPMCOUNTER9 0xc09 -#define CSR_HPMCOUNTER10 0xc0a -#define CSR_HPMCOUNTER11 0xc0b -#define CSR_HPMCOUNTER12 0xc0c -#define CSR_HPMCOUNTER13 0xc0d -#define CSR_HPMCOUNTER14 0xc0e -#define CSR_HPMCOUNTER15 0xc0f -#define CSR_HPMCOUNTER16 0xc10 -#define CSR_HPMCOUNTER17 0xc11 -#define CSR_HPMCOUNTER18 0xc12 -#define CSR_HPMCOUNTER19 0xc13 -#define CSR_HPMCOUNTER20 0xc14 -#define CSR_HPMCOUNTER21 0xc15 -#define CSR_HPMCOUNTER22 0xc16 -#define CSR_HPMCOUNTER23 0xc17 -#define CSR_HPMCOUNTER24 0xc18 -#define CSR_HPMCOUNTER25 0xc19 -#define CSR_HPMCOUNTER26 0xc1a -#define CSR_HPMCOUNTER27 0xc1b -#define CSR_HPMCOUNTER28 0xc1c -#define CSR_HPMCOUNTER29 0xc1d -#define CSR_HPMCOUNTER30 0xc1e -#define CSR_HPMCOUNTER31 0xc1f -#define CSR_SSTATUS 0x100 -#define CSR_SIE 0x104 -#define CSR_STVEC 0x105 -#define CSR_SSCRATCH 0x140 -#define CSR_SEPC 0x141 -#define CSR_SCAUSE 0x142 -#define CSR_SBADADDR 0x143 -#define CSR_SIP 0x144 -#define CSR_SPTBR 0x180 -#define CSR_MSTATUS 0x300 -#define CSR_MISA 0x301 -#define CSR_MEDELEG 0x302 -#define CSR_MIDELEG 0x303 -#define CSR_MIE 0x304 -#define CSR_MTVEC 0x305 -#define CSR_MSCRATCH 0x340 -#define CSR_MEPC 0x341 -#define CSR_MCAUSE 0x342 -#define CSR_MBADADDR 0x343 -#define CSR_MIP 0x344 -#define CSR_TSELECT 0x7a0 -#define CSR_TDATA1 0x7a1 -#define CSR_TDATA2 0x7a2 -#define CSR_TDATA3 0x7a3 -#define CSR_DCSR 0x7b0 -#define CSR_DPC 0x7b1 -#define CSR_DSCRATCH 0x7b2 -#define CSR_MCYCLE 0xb00 -#define CSR_MINSTRET 0xb02 -#define CSR_MHPMCOUNTER3 0xb03 -#define CSR_MHPMCOUNTER4 0xb04 -#define CSR_MHPMCOUNTER5 0xb05 -#define CSR_MHPMCOUNTER6 0xb06 -#define CSR_MHPMCOUNTER7 0xb07 -#define CSR_MHPMCOUNTER8 0xb08 -#define CSR_MHPMCOUNTER9 0xb09 -#define CSR_MHPMCOUNTER10 0xb0a -#define CSR_MHPMCOUNTER11 0xb0b -#define CSR_MHPMCOUNTER12 0xb0c -#define CSR_MHPMCOUNTER13 0xb0d -#define CSR_MHPMCOUNTER14 0xb0e -#define CSR_MHPMCOUNTER15 0xb0f -#define CSR_MHPMCOUNTER16 0xb10 -#define CSR_MHPMCOUNTER17 0xb11 -#define CSR_MHPMCOUNTER18 0xb12 -#define CSR_MHPMCOUNTER19 0xb13 -#define CSR_MHPMCOUNTER20 0xb14 -#define CSR_MHPMCOUNTER21 0xb15 -#define CSR_MHPMCOUNTER22 0xb16 -#define CSR_MHPMCOUNTER23 0xb17 -#define CSR_MHPMCOUNTER24 0xb18 -#define CSR_MHPMCOUNTER25 0xb19 -#define CSR_MHPMCOUNTER26 0xb1a -#define CSR_MHPMCOUNTER27 0xb1b -#define CSR_MHPMCOUNTER28 0xb1c -#define CSR_MHPMCOUNTER29 0xb1d -#define CSR_MHPMCOUNTER30 0xb1e -#define CSR_MHPMCOUNTER31 0xb1f -#define CSR_MUCOUNTEREN 0x320 -#define CSR_MSCOUNTEREN 0x321 -#define CSR_MHPMEVENT3 0x323 -#define CSR_MHPMEVENT4 0x324 -#define CSR_MHPMEVENT5 0x325 -#define CSR_MHPMEVENT6 0x326 -#define CSR_MHPMEVENT7 0x327 -#define CSR_MHPMEVENT8 0x328 -#define CSR_MHPMEVENT9 0x329 -#define CSR_MHPMEVENT10 0x32a -#define CSR_MHPMEVENT11 0x32b -#define CSR_MHPMEVENT12 0x32c -#define CSR_MHPMEVENT13 0x32d -#define CSR_MHPMEVENT14 0x32e -#define CSR_MHPMEVENT15 0x32f -#define CSR_MHPMEVENT16 0x330 -#define CSR_MHPMEVENT17 0x331 -#define CSR_MHPMEVENT18 0x332 -#define CSR_MHPMEVENT19 0x333 -#define CSR_MHPMEVENT20 0x334 -#define CSR_MHPMEVENT21 0x335 -#define CSR_MHPMEVENT22 0x336 -#define CSR_MHPMEVENT23 0x337 -#define CSR_MHPMEVENT24 0x338 -#define CSR_MHPMEVENT25 0x339 -#define CSR_MHPMEVENT26 0x33a -#define CSR_MHPMEVENT27 0x33b -#define CSR_MHPMEVENT28 0x33c -#define CSR_MHPMEVENT29 0x33d -#define CSR_MHPMEVENT30 0x33e -#define CSR_MHPMEVENT31 0x33f -#define CSR_MVENDORID 0xf11 -#define CSR_MARCHID 0xf12 -#define CSR_MIMPID 0xf13 -#define CSR_MHARTID 0xf14 -#define CSR_CYCLEH 0xc80 -#define CSR_TIMEH 0xc81 -#define CSR_INSTRETH 0xc82 -#define CSR_HPMCOUNTER3H 0xc83 -#define CSR_HPMCOUNTER4H 0xc84 -#define CSR_HPMCOUNTER5H 0xc85 -#define CSR_HPMCOUNTER6H 0xc86 -#define CSR_HPMCOUNTER7H 0xc87 -#define CSR_HPMCOUNTER8H 0xc88 -#define CSR_HPMCOUNTER9H 0xc89 -#define CSR_HPMCOUNTER10H 0xc8a -#define CSR_HPMCOUNTER11H 0xc8b -#define CSR_HPMCOUNTER12H 0xc8c -#define CSR_HPMCOUNTER13H 0xc8d -#define CSR_HPMCOUNTER14H 0xc8e -#define CSR_HPMCOUNTER15H 0xc8f -#define CSR_HPMCOUNTER16H 0xc90 -#define CSR_HPMCOUNTER17H 0xc91 -#define CSR_HPMCOUNTER18H 0xc92 -#define CSR_HPMCOUNTER19H 0xc93 -#define CSR_HPMCOUNTER20H 0xc94 -#define CSR_HPMCOUNTER21H 0xc95 -#define CSR_HPMCOUNTER22H 0xc96 -#define CSR_HPMCOUNTER23H 0xc97 -#define CSR_HPMCOUNTER24H 0xc98 -#define CSR_HPMCOUNTER25H 0xc99 -#define CSR_HPMCOUNTER26H 0xc9a -#define CSR_HPMCOUNTER27H 0xc9b -#define CSR_HPMCOUNTER28H 0xc9c -#define CSR_HPMCOUNTER29H 0xc9d -#define CSR_HPMCOUNTER30H 0xc9e -#define CSR_HPMCOUNTER31H 0xc9f -#define CSR_MCYCLEH 0xb80 -#define CSR_MINSTRETH 0xb82 -#define CSR_MHPMCOUNTER3H 0xb83 -#define CSR_MHPMCOUNTER4H 0xb84 -#define CSR_MHPMCOUNTER5H 0xb85 -#define CSR_MHPMCOUNTER6H 0xb86 -#define CSR_MHPMCOUNTER7H 0xb87 -#define CSR_MHPMCOUNTER8H 0xb88 -#define CSR_MHPMCOUNTER9H 0xb89 -#define CSR_MHPMCOUNTER10H 0xb8a -#define CSR_MHPMCOUNTER11H 0xb8b -#define CSR_MHPMCOUNTER12H 0xb8c -#define CSR_MHPMCOUNTER13H 0xb8d -#define CSR_MHPMCOUNTER14H 0xb8e -#define CSR_MHPMCOUNTER15H 0xb8f -#define CSR_MHPMCOUNTER16H 0xb90 -#define CSR_MHPMCOUNTER17H 0xb91 -#define CSR_MHPMCOUNTER18H 0xb92 -#define CSR_MHPMCOUNTER19H 0xb93 -#define CSR_MHPMCOUNTER20H 0xb94 -#define CSR_MHPMCOUNTER21H 0xb95 -#define CSR_MHPMCOUNTER22H 0xb96 -#define CSR_MHPMCOUNTER23H 0xb97 -#define CSR_MHPMCOUNTER24H 0xb98 -#define CSR_MHPMCOUNTER25H 0xb99 -#define CSR_MHPMCOUNTER26H 0xb9a -#define CSR_MHPMCOUNTER27H 0xb9b -#define CSR_MHPMCOUNTER28H 0xb9c -#define CSR_MHPMCOUNTER29H 0xb9d -#define CSR_MHPMCOUNTER30H 0xb9e -#define CSR_MHPMCOUNTER31H 0xb9f -#define CAUSE_MISALIGNED_FETCH 0x0 -#define CAUSE_FAULT_FETCH 0x1 -#define CAUSE_ILLEGAL_INSTRUCTION 0x2 -#define CAUSE_BREAKPOINT 0x3 -#define CAUSE_MISALIGNED_LOAD 0x4 -#define CAUSE_FAULT_LOAD 0x5 -#define CAUSE_MISALIGNED_STORE 0x6 -#define CAUSE_FAULT_STORE 0x7 -#define CAUSE_USER_ECALL 0x8 -#define CAUSE_SUPERVISOR_ECALL 0x9 -#define CAUSE_HYPERVISOR_ECALL 0xa -#define CAUSE_MACHINE_ECALL 0xb -#endif -#ifdef DECLARE_INSN -DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) -DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) -DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) -DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) -DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) -DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) -DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) -DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) -DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) -DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) -DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) -DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) -DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) -DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) -DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) -DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) -DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) -DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) -DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) -DECLARE_INSN(add, MATCH_ADD, MASK_ADD) -DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) -DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) -DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) -DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) -DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) -DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) -DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) -DECLARE_INSN(or, MATCH_OR, MASK_OR) -DECLARE_INSN(and, MATCH_AND, MASK_AND) -DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) -DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) -DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) -DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) -DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) -DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) -DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) -DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) -DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) -DECLARE_INSN(lb, MATCH_LB, MASK_LB) -DECLARE_INSN(lh, MATCH_LH, MASK_LH) -DECLARE_INSN(lw, MATCH_LW, MASK_LW) -DECLARE_INSN(ld, MATCH_LD, MASK_LD) -DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) -DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) -DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) -DECLARE_INSN(sb, MATCH_SB, MASK_SB) -DECLARE_INSN(sh, MATCH_SH, MASK_SH) -DECLARE_INSN(sw, MATCH_SW, MASK_SW) -DECLARE_INSN(sd, MATCH_SD, MASK_SD) -DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) -DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) -DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) -DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) -DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) -DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) -DECLARE_INSN(div, MATCH_DIV, MASK_DIV) -DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) -DECLARE_INSN(rem, MATCH_REM, MASK_REM) -DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) -DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) -DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) -DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) -DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) -DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) -DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) -DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) -DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) -DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) -DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) -DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) -DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) -DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) -DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) -DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) -DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) -DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) -DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) -DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) -DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) -DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) -DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) -DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) -DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) -DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) -DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) -DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) -DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) -DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) -DECLARE_INSN(uret, MATCH_URET, MASK_URET) -DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) -DECLARE_INSN(hret, MATCH_HRET, MASK_HRET) -DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) -DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) -DECLARE_INSN(sfence_vm, MATCH_SFENCE_VM, MASK_SFENCE_VM) -DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) -DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) -DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) -DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) -DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) -DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) -DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) -DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) -DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) -DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) -DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) -DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) -DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) -DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) -DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) -DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) -DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) -DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) -DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) -DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) -DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) -DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) -DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) -DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) -DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) -DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) -DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) -DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) -DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) -DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) -DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) -DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) -DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) -DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) -DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) -DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) -DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) -DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) -DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) -DECLARE_INSN(fmv_x_s, MATCH_FMV_X_S, MASK_FMV_X_S) -DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) -DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) -DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) -DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) -DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) -DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) -DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) -DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) -DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) -DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) -DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) -DECLARE_INSN(fmv_s_x, MATCH_FMV_S_X, MASK_FMV_S_X) -DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) -DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) -DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) -DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) -DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) -DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) -DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) -DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) -DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) -DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) -DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) -DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) -DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) -DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) -DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) -DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) -DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) -DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) -DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) -DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) -DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) -DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) -DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) -DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) -DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) -DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) -DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) -DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) -DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) -DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) -DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) -DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) -DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) -DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) -DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) -DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) -DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) -DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) -DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) -DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) -DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) -DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) -DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) -DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) -DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) -DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) -DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) -DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) -DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) -DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) -DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) -DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) -DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) -DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) -DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) -DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) -DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) -DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) -DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) -DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) -DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) -DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) -DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) -DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) -DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) -DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) -DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) -DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) -DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) -DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) -DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) -DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) -DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) -DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) -DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) -DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) -DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) -DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) -DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) -DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) -DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) -DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) -DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) -#endif -#ifdef DECLARE_CSR -DECLARE_CSR(fflags, CSR_FFLAGS) -DECLARE_CSR(frm, CSR_FRM) -DECLARE_CSR(fcsr, CSR_FCSR) -DECLARE_CSR(cycle, CSR_CYCLE) -DECLARE_CSR(time, CSR_TIME) -DECLARE_CSR(instret, CSR_INSTRET) -DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) -DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) -DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) -DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) -DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) -DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) -DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) -DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) -DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) -DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) -DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) -DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) -DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) -DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) -DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) -DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) -DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) -DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) -DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) -DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) -DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) -DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) -DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) -DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) -DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) -DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) -DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) -DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) -DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) -DECLARE_CSR(sstatus, CSR_SSTATUS) -DECLARE_CSR(sie, CSR_SIE) -DECLARE_CSR(stvec, CSR_STVEC) -DECLARE_CSR(sscratch, CSR_SSCRATCH) -DECLARE_CSR(sepc, CSR_SEPC) -DECLARE_CSR(scause, CSR_SCAUSE) -DECLARE_CSR(sbadaddr, CSR_SBADADDR) -DECLARE_CSR(sip, CSR_SIP) -DECLARE_CSR(sptbr, CSR_SPTBR) -DECLARE_CSR(mstatus, CSR_MSTATUS) -DECLARE_CSR(misa, CSR_MISA) -DECLARE_CSR(medeleg, CSR_MEDELEG) -DECLARE_CSR(mideleg, CSR_MIDELEG) -DECLARE_CSR(mie, CSR_MIE) -DECLARE_CSR(mtvec, CSR_MTVEC) -DECLARE_CSR(mscratch, CSR_MSCRATCH) -DECLARE_CSR(mepc, CSR_MEPC) -DECLARE_CSR(mcause, CSR_MCAUSE) -DECLARE_CSR(mbadaddr, CSR_MBADADDR) -DECLARE_CSR(mip, CSR_MIP) -DECLARE_CSR(tselect, CSR_TSELECT) -DECLARE_CSR(tdata1, CSR_TDATA1) -DECLARE_CSR(tdata2, CSR_TDATA2) -DECLARE_CSR(tdata3, CSR_TDATA3) -DECLARE_CSR(dcsr, CSR_DCSR) -DECLARE_CSR(dpc, CSR_DPC) -DECLARE_CSR(dscratch, CSR_DSCRATCH) -DECLARE_CSR(mcycle, CSR_MCYCLE) -DECLARE_CSR(minstret, CSR_MINSTRET) -DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) -DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) -DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) -DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) -DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) -DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) -DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) -DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) -DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) -DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) -DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) -DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) -DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) -DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) -DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) -DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) -DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) -DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) -DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) -DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) -DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) -DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) -DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) -DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) -DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) -DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) -DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) -DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) -DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) -DECLARE_CSR(mucounteren, CSR_MUCOUNTEREN) -DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN) -DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) -DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) -DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) -DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) -DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) -DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) -DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) -DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) -DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) -DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) -DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) -DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) -DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) -DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) -DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) -DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) -DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) -DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) -DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) -DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) -DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) -DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) -DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) -DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) -DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) -DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) -DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) -DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) -DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) -DECLARE_CSR(mvendorid, CSR_MVENDORID) -DECLARE_CSR(marchid, CSR_MARCHID) -DECLARE_CSR(mimpid, CSR_MIMPID) -DECLARE_CSR(mhartid, CSR_MHARTID) -DECLARE_CSR(cycleh, CSR_CYCLEH) -DECLARE_CSR(timeh, CSR_TIMEH) -DECLARE_CSR(instreth, CSR_INSTRETH) -DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) -DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) -DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) -DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) -DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) -DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) -DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) -DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) -DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) -DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) -DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) -DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) -DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) -DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) -DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) -DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) -DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) -DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) -DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) -DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) -DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) -DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) -DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) -DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) -DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) -DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) -DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) -DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) -DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) -DECLARE_CSR(mcycleh, CSR_MCYCLEH) -DECLARE_CSR(minstreth, CSR_MINSTRETH) -DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) -DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) -DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) -DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) -DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) -DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) -DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) -DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) -DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) -DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) -DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) -DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) -DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) -DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) -DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) -DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) -DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) -DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) -DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) -DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) -DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) -DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) -DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) -DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) -DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) -DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) -DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) -DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) -DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) -#endif -#ifdef DECLARE_CAUSE -DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) -DECLARE_CAUSE("fault fetch", CAUSE_FAULT_FETCH) -DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) -DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) -DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) -DECLARE_CAUSE("fault load", CAUSE_FAULT_LOAD) -DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) -DECLARE_CAUSE("fault store", CAUSE_FAULT_STORE) -DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) -DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) -DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) -DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) -#endif diff --git a/raven_spn/bsp/env/entry.S b/raven_spn/bsp/env/entry.S deleted file mode 100644 index 261b2a4..0000000 --- a/raven_spn/bsp/env/entry.S +++ /dev/null @@ -1,98 +0,0 @@ -// See LICENSE for license details - -#ifndef ENTRY_S -#define ENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - - .section .text.entry - .align 2 - .weak trap_entry - .global trap_entry -trap_entry: - addi sp, sp, -32*REGBYTES - - STORE x1, 1*REGBYTES(sp) - STORE x2, 2*REGBYTES(sp) - STORE x3, 3*REGBYTES(sp) - STORE x4, 4*REGBYTES(sp) - STORE x5, 5*REGBYTES(sp) - STORE x6, 6*REGBYTES(sp) - STORE x7, 7*REGBYTES(sp) - STORE x8, 8*REGBYTES(sp) - STORE x9, 9*REGBYTES(sp) - STORE x10, 10*REGBYTES(sp) - STORE x11, 11*REGBYTES(sp) - STORE x12, 12*REGBYTES(sp) - STORE x13, 13*REGBYTES(sp) - STORE x14, 14*REGBYTES(sp) - STORE x15, 15*REGBYTES(sp) - STORE x16, 16*REGBYTES(sp) - STORE x17, 17*REGBYTES(sp) - STORE x18, 18*REGBYTES(sp) - STORE x19, 19*REGBYTES(sp) - STORE x20, 20*REGBYTES(sp) - STORE x21, 21*REGBYTES(sp) - STORE x22, 22*REGBYTES(sp) - STORE x23, 23*REGBYTES(sp) - STORE x24, 24*REGBYTES(sp) - STORE x25, 25*REGBYTES(sp) - STORE x26, 26*REGBYTES(sp) - STORE x27, 27*REGBYTES(sp) - STORE x28, 28*REGBYTES(sp) - STORE x29, 29*REGBYTES(sp) - STORE x30, 30*REGBYTES(sp) - STORE x31, 31*REGBYTES(sp) - - csrr a0, mcause - csrr a1, mepc - mv a2, sp - call handle_trap - csrw mepc, a0 - - # Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 1*REGBYTES(sp) - LOAD x2, 2*REGBYTES(sp) - LOAD x3, 3*REGBYTES(sp) - LOAD x4, 4*REGBYTES(sp) - LOAD x5, 5*REGBYTES(sp) - LOAD x6, 6*REGBYTES(sp) - LOAD x7, 7*REGBYTES(sp) - LOAD x8, 8*REGBYTES(sp) - LOAD x9, 9*REGBYTES(sp) - LOAD x10, 10*REGBYTES(sp) - LOAD x11, 11*REGBYTES(sp) - LOAD x12, 12*REGBYTES(sp) - LOAD x13, 13*REGBYTES(sp) - LOAD x14, 14*REGBYTES(sp) - LOAD x15, 15*REGBYTES(sp) - LOAD x16, 16*REGBYTES(sp) - LOAD x17, 17*REGBYTES(sp) - LOAD x18, 18*REGBYTES(sp) - LOAD x19, 19*REGBYTES(sp) - LOAD x20, 20*REGBYTES(sp) - LOAD x21, 21*REGBYTES(sp) - LOAD x22, 22*REGBYTES(sp) - LOAD x23, 23*REGBYTES(sp) - LOAD x24, 24*REGBYTES(sp) - LOAD x25, 25*REGBYTES(sp) - LOAD x26, 26*REGBYTES(sp) - LOAD x27, 27*REGBYTES(sp) - LOAD x28, 28*REGBYTES(sp) - LOAD x29, 29*REGBYTES(sp) - LOAD x30, 30*REGBYTES(sp) - LOAD x31, 31*REGBYTES(sp) - - addi sp, sp, 32*REGBYTES - mret - -.weak handle_trap -handle_trap: -1: - j 1b - -#endif diff --git a/raven_spn/bsp/env/freedom-e300-arty/flash.lds b/raven_spn/bsp/env/freedom-e300-arty/flash.lds deleted file mode 100644 index 6b37141..0000000 --- a/raven_spn/bsp/env/freedom-e300-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/freedom-e300-arty/init.c b/raven_spn/bsp/env/freedom-e300-arty/init.c deleted file mode 100644 index a6f4b39..0000000 --- a/raven_spn/bsp/env/freedom-e300-arty/init.c +++ /dev/null @@ -1,87 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long get_cpu_freq() -{ - return 65000000; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - #endif -} - -void _fini() -{ -} diff --git a/raven_spn/bsp/env/freedom-e300-arty/openocd.cfg b/raven_spn/bsp/env/freedom-e300-arty/openocd.cfg deleted file mode 100644 index f4b28ed..0000000 --- a/raven_spn/bsp/env/freedom-e300-arty/openocd.cfg +++ /dev/null @@ -1,30 +0,0 @@ -adapter_khz 10000 - -#source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg] - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 -# - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off diff --git a/raven_spn/bsp/env/freedom-e300-arty/platform.h b/raven_spn/bsp/env/freedom-e300-arty/platform.h deleted file mode 100644 index 8ff7ae6..0000000 --- a/raven_spn/bsp/env/freedom-e300-arty/platform.h +++ /dev/null @@ -1,124 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define AON_CTRL_ADDR _AC(0x10000000,UL) -#define GPIO_CTRL_ADDR _AC(0x10012000,UL) -#define UART0_CTRL_ADDR _AC(0x10013000,UL) -#define SPI0_CTRL_ADDR _AC(0x10014000,UL) -#define PWM0_CTRL_ADDR _AC(0x10015000,UL) -#define UART1_CTRL_ADDR _AC(0x10023000,UL) -#define SPI1_CTRL_ADDR _AC(0x10024000,UL) -#define PWM1_CTRL_ADDR _AC(0x10025000,UL) -#define SPI2_CTRL_ADDR _AC(0x10034000,UL) -#define PWM2_CTRL_ADDR _AC(0x10035000,UL) -#define SPI0_MMAP_ADDR _AC(0x20000000,UL) -#define MEM_CTRL_ADDR _AC(0x80000000,UL) - -// IOF Mappings -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt Numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_CTRL_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_CTRL_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_CTRL_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_CTRL_ADDR, offset) - -// Misc - -#include - - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS -#include "hifive1.h" - -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/raven_spn/bsp/env/freedom-e300-arty/settings.mk b/raven_spn/bsp/env/freedom-e300-arty/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/raven_spn/bsp/env/freedom-e300-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/raven_spn/bsp/env/freedom-e300-hifive1/dhrystone.lds b/raven_spn/bsp/env/freedom-e300-hifive1/dhrystone.lds deleted file mode 100644 index cc9cd9b..0000000 --- a/raven_spn/bsp/env/freedom-e300-hifive1/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/freedom-e300-hifive1/flash.lds b/raven_spn/bsp/env/freedom-e300-hifive1/flash.lds deleted file mode 100644 index 22f90c6..0000000 --- a/raven_spn/bsp/env/freedom-e300-hifive1/flash.lds +++ /dev/null @@ -1,166 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 512K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .except : - { - *(.gcc_except_table.*) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/raven_spn/bsp/env/freedom-e300-hifive1/init.c b/raven_spn/bsp/env/freedom-e300-hifive1/init.c deleted file mode 100644 index 621a6e2..0000000 --- a/raven_spn/bsp/env/freedom-e300-hifive1/init.c +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long mtime_lo(void) -{ - return *(volatile unsigned long *)(CLINT_CTRL_ADDR + CLINT_MTIME); -} - -#ifdef __riscv32 - -static uint32_t mtime_hi(void) -{ - return *(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIME + 4); -} - -uint64_t get_timer_value() -{ - while (1) { - uint32_t hi = mtime_hi(); - uint32_t lo = mtime_lo(); - if (hi == mtime_hi()) - return ((uint64_t)hi << 32) | lo; - } -} - -#else /* __riscv32 */ - -uint64_t get_timer_value() -{ - return mtime_lo(); -} - -#endif - -unsigned long get_timer_freq() -{ - return 32768; -} - -static void use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0) ; - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -static void use_pll(int refsel, int bypass, int r, int f, int q) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if available. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - // In case we are executing from QSPI, - // (which is quite likely) we need to - // set the QSPI clock divider appropriately - // before boosting the clock frequency. - - // Div = f_sck/2 - SPI0_REG(SPI_REG_SCKDIV) = 8; - - // Set DIV Settings for PLL - // Both HFROSC and HFXOSC are modeled as ideal - // 16MHz sources (assuming dividers are set properly for - // HFROSC). - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = mtime_lo(); - while (mtime_lo() - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0) ; - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); -} - -static void use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - use_hfrosc(4, 16); -} - -static unsigned long __attribute__((noinline)) measure_cpu_freq(size_t n) -{ - unsigned long start_mtime, delta_mtime; - unsigned long mtime_freq = get_timer_freq(); - - // Don't start measuruing until we see an mtime tick - unsigned long tmp = mtime_lo(); - do { - start_mtime = mtime_lo(); - } while (start_mtime == tmp); - - unsigned long start_mcycle = read_csr(mcycle); - - do { - delta_mtime = mtime_lo() - start_mtime; - } while (delta_mtime < n); - - unsigned long delta_mcycle = read_csr(mcycle) - start_mcycle; - - return (delta_mcycle / delta_mtime) * mtime_freq - + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; -} - -unsigned long get_cpu_freq() -{ - static uint32_t cpu_freq; - - if (!cpu_freq) { - // warm up I$ - measure_cpu_freq(1); - // measure for real - cpu_freq = measure_cpu_freq(10); - } - - return cpu_freq; -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "trap\n", 5); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - - #ifndef NO_INIT - use_default_clocks(); - use_pll(0, 0, 1, 31, 1); - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } - #endif - -} - -void _fini() -{ -} diff --git a/raven_spn/bsp/env/freedom-e300-hifive1/openocd.cfg b/raven_spn/bsp/env/freedom-e300-hifive1/openocd.cfg deleted file mode 100644 index b531e9c..0000000 --- a/raven_spn/bsp/env/freedom-e300-hifive1/openocd.cfg +++ /dev/null @@ -1,34 +0,0 @@ -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Dual RS232-HS" -ftdi_vid_pid 0x0403 0x6010 - -ftdi_layout_init 0x0008 0x001b -ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 - -#Reset Stretcher logic on FE310 is ~1 second long -#This doesn't apply if you use -# ftdi_set_signal, but still good to document -#adapter_nsrst_delay 1500 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -- This type of reset is not implemented yet -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z - #Wait for the reset stretcher - #It will work without this, but - #will incur lots of delays for later commands. - sleep 1500 -} -halt -#flash protect 0 64 last off diff --git a/raven_spn/bsp/env/freedom-e300-hifive1/platform.h b/raven_spn/bsp/env/freedom-e300-hifive1/platform.h deleted file mode 100644 index 806fcfc..0000000 --- a/raven_spn/bsp/env/freedom-e300-hifive1/platform.h +++ /dev/null @@ -1,133 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/otp.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/prci.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define MASKROM_MEM_ADDR _AC(0x00001000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define OTP_MEM_ADDR _AC(0x00020000,UL) -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define AON_CTRL_ADDR _AC(0x10000000,UL) -#define PRCI_CTRL_ADDR _AC(0x10008000,UL) -#define OTP_CTRL_ADDR _AC(0x10010000,UL) -#define GPIO_CTRL_ADDR _AC(0x10012000,UL) -#define UART0_CTRL_ADDR _AC(0x10013000,UL) -#define SPI0_CTRL_ADDR _AC(0x10014000,UL) -#define PWM0_CTRL_ADDR _AC(0x10015000,UL) -#define UART1_CTRL_ADDR _AC(0x10023000,UL) -#define SPI1_CTRL_ADDR _AC(0x10024000,UL) -#define PWM1_CTRL_ADDR _AC(0x10025000,UL) -#define SPI2_CTRL_ADDR _AC(0x10034000,UL) -#define PWM2_CTRL_ADDR _AC(0x10035000,UL) -#define SPI0_MEM_ADDR _AC(0x20000000,UL) -#define MEM_CTRL_ADDR _AC(0x80000000,UL) - -// IOF masks -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -//#define IOF0_I2C_MASK _AC(0x00003000,UL) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_CTRL_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PRCI_REG(offset) _REG32(PRCI_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_CTRL_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_CTRL_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_CTRL_ADDR, offset) - -// Misc - -#include - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#include "hifive1.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/raven_spn/bsp/env/freedom-e300-hifive1/settings.mk b/raven_spn/bsp/env/freedom-e300-hifive1/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/raven_spn/bsp/env/freedom-e300-hifive1/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/raven_spn/bsp/env/hifive1.h b/raven_spn/bsp/env/hifive1.h deleted file mode 100644 index 0db2f0f..0000000 --- a/raven_spn/bsp/env/hifive1.h +++ /dev/null @@ -1,81 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_HIFIVE1_H -#define _SIFIVE_HIFIVE1_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the RGB LED on HiFive1 Board. -// These are also mapped to RGB LEDs on the Freedom E300 Arty -// FPGA -// Dev Kit. - -#define RED_LED_OFFSET 22 -#define GREEN_LED_OFFSET 19 -#define BLUE_LED_OFFSET 21 - -// These are the GPIO bit offsets for the differen digital pins -// on the headers for both the HiFive1 Board and the Freedom E300 Arty FPGA Dev Kit. -#define PIN_0_OFFSET 16 -#define PIN_1_OFFSET 17 -#define PIN_2_OFFSET 18 -#define PIN_3_OFFSET 19 -#define PIN_4_OFFSET 20 -#define PIN_5_OFFSET 21 -#define PIN_6_OFFSET 22 -#define PIN_7_OFFSET 23 -#define PIN_8_OFFSET 0 -#define PIN_9_OFFSET 1 -#define PIN_10_OFFSET 2 -#define PIN_11_OFFSET 3 -#define PIN_12_OFFSET 4 -#define PIN_13_OFFSET 5 -//#define PIN_14_OFFSET 8 //This pin is not connected on either board. -#define PIN_15_OFFSET 9 -#define PIN_16_OFFSET 10 -#define PIN_17_OFFSET 11 -#define PIN_18_OFFSET 12 -#define PIN_19_OFFSET 13 - -// These are *PIN* numbers, not -// GPIO Offset Numbers. -#define PIN_SPI1_SCK (13u) -#define PIN_SPI1_MISO (12u) -#define PIN_SPI1_MOSI (11u) -#define PIN_SPI1_SS0 (10u) -#define PIN_SPI1_SS1 (14u) -#define PIN_SPI1_SS2 (15u) -#define PIN_SPI1_SS3 (16u) - -#define SS_PIN_TO_CS_ID(x) \ - ((x==PIN_SPI1_SS0 ? 0 : \ - (x==PIN_SPI1_SS1 ? 1 : \ - (x==PIN_SPI1_SS2 ? 2 : \ - (x==PIN_SPI1_SS3 ? 3 : \ - -1))))) - - -// These buttons are present only on the Freedom E300 Arty Dev Kit. -#ifdef HAS_BOARD_BUTTONS -#define BUTTON_0_OFFSET 15 -#define BUTTON_1_OFFSET 30 -#define BUTTON_2_OFFSET 31 - -#define INT_DEVICE_BUTTON_0 (INT_GPIO_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (INT_GPIO_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (INT_GPIO_BASE + BUTTON_2_OFFSET) - -#endif - -#define HAS_HFXOSC 1 -#define HAS_LFROSC_BYPASS 1 - -#define RTC_FREQ 32768 - -void write_hex(int fd, unsigned long int hex); - -#endif /* _SIFIVE_HIFIVE1_H */ diff --git a/raven_spn/bsp/env/start.S b/raven_spn/bsp/env/start.S deleted file mode 100644 index 4e9f665..0000000 --- a/raven_spn/bsp/env/start.S +++ /dev/null @@ -1,111 +0,0 @@ -// See LICENSE for license details. -#include - -/* This is defined in sifive/platform.h, but that can't be included from - * assembly. */ -#define CLINT_CTRL_ADDR 0x02000000 - - .section .init - .globl _start - .type _start,@function - -_start: - .cfi_startproc - .cfi_undefined ra -.option push -.option norelax - la gp, __global_pointer$ -.option pop - la sp, _sp - -#if defined(ENABLE_SMP) - smp_pause(t0, t1) -#endif - - /* Load data section */ - la a0, _data_lma - la a1, _data - la a2, _edata - bgeu a1, a2, 2f -1: - lw t0, (a0) - sw t0, (a1) - addi a0, a0, 4 - addi a1, a1, 4 - bltu a1, a2, 1b -2: - - /* Clear bss section */ - la a0, __bss_start - la a1, _end - bgeu a0, a1, 2f -1: - sw zero, (a0) - addi a0, a0, 4 - bltu a0, a1, 1b -2: - - /* Call global constructors */ - la a0, __libc_fini_array - call atexit - call __libc_init_array - -#ifndef __riscv_float_abi_soft - /* Enable FPU */ - li t0, MSTATUS_FS - csrs mstatus, t0 - csrr t1, mstatus - and t1, t1, t0 - beqz t1, 1f - fssr x0 -1: -#endif - -#if defined(ENABLE_SMP) - smp_resume(t0, t1) - - csrr a0, mhartid - bnez a0, 2f -#endif - - auipc ra, 0 - addi sp, sp, -16 -#if __riscv_xlen == 32 - sw ra, 8(sp) -#else - sd ra, 8(sp) -#endif - - /* argc = argv = 0 */ - li a0, 0 - li a1, 0 - call main - tail exit -1: - j 1b - -#if defined(ENABLE_SMP) -2: - la t0, trap_entry - csrw mtvec, t0 - - csrr a0, mhartid - la t1, _sp - slli t0, a0, 10 - sub sp, t1, t0 - - auipc ra, 0 - addi sp, sp, -16 -#if __riscv_xlen == 32 - sw ra, 8(sp) -#else - sd ra, 8(sp) -#endif - - call secondary_main - tail exit - -1: - j 1b -#endif - .cfi_endproc diff --git a/raven_spn/bsp/env/ventry.S b/raven_spn/bsp/env/ventry.S deleted file mode 100644 index 5c82c48..0000000 --- a/raven_spn/bsp/env/ventry.S +++ /dev/null @@ -1,288 +0,0 @@ -// See LICENSE for license details - -#ifndef VENTRY_S -#define VENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - -#only save caller registers -.macro TRAP_ENTRY - addi sp, sp, -16*REGBYTES - - STORE x1, 0*REGBYTES(sp) - STORE x5, 1*REGBYTES(sp) - STORE x6, 2*REGBYTES(sp) - STORE x7, 3*REGBYTES(sp) - STORE x10, 4*REGBYTES(sp) - STORE x11, 5*REGBYTES(sp) - STORE x12, 6*REGBYTES(sp) - STORE x13, 7*REGBYTES(sp) - STORE x14, 8*REGBYTES(sp) - STORE x15, 9*REGBYTES(sp) - STORE x16, 10*REGBYTES(sp) - STORE x17, 11*REGBYTES(sp) - STORE x28, 12*REGBYTES(sp) - STORE x29, 13*REGBYTES(sp) - STORE x30, 14*REGBYTES(sp) - STORE x31, 15*REGBYTES(sp) -.endm - -#restore caller registers -.macro TRAP_EXIT -# Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 0*REGBYTES(sp) - LOAD x5, 1*REGBYTES(sp) - LOAD x6, 2*REGBYTES(sp) - LOAD x7, 3*REGBYTES(sp) - LOAD x10, 4*REGBYTES(sp) - LOAD x11, 5*REGBYTES(sp) - LOAD x12, 6*REGBYTES(sp) - LOAD x13, 7*REGBYTES(sp) - LOAD x14, 8*REGBYTES(sp) - LOAD x15, 9*REGBYTES(sp) - LOAD x16, 10*REGBYTES(sp) - LOAD x17, 11*REGBYTES(sp) - LOAD x28, 12*REGBYTES(sp) - LOAD x29, 13*REGBYTES(sp) - LOAD x30, 14*REGBYTES(sp) - LOAD x31, 15*REGBYTES(sp) - - addi sp, sp, 16*REGBYTES - mret -.endm - - - -#Vector table for E31/E51 - - .section .text.entry - .align 8 - .global vtrap_entry -vtrap_entry: - j sync_trap - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmsi_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmti_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmei_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vlip_Handler0 - .align 2 - j vlip_Handler1 - .align 2 - j vlip_Handler2 - .align 2 - j vlip_Handler3 - .align 2 - j vlip_Handler4 - .align 2 - j vlip_Handler5 - .align 2 - j vlip_Handler6 - .align 2 - j vlip_Handler7 - .align 2 - j vlip_Handler8 - .align 2 - j vlip_Handler9 - .align 2 - j vlip_Handler10 - .align 2 - j vlip_Handler11 - .align 2 - j vlip_Handler12 - .align 2 - j vlip_Handler13 - .align 2 - j vlip_Handler14 - .align 2 - j vlip_Handler15 - -#synchronous trap -sync_trap: - TRAP_ENTRY - jal handle_sync_trap - TRAP_EXIT - -#Machine Software Interrupt -vmsi_Handler: - TRAP_ENTRY - jal reserved - TRAP_EXIT - -#Machine Timer Interrupt -vmti_Handler: - TRAP_ENTRY - jal handle_m_time_interrupt - TRAP_EXIT - -#Machine External Interrupt -vmei_Handler: - TRAP_ENTRY - jal handle_m_external_interrupt - TRAP_EXIT - -#LIP0 -vlip_Handler0: - TRAP_ENTRY - jal handle_local_interrupt0 - TRAP_EXIT - -#LIP1 -vlip_Handler1: - TRAP_ENTRY - jal handle_local_interrupt1 - TRAP_EXIT - -#LIP2 -vlip_Handler2: - TRAP_ENTRY - jal handle_local_interrupt2 - TRAP_EXIT - -#LIP3 -vlip_Handler3: - TRAP_ENTRY - jal handle_local_interrupt3 - TRAP_EXIT - -#LIP4 -vlip_Handler4: - TRAP_ENTRY - jal handle_local_interrupt4 - TRAP_EXIT - -#LIP5 -vlip_Handler5: - TRAP_ENTRY - jal handle_local_interrupt5 - TRAP_EXIT - -#LIP6 -vlip_Handler6: - TRAP_ENTRY - jal handle_local_interrupt6 - TRAP_EXIT - -#LIP7 -vlip_Handler7: - TRAP_ENTRY - jal handle_local_interrupt7 - TRAP_EXIT - -#LIP8 -vlip_Handler8: - TRAP_ENTRY - jal handle_local_interrupt8 - TRAP_EXIT - -#LIP9 -vlip_Handler9: - TRAP_ENTRY - jal handle_local_interrupt9 - TRAP_EXIT - -#LIP10 -vlip_Handler10: - TRAP_ENTRY - jal handle_local_interrupt10 - TRAP_EXIT - -#LIP11 -vlip_Handler11: - TRAP_ENTRY - jal handle_local_interrupt11 - TRAP_EXIT - -#LIP12 -vlip_Handler12: - TRAP_ENTRY - jal handle_local_interrupt12 - TRAP_EXIT - -#LIP13 -vlip_Handler13: - TRAP_ENTRY - jal handle_local_interrupt13 - TRAP_EXIT - -#LIP14 -vlip_Handler14: - TRAP_ENTRY - jal handle_local_interrupt14 - TRAP_EXIT - -#LIP15 -vlip_Handler15: - TRAP_ENTRY - jal handle_local_interrupt15 - TRAP_EXIT - -#unimplemented ISRs trap here -.weak reserved -reserved: -.weak handle_local_interrupt0 -handle_local_interrupt0: -.weak handle_local_interrupt1 -handle_local_interrupt1: -.weak handle_local_interrupt2 -handle_local_interrupt2: -.weak handle_local_interrupt3 -handle_local_interrupt3: -.weak handle_local_interrupt4 -handle_local_interrupt4: -.weak handle_local_interrupt5 -handle_local_interrupt5: -.weak handle_local_interrupt6 -handle_local_interrupt6: -.weak handle_local_interrupt7 -handle_local_interrupt7: -.weak handle_local_interrupt8 -handle_local_interrupt8: -.weak handle_local_interrupt9 -handle_local_interrupt9: -.weak handle_local_interrupt10 -handle_local_interrupt10: -.weak handle_local_interrupt11 -handle_local_interrupt11: -.weak handle_local_interrupt12 -handle_local_interrupt12: -.weak handle_local_interrupt13 -handle_local_interrupt13: -.weak handle_local_interrupt14 -handle_local_interrupt14: -.weak handle_local_interrupt15 -handle_local_interrupt15: -1: - j 1b - -#endif diff --git a/raven_spn/bsp/include/sifive/bits.h b/raven_spn/bsp/include/sifive/bits.h deleted file mode 100644 index bfe656f..0000000 --- a/raven_spn/bsp/include/sifive/bits.h +++ /dev/null @@ -1,36 +0,0 @@ -// See LICENSE for license details. -#ifndef _RISCV_BITS_H -#define _RISCV_BITS_H - -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) - -#define ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b)) -#define ROUNDDOWN(a, b) ((a)/(b)*(b)) - -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define CLAMP(a, lo, hi) MIN(MAX(a, lo), hi) - -#define EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1))) -#define INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1)))) - -#define STR(x) XSTR(x) -#define XSTR(x) #x - -#if __riscv_xlen == 64 -# define SLL32 sllw -# define STORE sd -# define LOAD ld -# define LWU lwu -# define LOG_REGBYTES 3 -#else -# define SLL32 sll -# define STORE sw -# define LOAD lw -# define LWU lw -# define LOG_REGBYTES 2 -#endif -#define REGBYTES (1 << LOG_REGBYTES) - -#endif diff --git a/raven_spn/bsp/include/sifive/const.h b/raven_spn/bsp/include/sifive/const.h deleted file mode 100644 index 8dcffbb..0000000 --- a/raven_spn/bsp/include/sifive/const.h +++ /dev/null @@ -1,18 +0,0 @@ -// See LICENSE for license details. -/* Derived from */ - -#ifndef _SIFIVE_CONST_H -#define _SIFIVE_CONST_H - -#ifdef __ASSEMBLER__ -#define _AC(X,Y) X -#define _AT(T,X) X -#else -#define _AC(X,Y) (X##Y) -#define _AT(T,X) ((T)(X)) -#endif /* !__ASSEMBLER__*/ - -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) - -#endif /* _SIFIVE_CONST_H */ diff --git a/raven_spn/bsp/include/sifive/devices/aon.h b/raven_spn/bsp/include/sifive/devices/aon.h deleted file mode 100644 index 63f1db3..0000000 --- a/raven_spn/bsp/include/sifive/devices/aon.h +++ /dev/null @@ -1,88 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_AON_H -#define _SIFIVE_AON_H - -/* Register offsets */ - -#define AON_WDOGCFG 0x000 -#define AON_WDOGCOUNT 0x008 -#define AON_WDOGS 0x010 -#define AON_WDOGFEED 0x018 -#define AON_WDOGKEY 0x01C -#define AON_WDOGCMP 0x020 - -#define AON_RTCCFG 0x040 -#define AON_RTCLO 0x048 -#define AON_RTCHI 0x04C -#define AON_RTCS 0x050 -#define AON_RTCCMP 0x060 - -#define AON_BACKUP0 0x080 -#define AON_BACKUP1 0x084 -#define AON_BACKUP2 0x088 -#define AON_BACKUP3 0x08C -#define AON_BACKUP4 0x090 -#define AON_BACKUP5 0x094 -#define AON_BACKUP6 0x098 -#define AON_BACKUP7 0x09C -#define AON_BACKUP8 0x0A0 -#define AON_BACKUP9 0x0A4 -#define AON_BACKUP10 0x0A8 -#define AON_BACKUP11 0x0AC -#define AON_BACKUP12 0x0B0 -#define AON_BACKUP13 0x0B4 -#define AON_BACKUP14 0x0B8 -#define AON_BACKUP15 0x0BC - -#define AON_PMUWAKEUPI0 0x100 -#define AON_PMUWAKEUPI1 0x104 -#define AON_PMUWAKEUPI2 0x108 -#define AON_PMUWAKEUPI3 0x10C -#define AON_PMUWAKEUPI4 0x110 -#define AON_PMUWAKEUPI5 0x114 -#define AON_PMUWAKEUPI6 0x118 -#define AON_PMUWAKEUPI7 0x11C -#define AON_PMUSLEEPI0 0x120 -#define AON_PMUSLEEPI1 0x124 -#define AON_PMUSLEEPI2 0x128 -#define AON_PMUSLEEPI3 0x12C -#define AON_PMUSLEEPI4 0x130 -#define AON_PMUSLEEPI5 0x134 -#define AON_PMUSLEEPI6 0x138 -#define AON_PMUSLEEPI7 0x13C -#define AON_PMUIE 0x140 -#define AON_PMUCAUSE 0x144 -#define AON_PMUSLEEP 0x148 -#define AON_PMUKEY 0x14C - -#define AON_LFROSC 0x070 -/* Constants */ - -#define AON_WDOGKEY_VALUE 0x51F15E -#define AON_WDOGFEED_VALUE 0xD09F00D - -#define AON_WDOGCFG_SCALE 0x0000000F -#define AON_WDOGCFG_RSTEN 0x00000100 -#define AON_WDOGCFG_ZEROCMP 0x00000200 -#define AON_WDOGCFG_ENALWAYS 0x00001000 -#define AON_WDOGCFG_ENCOREAWAKE 0x00002000 -#define AON_WDOGCFG_CMPIP 0x10000000 - -#define AON_RTCCFG_SCALE 0x0000000F -#define AON_RTCCFG_ENALWAYS 0x00001000 -#define AON_RTCCFG_CMPIP 0x10000000 - -#define AON_WAKEUPCAUSE_RESET 0x00 -#define AON_WAKEUPCAUSE_RTC 0x01 -#define AON_WAKEUPCAUSE_DWAKEUP 0x02 -#define AON_WAKEUPCAUSE_AWAKEUP 0x03 - -#define AON_RESETCAUSE_POWERON 0x0000 -#define AON_RESETCAUSE_EXTERNAL 0x0100 -#define AON_RESETCAUSE_WATCHDOG 0x0200 - -#define AON_PMUCAUSE_WAKEUPCAUSE 0x00FF -#define AON_PMUCAUSE_RESETCAUSE 0xFF00 - -#endif /* _SIFIVE_AON_H */ diff --git a/raven_spn/bsp/include/sifive/devices/clic.h b/raven_spn/bsp/include/sifive/devices/clic.h deleted file mode 100644 index e8dc2df..0000000 --- a/raven_spn/bsp/include/sifive/devices/clic.h +++ /dev/null @@ -1,30 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_CLIC_H -#define _SIFIVE_CLIC_H - -#define CLIC_HART0 0x00800000 -#define CLIC_MSIP 0x0000 -#define CLIC_MSIP_size 0x4 -#define CLIC_MTIMECMP 0x4000 -#define CLIC_MTIMECMP_size 0x8 -#define CLIC_MTIME 0xBFF8 -#define CLIC_MTIME_size 0x8 - -#define CLIC_INTIP 0x000 -#define CLIC_INTIE 0x400 -#define CLIC_INTCFG 0x800 -#define CLIC_CFG 0xc00 - -// These interrupt IDs are consistent across old and new mtvec modes -#define SSIPID 1 -#define MSIPID 3 -#define STIPID 5 -#define MTIPID 7 -#define SEIPID 9 -#define MEIPID 11 -#define CSIPID 12 -#define LOCALINTIDBASE 16 - - -#endif /* _SIFIVE_CLIC_H */ diff --git a/raven_spn/bsp/include/sifive/devices/clint.h b/raven_spn/bsp/include/sifive/devices/clint.h deleted file mode 100644 index cd3e0c7..0000000 --- a/raven_spn/bsp/include/sifive/devices/clint.h +++ /dev/null @@ -1,14 +0,0 @@ -// See LICENSE for license details - -#ifndef _SIFIVE_CLINT_H -#define _SIFIVE_CLINT_H - - -#define CLINT_MSIP 0x0000 -#define CLINT_MSIP_size 0x4 -#define CLINT_MTIMECMP 0x4000 -#define CLINT_MTIMECMP_size 0x8 -#define CLINT_MTIME 0xBFF8 -#define CLINT_MTIME_size 0x8 - -#endif /* _SIFIVE_CLINT_H */ diff --git a/raven_spn/bsp/include/sifive/devices/gpio.h b/raven_spn/bsp/include/sifive/devices/gpio.h deleted file mode 100644 index f7f0acb..0000000 --- a/raven_spn/bsp/include/sifive/devices/gpio.h +++ /dev/null @@ -1,24 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_GPIO_H -#define _SIFIVE_GPIO_H - -#define GPIO_INPUT_VAL (0x00) -#define GPIO_INPUT_EN (0x04) -#define GPIO_OUTPUT_EN (0x08) -#define GPIO_OUTPUT_VAL (0x0C) -#define GPIO_PULLUP_EN (0x10) -#define GPIO_DRIVE (0x14) -#define GPIO_RISE_IE (0x18) -#define GPIO_RISE_IP (0x1C) -#define GPIO_FALL_IE (0x20) -#define GPIO_FALL_IP (0x24) -#define GPIO_HIGH_IE (0x28) -#define GPIO_HIGH_IP (0x2C) -#define GPIO_LOW_IE (0x30) -#define GPIO_LOW_IP (0x34) -#define GPIO_IOF_EN (0x38) -#define GPIO_IOF_SEL (0x3C) -#define GPIO_OUTPUT_XOR (0x40) - -#endif /* _SIFIVE_GPIO_H */ diff --git a/raven_spn/bsp/include/sifive/devices/otp.h b/raven_spn/bsp/include/sifive/devices/otp.h deleted file mode 100644 index 93833e2..0000000 --- a/raven_spn/bsp/include/sifive/devices/otp.h +++ /dev/null @@ -1,23 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_OTP_H -#define _SIFIVE_OTP_H - -/* Register offsets */ - -#define OTP_LOCK 0x00 -#define OTP_CK 0x04 -#define OTP_OE 0x08 -#define OTP_SEL 0x0C -#define OTP_WE 0x10 -#define OTP_MR 0x14 -#define OTP_MRR 0x18 -#define OTP_MPP 0x1C -#define OTP_VRREN 0x20 -#define OTP_VPPEN 0x24 -#define OTP_A 0x28 -#define OTP_D 0x2C -#define OTP_Q 0x30 -#define OTP_READ_TIMINGS 0x34 - -#endif diff --git a/raven_spn/bsp/include/sifive/devices/plic.h b/raven_spn/bsp/include/sifive/devices/plic.h deleted file mode 100644 index e1ca5d6..0000000 --- a/raven_spn/bsp/include/sifive/devices/plic.h +++ /dev/null @@ -1,31 +0,0 @@ -// See LICENSE for license details. - -#ifndef PLIC_H -#define PLIC_H - -#include - -// 32 bits per source -#define PLIC_PRIORITY_OFFSET _AC(0x0000,UL) -#define PLIC_PRIORITY_SHIFT_PER_SOURCE 2 -// 1 bit per source (1 address) -#define PLIC_PENDING_OFFSET _AC(0x1000,UL) -#define PLIC_PENDING_SHIFT_PER_SOURCE 0 - -//0x80 per target -#define PLIC_ENABLE_OFFSET _AC(0x2000,UL) -#define PLIC_ENABLE_SHIFT_PER_TARGET 7 - - -#define PLIC_THRESHOLD_OFFSET _AC(0x200000,UL) -#define PLIC_CLAIM_OFFSET _AC(0x200004,UL) -#define PLIC_THRESHOLD_SHIFT_PER_TARGET 12 -#define PLIC_CLAIM_SHIFT_PER_TARGET 12 - -#define PLIC_MAX_SOURCE 1023 -#define PLIC_SOURCE_MASK 0x3FF - -#define PLIC_MAX_TARGET 15871 -#define PLIC_TARGET_MASK 0x3FFF - -#endif /* PLIC_H */ diff --git a/raven_spn/bsp/include/sifive/devices/prci.h b/raven_spn/bsp/include/sifive/devices/prci.h deleted file mode 100644 index 1a3de58..0000000 --- a/raven_spn/bsp/include/sifive/devices/prci.h +++ /dev/null @@ -1,56 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PRCI_H -#define _SIFIVE_PRCI_H - -/* Register offsets */ - -#define PRCI_HFROSCCFG (0x0000) -#define PRCI_HFXOSCCFG (0x0004) -#define PRCI_PLLCFG (0x0008) -#define PRCI_PLLDIV (0x000C) -#define PRCI_PROCMONCFG (0x00F0) - -/* Fields */ -#define ROSC_DIV(x) (((x) & 0x2F) << 0 ) -#define ROSC_TRIM(x) (((x) & 0x1F) << 16) -#define ROSC_EN(x) (((x) & 0x1 ) << 30) -#define ROSC_RDY(x) (((x) & 0x1 ) << 31) - -#define XOSC_EN(x) (((x) & 0x1) << 30) -#define XOSC_RDY(x) (((x) & 0x1) << 31) - -#define PLL_R(x) (((x) & 0x7) << 0) -// single reserved bit for F LSB. -#define PLL_F(x) (((x) & 0x3F) << 4) -#define PLL_Q(x) (((x) & 0x3) << 10) -#define PLL_SEL(x) (((x) & 0x1) << 16) -#define PLL_REFSEL(x) (((x) & 0x1) << 17) -#define PLL_BYPASS(x) (((x) & 0x1) << 18) -#define PLL_LOCK(x) (((x) & 0x1) << 31) - -#define PLL_R_default 0x1 -#define PLL_F_default 0x1F -#define PLL_Q_default 0x3 - -#define PLL_REFSEL_HFROSC 0x0 -#define PLL_REFSEL_HFXOSC 0x1 - -#define PLL_SEL_HFROSC 0x0 -#define PLL_SEL_PLL 0x1 - -#define PLL_FINAL_DIV(x) (((x) & 0x3F) << 0) -#define PLL_FINAL_DIV_BY_1(x) (((x) & 0x1 ) << 8) - -#define PROCMON_DIV(x) (((x) & 0x1F) << 0) -#define PROCMON_TRIM(x) (((x) & 0x1F) << 8) -#define PROCMON_EN(x) (((x) & 0x1) << 16) -#define PROCMON_SEL(x) (((x) & 0x3) << 24) -#define PROCMON_NT_EN(x) (((x) & 0x1) << 28) - -#define PROCMON_SEL_HFCLK 0 -#define PROCMON_SEL_HFXOSCIN 1 -#define PROCMON_SEL_PLLOUTDIV 2 -#define PROCMON_SEL_PROCMON 3 - -#endif // _SIFIVE_PRCI_H diff --git a/raven_spn/bsp/include/sifive/devices/pwm.h b/raven_spn/bsp/include/sifive/devices/pwm.h deleted file mode 100644 index 067889a..0000000 --- a/raven_spn/bsp/include/sifive/devices/pwm.h +++ /dev/null @@ -1,37 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PWM_H -#define _SIFIVE_PWM_H - -/* Register offsets */ - -#define PWM_CFG 0x00 -#define PWM_COUNT 0x08 -#define PWM_S 0x10 -#define PWM_CMP0 0x20 -#define PWM_CMP1 0x24 -#define PWM_CMP2 0x28 -#define PWM_CMP3 0x2C - -/* Constants */ - -#define PWM_CFG_SCALE 0x0000000F -#define PWM_CFG_STICKY 0x00000100 -#define PWM_CFG_ZEROCMP 0x00000200 -#define PWM_CFG_DEGLITCH 0x00000400 -#define PWM_CFG_ENALWAYS 0x00001000 -#define PWM_CFG_ONESHOT 0x00002000 -#define PWM_CFG_CMP0CENTER 0x00010000 -#define PWM_CFG_CMP1CENTER 0x00020000 -#define PWM_CFG_CMP2CENTER 0x00040000 -#define PWM_CFG_CMP3CENTER 0x00080000 -#define PWM_CFG_CMP0GANG 0x01000000 -#define PWM_CFG_CMP1GANG 0x02000000 -#define PWM_CFG_CMP2GANG 0x04000000 -#define PWM_CFG_CMP3GANG 0x08000000 -#define PWM_CFG_CMP0IP 0x10000000 -#define PWM_CFG_CMP1IP 0x20000000 -#define PWM_CFG_CMP2IP 0x40000000 -#define PWM_CFG_CMP3IP 0x80000000 - -#endif /* _SIFIVE_PWM_H */ diff --git a/raven_spn/bsp/include/sifive/devices/spi.h b/raven_spn/bsp/include/sifive/devices/spi.h deleted file mode 100644 index 80ef345..0000000 --- a/raven_spn/bsp/include/sifive/devices/spi.h +++ /dev/null @@ -1,80 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_SPI_H -#define _SIFIVE_SPI_H - -/* Register offsets */ - -#define SPI_REG_SCKDIV 0x00 -#define SPI_REG_SCKMODE 0x04 -#define SPI_REG_CSID 0x10 -#define SPI_REG_CSDEF 0x14 -#define SPI_REG_CSMODE 0x18 - -#define SPI_REG_DCSSCK 0x28 -#define SPI_REG_DSCKCS 0x2a -#define SPI_REG_DINTERCS 0x2c -#define SPI_REG_DINTERXFR 0x2e - -#define SPI_REG_FMT 0x40 -#define SPI_REG_TXFIFO 0x48 -#define SPI_REG_RXFIFO 0x4c -#define SPI_REG_TXCTRL 0x50 -#define SPI_REG_RXCTRL 0x54 - -#define SPI_REG_FCTRL 0x60 -#define SPI_REG_FFMT 0x64 - -#define SPI_REG_IE 0x70 -#define SPI_REG_IP 0x74 - -/* Fields */ - -#define SPI_SCK_PHA 0x1 -#define SPI_SCK_POL 0x2 - -#define SPI_FMT_PROTO(x) ((x) & 0x3) -#define SPI_FMT_ENDIAN(x) (((x) & 0x1) << 2) -#define SPI_FMT_DIR(x) (((x) & 0x1) << 3) -#define SPI_FMT_LEN(x) (((x) & 0xf) << 16) - -/* TXCTRL register */ -#define SPI_TXWM(x) ((x) & 0xffff) -/* RXCTRL register */ -#define SPI_RXWM(x) ((x) & 0xffff) - -#define SPI_IP_TXWM 0x1 -#define SPI_IP_RXWM 0x2 - -#define SPI_FCTRL_EN 0x1 - -#define SPI_INSN_CMD_EN 0x1 -#define SPI_INSN_ADDR_LEN(x) (((x) & 0x7) << 1) -#define SPI_INSN_PAD_CNT(x) (((x) & 0xf) << 4) -#define SPI_INSN_CMD_PROTO(x) (((x) & 0x3) << 8) -#define SPI_INSN_ADDR_PROTO(x) (((x) & 0x3) << 10) -#define SPI_INSN_DATA_PROTO(x) (((x) & 0x3) << 12) -#define SPI_INSN_CMD_CODE(x) (((x) & 0xff) << 16) -#define SPI_INSN_PAD_CODE(x) (((x) & 0xff) << 24) - -#define SPI_TXFIFO_FULL (1 << 31) -#define SPI_RXFIFO_EMPTY (1 << 31) - -/* Values */ - -#define SPI_CSMODE_AUTO 0 -#define SPI_CSMODE_HOLD 2 -#define SPI_CSMODE_OFF 3 - -#define SPI_DIR_RX 0 -#define SPI_DIR_TX 1 - -#define SPI_PROTO_S 0 -#define SPI_PROTO_D 1 -#define SPI_PROTO_Q 2 - -#define SPI_ENDIAN_MSB 0 -#define SPI_ENDIAN_LSB 1 - - -#endif /* _SIFIVE_SPI_H */ diff --git a/raven_spn/bsp/include/sifive/devices/uart.h b/raven_spn/bsp/include/sifive/devices/uart.h deleted file mode 100644 index 71bea6f..0000000 --- a/raven_spn/bsp/include/sifive/devices/uart.h +++ /dev/null @@ -1,27 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_UART_H -#define _SIFIVE_UART_H - -/* Register offsets */ -#define UART_REG_TXFIFO 0x00 -#define UART_REG_RXFIFO 0x04 -#define UART_REG_TXCTRL 0x08 -#define UART_REG_RXCTRL 0x0c -#define UART_REG_IE 0x10 -#define UART_REG_IP 0x14 -#define UART_REG_DIV 0x18 - -/* TXCTRL register */ -#define UART_TXEN 0x1 -#define UART_TXWM(x) (((x) & 0xffff) << 16) - -/* RXCTRL register */ -#define UART_RXEN 0x1 -#define UART_RXWM(x) (((x) & 0xffff) << 16) - -/* IP register */ -#define UART_IP_TXWM 0x1 -#define UART_IP_RXWM 0x2 - -#endif /* _SIFIVE_UART_H */ diff --git a/raven_spn/bsp/include/sifive/sections.h b/raven_spn/bsp/include/sifive/sections.h deleted file mode 100644 index 6e1f051..0000000 --- a/raven_spn/bsp/include/sifive/sections.h +++ /dev/null @@ -1,17 +0,0 @@ -// See LICENSE for license details. -#ifndef _SECTIONS_H -#define _SECTIONS_H - -extern unsigned char _rom[]; -extern unsigned char _rom_end[]; - -extern unsigned char _ram[]; -extern unsigned char _ram_end[]; - -extern unsigned char _ftext[]; -extern unsigned char _etext[]; -extern unsigned char _fbss[]; -extern unsigned char _ebss[]; -extern unsigned char _end[]; - -#endif /* _SECTIONS_H */ diff --git a/raven_spn/bsp/include/sifive/smp.h b/raven_spn/bsp/include/sifive/smp.h deleted file mode 100644 index 8e34388..0000000 --- a/raven_spn/bsp/include/sifive/smp.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef SIFIVE_SMP -#define SIFIVE_SMP - -// The maximum number of HARTs this code supports -#ifndef MAX_HARTS -#define MAX_HARTS 32 -#endif -#define CLINT_END_HART_IPI CLINT_CTRL_ADDR + (MAX_HARTS*4) - -// The hart that non-SMP tests should run on -#ifndef NONSMP_HART -#define NONSMP_HART 0 -#endif - -/* If your test cannot handle multiple-threads, use this: - * smp_disable(reg1) - */ -#define smp_disable(reg1, reg2) \ - csrr reg1, mhartid ;\ - li reg2, NONSMP_HART ;\ - beq reg1, reg2, hart0_entry ;\ -42: ;\ - wfi ;\ - j 42b ;\ -hart0_entry: - -/* If your test needs to temporarily block multiple-threads, do this: - * smp_pause(reg1, reg2) - * ... single-threaded work ... - * smp_resume(reg1, reg2) - * ... multi-threaded work ... - */ - -#define smp_pause(reg1, reg2) \ - li reg2, 0x8 ;\ - csrw mie, reg2 ;\ - csrr reg2, mhartid ;\ - bnez reg2, 42f - -#define smp_resume(reg1, reg2) \ - li reg1, CLINT_CTRL_ADDR ;\ -41: ;\ - li reg2, 1 ;\ - sw reg2, 0(reg1) ;\ - addi reg1, reg1, 4 ;\ - li reg2, CLINT_END_HART_IPI ;\ - blt reg1, reg2, 41b ;\ -42: ;\ - wfi ;\ - csrr reg2, mip ;\ - andi reg2, reg2, 0x8 ;\ - beqz reg2, 42b ;\ - li reg1, CLINT_CTRL_ADDR ;\ - csrr reg2, mhartid ;\ - slli reg2, reg2, 2 ;\ - add reg2, reg2, reg1 ;\ - sw zero, 0(reg2) ;\ -41: ;\ - lw reg2, 0(reg1) ;\ - bnez reg2, 41b ;\ - addi reg1, reg1, 4 ;\ - li reg2, CLINT_END_HART_IPI ;\ - blt reg1, reg2, 41b - -#endif diff --git a/raven_spn/bsp/libwrap/libwrap.mk b/raven_spn/bsp/libwrap/libwrap.mk deleted file mode 100644 index 71bba3d..0000000 --- a/raven_spn/bsp/libwrap/libwrap.mk +++ /dev/null @@ -1,56 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_LIBWRAP -_SIFIVE_MK_LIBWRAP := # defined - -LIBWRAP_DIR := $(dir $(lastword $(MAKEFILE_LIST))) -LIBWRAP_DIR := $(LIBWRAP_DIR:/=) - -LIBWRAP_SRCS := \ - stdlib/malloc.c \ - sys/open.c \ - sys/lseek.c \ - sys/read.c \ - sys/write.c \ - sys/fstat.c \ - sys/stat.c \ - sys/close.c \ - sys/link.c \ - sys/unlink.c \ - sys/execve.c \ - sys/fork.c \ - sys/getpid.c \ - sys/kill.c \ - sys/wait.c \ - sys/isatty.c \ - sys/times.c \ - sys/sbrk.c \ - sys/_exit.c \ - sys/puts.c \ - misc/write_hex.c - -LIBWRAP_SRCS := $(foreach f,$(LIBWRAP_SRCS),$(LIBWRAP_DIR)/$(f)) -LIBWRAP_OBJS := $(LIBWRAP_SRCS:.c=.o) - -LIBWRAP_SYMS := malloc free \ - open lseek read write fstat stat close link unlink \ - execve fork getpid kill wait \ - isatty times sbrk _exit puts - -LIBWRAP := libwrap.a - -LINK_DEPS += $(LIBWRAP) - -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=$(s)) -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=_$(s)) -LDFLAGS += -L. -Wl,--start-group -lwrap -lc -Wl,--end-group - -CLEAN_OBJS += $(LIBWRAP_OBJS) - -$(LIBWRAP_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(LIBWRAP): $(LIBWRAP_OBJS) - $(AR) rcs $@ $^ - -endif # _SIFIVE_MK_LIBWRAP diff --git a/raven_spn/bsp/libwrap/misc/write_hex.c b/raven_spn/bsp/libwrap/misc/write_hex.c deleted file mode 100644 index a35ad7a..0000000 --- a/raven_spn/bsp/libwrap/misc/write_hex.c +++ /dev/null @@ -1,19 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "platform.h" - -void write_hex(int fd, unsigned long int hex) -{ - uint8_t ii; - uint8_t jj; - char towrite; - write(fd , "0x", 2); - for (ii = sizeof(unsigned long int) * 2 ; ii > 0; ii--) { - jj = ii - 1; - uint8_t digit = ((hex & (0xF << (jj*4))) >> (jj*4)); - towrite = digit < 0xA ? ('0' + digit) : ('A' + (digit - 0xA)); - write(fd, &towrite, 1); - } -} diff --git a/raven_spn/bsp/libwrap/stdlib/malloc.c b/raven_spn/bsp/libwrap/stdlib/malloc.c deleted file mode 100644 index 8f4f432..0000000 --- a/raven_spn/bsp/libwrap/stdlib/malloc.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE for license details. */ - -/* These functions are intended for embedded RV32 systems and are - obviously incorrect in general. */ - -void* __wrap_malloc(unsigned long sz) -{ - extern void* sbrk(long); - void* res = sbrk(sz); - if ((long)res == -1) - return 0; - return res; -} - -void __wrap_free(void* ptr) -{ -} diff --git a/raven_spn/bsp/libwrap/sys/_exit.c b/raven_spn/bsp/libwrap/sys/_exit.c deleted file mode 100644 index 011464f..0000000 --- a/raven_spn/bsp/libwrap/sys/_exit.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "platform.h" -#include "weak_under_alias.h" - -void __wrap_exit(int code) -{ - const char message[] = "\nProgam has exited with code:"; - - write(STDERR_FILENO, message, sizeof(message) - 1); - write_hex(STDERR_FILENO, code); - write(STDERR_FILENO, "\n", 1); - - for (;;); -} -weak_under_alias(exit); diff --git a/raven_spn/bsp/libwrap/sys/close.c b/raven_spn/bsp/libwrap/sys/close.c deleted file mode 100644 index 199fe51..0000000 --- a/raven_spn/bsp/libwrap/sys/close.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_close(int fd) -{ - return _stub(EBADF); -} -weak_under_alias(close); diff --git a/raven_spn/bsp/libwrap/sys/execve.c b/raven_spn/bsp/libwrap/sys/execve.c deleted file mode 100644 index f7be25a..0000000 --- a/raven_spn/bsp/libwrap/sys/execve.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_execve(const char* name, char* const argv[], char* const env[]) -{ - return _stub(ENOMEM); -} -weak_under_alias(execve); diff --git a/raven_spn/bsp/libwrap/sys/fork.c b/raven_spn/bsp/libwrap/sys/fork.c deleted file mode 100644 index 13a3e65..0000000 --- a/raven_spn/bsp/libwrap/sys/fork.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int fork(void) -{ - return _stub(EAGAIN); -} diff --git a/raven_spn/bsp/libwrap/sys/fstat.c b/raven_spn/bsp/libwrap/sys/fstat.c deleted file mode 100644 index ff82bf9..0000000 --- a/raven_spn/bsp/libwrap/sys/fstat.c +++ /dev/null @@ -1,18 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_fstat(int fd, struct stat* st) -{ - if (isatty(fd)) { - st->st_mode = S_IFCHR; - return 0; - } - - return _stub(EBADF); -} -weak_under_alias(fstat); diff --git a/raven_spn/bsp/libwrap/sys/getpid.c b/raven_spn/bsp/libwrap/sys/getpid.c deleted file mode 100644 index 195fbec..0000000 --- a/raven_spn/bsp/libwrap/sys/getpid.c +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE of license details. */ -#include "weak_under_alias.h" - -int __wrap_getpid(void) -{ - return 1; -} -weak_under_alias(getpid); diff --git a/raven_spn/bsp/libwrap/sys/isatty.c b/raven_spn/bsp/libwrap/sys/isatty.c deleted file mode 100644 index 7bb82ab..0000000 --- a/raven_spn/bsp/libwrap/sys/isatty.c +++ /dev/null @@ -1,13 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "weak_under_alias.h" - -int __wrap_isatty(int fd) -{ - if (fd == STDOUT_FILENO || fd == STDERR_FILENO) - return 1; - - return 0; -} -weak_under_alias(isatty); diff --git a/raven_spn/bsp/libwrap/sys/kill.c b/raven_spn/bsp/libwrap/sys/kill.c deleted file mode 100644 index 18b9bd4..0000000 --- a/raven_spn/bsp/libwrap/sys/kill.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_kill(int pid, int sig) -{ - return _stub(EINVAL); -} -weak_under_alias(kill); diff --git a/raven_spn/bsp/libwrap/sys/link.c b/raven_spn/bsp/libwrap/sys/link.c deleted file mode 100644 index 0cad551..0000000 --- a/raven_spn/bsp/libwrap/sys/link.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_link(const char *old_name, const char *new_name) -{ - return _stub(EMLINK); -} -weak_under_alias(link); diff --git a/raven_spn/bsp/libwrap/sys/lseek.c b/raven_spn/bsp/libwrap/sys/lseek.c deleted file mode 100644 index 4131449..0000000 --- a/raven_spn/bsp/libwrap/sys/lseek.c +++ /dev/null @@ -1,16 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -off_t __wrap_lseek(int fd, off_t ptr, int dir) -{ - if (isatty(fd)) - return 0; - - return _stub(EBADF); -} -weak_under_alias(lseek); diff --git a/raven_spn/bsp/libwrap/sys/open.c b/raven_spn/bsp/libwrap/sys/open.c deleted file mode 100644 index c61415a..0000000 --- a/raven_spn/bsp/libwrap/sys/open.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_open(const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} -weak_under_alias(open); diff --git a/raven_spn/bsp/libwrap/sys/openat.c b/raven_spn/bsp/libwrap/sys/openat.c deleted file mode 100644 index 227c956..0000000 --- a/raven_spn/bsp/libwrap/sys/openat.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_openat(int dirfd, const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} -weak_under_alias(openat); diff --git a/raven_spn/bsp/libwrap/sys/puts.c b/raven_spn/bsp/libwrap/sys/puts.c deleted file mode 100644 index 50d6437..0000000 --- a/raven_spn/bsp/libwrap/sys/puts.c +++ /dev/null @@ -1,28 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_puts(const char *s) -{ - while (*s != '\0') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = *s; - - if (*s == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - - ++s; - } - - return 0; -} -weak_under_alias(puts); diff --git a/raven_spn/bsp/libwrap/sys/read.c b/raven_spn/bsp/libwrap/sys/read.c deleted file mode 100644 index 3226cdb..0000000 --- a/raven_spn/bsp/libwrap/sys/read.c +++ /dev/null @@ -1,32 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -ssize_t __wrap_read(int fd, void* ptr, size_t len) -{ - uint8_t * current = (uint8_t *)ptr; - volatile uint32_t * uart_rx = (uint32_t *)(UART0_CTRL_ADDR + UART_REG_RXFIFO); - volatile uint8_t * uart_rx_cnt = (uint8_t *)(UART0_CTRL_ADDR + UART_REG_RXCTRL + 2); - - ssize_t result = 0; - - if (isatty(fd)) { - for (current = (uint8_t *)ptr; - (current < ((uint8_t *)ptr) + len) && (*uart_rx_cnt > 0); - current ++) { - *current = *uart_rx; - result++; - } - return result; - } - - return _stub(EBADF); -} -weak_under_alias(read); diff --git a/raven_spn/bsp/libwrap/sys/sbrk.c b/raven_spn/bsp/libwrap/sys/sbrk.c deleted file mode 100644 index 12170b4..0000000 --- a/raven_spn/bsp/libwrap/sys/sbrk.c +++ /dev/null @@ -1,18 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "weak_under_alias.h" - -void *__wrap_sbrk(ptrdiff_t incr) -{ - extern char _end[]; - extern char _heap_end[]; - static char *curbrk = _end; - - if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) - return NULL - 1; - - curbrk += incr; - return curbrk - incr; -} -weak_under_alias(sbrk); diff --git a/raven_spn/bsp/libwrap/sys/stat.c b/raven_spn/bsp/libwrap/sys/stat.c deleted file mode 100644 index 1576ca1..0000000 --- a/raven_spn/bsp/libwrap/sys/stat.c +++ /dev/null @@ -1,12 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_stat(const char* file, struct stat* st) -{ - return _stub(EACCES); -} -weak_under_alias(stat); diff --git a/raven_spn/bsp/libwrap/sys/stub.h b/raven_spn/bsp/libwrap/sys/stub.h deleted file mode 100644 index fb5e5be..0000000 --- a/raven_spn/bsp/libwrap/sys/stub.h +++ /dev/null @@ -1,10 +0,0 @@ -/* See LICENSE of license details. */ -#ifndef _SIFIVE_SYS_STUB_H -#define _SIFIVE_SYS_STUB_H - -static inline int _stub(int err) -{ - return -1; -} - -#endif /* _SIFIVE_SYS_STUB_H */ diff --git a/raven_spn/bsp/libwrap/sys/times.c b/raven_spn/bsp/libwrap/sys/times.c deleted file mode 100644 index 55969a7..0000000 --- a/raven_spn/bsp/libwrap/sys/times.c +++ /dev/null @@ -1,12 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -clock_t __wrap_times(struct tms* buf) -{ - return _stub(EACCES); -} -weak_under_alias(times); diff --git a/raven_spn/bsp/libwrap/sys/unlink.c b/raven_spn/bsp/libwrap/sys/unlink.c deleted file mode 100644 index 09f4da7..0000000 --- a/raven_spn/bsp/libwrap/sys/unlink.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_unlink(const char* name) -{ - return _stub(ENOENT); -} -weak_under_alias(unlink); diff --git a/raven_spn/bsp/libwrap/sys/wait.c b/raven_spn/bsp/libwrap/sys/wait.c deleted file mode 100644 index ea3225b..0000000 --- a/raven_spn/bsp/libwrap/sys/wait.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int wait(int* status) -{ - return _stub(ECHILD); -} diff --git a/raven_spn/bsp/libwrap/sys/weak_under_alias.h b/raven_spn/bsp/libwrap/sys/weak_under_alias.h deleted file mode 100644 index 7629353..0000000 --- a/raven_spn/bsp/libwrap/sys/weak_under_alias.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _BSP_LIBWRAP_WEAK_UNDER_ALIAS_H -#define _BSP_LIBWRAP_WEAK_UNDER_ALIAS_H - -#define weak_under_alias(name) \ - extern __typeof (__wrap_##name) __wrap__##name __attribute__ ((weak, alias ("__wrap_"#name))) - -#endif diff --git a/raven_spn/bsp/libwrap/sys/write.c b/raven_spn/bsp/libwrap/sys/write.c deleted file mode 100644 index b1e9a7e..0000000 --- a/raven_spn/bsp/libwrap/sys/write.c +++ /dev/null @@ -1,31 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -ssize_t __wrap_write(int fd, const void* ptr, size_t len) -{ - const uint8_t * current = (const char *)ptr; - - if (isatty(fd)) { - for (size_t jj = 0; jj < len; jj++) { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = current[jj]; - - if (current[jj] == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - } - return len; - } - - return _stub(EBADF); -} -weak_under_alias(write); diff --git a/raven_spn/raven_spn b/raven_spn/raven_spn deleted file mode 100755 index cb16d4025f47529a349cd2cee2493d69e15db3c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123836 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 diff --git a/raven_spn/src/bsp.h b/raven_spn/src/bsp.h deleted file mode 100644 index f04f4f4..0000000 --- a/raven_spn/src/bsp.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * bsp.h - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#ifndef BSP_H_ -#define BSP_H_ - -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -extern void trap_entry(); -#ifdef __cplusplus -} -#endif - -#endif /* BSP_H_ */ diff --git a/raven_spn/src/delay.c b/raven_spn/src/delay.c deleted file mode 100644 index 24070b4..0000000 --- a/raven_spn/src/delay.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * delay.c - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#include "delay.h" - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -typedef struct { - uint32_t n; - uint32_t mult; - uint32_t shift; -} int_inverse ; - -int_inverse f_cpu_1000_inv; -int_inverse f_cpu_1000000_inv; - -uint32_t F_CPU=1000000; - -void calc_inv(uint32_t n, int_inverse * res){ - uint32_t one = ~0; - uint32_t d = one/n; - uint32_t r = one%n + 1; - if (r >= n) ++d; - if (d == 0) --d; - uint32_t shift = 0; - while ((d & 0x80000000) == 0){ - d <<= 1; - ++shift; - } - res->n = n; - res->mult = d; - res->shift = shift; -} - -uint32_t divide32_using_inverse(uint32_t n, int_inverse *inv){ - uint32_t d = (uint32_t)(((uint64_t)n * inv->mult) >> 32); - d >>= inv->shift; - if (n - d*inv->n >= inv->n) ++d; - return d; -} - -// Almost full-range 64/32 divide. -// If divisor-1 has i bits, then the answer is exact for n of up to 64-i bits -// e.g. for divisors up to a million, n can have up to 45 bits -// On RV32IM with divide32_using_inverse inlines this uses 5 multiplies, -// 33 instructions, zero branches, 3 loads, 0 stores. -uint64_t divide64_using_inverse(uint64_t n, int_inverse *inv){ - uint32_t preshift = (31 - inv->shift) & 31; - uint64_t d = (uint64_t)divide32_using_inverse(n >> preshift, inv) << preshift; - uint32_t r = n - d * inv->n; - d += divide32_using_inverse(r, inv); - return d; -} - - -uint32_t millis(){ - uint64_t x; - rdmcycle(&x); - x = divide64_using_inverse(x, &f_cpu_1000_inv); - return((uint32_t) (x & 0xFFFFFFFF)); -} - -uint32_t micros(void){ - uint64_t x; - rdmcycle(&x); - // For Power-of-two MHz F_CPU, - // this compiles into a simple shift, - // and is faster than the general solution. -#if F_CPU==16000000 - x = x / (F_CPU / 1000000); -#else -#if F_CPU==256000000 - x = x / (F_CPU / 1000000); -#else - x = divide64_using_inverse(x, &f_cpu_1000000_inv); -#endif -#endif - return((uint32_t) (x & 0xFFFFFFFF)); -} - - -void delayMS(uint32_t dwMs){ - uint64_t current, later; - rdmcycle(¤t); - later = current + dwMs * (F_CPU/1000); - if (later > current){ // usual case - while (later > current) - rdmcycle(¤t); - } else { // wrap. Though this is unlikely to be hit w/ 64-bit mcycle - while (later < current) - rdmcycle(¤t); - while (current < later) - rdmcycle(¤t); - } -} - -void delayUS(uint32_t dwUs){ - uint64_t current, later; - rdmcycle(¤t); - later = current + dwUs * (F_CPU/1000000); - if (later > current){ // usual case - while (later > current) - rdmcycle(¤t); - } else {// wrap. Though this is unlikely to be hit w/ 64-bit mcycle - while (later < current) - rdmcycle(¤t); - while (current < later) - rdmcycle(¤t); - } -} diff --git a/raven_spn/src/delay.h b/raven_spn/src/delay.h deleted file mode 100644 index 36ce098..0000000 --- a/raven_spn/src/delay.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * delay.h - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#ifndef DELAY_H_ -#define DELAY_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif -extern uint32_t F_CPU; - -void delayMS(uint32_t dwMs); -void delayUS(uint32_t dwUs); - -#ifdef __cplusplus -} -#endif - -#endif /* DELAY_H_ */ diff --git a/raven_spn/src/init.h b/raven_spn/src/init.h deleted file mode 100644 index 1982cf5..0000000 --- a/raven_spn/src/init.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef SRC_INIT_H_ -#define SRC_INIT_H_ - -#include -#include - -#include "delay.h" -#include "bsp.h" -#include "plic/plic_driver.h" - -typedef void (*function_ptr_t) (void); -//! Instance data for the PLIC. -plic_instance_t g_plic; -std::array g_ext_interrupt_handlers; -volatile bool spn1_hw_interrupt{true}; -volatile bool spn2_hw_interrupt{true}; - - -/*! \brief external interrupt handler - * - * routes the peripheral interrupts to the the respective handler - * - */ -extern "C" void handle_m_ext_interrupt() { - plic_source int_num = PLIC_claim_interrupt(&g_plic); - if ((int_num >=1 ) && (int_num < PLIC_NUM_INTERRUPTS)) - g_ext_interrupt_handlers[int_num](); - else - exit(1 + (uintptr_t) int_num); - PLIC_complete_interrupt(&g_plic, int_num); -} -/*! \brief dummy interrupt handler - * - */ -void no_interrupt_handler (void) {}; -/*! \brief configure the per-interrupt handler - * - */ -void configure_irq(size_t irq_num, function_ptr_t handler, unsigned char prio=1) { - g_ext_interrupt_handlers[irq_num] = handler; - // Priority must be set > 0 to trigger the interrupt. - PLIC_set_priority(&g_plic, irq_num, prio); - // Have to enable the interrupt both at the GPIO level, and at the PLIC level. - PLIC_enable_interrupt(&g_plic, irq_num); -} - -void wait_for_spn1_interrupt() { - // This is a time critical part. It must be ensured that no interrupt is processed between flag checking and wfi. - // Disable interrupts and wait a few more clocks for the instruction to take effect before checking the flag. - asm volatile ("csrrc x0, mie, %0; nop; nop" : : "r"(MIP_MEIP)); - while(spn1_hw_interrupt) { - // Enable interrupts and immediately enter wfi. - asm volatile ("csrrs x0, mie, %0; wfi; nop" : : "r"(MIP_MEIP)); - // Disable interrupts again before examine the flag value. - asm volatile ("csrrc x0, mie, %0; nop; nop" : : "r"(MIP_MEIP)); - } - spn1_hw_interrupt=true; - set_csr(mie, MIP_MEIP); -} - -void wait_for_spn2_interrupt() { - asm volatile ("csrrc x0, mie, %0; nop; nop" : : "r"(MIP_MEIP)); - while(spn2_hw_interrupt) { - asm volatile ("csrrs x0, mie, %0; wfi; nop" : : "r"(MIP_MEIP)); - asm volatile ("csrrc x0, mie, %0; nop; nop" : : "r"(MIP_MEIP)); - } - spn2_hw_interrupt=true; - set_csr(mie, MIP_MEIP); -} - -void wait_for_spn_interrupts() { - asm volatile ("csrrc x0, mie, %0; nop; nop" : : "r"(MIP_MEIP)); - while(spn1_hw_interrupt || spn2_hw_interrupt) { - asm volatile ("csrrs x0, mie, %0; wfi; nop" : : "r"(MIP_MEIP)); - asm volatile ("csrrc x0, mie, %0; nop; nop" : : "r"(MIP_MEIP)); - } - spn1_hw_interrupt=true; - spn2_hw_interrupt=true; - set_csr(mie, MIP_MEIP); -} - -/*!\brief initializes platform - * - */ -void platform_init(){ - // UART init section TODO: clarify how to get the functions from init.c? - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; - - F_CPU=PRCI_measure_mcycle_freq(20, RTC_FREQ); - printf("core freq at %d Hz\n", F_CPU); - // initialie interupt & trap handling - write_csr(mtvec, &trap_entry); - - PLIC_init(&g_plic, PLIC_CTRL_ADDR, PLIC_NUM_INTERRUPTS, PLIC_NUM_PRIORITIES, 0); - // Disable the machine & timer interrupts until setup is done. - clear_csr(mie, MIP_MEIP); - clear_csr(mie, MIP_MTIP); - for (auto& h:g_ext_interrupt_handlers) h=no_interrupt_handler; - // Enable interrupts in general. - set_csr(mstatus, MSTATUS_MIE); - // Enable the Machine-External bit in MIE - set_csr(mie, MIP_MEIP); - - //hw_interrupt = false; -} - -#endif /* SRC_INIT_H_ */ diff --git a/raven_spn/src/io/gpio.h b/raven_spn/src/io/gpio.h deleted file mode 100644 index 466f2d2..0000000 --- a/raven_spn/src/io/gpio.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * gpio.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef GPIO_H_ -#define GPIO_H_ - -#include -#include - -template -class gpio_regs { -public: - static inline uint32_t& value_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_INPUT_VAL); - } - - static inline uint32_t& input_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_INPUT_EN); - } - - static inline uint32_t& output_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_EN); - } - - static inline uint32_t& port_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_VAL); - } - - static inline uint32_t& pue_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_PULLUP_EN); - } - - static inline uint32_t& ds_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_DRIVE); - } - - static inline uint32_t& rise_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_RISE_IE); - } - - static inline uint32_t& rise_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_RISE_IP); - } - - static inline uint32_t& fall_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_FALL_IE); - } - - static inline uint32_t& fall_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_FALL_IP); - } - - static inline uint32_t& high_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_HIGH_IE); - } - - static inline uint32_t& high_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_HIGH_IP); - } - - static inline uint32_t& low_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_LOW_IE); - } - - static inline uint32_t& low_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_LOW_IP); - } - - static inline uint32_t& iof_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_IOF_EN); - } - - static inline uint32_t& iof_sel_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_IOF_SEL); - } - - static inline uint32_t& out_xor_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_XOR); - } - -}; - - - -#endif /* GPIO_H_ */ diff --git a/raven_spn/src/io/pwm.h b/raven_spn/src/io/pwm.h deleted file mode 100644 index 2aab61b..0000000 --- a/raven_spn/src/io/pwm.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * pwm.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef PWM_H_ -#define PWM_H_ - -#include -#include "util/bit_field.h" -#include -#include - -template -class pwm_regs { -public: - BEGIN_BF_DECL(pwmcfg_t, uint32_t); - BF_FIELD(scale, 0, 4); - BF_FIELD(sticky, 8, 1); - BF_FIELD(zerocmp, 9, 1); - BF_FIELD(deglitch, 10, 1); - BF_FIELD(enalways, 12, 1); - BF_FIELD(enoneshot, 13, 1); - BF_FIELD(cmp0center, 16, 1); - BF_FIELD(cmp1center, 17, 1); - BF_FIELD(cmp2center, 18, 1); - BF_FIELD(cmp3center, 19, 1); - BF_FIELD(cmp0gang, 24, 1); - BF_FIELD(cmp1gang, 25, 1); - BF_FIELD(cmp2gang, 26, 1); - BF_FIELD(cmp3gang, 27, 1); - BF_FIELD(cmp0ip, 28, 1); - BF_FIELD(cmp1ip, 29, 1); - BF_FIELD(cmp2ip, 30, 1); - BF_FIELD(cmp3ip, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(pwms_t, uint32_t); - BF_FIELD(s, 0, 16); - END_BF_DECL() r_pwms; - - BEGIN_BF_DECL(pwmcmp0_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp0; - - BEGIN_BF_DECL(pwmcmp1_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp1; - - BEGIN_BF_DECL(pwmcmp2_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp2; - - BEGIN_BF_DECL(pwmcmp3_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp3; - - static inline pwmcfg_t& cfg_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CFG); - } - - static inline uint32_t& count_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_COUNT); - } - - static inline pwms_t& s_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_S); - } - - static inline pwmcmp0_t& cmp0_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP0); - } - - static inline pwmcmp1_t& cmp1_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP1); - } - - static inline pwmcmp2_t& cmp2_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP2); - } - - static inline pwmcmp3_t& cmp3_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP3); - } - - static inline bool oneshot_delay(long delay_us){ - auto scaling_factor=0; - while(delay_us/(1< std::numeric_limits::max()){ - scaling_factor++; - } - cfg_reg()=0; - count_reg()=0; - cfg_reg().scale=4+scaling_factor; // divide by 16 so we get 1us per pwm clock - cmp0_reg().cmp0 = delay_us/(1< -#include "util/bit_field.h" -#include -#include - -template -class spi_regs { -public: - // storage declarations - BEGIN_BF_DECL(sckdiv_t, uint32_t); - BF_FIELD(div, 0, 12); - END_BF_DECL(); - - BEGIN_BF_DECL(sckmode_t, uint32_t); - BF_FIELD(pha, 0, 1); - BF_FIELD(pol, 1, 1); - END_BF_DECL(); - - uint32_t r_csid; - - uint32_t r_csdef; - - BEGIN_BF_DECL(csmode_t, uint32_t); - BF_FIELD(mode, 0, 2); - END_BF_DECL(); - - BEGIN_BF_DECL(delay0_t, uint32_t); - BF_FIELD(cssck, 0, 8); - BF_FIELD(sckcs, 16, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(delay1_t, uint32_t); - BF_FIELD(intercs, 0, 16); - BF_FIELD(interxfr, 16, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(fmt_t, uint32_t); - BF_FIELD(proto, 0, 2); - BF_FIELD(endian, 2, 1); - BF_FIELD(dir, 3, 1); - BF_FIELD(len, 16, 4); - END_BF_DECL(); - - BEGIN_BF_DECL(txdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(full, 31, 1); - END_BF_DECL() r_txdata; - - BEGIN_BF_DECL(rxdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(empty, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(txmark_t, uint32_t); - BF_FIELD(txmark, 0, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(rxmark_t, uint32_t); - BF_FIELD(rxmark, 0, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(fctrl_t, uint32_t); - BF_FIELD(en, 0, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ffmt_t, uint32_t); - BF_FIELD(cmd_en, 0, 1); - BF_FIELD(addr_len, 1, 2); - BF_FIELD(pad_cnt, 3, 4); - BF_FIELD(cmd_proto, 7, 2); - BF_FIELD(addr_proto, 9, 2); - BF_FIELD(data_proto, 11, 2); - BF_FIELD(cmd_code, 16, 8); - BF_FIELD(pad_code, 24, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(ie_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ip_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - static inline sckdiv_t& sckdiv_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_SCKDIV); - } - - static inline sckmode_t& sckmode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_SCKMODE); - } - - static inline uint32_t& csid_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSID); - } - - static inline uint32_t& csdef_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSDEF); - } - - static inline csmode_t& csmode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSMODE); - } - - static inline delay0_t& dcssck_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DCSSCK); - } - - static inline uint32_t& dsckcs_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DSCKCS); - } - - static inline delay1_t& dintercs_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DINTERCS); - } - - static inline uint32_t& dinterxfr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DINTERXFR); - } - - static inline fmt_t& fmt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FMT); - } - - static inline txdata_t& txfifo_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_TXFIFO); - } - - static inline rxdata_t& rxfifo_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_RXFIFO); - } - - static inline txmark_t& txctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_TXCTRL); - } - - static inline rxmark_t& rxctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_RXCTRL); - } - - static inline fctrl_t& fctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FCTRL); - } - - static inline ffmt_t& ffmt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FFMT); - } - - static inline ie_t& ie_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_IE); - } - - static inline ip_t& ip_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_IP); - } - - template - static bool transfer(std::array& bytes){ - csmode_reg().mode=2; // HOLD mode - rxctrl_reg().rxmark=bytes.size()-1; // trigger irq if more than 2 bytes are received; - ie_reg().rxwm=1; - // write data bytes - for(size_t i=0; i -#include "util/bit_field.h" -#include - -template -class uart_regs { -public: - BEGIN_BF_DECL(txdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(full, 31, 1); - END_BF_DECL() ; - - BEGIN_BF_DECL(rxdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(empty, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(txctrl_t, uint32_t); - BF_FIELD(txen, 0, 1); - BF_FIELD(nstop, 1, 1); - BF_FIELD(txcnt, 16, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(rxctrl_t, uint32_t); - BF_FIELD(rxen, 0, 1); - BF_FIELD(rxcnt, 16, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(ie_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ip_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(div_t, uint32_t); - BF_FIELD(div, 0, 16); - END_BF_DECL(); - - static inline txdata_t& txdata_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_TXFIFO); - } - - static inline rxdata_t& rxdata_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_RXFIFO); - } - - static inline txctrl_t& txctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_TXCTRL); - } - - static inline rxctrl_t& rxctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_RXCTRL); - } - - static inline ie_t& ie_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_IE); - } - - static inline ip_t& ip_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_IP); - } - - static inline div_t& div_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_DIV); - } - -}; - -#endif /* SPI_H_ */ diff --git a/raven_spn/src/raven_spn.cpp b/raven_spn/src/raven_spn.cpp deleted file mode 100644 index e23b5ab..0000000 --- a/raven_spn/src/raven_spn.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "raven_spn.h" -#include "spn_regs.h" -#include "init.h" -#include "spn_checker_regs.h" - -using spn_1 = spn_regs<0x90000000>; -using spn_2 = spn_regs<0xC0000000>; -using spn_checker = spn_checker_regs<0x10040000>; - -void run_xspn1(int in_addr, int out_addr, int num_samples, int in_beats, int out_beats) { - spn_1::mode_reg() = 0; - spn_1::input_length_reg() = num_samples; // each sample consists of 5 uint8 values - spn_1::input_addr_reg() = in_addr; - spn_1::output_addr_reg() = out_addr; - spn_1::num_of_in_beats_reg() = in_beats; // Number of AXI4 burst beats needed to load all input data - spn_1::num_of_out_beats_reg() = out_beats; // Number of AXI4 burst beats needed to store all result data - asm volatile ("csrrc x0, mie, %0; nop; nop" : : "r"(MIP_MEIP)); // Disable interrupts - printf("Starting first XSPN instance\n"); - asm volatile ("csrrs x0, mie, %0; nop" : : "r"(MIP_MEIP)); // Enable interrupts - spn_1::start_reg() = 1; -} - -void run_xspn2(int in_addr, int out_addr, int num_samples, int in_beats, int out_beats) { - spn_2::mode_reg() = 0; - spn_2::input_length_reg() = num_samples; // each sample consists of 5 uint8 values - spn_2::input_addr_reg() = in_addr; - spn_2::output_addr_reg() = out_addr; - spn_2::num_of_in_beats_reg() = in_beats; // Number of AXI4 burst beats needed to load all input data - spn_2::num_of_out_beats_reg() = out_beats; // Number of AXI4 burst beats needed to store all result data - asm volatile ("csrrc x0, mie, %0; nop; nop" : : "r"(MIP_MEIP)); // Disable interrupts - printf("Starting second XSPN instance\n"); - asm volatile ("csrrs x0, mie, %0; nop" : : "r"(MIP_MEIP)); // Enable interrupts - spn_2::start_reg() = 1; -} - -static void spn1_interrupt_handler(){ - spn1_hw_interrupt = false; - spn_1::interrupt_reg() = 1; -} - -static void spn2_interrupt_handler(){ - spn2_hw_interrupt = false; - spn_2::interrupt_reg() = 1; -} -/*! \brief main function - * - */ -int main() { - - - platform_init(); - configure_irq(2, spn1_interrupt_handler); - configure_irq(22, spn2_interrupt_handler); - - - uint32_t xspn_count = spn_checker::xspn_count_reg(); - uint32_t batch_size = spn_checker::batch_size_reg(); - uint32_t iterations = spn_checker::num_iterations_reg(); - - printf("XSPN COUNT: %d\n", xspn_count); - if (xspn_count < 1 || xspn_count > 2) { - printf("ERROR: invalid XSPN COUNT"); - return 1; - } - printf("BATCH SIZE: %d\n", batch_size); - printf("ITERATIONS: %d\n", iterations); - - - - int in_addr = 0x30000000; // place input samples in the SPI memory - int out_addr1 = 0x3C000000; - int out_addr2 = 0x3E000000; - - spn_1::mode_reg() = 1; - spn_1::start_reg() = 1; - wait_for_spn1_interrupt(); - uint32_t readout = spn_1::readout_reg(); - printf("READOUT first HW instance:0x%x\n", readout); - - if (xspn_count == 2) { - spn_2::mode_reg() = 1; - spn_2::start_reg() = 1; - wait_for_spn2_interrupt(); - uint32_t readout2 = spn_2::readout_reg(); - printf("READOUT second HW instance:0x%x\n", readout2); - } - - uint32_t axi_bytes = readout; - axi_bytes = axi_bytes & 0xff; - axi_bytes = 1 << axi_bytes; - - printf("AXI Bytes: %d\n", axi_bytes); - - uint32_t sample_bytes = readout; - sample_bytes = sample_bytes >> 16; - sample_bytes = sample_bytes / 8; - printf("Sample Bytes: %d\n", sample_bytes); - - uint32_t result_bytes = 8; - printf("Result Bytes: %d\n", result_bytes); - - uint32_t in_bytes = batch_size * sample_bytes; - uint32_t out_bytes = batch_size * result_bytes; - - uint32_t total_in = in_bytes * iterations; - - if (total_in > (out_addr1 - in_addr)) { - printf("ERROR: input data requires %d bytes, only %d bytes available\n", total_in, out_addr1 - in_addr); - return 1; - } - if (out_bytes > (out_addr2 - out_addr1)) { - printf("ERROR: output data requires %d bytes, only %d bytes available\n", out_bytes, out_addr2 - out_addr1); - return 1; - } - - - uint32_t in_beats = in_bytes / axi_bytes; - if (in_beats * axi_bytes < batch_size * sample_bytes) in_beats++; - uint32_t out_beats = out_bytes / axi_bytes; - if (out_beats * axi_bytes < batch_size * result_bytes) out_beats++; - - uint32_t current_in_addr = in_addr; - - // inject SPN input data - spn_checker::input_addr_reg() = current_in_addr; - spn_checker::num_input_samples_reg() = sample_bytes * batch_size * iterations; - spn_checker::start_data_trans_reg() = 1; - spn_checker::output_addr_reg() = out_addr1; - if (xspn_count == 2) { - spn_checker::output_addr2_reg() = out_addr2; - } - for (int k = 0; k < iterations*batch_size; k+=batch_size) { - run_xspn1(current_in_addr, out_addr1, batch_size, in_beats, out_beats); - if (xspn_count == 2) { - run_xspn2(current_in_addr, out_addr2, batch_size, in_beats, out_beats); - wait_for_spn_interrupts(); - } else { - wait_for_spn1_interrupt(); - } - printf("XSPN finished\n"); - spn_checker::offset_reg() = k; - spn_checker::length_reg() = batch_size; - spn_checker::start_result_check_reg() = 1; - - current_in_addr += batch_size * sample_bytes; // 5 bytes in each sample (NIPS5) - } - - return 0; -} diff --git a/raven_spn/src/raven_spn.h b/raven_spn/src/raven_spn.h deleted file mode 100644 index 14ff1a8..0000000 --- a/raven_spn/src/raven_spn.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef RAVEN_SPN_H_ -#define RAVEN_SPN_H_ - -extern "C" void handle_m_ext_interrupt(); - -#endif /* RAVEN_SPN_H_ */ diff --git a/raven_spn/src/spn_checker_regs.h b/raven_spn/src/spn_checker_regs.h deleted file mode 100644 index ff9e250..0000000 --- a/raven_spn/src/spn_checker_regs.h +++ /dev/null @@ -1,125 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017, MINRES Technologies GmbH -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// Created on: Thu Oct 01 15:45:55 CEST 2020 -// * spn_regs.h Author: -// -//////////////////////////////////////////////////////////////////////////////// -#pragma once - -#include -#include - -#define SPN_CNTL_REG_START_RESULT_CHECK 0x00 -#define SPN_CNTL_REG_OFFSET 0x10 -#define SPN_CNTL_REG_LENGTH 0x20 -#define SPN_CNTL_REG_OUTPUT_ADDR 0x30 -#define SPN_CNTL_REG_INPUT_ADDR 0x40 -#define SPN_CNTL_REG_NUM_INPUT_SAMPLES 0x50 -#define SPN_CNTL_REG_START_DATA_TRANS 0x60 -#define SPN_CNTL_REG_OUTPUT_ADDR2 0x70 -#define SPN_CNTL_REG_XSPN_COUNT 0x80 -#define SPN_CNTL_REG_BATCH_SIZE 0x90 -#define SPN_CNTL_REG_NUM_ITERATIONS 0xA0 - -template -class spn_checker_regs { -public: - // storage declarations -// BEGIN_BF_DECL(start_t, uint32_t); -// BF_FIELD(start, 0, 1); -// END_BF_DECL() r_start; - uint32_t r_start_result_check; - - uint32_t r_offset; - - uint32_t r_length; - - uint32_t r_output_addr; - - uint32_t r_output_addr2; - - uint32_t r_input_addr; - - uint32_t r_num_input_samples; - - uint32_t r_start_data_trans; - - uint32_t r_xspn_count; - - uint32_t r_batch_size; - - uint32_t r_num_iterations; - - static inline uint32_t& start_result_check_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_START_RESULT_CHECK); - } - - static inline uint32_t & offset_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_OFFSET); - } - - static inline uint32_t & length_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_LENGTH); - } - - static inline uint32_t & output_addr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_OUTPUT_ADDR); - } - - static inline uint32_t & output_addr2_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_OUTPUT_ADDR2); - } - - static inline uint32_t & input_addr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_INPUT_ADDR); - } - - static inline uint32_t & num_input_samples_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_NUM_INPUT_SAMPLES); - } - - static inline uint32_t& start_data_trans_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_START_DATA_TRANS); - } - - static inline uint32_t& xspn_count_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_XSPN_COUNT); - } - - static inline uint32_t& batch_size_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_BATCH_SIZE); - } - - static inline uint32_t& num_iterations_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_CNTL_REG_NUM_ITERATIONS); - } - -}; diff --git a/raven_spn/src/spn_regs.h b/raven_spn/src/spn_regs.h deleted file mode 100644 index a733586..0000000 --- a/raven_spn/src/spn_regs.h +++ /dev/null @@ -1,116 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017, MINRES Technologies GmbH -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// Created on: Thu Oct 01 15:45:55 CEST 2020 -// * spn_regs.h Author: -// -//////////////////////////////////////////////////////////////////////////////// - -#ifndef _SPN_REGS_H_ -#define _SPN_REGS_H_ - -#include -#include - -#define SPN_REG_START 0x00 -#define SPN_REG_READOUT 0x10 -#define SPN_REG_MODE 0x20 -#define SPN_REG_INPUT_LENGTH 0x30 -#define SPN_REG_INPUT_ADDR 0x40 -#define SPN_REG_OUTPUT_ADDR 0x50 -#define SPN_REG_NUM_OF_INPUT_BEATS 0x60 -#define SPN_REG_NUM_OF_OUTPUT_BEATS 0x70 -#define SPN_REG_INTERRUPT 0x0C - -template -class spn_regs { -public: - // storage declarations -// BEGIN_BF_DECL(start_t, uint32_t); -// BF_FIELD(start, 0, 1); -// END_BF_DECL() r_start; - uint32_t r_start; - - uint32_t r_readout; - - uint32_t r_mode; - - uint32_t r_input_length; - - uint32_t r_input_addr; - - uint32_t r_output_addr; - - uint32_t r_num_of_input_beats; - - uint32_t r_num_of_output_beats; - -// static inline start_t& start_reg(){ -// return *reinterpret_cast(BASE_ADDR+SPN_REG_START); -// } - static inline uint32_t& start_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_START); - } - - static inline uint32_t & readout_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_READOUT); - } - - static inline uint32_t & mode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_MODE); - } - - static inline uint32_t & input_length_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_INPUT_LENGTH); - } - - static inline uint32_t & input_addr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_INPUT_ADDR); - } - - static inline uint32_t & output_addr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_OUTPUT_ADDR); - } - - static inline uint32_t & num_of_in_beats_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_NUM_OF_INPUT_BEATS); - } - - static inline uint32_t & num_of_out_beats_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_NUM_OF_OUTPUT_BEATS); - } - - static inline uint32_t & interrupt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPN_REG_INTERRUPT); - } - -}; - -#endif // _SPN_REGS_H_ diff --git a/raven_spn/src/util/bit_field.h b/raven_spn/src/util/bit_field.h deleted file mode 100644 index d4aff48..0000000 --- a/raven_spn/src/util/bit_field.h +++ /dev/null @@ -1,179 +0,0 @@ -/*--------------------------------------------------------- -Copyright (c) 2015 Jeff Preshing - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgement in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. ----------------------------------------------------------*/ - -#ifndef BIT_FIELD_H_ -#define BIT_FIELD_H_ - -#ifndef __CPP11OM_BITFIELD_H__ -#define __CPP11OM_BITFIELD_H__ - -#include - -//--------------------------------------------------------- -// BitFieldMember<>: Used internally by ADD_BITFIELD_MEMBER macro. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -template struct BitFieldMember { - T value; - - static_assert(Offset + Bits <= (int)sizeof(T) * 8, "Member exceeds bitfield boundaries"); - static_assert(Bits < (int)sizeof(T) * 8, "Can't fill entire bitfield with one member"); - - static const T Maximum = (T(1) << Bits) - 1; - static const T Mask = Maximum << Offset; - T maximum() const { return Maximum; } - T one() const { return T(1) << Offset; } - - operator T() const { return (value >> Offset) & Maximum; } - - BitFieldMember &operator=(T v) { - assert(v <= Maximum); // v must fit inside the bitfield member - value = (value & ~Mask) | (v << Offset); - return *this; - } - - BitFieldMember &operator+=(T v) { - assert(T(*this) + v <= Maximum); // result must fit inside the bitfield member - value += v << Offset; - return *this; - } - - BitFieldMember &operator-=(T v) { - assert(T(*this) >= v); // result must not underflow - value -= v << Offset; - return *this; - } - - BitFieldMember &operator++() { return *this += 1; } - BitFieldMember operator++(int) { // postfix form - BitFieldMember tmp(*this); - operator++(); - return tmp; - } - BitFieldMember &operator--() { return *this -= 1; } - BitFieldMember operator--(int) { // postfix form - BitFieldMember tmp(*this); - operator--(); - return tmp; - } -}; - -//--------------------------------------------------------- -// BitFieldArray<>: Used internally by ADD_BITFIELD_ARRAY macro. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -template class BitFieldArray { -public: - T value; - - static_assert(BaseOffset + BitsPerItem * NumItems <= (int)sizeof(T) * 8, "Array exceeds bitfield boundaries"); - static_assert(BitsPerItem < (int)sizeof(T) * 8, "Can't fill entire bitfield with one array element"); - - static const T Maximum = (T(1) << BitsPerItem) - 1; - T maximum() const { return Maximum; } - int numItems() const { return NumItems; } - - class Element { - private: - T &value; - int offset; - - public: - Element(T &value, int offset) - : value(value) - , offset(offset) {} - T mask() const { return Maximum << offset; } - - operator T() const { return (value >> offset) & Maximum; } - - Element &operator=(T v) { - assert(v <= Maximum); // v must fit inside the bitfield member - value = (value & ~mask()) | (v << offset); - return *this; - } - - Element &operator+=(T v) { - assert(T(*this) + v <= Maximum); // result must fit inside the bitfield member - value += v << offset; - return *this; - } - - Element &operator-=(T v) { - assert(T(*this) >= v); // result must not underflow - value -= v << offset; - return *this; - } - - Element &operator++() { return *this += 1; } - Element operator++(int) { // postfix form - Element tmp(*this); - operator++(); - return tmp; - } - Element &operator--() { return *this -= 1; } - Element operator--(int) { // postfix form - Element tmp(*this); - operator--(); - return tmp; - } - }; - - Element operator[](int i) { - assert(i >= 0 && i < NumItems); // array index must be in range - return Element(value, BaseOffset + BitsPerItem * i); - } - - const Element operator[](int i) const { - assert(i >= 0 && i < NumItems); // array index must be in range - return Element(value, BaseOffset + BitsPerItem * i); - } -}; - -//--------------------------------------------------------- -// Bitfield definition macros. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -#define BEGIN_BF_DECL(typeName, T) \ - union typeName { \ - struct Wrapper { \ - T value; \ - }; \ - Wrapper flat; \ - typeName(T v = 0) { flat.value = v; } \ - typeName &operator=(T v) { \ - flat.value = v; \ - return *this; \ - } \ - operator T &() { return flat.value; } \ - operator T() const { return flat.value; } \ - using StorageType = T; - -#define BF_FIELD(memberName, offset, bits) BitFieldMember memberName; - -#define BF_ARRAY(memberName, offset, bits, numItems) BitFieldArray memberName; - -#define END_BF_DECL() } - -#endif // __CPP11OM_BITFIELD_H__ - -#endif /* BIT_FIELD_H_ */ diff --git a/raven_spn/toolchain-rv32.cmake b/raven_spn/toolchain-rv32.cmake deleted file mode 100644 index bd5ee3b..0000000 --- a/raven_spn/toolchain-rv32.cmake +++ /dev/null @@ -1,33 +0,0 @@ -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_VERSION 1) -set(CMAKE_SYSTEM_PROCESSOR riscv) - -set(TOOLCHAIN_DIR /opt/riscv/tools) -set(ARCHITECTURE riscv64-unknown-elf) - -set(CMAKE_C_COMPILER ${ARCHITECTURE}-gcc -set(CMAKE_CXX_COMPILER ${ARCHITECTURE}-g++ -set(RISCV_LINUX_SYSROOT /opt/riscv/tools CACHE PATH "RISC-V cross compilation system root") # search path for the cross compile toolchain - -set(CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags") -set(CMAKE_C_FLAGS "" CACHE STRING "c flags") -set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags") -set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags") -set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "executable linker flags") - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv32imac -mabi=ilp32") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv32imac -mabi=ilp32") -#set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") -#set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -march=rv32imac -mabi=ilp32") - -set(COMPILER_IS_RV32 "1") #flags for the CMakeList.txt -#add_definitions(-D_ARM_TEGRA3) # C/C++ preprocessor macro, which will be used in many many files - -set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/${ARCHITECTURE}) - -include_directories(${TOOLCHAIN_DIR}/${ARCHITECTURE}/include) - -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) \ No newline at end of file