From 06f747ca1079af9dc983ef8a070518daf3670eba Mon Sep 17 00:00:00 2001 From: Aaron Councilman <aaronjc4@illinois.edu> Date: Fri, 14 Feb 2025 11:45:31 -0600 Subject: [PATCH] Add strings to scheduling language, add rename --- juno_samples/fork_join_tests/src/cpu.sch | 1 + juno_scheduler/src/compile.rs | 5 +++ juno_scheduler/src/ir.rs | 3 ++ juno_scheduler/src/lang.l | 1 + juno_scheduler/src/lang.y | 5 ++- juno_scheduler/src/pm.rs | 47 +++++++++++++++++------- 6 files changed, 47 insertions(+), 15 deletions(-) diff --git a/juno_samples/fork_join_tests/src/cpu.sch b/juno_samples/fork_join_tests/src/cpu.sch index 4cebc044..7c416e90 100644 --- a/juno_samples/fork_join_tests/src/cpu.sch +++ b/juno_samples/fork_join_tests/src/cpu.sch @@ -15,6 +15,7 @@ cpu(auto.test7); cpu(auto.test8); let test1_cpu = auto.test1; +rename["test1_cpu"](test1_cpu); ip-sroa(*); sroa(*); diff --git a/juno_scheduler/src/compile.rs b/juno_scheduler/src/compile.rs index df72a1a3..0652f8f2 100644 --- a/juno_scheduler/src/compile.rs +++ b/juno_scheduler/src/compile.rs @@ -434,6 +434,11 @@ fn compile_expr( parser::Expr::Boolean { span: _, val } => { Ok(ExprResult::Expr(ir::ScheduleExp::Boolean { val })) } + parser::Expr::String { span } => { + let string = lexer.span_str(span); + let val = string[1..string.len() - 1].to_string(); + Ok(ExprResult::Expr(ir::ScheduleExp::String { val })) + } parser::Expr::Field { span: _, lhs, diff --git a/juno_scheduler/src/ir.rs b/juno_scheduler/src/ir.rs index c495f2a6..e92f1d37 100644 --- a/juno_scheduler/src/ir.rs +++ b/juno_scheduler/src/ir.rs @@ -83,6 +83,9 @@ pub enum ScheduleExp { Boolean { val: bool, }, + String { + val: String, + }, Field { collect: Box<ScheduleExp>, field: String, diff --git a/juno_scheduler/src/lang.l b/juno_scheduler/src/lang.l index 9d4c34bf..afe596b2 100644 --- a/juno_scheduler/src/lang.l +++ b/juno_scheduler/src/lang.l @@ -46,5 +46,6 @@ stop[\t \n\r]+after "stop_after" [a-zA-Z][a-zA-Z0-9_\-]*! "MACRO" [a-zA-Z][a-zA-Z0-9_\-]* "ID" [0-9]+ "INT" +\"[a-zA-Z0-9_\-\s\.]*\" "STRING" . "UNMATCHED" diff --git a/juno_scheduler/src/lang.y b/juno_scheduler/src/lang.y index 9cb72842..584bf2a4 100644 --- a/juno_scheduler/src/lang.y +++ b/juno_scheduler/src/lang.y @@ -1,6 +1,6 @@ %start Schedule -%avoid_insert "ID" "INT" +%avoid_insert "ID" "INT" "STRING" %expect-unused Unmatched 'UNMATCHED' %% @@ -47,6 +47,8 @@ Expr -> Expr { Expr::Boolean { span: $span, val: true } } | 'false' { Expr::Boolean { span: $span, val: false } } + | 'STRING' + { Expr::String { span: $span } } | Expr '.' 'ID' { Expr::Field { span: $span, lhs: Box::new($1), field: span_of_tok($3) } } | Expr '@' 'ID' @@ -155,6 +157,7 @@ pub enum Expr { Variable { span: Span }, Integer { span: Span }, Boolean { span: Span, val: bool }, + String { span: Span }, Field { span: Span, lhs: Box<Expr>, field: Span }, BlockExpr { span: Span, body: Box<OperationList> }, Record { span: Span, fields: Vec<(Span, Expr)> }, diff --git a/juno_scheduler/src/pm.rs b/juno_scheduler/src/pm.rs index 0df691ea..9c51276b 100644 --- a/juno_scheduler/src/pm.rs +++ b/juno_scheduler/src/pm.rs @@ -29,6 +29,7 @@ pub enum Value { Selection { selection: Vec<Value> }, Integer { val: usize }, Boolean { val: bool }, + String { val: String }, } #[derive(Debug, Copy, Clone)] @@ -70,6 +71,9 @@ impl Value { Value::Boolean { .. } => Err(SchedulerError::SemanticError( "Expected labels, found boolean".to_string(), )), + Value::String { .. } => Err(SchedulerError::SemanticError( + "Expected labels, found string".to_string(), + )), } } @@ -99,6 +103,9 @@ impl Value { Value::Boolean { .. } => Err(SchedulerError::SemanticError( "Expected functions, found boolean".to_string(), )), + Value::String { .. } => Err(SchedulerError::SemanticError( + "Expected functions, found string".to_string(), + )), } } @@ -130,6 +137,9 @@ impl Value { Value::Boolean { .. } => Err(SchedulerError::SemanticError( "Expected code locations, found boolean".to_string(), )), + Value::String { .. } => Err(SchedulerError::SemanticError( + "Expected code locations, found string".to_string(), + )), } } } @@ -998,6 +1008,7 @@ fn interp_expr( } ScheduleExp::Integer { val } => Ok((Value::Integer { val: *val }, false)), ScheduleExp::Boolean { val } => Ok((Value::Boolean { val: *val }, false)), + ScheduleExp::String { val } => Ok((Value::String { val: val.clone() }, false)), ScheduleExp::Field { collect, field } => { let (lhs, changed) = interp_expr(pm, collect, stringtab, env, functions)?; match lhs { @@ -1005,7 +1016,8 @@ fn interp_expr( | Value::Selection { .. } | Value::Everything { .. } | Value::Integer { .. } - | Value::Boolean { .. } => Err(SchedulerError::UndefinedField(field.clone())), + | Value::Boolean { .. } + | Value::String { .. } => Err(SchedulerError::UndefinedField(field.clone())), Value::JunoFunction { func } => { match pm.labels.borrow().iter().position(|s| s == field) { None => Err(SchedulerError::UndefinedLabel(field.clone())), @@ -1260,6 +1272,7 @@ fn update_value( Value::Everything {} => Some(Value::Everything {}), Value::Integer { val } => Some(Value::Integer { val }), Value::Boolean { val } => Some(Value::Boolean { val }), + Value::String { val } => Some(Value::String { val }), } } @@ -2193,16 +2206,15 @@ fn run_pass( } Pass::Rename => { assert!(args.len() == 1); - let new_name = - match args[0] { - Value::String { val } => val, - _ => { - return Err(SchedulerError::PassError { - pass: "rename".to_string(), - error: "expected string argument".to_string(), - }); - } - }; + let new_name = match args[0] { + Value::String { ref val } => val.clone(), + _ => { + return Err(SchedulerError::PassError { + pass: "rename".to_string(), + error: "expected string argument".to_string(), + }); + } + }; if pm.functions.iter().any(|f| f.name == new_name) { return Err(SchedulerError::PassError { pass: "rename".to_string(), @@ -2210,8 +2222,9 @@ fn run_pass( }); } - if let Some(funcs) = selection_of_functions(pm, selection) - && funcs.len() == 1 { + if let Some(funcs) = selection_of_functions(pm, selection) + && funcs.len() == 1 + { let func = funcs[0]; pm.functions[func.idx()].name = new_name; } else { @@ -2364,7 +2377,13 @@ fn run_pass( let Some(mut func) = func else { continue; }; - chunk_all_forks_unguarded(&mut func, fork_join_map, *dim_idx, *tile_size, *tile_order); + chunk_all_forks_unguarded( + &mut func, + fork_join_map, + *dim_idx, + *tile_size, + *tile_order, + ); changed |= func.modified(); } pm.delete_gravestones(); -- GitLab