use crate::{
backends::{Backend, GeneratedFiles},
config::GaiaConfig,
instruction::{DomainInstruction, GaiaInstruction},
program::{GaiaModule, GaiaTerminator},
};
use gaia_types::{
helpers::{AbiCompatible, ApiCompatible, Architecture, ArtifactType, CompilationTarget},
neural::NeuralNode,
Result,
};
use gcn_assembler::{
instructions::{GcnInstruction, GcnReg},
program::{GcnKernel, GcnProgram},
GcnWriter,
};
use std::collections::HashMap;
pub struct GcnBackend {
writer: GcnWriter,
}
impl GcnBackend {
pub fn new() -> Self {
Self { writer: GcnWriter::new() }
}
}
impl Backend for GcnBackend {
fn name(&self) -> &'static str {
"AMD GCN"
}
fn primary_target(&self) -> CompilationTarget {
CompilationTarget { build: Architecture::GCN, host: AbiCompatible::GCN, target: ApiCompatible::Unknown }
}
fn artifact_type(&self) -> ArtifactType {
ArtifactType::Executable
}
fn match_score(&self, target: &CompilationTarget) -> f32 {
if target.build == Architecture::GCN {
return 100.0;
}
0.0
}
fn generate(&self, program: &GaiaModule, config: &GaiaConfig) -> Result<GeneratedFiles> {
let mut files = HashMap::new();
let gcn_program = convert_gaia_to_gcn(program)?;
let binary = self.writer.write(&gcn_program)?;
files.insert("kernel.bin".to_string(), binary);
Ok(GeneratedFiles { artifact_type: ArtifactType::Executable, files, custom: None, diagnostics: vec![] })
}
}
fn convert_gaia_to_gcn(program: &GaiaModule) -> Result<GcnProgram> {
Ok(GcnProgram { name: program.name.clone(), kernels: vec![] })
}