1#![warn(missing_docs)]
2
3pub mod instructions;
9pub mod program;
11
12use crate::{instructions::SassInstruction, program::SassProgram};
13use gaia_types::Result;
14
15pub struct SassWriter {}
17
18impl SassWriter {
19 pub fn new() -> Self {
21 Self {}
22 }
23
24 pub fn write(&self, program: &SassProgram) -> Result<Vec<u8>> {
32 let mut code = String::new();
33 for kernel in &program.kernels {
34 code.push_str(&format!(".section .text.{}\n.global {}\n{}:\n", kernel.name, kernel.name, kernel.name));
35 for inst in &kernel.instructions {
36 code.push_str(" ");
37 code.push_str(&self.format_instruction(inst));
38 code.push('\n');
39 }
40 }
41
42 let mut binary = Vec::from("\x7fELF".as_bytes());
44 binary.extend_from_slice(code.as_bytes());
45 Ok(binary)
46 }
47
48 fn format_instruction(&self, inst: &SassInstruction) -> String {
56 match inst {
57 SassInstruction::FAdd { dst, src0, src1 } => format!("FADD {}, {}, {}", dst, src0, src1),
58 SassInstruction::FMul { dst, src0, src1 } => format!("FMUL {}, {}, {}", dst, src0, src1),
59 SassInstruction::Imma { dst, src0, src1, src2 } => {
60 format!("IMMA.16.16.16.F32 {}, {}, {}, {}", dst, src0, src1, src2)
61 }
62 SassInstruction::Ldg { dst, addr } => format!("LDG.E {}, [{}]", dst, addr),
63 SassInstruction::Stg { addr, src } => format!("STG.E [{}], {}", addr, src),
64 SassInstruction::Exit => "EXIT".to_string(),
65 SassInstruction::Nop => "NOP".to_string(),
66 }
67 }
68}