Solver Wrapper Implementation for Sorts
Solver wrappers derive a sort class from murxla::AbsSort
, which
manages construction and destruction of solver sort objects and implements
required and optional member function overrides.
Murxla uses naming convention <solver name (short)>Sort
for solver wrapper
sort implementations, e.g., the cvc5 implementation is called Cvc5Sort
and
the Bitwuzla implementation is called BitwuzlaSort
.
An example for a required override is member function
murxla::AbsSort::equals()
, which determines if two given sorts
are equal. It is implemented in the solver wrapper for cvc5 (using its
C++ API) as follows:
bool
Cvc5Sort::equals(const Sort& other) const
{
Cvc5Sort* cvc5_sort = checked_cast<Cvc5Sort*>(other.get());
if (cvc5_sort)
{
return d_sort == cvc5_sort->d_sort;
}
return false;
}
An example for an optional override is member function
murxla::AbsSort::is_bv()
, which determines if a given sort
is a bit-vector sort. It is implemented in the solver wrapper for Bitwuzla
(using its C API) as follows:
bool
BitwuzlaSort::is_bv() const
{
return d_sort.is_bv();
}
Note
Optional overrides have default implementations, but should be overriden if supported by the solver.