liblisa-synth 0.3.0

A tool for automated discovery and analysis of the ISA of a CPU.
use liblisa::semantics::InputValues;
use liblisa::semantics::default::computation::PreparedComparison;
use liblisa::value::{AsValue, OwnedValue, Value};

use crate::InputSlice;
use crate::search::{ComputationEnumerator, InterpretedArgs};

pub mod expr_finder;
pub mod mapping;
pub mod synthesizer;

#[derive(Debug, Clone)]
pub struct Case {
    inputs: Vec<OwnedValue>,
    output: OwnedValue,
}

impl Case {
    pub fn new<V: AsValue>(inputs: &[V], output: Value) -> Self {
        Case {
            inputs: inputs.as_owned(),
            output: output.to_owned_value(),
        }
    }

    pub fn inputs(&self) -> &[OwnedValue] {
        self.inputs.as_ref()
    }

    pub fn output(&self) -> Value {
        self.output.as_value()
    }
}

#[derive(Debug, Clone)]
pub struct PreparedCase {
    args: InterpretedArgs,
    comparison: PreparedComparison,
}

impl PreparedCase {
    pub fn new<V: AsValue>(inputs: &[V], output: Value, enumerator: &ComputationEnumerator) -> Self {
        PreparedCase {
            args: enumerator.prepare_interpreted_args(inputs),
            comparison: PreparedComparison::from(&output),
        }
    }

    pub fn arg_slice(&self) -> &[i128] {
        self.args.as_slice()
    }
}

#[derive(Debug, Clone)]
pub struct PreparedInputs {
    inputs: InputValues,
    args: InterpretedArgs,
}

impl PreparedInputs {
    pub fn new<V: AsValue>(inputs: &[V], enumerator: &ComputationEnumerator) -> Self {
        PreparedInputs {
            inputs: InputValues::from(inputs),
            args: enumerator.prepare_interpreted_args(inputs),
        }
    }

    pub fn arg_slice(&self) -> &[i128] {
        self.args.as_slice()
    }

    pub fn inputs(&self) -> &InputValues {
        &self.inputs
    }
}