use alloc::vec::Vec;
use miden_core::{
mast::{BasicBlockNodeBuilder, MastForest, MastForestContributor},
operations::Operation,
program::Program,
};
use miden_utils_testing::rand::rand_array;
use super::{ExecutionTrace, Felt};
use crate::{
AdviceInputs, DefaultHost, ExecutionOptions, FastProcessor, StackInputs,
trace::{build_trace, chiplets::init_state_from_words},
};
mod chiplets;
mod decoder;
mod hasher;
mod range;
mod stack;
const TEST_TRACE_FRAGMENT_SIZE: usize = 1 << 10;
pub fn build_trace_from_program(program: &Program, stack_inputs: &[u64]) -> ExecutionTrace {
let stack_inputs = stack_inputs.iter().map(|&v| Felt::new(v)).collect::<Vec<Felt>>();
let mut host = DefaultHost::default();
let processor = FastProcessor::new_with_options(
StackInputs::new(&stack_inputs).unwrap(),
AdviceInputs::default(),
ExecutionOptions::default()
.with_core_trace_fragment_size(TEST_TRACE_FRAGMENT_SIZE)
.unwrap(),
);
let (execution_output, trace_generation_context) =
processor.execute_for_trace_sync(program, &mut host).unwrap();
build_trace(execution_output, trace_generation_context, program.to_info()).unwrap()
}
pub fn build_trace_from_ops(operations: Vec<Operation>, stack: &[u64]) -> ExecutionTrace {
let mut mast_forest = MastForest::new();
let basic_block_id = BasicBlockNodeBuilder::new(operations, Vec::new())
.add_to_forest(&mut mast_forest)
.unwrap();
mast_forest.make_root(basic_block_id);
let program = Program::new(mast_forest.into(), basic_block_id);
build_trace_from_program(&program, stack)
}
pub fn build_trace_from_ops_with_inputs(
operations: Vec<Operation>,
stack_inputs: StackInputs,
advice_inputs: AdviceInputs,
) -> ExecutionTrace {
let mut mast_forest = MastForest::new();
let basic_block_id = BasicBlockNodeBuilder::new(operations, Vec::new())
.add_to_forest(&mut mast_forest)
.unwrap();
mast_forest.make_root(basic_block_id);
let program = Program::new(mast_forest.into(), basic_block_id);
let mut host = DefaultHost::default();
let processor = FastProcessor::new_with_options(
stack_inputs,
advice_inputs,
ExecutionOptions::default()
.with_core_trace_fragment_size(TEST_TRACE_FRAGMENT_SIZE)
.unwrap(),
);
let (execution_output, trace_generation_context) =
processor.execute_for_trace_sync(&program, &mut host).unwrap();
build_trace(execution_output, trace_generation_context, program.to_info()).unwrap()
}