use crate::ir::{ArrayType, WidthInt};
use num_bigint::BigUint;
use num_traits::{Num, Zero};
#[derive(Debug, Default)]
pub struct Witness {
pub init: Vec<Option<WitnessValue>>,
pub init_names: Vec<Option<String>>,
pub inputs: Vec<Vec<Option<WitnessValue>>>,
pub input_names: Vec<Option<String>>,
pub failed_safety: Vec<u32>,
}
#[derive(Debug, Clone)]
pub enum WitnessValue {
Scalar(BigUint, WidthInt),
Array(WitnessArray),
}
impl WitnessValue {
pub fn is_zero(&self) -> bool {
match self {
WitnessValue::Scalar(value, _) => value.is_zero(),
WitnessValue::Array(_) => false,
}
}
}
#[derive(Debug, Clone)]
pub struct WitnessArray {
pub tpe: ArrayType,
pub default: Option<BigUint>,
pub updates: Vec<(BigUint, BigUint)>,
}
impl WitnessArray {
pub fn add_update(&mut self, index: BigUint, value: BigUint) {
self.updates.retain(|(i, _)| !i.eq(&index));
self.updates.push((index, value));
}
}
pub fn parse_big_uint_from_bit_string(value: &str) -> (BigUint, WidthInt) {
let int_val = BigUint::from_str_radix(value, 2).unwrap();
(int_val, value.len() as WidthInt)
}