use alloc::{vec::Vec, string::String};
#[cfg(feature = "serde")]
use serde::{Serialize, Deserialize};
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum ExecutionMode {
Sequential,
Parallel,
Pipeline,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ExecutionStep {
pub net_index: usize,
pub net_id: String,
pub net_type: String,
pub is_routing: bool,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ExecutionPlan {
pub steps: Vec<ExecutionStep>,
pub mode: ExecutionMode,
}
impl ExecutionPlan {
pub fn new(steps: Vec<ExecutionStep>, mode: ExecutionMode) -> Self {
Self { steps, mode }
}
pub fn is_empty(&self) -> bool {
self.steps.is_empty()
}
pub fn len(&self) -> usize {
self.steps.len()
}
pub fn is_parallel(&self) -> bool {
matches!(self.mode, ExecutionMode::Parallel)
}
pub fn is_sequential(&self) -> bool {
matches!(self.mode, ExecutionMode::Sequential)
}
pub fn routing_steps(&self) -> Vec<&ExecutionStep> {
self.steps.iter()
.filter(|step| step.is_routing)
.collect()
}
pub fn processing_steps(&self) -> Vec<&ExecutionStep> {
self.steps.iter()
.filter(|step| !step.is_routing)
.collect()
}
pub fn estimated_cost(&self) -> u64 {
self.steps.iter()
.map(|step| if step.is_routing { 1000 } else { 10000 })
.sum()
}
}