const std = @import("std"); const xml = @import("xml"); const Database = @import("Database"); const allocator = std.testing.allocator; const expectEqual = std.testing.expectEqual; const Access = Database.Access; pub fn initDbFromSvd(text: []const u8) !Database { const doc: *xml.Doc = try xml.readFromMemory(text); defer xml.freeDoc(doc); return try Database.initFromSvd(allocator, doc); } test "cmsis example" { var db = try initDbFromSvd(@embedFile("svd/cmsis-example.svd")); defer db.deinit(); // CPU is not populated in this svd file try expectEqual(@as(@TypeOf(db.cpu), null), db.cpu); } // TODO: is getting the size from the width as a last resort correct? test "register.size from device.size" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 42 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(usize, 42), register.size.?); } test "register.size from device" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 42 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(usize, 42), register.size.?); } test "register.size from peripheral" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ \\ \\ TIMER0 \\ 0x40010000 \\ 42 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(usize, 42), register.size.?); } test "register.size from cluster" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ bruh \\ 42 \\ 0x0 \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(usize, 42), register.size.?); } test "register.size from nested cluster" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ bruh \\ 0x0 \\ \\ bruh2 \\ 0x0 \\ 42 \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(usize, 42), register.size.?); } test "register.size from register" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ 42 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(usize, 42), register.size.?); } test "register.access from device" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ read-write \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(Access.read_write, register.access.?); } test "register.access from peripheral" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ read-only \\ \\ \\ TIMER0 \\ 0x40010000 \\ read-write \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(Access.read_write, register.access.?); } test "register.access from cluster" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ read-only \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ bruh \\ 0x0 \\ read-write \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(Access.read_write, register.access.?); } test "register.access from nested cluster" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ read-only \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ bruh \\ 0x0 \\ \\ bruh2 \\ 0x0 \\ read-write \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(Access.read_write, register.access.?); } test "register.access from register" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ read-only \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ 42 \\ read-write \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(Access.read_write, register.access.?); } // TODO: determine if assuming read-write by default is okay test "register.access missing" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(Access.read_write, register.access.?); } test "field.access" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ field \\ read-only \\ [0:0] \\ \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); try expectEqual(Access.read_only, db.field_access.get(0).?); } test "register.reset_value from device" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 1 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 1), register.reset_value.?); } test "register.reset_value from peripheral" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 1 \\ \\ \\ TIMER0 \\ 0x40010000 \\ 2 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 2), register.reset_value.?); } test "register.reset_value from cluster" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 1 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ bruh \\ 0x0 \\ 2 \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 2), register.reset_value.?); } test "register.reset_value from nested cluster" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 1 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ bruh \\ 0x0 \\ \\ bruh2 \\ 0x0 \\ 2 \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 2), register.reset_value.?); } test "register.reset_value from register" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 1 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ 42 \\ 2 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 2), register.reset_value.?); } // TODO: determine if assuming 0 by default is okay test "register.reset_value missing" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 0), register.reset_value.?); } test "register.reset_mask from device" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 0xff \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 0xff), register.reset_mask.?); } test "register.reset_mask from peripheral" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 0xff \\ \\ \\ TIMER0 \\ 0x40010000 \\ 0xffff \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 0xffff), register.reset_mask.?); } test "register.reset_mask from cluster" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 0xff \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ bruh \\ 0x0 \\ 0xffff \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 0xffff), register.reset_mask.?); } test "register.reset_mask from nested cluster" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 0xff \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ bruh \\ 0x0 \\ \\ bruh2 \\ 0x0 \\ 0xffff \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 0xffff), register.reset_mask.?); } test "register.reset_mask from register" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ 32 \\ 0xff \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ 42 \\ 0xffff \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, 0xffff), register.reset_mask.?); } // TODO: determine if assuming 0xffffffff by default is okay test "register.reset_mask missing" { var db = try initDbFromSvd( \\ \\ ARMCM3xxx \\ 8 \\ 32 \\ \\ \\ TIMER0 \\ 0x40010000 \\ \\ \\ test \\ 0x0 \\ \\ \\ \\ \\ \\ ); defer db.deinit(); const register_idx = 0; const register = try db.getRegister(register_idx); try expectEqual(@as(u64, std.math.maxInt(u64)), register.reset_mask.?); }