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.access" {} // TODO: figure out if `protection` is interesting/important for us //test "register.reset_value" {} //test "register.reset_mask" {}