wave_compiler/driver/
config.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum OptLevel {
12 O0,
14 O1,
16 O2,
18 O3,
20}
21
22impl OptLevel {
23 #[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#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38pub enum Language {
39 Python,
41 Rust,
43 Cpp,
45 TypeScript,
47}
48
49impl Language {
50 #[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#[derive(Debug, Clone)]
65pub struct CompilerConfig {
66 pub language: Language,
68 pub opt_level: OptLevel,
70 pub max_registers: u32,
72 pub wave_width: u32,
74 pub dump_hir: bool,
76 pub dump_mir: bool,
78 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}