Skip to main content

pedalkernel_layout/
lib.rs

1// Pre-existing lint suppressions for technical debt in this crate.
2#![allow(dead_code)]
3#![allow(unused_variables)]
4#![allow(unused_mut)]
5#![allow(unused_imports)]
6#![allow(clippy::too_many_arguments)]
7#![allow(clippy::type_complexity)]
8#![allow(clippy::needless_range_loop)]
9#![allow(clippy::redundant_closure)]
10#![allow(clippy::unnecessary_map_or)]
11#![allow(clippy::collapsible_if)]
12#![allow(clippy::for_kv_map)]
13#![allow(clippy::write_literal)]
14#![allow(clippy::redundant_field_names)]
15#![allow(clippy::single_match)]
16#![allow(clippy::needless_borrows_for_generic_args)]
17#![allow(clippy::manual_map)]
18//! Automatic schematic layout engine for PedalKernel `.pedal` circuits.
19//!
20//! Converts a parsed [`pedalkernel::dsl::PedalDef`] into a positioned layout
21//! suitable for:
22//!
23//! 1. **Plugin UI** — real-time signal flow visualization with monitor-driven glow
24//! 2. **KiCad export** — properly placed `.kicad_sch` files for PCB design
25//!
26//! # Pipeline
27//!
28//! ```text
29//! PedalDef
30//!   → LayoutGraph        (directed graph with pin-direction inference)
31//!   → FunctionalGroups   (gain stages, tone stacks, push-pull, etc.)
32//!   → Column assignment  (Sugiyama layering for left-to-right signal flow)
33//!   → Vertical placement (supply → signal path → ground convention)
34//!   → Wire routing       (orthogonal Manhattan paths)
35//!   → Optimization       (crossing minimization, grid snap, symmetry)
36//!   → Layout             (JSON-serializable output)
37//! ```
38
39pub mod graph;
40pub mod groups;
41pub mod kicad;
42pub mod layering;
43pub mod optimize;
44pub mod placement;
45pub mod routing;
46pub mod symbols;
47pub mod types;
48
49use pedalkernel::dsl::PedalDef;
50use types::Layout;
51
52/// Generate a complete schematic layout from a parsed pedal definition.
53///
54/// This is the main entry point. It runs all six layout phases and returns
55/// a [`Layout`] that can be serialized to `.pedal_layout` JSON or exported
56/// to KiCad `.kicad_sch` format.
57pub fn generate_layout(pedal: &PedalDef, width: f32, height: f32) -> Layout {
58    // Phase 1: Build directed graph from netlist
59    let lg = graph::LayoutGraph::from_pedal(pedal);
60
61    // Phase 2: Detect functional groups
62    let groups = groups::detect_groups(&lg);
63
64    // Phase 3: Assign columns via Sugiyama layering
65    let columns = layering::assign_columns(&lg, &groups);
66
67    // Phase 4: Vertical placement within columns
68    let mut layout = placement::place_components(&lg, &groups, &columns, width, height);
69
70    // Phase 5: Route wires
71    routing::route_wires(&mut layout, &lg);
72
73    // Phase 6: Aesthetic optimization
74    optimize::optimize_layout(&mut layout);
75
76    layout
77}
78
79/// Serialize a layout to `.pedal_layout` JSON format.
80pub fn to_json(layout: &Layout) -> String {
81    serde_json::to_string_pretty(layout).expect("layout serialization should not fail")
82}
83
84/// Export a layout to KiCad `.kicad_sch` schematic format.
85pub fn to_kicad_schematic(layout: &Layout, pedal: &PedalDef) -> String {
86    kicad::export_kicad_schematic(layout, pedal)
87}