//! TirGraph โ€” graph representation of TIR for GNN encoding.
//!
//! Converts a flat `Vec<TIROp>` into a graph with typed edges:
//! - DataDep: producer->consumer via abstract stack simulation
//! - ControlFlow: sequential and branch edges
//! - MemOrder: conservative ordering between memory operations

mod builder;
pub mod node;
mod tests;
pub mod types;

// Re-export all public types at module level for backward compatibility.
pub use node::{TirNode, NODE_FEATURE_DIM};
pub use types::{EdgeKind, FieldType, OpKind, NUM_OP_KINDS};

use crate::ir::tir::TIROp;

/// Graph representation of TIR operations.
#[derive(Debug, Clone)]
pub struct TirGraph {
    pub nodes: Vec<TirNode>,
    pub edges: Vec<(usize, usize, EdgeKind)>,
}

impl TirGraph {
    /// Build a TirGraph from a flat sequence of TIR operations.
    ///
    /// Flattens structural ops (IfElse bodies, Loop bodies) into
    /// a single node list, adding appropriate control flow edges.
    pub fn from_tir_ops(ops: &[TIROp]) -> Self {
        let mut nodes = Vec::new();
        let mut edges = Vec::new();

        // Flatten ops into nodes, recursing into structural bodies
        builder::flatten_ops(ops, &mut nodes, &mut edges);

        // Extract DataDep edges via abstract stack simulation
        builder::extract_data_deps(&nodes, &mut edges);

        // Extract MemOrder edges (conservative pairwise ordering)
        builder::extract_mem_order(&nodes, &mut edges);

        TirGraph { nodes, edges }
    }

    /// Number of nodes.
    pub fn num_nodes(&self) -> usize {
        self.nodes.len()
    }

    /// Number of edges.
    pub fn num_edges(&self) -> usize {
        self.edges.len()
    }

    /// Count edges of a specific kind.
    pub fn count_edges(&self, kind: EdgeKind) -> usize {
        self.edges.iter().filter(|(_, _, k)| *k == kind).count()
    }
}

Dimensions

trident/src/diagnostic/mod.rs
trident/src/ir/mod.rs
trident/src/deploy/mod.rs
trident/src/syntax/mod.rs
trident/src/api/mod.rs
nebu/rs/extension/mod.rs
optica/src/render/mod.rs
trident/src/config/mod.rs
trident/src/field/mod.rs
trident/src/cli/mod.rs
optica/src/parser/mod.rs
trident/src/neural/mod.rs
trident/src/cost/mod.rs
trident/src/typecheck/mod.rs
optica/src/server/mod.rs
trident/src/package/mod.rs
optica/src/scanner/mod.rs
optica/src/output/mod.rs
trident/src/verify/mod.rs
optica/src/graph/mod.rs
trident/src/ast/mod.rs
trident/src/lsp/mod.rs
trident/src/runtime/mod.rs
trident/src/gpu/mod.rs
optica/src/query/mod.rs
trident/src/lsp/semantic/mod.rs
trident/src/verify/equiv/mod.rs
trident/src/package/hash/mod.rs
trident/src/neural/training/mod.rs
trident/src/verify/synthesize/mod.rs
trident/src/ir/tir/mod.rs
rs/macros/src/addressed/mod.rs
trident/src/package/registry/mod.rs
rs/rsc/src/lints/mod.rs
trident/src/verify/report/mod.rs
trident/src/config/resolve/mod.rs
trident/src/verify/solve/mod.rs
rs/macros/src/registers/mod.rs
trident/src/verify/smt/mod.rs
rs/macros/src/cell/mod.rs
rs/core/src/fixed_point/mod.rs
trident/src/neural/data/mod.rs
rs/core/src/bounded/mod.rs
trident/src/lsp/util/mod.rs
trident/src/typecheck/tests/mod.rs
trident/src/neural/model/mod.rs
trident/src/cost/stack_verifier/mod.rs
trident/src/syntax/grammar/mod.rs
trident/src/package/manifest/mod.rs
trident/src/syntax/parser/mod.rs
trident/src/ir/kir/mod.rs
trident/src/neural/inference/mod.rs
trident/src/syntax/lexer/mod.rs
trident/src/cost/model/mod.rs
trident/src/ir/lir/mod.rs
trident/src/syntax/format/mod.rs
trident/src/config/scaffold/mod.rs
trident/src/verify/sym/mod.rs
trident/src/api/tests/mod.rs
trident/src/package/store/mod.rs
trident/src/ir/tree/mod.rs
trident/src/ir/kir/lower/mod.rs
trident/src/ir/lir/lower/mod.rs
trident/src/ir/tir/lower/mod.rs
trident/src/ir/tir/builder/mod.rs
trident/src/ir/tir/neural/mod.rs
trident/src/syntax/parser/tests/mod.rs
cw-cyber/packages/cyber-std/src/tokenfactory/mod.rs
trident/src/ir/tree/lower/mod.rs
trident/src/ir/tir/stack/mod.rs
cw-cyber/contracts/cybernet/src/tests/mod.rs
trident/src/ir/tir/optimize/mod.rs

Local Graph