From e633cc6134f79e231e23e13a3ade427719d6358e Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 1 Jan 2019 12:19:44 +0100 Subject: [PATCH] Added SCC and refactored CMake files --- .gitmodules | 3 + CMakeLists.txt | 83 +++++++++++---- cmake/Common.cmake | 20 ++++ cmake/GetGitRevisionDescription.cmake | 130 +++++++++++++++++++++++ cmake/GetGitRevisionDescription.cmake.in | 41 +++++++ cmake/GitFunctions.cmake | 22 ++++ cmake/Submodules.cmake | 57 ++++++++++ components/CMakeLists.txt | 15 +++ components/components.h | 3 +- components/initiator.cpp | 11 +- components/logging.cpp | 2 +- components/{logging.h => logging_.h} | 0 conanfile.txt | 6 +- router_example.py | 7 +- sc-components | 1 + 15 files changed, 371 insertions(+), 30 deletions(-) create mode 100644 cmake/Common.cmake create mode 100644 cmake/GetGitRevisionDescription.cmake create mode 100644 cmake/GetGitRevisionDescription.cmake.in create mode 100644 cmake/GitFunctions.cmake create mode 100644 cmake/Submodules.cmake create mode 100644 components/CMakeLists.txt rename components/{logging.h => logging_.h} (100%) create mode 160000 sc-components diff --git a/.gitmodules b/.gitmodules index e69de29..73349ab 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "sc-components"] + path = sc-components + url = https://git.minres.com/SystemC/SystemC-Components.git diff --git a/CMakeLists.txt b/CMakeLists.txt index e7a5be4..07d171f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,32 +1,77 @@ -project(TransactionExample CXX) -cmake_minimum_required(VERSION 3.9) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) +cmake_minimum_required(VERSION 3.3) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/sc-components/cmake) +set(ENABLE_SCV TRUE CACHE BOOL "Enable use of SCV") +set(ENABLE_SHARED TRUE CACHE BOOL "Build shared libraries") + +include(GitFunctions) +get_branch_from_git() + +### set the directory names of the submodules +set(GIT_SUBMODULES sc-components) +set(GIT_SUBMODULE_DIR_sc-components .) +### set each submodules's commit or tag that is to be checked out +### (leave empty if you want master) +#set(GIT_SUBMODULE_VERSION_sc-components 3af6b9836589b082c19d9131c5d0b7afa8ddd7cd) +set(GIT_SUBMODULE_BRANCH_sc-components ${GIT_BRANCH}) + +include(GNUInstallDirs) +include(Submodules) include(Conan) -setup_conan() +include(BuildType) -conan_basic_setup(TARGETS) +#enable_testing() set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) -add_library(components SHARED - components/tx_example_mods.cpp - components/initiator.cpp - components/target.cpp - components/logging.cpp) -target_link_libraries(components PUBLIC CONAN_PKG::SystemC) -target_link_libraries(components PUBLIC CONAN_PKG::SystemCVerification) +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() -add_executable(TransactionExample - components/tx_example.cpp - components/txtop.cpp) -target_link_libraries(TransactionExample components) +if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(warnings "-Wall -Wextra -Werror") + set(CMAKE_CXX_FLAG_RELEASE "-O3 -DNDEBUG") + set(CMAKE_C_FLAG_RELEASE "-O3 -DNDEBUG") +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(warnings "/W4 /WX /EHsc") +endif() -add_executable(router_example - components/router_example.cpp) -target_link_libraries(router_example components) +setup_conan() + +# This line finds the boost lib and headers. +set(Boost_NO_BOOST_CMAKE ON) # Don't do a find_package in config mode before searching for a regular boost install. +find_package(Boost COMPONENTS program_options filesystem system thread REQUIRED) + +# set-up SystemC and SCV +find_package(SystemC) +if(SystemC_FOUND) + add_definitions(-DWITH_SYSTEMC) + include_directories(${SystemC_INCLUDE_DIRS}) + link_directories(${SystemC_LIBRARY_DIRS}) +else() + message( FATAL_ERROR "SystemC library not found." ) +endif() + +if(CCI_FOUND) + include_directories(${CCI_INCLUDE_DIRS}) + link_directories(${CCI_LIBRARY_DIRS}) +else() + message( FATAL_ERROR "SystemC CCI library not found." ) +endif() + +include(sc-components/cmake/clang-format.cmake) + +add_subdirectory(sc-components) +add_subdirectory(components) # CTest is a testing tool that can be used to test your project. # enable_testing() diff --git a/cmake/Common.cmake b/cmake/Common.cmake new file mode 100644 index 0000000..673ec59 --- /dev/null +++ b/cmake/Common.cmake @@ -0,0 +1,20 @@ +# Function to link between sub-projects +function(add_dependent_subproject subproject_name) + #if (NOT TARGET ${subproject_name}) # target unknown + if(NOT PROJECT_${subproject_name}) # var unknown because we build only this subproject + find_package(${subproject_name} CONFIG REQUIRED) + else () # we know the target thus we are doing a build from the top directory + include_directories(../${subproject_name}/incl) + endif () +endfunction(add_dependent_subproject) + +# Make sure we tell the topdir CMakeLists that we exist (if build from topdir) +get_directory_property(hasParent PARENT_DIRECTORY) +if(hasParent) + set(PROJECT_${PROJECT_NAME} true PARENT_SCOPE) +endif() + +# Function to link between sub-projects +function(add_dependent_header subproject_name) + include_directories(../${subproject_name}/incl) +endfunction(add_dependent_header) diff --git a/cmake/GetGitRevisionDescription.cmake b/cmake/GetGitRevisionDescription.cmake new file mode 100644 index 0000000..bcd1d72 --- /dev/null +++ b/cmake/GetGitRevisionDescription.cmake @@ -0,0 +1,130 @@ +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ ...]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) + set(GIT_PARENT_DIR "${CMAKE_CURRENT_LIST_DIR}") + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories + set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") + get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) + if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) + # We have reached the root directory, we are not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + endwhile() + # check if this is a submodule + if(NOT IS_DIRECTORY ${GIT_DIR}) + file(READ ${GIT_DIR} submodule) + string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) + get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + + if(NOT EXISTS "${GIT_DIR}/HEAD") + return() + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" + "${GIT_DATA}/grabRef.cmake" + @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + ${hash} + ${ARGN} + WORKING_DIRECTORY + "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} "${out}" PARENT_SCOPE) +endfunction() diff --git a/cmake/GetGitRevisionDescription.cmake.in b/cmake/GetGitRevisionDescription.cmake.in new file mode 100644 index 0000000..6d8b708 --- /dev/null +++ b/cmake/GetGitRevisionDescription.cmake.in @@ -0,0 +1,41 @@ +# +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +set(HEAD_HASH) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + if(EXISTS "@GIT_DIR@/${HEAD_REF}") + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + else() + configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) + file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") + set(HEAD_HASH "${CMAKE_MATCH_1}") + endif() + endif() +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +if(NOT HEAD_HASH) + file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) + string(STRIP "${HEAD_HASH}" HEAD_HASH) +endif() diff --git a/cmake/GitFunctions.cmake b/cmake/GitFunctions.cmake new file mode 100644 index 0000000..bbb4903 --- /dev/null +++ b/cmake/GitFunctions.cmake @@ -0,0 +1,22 @@ +if(__git_functions) + return() +endif() +set(__git_functions YES) + +function( get_branch_from_git ) + execute_process( + COMMAND git rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_branch + ERROR_VARIABLE git_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + if( NOT git_result EQUAL 0 ) + message( FATAL_ERROR "Failed to execute Git: ${git_error}" ) + endif() + + set( GIT_BRANCH ${git_branch} PARENT_SCOPE ) +endfunction( get_branch_from_git ) + diff --git a/cmake/Submodules.cmake b/cmake/Submodules.cmake new file mode 100644 index 0000000..0d1b89d --- /dev/null +++ b/cmake/Submodules.cmake @@ -0,0 +1,57 @@ +if(EXISTS "${PROJECT_SOURCE_DIR}/.gitmodules") +message(STATUS "Updating submodules to their latest/fixed versions") +message(STATUS "(this can take a while, please be patient)") + +### First, get all submodules in +if(${GIT_SUBMODULES_CHECKOUT_QUIET}) + execute_process( + COMMAND git submodule update --init --recursive + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_QUIET + ERROR_QUIET + ) +else() + execute_process( + COMMAND git submodule update --init --recursive + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + ) +endif() + +### Then, checkout each submodule to the specified commit +# Note: Execute separate processes here, to make sure each one is run, +# should one crash (because of branch not existing, this, that ... whatever) +foreach(GIT_SUBMODULE ${GIT_SUBMODULES}) + + if( "${GIT_SUBMODULE_VERSION_${GIT_SUBMODULE}}" STREQUAL "" ) + message(STATUS "no specific version given for submodule ${GIT_SUBMODULE}, checking out master") + if( "${GIT_SUBMODULE_BRANCH_${GIT_SUBMODULE}}" STREQUAL "" ) + set(GIT_SUBMODULE_VERSION_${GIT_SUBMODULE} "master") + else() + set(GIT_SUBMODULE_VERSION_${GIT_SUBMODULE} ${GIT_SUBMODULE_BRANCH_${GIT_SUBMODULE}}) + endif() + endif() + + if( "${GIT_SUBMODULE_DIR_${GIT_SUBMODULE}}" STREQUAL "" ) + set(GIT_SUBMODULES_DIRECTORY external) + else() + set(GIT_SUBMODULES_DIRECTORY ${GIT_SUBMODULE_DIR_${GIT_SUBMODULE}}) + endif() + + if(${GIT_SUBMODULES_CHECKOUT_QUIET}) + execute_process( + COMMAND git checkout ${GIT_SUBMODULE_VERSION_${GIT_SUBMODULE}} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${GIT_SUBMODULES_DIRECTORY}/${GIT_SUBMODULE} + OUTPUT_QUIET + ERROR_QUIET + ) + else() + message(STATUS "checking out ${GIT_SUBMODULE}'s commit/tag ${GIT_SUBMODULE_VERSION_${GIT_SUBMODULE}}") + execute_process( + COMMAND git checkout ${GIT_SUBMODULE_VERSION_${GIT_SUBMODULE}} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${GIT_SUBMODULES_DIRECTORY}/${GIT_SUBMODULE} + ) + endif() + +endforeach(${GIT_SUBMODULE}) + +endif() diff --git a/components/CMakeLists.txt b/components/CMakeLists.txt new file mode 100644 index 0000000..1b05f9d --- /dev/null +++ b/components/CMakeLists.txt @@ -0,0 +1,15 @@ +FILE(GLOB LibHeaders *.h) +set(LIB_HEADERS ${LibHeaders} ) +set(LIB_SOURCES + initiator.cpp + logging.cpp + target.cpp +) + + +# Define two variables in order not to repeat ourselves. +set(LIBRARY_NAME components) + +# Define the library +add_library(${LIBRARY_NAME} SHARED ${LIB_SOURCES}) +target_link_libraries (${LIBRARY_NAME} LINK_PUBLIC sc-components) diff --git a/components/components.h b/components/components.h index 88f8131..9ce61eb 100644 --- a/components/components.h +++ b/components/components.h @@ -9,8 +9,7 @@ #define COMPONENTS_H_ //#include "tx_example_mods.h" -#include -#include "logging.h" +//#include "logging.h" #include "initiator.h" #include "router.h" #include "target.h" diff --git a/components/initiator.cpp b/components/initiator.cpp index 01019d5..f47a4a7 100644 --- a/components/initiator.cpp +++ b/components/initiator.cpp @@ -6,7 +6,8 @@ */ #include "initiator.h" -#include "logging.h" + +#include Initiator::Initiator(::sc_core::sc_module_name nm) @@ -51,7 +52,7 @@ void Initiator::thread_process() { wait( dmi_data.get_write_latency() ); } - LOG_INFO << "DMI = { " << (cmd ? 'W' : 'R') << ", " << hex << i + SCINFO() << "DMI = { " << (cmd ? 'W' : 'R') << ", " << hex << i << " } , data = " << hex << data << " at time " << sc_time_stamp(); } else @@ -97,7 +98,7 @@ void Initiator::thread_process() { dmi_ptr_valid = socket->get_direct_mem_ptr( *trans, dmi_data ); } - LOG_INFO << "trans = { " << (cmd ? 'W' : 'R') << ", " << hex << i + SCINFO() << "trans = { " << (cmd ? 'W' : 'R') << ", " << hex << i << " } , data = " << hex << data << " at time " << sc_time_stamp(); } } @@ -115,7 +116,7 @@ void Initiator::thread_process() { for (unsigned int i = 0; i < n_bytes; i += 4) { - LOG_INFO << "mem[" << (A + i) << "] = " + SCINFO() << "mem[" << (A + i) << "] = " << *(reinterpret_cast( &data[i] )); } @@ -127,7 +128,7 @@ void Initiator::thread_process() { for (unsigned int i = 0; i < n_bytes; i += 4) { - LOG_INFO << "mem[" << (A + i) << "] = " + SCINFO() << "mem[" << (A + i) << "] = " << *(reinterpret_cast( &data[i] )); } } diff --git a/components/logging.cpp b/components/logging.cpp index dc5fcdc..76ca550 100644 --- a/components/logging.cpp +++ b/components/logging.cpp @@ -6,12 +6,12 @@ */ -#include "logging.h" #include #include #include #include #include +#include "logging_.h" using namespace sc_core; diff --git a/components/logging.h b/components/logging_.h similarity index 100% rename from components/logging.h rename to components/logging_.h diff --git a/conanfile.txt b/conanfile.txt index d9c11e0..941d2c2 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -1,11 +1,13 @@ [requires] +fmt/5.2.1@bincrafters/stable SystemC/2.3.2@minres/stable -SystemCVerification/2.0.1@minres/stable +SystemC-CCI/1.0.0@minres/stable [generators] cmake [options] +fmt:header_only=True SystemC:stdcxx=11 SystemC:shared=True -SystemCVerification:stdcxx=11 +SystemC-CCI:stdcxx=11 \ No newline at end of file diff --git a/router_example.py b/router_example.py index 1755406..19486c5 100644 --- a/router_example.py +++ b/router_example.py @@ -8,12 +8,17 @@ import pysysc as scpy myDir = os.path.dirname( os.path.realpath(__file__)) conan_err = scpy.read_config_from_conan(os.path.join(myDir, 'conanfile.txt')) scpy.load_systemc() +print("Loading SC-Components lib") +scpy.add_include_path(os.path.join(myDir, 'sc-components/incl')) +scpy.add_library('scc.h', os.path.join(myDir, 'build/Debug/lib/libsc-components.so')) +print("Loading Components lib") scpy.add_include_path(os.path.join(myDir, 'components')) scpy.add_library('components.h', os.path.join(myDir, 'build/Debug/lib/libcomponents.so')) ############################################################################### # configure ############################################################################### -cpp.init_logging(5) +#cpp.IoRedirector.get().start() +cpp.scc.init_logging(cpp.logging.INFO, False); cpp.sc_core.sc_report_handler.set_actions(cpp.sc_core.SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_, cpp.sc_core.SC_DO_NOTHING); ############################################################################### # instantiate diff --git a/sc-components b/sc-components new file mode 160000 index 0000000..a066d50 --- /dev/null +++ b/sc-components @@ -0,0 +1 @@ +Subproject commit a066d508a097fdd7134aeecbe72fdbabaae0aff3