use pil2_pilout::pilout as pb;
use crate::pil::constraint_poly::{generate_constraint_polynomial, Boundary, ConstraintPolyResult};
use crate::expr::expression::Expression;
use crate::expr::helpers::add_info_expressions;
use crate::types::pilout_info::{ConstraintInfo, HintInfo, SetupResult, SymbolInfo};
use crate::types::stark_struct::StarkStruct;
#[derive(Debug, Clone, Default)]
pub struct PrepareOptions {
pub debug: bool,
pub im_pols_stages: bool,
}
#[derive(Debug)]
pub struct PreparePilResult {
pub setup: SetupResult,
pub expressions: Vec<Expression>,
pub constraints: Vec<ConstraintInfo>,
pub symbols: Vec<SymbolInfo>,
pub hints: Vec<HintInfo>,
pub boundaries: Vec<Boundary>,
pub constraint_poly: ConstraintPolyResult,
}
pub fn prepare_pil(
pilout: &pb::PilOut,
airgroup_id: usize,
air_id: usize,
stark_struct: &StarkStruct,
options: &PrepareOptions,
) -> PreparePilResult {
let mut setup = crate::types::pilout_info::get_pilout_info(pilout, airgroup_id, air_id);
for expr in setup.expressions.iter_mut() {
if expr.op != "__placeholder__" {
expr.stage = 1;
}
}
for s in 1..=(setup.n_stages + 1) {
setup.map_sections_n.insert(format!("cm{}", s), 0);
}
if !options.debug {
if stark_struct.n_bits != setup.pil_power as usize {
panic!(
"starkStruct and pilfile have degree mismatch (airId: {} airgroupId: {} starkStruct:{} pilfile:{})",
air_id, airgroup_id, stark_struct.n_bits, setup.pil_power
);
}
if stark_struct.n_bits_ext != stark_struct.steps[0].n_bits {
panic!(
"starkStruct.nBitsExt and first step of starkStruct have a mismatch (nBitsExt:{} step0:{})",
stark_struct.n_bits_ext, stark_struct.steps[0].n_bits
);
}
}
let mut expressions = std::mem::take(&mut setup.expressions);
let mut constraints = std::mem::take(&mut setup.constraints);
let mut symbols = std::mem::take(&mut setup.symbols);
let hints = std::mem::take(&mut setup.hints);
for i in 0..constraints.len() {
add_info_expressions(&mut expressions, constraints[i].e);
constraints[i].stage = Some(expressions[constraints[i].e].stage);
}
for i in 0..expressions.len() {
if expressions[i].op != "__placeholder__" {
add_info_expressions(&mut expressions, i);
}
}
let mut opening_points_set: Vec<i64> = vec![0];
for c in &constraints {
let offsets = &expressions[c.e].rows_offsets;
for &offset in offsets {
if !opening_points_set.contains(&offset) {
opening_points_set.push(offset);
}
}
}
opening_points_set.sort();
let mut boundaries = vec![Boundary { name: "everyRow".to_string(), offset_min: None, offset_max: None }];
let constraint_poly =
generate_constraint_polynomial(setup.n_stages, &mut expressions, &mut symbols, &constraints, &mut boundaries);
PreparePilResult { setup, expressions, constraints, symbols, hints, boundaries, constraint_poly }
}