62 Commits

Author SHA1 Message Date
2e7ef7285e fixes dhrystone compile options comment 2025-09-13 15:25:11 +02:00
dbb68b5fb1 fixes dhrystone compile options 2025-09-13 15:23:52 +02:00
df513d4465 fixes missing dhrystone link option 2025-09-12 22:34:09 +02:00
00ecea2bd6 fixes BSP location path 2025-09-12 08:35:43 +02:00
c068d6dbd3 removes build_ in jenkins 2025-07-25 16:08:40 +02:00
578857997e add --isa for 64-bit and removes debug line in jenkins 2025-07-25 16:05:03 +02:00
56081dcb6f adds hello running on ISS in jenkins 2025-07-25 15:46:25 +02:00
b68c2226d9 corrects output path of generate_iss in jenkins 2025-07-25 15:26:53 +02:00
925e312608 adds TGC-ISS prefix in jenkins 2025-07-25 14:15:10 +02:00
74275ddab4 enables ISS build in jenkins 2025-07-25 13:45:21 +02:00
0dafde8a4c corrects typo of anyOf in jenkins 2025-07-25 12:32:20 +02:00
a5cf27744a hides 64-bit fw compilation for moonlight/tgc_vp and disables it in jenkin pipeline 2025-07-25 12:21:02 +02:00
f46a211a8d adds fw-common-clean target 2025-07-15 07:41:03 +02:00
57fff5c09b updates for TGC-ISS in Jenkinfile 2025-07-04 20:06:47 +02:00
e39264632f updates for TGC-ISS in Jenkinfile 2025-07-04 19:57:52 +02:00
630f9993d6 updates for TGC-ISS in Jenkinfile 2025-07-04 19:49:39 +02:00
9249f34038 corrects typo for TGC-ISS repo checkout in Jenkinfile 2025-07-04 19:40:28 +02:00
b14442d722 corrects typo for TGC-ISS repo checkout in Jenkinfile 2025-07-04 19:38:21 +02:00
58e2dcfaf8 adds TGC-ISS repo checkout in Jenkinfile 2025-07-04 19:35:00 +02:00
a7559066f4 updates Jenkinfile 2025-07-04 19:13:27 +02:00
10eb3c88fc updates Jenkinfile 2025-07-04 19:11:45 +02:00
90720804ba updates Jenkinfile 2025-07-04 19:08:21 +02:00
4975a8273c enabled make in jenkinfiles and update bsp 2025-07-04 19:05:34 +02:00
ed4ab31837 updates Jenkinsfile 2025-07-04 10:02:21 +02:00
21391f1f01 updates Jenkinsfile 2025-07-04 09:43:15 +02:00
21f97e9bc3 disables make flow in Jenkins to test cmake flow 2025-07-04 09:09:53 +02:00
d715d50dfb adds cmake_flow in Jenkinsfile 2025-07-04 08:59:01 +02:00
a2cd38fbd5 updates bsp 2025-06-17 19:42:46 +02:00
c7cd0843b8 uses inherits in preset json for benchmarks and corrects typo for 64bit 2025-06-06 14:38:14 +02:00
83b2105c38 corrects type in inherits Preset 2025-06-06 13:54:51 +02:00
510695bf6e changes Presets to a Composition based approach for hello-world 2025-05-27 09:17:05 +02:00
7258684a33 updates bsp 2025-05-27 09:16:39 +02:00
15cc2ece6f updates bsp 2025-05-23 10:36:20 +02:00
3e0eaba231 changes sizes of casts for dhrystone to the correct ones 2025-05-23 10:35:19 +02:00
4bd2111c93 cleans up gitignore 2025-05-23 10:34:46 +02:00
f99db9409f updates bsp 2025-05-23 09:33:23 +02:00
87539a8433 cleans up hello.c 2025-05-23 09:31:47 +02:00
de4cf8f35a updates CMakeLists and Presets for all examples 2025-05-23 09:31:31 +02:00
7d4bcea3ba Merge branch 'cmakeflow' into develop 2025-05-22 12:26:55 +02:00
74c2ec2014 updates write for coremark 2025-05-22 12:22:11 +02:00
bccfc67926 removes unused code in cmake 2025-04-15 14:33:03 +02:00
8b3dc54e5c uses write_hex() in exit instead of tohost=0x1 2025-04-15 12:32:09 +02:00
9909769c0a updates to make 64bit compiling 2025-04-15 12:26:32 +02:00
071d9cc8eb updates bsp and cleans hello.c 2025-04-14 17:01:19 +02:00
a5825bfd67 updates preset for 64bit 2025-04-11 15:44:52 +02:00
36404dd7e0 adds -mcmodel=medany and map generation;updaes bsp 2025-04-11 15:41:29 +02:00
658ffbb405 adds map generation and updates bsp 2025-03-21 16:07:17 +01:00
c6bfaf0546 adds volatile to array passed to tohost and updates bsp submodule 2025-03-14 17:53:49 +01:00
e88c1148fb removes default release build 2025-03-14 14:26:49 +01:00
686d01ab3e adds extern to tohost/fromhost to avoid error during BSS initialization 2025-03-14 14:20:53 +01:00
339d6b0f2c updates bsp 2025-03-14 12:01:16 +01:00
884d445cb9 adds target. map generation to target_link_opinions 2025-03-11 11:49:26 +01:00
eee14af478 updates bsp 2025-03-11 11:46:23 +01:00
727fdcb7bb adds examples of write/tohost usage 2025-03-11 11:45:40 +01:00
36cb401420 updates BSP and adds options to specify link target 2025-03-07 19:32:14 +01:00
3def42153f adds preset,json 2025-02-28 14:03:21 +01:00
75ba2e7588 adds cmake for coremark 2025-02-20 14:08:53 +01:00
f3dc9aea54 adds wrap for scanf in dhrystone 2024-08-28 18:13:40 +02:00
2f675e9bdd fixes tgc_vp setup in coremark 2024-06-30 17:26:58 +02:00
3114cb265a Merge remote-tracking branch 'origin/main' into develop 2024-06-30 07:54:36 +02:00
fca9f04264 Merge remote-tracking branch 'origin/main' into develop 2024-03-20 12:29:57 +01:00
fe1136c7ce fixes ISA handling 2023-12-06 10:00:33 +01:00
17 changed files with 1106 additions and 960 deletions

4
.gitignore vendored
View File

@@ -151,6 +151,4 @@ compile_commands.json
CTestTestfile.cmake CTestTestfile.cmake
*.dump *.dump
.vscode/c_cpp_properties.json build
semihosting_test/build/semihosting_test
semihosting_test/build/Makefile

View File

@@ -1,172 +1,23 @@
cmake_minimum_required(VERSION 3.12)
# Set default RISC-V toolchain if not specified
if(NOT DEFINED RISCV_TOOLCHAIN_PATH)
set(RISCV_TOOLCHAIN_PATH "/opt/shared/cross-toolchains/gcc13/CentOS/riscv64-unknown-elf/bin" CACHE STRING "Path to RISC-V toolchain")
endif()
# Allow override of compiler executables
if(NOT DEFINED RISCV_GCC)
set(RISCV_GCC "/opt/shared/cross-toolchains/gcc13/CentOS/riscv64-unknown-elf/bin/riscv64-unknown-elf-gcc" CACHE STRING "RISC-V GCC compiler")
endif()
if(NOT DEFINED RISCV_GXX)
set(RISCV_GXX "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-g++" CACHE STRING "RISC-V G++ compiler")
endif()
if(NOT DEFINED RISCV_OBJCOPY)
set(RISCV_OBJCOPY "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-objcopy" CACHE STRING "RISC-V objcopy")
endif()
if(NOT DEFINED RISCV_OBJDUMP)
set(RISCV_OBJDUMP "${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf-objdump" CACHE STRING "RISC-V objdump")
endif()
# Set the compilers
set(CMAKE_C_COMPILER ${RISCV_GCC})
set(CMAKE_CXX_COMPILER ${RISCV_GXX})
project(Firmware)
# Define supported configurations
set(SUPPORTED_BOARDS iss)
set(SUPPORTED_ISAS "rv32i;rv32im;rv32imc;rv64i;rv64im;rv64imc;imc")
set(SUPPORTED_ABIS "ilp32;ilp32f;lp64;lp64f")
# Build target options
option(BUILD_HELLO_WORLD "Build hello-world example" ON)
option(BUILD_DHRYSTONE "Build dhrystone benchmark" OFF)
option(BUILD_COREMARK "Build coremark benchmark" OFF)
option(BUILD_ALL "Build all targets" OFF)
# If BUILD_ALL is ON, enable all targets
if(BUILD_ALL)
set(BUILD_HELLO_WORLD ON)
set(BUILD_DHRYSTONE ON)
set(BUILD_COREMARK ON)
endif()
# Set default values and validate configurations
if (NOT DEFINED BOARD) if (NOT DEFINED BOARD)
set(BOARD iss CACHE STRING "Target board") set(BOARD iss)
endif() endif()
if (NOT DEFINED ISA) if (NOT DEFINED ISA)
set(ISA rv32imc CACHE STRING "Target ISA") set(ISA imc)
endif() endif()
if(DEFINED LINK_TARGET)
if(NOT DEFINED RISCV_ABI) set(LNK LINK_TARGET=${LINK_TARGET})
if(ISA MATCHES "^rv64")
set(RISCV_ABI "lp64" CACHE STRING "RISC-V ABI")
else()
set(RISCV_ABI "ilp32" CACHE STRING "RISC-V ABI")
endif() endif()
endif() message(STATUS "Building firmware using ${BOARD} board configuration and isa ${ISA}")
# Validate configurations
if(NOT BOARD IN_LIST SUPPORTED_BOARDS)
message(FATAL_ERROR "Invalid BOARD specified. Supported boards: ${SUPPORTED_BOARDS}")
endif()
if(NOT ISA IN_LIST SUPPORTED_ISAS)
message(FATAL_ERROR "Invalid ISA specified(${ISA}). Supported ISAs: ${SUPPORTED_ISAS}")
endif()
if(NOT RISCV_ABI IN_LIST SUPPORTED_ABIS)
message(FATAL_ERROR "Invalid ABI specified. Supported ABIs: ${SUPPORTED_ABIS}")
endif()
# Set RISC-V architecture based on ISA
if(ISA MATCHES "^rv")
set(RISCV_ARCH ${ISA})
else()
# Default to rv32 for backward compatibility
set(RISCV_ARCH "rv32${ISA}")
endif()
# Set BSP base directory
set(BSP_BASE "${CMAKE_CURRENT_SOURCE_DIR}/bare-metal-bsp")
# Global compile definitions
add_compile_definitions(BOARD_${BOARD})
# RISC-V specific compiler flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany")
#set(CMAKE_ASM_COMPILER riscv64-unknown-elf-as)
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -O2 -g -march=${RISCV_ARCH}_zicsr_zifencei -mabi=${RISCV_ABI} -mcmodel=medany")
# Optional: Enable semihosting support
option(SEMIHOSTING "Enable semihosting support" OFF)
if(SEMIHOSTING)
add_compile_definitions(SEMIHOSTING)
endif()
#create interface library for propagating compile options
#add_library(global_compile_options INTERFACE)
# Compile options
#target_compile_options(global_compile_options INTERFACE
# -march=${RISCV_ARCH}_zicsr_zifencei
# -mabi=${RISCV_ABI}
# -mcmodel=medany
# -O2
# -g
# -ffunction-sections
# -fdata-sections
#)
message(STATUS "Building firmware with configuration:")
message(STATUS " Board: ${BOARD}")
message(STATUS " ISA: ${ISA} (Architecture: ${RISCV_ARCH})")
message(STATUS " ABI: ${RISCV_ABI}")
message(STATUS " Semihosting: ${SEMIHOSTING}")
message(STATUS " Toolchain:")
message(STATUS " Path: ${RISCV_TOOLCHAIN_PATH}")
message(STATUS " C Compiler: ${CMAKE_C_COMPILER}")
message(STATUS " C++ Compiler: ${CMAKE_CXX_COMPILER}")
message(STATUS "Targets to build:")
message(STATUS " hello-world: ${BUILD_HELLO_WORLD}")
message(STATUS " dhrystone: ${BUILD_DHRYSTONE}")
message(STATUS " coremark: ${BUILD_COREMARK}")
add_subdirectory(bare-metal-bsp)
# Add subdirectories based on build options
if(BUILD_HELLO_WORLD)
add_subdirectory(hello-world)
endif()
if(BUILD_DHRYSTONE)
add_subdirectory(benchmarks/dhrystone)
endif()
if(BUILD_COREMARK)
add_subdirectory(benchmarks/coremark)
endif()
# Create an all-inclusive target only if BUILD_ALL is ON
if(BUILD_ALL)
add_custom_target(fw-common ALL add_custom_target(fw-common ALL
DEPENDS COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/hello-world BOARD=${BOARD} ISA=${ISA} ${LNK}
hello-world COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA} ${LNK}
dhrystone COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/coremark BOARD=${BOARD} ISA=${ISA} ${LNK}
coremark USES_TERMINAL
) WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif() add_custom_target(fw-common-clean
COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/hello-world BOARD=${BOARD} ISA=${ISA} ${LNK} clean
COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA} ${LNK} clean
COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/coremark BOARD=${BOARD} ISA=${ISA} ${LNK} clean
USES_TERMINAL
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Print build instructions
message(STATUS "")
message(STATUS "Build instructions:")
message(STATUS " Build all targets: cmake -DBUILD_ALL=ON ..")
message(STATUS " Build specific target: cmake -DBUILD_HELLO_WORLD=ON -DBUILD_DHRYSTONE=OFF -DBUILD_COREMARK=OFF ..")
message(STATUS " Configure board: cmake -DBOARD=iss ..")
message(STATUS " Configure ISA: cmake -DISA=rv32imc ..")
message(STATUS " Configure ABI: cmake -DRISCV_ABI=ilp32 ..")
message(STATUS " Enable semihosting: cmake -DSEMIHOSTING=ON ..")
message(STATUS " Set toolchain path: cmake -DRISCV_TOOLCHAIN_PATH=/path/to/toolchain ..")
message(STATUS " Set specific compiler: cmake -DRISCV_GCC=/path/to/riscv-gcc -DRISCV_GXX=/path/to/riscv-g++ ..")

118
Jenkinsfile vendored
View File

@@ -2,7 +2,7 @@ void checkout_project() {
checkout([ checkout([
$class: 'GitSCM', $class: 'GitSCM',
branches: [ branches: [
[name: '*/main'] [name: '*/develop']
], ],
extensions: [ extensions: [
[$class: 'CleanBeforeCheckout'], [$class: 'CleanBeforeCheckout'],
@@ -15,6 +15,24 @@ void checkout_project() {
]) ])
} }
void checkout_iss_project(String repoUrl, String branch = 'develop') {
checkout([
$class: 'GitSCM',
branches: [
[name: "*/${branch}"]
],
extensions: [
[$class: 'CleanBeforeCheckout'],
[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false, shallow: true]
],
submoduleCfg: [],
userRemoteConfigs: [
[credentialsId: 'gitea-jenkins', url: repoUrl]
]
])
}
void checkout_develop() { void checkout_develop() {
dir("bare-metal-bsp") { dir("bare-metal-bsp") {
withCredentials([usernamePassword(credentialsId: 'gitea-jenkins', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) { withCredentials([usernamePassword(credentialsId: 'gitea-jenkins', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
@@ -29,6 +47,14 @@ void make_hello(board) {
sh("make -C hello-world/ clean") sh("make -C hello-world/ clean")
} }
void cmake_hello(board,build_type,core_type) {
def flavor ="${board}_${build_type}_${core_type}"
if (core_type=="32")
flavor ="${board}_${build_type}"
sh("cmake -B ${flavor} --preset=${flavor}")
sh("cmake --build ${flavor}")
}
pipeline { pipeline {
agent { docker { agent { docker {
image 'ubuntu-riscv' image 'ubuntu-riscv'
@@ -48,12 +74,13 @@ pipeline {
stage('make rtl') {steps { make_hello("rtl")}} stage('make rtl') {steps { make_hello("rtl")}}
stage('make ehrenberg') {steps { make_hello("ehrenberg")}} stage('make ehrenberg') {steps { make_hello("ehrenberg")}}
stage('make tgc_vp') {steps { make_hello("tgc_vp")}}*/ stage('make tgc_vp') {steps { make_hello("tgc_vp")}}*/
stage('make hello-world') { stage('make hello-world') {
matrix { matrix {
axes { axes {
axis{ axis{
name 'BOARD' name 'BOARD'
values 'iss', 'hifive1', 'TGCP', 'ehrenberg', 'rtl', 'tgc_vp' values 'iss', 'moonlight', 'tgc_vp'
} }
} }
stages { stages {
@@ -72,10 +99,91 @@ pipeline {
} }
} }
} }
stage('CMAKE flow for hello-world') {
matrix {
axes {
axis{
name 'BOARD'
values 'ISS', 'Moonlight', 'TGC_VP'
}
axis{
name 'BUILD_TYPE'
values 'Debug', 'Release'
}
axis{
name 'CORE_TYPE'
values '32', '64'
}
}
stages {
stage('Force sequential') {
options {
lock("One Board at a time")
}
when{
not {
anyOf {
expression { BOARD == 'Moonlight' && CORE_TYPE =='64'}
expression { BOARD == 'TGC_VP' && CORE_TYPE =='64'}
}
}
}
stages {
stage("CMAKE") {
steps {
dir("hello-world"){
cmake_hello("${BOARD}","${BUILD_TYPE}","${CORE_TYPE}")
}
}
}
}
}
}
}
}
stage("Checkout TGC-ISS, TGC-Compliance and TGC-GEN"){
steps {
dir("TGC-ISS"){
sh 'rm -rf * .??* '
checkout_iss_project("https://git.minres.com/TGFS/TGC-ISS.git", "develop")
dir("TGC-COMPLIANCE"){
checkout_iss_project("https://git.minres.com/TGFS/TGC-COMPLIANCE.git", "master")
}
dir("TGC-GEN"){
checkout_iss_project("https://git.minres.com/TGFS/TGC-GEN.git", "develop")
}
}
}
}
stage("Generate cores and build TGC-ISS"){
steps {
sh 'rm -rf *@tmp'
sh '''
for core in RV32GC; do
for backend in interp; do
TGC-ISS/TGC-GEN/scripts/generate_iss.sh -o TGC-ISS/dbt-rise-tgc/ -c $core -b ${backend} TGC-ISS/TGC-GEN/CoreDSL/${core}.core_desc
done
done
for core in RV64GC; do
for backend in interp; do
TGC-ISS/TGC-GEN/scripts/generate_iss.sh -o TGC-ISS/dbt-rise-tgc/ -c $core -b ${backend} TGC-ISS/TGC-GEN/CoreDSL/${core}.core_desc
done
done
'''
sh 'conan profile detect --force'
sh 'rm -rf TGC-ISS/build'
sh 'cmake -S TGC-ISS/. -B TGC-ISS/build --preset Release -DWITH_ASMJIT=ON -DWITH_TCC=ON -DWITH_LLVM=OFF'
sh 'cmake --build TGC-ISS/build -j'
sh 'TGC-ISS/build/dbt-rise-tgc/tgc-sim --isa ?'
}
}
stage("start to run hello FW on ISS") {
steps {
sh 'TGC-ISS/build/dbt-rise-tgc/tgc-sim -f hello-world/ISS_Debug/hello.elf'
sh 'TGC-ISS/build/dbt-rise-tgc/tgc-sim -f hello-world/ISS_Debug_64/hello.elf --isa=rv64gc'
} }
post {
failure {
sh("make -C hello-world/ clean")
} }
} }
} }

View File

@@ -1,8 +1,7 @@
cmake_minimum_required(VERSION 3.12) cmake_minimum_required(VERSION 3.21)
project(coremark C) project(coremark C)
set(TARGET coremark)
# Include BSP libwrap set(CMAKE_BUILD_TYPE Release)
include(${BSP_BASE}/libwrap/CMakeLists.txt)
# Source files # Source files
set(SOURCES set(SOURCES
@@ -18,49 +17,15 @@ set(SOURCES
# Create executable # Create executable
add_executable(coremark ${SOURCES}) add_executable(coremark ${SOURCES})
target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/cm)
target_compile_options(${TARGET} PRIVATE -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-builtin-strnlen -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition )
target_compile_definitions(${TARGET} PRIVATE PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 FLAGS_STR="" PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 ITERATIONS=600)
# Include directories set(BOARD "iss" CACHE STRING "Target board")
target_include_directories(coremark PRIVATE add_subdirectory(../../bare-metal-bsp bsp)
${BSP_BASE}/include target_link_libraries(${TARGET} PRIVATE bsp)
${BSP_BASE}/drivers target_link_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map)
${BSP_BASE}/env
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/cm
)
# Link with libwrap add_custom_command(TARGET ${TARGET} POST_BUILD
target_link_libraries(coremark PRIVATE COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis
LIBWRAP_TGC COMMENT "Creating disassembly for ${TARGET}")
)
# Add compile definitions
target_compile_definitions(coremark PRIVATE
BOARD_${BOARD}
PERFORMANCE_RUN=1
ITERATIONS=1000
COMPILER_FLAGS="${CMAKE_C_FLAGS}"
COMPILER_VERSION="${CMAKE_C_COMPILER_VERSION}"
)
# Set compile options
target_compile_options(coremark PRIVATE
-march=${RISCV_ARCH}_zicsr_zifencei
-mabi=${RISCV_ABI}
-mcmodel=medany
-ffunction-sections
-fdata-sections
-O2 # Optimization level for benchmarking
)
# Set linker options
target_link_options(coremark PRIVATE
-T${BSP_BASE}/env/${BOARD}/link.ld
-nostartfiles
-Wl,--gc-sections
${LIBWRAP_TGC_LDFLAGS}
)
# Install target
install(TARGETS coremark
RUNTIME DESTINATION bin
)

View File

@@ -0,0 +1,118 @@
{
"version": 3,
"vendor": {
"conan": {}
},
"cmakeMinimumRequired": {
"major": 3,
"minor": 24,
"patch": 0
},
"configurePresets": [
{
"name": "32imc",
"hidden": true,
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake"
}
},
{
"name": "64imc",
"hidden": true,
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake"
}
},
{
"name": "iss",
"hidden": true,
"cacheVariables": {
"BOARD": "iss"
}
},
{
"name": "moonlight",
"hidden": true,
"cacheVariables": {
"BOARD": "moonlight"
}
},
{
"name": "tgc_vp",
"hidden": true,
"cacheVariables": {
"BOARD": "tgc_vp"
}
},
{
"name": "rtl",
"hidden": true,
"cacheVariables": {
"BOARD": "rtl"
}
},
{
"name": "debug",
"hidden": true,
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "release",
"hidden": true,
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "ISS_Debug",
"inherits": ["iss", "debug", "32imc"]
},
{
"name": "Moonlight_Debug",
"inherits": ["moonlight", "debug", "32imc"]
},
{
"name": "TGC_VP_Debug",
"inherits": ["tgc_vp", "debug", "32imc"]
},
{
"name": "ISS_Debug_64",
"inherits": ["iss", "debug", "64imc"]
},
{
"name": "Moonlight_Debug_64",
"inherits": ["moonlight", "debug", "64imc"]
},
{
"name": "TGC_VP_Debug_64",
"inherits": ["tgc_vp", "debug", "64imc"]
},
{
"name": "ISS_Release",
"inherits": ["iss", "release", "32imc"]
},
{
"name": "Moonlight_Release",
"inherits": ["moonlight", "release", "32imc"]
},
{
"name": "TGC_VP_Release",
"inherits": ["tgc_vp", "release", "32imc"]
},
{
"name": "ISS_Release_64",
"inherits": ["iss", "release", "64imc"]
},
{
"name": "Moonlight_Release_64",
"inherits": ["moonlight", "release", "64imc"]
},
{
"name": "TGC_VP_Release_64",
"inherits": ["tgc_vp", "release", "64imc"]
}
]
}

View File

@@ -15,37 +15,40 @@ limitations under the License.
Original Author: Shay Gal-on Original Author: Shay Gal-on
*/ */
#include "coremark.h"
#include "core_portme.h" #include "core_portme.h"
#include "coremark.h"
#include <unistd.h>
// Read cycle CSR // Read cycle CSR
unsigned long long _read_cycle() unsigned long long _read_cycle() {
{
unsigned long long result; unsigned long long result;
unsigned long lower; unsigned long lower;
unsigned long upper1; unsigned long upper1;
unsigned long upper2; unsigned long upper2;
asm volatile ( asm volatile("repeat_cycle_%=: csrr %0, cycleh;\n"
"repeat_cycle_%=: csrr %0, cycleh;\n"
" csrr %1, cycle;\n" " csrr %1, cycle;\n"
" csrr %2, cycleh;\n" " csrr %2, cycleh;\n"
" bne %0, %2, repeat_cycle_%=;\n" " bne %0, %2, repeat_cycle_%=;\n"
: "=r" (upper1),"=r" (lower),"=r" (upper2) // Outputs : temp variable for load result : "=r"(upper1), "=r"(lower),
"=r"(upper2) // Outputs : temp variable for load result
: :
: :);
);
*(unsigned long *)(&result) = lower; *(unsigned long *)(&result) = lower;
*((unsigned long *)(&result) + 1) = upper1; *((unsigned long *)(&result) + 1) = upper1;
return result; return result;
} }
volatile int tohost; // extern volatile int tohost;
volatile int fromhost; // extern volatile int fromhost;
void write_hex(int fd, uint32_t hex);
void exit(int n) { void exit(int n) {
tohost = 0x1; write_hex(STDERR_FILENO, 1);
for (;;); // tohost = 0x1;
for (;;)
;
} }
void __libc_init_array(void) { void __libc_init_array(void) {
@@ -89,10 +92,7 @@ volatile ee_s32 seed5_volatile = 0;
time.h and windows.h definitions included. time.h and windows.h definitions included.
*/ */
CORETIMETYPE CORETIMETYPE
barebones_clock() barebones_clock() { return (CORETIMETYPE)_read_cycle(); }
{
return (CORETIMETYPE)_read_cycle();
}
/* Define : TIMER_RES_DIVIDER /* Define : TIMER_RES_DIVIDER
Divider to trade off timer resolution and total time that can be Divider to trade off timer resolution and total time that can be
measured. measured.
@@ -118,11 +118,7 @@ static CORETIMETYPE start_time_val, stop_time_val;
example code) or zeroing some system parameters - e.g. setting the cpu clocks example code) or zeroing some system parameters - e.g. setting the cpu clocks
cycles to 0. cycles to 0.
*/ */
void void start_time(void) { GETMYTIME(&start_time_val); }
start_time(void)
{
GETMYTIME(&start_time_val);
}
/* Function : stop_time /* Function : stop_time
This function will be called right after ending the timed portion of the This function will be called right after ending the timed portion of the
benchmark. benchmark.
@@ -131,11 +127,7 @@ start_time(void)
example code) or other system parameters - e.g. reading the current value of example code) or other system parameters - e.g. reading the current value of
cpu cycles counter. cpu cycles counter.
*/ */
void void stop_time(void) { GETMYTIME(&stop_time_val); }
stop_time(void)
{
GETMYTIME(&stop_time_val);
}
/* Function : get_time /* Function : get_time
Return an abstract "ticks" number that signifies time on the system. Return an abstract "ticks" number that signifies time on the system.
@@ -146,10 +138,8 @@ stop_time(void)
controlled by <TIMER_RES_DIVIDER> controlled by <TIMER_RES_DIVIDER>
*/ */
CORE_TICKS CORE_TICKS
get_time(void) get_time(void) {
{ CORE_TICKS elapsed = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val));
CORE_TICKS elapsed
= (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val));
return elapsed; return elapsed;
} }
/* Function : time_in_secs /* Function : time_in_secs
@@ -159,9 +149,7 @@ get_time(void)
floating point. Default implementation implemented by the EE_TICKS_PER_SEC floating point. Default implementation implemented by the EE_TICKS_PER_SEC
macro above. macro above.
*/ */
secs_ret secs_ret time_in_secs(CORE_TICKS ticks) {
time_in_secs(CORE_TICKS ticks)
{
secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC;
return retval; return retval;
} }
@@ -172,17 +160,12 @@ ee_u32 default_num_contexts = 1;
Target specific initialization code Target specific initialization code
Test for some common mistakes. Test for some common mistakes.
*/ */
void void portable_init(core_portable *p, int *argc, char *argv[]) {
portable_init(core_portable *p, int *argc, char *argv[]) if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) {
{ ee_printf("ERROR! Please define ee_ptr_int to a type that holds a "
if (sizeof(ee_ptr_int) != sizeof(ee_u8 *))
{
ee_printf(
"ERROR! Please define ee_ptr_int to a type that holds a "
"pointer!\n"); "pointer!\n");
} }
if (sizeof(ee_u32) != 4) if (sizeof(ee_u32) != 4) {
{
ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n");
} }
p->portable_id = 1; p->portable_id = 1;
@@ -191,8 +174,4 @@ portable_init(core_portable *p, int *argc, char *argv[])
/* Function : portable_fini /* Function : portable_fini
Target specific final code Target specific final code
*/ */
void void portable_fini(core_portable *p) { p->portable_id = 0; }
portable_fini(core_portable *p)
{
p->portable_id = 0;
}

View File

@@ -16,6 +16,7 @@ limitations under the License.
#include <coremark.h> #include <coremark.h>
#include <stdarg.h> #include <stdarg.h>
#include <unistd.h>
#define ZEROPAD (1 << 0) /* Pad with zero */ #define ZEROPAD (1 << 0) /* Pad with zero */
#define SIGN (1 << 1) /* Unsigned/signed long */ #define SIGN (1 << 1) /* Unsigned/signed long */
@@ -31,27 +32,22 @@ static char * digits = "0123456789abcdefghijklmnopqrstuvwxyz";
static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static ee_size_t strnlen(const char *s, ee_size_t count); static ee_size_t strnlen(const char *s, ee_size_t count);
static ee_size_t static ee_size_t strnlen(const char *s, ee_size_t count) {
strnlen(const char *s, ee_size_t count)
{
const char *sc; const char *sc;
for (sc = s; *sc != '\0' && count--; ++sc) for (sc = s; *sc != '\0' && count--; ++sc)
; ;
return sc - s; return sc - s;
} }
static int static int skip_atoi(const char **s) {
skip_atoi(const char **s)
{
int i = 0; int i = 0;
while (is_digit(**s)) while (is_digit(**s))
i = i * 10 + *((*s)++) - '0'; i = i * 10 + *((*s)++) - '0';
return i; return i;
} }
static char * static char *number(char *str, long num, int base, int size, int precision,
number(char *str, long num, int base, int size, int precision, int type) int type) {
{
char c, sign, tmp[66]; char c, sign, tmp[66];
char *dig = digits; char *dig = digits;
int i; int i;
@@ -65,28 +61,21 @@ number(char *str, long num, int base, int size, int precision, int type)
c = (type & ZEROPAD) ? '0' : ' '; c = (type & ZEROPAD) ? '0' : ' ';
sign = 0; sign = 0;
if (type & SIGN) if (type & SIGN) {
{ if (num < 0) {
if (num < 0)
{
sign = '-'; sign = '-';
num = -num; num = -num;
size--; size--;
} } else if (type & PLUS) {
else if (type & PLUS)
{
sign = '+'; sign = '+';
size--; size--;
} } else if (type & SPACE) {
else if (type & SPACE)
{
sign = ' '; sign = ' ';
size--; size--;
} }
} }
if (type & HEX_PREP) if (type & HEX_PREP) {
{
if (base == 16) if (base == 16)
size -= 2; size -= 2;
else if (base == 8) else if (base == 8)
@@ -97,10 +86,8 @@ number(char *str, long num, int base, int size, int precision, int type)
if (num == 0) if (num == 0)
tmp[i++] = '0'; tmp[i++] = '0';
else else {
{ while (num != 0) {
while (num != 0)
{
tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; tmp[i++] = dig[((unsigned long)num) % (unsigned)base];
num = ((unsigned long)num) / (unsigned)base; num = ((unsigned long)num) / (unsigned)base;
} }
@@ -115,12 +102,10 @@ number(char *str, long num, int base, int size, int precision, int type)
if (sign) if (sign)
*str++ = sign; *str++ = sign;
if (type & HEX_PREP) if (type & HEX_PREP) {
{
if (base == 8) if (base == 8)
*str++ = '0'; *str++ = '0';
else if (base == 16) else if (base == 16) {
{
*str++ = '0'; *str++ = '0';
*str++ = digits[33]; *str++ = digits[33];
} }
@@ -139,9 +124,8 @@ number(char *str, long num, int base, int size, int precision, int type)
return str; return str;
} }
static char * static char *eaddr(char *str, unsigned char *addr, int size, int precision,
eaddr(char *str, unsigned char *addr, int size, int precision, int type) int type) {
{
char tmp[24]; char tmp[24];
char *dig = digits; char *dig = digits;
int i, len; int i, len;
@@ -149,8 +133,7 @@ eaddr(char *str, unsigned char *addr, int size, int precision, int type)
if (type & UPPERCASE) if (type & UPPERCASE)
dig = upper_digits; dig = upper_digits;
len = 0; len = 0;
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++) {
{
if (i != 0) if (i != 0)
tmp[len++] = ':'; tmp[len++] = ':';
tmp[len++] = dig[addr[i] >> 4]; tmp[len++] = dig[addr[i] >> 4];
@@ -168,32 +151,26 @@ eaddr(char *str, unsigned char *addr, int size, int precision, int type)
return str; return str;
} }
static char * static char *iaddr(char *str, unsigned char *addr, int size, int precision,
iaddr(char *str, unsigned char *addr, int size, int precision, int type) int type) {
{
char tmp[24]; char tmp[24];
int i, n, len; int i, n, len;
len = 0; len = 0;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++) {
{
if (i != 0) if (i != 0)
tmp[len++] = '.'; tmp[len++] = '.';
n = addr[i]; n = addr[i];
if (n == 0) if (n == 0)
tmp[len++] = digits[0]; tmp[len++] = digits[0];
else else {
{ if (n >= 100) {
if (n >= 100)
{
tmp[len++] = digits[n / 100]; tmp[len++] = digits[n / 100];
n = n % 100; n = n % 100;
tmp[len++] = digits[n / 10]; tmp[len++] = digits[n / 10];
n = n % 10; n = n % 10;
} } else if (n >= 10) {
else if (n >= 10)
{
tmp[len++] = digits[n / 10]; tmp[len++] = digits[n / 10];
n = n % 10; n = n % 10;
} }
@@ -219,47 +196,37 @@ char * ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf);
char *fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); char *fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf);
static void ee_bufcpy(char *d, char *s, int count); static void ee_bufcpy(char *d, char *s, int count);
void void ee_bufcpy(char *pd, char *ps, int count) {
ee_bufcpy(char *pd, char *ps, int count)
{
char *pe = ps + count; char *pe = ps + count;
while (ps != pe) while (ps != pe)
*pd++ = *ps++; *pd++ = *ps++;
} }
static void static void parse_float(double value, char *buffer, char fmt, int precision) {
parse_float(double value, char *buffer, char fmt, int precision)
{
int decpt, sign, exp, pos; int decpt, sign, exp, pos;
char *digits = NULL; char *digits = NULL;
char cvtbuf[80]; char cvtbuf[80];
int capexp = 0; int capexp = 0;
int magnitude; int magnitude;
if (fmt == 'G' || fmt == 'E') if (fmt == 'G' || fmt == 'E') {
{
capexp = 1; capexp = 1;
fmt += 'a' - 'A'; fmt += 'a' - 'A';
} }
if (fmt == 'g') if (fmt == 'g') {
{
digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf);
magnitude = decpt - 1; magnitude = decpt - 1;
if (magnitude < -4 || magnitude > precision - 1) if (magnitude < -4 || magnitude > precision - 1) {
{
fmt = 'e'; fmt = 'e';
precision -= 1; precision -= 1;
} } else {
else
{
fmt = 'f'; fmt = 'f';
precision -= decpt; precision -= decpt;
} }
} }
if (fmt == 'e') if (fmt == 'e') {
{
digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf);
if (sign) if (sign)
@@ -271,22 +238,18 @@ parse_float(double value, char *buffer, char fmt, int precision)
buffer += precision; buffer += precision;
*buffer++ = capexp ? 'E' : 'e'; *buffer++ = capexp ? 'E' : 'e';
if (decpt == 0) if (decpt == 0) {
{
if (value == 0.0) if (value == 0.0)
exp = 0; exp = 0;
else else
exp = -1; exp = -1;
} } else
else
exp = decpt - 1; exp = decpt - 1;
if (exp < 0) if (exp < 0) {
{
*buffer++ = '-'; *buffer++ = '-';
exp = -exp; exp = -exp;
} } else
else
*buffer++ = '+'; *buffer++ = '+';
buffer[2] = (exp % 10) + '0'; buffer[2] = (exp % 10) + '0';
@@ -295,39 +258,29 @@ parse_float(double value, char *buffer, char fmt, int precision)
exp = exp / 10; exp = exp / 10;
buffer[0] = (exp % 10) + '0'; buffer[0] = (exp % 10) + '0';
buffer += 3; buffer += 3;
} } else if (fmt == 'f') {
else if (fmt == 'f')
{
digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf);
if (sign) if (sign)
*buffer++ = '-'; *buffer++ = '-';
if (*digits) if (*digits) {
{ if (decpt <= 0) {
if (decpt <= 0)
{
*buffer++ = '0'; *buffer++ = '0';
*buffer++ = '.'; *buffer++ = '.';
for (pos = 0; pos < -decpt; pos++) for (pos = 0; pos < -decpt; pos++)
*buffer++ = '0'; *buffer++ = '0';
while (*digits) while (*digits)
*buffer++ = *digits++; *buffer++ = *digits++;
} } else {
else
{
pos = 0; pos = 0;
while (*digits) while (*digits) {
{
if (pos++ == decpt) if (pos++ == decpt)
*buffer++ = '.'; *buffer++ = '.';
*buffer++ = *digits++; *buffer++ = *digits++;
} }
} }
} } else {
else
{
*buffer++ = '0'; *buffer++ = '0';
if (precision > 0) if (precision > 0) {
{
*buffer++ = '.'; *buffer++ = '.';
for (pos = 0; pos < precision; pos++) for (pos = 0; pos < precision; pos++)
*buffer++ = '0'; *buffer++ = '0';
@@ -338,11 +291,8 @@ parse_float(double value, char *buffer, char fmt, int precision)
*buffer = '\0'; *buffer = '\0';
} }
static void static void decimal_point(char *buffer) {
decimal_point(char *buffer) while (*buffer) {
{
while (*buffer)
{
if (*buffer == '.') if (*buffer == '.')
return; return;
if (*buffer == 'e' || *buffer == 'E') if (*buffer == 'e' || *buffer == 'E')
@@ -350,33 +300,26 @@ decimal_point(char *buffer)
buffer++; buffer++;
} }
if (*buffer) if (*buffer) {
{
int n = strnlen(buffer, 256); int n = strnlen(buffer, 256);
while (n > 0) while (n > 0) {
{
buffer[n + 1] = buffer[n]; buffer[n + 1] = buffer[n];
n--; n--;
} }
*buffer = '.'; *buffer = '.';
} } else {
else
{
*buffer++ = '.'; *buffer++ = '.';
*buffer = '\0'; *buffer = '\0';
} }
} }
static void static void cropzeros(char *buffer) {
cropzeros(char *buffer)
{
char *stop; char *stop;
while (*buffer && *buffer != '.') while (*buffer && *buffer != '.')
buffer++; buffer++;
if (*buffer++) if (*buffer++) {
{
while (*buffer && *buffer != 'e' && *buffer != 'E') while (*buffer && *buffer != 'e' && *buffer != 'E')
buffer++; buffer++;
stop = buffer--; stop = buffer--;
@@ -389,9 +332,8 @@ cropzeros(char *buffer)
} }
} }
static char * static char *flt(char *str, double num, int size, int precision, char fmt,
flt(char *str, double num, int size, int precision, char fmt, int flags) int flags) {
{
char tmp[80]; char tmp[80];
char c, sign; char c, sign;
int n, i; int n, i;
@@ -403,21 +345,15 @@ flt(char *str, double num, int size, int precision, char fmt, int flags)
// Determine padding and sign char // Determine padding and sign char
c = (flags & ZEROPAD) ? '0' : ' '; c = (flags & ZEROPAD) ? '0' : ' ';
sign = 0; sign = 0;
if (flags & SIGN) if (flags & SIGN) {
{ if (num < 0.0) {
if (num < 0.0)
{
sign = '-'; sign = '-';
num = -num; num = -num;
size--; size--;
} } else if (flags & PLUS) {
else if (flags & PLUS)
{
sign = '+'; sign = '+';
size--; size--;
} } else if (flags & SPACE) {
else if (flags & SPACE)
{
sign = ' '; sign = ' ';
size--; size--;
} }
@@ -457,9 +393,7 @@ flt(char *str, double num, int size, int precision, char fmt, int flags)
#endif #endif
static int static int ee_vsprintf(char *buf, const char *fmt, va_list args) {
ee_vsprintf(char *buf, const char *fmt, va_list args)
{
int len; int len;
unsigned long num; unsigned long num;
int i, base; int i, base;
@@ -473,10 +407,8 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
// from string // from string
int qualifier; // 'h', 'l', or 'L' for integer fields int qualifier; // 'h', 'l', or 'L' for integer fields
for (str = buf; *fmt; fmt++) for (str = buf; *fmt; fmt++) {
{ if (*fmt != '%') {
if (*fmt != '%')
{
*str++ = *fmt; *str++ = *fmt;
continue; continue;
} }
@@ -485,8 +417,7 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
flags = 0; flags = 0;
repeat: repeat:
fmt++; // This also skips first '%' fmt++; // This also skips first '%'
switch (*fmt) switch (*fmt) {
{
case '-': case '-':
flags |= LEFT; flags |= LEFT;
goto repeat; goto repeat;
@@ -508,12 +439,10 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
field_width = -1; field_width = -1;
if (is_digit(*fmt)) if (is_digit(*fmt))
field_width = skip_atoi(&fmt); field_width = skip_atoi(&fmt);
else if (*fmt == '*') else if (*fmt == '*') {
{
fmt++; fmt++;
field_width = va_arg(args, int); field_width = va_arg(args, int);
if (field_width < 0) if (field_width < 0) {
{
field_width = -field_width; field_width = -field_width;
flags |= LEFT; flags |= LEFT;
} }
@@ -521,13 +450,11 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
// Get the precision // Get the precision
precision = -1; precision = -1;
if (*fmt == '.') if (*fmt == '.') {
{
++fmt; ++fmt;
if (is_digit(*fmt)) if (is_digit(*fmt))
precision = skip_atoi(&fmt); precision = skip_atoi(&fmt);
else if (*fmt == '*') else if (*fmt == '*') {
{
++fmt; ++fmt;
precision = va_arg(args, int); precision = va_arg(args, int);
} }
@@ -537,8 +464,7 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
// Get the conversion qualifier // Get the conversion qualifier
qualifier = -1; qualifier = -1;
if (*fmt == 'l' || *fmt == 'L') if (*fmt == 'l' || *fmt == 'L') {
{
qualifier = *fmt; qualifier = *fmt;
fmt++; fmt++;
} }
@@ -546,8 +472,7 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
// Default base // Default base
base = 10; base = 10;
switch (*fmt) switch (*fmt) {
{
case 'c': case 'c':
if (!(flags & LEFT)) if (!(flags & LEFT))
while (--field_width > 0) while (--field_width > 0)
@@ -572,17 +497,12 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
continue; continue;
case 'p': case 'p':
if (field_width == -1) if (field_width == -1) {
{
field_width = 2 * sizeof(void *); field_width = 2 * sizeof(void *);
flags |= ZEROPAD; flags |= ZEROPAD;
} }
str = number(str, str = number(str, (unsigned long)va_arg(args, void *), 16, field_width,
(unsigned long)va_arg(args, void *), precision, flags);
16,
field_width,
precision,
flags);
continue; continue;
case 'A': case 'A':
@@ -590,16 +510,10 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
case 'a': case 'a':
if (qualifier == 'l') if (qualifier == 'l')
str = eaddr(str, str = eaddr(str, va_arg(args, unsigned char *), field_width, precision,
va_arg(args, unsigned char *),
field_width,
precision,
flags); flags);
else else
str = iaddr(str, str = iaddr(str, va_arg(args, unsigned char *), field_width, precision,
va_arg(args, unsigned char *),
field_width,
precision,
flags); flags);
continue; continue;
@@ -625,11 +539,7 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
#if HAS_FLOAT #if HAS_FLOAT
case 'f': case 'f':
str = flt(str, str = flt(str, va_arg(args, double), field_width, precision, *fmt,
va_arg(args, double),
field_width,
precision,
*fmt,
flags | SIGN); flags | SIGN);
continue; continue;
@@ -661,31 +571,9 @@ ee_vsprintf(char *buf, const char *fmt, va_list args)
#include <platform.h> #include <platform.h>
void void uart_send_char(char c) { write(STDOUT_FILENO, &c, 1); }
uart_send_char(char c)
{
#if defined(BOARD_ehrenberg)
while (get_uart_rx_tx_reg_tx_free(uart)==0) ;
uart_write(uart, c);
if (c == '\n') {
while (get_uart_rx_tx_reg_tx_free(uart)==0) ;
uart_write(uart, '\r');
}
#elif defined(BOARD_iss)
*((uint32_t*) 0xFFFF0000) = c;
#else
while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ;
UART0_REG(UART_REG_TXFIFO) = c;
if (c == '\n') {
while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ;
UART0_REG(UART_REG_TXFIFO) = '\r';
}
#endif
}
int int ee_printf(const char *fmt, ...) {
ee_printf(const char *fmt, ...)
{
char buf[1024], *p; char buf[1024], *p;
va_list args; va_list args;
int n = 0; int n = 0;
@@ -694,8 +582,7 @@ ee_printf(const char *fmt, ...)
ee_vsprintf(buf, fmt, args); ee_vsprintf(buf, fmt, args);
va_end(args); va_end(args);
p = buf; p = buf;
while (*p) while (*p) {
{
uart_send_char(*p); uart_send_char(*p);
n++; n++;
p++; p++;

View File

@@ -1,20 +1,27 @@
cmake_minimum_required(VERSION 3.21) cmake_minimum_required(VERSION 3.21)
project(dhrystone C) project(dhrystone C)
set(TARGET dhrystone) set(TARGET dhrystone)
set(CMAKE_BUILD_TYPE Release)
set(ITERATIONS 50000) # 20000 for TGC set(ITERATIONS 50000 CACHE STRING "")
set(FREQ 100e6 CACHE STRING "")
set(CMAKE_C_FLAGS_RELEASE -O3)
add_executable(${TARGET} dhry_1.c dhry_2.c dhry_stubs.c) add_executable(${TARGET} dhry_1.c dhry_2.c dhry_stubs.c)
target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
target_compile_options(${TARGET} PRIVATE -fno-inline -fno-builtin-printf -fno-common -Wno-implicit -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las) target_compile_options(${TARGET} PRIVATE
target_compile_definitions(${TARGET} PRIVATE ITERATIONS=${ITERATIONS} HZ=32768 TIME NO_INIT) -Wno-implicit -fno-builtin-printf
-finline -fno-common -funroll-loops -fpeel-loops
-finline-functions -finline-limit=1000
-fgcse-sm -fgcse-las
-falign-functions=16 -falign-jumps=4 -falign-loops=4
-freorder-blocks-and-partition -fno-if-conversion2 -fno-crossjumping)
target_compile_definitions(${TARGET} PRIVATE ITERATIONS=${ITERATIONS} HZ=${FREQ} TIME NO_INIT)
set(BOARD "iss" CACHE STRING "Target board") set(BOARD "iss" CACHE STRING "Target board")
add_subdirectory(../../bare-metal-bsp bsp) add_subdirectory(../../bare-metal-bsp bsp)
target_link_libraries(${TARGET} PRIVATE bsp) target_link_libraries(${TARGET} PRIVATE bsp)
target_link_options(${TARGET} PRIVATE LINKER:--wrap=scanf) target_link_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map -Wl,--wrap=scanf)
include(CMakePrintHelpers)
cmake_print_properties(TARGETS ${TARGET} PROPERTIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS INTERFACE_LINK_OPTIONS)
add_custom_command(TARGET ${TARGET} POST_BUILD add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis

View File

@@ -0,0 +1,118 @@
{
"version": 3,
"vendor": {
"conan": {}
},
"cmakeMinimumRequired": {
"major": 3,
"minor": 24,
"patch": 0
},
"configurePresets": [
{
"name": "32imc",
"hidden": true,
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake"
}
},
{
"name": "64imc",
"hidden": true,
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake"
}
},
{
"name": "iss",
"hidden": true,
"cacheVariables": {
"BOARD": "iss"
}
},
{
"name": "moonlight",
"hidden": true,
"cacheVariables": {
"BOARD": "moonlight"
}
},
{
"name": "tgc_vp",
"hidden": true,
"cacheVariables": {
"BOARD": "tgc_vp"
}
},
{
"name": "rtl",
"hidden": true,
"cacheVariables": {
"BOARD": "rtl"
}
},
{
"name": "debug",
"hidden": true,
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "release",
"hidden": true,
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "ISS_Debug",
"inherits": ["iss", "debug", "32imc"]
},
{
"name": "Moonlight_Debug",
"inherits": ["moonlight", "debug", "32imc"]
},
{
"name": "TGC_VP_Debug",
"inherits": ["tgc_vp", "debug", "32imc"]
},
{
"name": "ISS_Debug_64",
"inherits": ["iss", "debug", "64imc"]
},
{
"name": "Moonlight_Debug_64",
"inherits": ["moonlight", "debug", "64imc"]
},
{
"name": "TGC_VP_Debug_64",
"inherits": ["tgc_vp", "debug", "64imc"]
},
{
"name": "ISS_Release",
"inherits": ["iss", "release", "32imc"]
},
{
"name": "Moonlight_Release",
"inherits": ["moonlight", "release", "32imc"]
},
{
"name": "TGC_VP_Release",
"inherits": ["tgc_vp", "release", "32imc"]
},
{
"name": "ISS_Release_64",
"inherits": ["iss", "release", "64imc"]
},
{
"name": "Moonlight_Release_64",
"inherits": ["moonlight", "release", "64imc"]
},
{
"name": "TGC_VP_Release_64",
"inherits": ["tgc_vp", "release", "64imc"]
}
]
}

View File

@@ -9,7 +9,7 @@ HEADERS := dhry.h
BOARD?=iss BOARD?=iss
LINK_TARGET=link LINK_TARGET=link
RISCV_ARCH:=rv32$(ISA) RISCV_ARCH:=rv32$(ISA)
ifeq ($(ISA),e) ifneq (,$(findstring e,$(ISA)))
RISCV_ABI:=ilp32e RISCV_ABI:=ilp32e
else else
RISCV_ABI:=ilp32 RISCV_ABI:=ilp32
@@ -18,7 +18,6 @@ endif
CFLAGS := -g -O3 -DITERATIONS=$(ITERATIONS) -DHZ=32768 -DTIME -DNO_INIT -fno-inline -fno-builtin-printf -fno-common -Wno-implicit \ CFLAGS := -g -O3 -DITERATIONS=$(ITERATIONS) -DHZ=32768 -DTIME -DNO_INIT -fno-inline -fno-builtin-printf -fno-common -Wno-implicit \
-funroll-loops -fpeel-loops -fgcse-sm -fgcse-las -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las
LDFLAGS := -Wl,--wrap=scanf LDFLAGS := -Wl,--wrap=scanf
TOOL_DIR=$(dir $(compiler)) TOOL_DIR=$(dir $(compiler))
BSP_BASE = ../../bare-metal-bsp BSP_BASE = ../../bare-metal-bsp

View File

@@ -212,7 +212,7 @@ main ()
printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]);
printf (" should be: Number_Of_Runs + 10\n"); printf (" should be: Number_Of_Runs + 10\n");
printf ("Ptr_Glob->\n"); printf ("Ptr_Glob->\n");
printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" Ptr_Comp: %d\n", (long) Ptr_Glob->Ptr_Comp);
printf (" should be: (implementation-dependent)\n"); printf (" should be: (implementation-dependent)\n");
printf (" Discr: %d\n", Ptr_Glob->Discr); printf (" Discr: %d\n", Ptr_Glob->Discr);
printf (" should be: %d\n", 0); printf (" should be: %d\n", 0);
@@ -223,7 +223,7 @@ main ()
printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp);
printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n");
printf ("Next_Ptr_Glob->\n"); printf ("Next_Ptr_Glob->\n");
printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" Ptr_Comp: %d\n", (long) Next_Ptr_Glob->Ptr_Comp);
printf (" should be: (implementation-dependent), same as above\n"); printf (" should be: (implementation-dependent), same as above\n");
printf (" Discr: %d\n", Next_Ptr_Glob->Discr); printf (" Discr: %d\n", Next_Ptr_Glob->Discr);
printf (" should be: %d\n", 0); printf (" should be: %d\n", 0);

View File

@@ -1,4 +1,5 @@
#include "platform.h" #include "platform.h"
#include <unistd.h>
#ifndef ITERATIONS #ifndef ITERATIONS
#define ITERATIONS 20000 #define ITERATIONS 20000
#endif #endif
@@ -6,20 +7,16 @@
/* The functions in this file are only meant to support Dhrystone on an /* The functions in this file are only meant to support Dhrystone on an
* embedded RV32 system and are obviously incorrect in general. */ * embedded RV32 system and are obviously incorrect in general. */
long time(void) long time(void) { return get_timer_value(); }
{
return get_timer_value();
}
// set the number of dhrystone iterations // set the number of dhrystone iterations
void __wrap_scanf(const char* fmt, int* n) void __wrap_scanf(const char *fmt, int *n) { *n = ITERATIONS; }
{
*n = ITERATIONS;
}
extern volatile uint32_t tohost; // extern volatile uint64_t tohost;
void exit(int n) { void exit(int n) {
tohost = 0x1; // tohost = 0x1;
for (;;); write_hex(STDERR_FILENO, 1);
for (;;)
;
} }

View File

@@ -4,8 +4,9 @@ set(TARGET hello)
add_executable(${TARGET} hello.c) add_executable(${TARGET} hello.c)
set(BOARD "iss" CACHE STRING "Target board") set(BOARD "iss" CACHE STRING "Target board")
add_subdirectory(../bare-metal-bsp bsp) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../bare-metal-bsp bsp)
target_link_libraries(${TARGET} PRIVATE bsp) target_link_libraries(${TARGET} PRIVATE bsp)
target_link_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map)
add_custom_command(TARGET ${TARGET} POST_BUILD add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis

View File

@@ -0,0 +1,122 @@
{
"version": 3,
"vendor": {
"conan": {}
},
"cmakeMinimumRequired": {
"major": 3,
"minor": 24,
"patch": 0
},
"configurePresets": [
{
"name": "32imc",
"hidden": true,
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../bare-metal-bsp/cmake/rv32imc.cmake"
}
},
{
"name": "64imc",
"hidden": true,
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../bare-metal-bsp/cmake/rv64gc.cmake"
}
},
{
"name": "iss",
"hidden": true,
"cacheVariables": {
"BOARD": "iss"
}
},
{
"name": "moonlight",
"hidden": true,
"cacheVariables": {
"BOARD": "moonlight"
}
},
{
"name": "tgc_vp",
"hidden": true,
"cacheVariables": {
"BOARD": "tgc_vp"
}
},
{
"name": "rtl",
"hidden": true,
"cacheVariables": {
"BOARD": "rtl"
}
},
{
"name": "debug",
"hidden": true,
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "release",
"hidden": true,
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "ISS_Debug",
"inherits": ["iss", "debug", "32imc"]
},
{
"name": "Moonlight_Debug",
"inherits": ["moonlight", "debug", "32imc"]
},
{
"name": "TGC_VP_Debug",
"inherits": ["tgc_vp", "debug", "32imc"]
},
{
"name": "ISS_Debug_64",
"inherits": ["iss", "debug", "64imc"]
},
{
"name": "Moonlight_Debug_64",
"hidden": true,
"inherits": ["moonlight", "debug", "64imc"]
},
{
"name": "TGC_VP_Debug_64",
"hidden": true,
"inherits": ["tgc_vp", "debug", "64imc"]
},
{
"name": "ISS_Release",
"inherits": ["iss", "release", "32imc"]
},
{
"name": "Moonlight_Release",
"inherits": ["moonlight", "release", "32imc"]
},
{
"name": "TGC_VP_Release",
"inherits": ["tgc_vp", "release", "32imc"]
},
{
"name": "ISS_Release_64",
"inherits": ["iss", "release", "64imc"]
},
{
"name": "Moonlight_Release_64",
"hidden": true,
"inherits": ["moonlight", "release", "64imc"]
},
{
"name": "TGC_VP_Release_64",
"hidden": true,
"inherits": ["tgc_vp", "release", "64imc"]
}
]
}

View File

@@ -1,4 +1,3 @@
TARGET = hello TARGET = hello
ISA?=imc ISA?=imc

View File

@@ -1,24 +1,21 @@
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include "platform.h" #include "platform.h"
#include "encoding.h" #include <string.h>
int factorial(int i) { int factorial(int i) {
volatile int result = 1; volatile int result = 1;
for (int ii = 1; ii <= i; ii++) { for (int ii = 1; ii <= i; ii++) {
result = result * ii; result = result * ii;
} }
return result; return result;
} }
int main() int main() {
{ int result = factorial(10);
volatile int result = factorial (10); printf("Factorial is %d", result);
printf("Factorial is %d\n", result);
printf("End of execution");
return 0; return 0;
} }