ptx-90-parser 0.1.0

Parse NVIDIA PTX 9.0 assembly into a structured AST and explore modules via a CLI.
Documentation
use ptx_parser::{parse, ModuleDirective, ModuleDirectiveKind, ModuleVariableDirective};

#[test]
fn parses_module_headers() {
    let source = ".version 7.1\n.target sm_80\n.address_size 64\n";
    let module = parse(source).expect("module headers should parse");

    assert!(matches!(
        module.directives.as_slice(),
        [
            ModuleDirective::Module(ModuleDirectiveKind::Version(version)),
            ModuleDirective::Module(ModuleDirectiveKind::Target(_)),
            ModuleDirective::Module(ModuleDirectiveKind::AddressSize(size))
        ] if version.major == 7 && version.minor == 1 && size.size == 64
    ));
}

#[test]
fn parses_multiple_module_variables() {
    let source = ".global .u32 g0;\n.shared .align 16 .u8 s0[4];\n";
    let module = parse(source).expect("module variables should parse");

    assert!(module.directives.iter().any(|directive| matches!(
        directive,
        ModuleDirective::ModuleVariable(ModuleVariableDirective::Global(var))
            if var.name == "g0"
    )));
    assert!(module.directives.iter().any(|directive| matches!(
        directive,
        ModuleDirective::ModuleVariable(ModuleVariableDirective::Shared(var))
            if var.name == "s0"
    )));
}

#[test]
fn rejects_empty_module() {
    let module = parse("").expect("empty module should parse");
    assert!(module.directives.is_empty());
}