Skip to main content

Bits

Struct Bits 

Source
pub struct Bits<Repr: SpecByteLen, Tuple, Nominal> {
    pub repr: Repr,
    pub unpack: FnSpec<(Repr::T,), Tuple>,
    pub pack: FnSpec<(Tuple,), Repr::T>,
    pub refinement: PredFnSpec<Tuple>,
    pub ctor: FnSpec<(Tuple,), Nominal>,
    pub dtor: FnSpec<(Nominal,), Tuple>,
    pub consistent: PredFnSpec<Nominal>,
}
Expand description

Packs a tuple of logical bitfield values into one fixed-width integer representation.

Generated Vest bitfield formats use the functions stored here to unpack the wire integer, validate the structural tuple, construct the public nominal value, and perform the inverse operation during serialization.

Fields§

§repr: Repr

Integer format that reads and writes the complete bitfield word.

§unpack: FnSpec<(Repr::T,), Tuple>

Splits the representation into its structural field tuple.

§pack: FnSpec<(Tuple,), Repr::T>

Packs the structural field tuple into the representation.

§refinement: PredFnSpec<Tuple>

Predicate enforcing field widths and reserved-bit constraints.

§ctor: FnSpec<(Tuple,), Nominal>

Constructs the public nominal value from structural fields.

§dtor: FnSpec<(Nominal,), Tuple>

Projects a public nominal value back to structural fields.

§consistent: PredFnSpec<Nominal>

Additional consistency predicate for nominal values.

Trait Implementations§

Source§

impl<Repr, Tuple, Nominal> Consistency for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + Consistency<Val = Repr::T>,

Source§

open spec fn consistent(&self, v: Self::Val) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    &&& fmt.consistent(v)
    &&& (self.consistent)(v)

}
Source§

type Val = Nominal

The type of values whose consistency is being checked.
Source§

impl<Repr, Tuple, Nominal> EquivSerializers for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + EquivSerializers<SVal = Repr::T>,

Source§

open spec fn equiv_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.equiv_inv()
}
Source§

proof fn lemma_serialize_equiv_on_empty(&self, v: Self::SVal)

Source§

impl<Repr, Tuple, Nominal> EquivSerializersGeneral for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + EquivSerializersGeneral<SVal = Repr::T>,

Source§

open spec fn equiv_general_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.equiv_general_inv()
}
Source§

proof fn lemma_serialize_equiv(&self, v: Self::SVal, obuf: Seq<u8>)

Source§

impl<Repr, Tuple, Nominal> GoodSerializer for Bits<Repr, Tuple, Nominal>
where Repr: GoodSerializer,

Source§

open spec fn serialize_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.serialize_inv()
}
Source§

proof fn lemma_serialize_len(&self, v: Self::SVal)

Source§

impl<Repr, Tuple, Nominal> MinMaxByteLen for Bits<Repr, Tuple, Nominal>
where Repr: MinMaxByteLen,

Source§

open spec fn min(&self) -> nat

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.min()
}
Source§

open spec fn max(&self) -> nat

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.max()
}
Source§

proof fn lemma_min_max_byte_len(&self, v: Self::T)

Source§

impl<Repr, Tuple, Nominal> NoLookAhead for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + NoLookAhead<PVal = Repr::T>,

Source§

open spec fn no_lookahead_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.no_lookahead_inv()
}
Source§

proof fn lemma_no_lookahead(&self, i1: Seq<u8>, i2: Seq<u8>)

Source§

fn corollary_non_extensible(&self, i1: Seq<u8>, i2: Seq<u8>)

Source§

impl<Repr, Tuple, Nominal> NonMalleable for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + SoundParser + NonMalleable<PVal = Repr::T>,

Source§

open spec fn nonmal_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.nonmal_inv()
}
Source§

proof fn lemma_parse_non_malleable(&self, buf1: Seq<u8>, buf2: Seq<u8>)

Source§

impl<Repr, Tuple, Nominal> NonTailFmt for Bits<Repr, Tuple, Nominal>
where Repr: NonTailFmt,

Source§

open spec fn serialize_dps_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.serialize_dps_inv()
}
Source§

proof fn lemma_serialize_dps_prepend(&self, v: Self::SValue, obuf: Seq<u8>)

Source§

proof fn lemma_serialize_dps_len(&self, v: Self::SValue, obuf: Seq<u8>)

Source§

impl<Repr, Tuple, Nominal> Productive for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + Productive<PVal = Repr::T>,

Source§

open spec fn productive_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.productive_inv()
}
Source§

proof fn lemma_productive(&self, s: Seq<u8>)

Source§

impl<Repr, Tuple, Nominal> SPRoundTripDps for Bits<Repr, Tuple, Nominal>
where Repr: SPRoundTripDps,

Source§

open spec fn unambiguous(&self) -> bool

{
    &&& self.repr.unambiguous()
    &&& forall |unpacked: Tuple| {
        (#[trigger] (self.consistent)((self.ctor)(unpacked))
            && (self.refinement)(unpacked))
            ==> (self.unpack)((self.pack)(unpacked)) == unpacked
    }
    &&& forall |t: Nominal| {
        #[trigger] (self.consistent)(t) ==> (self.ctor)((self.dtor)(t)) == t
    }

}
Source§

proof fn theorem_serialize_dps_parse_roundtrip(&self, v: Self::T, obuf: Seq<u8>)

Source§

impl<Repr, Tuple, Nominal> SafeParser for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + SafeParser<PVal = Repr::T>,

Source§

open spec fn safe_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.safe_inv()
}
Source§

proof fn lemma_parse_safe(&self, ibuf: Seq<u8>)

Source§

impl<Repr, Tuple, Nominal> SoundParser for Bits<Repr, Tuple, Nominal>
where Repr: SoundParser,

Source§

open spec fn sound_inv(&self) -> bool

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    &&& fmt.sound_inv()
    &&& forall |ibuf| (
        #[trigger]
        fmt.spec_parse(ibuf) matches Some((_, v)) ==> (self.consistent)(v)
    )

}
Source§

proof fn lemma_parse_sound_consumption(&self, ibuf: Seq<u8>)

Source§

proof fn lemma_parse_sound_value(&self, ibuf: Seq<u8>)

Source§

impl<Repr, Tuple, Nominal> SpecByteLen for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen,

Source§

open spec fn byte_len(&self, v: Self::T) -> nat

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.byte_len(v)
}
Source§

type T = Nominal

The type of values whose byte length is being computed.
Source§

impl<Repr, Tuple, Nominal> SpecParser for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + SpecParser<PVal = Repr::T>,

Source§

open spec fn spec_parse(&self, ibuf: Seq<u8>) -> Option<(int, Self::PVal)>

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.spec_parse(ibuf)
}
Source§

type PVal = Nominal

The type of parsed values.
Source§

impl<Repr, Tuple, Nominal> SpecSerializer for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + SpecSerializer<SVal = Repr::T>,

Source§

open spec fn spec_serialize(&self, v: Self::SVal) -> Seq<u8>

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.spec_serialize(v)
}
Source§

type SVal = Nominal

The type of values to be serialized.
Source§

impl<Repr, Tuple, Nominal> SpecSerializerDps for Bits<Repr, Tuple, Nominal>
where Repr: SpecByteLen + SpecSerializerDps<SValue = Repr::T>,

Source§

open spec fn spec_serialize_dps(&self, v: Self::SValue, obuf: Seq<u8>) -> Seq<u8>

{
    let fmt = bits(
        self.repr,
        self.unpack,
        self.pack,
        self.refinement,
        self.ctor,
        self.dtor,
    );
    fmt.spec_serialize_dps(v, obuf)
}
Source§

type SValue = Nominal

The type of values to be serialized.
Source§

impl<Repr, Tuple, Nominal> StaticByteLen for Bits<Repr, Tuple, Nominal>
where Repr: StaticByteLen,

Source§

open spec fn static_byte_len() -> nat

{ Repr::static_byte_len() }
Source§

proof fn lemma_static_len_matches_byte_len(&self, v: Self::T)

Auto Trait Implementations§

§

impl<Repr, Tuple, Nominal> Freeze for Bits<Repr, Tuple, Nominal>
where Repr: Freeze,

§

impl<Repr, Tuple, Nominal> RefUnwindSafe for Bits<Repr, Tuple, Nominal>
where Repr: RefUnwindSafe, Tuple: RefUnwindSafe, <Repr as SpecByteLen>::T: RefUnwindSafe, Nominal: RefUnwindSafe,

§

impl<Repr, Tuple, Nominal> Send for Bits<Repr, Tuple, Nominal>
where Repr: Send, Tuple: Send, <Repr as SpecByteLen>::T: Send, Nominal: Send,

§

impl<Repr, Tuple, Nominal> Sync for Bits<Repr, Tuple, Nominal>
where Repr: Sync, Tuple: Sync, <Repr as SpecByteLen>::T: Sync, Nominal: Sync,

§

impl<Repr, Tuple, Nominal> Unpin for Bits<Repr, Tuple, Nominal>
where Repr: Unpin, Tuple: Unpin, <Repr as SpecByteLen>::T: Unpin, Nominal: Unpin,

§

impl<Repr, Tuple, Nominal> UnsafeUnpin for Bits<Repr, Tuple, Nominal>
where Repr: UnsafeUnpin,

§

impl<Repr, Tuple, Nominal> UnwindSafe for Bits<Repr, Tuple, Nominal>
where Repr: UnwindSafe, Tuple: UnwindSafe, <Repr as SpecByteLen>::T: UnwindSafe, Nominal: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: From<T>,

§

fn obeys_from_spec() -> bool

§

fn from_spec(v: T) -> VERUS_SPEC__A

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: Into<T>,

§

fn obeys_into_spec() -> bool

§

fn into_spec(self) -> T

§

impl<T, U> IntoSpecImpl<U> for T
where U: From<T>,

§

fn obeys_into_spec() -> bool

§

fn into_spec(self) -> U

Source§

impl<C> NonAmbiguous for C
where C: SPRoundTrip,

Source§

open spec fn nonamb_inv(&self) -> bool

{ self.sp_roundtrip_inv() }
Source§

proof fn lemma_serialize_injective( &self, v1: <C as Consistency>::Val, v2: <C as Consistency>::Val, )

Source§

fn corollary_serialize_injective_contrapositive( &self, v1: Self::Val, v2: Self::Val, )

Source§

impl<C> PSRoundTrip for C

Source§

open spec fn ps_roundtrip_inv(&self) -> bool

{ self.safe_inv() && self.sound_inv() && self.nonmal_inv() && self.sp_roundtrip_inv() }
Source§

proof fn theorem_parse_serialize_roundtrip(&self, ibuf: Seq<u8>)

Source§

fn corollary_parse_non_malleable(&self, buf1: Seq<u8>, buf2: Seq<u8>)

Source§

impl<C> SPRoundTrip for C

Source§

open spec fn sp_roundtrip_inv(&self) -> bool

{ self.serialize_inv() && self.equiv_inv() && self.unambiguous() }
Source§

proof fn theorem_serialize_parse_roundtrip(&self, v: <C as SpecByteLen>::T)

Source§

impl<T, S> SerializerExt<T> for S
where S: SpecByteLen<T = <T as DeepView>::V> + SpecSerializer<SVal = <T as DeepView>::V> + Consistency<Val = <T as DeepView>::V>, T: DeepView + ?Sized,

Source§

fn serialize<'a>(&self, v: &T, obuf: &'a mut [u8])
where Self: Serializer<OutputSlice<'a>, T>,

Source§

fn serialize_with_vec(&self, v: &T, obuf: &mut Vec<u8>)
where Self: Serializer<Vec<u8>, T>,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, VERUS_SPEC__A> TryFromSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: TryFrom<T>,

§

fn obeys_try_from_spec() -> bool

§

fn try_from_spec( v: T, ) -> Result<VERUS_SPEC__A, <VERUS_SPEC__A as TryFrom<T>>::Error>

Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T, VERUS_SPEC__A> TryIntoSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: TryInto<T>,

§

fn obeys_try_into_spec() -> bool

§

fn try_into_spec(self) -> Result<T, <VERUS_SPEC__A as TryInto<T>>::Error>

§

impl<T, U> TryIntoSpecImpl<U> for T
where U: TryFrom<T>,

§

fn obeys_try_into_spec() -> bool

§

fn try_into_spec(self) -> Result<U, <U as TryFrom<T>>::Error>

Source§

impl<T> SpecCombinator for T
where T: SpecParser<PVal = <T as SpecByteLen>::T> + SpecByteLen + SpecSerializer<SVal = <T as SpecByteLen>::T> + Consistency<Val = <T as SpecByteLen>::T> + SpecSerializerDps<SValue = <T as SpecByteLen>::T>,

§

impl<A> SpecEq<&A> for A
where A: ?Sized,

§

impl<A> SpecEq<&mut A> for A
where A: ?Sized,

§

impl<A> SpecEq<A> for A
where A: ?Sized,

§

impl<A> SpecEq<Ghost<A>> for A

§

impl<A> SpecEq<Tracked<A>> for A

Source§

impl<Body> StrictCombinator for Body