Skip to main content

sim_lib_interference_runtime/
lib_impl.rs

1//! Loadable interference runtime library.
2
3use std::sync::Arc;
4
5use sim_kernel::{
6    AbiVersion, Dependency, Export, Lib, LibManifest, LibTarget, Linker, Result, Symbol, Version,
7};
8
9use crate::{
10    ReferenceStudySolver, SolverProvider,
11    ops::{function_symbols, runtime_functions},
12    study_solver_symbol,
13};
14
15/// Stable library symbol for the runtime interference operations.
16pub fn interference_lib_symbol() -> Symbol {
17    Symbol::qualified("sim", "interference")
18}
19
20/// Loadable interference runtime operations and default CPU solver.
21#[derive(Clone, Copy, Debug, Default)]
22pub struct InterferenceLib;
23
24impl Lib for InterferenceLib {
25    fn manifest(&self) -> LibManifest {
26        LibManifest {
27            id: interference_lib_symbol(),
28            version: Version(env!("CARGO_PKG_VERSION").to_owned()),
29            abi: AbiVersion { major: 0, minor: 1 },
30            target: LibTarget::HostRegistered,
31            requires: vec![Dependency {
32                id: Symbol::qualified("sim", "interference-records"),
33                minimum_version: None,
34            }],
35            capabilities: Vec::new(),
36            exports: std::iter::once(Export::Value {
37                symbol: study_solver_symbol(),
38            })
39            .chain(
40                function_symbols()
41                    .into_iter()
42                    .map(|symbol| Export::Function {
43                        symbol,
44                        function_id: None,
45                    }),
46            )
47            .collect(),
48        }
49    }
50
51    fn load(&self, cx: &mut sim_kernel::LoadCx, linker: &mut Linker<'_>) -> Result<()> {
52        linker.value(
53            study_solver_symbol(),
54            SolverProvider::new(Arc::new(ReferenceStudySolver)).into_value()?,
55        )?;
56        for (symbol, function) in runtime_functions(cx) {
57            linker.function_value(symbol, cx.factory().opaque(Arc::new(function))?)?;
58        }
59        Ok(())
60    }
61}