sim_lib_interference_runtime/
lib_impl.rs1use 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
15pub fn interference_lib_symbol() -> Symbol {
17 Symbol::qualified("sim", "interference")
18}
19
20#[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}