mirror of
https://github.com/ParkerTenBroeck/hdl_sim.git
synced 2026-06-06 21:24:06 -04:00
42 lines
1 KiB
Rust
42 lines
1 KiB
Rust
use std::path::Path;
|
|
|
|
use tokio::process::{Child, ChildStderr, ChildStdin, ChildStdout, Command};
|
|
|
|
pub struct Process {
|
|
pub child: Child,
|
|
pub stdin: ChildStdin,
|
|
pub stdout: ChildStdout,
|
|
pub stderr: ChildStderr,
|
|
}
|
|
|
|
pub async fn run(artifact_dir: &Path) -> Result<Process, Box<dyn std::error::Error + Send + Sync>> {
|
|
let mut cmd = Command::new("ghdl");
|
|
cmd.args([
|
|
"-r",
|
|
"--std=08",
|
|
"tb",
|
|
"--stop-delta=4294967296",
|
|
"--unbuffered",
|
|
"--",
|
|
]);
|
|
cmd.args(std::env::args_os());
|
|
cmd.current_dir(artifact_dir);
|
|
cmd.kill_on_drop(true);
|
|
|
|
cmd.stdin(std::process::Stdio::piped())
|
|
.stdout(std::process::Stdio::piped())
|
|
.stderr(std::process::Stdio::piped());
|
|
|
|
let mut child = cmd.spawn()?;
|
|
|
|
let stdin = child.stdin.take().ok_or("no stdin")?;
|
|
let stdout = child.stdout.take().ok_or("no stdout")?;
|
|
let stderr = child.stderr.take().ok_or("no stderr")?;
|
|
|
|
Ok(Process {
|
|
child,
|
|
stdin,
|
|
stdout,
|
|
stderr,
|
|
})
|
|
}
|