-
Notifications
You must be signed in to change notification settings - Fork 1k
CMake: Rebase From Main & Tests Working #5204
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: micko/cmake
Are you sure you want to change the base?
Changes from 3 commits
b6e5bf1
79f7cfa
615a646
ad800f7
8051724
030b054
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,7 @@ | ||
| cmake_minimum_required(VERSION 3.13) | ||
| project(yosys LANGUAGES CXX C) | ||
| set(YOSYS_VER "0.50+1") | ||
| set(CMAKE_POSITION_INDEPENDENT_CODE ON) | ||
|
|
||
| # features (the more the better) | ||
|
|
||
|
|
@@ -53,12 +54,12 @@ if (ENABLE_ABC) | |
| add_subdirectory(abc EXCLUDE_FROM_ALL) | ||
|
|
||
| add_custom_command( | ||
| OUTPUT ${CMAKE_BINARY_DIR}/yosys-abc | ||
| OUTPUT ${yosys_BINARY_DIR}/yosys-abc | ||
| DEPENDS abc # Depend on the target, not the generator expression | ||
| COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:abc> ${CMAKE_BINARY_DIR}/yosys-abc | ||
| COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:abc> ${yosys_BINARY_DIR}/yosys-abc | ||
| ) | ||
|
|
||
| add_custom_target(yosys-abc-copy ALL DEPENDS ${CMAKE_BINARY_DIR}/yosys-abc) | ||
| add_custom_target(yosys-abc-copy ALL DEPENDS ${yosys_BINARY_DIR}/yosys-abc) | ||
| endif() | ||
|
|
||
| set(CMAKE_CXX_STANDARD ${CXXSTD}) | ||
|
|
@@ -73,13 +74,15 @@ find_package(FLEX 2.6 REQUIRED) | |
| find_package(BISON 3.0 REQUIRED) | ||
| find_package(Python3 3.5 REQUIRED COMPONENTS Interpreter) | ||
|
|
||
| add_executable(yosys) | ||
| #target_include_directories(yosys PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) | ||
| #target_include_directories(yosys PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) | ||
| #target_compile_definitions(yosys PRIVATE _YOSYS_) | ||
| add_library(yosys OBJECT) | ||
|
||
| include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) | ||
| target_include_directories(yosys PUBLIC | ||
| ${CMAKE_CURRENT_BINARY_DIR} | ||
| ${CMAKE_CURRENT_SOURCE_DIR} | ||
| ) | ||
|
|
||
| add_compile_definitions(_YOSYS_) | ||
| target_compile_definitions(yosys PUBLIC _YOSYS_) | ||
|
|
||
| if (ENABLE_READLINE AND ENABLE_EDITLINE) | ||
| message(FATAL_ERROR "Not possible to enable both ENABLE_READLINE and ENABLE_EDITLINE") | ||
|
|
@@ -88,26 +91,26 @@ endif() | |
| if (ENABLE_READLINE) | ||
| find_package(Readline REQUIRED) | ||
| add_compile_definitions(YOSYS_ENABLE_READLINE) | ||
| target_link_libraries(yosys PRIVATE ${READLINE_LIBRARY}) | ||
| target_link_libraries(yosys PUBLIC ${READLINE_LIBRARY}) | ||
| endif() | ||
|
|
||
| if (ENABLE_EDITLINE) | ||
| find_package(Editline REQUIRED) | ||
| add_compile_definitions(YOSYS_ENABLE_EDITLINE) | ||
| target_link_libraries(yosys PRIVATE ${EDITLINE_LIBRARY}) | ||
| target_link_libraries(yosys PUBLIC ${EDITLINE_LIBRARY}) | ||
| endif() | ||
|
|
||
| if (ENABLE_TCL) | ||
| find_package(TCL 8.6 REQUIRED) | ||
| add_compile_definitions(YOSYS_ENABLE_TCL) | ||
| target_include_directories(yosys PRIVATE ${TCL_INCLUDE_PATH}) | ||
| target_link_libraries(yosys PRIVATE ${TCL_LIBRARY}) | ||
| target_include_directories(yosys PUBLIC ${TCL_INCLUDE_PATH}) | ||
| target_link_libraries(yosys PUBLIC ${TCL_LIBRARY}) | ||
| endif() | ||
|
|
||
| if (ENABLE_ZLIB) | ||
| find_package(ZLIB REQUIRED) | ||
| add_compile_definitions(YOSYS_ENABLE_ZLIB) | ||
| target_link_libraries(yosys PRIVATE ZLIB::ZLIB) | ||
| target_link_libraries(yosys PUBLIC ZLIB::ZLIB) | ||
| endif() | ||
|
|
||
| if (ENABLE_COVER) | ||
|
|
@@ -140,7 +143,7 @@ if (ENABLE_ABC) | |
| add_compile_definitions(YOSYS_ENABLE_ABC) | ||
| if (LINK_ABC) | ||
| add_compile_definitions(YOSYS_LINK_ABC) | ||
| target_link_libraries(yosys PRIVATE $<TARGET_FILE:libabc>) | ||
| target_link_libraries(yosys PUBLIC $<TARGET_FILE:libabc>) | ||
| add_dependencies(yosys libabc) | ||
| endif() | ||
| endif() | ||
|
|
@@ -149,7 +152,7 @@ if (ENABLE_PLUGINS) | |
| find_package(LibFFI REQUIRED) | ||
| add_compile_definitions(YOSYS_ENABLE_PLUGINS) | ||
| include_directories(${LIBFFI_INCLUDE_DIR}) | ||
| target_link_libraries(yosys PRIVATE ${LIBFFI_LIBRARY}) | ||
| target_link_libraries(yosys PUBLIC ${LIBFFI_LIBRARY}) | ||
| endif() | ||
|
|
||
| if (DISABLE_SPAWN) | ||
|
|
@@ -283,3 +286,177 @@ if (ENABLE_ZLIB) | |
| endif() | ||
|
|
||
| set_property(SOURCE kernel/log.cc APPEND PROPERTY COMPILE_DEFINITIONS YOSYS_SRC="${PROJECT_SOURCE_DIR}") | ||
|
|
||
| if (ENABLE_LIBYOSYS) | ||
| add_library(yosys_shared SHARED | ||
| $<TARGET_OBJECTS:yosys> | ||
| ) | ||
| target_link_libraries(yosys_shared PUBLIC yosys) | ||
| set_target_properties(yosys_shared PROPERTIES OUTPUT_NAME yosys) | ||
| install(TARGETS yosys_shared | ||
| LIBRARY DESTINATION .) | ||
| endif() | ||
|
|
||
| add_executable(yosys_exe | ||
| kernel/driver.cc | ||
| $<TARGET_OBJECTS:yosys> | ||
| ) | ||
| target_link_libraries(yosys_exe PUBLIC yosys) | ||
| set_target_properties(yosys_exe PROPERTIES OUTPUT_NAME yosys) | ||
| install(TARGETS yosys_exe | ||
| RUNTIME DESTINATION .) | ||
|
||
|
|
||
| #### yosys-config setup #### | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would prefer this section to be split off into a separate file
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also Done: ad800f7 |
||
| # compiler | ||
| get_filename_component(_CXX_BASENAME "${CMAKE_CXX_COMPILER}" NAME) | ||
| set(YOSYS_CFG_CXX "${_CXX_BASENAME}" | ||
| CACHE STRING "C++ compiler that appears in yosys-config") | ||
|
|
||
| # compile flags | ||
| set(_CFG_CXXFLAGS | ||
| -Wall -Wextra -ggdb | ||
| "-I\"${CMAKE_INSTALL_PREFIX}/share/yosys/include\"" | ||
| -MD -MP -D_YOSYS_ -fPIC | ||
| -DYOSYS_VERSION="${YOSYS_VER}" | ||
| -std=c++${CXXSTD} -O3) | ||
|
|
||
| if (ENABLE_READLINE) | ||
| list(APPEND _CFG_CXXFLAGS -DYOSYS_ENABLE_READLINE) | ||
| endif() | ||
| if (ENABLE_PLUGINS) | ||
| list(APPEND _CFG_CXXFLAGS -DYOSYS_ENABLE_PLUGINS) | ||
| endif() | ||
| if (ENABLE_GLOB) | ||
| list(APPEND _CFG_CXXFLAGS -DYOSYS_ENABLE_GLOB) | ||
| endif() | ||
| if (ENABLE_ZLIB) | ||
| list(APPEND _CFG_CXXFLAGS -DYOSYS_ENABLE_ZLIB) | ||
| endif() | ||
| if (ENABLE_TCL) | ||
| list(APPEND _CFG_CXXFLAGS -I${TCL_INCLUDE_PATH} -DYOSYS_ENABLE_TCL) | ||
| endif() | ||
| if (ENABLE_ABC) | ||
| list(APPEND _CFG_CXXFLAGS -DYOSYS_ENABLE_ABC) | ||
| endif() | ||
| if (ENABLE_COVER) | ||
| list(APPEND _CFG_CXXFLAGS -DYOSYS_ENABLE_COVER) | ||
| endif() | ||
|
|
||
| string (REPLACE ";" " " YOSYS_CFG_CXXFLAGS "${_CFG_CXXFLAGS}") | ||
|
|
||
| # link flags | ||
| set(YOSYS_CFG_LINKFLAGS "-rdynamic" CACHE STRING "link flags for yosys-config") | ||
|
|
||
| # libraries | ||
| set(_CFG_LIBS -lstdc++ -lm) | ||
| if (NOT (${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")) | ||
| list(APPEND _CFG_LIBS -lrt) | ||
| endif() | ||
| if (ENABLE_READLINE) | ||
| list(APPEND _CFG_LIBS -lreadline) | ||
| endif() | ||
| if (ENABLE_PLUGINS) | ||
| list(APPEND _CFG_LIBS -lffi) | ||
| if (NOT APPLE) | ||
| list(APPEND _CFG_LIBS -ldl) | ||
| endif() | ||
| endif() | ||
| if (ENABLE_ZLIB) | ||
| list(APPEND _CFG_LIBS -lz) | ||
| endif() | ||
| if (ENABLE_TCL) | ||
| get_filename_component(_TCL "${TCL_LIBRARY}" NAME_WE) | ||
| string(REGEX REPLACE "^lib" "" _TCL "${_TCL}") | ||
| list(APPEND _CFG_LIBS "-l${_TCL}") | ||
| endif() | ||
| string (REPLACE ";" " " YOSYS_CFG_LIBS "${_CFG_LIBS}") | ||
|
|
||
| # bindir / datadir (installation paths) | ||
| set(YOSYS_CFG_PREFIX "/usr/local" | ||
| CACHE STRING "prefix that yosys-config reports") | ||
|
|
||
| set(YOSYS_CFG_BINDIR "${YOSYS_CFG_PREFIX}/bin") | ||
| set(YOSYS_CFG_DATDIR "${YOSYS_CFG_PREFIX}/share/yosys") | ||
|
|
||
| # abort if something is missing | ||
| foreach(var YOSYS_CFG_CXX YOSYS_CFG_CXXFLAGS YOSYS_CFG_LINKFLAGS | ||
| YOSYS_CFG_LIBS YOSYS_CFG_BINDIR YOSYS_CFG_DATDIR) | ||
| if("${${var}}" STREQUAL "") | ||
| message(FATAL_ERROR "${var} is empty – cannot create yosys-config") | ||
| endif() | ||
| endforeach() | ||
|
|
||
| set(CXX "${YOSYS_CFG_CXX}") | ||
| set(CXXFLAGS "${YOSYS_CFG_CXXFLAGS}") | ||
| set(LINKFLAGS "${YOSYS_CFG_LINKFLAGS}") | ||
| set(LIBS "${YOSYS_CFG_LIBS}") | ||
| set(BINDIR "${YOSYS_CFG_BINDIR}") | ||
| set(DATDIR "${YOSYS_CFG_DATDIR}") | ||
|
|
||
| configure_file(misc/yosys-config.in ${yosys_BINARY_DIR}/yosys-config @ONLY) | ||
| file(CHMOD ${yosys_BINARY_DIR}/yosys-config | ||
| PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE | ||
| GROUP_READ GROUP_EXECUTE | ||
| WORLD_READ WORLD_EXECUTE) | ||
|
|
||
| add_custom_target(yosys-config-copy ALL | ||
| DEPENDS ${yosys_BINARY_DIR}/yosys-config) | ||
|
|
||
| #### INSTALL #### | ||
| install(TARGETS yosys | ||
| RUNTIME DESTINATION .) | ||
|
|
||
| if (ENABLE_ABC) | ||
| install(PROGRAMS $<TARGET_FILE:abc> | ||
| DESTINATION . | ||
| RENAME yosys-abc) | ||
| endif() | ||
|
|
||
| install(PROGRAMS ${yosys_BINARY_DIR}/yosys-config DESTINATION .) | ||
|
|
||
| #### TESTING #### | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Somehow, the tests run 2.6x longer on my 24 threads than with make, and I saw a test fail indeterministically. I'll see what I can find out on my end
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Previously, there was a top level GNU Make running the tests so these make invocations connected to its job server and shared a pool of job threads. Now each make gets only one thread, maybe we could work around that for make, but Ninja doesn't provide a job server (ninja-build/ninja#1139). I think we should rewrite
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Note that the issue you linked indicates that the next Ninja release should include a jobserver client, and I believe there's a jobserver server being discussed. So perhaps continuing to use Ninja will work? |
||
| include(cmake/TestFiles.cmake) | ||
| enable_testing() | ||
|
|
||
| set(_YOSYS_TEST_ENV | ||
| "PATH=${PROJECT_SOURCE_DIR}:$ENV{PATH};") | ||
|
|
||
| foreach(dir IN LISTS SH_TEST_DIRS) | ||
| string(REPLACE "/" "_" name "${dir}") | ||
| add_test( | ||
| NAME seed-tests.${name} | ||
| COMMAND bash -c | ||
| "cd \"${PROJECT_SOURCE_DIR}/${dir}\" && bash run-test.sh ${SEEDOPT}" | ||
| ) | ||
| set_tests_properties(seed-tests.${name} PROPERTIES | ||
| ENVIRONMENT "${_YOSYS_TEST_ENV}" | ||
| DEPENDS yosys) | ||
| endforeach() | ||
|
|
||
| foreach(dir IN LISTS SH_ABC_TEST_DIRS) | ||
| string(REPLACE "/" "_" name "${dir}") | ||
| add_test( | ||
| NAME abcopt-tests.${name} | ||
| COMMAND bash -c | ||
| "cd \"${PROJECT_SOURCE_DIR}/${dir}\" && bash run-test.sh ${ABCOPT} ${SEEDOPT}" | ||
| ) | ||
| set_tests_properties(abcopt-tests.${name} PROPERTIES | ||
| ENVIRONMENT "${_YOSYS_TEST_ENV}" | ||
| DEPENDS yosys) | ||
| endforeach() | ||
|
|
||
| foreach(dir IN LISTS MK_TEST_DIRS) | ||
| string(REPLACE "/" "_" name "${dir}") | ||
| add_test( | ||
| NAME makefile-tests.${name} | ||
| COMMAND bash -c | ||
| " | ||
| cd \"${PROJECT_SOURCE_DIR}/${dir}\" && | ||
| bash run-test.sh && | ||
| ${CMAKE_MAKE_PROGRAM} -f run-test.mk | ||
| " | ||
| ) | ||
| set_tests_properties(makefile-tests.${name} PROPERTIES | ||
| ENVIRONMENT "${_YOSYS_TEST_ENV}" | ||
| DEPENDS yosys) | ||
| endforeach() | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,8 +1,9 @@ | ||
| add_library(yosys_backends_aiger INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_aiger INTERFACE | ||
|
|
||
| add_library(yosys_backends_aiger OBJECT | ||
| aiger.cc | ||
| xaiger.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_aiger) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_aiger) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_aiger>) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,8 @@ | ||
| add_library(yosys_backends_aiger2 INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_aiger2 INTERFACE | ||
|
|
||
| add_library(yosys_backends_aiger2 OBJECT | ||
| aiger.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_aiger2) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_aiger2) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_aiger2>) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,8 @@ | ||
| add_library(yosys_backends_blif INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_blif INTERFACE | ||
|
|
||
| add_library(yosys_backends_blif OBJECT | ||
| blif.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_blif) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_blif) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_blif>) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,8 @@ | ||
| add_library(yosys_backends_btor INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_btor INTERFACE | ||
|
|
||
| add_library(yosys_backends_btor OBJECT | ||
| btor.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_btor) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_btor) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_btor>) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,8 @@ | ||
| add_library(yosys_backends_edif INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_edif INTERFACE | ||
|
|
||
| add_library(yosys_backends_edif OBJECT | ||
| edif.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_edif) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_edif) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_edif>) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,8 @@ | ||
| add_library(yosys_backends_firrtl INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_firrtl INTERFACE | ||
|
|
||
| add_library(yosys_backends_firrtl OBJECT | ||
| firrtl.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_firrtl) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_firrtl) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_firrtl>) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,10 +1,11 @@ | ||
| add_library(yosys_backends_functional INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_functional INTERFACE | ||
|
|
||
| add_library(yosys_backends_functional OBJECT | ||
| cxx.cc | ||
| smtlib.cc | ||
| smtlib_rosette.cc | ||
| test_generic.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_functional) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_functional) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_functional>) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,8 @@ | ||
| add_library(yosys_backends_intersynth INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_intersynth INTERFACE | ||
|
|
||
| add_library(yosys_backends_intersynth OBJECT | ||
| intersynth.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_intersynth) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_intersynth) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_intersynth>) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,8 @@ | ||
| add_library(yosys_backends_jny INTERFACE) | ||
|
|
||
| target_sources(yosys_backends_jny INTERFACE | ||
|
|
||
| add_library(yosys_backends_jny OBJECT | ||
| jny.cc | ||
| ) | ||
|
|
||
| target_link_libraries(yosys PRIVATE yosys_backends_jny) | ||
| target_link_libraries(yosys PUBLIC yosys_backends_jny) | ||
| target_sources(yosys PUBLIC $<TARGET_OBJECTS:yosys_backends_jny>) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This rewrite is a great chance to make the C++ standard match what we want:
With CMake we can get this done with
CMAKE_CXX_KNOWN_FEATURES and avoiding overriding command-line set values for
CMAKE_CXX_STANDARDandCMAKE_CXX_STANDARD_REQUIREDIf you would prefer this out of scope for this work due to time constraints feel free to turn this into a followup issue though
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just finished and commited it: ad800f7
Now what's used to set the CXX standard as well as an override option:
Presently it only controls the CXX standard but if there were other features that were to be included, those should hopefully be a simple addition
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, I think an alternate solution is that if it's unset, set
CMAKE_CXX_STANDARDto 23, and if it's already set, setCMAKE_CXX_STANDARD_REQUIREDon. Then also error out if the C++17 feature is off. This provides easy overriding, ensures C++17 is supported (I believe the build will fail if not), but still lets.Why 23? Beacuse we want to support building on "systems kinda like the oldest ubuntu LTS with standard support". That means ubuntu 22.04, which has CMake 3.22. That version of CMake only knows about C++23 and not about C++26. And it can't figure out that 26>23 and do a reasonable soft fallback. We should correspondingly set the required CMake version to 3.22 (it's from 2021, shouldn't annoy too many people).
Alternatively I guess you can just add std_23 and std_26 to your snippet as well and it should work even on older versions. I dislike both methods about the same. I'm a bit disappointed in CMake, not being able to work at all with not-yet-known year-named standards sucks, and the 98<17<98 problem wouldn't manifest until 2098 (or 2090 for C). We'll probably be back to stone tools by then at this rate anyway
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I understood what you were asking for, this should be the changes to use your above suggestion: 030b054