#[cfg_attr(not(all(test, feature = "check")), allow(dead_code))]
pub(crate) mod apply;
pub(crate) mod compile;
pub(crate) mod corpus;
mod diag;
pub(crate) mod eval;
pub mod ir;
pub mod lean;
mod ledger;
pub(crate) mod matcher;
pub(crate) mod order;
use std::sync::Arc;
pub use compile::CompileLimits;
pub use diag::{CompileError, Diagnostic, Level, explain};
pub use ir::{
ConstPred, FactPred, FloatLit, FpNode, Group, LetDef, Literal, NodeId, Param, ParamKind, RNode,
Rounding, Rule, RuleId, RuleKind, Sort, WCmp, WCons, WExpr,
};
pub use ledger::Ledger;
pub fn builtin_sources() -> [(&'static str, &'static str, &'static str); 2] {
[
("core.bwr", corpus::CORE, corpus::CORE_LEDGER),
("eqsat.bwr", corpus::EQSAT, corpus::EQSAT_LEDGER),
]
}
#[cfg(any(test, feature = "prove"))]
pub(crate) use compile::width_assignments;
#[derive(Clone, Debug, Default)]
#[non_exhaustive]
pub struct CompileOptions {
pub limits: CompileLimits,
}
setters!(CompileOptions {
with_limits: limits: CompileLimits,
});
#[derive(Clone, Debug)]
pub struct RuleProgram {
groups: Vec<Group>,
rules: Arc<[Rule]>,
diagnostics: Vec<Diagnostic>,
}
impl RuleProgram {
pub fn compile(src: &str) -> Result<RuleProgram, CompileError> {
Self::compile_with(src, &CompileOptions::default())
}
pub fn compile_with(src: &str, opts: &CompileOptions) -> Result<RuleProgram, CompileError> {
let (groups, rules, diagnostics) = compile::compile(src, &opts.limits)?;
Ok(RuleProgram {
groups,
rules: rules.into(),
diagnostics,
})
}
pub(crate) fn compile_trusted(src: &str) -> Result<RuleProgram, CompileError> {
let (groups, rules, diagnostics) = compile::compile_trusted(src)?;
Ok(RuleProgram {
groups,
rules: rules.into(),
diagnostics,
})
}
pub fn rules(&self) -> &[Rule] {
&self.rules
}
pub(crate) fn shared_rules(&self) -> &Arc<[Rule]> {
&self.rules
}
pub fn groups(&self) -> &[Group] {
&self.groups
}
pub fn rule(&self, name: &str) -> Option<&Rule> {
self.rules.iter().find(|r| r.name == name)
}
pub fn diagnostics(&self) -> &[Diagnostic] {
&self.diagnostics
}
}