49 Commits

Author SHA1 Message Date
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 1080 additions and 952 deletions

4
.gitignore vendored
View File

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

View File

@ -1,172 +1,14 @@
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)
set(BOARD iss CACHE STRING "Target board")
set(BOARD iss)
endif()
if (NOT DEFINED ISA)
set(ISA rv32imc CACHE STRING "Target ISA")
set(ISA imc)
endif()
if(NOT DEFINED RISCV_ABI)
if(ISA MATCHES "^rv64")
set(RISCV_ABI "lp64" CACHE STRING "RISC-V ABI")
else()
set(RISCV_ABI "ilp32" CACHE STRING "RISC-V ABI")
if(DEFINED LINK_TARGET)
set(LNK LINK_TARGET=${LINK_TARGET})
endif()
endif()
# 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)
message(STATUS "Building firmware using ${BOARD} board configuration and isa ${ISA}")
add_custom_target(fw-common ALL
DEPENDS
hello-world
dhrystone
coremark
)
endif()
# 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++ ..")
COMMAND make -C hello-world BOARD=${BOARD} ISA=${ISA} ${LNK} && make -C benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA} ${LNK} && make -C benchmarks/coremark BOARD=${BOARD} ISA=${ISA} ${LNK}
USES_TERMINAL
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

116
Jenkinsfile vendored
View File

@ -2,7 +2,7 @@ void checkout_project() {
checkout([
$class: 'GitSCM',
branches: [
[name: '*/main']
[name: '*/develop']
],
extensions: [
[$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() {
dir("bare-metal-bsp") {
withCredentials([usernamePassword(credentialsId: 'gitea-jenkins', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
@ -29,6 +47,17 @@ void make_hello(board) {
sh("make -C hello-world/ clean")
}
void cmake_hello(board,build_type,core_type) {
sh("pwd")
// sh("cd hello-world/")
//sh("pwd")
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 {
agent { docker {
image 'ubuntu-riscv'
@ -48,12 +77,13 @@ pipeline {
stage('make rtl') {steps { make_hello("rtl")}}
stage('make ehrenberg') {steps { make_hello("ehrenberg")}}
stage('make tgc_vp') {steps { make_hello("tgc_vp")}}*/
stage('make hello-world') {
matrix {
axes {
axis{
name 'BOARD'
values 'iss', 'hifive1', 'TGCP', 'ehrenberg', 'rtl', 'tgc_vp'
values 'iss', 'moonlight', 'tgc_vp'
}
}
stages {
@ -72,10 +102,92 @@ 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")
}
stages {
stage("CMAKE") {
steps {
dir("hello-world"){
cmake_hello("${BOARD}","${BUILD_TYPE}","${CORE_TYPE}")
}
}
}
}
}
}
}
}
stage("Checkout TGC-ISS, TGC-Compliance and TGC-GEN"){
steps {
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 'pwd'
sh 'conan profile detect --force'
sh 'rm -rf build'
/*
sh '''
for core in RV32GC; do
for backend in interp; do
TGC-GEN/scripts/generate_iss.sh -o dbt-rise-tgc/ -c $core -b ${backend} TGC-GEN/CoreDSL/${core}.core_desc
done
done
for core in RV64GC; do
for backend in interp; do
TGC-GEN/scripts/generate_iss.sh -o dbt-rise-tgc/ -c $core -b ${backend} TGC-GEN/CoreDSL/${core}.core_desc
done
done
'''
sh 'conan profile detect --force'
sh 'rm -rf build'
sh 'cmake -S . -B build --preset Release -DWITH_ASMJIT=ON -DWITH_TCC=ON -DWITH_LLVM=OFF'
sh 'cmake --build build -j'
sh 'build/dbt-rise-tgc/tgc-sim --isa ?'
*/
}
}
stage("start to check") {
steps {
sh 'pwd'
}
}
}
/*
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)
# Include BSP libwrap
include(${BSP_BASE}/libwrap/CMakeLists.txt)
set(TARGET coremark)
set(CMAKE_BUILD_TYPE Release)
# Source files
set(SOURCES
@ -18,49 +17,15 @@ set(SOURCES
# Create executable
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
target_include_directories(coremark PRIVATE
${BSP_BASE}/include
${BSP_BASE}/drivers
${BSP_BASE}/env
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/cm
)
set(BOARD "iss" CACHE STRING "Target board")
add_subdirectory(../../bare-metal-bsp bsp)
target_link_libraries(${TARGET} PRIVATE bsp)
target_link_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map)
# Link with libwrap
target_link_libraries(coremark PRIVATE
LIBWRAP_TGC
)
# 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
)
add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis
COMMENT "Creating disassembly for ${TARGET}")

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

View File

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

View File

@ -1,8 +1,8 @@
cmake_minimum_required(VERSION 3.21)
project(dhrystone C)
set(TARGET dhrystone)
set(CMAKE_BUILD_TYPE Release)
set(ITERATIONS 50000) # 20000 for TGC
set(ITERATIONS 50000)
add_executable(${TARGET} dhry_1.c dhry_2.c dhry_stubs.c)
target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
@ -12,9 +12,7 @@ target_compile_definitions(${TARGET} PRIVATE ITERATIONS=${ITERATIONS} HZ=32768 T
set(BOARD "iss" CACHE STRING "Target board")
add_subdirectory(../../bare-metal-bsp bsp)
target_link_libraries(${TARGET} PRIVATE bsp)
target_link_options(${TARGET} PRIVATE LINKER:--wrap=scanf)
include(CMakePrintHelpers)
cmake_print_properties(TARGETS ${TARGET} PROPERTIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS INTERFACE_LINK_OPTIONS)
target_link_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map)
add_custom_command(TARGET ${TARGET} POST_BUILD
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
LINK_TARGET=link
RISCV_ARCH:=rv32$(ISA)
ifeq ($(ISA),e)
ifneq (,$(findstring e,$(ISA)))
RISCV_ABI:=ilp32e
else
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 \
-funroll-loops -fpeel-loops -fgcse-sm -fgcse-las
LDFLAGS := -Wl,--wrap=scanf
TOOL_DIR=$(dir $(compiler))
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 (" should be: Number_Of_Runs + 10\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 (" Discr: %d\n", Ptr_Glob->Discr);
printf (" should be: %d\n", 0);
@ -223,7 +223,7 @@ main ()
printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp);
printf (" should be: DHRYSTONE PROGRAM, SOME STRING\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 (" Discr: %d\n", Next_Ptr_Glob->Discr);
printf (" should be: %d\n", 0);

View File

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

View File

@ -4,8 +4,9 @@ set(TARGET hello)
add_executable(${TARGET} hello.c)
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_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map)
add_custom_command(TARGET ${TARGET} POST_BUILD
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

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

View File

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