1use std::sync::Arc;
4
5use morok_ir::{Op, UOp};
6
7pub fn collect_buffers_and_vars(root: &Arc<UOp>) -> (Vec<Arc<UOp>>, Vec<Arc<UOp>>) {
15 let nodes = root.toposort();
16
17 let mut buffers = Vec::new();
19 for node in &nodes {
20 match node.op() {
21 Op::Buffer { .. } | Op::DefineGlobal(_) | Op::DefineLocal(_) => {
22 buffers.push(node.clone());
23 }
24 _ => {}
25 }
26 }
27
28 buffers.sort_by_key(|b| match b.op() {
30 Op::DefineGlobal(id) => *id as u64,
31 Op::DefineLocal(id) => (*id as u64) + (1u64 << 32),
32 Op::Buffer { .. } => b.id + (1u64 << 48),
33 _ => b.id,
34 });
35
36 let mut variables = Vec::new();
38 for node in &nodes {
39 if matches!(node.op(), Op::DefineVar { .. }) {
40 variables.push(node.clone());
41 }
42 }
43
44 variables.sort_by_key(|v| if let Op::DefineVar { name, .. } = v.op() { name.clone() } else { String::new() });
46
47 (buffers, variables)
48}