This system of crates together forms a kind of big-integer library with separated storage and
functional structs, manually controlled bitwidth, and bitwidth dependent operations. Instead of one
struct that has all of the allocation and functional capabilities, there are two storage types which
manage allocation, InlAwi
and ExtAwi
, and a common Bits
reference type that manages
arithmetical functionality. Most operations on Bits
are const and have no allocations. Bits
backed by InlAwi
can perform big-integer arithmetic both at compile time and in a no-std
runtime
without any allocator at all. Bits
backed by ExtAwi
can use dynamic bitwidths at runtime. If a
function is written purely in terms of Bits
, then any mix of InlAwi
s and ExtAwi
s can be used
as arguments to that function.
A generic FP
struct for fixed point numbers is also included, adding more functions for it is
currently a WIP.
Bits
and InlAwi
are provided by the awint_core
crate.
ExtAwi
and FP
is provided by the awint_ext
crate. The reason for this split is to provide
maximum flexibility to no-std
and no-alloc
use cases. ExtAwi
is not within awint_core
under
a feature flag, because if a no-alloc
project depended on both awint_core
and awint_macros
(which requires ExtAwi
), the flag would be activated for the common compilation of awint_core
.
The awint_macros
crate is a proc-macro crate with several construction utilities.
The awint_dag
crate supplies a way to use awint
types as a DSL (Domain Specific Language) for
combinational logic.
The awint
crate compiles these interfaces together and enables or disables different parts of the
system depending on these feature flags:
const
awint_dag
dag::Option
to fully workrand_core
without its default featuresserde
without its default featureszeroize
without its default featuresNote: By default, "const_support" and "std" are turned on, use default-features = false
and
select specific features to avoid requiring nightly.
NOTE: As of Rust 1.66, if you try to use "constsupport" with the macros you may get strange "erroneous constant used" and "derefmut" errors unless you add all of ```
``
to _all_ of the crate roots where you use the macros in
const` contexts.
NOTE: As of some versions of Rust starting around 1.70, "const_support" is unfortunately broken on nightly (see https://github.com/AaronKutch/awint/issues/19).
These are currently unimplemented because of other developments and improvements that are being prioritized. Please open an issue or PR if you would like these implemented faster.
x.add_(y)
would have the
alternative z = x.add(y)
or z = x + y
) and the macro optimizes storage creation and routing.awint_dag
awint_dag
FP
smallvec
doesAwi
wrapper around ExtAwi
with more traditional big-integer library functions
such as a dynamic sign and automatically resizing bitwidth. This higher level wrapper keeps track
of leading zeros and ones to speed up operations on very large bitwidth integers with small
numerical value.const
Karatsuba algorithm to multiplication if possible, or add a fast_mul
function to
awint_ext
ExtAwi
const
feature, and will hopefully be stabilized soon.