diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..a2683b8 --- /dev/null +++ b/.clang-format @@ -0,0 +1,96 @@ +Language: Cpp +# BasedOnStyle: LLVM +# should be in line with IndentWidth +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: false +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: true +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 140 +CommentPragmas: '^( IWYU pragma:| @suppress)' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 0 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '$' +IndentCaseLabels: false +IndentWidth: 4 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +ReflowComments: true +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: Never +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 4 +UseTab: Never +... + diff --git a/.cproject b/.cproject index fee098f..23a37ba 100644 --- a/.cproject +++ b/.cproject @@ -14,9 +14,9 @@ - + - + - + - - - + + + @@ -112,8 +112,66 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -126,6 +184,7 @@ + @@ -133,15 +192,37 @@ - + + + + + + + + + + + + + + + + + make + $<cmake4eclipse_dyn> + format + true + true + true + + - \ No newline at end of file diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..de09571 --- /dev/null +++ b/.envrc @@ -0,0 +1,8 @@ +module load ./Modulefile +distro=`/bin/lsb_release -i -s` +if [ $distro == "CentOS" ]; then + . /opt/rh/devtoolset-8/enable + . /opt/rh/rh-python38/enable +fi +layout python3 +[ -f .envrc.$USER ] && . .envrc.$USER diff --git a/.gitignore b/.gitignore index fad1dc6..58016a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,24 @@ /build/ /Debug/ .settings -/.venv +/.venv* /Debug-PA/ /_build/ /install/ -/analysis_results \ No newline at end of file +/analysis_results +.vscode +*.log +*tcc_jit*.c +*.disass +*.dis +*.objdump +*.asm +*.signature +*.elf +*.trc +/*.core_desc +/fasterDecoding/ +*.ll +/dbt-rise-plugins +/.direnv +/TGC_C_XRB/ diff --git a/CMakeLists.txt b/CMakeLists.txt index ea67795..fcf0afd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,147 +1,240 @@ -cmake_minimum_required(VERSION 3.16) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/scc/cmake) +cmake_minimum_required(VERSION 3.20) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/scc/cmake) -project(TGFS-ISS VERSION 1.0.0 LANGUAGES CXX) +project(TGC-ISS VERSION 1.0.0 LANGUAGES CXX) -option(CODEGEN "enable generation of ISS code" ON) -set(CORE_NAME TGC_C CACHE STRING "The core to build the ISS for" ) set(WITH_LLVM FALSE CACHE BOOL "Build LLVM based backend") - -set(CMAKE_CXX_STANDARD 14) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) -set(CMAKE_INSTALL_RPATH "${ORIGIN}") -include(CheckCXXCompilerFlag) -include(GNUInstallDirs) - -CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE) -if(COMPILER_SUPPORTS_MARCH_NATIVE) - if("${CMAKE_BUILD_TYPE}" STREQUAL "") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") - elseif(NOT(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") - endif() -endif() - -if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - set(warnings "-Wall -Wextra -Werror") - #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0") - set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") - set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG") -elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - set(warnings "/W4 /WX /EHsc") -endif() - -include(ConanInline) -if(BUILD_SHARED_LIBS) - set(SHARED_FLAG "True") -else() - set(SHARED_FLAG "False") -endif() - -set(CONAN_BOOST_OPTIONS -boost:fPIC=True -boost:shared=${SHARED_FLAG} -boost:header_only=False -boost:without_contract=True -boost:without_graph=True -boost:without_graph_parallel=True -boost:without_iostreams=True -boost:without_json=True -boost:without_locale=True -boost:without_log=True -boost:without_math=True -boost:without_mpi=True -boost:without_nowide=True -boost:without_python=True -boost:without_random=True -boost:without_regex=True -boost:without_stacktrace=True -boost:without_test=True -boost:without_timer=True -boost:without_type_erasure=True -boost:without_wave=True -) - -set(B2_VERSION 4.9.3) -set(CONAN_PACKAGE_LIST - fmt/8.0.1 - spdlog/1.9.2 - boost/1.75.0 - gsl-lite/0.37.0 - elfio/3.8 - tcc/0.9.27 - lz4/1.9.3 - yaml-cpp/0.7.0 - jsoncpp/1.9.5 -) - -set(CONAN_PACKAGE_OPTIONS fmt:header_only=True ${CONAN_BOOST_OPTIONS}) -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - list(APPEND CONAN_PACKAGE_OPTIONS lua:compile_as_cpp=False) - list(APPEND CONAN_PACKAGE_LIST tcc/0.9.27 seasocks/1.4.4 lua/5.4.3) -endif() -if(NOT USE_CWR_SYSTEMC AND NOT USE_NCSC_SYSTEMC AND NOT DEFINED ENV{SYSTEMC_HOME}) - set(CONAN_PACKAGE_LIST ${CONAN_PACKAGE_LIST} - systemc/2.3.3 - systemc-cci/1.0.0 - ) - set(CONAN_PACKAGE_OPTIONS ${CONAN_PACKAGE_OPTIONS} - systemc:shared=${SHARED_FLAG} - systemc-cci:shared=${SHARED_FLAG} - ) -endif() - -conan_check() -conan_add_remote(NAME minres URL https://git.minres.com/api/packages/Tooling/conan) -# Boost on CentOS 7 quirks: the b2 of conan-center is build against a newer libstdc++ and therefore does not run -# with the oooooold libs on CentOS 7. Therefore we build our own version of b2 if it is not there -set(B2_META $ENV{HOME}/.conan/data/b2/${B2_VERSION}/_/_/metadata.json) -if(DEFINED ENV{CONAN_USER_HOME}) - set(B2_META $ENV{CONAN_USER_HOME}/.conan/data/b2/${B2_VERSION}/_/_/metadata.json) -endif() -if(NOT EXISTS ${B2_META}) - conan_configure(REQUIRES b2/${B2_VERSION}) - conan_cmake_autodetect(settings) - conan_cmake_install(PATH_OR_REFERENCE . BUILD b2 SETTINGS ${settings}) -endif() -# Boost on CentOS 7 quirks end -conan_cmake_configure(REQUIRES ${CONAN_PACKAGE_LIST} - GENERATORS cmake_find_package - OPTIONS ${CONAN_PACKAGE_OPTIONS} - ) -conan_cmake_autodetect(settings) -conan_install() -set(CONAN_CMAKE_SILENT_OUTPUT ON) -find_package(tcc QUIET) -find_package(elfio) -find_package(fmt) -find_package(spdlog) -find_package(gsl-lite) - -set(Boost_NO_BOOST_CMAKE ON) # Don't do a find_package in config mode before searching for a regular boost install. -set(BOOST_ROOT ${CONAN_BOOST_ROOT}) -find_package(Threads) -find_package(ZLIB) - -include(clang-format) -set(ENABLE_CLANG_TIDY OFF CACHE BOOL "Add clang-tidy automatically to builds") -if (ENABLE_CLANG_TIDY) - find_program (CLANG_TIDY_EXE NAMES "clang-tidy" PATHS /usr/local/opt/llvm/bin ) - if (CLANG_TIDY_EXE) - message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}") - set(CLANG_TIDY_CHECKS "-*,modernize-*") - set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE};-checks=${CLANG_TIDY_CHECKS};-header-filter='${CMAKE_SOURCE_DIR}/*';-fix" - CACHE STRING "" FORCE) +if(CMAKE_PROJECT_NAME STREQUAL "TGC-ISS") + ########################################################################### + # stand alone build settings + ########################################################################### + set(CORE_NAME TGC5C CACHE STRING "The core to build the ISS for" ) + option(BUILD_COMMON_FW "Enable the automatic download and build of some firmware to run on the ISS" OFF) + option(ENABLE_SANITIZER "Enable address sanitizer" OFF) + option(ENABLE_CLANG_TIDY "Add clang-tidy and clang-format automatically to builds" OFF) + option(WITH_TCC "Build TCC backend" OFF) + option(WITH_LLVM "Build LLVM backend" OFF) + option(WITH_ASMJIT "Build ASMJIT backend" OFF) + + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_EXTENSIONS OFF) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_INSTALL_RPATH "${ORIGIN}") + include(CheckCXXCompilerFlag) + CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE) + if(COMPILER_SUPPORTS_MARCH_NATIVE) + if("${CMAKE_BUILD_TYPE}" STREQUAL "") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") + elseif(NOT(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") + endif() + endif() + + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(warnings "-Wall -Wextra -Werror") + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") + set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG") + elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(warnings "/W4 /WX /EHsc") + endif() + if(ENABLE_SANITIZER) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") + endif() + include(GNUInstallDirs) + include(ConanInline) + if(BUILD_SHARED_LIBS) + set(SHARED_FLAG "True") else() - message(AUTHOR_WARNING "clang-tidy not found!") - set(CMAKE_CXX_CLANG_TIDY "" CACHE STRING "" FORCE) # delete it + set(SHARED_FLAG "False") + endif() + + set(CONAN_BOOST_OPTIONS + boost:fPIC=True + boost:shared=False + boost:header_only=False + boost:without_contract=True + boost:without_graph=True + boost:without_graph_parallel=True + boost:without_iostreams=True + boost:without_json=True + boost:without_locale=True + boost:without_log=True + boost:without_math=True + boost:without_mpi=True + boost:without_nowide=True + boost:without_python=True + boost:without_random=True + boost:without_regex=True + boost:without_stacktrace=True + boost:without_test=True + boost:without_timer=True + boost:without_type_erasure=True + boost:without_wave=True + ) + + set(B2_VERSION 4.9.6) + set(CM_VERSION 3.20.5) + set(LLVM_VERSION 13.0.0) + set(CONAN_PACKAGE_LIST + fmt/8.0.1 + spdlog/1.9.2 + boost/1.75.0 + gsl-lite/0.37.0 + elfio/3.8 + lz4/1.9.3 + yaml-cpp/0.7.0 + jsoncpp/1.9.5 + zlib/1.2.12 + ) + set(CONAN_PACKAGE_OPTIONS fmt:header_only=True ${CONAN_BOOST_OPTIONS}) + + if(WITH_LLVM) + list(APPEND CONAN_PACKAGE_LIST llvm-core/${LLVM_VERSION}) + list(APPEND CONAN_PACKAGE_OPTIONS libiconv:shared=True) + endif() + if(WITH_ASMJIT) + list(APPEND CONAN_PACKAGE_LIST asmjit/cci.20230325) + list(APPEND CONAN_PACKAGE_OPTIONS asmjit:shared=False) + endif() + if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dbt-rise-plugins) + list(APPEND CONAN_PACKAGE_OPTIONS lua:compile_as_cpp=False) + list(APPEND CONAN_PACKAGE_LIST lua/5.4.3) + endif() + + conan_check() + conan_add_remote(NAME minres URL https://git.minres.com/api/packages/Tooling/conan) + ########################################################################### + # Boost on CentOS 7 quirks: the b2 of conan-center is build against a newer libstdc++ and therefore does not run + # with the oooooold libs on CentOS 7. Therefore we build our own version of b2 if it is not there + ########################################################################### + find_program(LSB_RELEASE_EXEC lsb_release) + if(NOT LSB_RELEASE_EXEC-NOTFOUND) + execute_process(COMMAND "${LSB_RELEASE_EXEC}" --short --id OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE) + if(LSB_RELEASE_ID_SHORT MATCHES "CentOS") + set(B2_META $ENV{HOME}/.conan/data/b2/${B2_VERSION}/_/_/metadata.json) + set(CM_META $ENV{HOME}/.conan/data/cmake/${CM_VERSION}/_/_/metadata.json) + set(LLVM_META $ENV{HOME}/.conan/data/llvm-core/${LLVM_VERSION}/_/_/metadata.json) + if(DEFINED ENV{CONAN_USER_HOME}) + set(B2_META $ENV{CONAN_USER_HOME}/.conan/data/b2/${B2_VERSION}/_/_/metadata.json) + set(CMAKE_META $ENV{CONAN_USER_HOME}/.conan/data/cmake/${CM_VERSION}/_/_/metadata.json) + set(LLVM_META $ENV{CONAN_USER_HOME}/.conan/data/llvm-core/${LLVM_VERSION}/_/_/metadata.json) + endif() + if(NOT EXISTS ${B2_META}) + conan_configure(REQUIRES b2/${B2_VERSION}) + conan_cmake_autodetect(settings BUILD_TYPE Release) + conan_cmake_install(PATH_OR_REFERENCE . BUILD b2 SETTINGS ${settings}) + endif() + if(NOT EXISTS ${CM_META}) + conan_configure(REQUIRES cmake/${CM_VERSION}) + conan_cmake_autodetect(settings BUILD_TYPE Release) + conan_cmake_install(PATH_OR_REFERENCE . BUILD cmake SETTINGS ${settings}) + endif() + if(NOT EXISTS ${LLVM_META}) + conan_configure(REQUIRES llvm-core/13.0.0) + conan_cmake_autodetect(settings BUILD_TYPE Release) + conan_cmake_install(PATH_OR_REFERENCE . BUILD llvm-core SETTINGS ${settings}) + endif() + endif() + endif() + ########################################################################### + # Boost on CentOS 7 quirks end + ########################################################################### + conan_cmake_configure(REQUIRES ${CONAN_PACKAGE_LIST} + GENERATORS cmake_find_package + OPTIONS ${CONAN_PACKAGE_OPTIONS} + ) + conan_cmake_autodetect(settings) + conan_install() + set(CONAN_CMAKE_SILENT_OUTPUT ON) + + find_package(fmt) + find_package(spdlog) + find_package(lz4) + find_package(gsl-lite) + find_package(yaml-cpp) + set(Boost_NO_BOOST_CMAKE ON) # Don't do a find_package in config mode before searching for a regular boost install. + set(BOOST_ROOT ${CONAN_BOOST_ROOT}) + find_package(Threads) + find_package(ZLIB) + + if(USE_CWR_SYSTEMC) + include(SystemCPackage) + endif() + ############################################################################### + # setup clang-format and clang-tidy + ############################################################################### + if (ENABLE_CLANG_TIDY) + set(CLANG_FORMAT_EXCLUDE_PATTERNS "scc" "install") + find_package(ClangFormat) + find_program (CLANG_TIDY_EXE NAMES "clang-tidy" PATHS /usr/bin ) + if (CLANG_TIDY_EXE) + message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}") + set(CLANG_TIDY_CHECKS "-*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-avoid-bind.PermissiveParameterList") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-loop-convert.*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-make-shared.") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-make-unique.") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-pass-by-value.*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-raw-string-literal.*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-replace-auto-ptr.IncludeStyle") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-replace-disallow-copy-and-assign-macro.MacroName") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-replace-random-shuffle.IncludeStyle") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-auto.*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-bool-literals.IgnoreMacros") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-default-member-init.*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-emplace.*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-equals-default.IgnoreMacros") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-equals-delete.IgnoreMacros") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-nodiscard.ReplacementString") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-noexcept.*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-nullptr.NullMacros") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-override.*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-transparent-functors.SafeMode") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},modernize-use-using.IgnoreMacros") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors") + #set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},cppcoreguidelines-*") + set(CLANG_TIDY_CHECKS "${CLANG_TIDY_CHECKS},clang-diagnostic-*,clang-analyzer-*") + set(DO_CLANG_TIDY "${CLANG_TIDY_EXE};-checks=${CLANG_TIDY_CHECKS};-header-filter='${CMAKE_SOURCE_DIR}/*';-fix" + CACHE STRING "" FORCE) + else() + message(WARNING "clang-tidy not found!") + set(CMAKE_CXX_CLANG_TIDY "" CACHE STRING "" FORCE) # delete it + endif() + endif() + + if(FW_BUILD) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}/..) + FetchContent_Declare( + riscvfw + GIT_REPOSITORY https://git.minres.com/Firmware/Firmwares.git + GIT_TAG main + GIT_SHALLOW OFF + UPDATE_DISCONNECTED ON + ) + FetchContent_GetProperties(riscvfw) + if(NOT riscvfw_POPULATED) + FetchContent_Populate(riscvfw) + endif() + add_subdirectory(${riscvfw_SOURCE_DIR}) endif() endif() add_subdirectory(dbt-rise-core) -add_subdirectory(scc) +if(CMAKE_PROJECT_NAME STREQUAL "TGC-ISS" AND NOT USE_CWR_SYSTEMC) + set(SCC_CMAKE_CONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/scc) + add_subdirectory(scc/src/common) +else() + add_subdirectory(scc) +endif() add_subdirectory(dbt-rise-tgc) +if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dbt-rise-plugins) + add_subdirectory(dbt-rise-plugins) +endif() +include(CTest) diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..d21ea3d --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,74 @@ +void checkout_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] + ], + submoduleCfg: [], + userRemoteConfigs: [ + [credentialsId: 'gitea-jenkins', url: repoUrl] + ] + ]) +} + +pipeline { + agent { + docker { + image 'git.minres.com/tooling/riscof_sail:latest' + args ' -e CONAN_USER_HOME=/var/jenkins_home/workspace/riscof_sail' + } + } + stages { + stage("Checkout TGC-ISS"){ + steps { + checkout_project("https://git.minres.com/TGFS/TGC-ISS.git", "develop") + } + } + stage("build TGC-ISS"){ + steps { + sh 'conan profile new default --detect --force ' + sh 'cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DWITH_ASMJIT=ON -DWITH_TCC=ON -DWITH_LLVM=ON' + sh 'cmake --build build -j' + } + } + stage("Checkout TGC-Compliance"){ + steps { + dir("TGC-COMPLIANCE"){ + checkout_project("https://git.minres.com/TGFS/TGC-COMPLIANCE.git", "master") + } + } + } + stage("Test backends"){ + parallel { + stage("Test interp") { + steps { + sh "mkdir interp" + sh "python3 TGC-COMPLIANCE/run_act.py -core TGC5C -sim build/dbt-rise-tgc/tgc-sim -w interp --dockerless --backend interp" + } + } + stage("Test tcc") { + steps { + sh "mkdir tcc" + sh "python3 TGC-COMPLIANCE/run_act.py -core TGC5C -sim build/dbt-rise-tgc/tgc-sim -w tcc --dockerless --backend tcc" + } + } + stage("Test asmjit") { + steps { + sh "mkdir asmjit" + sh "python3 TGC-COMPLIANCE/run_act.py -core TGC5C -sim build/dbt-rise-tgc/tgc-sim -w asmjit --dockerless --backend asmjit" + } + } + stage("Test llvm") { + steps { + sh "mkdir llvm" + sh "python3 TGC-COMPLIANCE/run_act.py -core TGC5C -sim build/dbt-rise-tgc/tgc-sim -w llvm --dockerless --backend llvm" + } + } + } + } + } +} diff --git a/Modulefile b/Modulefile index 6a191ef..92a2331 100644 --- a/Modulefile +++ b/Modulefile @@ -13,9 +13,10 @@ if { $distro == "CentOS" && ![info exists ::env(PROJECT)] && ![info exists ::env puts stderr "Don't forget to execute 'scl enable devtoolset-7 bash'" } +module load tools/utilities module load tools/cmake -#module load tools/gcc-riscv64/9.2.0 -module load tools/gcc-riscv32-unknown-elf/11 +module load tools/clang +module load tools/gcc-riscv64-unknown-elf/13 setenv PROJECT TGFS-ISS diff --git a/README.md b/README.md index f1a42f7..4f360f1 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ This ISS is based in DBT-RISE, a library to allow rapid ISS creation. ``` -### Accellera SystemC build +### Standalone (C++) build * start an out-of-source build: @@ -65,14 +65,22 @@ Assuming environment for Platform Architect is properly set up. ``` cd TGC-ISS/ - export TGFS_INSTALL_ROOT `pwd`/install + export TGFS_INSTALL_ROOT=`pwd`/install export SNPS_ENABLE_MEM_ON_DEMAND_IN_GENERIC_MEM=1 + source $COWAREHOME/SLS/linux/setup.sh pae export CC=$COWAREHOME/SLS/linux/common/bin/gcc export CXX=$COWAREHOME/SLS/linux/common/bin/g++ cmake -S . -B build/PA -DCMAKE_BUILD_TYPE=Debug -DUSE_CWR_SYSTEMC=ON \ - -DBUILD_SHARED_LIBS=ON -DCODEGEN=OFF -DCMAKE_INSTALL_PREFIX=${TGFS_INSTALL_ROOT} + -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=${TGFS_INSTALL_ROOT} cmake --build build/PA --target install -j16 ``` +The Synopsys PA installation requirements may vary on your system. +Now you may change to the directory dbt-rise-tgc/contrib to import the core model -Now you may change to dbt-rise-tgc/contrib to import the core model \ No newline at end of file +``` + +cd dbt-rise-tgc/contrib +pct tgc_import.tcl + +``` \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..16fd4e3 --- /dev/null +++ b/build.sh @@ -0,0 +1,13 @@ +export TGFS_INSTALL_ROOT=`pwd`/install +module load tools/pa/T-2022.06 +module load tools/cmake +export SNPS_ENABLE_MEM_ON_DEMAND_IN_GENERIC_MEM=1 +export CC=$COWAREHOME/common/bin/gcc +export CXX=$COWAREHOME/common/bin/g++ +cmake -S . -B build/PA -DCMAKE_BUILD_TYPE=Debug -DUSE_CWR_SYSTEMC=ON -DBUILD_SHARED_LIBS=ON \ + -DCODEGEN=OFF -DCMAKE_INSTALL_PREFIX=${TGFS_INSTALL_ROOT} +cmake --build build/PA --target install -j16 +#cd dbt-rise-tgc/contrib +# import the TGC core itself +#pct tgc_import.tcl + diff --git a/dbt-rise-core b/dbt-rise-core index fa6166a..6a5bb0f 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit fa6166ae43b90d4263e9d50402a055d6172ccb69 +Subproject commit 6a5bb0fe5e067c23678876716777f8e65c60636a diff --git a/dbt-rise-tgc b/dbt-rise-tgc index cfa7b72..3fd51cc 160000 --- a/dbt-rise-tgc +++ b/dbt-rise-tgc @@ -1 +1 @@ -Subproject commit cfa7b7236397dc84062dc108aadf4bb9c2a02e2b +Subproject commit 3fd51cc68c4547cb1e89d56a2010ff3af0ff5e97 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5cbe7e7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +conan==1.59 diff --git a/scc b/scc index dfb06a9..4dcc549 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit dfb06a90801b3a7e55b5d4a03d8f161a26063a1c +Subproject commit 4dcc5497c587afb0c77423aa532a29082bf03969 diff --git a/scripts/makeJitOutputReadable.py b/scripts/makeJitOutputReadable.py new file mode 100644 index 0000000..674b736 --- /dev/null +++ b/scripts/makeJitOutputReadable.py @@ -0,0 +1,26 @@ +import re +import os +''' +This script takes all files that get dumped by the tcc backend when using the --dump-ir +option and replaces the Integers of addresses with their hex representation to allow +for easier debugging. +''' +current_dir = os.getcwd() # Get the current directory + +files_with_tcc_jit = [file for file in os.listdir(current_dir) if"jit" in file and not file.startswith("readable")] + +for each in files_with_tcc_jit: + readable_file = f"readable_{each}" + if os.path.exists(readable_file): + os.remove(readable_file) + with open(each, "r") as file: + content = file.read() +for each in files_with_tcc_jit: + with open(each, "r") as file: + content = file.read() + + # Replace numbers ending with "U" by their hex representation + content = re.sub(r'\b(\d+)U\b(?=U)?', lambda m: hex(int(m.group(1))), content) + + with open(f"readable_{each}", "w") as file: + file.write(content) \ No newline at end of file diff --git a/scripts/run_riscv_tests.sh b/scripts/run_riscv_tests.sh new file mode 100755 index 0000000..f168835 --- /dev/null +++ b/scripts/run_riscv_tests.sh @@ -0,0 +1,91 @@ +#!/bin/bash +## + +# Absolute path to this script, e.g. /home/user/bin/foo.sh +SCRIPT=`readlink -f "$0"` +# Absolute path this script is in, thus /home/user/bin +SCRIPTDIR=`dirname "$SCRIPT"` +SCRIPTNAME=`basename "$SCRIPT"` +function print_help { + echo "Usage: $SCRIPTNAME [-b ] [-s ]}" + echo "Run UCB risc-v compliance test suite on backends" + echo "Optional cli arguments:" + echo " -b backend type, default all" + echo " -s simulator arguments" + echo " -h print help" + echo " -v increase verbosity" + echo " -t set build type" +} +SIM_ARGS="-v1" +BACKENDS=("interp" "tcc" "llvm" "asmjit") +DEBUG=0 +BUILD_TYPE=Debug +while getopts 'b:s:hvt:' c +do + case $c in + b) BACKENDS=($OPTARG);; + s) SIM_ARGS=$OPTARG ;; + h) print_help; exit 0 ;; + v) DEBUG=1 ;; + t) BUILD_TYPE = $OPTARG;; + ?) + print_help >&2 + exit 1 + ;; + esac +done + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +ROOT_DIR="$(dirname "$DIR")" + +RISCV_TEST=$ROOT_DIR/build/riscv-tests +# prepare riscv-test binaries +if [ ! -d $RISCV_TEST ]; then + mkdir -p $ROOT_DIR/build; cd $ROOT_DIR/build + git clone --recursive https://github.com/riscv/riscv-tests.git + cd $RISCV_TEST + autoconf + ./configure --with-xlen=32 + cd $ROOT_DIR + make -C $RISCV_TEST -j -k +fi +# check that we have an executable +RISCV_EXE=$ROOT_DIR/build/${BUILD_TYPE}/dbt-rise-tgc/tgc-sim +if [ ! -x $RISCV_EXE ]; then + mkdir -p build/${BUILD_TYPE} + echo "running cmake -B build/${BUILD_TYPE} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DWITH_TCC=ON -DWITH_LLVM=ON " + cmake -S . -B build/${BUILD_TYPE} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DWITH_TCC=ON -DWITH_LLVM=ON ../.. || exit 1 + cmake --build build/${BUILD_TYPE} -j 20 || exit 1 +fi + +test_ui_list=`find ${RISCV_TEST}/isa -type f -name rv32ui-p-\* -executable | grep -v fence | grep -v ma_data |sort` +test_uc_list=`find ${RISCV_TEST}/isa -type f -name rv32uc-p-\* -executable | grep -v fence | sort` +test_um_list=`find ${RISCV_TEST}/isa -type f -name rv32um-p-\* -executable | grep -v fence | sort` +test_list="$test_ui_list $test_uc_list $test_um_list $test_mmode_list" + +for backend in "${BACKENDS[@]}"; do + failed_list=() + for elf in $test_list; do + [ $DEBUG -eq 0 ] || echo Running "${RISCV_EXE} $SIM_ARGS -f $elf --backend $backend" + ${RISCV_EXE} $SIM_ARGS -f $elf --backend $backend + if [ $? != 0 ]; then + failed_list+="$backend:$elf " + fi + done + tcount=`echo $test_list | wc -w` + if [ ! -z "$failed_list" ]; then + fcount=`echo $failed_list | wc -w` + echo "($backend) $fcount of $tcount test(s) failed:" + echo $failed_list | tr ' ' '\n' + else + echo + echo "($backend) All $tcount tests passed." + if [ $DEBUG -eq 1 ];then + echo "List of executed tests:" + for t in $test_list; do + name=`basename $t` + echo " $name" + done + fi + fi +done