All notable changes to Sylvan will be documented in this file.
- Added support for building and running Sylvan on Windows with MSVC, alongside the existing MSYS2 builds. Windows library builds are currently static.
- Large internal allocations are cleared using virtual memory operations on supported platforms.
- Improved CMake integration, including true C-only builds, cleaner subproject behavior, and stronger installed-package tests.
- Cleaned up portability issues and compiler warnings across MSVC, GCC, and Clang.
- Fixed garbage collection on Windows.
- Fixed edge cases in MTBDD integer and fraction handling.
- Fixed ZDD reference handling and domain operations.
This release contains a small API change in Lace, which will break things! If you use
the TASK(foo) macro, you will need to change it to foo_CALL. Lace 1.6.0 contains
backports from the new Lace version 2.3.0, which is the current development version.
It has some improvements with better support for Windows MSVC.
- Updated Lace to version 1.6.0.
- Updated Lace to version 1.5.3
- Removed a few compiler warnings and build errors
- By default, Sylvan now sets a default build type (Release) when it is the top project
- Sylvan build options are now marked as advanced when Sylvan is not the top project
- The C++ wrapper is now optional and can be excluded from the library
- Update Lace to version 1.5.1 with some improved support for other platforms
- Added forgotten copy constructor to MtbddMap to ensure correct garbage collection
- Fix two memory leaks in the LDD implementation
- Improved implementation of
cache_getandcache_getfor systems with weak memory. - The example programs that are only compiled if MEDDLY is installed are no longer supported and are removed from the library. They were only there for benchmarking and by now MEDDLY has changed a lot and maintaining these benchmark examples is not currently a priority.
- The
zdd_isoptest was faulty and is now functioning correctly.
- New BDD operations: fast tests for
disjointandsubset. - Test scripts to validate the result of
make install
- Update Lace to version 1.5.0
- Slightly more efficient hash function for the cache.
- Various changes to improve the CMake build script.
- Fixed major concurrency bug in the cache.
- Added CMake scripts for installing again.
- Now supports Windows (via MSYS2) and OSX.
- CI builds for Linux, OSX and Windows.
- Better support for systems that don't have mmap.
- Removed dependency on argp, by using
getopt_longinstead. - Using a new version of Lace, with better cross-platform support.
- Now complains when certain Sylvan functions are used outside a Lace worker thread.
- Slightly streamlined
mtbdd_makenodeto generate more optimal code. - Lace is now a dependency of Sylvan instead of included in the source code.
- Rudimentary support for zero-suppressed decision diagrams (ZDDs).
- Implemented irredundant sum-of-products
ISOPthat computes the ZDD cover of a BDD.
- Another new version of Lace, using C11 atomics instead of the old abuse of the volatile keyword. This is a fairly major change and so far it even appears to improve performance a little bit.
- The name of Sylvan in CMake is now
sylvanorsylvan::sylvan - Possibly breaking change:
mtbdd_enum_firstandmtbdd_enum_nextno longer check ifvariablescovers all variables encountered in the decision diagram, allowing partial evaluation. - Various small changes to the CMake scripts.
- Support for Sylvan as a shared library is removed.
- Fixed OSX build
- Fixed warnings on modern gcc in
sha2.c - Fixed test and example programs that use Sylvan wrongly. Sylvan functions should always be executed from a Lace worker.
- A major performance regression introduced in version 1.6.0 has been fixed.
- New version of Lace with slightly better support for OSX and a few minor changes.
- A bug with
sylvan_set_limitshas been fixed.
- Major API change in Lace. This will break things!
- Lace is now started with
lace_startand stopped withlace_stop. The initializing thread is no longer a Lace thread. Instead, starting Lace with N workers will simply start N threads. To temporarily halt the workers (because they use 100% CPU time), uselace_suspendandlace_resume. - The macros
SPAWN,SYNCandCALLonly work from Lace tasks. TheLACE_MEmacro is gone. If you are not inside a Lace task, use theRUNmacro to run a task. - If you use
RUNfrom a Lace task, this will automatically fallback toCALLwith a little bit of overhead. - CAREFUL: using
RUNfrom an external thread is not safe w.r.t. garbage collection! If you invoke Sylvan operations from multiple external threads, then it may be possible that BDDs are not referenced (and put back into the table) in rare cases. The solution to this is to wrap each operation in a Lace task that stores the result in a properly referenced variable before leaving the Lace environment. The reason for this is that garbage collection will not run until all Lace workers cooperate. - You can now run Sylvan from any thread. This means that in the future, it is easier to support bridges to Python and Java.
- New tools
ldd2meddlyandmedmcas part of research comparing the saturation algorithm in Sylvan to the one in Meddly.
- Renamed the
mcexample program tobccmc.
- A bug in the GMP handling was fixed.
- We now implement twisted tabulation as the hash function for the nodes table.
The old hash function is still available and the default behavior can be
changed in
sylvan_table.h.
- Removed dependency on hwloc.
- Function
mtbdd_cmplthat computes the complement for MTBDDs. (0 becomes 1, non-0 becomes 0)
- Changed file formats used by the examples to match the changes in LTSmin.
- Function
mtbdd_satcountnow does not count assignments leading to 0. Perhaps in the future we make this configurable. (Like in CuDD.) - Slightly improved C++ support by wrapping header files in the namespace sylvan.
- There was a bug where Lace tasks are overwritten during SYNC, which causes problems during garbage collection. Lace reusing the bucket during SYNC is by design and is difficult to change. We fix the issue by checking during garbage collection if the stored task is still the same function, which in the worst case marks more nodes than needed.
- Band-aid patch for hashing; very similar nodes were hashing to similar positions and strides, causing early garbage collections and full tables. The patch works for now, but we need a more robust solution.
- Removed support for HWLOC (pinning on NUMA machines). Planning to bring this back as an option, but in its current form it prevents multiple Sylvan programs from running simultaneously on the same machine.
- Changed file format for .bdd files in the MC example.
- A major bug in
lddmc_match_sat_parhas been fixed. - A bug in the saturation algorithm in the model checking example has been fixed.
- A major bug in the hash table rehashing implementation has been fixed.
- Now implements
lddmc_protectandlddmc_unprotectfor external pointer references. - Now implements
lddmc_refs_pushptrandlddmc_refs_popptrfor internal pointer references
- New version of Lace has slightly different API for manually created threads.
- A bug in
mtbdd_refs_ptrs_upcaused a segfault. This has been fixed.
- The embedded work-stealing framework now explicitly checks for stack overflows and aborts with an appropriate error message written to stderr.
- New functions
sylvan_projectandsylvan_and_projectfor BDDs, a dual of existential quantification, where instead of the variables to remove, the given set of variables are the variables to keep. - New functions
mtbdd_refs_pushptrandmtbdd_refs_popptrallow thread-specific referencing of pointers.
- Rewritten initialization of Sylvan. Before the call to
sylvan_init_package, table sizes must be initialized either usingsylvan_set_sizesor with the new functionsylvan_set_limits. This new function allows the user to set a maximum number of bytes allocated for the nodes table and for the operation cache. - Rewritten MTBDD referencing system.
- Rewritten MTBDD map and set functions (no API change except renaming
mtbdd_map_addalltomtbdd_map_updatewith backward compatibility) - The lock-free unique table now uses double hashing instead of rehashing. This can improve the performance for custom leaves and improves the hash spread.
- A bug in
llmsset_lookupaffecting custom leaves has been fixed.
- Added documentation in the docs directory using Sphinx. Some documentation is removed from the README.md file.
- The custom terminal/leaf API is slightly modified. The
read_binary_cbhas a different signature to remove the dependency upon MTBDD functionality. - The custom terminal/leaf API functions have been renamed and moved to a separate file.
- Lace has been updated with a new version. The new version has rewritten the hardware locality code that pins worker threads and memory.
- A bug in
mtbdd_reader_readbinaryhas been fixed.
- The pkg-config file is slightly improved.
- A critical bug in
sylvan_collecthas been fixed.
- The pkg-config file now includes hwloc as a requirement
- This CHANGELOG file.
- Custom leaves can now implement custom callbacks for writing/reading to/from files.
- Implemented GMP leaf writing/reading to/from file.
- Method
mtbdd_eval_composefor proper function composition (after partial evaluation). - Method
mtbdd_enum_par_*for parallel path enumeration. - LDD methods
relprodandrelprevnow support action labels (meta 5). - Examples program
ldd2bddnow converts LDD transition systems to BDDs transition systems. - Methods
cache_get6andcache_put6for operation cache entries that require two buckets. - File
sylvan.pcfor pkg-config.
- The API to register a custom MTBDD leaf now requires multiple calls, which is better design for future extensions.
- When rehashing during garbage collection fails (due to finite length probe sequences), Sylvan now increases the probe sequence length instead of aborting with an error message. However, Sylvan will probably still abort due to the table being full, since this error is typically triggered when garbage collection does not remove many dead nodes.
- Methods
mtbdd_enum_all_*fixed and rewritten.
- We no longer use both autoconf makefiles and CMake. Instead, we removed the autoconf files and rely solely on CMake now.