in air/src/air/mod.rs [532:565]
fn prepare_assertions<B: StarkField>(
assertions: Vec<Assertion<B>>,
context: &AirContext<B>,
) -> Vec<Assertion<B>> {
// we use a sorted set to help us sort the assertions by their 'natural' order. The natural
// order is defined as sorting first by stride, then by first step, and finally by register,
// all in ascending order.
let mut result = BTreeSet::<Assertion<B>>::new();
for assertion in assertions.into_iter() {
assertion
.validate_trace_width(context.trace_info.width())
.unwrap_or_else(|err| {
panic!("assertion {} is invalid: {}", assertion, err);
});
assertion
.validate_trace_length(context.trace_info.length())
.unwrap_or_else(|err| {
panic!("assertion {} is invalid: {}", assertion, err);
});
for a in result.iter().filter(|a| a.register == assertion.register) {
assert!(
!a.overlaps_with(&assertion),
"assertion {} overlaps with assertion {}",
assertion,
a
);
}
result.insert(assertion);
}
result.into_iter().collect()
}