Repository: riscv-software-src/riscv-perf-model (language: cpp)

Issue:
Boost 1.81 not working (on macOS) - non-default boost location not supported by CMakeLists
Hi,

I've had some issues for Olympia to build on macOs (M1, running Ventura 13.1), not sure if the issue is present in other systems: default boost installed with ```brew install boost``` gives v1.81, which has issues in Phoenix which cause it to fail with duplicate symbols when linking (https://github.com/boostorg/phoenix/issues/111). (also Sparta build fails on this)

Just for other people running into this, here's my journey on this issue:

First of all: not to worry, I've also got boost v1.76 via homebrew, but it's not in a default location. So I had to build Sparta, Olympia and so also sta_lib with a non default boost location.

Then it got a bit complicated:
- Sparta build needs ```-DBoost_DIR=/opt/homebrew/Cellar/boost@1.76/1.76.0_3/lib/cmake/Boost-1.76.0``` to point it to the cake folder for the right boost version. (it does not, for some reason, use the cmake default included files to find boost)
- Olympia includes ```sparta-config.cmake``` so needs the same command line option for make to find Boost.
- But Olympia includes sty_lib in the build tree as a submodule, which does use the cmake default scripts, and they need another define on the command line: ```-DBOOST_ROOT=/opt/homebrew/Cellar/boost@1.76/1.76.0_3```

Which makes for a cmake command that gets a bit verbose:
```
cmake -S . -B Release -DCMAKE_BUILD_TYPE=Release -DSPARTA_BASE=$HOME/src/map/sparta \
   -DBOOST_ROOT=/opt/homebrew/Cellar/boost@1.76/1.76.0_3 \
   -DBoost_DIR=/opt/homebrew/Cellar/boost@1.76/1.76.0_3/lib/cmake/Boost-1.76.0
```

Which then passes cmake but fails at build, because boost is not added as an include for ```core``` and ```mss```.

Which I've fixed in the respective CMakeLists.txt, PR incoming soon.

But more generally: it would be nice to harmonise the boost config across Sparta, Olympia and stf_lib, so only 1 command line arg is needed to use it if it's in a non-default place. This avoids the double command line args needed in cmake.

I am willing to file a PR against Sparta as well to harmonise it to the standard cmake way of finding boost, but the comments in the CMakeLists.txt there seem to hint the custom way is there for (historic) reasons.


Discussion / hints:

Fix patch:
diff --git a/.github/actions/build/entrypoint.sh b/.github/actions/build/entrypoint.sh
index 650970da..17f53b20 100755
--- a/.github/actions/build/entrypoint.sh
+++ b/.github/actions/build/entrypoint.sh
@@ -9,6 +9,7 @@ echo "Starting Build Entry"
 echo "HOME:" $HOME
 echo "GITHUB_WORKSPACE:" $GITHUB_WORKSPACE
 echo "GITHUB_EVENT_PATH:" $GITHUB_EVENT_PATH
+echo "CONDA_PREFIX:" $CONDA_PREFIX
 echo "PWD:" `pwd`
 
 #
@@ -17,16 +18,14 @@ echo "PWD:" `pwd`
 #
 echo "Building Sparta Infra"
 cd ${GITHUB_WORKSPACE}/map/sparta
-mkdir -p release  # Link step expects "release" as dir name
-ln -s release fastdebug
-ln -s release debug
+mkdir -p release
 cd release
-cmake .. -DCMAKE_BUILD_TYPE=$OLYMPIA_BUILD_TYPE -DGEN_DEBUG_INFO=OFF
+cmake .. -DCMAKE_BUILD_TYPE=$OLYMPIA_BUILD_TYPE -DGEN_DEBUG_INFO=OFF -DCMAKE_INSTALL_PREFIX=${CONDA_PREFIX}
 if [ $? -ne 0 ]; then
     echo "ERROR: Cmake for Sparta framework failed"
     exit 1
 fi
-make -j$(nproc --all)
+make -j$(nproc --all) install
 BUILD_SPARTA=$?
 if [ ${BUILD_SPARTA} -ne 0 ]; then
     echo "ERROR: build sparta FAILED!!!"
@@ -36,7 +35,7 @@ fi
 cd ${GITHUB_WORKSPACE}
 mkdir $OLYMPIA_BUILD_TYPE
 cd $OLYMPIA_BUILD_TYPE
-cmake .. -DCMAKE_BUILD_TYPE=$OLYMPIA_BUILD_TYPE -DGEN_DEBUG_INFO=OFF -DSPARTA_BASE=${GITHUB_WORKSPACE}/map/sparta
+cmake .. -DCMAKE_BUILD_TYPE=$OLYMPIA_BUILD_TYPE -DGEN_DEBUG_INFO=OFF
 if [ $? -ne 0 ]; then
     echo "ERROR: Cmake for olympia failed"
     exit 1
diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml
index 59b0ddcd..1da07d1b 100644
--- a/.github/workflows/ubuntu-build.yml
+++ b/.github/workflows/ubuntu-build.yml
@@ -36,7 +36,7 @@ jobs:
         with:
           repository: sparcians/map
           path: map
-          ref: map_v1.1.1
+          ref: map_v2
 
       # Setup Conda and build environment
       - name: Grab Python v3.8
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d733a73b..dde60b66 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.19)
 set (CMAKE_CXX_STANDARD 17)
 set (CMAKE_CXX_STANDARD_REQUIRED ON)
 
@@ -11,16 +11,38 @@ add_compile_options ( -Werror
 
 ################################################################################
 # Set up Sparta
-if (NOT SPARTA_BASE)
-  message (FATAL_ERROR "Need to define the location of the Sparta: cmake <args> -DSPARTA_BASE=\"/path/to/sparta\"")
-endif ()
-include (${SPARTA_BASE}/cmake/sparta-config.cmake)
+if(IS_DIRECTORY ${SPARTA_SEARCH_DIR})
+  message (STATUS "Using '${SPARTA_SEARCH_DIR}' for sparta install")
+elseif(DEFINED ENV{CONDA_PREFIX})
+  message (STATUS "Looking for SPARTA in the conda environment: '$ENV{CONDA_PREFIX}'")
+  set(SPARTA_SEARCH_DIR $ENV{CONDA_PREFIX})
+else()
+  message (STATUS "If needed, please provide the location where sparta is installed: -DSPARTA_SEARCH_DIR=<directory>")
+endif()
+set(CMAKE_MODULE_PATH "${SPARTA_SEARCH_DIR}/lib/cmake/sparta" ${CMAKE_MODULE_PATH})
+
+find_package(Sparta REQUIRED)
+
+if (NOT SPARTA_FOUND)
+  message (FATAL_ERROR "Sparta was not found in ${SPARTA_SEARCH_DIR}")
+else()
+  message (STATUS "Sparta was found in ${SPARTA_SEARCH_DIR}")
+endif()
+
+include_directories(${SPARTA_INCLUDE_DIRS})
 
 ################################################################################
 # Set up STF library
 set (STF_LIB_BASE ${PROJECT_SOURCE_DIR}/stf_lib)
 set (DISABLE_STF_DOXYGEN ON)
-#include(${STF_LIB_BASE}/cmake/stf-config.cmake)
+
+if (CMAKE_BUILD_TYPE MATCHES "^[Rr]elease")
+  set (FULL_LTO true)
+  include(${STF_LIB_BASE}/cmake/stf_linker_setup.cmake)
+  setup_stf_linker(false)
+endif()
+
+
 
 # Use ccache if installed
 find_program (CCACHE_PROGRAM ccache)
@@ -45,12 +67,6 @@ else()
   message (FATAL_ERROR "Please provide a CMAKE_BUILD_TYPE: -DCMAKE_BUILD_TYPE=Release|Debug|Profile")
 endif()
 
-# Sparta/STF linking
-link_directories (
-  ${SPARTA_BASE}/${SPARTA_BUILD_TYPE}
-  ${SPARTA_BASE}/${SPARTA_BUILD_TYPE}/simdb
-  )
-
 # Profile build flags
 set(CMAKE_CXX_FLAGS_PROFILE   "-O3 -pg -g -ftime-trace")
 set(CMAKE_CXX_FLAGS_FASTDEBUG "-O3 -g")
@@ -59,8 +75,6 @@ set(CMAKE_CXX_FLAGS_FASTDEBUG "-O3 -g")
 include_directories (core mss)
 include_directories (SYSTEM mavis)
 include_directories (SYSTEM stf_lib)
-include_directories (SYSTEM ${SPARTA_BASE})
-include_directories (SYSTEM ${SPARTA_BASE}/simdb/include)
 
 # The Core, MSS, and the simulator
 add_subdirectory(core)
@@ -77,10 +91,12 @@ add_executable(olympia
   sim/OlympiaSim.cpp
   sim/main.cpp
   )
-target_link_libraries (olympia core mss ${Sparta_LIBS} ${STF_LINK_LIBS})
+target_link_libraries (olympia core mss SPARTA::sparta ${STF_LINK_LIBS})
 if (CMAKE_BUILD_TYPE MATCHES "^[Rr]elease")
-  target_link_options    (olympia PUBLIC -flto)
+  target_compile_options (core    PUBLIC -flto)
+  target_compile_options (mss     PUBLIC -flto)
   target_compile_options (olympia PUBLIC -flto)
+  target_link_options    (olympia PUBLIC -flto)
 endif()
 
 # Create a few links like reports and arch directories
diff --git a/README.md b/README.md
index cdfc6cc7..c4921d94 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+[![Regress Olympia on Ubuntu](https://github.com/riscv-software-src/riscv-perf-model/actions/workflows/ubuntu-build.yml/badge.svg)](https://github.com/riscv-software-src/riscv-perf-model/actions/workflows/ubuntu-build.yml)
+
 # olympia
 
 Olympia is a Performance Model written in C++ for the RISC-V community as an
@@ -20,7 +22,7 @@ under development.
 # Build Directions
 
 1. Set up a clean working `conda` environment by following the directions [here](https://github.com/riscv-software-src/riscv-perf-model/tree/master/conda)
-1. Download and build Sparta and checkout tag [map_v1.1.0](https://github.com/sparcians/map/releases/tag/map_v1.1.0).  Follow the directions on the [Sparta README](https://github.com/sparcians/map/tree/map_v1.1.0/sparta#building-sparta-with-packages-used-in-continuous-integration-macos--centos7-or-newer-linux)
+1. Download and build Sparta and checkout branch [map_v2](https://github.com/sparcians/map/tree/map_v2).  Follow the directions on the [Sparta README](https://github.com/sparcians/map/tree/map_v2#building-map) to build _and install_ Sparta
 1. Make sure you have the [required libraries](https://github.com/sparcians/stf_lib#required-packages) for the STF toolsuite installed
 1. Clone olympia
    ```
diff --git a/conda/environment.yml b/conda/environment.yml
index 8dc319f2..787c7622 100644
--- a/conda/environment.yml
+++ b/conda/environment.yml
@@ -2,72 +2,72 @@ name: riscv_perf_model
 channels:
   - conda-forge
 dependencies:
-  - _libgcc_mutex=0.1=conda_forge
-  - _openmp_mutex=4.5=2_gnu
-  - binutils_impl_linux-64=2.39=he00db2b_1
-  - binutils_linux-64=2.39=h5fc0e48_11
-  - boost=1.76.0=py310h7c3ba0c_1
-  - boost-cpp=1.76.0=h312852a_1
-  - bzip2=1.0.8=h7f98852_4
-  - c-ares=1.18.1=h7f98852_0
-  - ca-certificates=2022.12.7=ha878542_0
-  - cmake=3.17.0=h28c56e5_0
-  - cppcheck=2.7.5=py310h94ea96f_1
-  - curl=7.87.0=h6312ad2_0
-  - doxygen=1.8.20=had0d8f1_0
-  - expat=2.5.0=h27087fc_0
-  - gcc_impl_linux-64=10.4.0=h5231bdf_19
-  - gcc_linux-64=10.4.0=h9215b83_11
-  - gxx_impl_linux-64=10.4.0=h5231bdf_19
-  - gxx_linux-64=10.4.0=h6e491c6_11
-  - hdf5=1.10.6=nompi_h6a2412b_1114
-  - icu=68.2=h9c3ff4c_0
-  - kernel-headers_linux-64=2.6.32=he073ed8_15
-  - keyutils=1.6.1=h166bdaf_0
-  - krb5=1.20.1=hf9c8cef_0
-  - ld_impl_linux-64=2.39=hcc3a1bd_1
-  - libblas=3.9.0=16_linux64_openblas
-  - libcblas=3.9.0=16_linux64_openblas
-  - libcurl=7.87.0=h6312ad2_0
-  - libedit=3.1.20191231=he28a2e2_2
-  - libev=4.33=h516909a_1
-  - libffi=3.4.2=h7f98852_5
-  - libgcc-devel_linux-64=10.4.0=hd38fd1e_19
-  - libgcc-ng=12.2.0=h65d4601_19
-  - libgfortran-ng=12.2.0=h69a702a_19
-  - libgfortran5=12.2.0=h337968e_19
-  - libgomp=12.2.0=h65d4601_19
-  - libiconv=1.17=h166bdaf_0
-  - liblapack=3.9.0=16_linux64_openblas
-  - libnghttp2=1.51.0=hdcd2b5c_0
-  - libnsl=2.0.0=h7f98852_0
-  - libopenblas=0.3.21=pthreads_h78a6416_3
-  - libsanitizer=10.4.0=h5246dfb_19
-  - libsqlite=3.40.0=h753d276_0
-  - libssh2=1.10.0=haa6b8db_3
-  - libstdcxx-devel_linux-64=10.4.0=hd38fd1e_19
-  - libstdcxx-ng=12.2.0=h46fd767_19
-  - libuuid=2.32.1=h7f98852_1000
-  - libuv=1.44.2=h166bdaf_0
-  - libzlib=1.2.13=h166bdaf_4
-  - ncurses=6.3=h27087fc_1
-  - numpy=1.24.1=py310h08bbf29_0
-  - openssl=1.1.1s=h0b41bf4_1
-  - pcre=8.45=h9c3ff4c_0
-  - pip=22.3.1=pyhd8ed1ab_0
-  - pygments=2.11.2=pyhd8ed1ab_0
-  - python=3.10.8=h257c98d_0_cpython
-  - python_abi=3.10=3_cp310
-  - rapidjson=1.1.0=he1b5a44_1002
-  - readline=8.1.2=h0f457ee_0
-  - rhash=1.4.3=h166bdaf_0
-  - setuptools=65.6.3=pyhd8ed1ab_0
-  - sqlite=3.36.0=h9cd32fc_2
-  - sysroot_linux-64=2.12=he073ed8_15
-  - tk=8.6.12=h27826a3_0
-  - tzdata=2022g=h191b570_0
-  - wheel=0.38.4=pyhd8ed1ab_0
-  - xz=5.2.6=h166bdaf_0
-  - yaml-cpp=0.7.0=h27087fc_2
-  - zlib=1.2.13=h166bdaf_4
-  - zstd=1.5.2=h6239696_4
+  - _libgcc_mutex>=0.1=conda_forge
+  - _openmp_mutex>=4.5=2_gnu
+  - binutils_impl_linux-64>=2.39=he00db2b_1
+  - binutils_linux-64>=2.39=h5fc0e48_11
+  - boost>=1.76.0=py310h7c3ba0c_1
+  - boost-cpp>=1.76.0=h312852a_1
+  - bzip2>=1.0.8=h7f98852_4
+  - c-ares>=1.18.1=h7f98852_0
+  - ca-certificates>=2022.12.7=ha878542_0
+  - cmake>=3.19.7
+  - cppcheck>=2.7.5=py310h94ea96f_1
+  - curl>=7.87.0=h6312ad2_0
+  - doxygen>=1.8.20=had0d8f1_0
+  - expat>=2.5.0=h27087fc_0
+  - gcc_impl_linux-64>=10.4.0=h5231bdf_19
+  - gcc_linux-64>=10.4.0=h9215b83_11
+  - gxx_impl_linux-64>=10.4.0=h5231bdf_19
+  - gxx_linux-64>=10.4.0=h6e491c6_11
+  - hdf5>=1.10.6=nompi_h6a2412b_1114
+  - icu>=68.2=h9c3ff4c_0
+  - kernel-headers_linux-64>=2.6.32=he073ed8_15
+  - keyutils>=1.6.1=h166bdaf_0
+  - krb5>=1.20.1=hf9c8cef_0
+  - ld_impl_linux-64>=2.39=hcc3a1bd_1
+  - libblas>=3.9.0=16_linux64_openblas
+  - libcblas>=3.9.0=16_linux64_openblas
+  - libcurl>=7.87.0=h6312ad2_0
+  - libedit>=3.1.20191231=he28a2e2_2
+  - libev>=4.33=h516909a_1
+  - libffi>=3.4.2=h7f98852_5
+  - libgcc-devel_linux-64>=10.4.0=hd38fd1e_19
+  - libgcc-ng>=12.2.0=h65d4601_19
+  - libgfortran-ng>=12.2.0=h69a702a_19
+  - libgfortran5>=12.2.0=h337968e_19
+  - libgomp>=12.2.0=h65d4601_19
+  - libiconv>=1.17=h166bdaf_0
+  - liblapack>=3.9.0=16_linux64_openblas
+  - libnghttp2>=1.51.0=hdcd2b5c_0
+  - libnsl>=2.0.0=h7f98852_0
+  - libopenblas>=0.3.21=pthreads_h78a6416_3
+  - libsanitizer>=10.4.0=h5246dfb_19
+  - libsqlite>=3.40.0=h753d276_0
+  - libssh2>=1.10.0=haa6b8db_3
+  - libstdcxx-devel_linux-64>=10.4.0=hd38fd1e_19
+  - libstdcxx-ng>=12.2.0=h46fd767_19
+  - libuuid>=2.32.1=h7f98852_1000
+  - libuv>=1.44.2=h166bdaf_0
+  - libzlib>=1.2.13=h166bdaf_4
+  - ncurses>=6.3=h27087fc_1
+  - numpy>=1.24.1=py310h08bbf29_0
+  - openssl>=1.1.1s=h0b41bf4_1
+  - pcre>=8.45=h9c3ff4c_0
+  - pip>=22.3.1=pyhd8ed1ab_0
+  - pygments>=2.11.2=pyhd8ed1ab_0
+  - python>=3.10.8=h257c98d_0_cpython
+  - python_abi>=3.10=3_cp310
+  - rapidjson>=1.1.0=he1b5a44_1002
+  - readline>=8.1.2=h0f457ee_0
+  - rhash>=1.4.3=h166bdaf_0
+  - setuptools>=65.6.3=pyhd8ed1ab_0
+  - sqlite>=3.36.0=h9cd32fc_2
+  - sysroot_linux-64>=2.12=he073ed8_15
+  - tk>=8.6.12=h27826a3_0
+  - tzdata>=2022g=h191b570_0
+  - wheel>=0.38.4=pyhd8ed1ab_0
+  - xz>=5.2.6=h166bdaf_0
+  - yaml-cpp>=0.7.0=h27087fc_2
+  - zlib>=1.2.13=h166bdaf_4
+  - zstd>=1.5.2=h6239696_4
diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt
index a32f1752..8fb9ffd9 100644
--- a/core/CMakeLists.txt
+++ b/core/CMakeLists.txt
@@ -19,4 +19,6 @@ add_library(core
   CPU.cpp
   CPUFactory.cpp
   CPUTopology.cpp
-  )
+)
+get_property(SPARTA_INCLUDE_PROP TARGET SPARTA::sparta PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+target_include_directories(core SYSTEM PRIVATE ${SPARTA_INCLUDE_PROP})
diff --git a/core/Dispatch.hpp b/core/Dispatch.hpp
index 673fb448..4fe4815d 100644
--- a/core/Dispatch.hpp
+++ b/core/Dispatch.hpp
@@ -14,9 +14,8 @@
 #include "sparta/log/MessageSource.hpp"
 #include "sparta/statistics/Counter.hpp"
 #include "sparta/statistics/ContextCounter.hpp"
-#include "sparta/simulation/ResourceFactory.hpp"
-
 #include "sparta/statistics/WeightedContextCounter.hpp"
+#include "sparta/simulation/ResourceFactory.hpp"
 
 #include "Dispatcher.hpp"
 #include "CoreTypes.hpp"
diff --git a/mavis b/mavis
index a3563228..c3c1060c 160000
--- a/mavis
+++ b/mavis
@@ -1,1 +1,1 @@
-Subproject commit a356322830f5b4b720aa11749b89b2fc91e9b9ee
+Subproject commit c3c1060cf59baf8c16c13ddd2473f84e7c3aeb65
diff --git a/mss/CMakeLists.txt b/mss/CMakeLists.txt
index a25aaf60..706261d4 100644
--- a/mss/CMakeLists.txt
+++ b/mss/CMakeLists.txt
@@ -3,3 +3,5 @@ add_library(mss
   BIU.cpp
   MSS.cpp
   )
+get_property(SPARTA_INCLUDE_PROP TARGET SPARTA::sparta PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+target_include_directories(mss SYSTEM PRIVATE ${SPARTA_INCLUDE_PROP})
diff --git a/stf_lib b/stf_lib
index 77021032..742037fb 160000
--- a/stf_lib
+++ b/stf_lib
@@ -1,1 +1,1 @@
-Subproject commit 7702103205549d910d691b310f554a840d600cca
+Subproject commit 742037fb80bfe97cb27d7063e24f9bb60b0144f3


Test patch:
diff --git a/test/core/common/CMakeLists.txt b/test/core/common/CMakeLists.txt
index e87ba6cb..ed87dfd4 100644
--- a/test/core/common/CMakeLists.txt
+++ b/test/core/common/CMakeLists.txt
@@ -4,3 +4,4 @@ project(common_test)
 add_library(common_test
   SourceUnit.cpp
   )
+target_link_libraries(common_test PRIVATE core SPARTA::sparta)
diff --git a/test/core/dispatch/CMakeLists.txt b/test/core/dispatch/CMakeLists.txt
index be1028b5..f2183449 100644
--- a/test/core/dispatch/CMakeLists.txt
+++ b/test/core/dispatch/CMakeLists.txt
@@ -1,9 +1,7 @@
 project(Dispatch_test)
 
 add_executable(Dispatch_test Dispatch_test.cpp)
-target_link_libraries(Dispatch_test core common_test ${STF_LINK_LIBS} ${Sparta_LIBS})
-
-include(${SPARTA_BASE}/test/TestingMacros.cmake)
+target_link_libraries(Dispatch_test core common_test ${STF_LINK_LIBS} SPARTA::sparta)
 
 file(CREATE_LINK ${SIM_BASE}/mavis/json ${CMAKE_CURRENT_BINARY_DIR}/mavis_isa_files SYMBOLIC)
 file(CREATE_LINK ${SIM_BASE}/arches     ${CMAKE_CURRENT_BINARY_DIR}/arches          SYMBOLIC)
@@ -11,6 +9,7 @@ file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/test_cores   ${CMAKE_CURRENT_BINARY
 file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/expected_output  ${CMAKE_CURRENT_BINARY_DIR}/expected_output SYMBOLIC)
 
 # Single add per cycle
+# Note: these macros get defined when find_package(Sparta) is called
 sparta_named_test(Dispatch_test_Run_Small  Dispatch_test small_core.out -c test_cores/test_small_core.yaml)
 sparta_named_test(Dispatch_test_Run_Medium Dispatch_test medium_core.out -c test_cores/test_medium_core.yaml)
 sparta_named_test(Dispatch_test_Run_Big    Dispatch_test big_core.out -c test_cores/test_big_core.yaml)
diff --git a/test/sim/CMakeLists.txt b/test/sim/CMakeLists.txt
index 6538a28b..80c91d25 100644
--- a/test/sim/CMakeLists.txt
+++ b/test/sim/CMakeLists.txt
@@ -1,7 +1,6 @@
 project(olympia_test)
 
-# Include the handy testing marcros defined in Sparta
-include(${SPARTA_BASE}/test/TestingMacros.cmake)
+# Note: these sparta_* macros/functions get defined when find_package(Sparta) is called
 
 # This line will make sure olympia is built before running the tests
 sparta_regress (olympia)