use alloc::vec::Vec;
use miden_air::trace::{Challenges, MainTrace};
use miden_core::field::ExtensionField;
use wiring_bus::WiringBusBuilder;
use super::{Felt, ace::AceHints};
use crate::trace::AuxColumnBuilder;
mod bus;
pub use bus::{
BusColumnBuilder, build_ace_memory_read_element_request, build_ace_memory_read_word_request,
};
mod virtual_table;
pub use virtual_table::ChipletsVTableColBuilder;
mod wiring_bus;
#[derive(Debug, Clone)]
pub struct AuxTraceBuilder {
ace_hints: AceHints,
}
impl AuxTraceBuilder {
pub fn new(ace_hints: AceHints) -> Self {
Self { ace_hints }
}
pub(crate) fn build_aux_columns<E: ExtensionField<Felt>>(
&self,
main_trace: &MainTrace,
challenges: &Challenges<E>,
) -> [Vec<E>; 3] {
let v_table_col_builder = ChipletsVTableColBuilder;
let bus_col_builder = BusColumnBuilder;
let wiring_bus_builder = WiringBusBuilder::new(&self.ace_hints);
let t_chip = v_table_col_builder.build_aux_column(main_trace, challenges);
let b_chip = bus_col_builder.build_aux_column(main_trace, challenges);
let wiring_bus = wiring_bus_builder.build_aux_column(main_trace, challenges);
let log_up_final_value = wiring_bus.last().copied().unwrap_or(E::ZERO);
debug_assert_eq!(log_up_final_value, E::ZERO);
[t_chip, b_chip, wiring_bus]
}
}