Skip to main content

wave_compiler/driver/
config.rs

1// Copyright 2026 Ojima Abraham
2// SPDX-License-Identifier: Apache-2.0
3
4//! Compiler configuration: optimization level, target parameters, and debug flags.
5//!
6//! Controls how the compiler behaves during compilation, including which
7//! optimization passes to run and what target constraints to enforce.
8
9/// Optimization level.
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum OptLevel {
12    /// No optimizations.
13    O0,
14    /// Basic optimizations.
15    O1,
16    /// Standard optimizations.
17    O2,
18    /// Aggressive optimizations.
19    O3,
20}
21
22impl OptLevel {
23    /// Parse an optimization level from a string.
24    #[must_use]
25    pub fn from_str_opt(s: &str) -> Option<Self> {
26        match s {
27            "0" | "O0" => Some(Self::O0),
28            "1" | "O1" => Some(Self::O1),
29            "2" | "O2" => Some(Self::O2),
30            "3" | "O3" => Some(Self::O3),
31            _ => None,
32        }
33    }
34}
35
36/// Source language of the input file.
37#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38pub enum Language {
39    /// Python source.
40    Python,
41    /// Rust source.
42    Rust,
43    /// C/C++ source.
44    Cpp,
45    /// TypeScript source.
46    TypeScript,
47}
48
49impl Language {
50    /// Parse a language from a string.
51    #[must_use]
52    pub fn from_str_opt(s: &str) -> Option<Self> {
53        match s.to_lowercase().as_str() {
54            "python" | "py" => Some(Self::Python),
55            "rust" | "rs" => Some(Self::Rust),
56            "cpp" | "c++" | "c" => Some(Self::Cpp),
57            "typescript" | "ts" | "javascript" | "js" => Some(Self::TypeScript),
58            _ => None,
59        }
60    }
61}
62
63/// Compiler configuration.
64#[derive(Debug, Clone)]
65pub struct CompilerConfig {
66    /// Source language.
67    pub language: Language,
68    /// Optimization level.
69    pub opt_level: OptLevel,
70    /// Maximum registers for allocation.
71    pub max_registers: u32,
72    /// Wave width (SIMD lanes).
73    pub wave_width: u32,
74    /// Whether to dump HIR.
75    pub dump_hir: bool,
76    /// Whether to dump MIR.
77    pub dump_mir: bool,
78    /// Whether to dump LIR.
79    pub dump_lir: bool,
80}
81
82impl Default for CompilerConfig {
83    fn default() -> Self {
84        Self {
85            language: Language::Python,
86            opt_level: OptLevel::O0,
87            max_registers: 256,
88            wave_width: 32,
89            dump_hir: false,
90            dump_mir: false,
91            dump_lir: false,
92        }
93    }
94}
95
96#[cfg(test)]
97mod tests {
98    use super::*;
99
100    #[test]
101    fn test_opt_level_parse() {
102        assert_eq!(OptLevel::from_str_opt("0"), Some(OptLevel::O0));
103        assert_eq!(OptLevel::from_str_opt("O2"), Some(OptLevel::O2));
104        assert_eq!(OptLevel::from_str_opt("3"), Some(OptLevel::O3));
105        assert_eq!(OptLevel::from_str_opt("invalid"), None);
106    }
107
108    #[test]
109    fn test_language_parse() {
110        assert_eq!(Language::from_str_opt("python"), Some(Language::Python));
111        assert_eq!(Language::from_str_opt("py"), Some(Language::Python));
112        assert_eq!(Language::from_str_opt("rust"), Some(Language::Rust));
113        assert_eq!(Language::from_str_opt("cpp"), Some(Language::Cpp));
114        assert_eq!(Language::from_str_opt("ts"), Some(Language::TypeScript));
115        assert_eq!(Language::from_str_opt("unknown"), None);
116    }
117
118    #[test]
119    fn test_default_config() {
120        let config = CompilerConfig::default();
121        assert_eq!(config.language, Language::Python);
122        assert_eq!(config.opt_level, OptLevel::O0);
123        assert_eq!(config.max_registers, 256);
124        assert_eq!(config.wave_width, 32);
125    }
126}