diff --git a/src/runtime2/component/component_pdl.rs b/src/runtime2/component/component_pdl.rs index f53b091dacfa1cb043a387b893c130c36fd55614..011ce9823aeb18f74da57befad141de61da4ef0d 100644 --- a/src/runtime2/component/component_pdl.rs +++ b/src/runtime2/component/component_pdl.rs @@ -24,6 +24,9 @@ pub enum ExecStmt { CreatedChannel((Value, Value)), PerformedPut, PerformedGet(ValueGroup), + PerformedSelectStart, + PerformedSelectRegister, + PerformedSelectWait(u32), None, } @@ -78,6 +81,30 @@ impl RunContext for ExecCtx { _ => unreachable!(), } } + + fn performed_select_start(&mut self) -> bool { + match self.stmt.take() { + ExecStmt::None => return false, + ExecStmt::PerformedSelectStart => return true, + _ => unreachable!(), + } + } + + fn performed_select_register_port(&mut self) -> bool { + match self.stmt.take() { + ExecStmt::None => return false, + ExecStmt::PerformedSelectRegister => return true, + _ => unreachable!(), + } + } + + fn performed_select_wait(&mut self) -> Option { + match self.stmt.take() { + ExecStmt::None => return None, + ExecStmt::PerformedSelectWait(selected_case) => Some(selected_case), + _ => unreachable!(), + } + } } #[derive(Debug, Copy, Clone, PartialEq, Eq)] @@ -245,6 +272,19 @@ impl CompPDL { return Ok(CompScheduling::Immediate); } }, + EC::SelectStart(num_cases, num_ports) => { + debug_assert_eq!(self.mode, Mode::Sync); + todo!("finish handling select start") + }, + EC::SelectRegisterPort(case_index, port_index, port_id) => { + debug_assert_eq!(self.mode, Mode::Sync); + todo!("finish handling register port") + }, + EC::SelectWait => { + debug_assert_eq!(self.mode, Mode::Sync); + self.handle_select_wait(sched_ctx, comp_ctx); + todo!("finish handling select wait") + }, // Results that can be returned outside of sync mode EC::ComponentTerminated => { self.mode = Mode::StartExit; // next call we'll take care of the exit @@ -332,6 +372,13 @@ impl CompPDL { } } + /// Handles the moment where the PDL code has notified the runtime of all + /// the ports it is waiting on. + fn handle_select_wait(&mut self, sched_ctx: &SchedulerCtx, comp_ctx: &mut CompCtx) { + sched_ctx.log("Component waiting for select conclusion"); + + } + fn handle_component_exit(&mut self, sched_ctx: &SchedulerCtx, comp_ctx: &mut CompCtx) { sched_ctx.log("Component exiting"); debug_assert_eq!(self.mode, Mode::StartExit);