use std::{collections::HashMap, time::Duration};
use rtlola_frontend::mir::{self};
use super::{OutputReference, StreamReference};
#[derive(Debug, Clone)]
pub struct StaticSchedule {
pub hyper_period: Duration,
pub deadlines: Vec<Deadline>,
}
#[derive(Debug, Clone)]
pub struct Deadline {
pub pause: Duration,
pub due: Vec<Task>,
}
#[derive(Debug, Clone, Copy)]
pub enum Task {
Spawn(OutputReference),
Eval(OutputReference),
Close(OutputReference),
}
impl StaticSchedule {
pub(crate) fn new(
mir_schedule: mir::Schedule,
sr2sr: &HashMap<mir::StreamReference, StreamReference>,
) -> Option<Self> {
let mir::Schedule {
hyper_period,
deadlines,
} = mir_schedule;
let hyper_period = hyper_period?;
let deadlines = deadlines
.into_iter()
.map(|deadline| Deadline::from_mir_dl(deadline, sr2sr))
.collect();
Some(Self {
hyper_period,
deadlines,
})
}
}
impl Deadline {
fn from_mir_dl(
dl: mir::Deadline,
sr2sr: &HashMap<mir::StreamReference, StreamReference>,
) -> Deadline {
let mir::Deadline { pause, due } = dl;
let due = due
.into_iter()
.map(|task| Task::from_mir_task(task, sr2sr))
.collect();
Self { pause, due }
}
}
impl Task {
fn from_mir_task(
mir_task: mir::Task,
sr2sr: &HashMap<mir::StreamReference, StreamReference>,
) -> Task {
match mir_task {
mir::Task::Evaluate(sr) => Task::Eval(sr2sr[&mir::StreamReference::Out(sr)].out_idx()),
mir::Task::Spawn(sr) => Task::Spawn(sr2sr[&mir::StreamReference::Out(sr)].out_idx()),
mir::Task::Close(sr) => Task::Close(sr2sr[&mir::StreamReference::Out(sr)].out_idx()),
}
}
}