From 6395efbeab06d50f7930f5e15419e84c22cde7cb Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 22:09:11 +0100 Subject: [PATCH] chore: extract id stuff into its own file --- crates/ir/src/id.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++ crates/ir/src/lib.rs | 46 +-------------------------------- 2 files changed, 62 insertions(+), 45 deletions(-) create mode 100644 crates/ir/src/id.rs diff --git a/crates/ir/src/id.rs b/crates/ir/src/id.rs new file mode 100644 index 0000000..1991b27 --- /dev/null +++ b/crates/ir/src/id.rs @@ -0,0 +1,61 @@ +//! Instance identification for instructions and their glue. +//! +//! Instructions as defined in [`crate::instruction::Kind`] and descendants are very useful, +//! but they cannot be directly used as vertices in the graph IR, +//! as there may easily be multiple instructions of the same kind in the same program. +//! +//! Instead, this module offers an alternative way to refer to specific instances: +//! +//! - [`Instruction`]s are referred to as their **byte [`Span`]s** in the source code, +//! so effectively where they are written in the source code. +//! (Or if coming from [`crate::semi_human::GraphIr`], +//! it's just a fictional number floating in space.) +//! - [`Socket`]s contain +//! - what [`Instruction`] they belong to +//! - which index they occupy on it +//! +//! The distinction between [`Input`] and [`Output`] is implemented +//! as them being different types. + +use serde::{Deserialize, Serialize}; + +use crate::Span; + +/// One specific instruction, and where it is found in code. +/// +/// It does **not** contain what kind of instruction this is. +/// Refer to [`crate::instruction::Kind`] for this instead. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Instruction(pub(super) Span); + +impl Instruction { + /// Where this instruction is written down. + #[must_use] + pub fn span(&self) -> &Span { + &self.0 + } +} + +/// On an **instruction**, accepts incoming data. +/// +/// An **instruction** cannot run if any of these are not connected. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Input(pub(super) Socket); + +/// On an **instruction**, returns outgoing data to be fed to [`Input`]s. +/// +/// In contrast to [`Input`]s, [`Output`]s may be used or unused. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Output(pub(super) Socket); + +/// An unspecified socket on a specific **instruction**, +/// and where it is on that **instruction**. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Socket { + pub belongs_to: Instruction, + pub idx: SocketIdx, +} + +/// Where a [`Socket`] is on an **instruction**. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct SocketIdx(pub u16); diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index 034e6d2..28aebf2 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -2,6 +2,7 @@ use std::ops::RangeInclusive; use serde::{Deserialize, Serialize}; +pub mod id; pub mod instruction; // feel free to make this public if there's sufficient reason to do so @@ -70,51 +71,6 @@ pub struct GraphIr { rev_edges: Map>, } -pub mod id { - use serde::{Deserialize, Serialize}; - - use crate::Span; - - /// One specific instruction, and where it is found in code. - /// - /// It does **not** contain what kind of instruction this is. - /// Refer to [`crate::instruction::Kind`] for this instead. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Instruction(pub(super) Span); - - impl Instruction { - /// Where this instruction is written down. - #[must_use] - pub fn span(&self) -> &Span { - &self.0 - } - } - - /// On an **instruction**, accepts incoming data. - /// - /// An **instruction** cannot run if any of these are not connected. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Input(pub(super) Socket); - - /// On an **instruction**, returns outgoing data to be fed to [`Input`]s. - /// - /// In contrast to [`Input`]s, [`Output`]s may be used or unused. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Output(pub(super) Socket); - - /// An unspecified socket on a specific **instruction**, - /// and where it is on that **instruction**. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Socket { - pub belongs_to: Instruction, - pub idx: SocketIdx, - } - - /// Where a [`Socket`] is on an **instruction**. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct SocketIdx(pub u16); -} - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] pub struct Span { range: RangeInclusive,