Skip to main content

miden_stdlib_sys/intrinsics/
felt.rs

1//! Felt-related intrinsics and helpers.
2
3pub use miden_field::Felt;
4
5#[cfg(all(target_family = "wasm", miden))]
6unsafe extern "C" {
7    #[cfg_attr(all(target_family = "wasm", miden), linkage = "extern_weak")]
8    #[link_name = "intrinsics::felt::assert"]
9    fn extern_assert(a: Felt);
10    #[cfg_attr(all(target_family = "wasm", miden), linkage = "extern_weak")]
11    #[link_name = "intrinsics::felt::assertz"]
12    fn extern_assertz(a: Felt);
13    #[cfg_attr(all(target_family = "wasm", miden), linkage = "extern_weak")]
14    #[link_name = "intrinsics::felt::assert_eq"]
15    fn extern_assert_eq(a: Felt, b: Felt);
16}
17
18/// Fails if `a` != 1.
19#[cfg(all(target_family = "wasm", miden))]
20#[inline(always)]
21pub fn assert(a: Felt) {
22    unsafe { extern_assert(a) }
23}
24
25/// Fails if `a` != 0.
26#[cfg(all(target_family = "wasm", miden))]
27#[inline(always)]
28pub fn assertz(a: Felt) {
29    unsafe { extern_assertz(a) }
30}
31
32/// Fails if `a` != `b`.
33#[cfg(all(target_family = "wasm", miden))]
34#[inline(always)]
35pub fn assert_eq(a: Felt, b: Felt) {
36    unsafe { extern_assert_eq(a, b) }
37}
38
39/// Fails if `a` != 1.
40#[cfg(not(all(target_family = "wasm", miden)))]
41#[inline(always)]
42pub fn assert(a: Felt) {
43    if a != Felt::new(1).unwrap() {
44        panic!("assert: expected 1");
45    }
46}
47
48/// Fails if `a` != 0.
49#[cfg(not(all(target_family = "wasm", miden)))]
50#[inline(always)]
51pub fn assertz(a: Felt) {
52    if a != Felt::new(0).unwrap() {
53        panic!("assertz: expected 0");
54    }
55}
56
57/// Fails if `a` != `b`.
58#[cfg(not(all(target_family = "wasm", miden)))]
59#[inline(always)]
60pub fn assert_eq(a: Felt, b: Felt) {
61    if a != b {
62        panic!("assert_eq: values differ");
63    }
64}
65
66/// Creates a `Felt` from an integer constant checking that it is within the
67/// valid range at compile time.
68#[macro_export]
69macro_rules! felt {
70    // Trigger a compile-time error if the value is not a constant
71    ($value:literal) => {{
72        const VALUE: u64 = $value as u64;
73        // assert!(VALUE <= Felt::M, "Invalid Felt value, must be >= 0 and <= 2^64 - 2^32 + 1");
74        $crate::Felt::new(VALUE).unwrap()
75    }};
76}