use super::*;
use crate::host::accelerator::Accelerator;
#[no_mangle]
pub extern "C" fn dqcs_sim_new(scfg: dqcs_handle_t) -> dqcs_handle_t {
api_return(0, || {
take!(scfg as SimulatorConfiguration);
API_STATE.with(|state| state.borrow().thread_locals_assert_free())?;
let sim = Simulator::new(scfg)?;
let sim = insert(sim);
API_STATE.with(|state| state.borrow_mut().thread_locals_claim(sim).unwrap());
Ok(sim)
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_start(sim: dqcs_handle_t, data: dqcs_handle_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(sim as &mut Simulator);
resolve!(data as pending ArbData);
let data_ob = {
let x: &ArbData = data.as_ref().unwrap();
x.clone()
};
sim.simulation.start(data_ob)?;
delete!(resolved data);
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_wait(sim: dqcs_handle_t) -> dqcs_handle_t {
api_return(0, || {
resolve!(sim as &mut Simulator);
Ok(insert(sim.simulation.wait()?))
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_send(sim: dqcs_handle_t, data: dqcs_handle_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(sim as &mut Simulator);
resolve!(data as pending ArbData);
let data_ob = {
let x: &ArbData = data.as_ref().unwrap();
x.clone()
};
sim.simulation.send(data_ob)?;
delete!(resolved data);
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_recv(sim: dqcs_handle_t) -> dqcs_handle_t {
api_return(0, || {
resolve!(sim as &mut Simulator);
Ok(insert(sim.simulation.recv()?))
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_yield(sim: dqcs_handle_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(sim as &mut Simulator);
sim.simulation.yield_to_accelerator()?;
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_arb(
sim: dqcs_handle_t,
name: *const c_char,
cmd: dqcs_handle_t,
) -> dqcs_handle_t {
api_return(0, || {
resolve!(sim as &mut Simulator);
resolve!(cmd as pending ArbCmd);
clone!(cmd_ob: ArbCmd = resolved cmd);
let data = sim.simulation.arb(receive_str(name)?, cmd_ob)?;
delete!(resolved cmd);
Ok(insert(data))
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_arb_idx(
sim: dqcs_handle_t,
index: ssize_t,
cmd: dqcs_handle_t,
) -> dqcs_handle_t {
api_return(0, || {
resolve!(sim as &mut Simulator);
resolve!(cmd as pending ArbCmd);
clone!(cmd_ob: ArbCmd = resolved cmd);
let data = sim.simulation.arb_idx(index, cmd_ob)?;
delete!(resolved cmd);
Ok(insert(data))
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_get_name(sim: dqcs_handle_t, name: *const c_char) -> *mut c_char {
api_return_string(|| {
resolve!(sim as &Simulator);
Ok(sim
.simulation
.get_metadata(receive_str(name)?)?
.get_name()
.to_string())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_get_name_idx(sim: dqcs_handle_t, index: ssize_t) -> *mut c_char {
api_return_string(|| {
resolve!(sim as &Simulator);
Ok(sim
.simulation
.get_metadata_idx(index)?
.get_name()
.to_string())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_get_author(sim: dqcs_handle_t, name: *const c_char) -> *mut c_char {
api_return_string(|| {
resolve!(sim as &Simulator);
Ok(sim
.simulation
.get_metadata(receive_str(name)?)?
.get_author()
.to_string())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_get_author_idx(sim: dqcs_handle_t, index: ssize_t) -> *mut c_char {
api_return_string(|| {
resolve!(sim as &Simulator);
Ok(sim
.simulation
.get_metadata_idx(index)?
.get_author()
.to_string())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_get_version(sim: dqcs_handle_t, name: *const c_char) -> *mut c_char {
api_return_string(|| {
resolve!(sim as &Simulator);
Ok(sim
.simulation
.get_metadata(receive_str(name)?)?
.get_version()
.to_string())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_get_version_idx(sim: dqcs_handle_t, index: ssize_t) -> *mut c_char {
api_return_string(|| {
resolve!(sim as &Simulator);
Ok(sim
.simulation
.get_metadata_idx(index)?
.get_version()
.to_string())
})
}
#[no_mangle]
pub extern "C" fn dqcs_sim_write_reproduction_file(
sim: dqcs_handle_t,
filename: *const c_char,
) -> dqcs_return_t {
api_return_none(|| {
resolve!(sim as &Simulator);
sim.simulation
.write_reproduction_file(receive_str(filename)?)
})
}