Skip to content

Commit

Permalink
Add squashing of sierra_ids (#22)
Browse files Browse the repository at this point in the history
Related #11
  • Loading branch information
ksew1 authored Aug 28, 2024
1 parent f6bb0e7 commit 71bfdeb
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 18 deletions.
3 changes: 2 additions & 1 deletion crates/cairo-coverage/src/input/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ impl TryFrom<&Utf8PathBuf> for InputData {

let sierra_to_cairo_map = create_sierra_to_cairo_map(&annotations)?;
let casm = compile_to_casm(&program)?;
let unique_executed_sierra_ids = UniqueExecutedSierraIds::new(&casm, &call_trace)?;
let unique_executed_sierra_ids =
UniqueExecutedSierraIds::new(&casm, &call_trace, &sierra_to_cairo_map)?;

Ok(Self {
unique_executed_sierra_ids,
Expand Down
65 changes: 48 additions & 17 deletions crates/cairo-coverage/src/input/unique_executed_sierra_ids.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::input::SierraToCairoMap;
use anyhow::{Context, Result};
use cairo_lang_sierra::program::StatementIdx;
use cairo_lang_sierra_to_casm::compiler::CairoProgram;
Expand All @@ -10,7 +11,11 @@ use trace_data::{CallTrace, CasmLevelInfo};
pub struct UniqueExecutedSierraIds(HashMap<StatementIdx, usize>);

impl UniqueExecutedSierraIds {
pub fn new(casm: &CairoProgram, call_trace: &CallTrace) -> Result<Self> {
pub fn new(
casm: &CairoProgram,
call_trace: &CallTrace,
sierra_to_cairo_map: &SierraToCairoMap,
) -> Result<Self> {
let CasmLevelInfo {
run_with_call_header,
vm_trace,
Expand All @@ -24,22 +29,48 @@ impl UniqueExecutedSierraIds {
.then(|| vm_trace.last().map_or(1, |trace| trace.pc + 1))
.unwrap_or(1);

Ok(Self(
vm_trace
.iter()
.map(|step| step.pc)
.filter(|pc| pc >= &real_minimal_pc)
.map(|pc| {
let real_pc_code_offset = pc - real_minimal_pc;
casm.debug_info
.sierra_statement_info
.partition_point(|debug_info| {
debug_info.start_offset <= real_pc_code_offset
})
- 1
})
.map(StatementIdx)
.counts(),
let iter = vm_trace
.iter()
.map(|step| step.pc)
.filter(|pc| pc >= &real_minimal_pc)
.map(|pc| {
let real_pc_code_offset = pc - real_minimal_pc;
casm.debug_info
.sierra_statement_info
.partition_point(|debug_info| debug_info.start_offset <= real_pc_code_offset)
- 1
})
.map(StatementIdx);

Ok(squash_idx_pointing_to_same_statement(
iter,
sierra_to_cairo_map,
))
}
}

fn squash_idx_pointing_to_same_statement<I: Iterator<Item = StatementIdx>>(
iter: I,
sierra_to_cairo_map: &SierraToCairoMap,
) -> UniqueExecutedSierraIds {
UniqueExecutedSierraIds(
iter.fold(Vec::new(), |mut acc, statement_idx| {
if points_to_different_statement(sierra_to_cairo_map, acc.last(), statement_idx) {
acc.push(statement_idx);
}
acc
})
.into_iter()
.counts(),
)
}

fn points_to_different_statement(
sierra_to_cairo_map: &SierraToCairoMap,
last_idx: Option<&StatementIdx>,
current_idx: StatementIdx,
) -> bool {
last_idx.map_or(true, |last_idx| {
sierra_to_cairo_map.get(last_idx) != sierra_to_cairo_map.get(&current_idx)
})
}

0 comments on commit 71bfdeb

Please sign in to comment.