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}