Characterize (#60)

* rename ndjson, add new tool to characterize sets of xml files

* remove some debug logs

* add characterized register schemas
wch-ch32v003
Matt Knight 2 years ago committed by Matt Knight
parent f204d7f42c
commit 2b985fc898

@ -108,18 +108,23 @@ pub fn build(b: *std.build.Builder) !void {
const run_step = b.step("run", "Run the app"); const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step); run_step.dependOn(&run_cmd.step);
const ndjson = b.addExecutable("ndjson", "src/ndjson.zig"); const contextualize_fields = b.addExecutable("contextualize-fields", "src/contextualize-fields.zig");
ndjson.addPackagePath("xml", "src/xml.zig"); regz.xml.link(contextualize_fields);
regz.xml.link(ndjson);
const ndjson_run = ndjson.run(); const contextualize_fields_run = contextualize_fields.run();
ndjson_run.step.dependOn(b.getInstallStep());
if (b.args) |args| { if (b.args) |args| {
ndjson_run.addArgs(args); contextualize_fields_run.addArgs(args);
} }
const ndjson_step = b.step("ndjson", "Run ndjson program"); const contextualize_fields_step = b.step("contextualize-fields", "Create ndjson of all the fields with the context of parent fields");
ndjson_step.dependOn(&ndjson_run.step); contextualize_fields_step.dependOn(&contextualize_fields_run.step);
const characterize = b.addExecutable("characterize", "src/characterize.zig");
regz.xml.link(characterize);
const characterize_run = characterize.run();
const characterize_step = b.step("characterize", "Characterize a number of xml files whose paths are piped into stdin, results are ndjson");
characterize_step.dependOn(&characterize_run.step);
const test_chip_file = regz.addGeneratedChipFile("tests/svd/cmsis-example.svd"); const test_chip_file = regz.addGeneratedChipFile("tests/svd/cmsis-example.svd");

@ -0,0 +1,53 @@
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance.signals.signal","repeated":true,"attrs":{"group":"required","index":"optional","pad":"required","function":"optional","field":"optional","ioset":"optional"}}
{"name":"avr-tools-device-file.modules.module.interrupt-group.interrupt","repeated":true,"attrs":{"index":"required","name":"required","caption":"required"}}
{"name":"avr-tools-device-file.pinouts.pinout","repeated":true,"attrs":{"name":"required","caption":"optional"}}
{"name":"avr-tools-device-file","repeated":false,"attrs":{"schema-version":"required","noNamespaceSchemaLocation":"required"}}
{"name":"avr-tools-device-file.devices.device.property-groups.property-group.property","repeated":true,"attrs":{"value":"required","name":"required","caption":"optional"}}
{"name":"avr-tools-device-file.modules.module.value-group.value","repeated":true,"attrs":{"value":"optional","name":"required","caption":"optional"}}
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance.clock-groups.clock-group.clock","repeated":true,"attrs":{"name":"required","bit":"required"}}
{"name":"avr-tools-device-file.variants.variant","repeated":true,"attrs":{"vccmax":"required","tempmin":"required","package":"required","ordercode":"optional","pinout":"optional","tempmax":"required","speedmax":"required","vccmin":"required"}}
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance.clock-groups.clock-group","repeated":false,"attrs":{"grouporder":"required","name":"required"}}
{"name":"avr-tools-device-file.modules.module.register-group.register","repeated":true,"attrs":{"rw":"optional","name":"required","access-size":"optional","modes":"optional","initval":"optional","size":"optional","access":"optional","mask":"optional","bit-addressable":"optional","atomic-op":"optional","ocd-rw":"optional","caption":"optional","count":"optional","offset":"optional"}}
{"name":"avr-tools-device-file.devices.device.interrupts.interrupt-group","repeated":true,"attrs":{"index":"required","name-in-module":"required","module-instance":"required"}}
{"name":"avr-tools-device-file.devices.device.address-spaces.address-space.memory-segment","repeated":true,"attrs":{"rw":"optional","name":"required","type":"required","size":"required","pagesize":"optional","start":"required","exec":"optional","external":"optional"}}
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance.clock-groups","repeated":false}
{"name":"avr-tools-device-file.devices.device.interrupts.interrupt","repeated":true,"attrs":{"index":"required","name":"required","irq-caption":"optional","alternate-name":"optional","irq-index":"optional","caption":"optional","module-instance":"optional","irq-name":"optional","alternate-caption":"optional"}}
{"name":"avr-tools-device-file.devices.device.parameters","repeated":false}
{"name":"avr-tools-device-file.devices.device.events.users.user","repeated":true,"attrs":{"index":"required","name":"required","module-instance":"required"}}
{"name":"avr-tools-device-file.modules.module.register-group.register.mode","repeated":true,"attrs":{"value":"optional","mask":"optional","name":"required","qualifier":"optional","caption":"optional"}}
{"name":"avr-tools-device-file.devices.device.address-spaces","repeated":false}
{"name":"avr-tools-device-file.devices.device.interfaces.interface.parameters","repeated":false}
{"name":"avr-tools-device-file.devices.device.events.users","repeated":false}
{"name":"avr-tools-device-file.pinouts.pinout.pin","repeated":true,"attrs":{"type":"optional","pad":"required","position":"required"}}
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance","repeated":true,"attrs":{"oldname":"optional","name":"required","caption":"optional"}}
{"name":"avr-tools-device-file.devices.device.interfaces.interface.parameters.param","repeated":false,"attrs":{"value":"required","name":"required"}}
{"name":"avr-tools-device-file.devices.device.interfaces.interface","repeated":true,"attrs":{"name":"required","type":"required"}}
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance.parameters","repeated":false}
{"name":"avr-tools-device-file.devices.device.peripherals","repeated":false}
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance.signals","repeated":false}
{"name":"avr-tools-device-file.pinouts","repeated":true}
{"name":"avr-tools-device-file.devices.device.interrupts","repeated":false}
{"name":"avr-tools-device-file.devices.device.property-groups.property-group","repeated":true,"attrs":{"name":"required"}}
{"name":"avr-tools-device-file.modules.module.register-group.register-group","repeated":true,"attrs":{"name":"required","modes":"optional","size":"optional","name-in-module":"required","caption":"optional","count":"optional","start-index":"optional","offset":"required"}}
{"name":"avr-tools-device-file.modules.module","repeated":true,"attrs":{"oldname":"optional","name":"required","id":"optional","version":"optional","caption":"optional","name2":"optional"}}
{"name":"avr-tools-device-file.modules.module.register-group.register.bitfield","repeated":true,"attrs":{"value":"optional","mask":"required","name":"required","modes":"optional","values":"optional","rw":"optional","vaues":"optional","caption":"optional","lsb":"optional"}}
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance.register-group","repeated":true,"attrs":{"name":"required","address-space":"optional","version":"optional","size":"optional","name-in-module":"optional","caption":"optional","id":"optional","offset":"optional"}}
{"name":"avr-tools-device-file.devices.device.events.generators.generator","repeated":true,"attrs":{"index":"required","name":"required","module-instance":"required"}}
{"name":"avr-tools-device-file.modules.module.value-group","repeated":true,"attrs":{"name":"required","caption":"optional"}}
{"name":"avr-tools-device-file.devices.device.parameters.param","repeated":true,"attrs":{"value":"required","name":"required","caption":"optional"}}
{"name":"avr-tools-device-file.devices.device.peripherals.module","repeated":true,"attrs":{"name":"required","id":"optional","version":"optional","name2":"optional"}}
{"name":"avr-tools-device-file.devices.device.peripherals.module.instance.parameters.param","repeated":true,"attrs":{"value":"optional","name":"required","caption":"optional"}}
{"name":"avr-tools-device-file.modules","repeated":false}
{"name":"avr-tools-device-file.devices.device.interrupts.Interrupt","repeated":true,"attrs":{"irq-caption":"required","index":"required","irq-index":"required","caption":"required","name":"required","irq-name":"required"}}
{"name":"avr-tools-device-file.devices","repeated":false}
{"name":"avr-tools-device-file.modules.module.interrupt-group","repeated":true,"attrs":{"name":"required"}}
{"name":"avr-tools-device-file.file","repeated":false,"attrs":{"timestamp":"required"}}
{"name":"avr-tools-device-file.devices.device.events","repeated":false}
{"name":"avr-tools-device-file.variants","repeated":false}
{"name":"avr-tools-device-file.devices.device.address-spaces.address-space","repeated":true,"attrs":{"endianness":"optional","name":"required","id":"required","start":"required","size":"required"}}
{"name":"avr-tools-device-file.devices.device.interfaces","repeated":false}
{"name":"avr-tools-device-file.devices.device.events.generators","repeated":false}
{"name":"avr-tools-device-file.modules.module.register-group.mode","repeated":true,"attrs":{"value":"required","mask":"optional","name":"required","qualifier":"required","caption":"required"}}
{"name":"avr-tools-device-file.devices.device","repeated":false,"attrs":{"architecture":"required","name":"required","family":"required","series":"optional"}}
{"name":"avr-tools-device-file.devices.device.property-groups","repeated":false}
{"name":"avr-tools-device-file.modules.module.register-group","repeated":true,"attrs":{"name":"required","caption":"optional","aligned":"optional","section":"optional","size":"optional"}}

@ -0,0 +1,4 @@
{"name":"module.register","repeated":true,"attrs":{"description":"required","width":"required","id":"required","acronym":"optional","internal":"optional","offset":"optional"}}
{"name":"module","repeated":false,"attrs":{"XML_version":"optional","description":"optional","hidden":"optional","id":"required","HW_revision":"required"}}
{"name":"module.register.bitfield","repeated":true,"attrs":{"width":"required","end":"required","rwaccess":"required","resetval":"optional","begin":"required","description":"required","id":"required","range":"optional"}}
{"name":"module.register.bitfield.bitenum","repeated":true,"attrs":{"description":"required","value":"required","id":"required","token":"optional"}}

@ -0,0 +1,37 @@
{"name":"board.processors","repeated":false}
{"name":"board.router.subpath","repeated":true,"attrs":{"desc":"optional","id":"required"}}
{"name":"board.device.router.subpath.property","repeated":true,"attrs":{"desc":"optional","Type":"required","id":"required","Value":"required"}}
{"name":"board.router.subpath.cpu","repeated":false,"attrs":{"XML_version":"required","desc":"required","description":"required","id":"required","isa":"required","HW_revision":"required"}}
{"name":"board.processors.cpu","repeated":false,"attrs":{"XML_version":"required","desc":"required","description":"required","id":"required","isa":"required","HW_revision":"required"}}
{"name":"board.device.router","repeated":false,"attrs":{"description":"required","HW_revision":"optional","desc":"optional","id":"required","isa":"required","XML_version":"required"}}
{"name":"board.device.cpu","repeated":false,"attrs":{"description":"required","HW_revision":"optional","id":"required","isa":"required","XML_version":"required"}}
{"name":"board.instance","repeated":true,"attrs":{"desc":"optional","xmlpath":"required","id":"required","xml":"required","href":"required","XML_version":"required"}}
{"name":"board.device.router.subpath.cpu","repeated":false,"attrs":{"XML_version":"required","isa":"required","description":"required","desc":"optional","id":"required","deviceSim":"optional","HW_revision":"optional"}}
{"name":"board.device.router.subpath.router.subpath.router","repeated":false,"attrs":{"XML_version":"required","description":"required","id":"required","isa":"required","HW_revision":"required"}}
{"name":"board.cpu.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.router.subpath.cpu.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.processors.cpu.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.device.router.subpath","repeated":true,"attrs":{"desc":"optional","id":"required"}}
{"name":"board.device.router.subpath.router.subpath.router.subpath.cpu.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.device.router.subpath.router.subpath.router.subpath","repeated":true,"attrs":{"id":"required"}}
{"name":"board.device.router.subpath.router.subpath.property","repeated":true,"attrs":{"desc":"required","Type":"required","id":"required","Value":"required"}}
{"name":"board","repeated":false,"attrs":{"desc":"required","description":"required","id":"required","XML_version":"required"}}
{"name":"board.router","repeated":true,"attrs":{"XML_version":"required","desc":"optional","description":"required","id":"required","isa":"required","HW_revision":"optional"}}
{"name":"board.cpu","repeated":false,"attrs":{"XML_version":"required","description":"required","id":"required","isa":"required","HW_revision":"required"}}
{"name":"board.device.router.subpath.router.subpath.router.subpath.property","repeated":true,"attrs":{"desc":"required","Type":"required","id":"required","Value":"required"}}
{"name":"board.router.subpath.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.device.router.subpath.router.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.device.router.subpath.router.subpath.router.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.device.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.device.router.subpath.instance","repeated":false,"attrs":{"desc":"required","xmlpath":"required","id":"required","xml":"required","href":"required","XML_version":"required"}}
{"name":"board.device.cpu.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.device.router.subpath.router","repeated":false,"attrs":{"XML_version":"required","description":"required","id":"required","isa":"required","HW_revision":"optional"}}
{"name":"board.router.subpath.instance","repeated":false,"attrs":{"desc":"required","xmlpath":"required","id":"required","xml":"required","href":"required","XML_version":"required"}}
{"name":"board.device.router.subpath.router.subpath","repeated":true,"attrs":{"desc":"optional","id":"required"}}
{"name":"board.device.router.subpath.cpu.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"board.device.router.subpath.router.subpath.router.subpath.cpu","repeated":false,"attrs":{"XML_version":"required","description":"required","id":"required","isa":"required","deviceSim":"optional","HW_revision":"required"}}
{"name":"board.device.router.property","repeated":true,"attrs":{"Name":"optional","Type":"required","id":"optional","Value":"required","ID":"optional"}}
{"name":"board.device.router.subpath.router.subpath.cpu","repeated":false,"attrs":{"HW_revision":"optional","isa":"required","desc":"optional","description":"required","id":"required","deviceSim":"optional","XML_version":"required"}}
{"name":"board.device","repeated":true,"attrs":{"HW_revision":"required","partnum":"required","description":"required","simulation":"optional","desc":"optional","id":"required","XML_version":"required"}}
{"name":"board.device.router.subpath.router.subpath.cpu.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}

@ -0,0 +1,14 @@
{"name":"cpu.register","repeated":true,"attrs":{"description":"required","width":"required","id":"required","acronym":"required"}}
{"name":"cpu.jtag","repeated":false}
{"name":"cpu.register.bitfield.bitenum","repeated":true,"attrs":{"value":"required","description":"required","id":"required","token":"required"}}
{"name":"cpu.instance","repeated":true,"attrs":{"href":"required","requestor":"optional","size":"required","xmlpath":"required","id":"required","xml":"required","accessnumbytes":"required","permissions":"required","description":"optional","baseaddr":"required","endaddr":"optional","HW_version":"optional","HW_revision":"optional"}}
{"name":"module.register","repeated":true,"attrs":{"description":"required","instaddr":"optional","width":"required","id":"required","acronym":"required","instances":"optional"}}
{"name":"module","repeated":false,"attrs":{"XML_version":"required","description":"required","id":"required","HW_revision":"required"}}
{"name":"cpu.jtag.property","repeated":false,"attrs":{"ID":"required","id":"required","Type":"required","Value":"required"}}
{"name":"cpu.property","repeated":true,"attrs":{"Type":"required","Value":"required","desc":"required","description":"optional","Extensions":"optional","id":"required","XML_version":"required"}}
{"name":"cpu","repeated":false,"attrs":{"XML_version":"required","desc":"optional","description":"optional","id":"required","isa":"optional","HW_revision":"optional"}}
{"name":"module.register.bitfield","repeated":true,"attrs":{"width":"required","end":"required","rwaccess":"required","resetval":"optional","begin":"required","description":"required","id":"required","range":"optional"}}
{"name":"cpu.bitfield","repeated":true,"attrs":{"width":"required","end":"required","rwaccess":"required","resetval":"required","begin":"required","description":"required","id":"required","range":"required"}}
{"name":"cpu.property.choice","repeated":true,"attrs":{"value":"required"}}
{"name":"cpu.address_space","repeated":true,"attrs":{"align_32":"required","align_64":"required","endianess":"required","max_data_width":"required","addr_width":"required","increment":"required","align_8":"required","id":"required","align_16":"required"}}
{"name":"cpu.register.bitfield","repeated":true,"attrs":{"width":"required","end":"required","rwaccess":"required","resetval":"required","begin":"required","description":"required","id":"required","range":"required"}}

@ -0,0 +1,44 @@
{"name":"device.cpu.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.router.subpath.router.subpath.router.subpath.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.include","repeated":true,"attrs":{"href":"required"}}
{"name":"device.router.jtag","repeated":false}
{"name":"device.router.subpath.router.subpath","repeated":true,"attrs":{"desc":"optional","description":"optional","id":"required"}}
{"name":"device.router","repeated":false,"attrs":{"XML_version":"required","description":"required","desc":"optional","id":"required","isa":"required","HW_revision":"optional"}}
{"name":"device.router.subpath.instance","repeated":true,"attrs":{"xml":"required","isa":"optional","href":"required","desc":"optional","description":"optional","xmlpath":"required","id":"required","XML_version":"optional"}}
{"name":"device.router.subpath.router.subpath.cpu.property","repeated":true,"attrs":{"Name":"optional","Type":"required","id":"optional","Value":"required","ID":"optional"}}
{"name":"device.jtag.property.choice.property","repeated":true,"attrs":{"Name":"optional","Type":"required","id":"optional","Value":"required","ID":"optional"}}
{"name":"device.router.subpath.router.subpath.router.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.router.subpath.router.subpath.router.subpath.instance","repeated":true,"attrs":{"desc":"required","xmlpath":"required","id":"required","xml":"required","href":"required","XML_version":"required"}}
{"name":"device.router.jtag.property.choice","repeated":false,"attrs":{"value":"optional","Name":"required"}}
{"name":"device.router.instance","repeated":true,"attrs":{"xml":"required","accessnumbytes":"required","href":"required","requestor":"optional","description":"required","size":"required","xmlpath":"required","id":"required","baseaddr":"required","endaddr":"required","HW_version":"required","permissions":"required"}}
{"name":"device.router.subpath.property","repeated":true,"attrs":{"ID":"optional","Type":"required","id":"required","Value":"required"}}
{"name":"device.router.subpath.cpu.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.router.subpath.router","repeated":false,"attrs":{"XML_version":"required","description":"required","desc":"optional","id":"required","isa":"required","HW_revision":"required"}}
{"name":"device.router.subpath.router.subpath.router","repeated":false,"attrs":{"XML_version":"required","description":"required","id":"required","isa":"required","HW_revision":"required"}}
{"name":"device","repeated":false,"attrs":{"XML_version":"optional","description":"optional","desc":"optional","id":"required","partnum":"optional","HW_revision":"optional"}}
{"name":"device.router.subpath.router.subpath.cpu.instance","repeated":true,"attrs":{"xml":"required","accessnumbytes":"required","href":"required","requestor":"optional","description":"optional","size":"optional","xmlpath":"required","id":"required","baseaddr":"required","permissions":"required","endaddr":"optional","HW_revision":"optional"}}
{"name":"device.router.subpath.router.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.router.subpath.router.subpath.property","repeated":true,"attrs":{"ID":"optional","Type":"required","id":"required","Value":"required"}}
{"name":"device.router.subpath.router.subpath.router.subpath.cpu.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.router.subpath.cpu","repeated":true,"attrs":{"HW_revision":"optional","isa":"required","description":"required","desc":"optional","id":"required","deviceSim":"optional","XML_version":"required"}}
{"name":"device.router.subpath.router.subpath.router.subpath.cpu.instance","repeated":true,"attrs":{"xml":"required","accessnumbytes":"required","href":"required","size":"optional","description":"required","permissions":"required","xmlpath":"required","id":"required","baseaddr":"optional","requestor":"optional","HW_revision":"optional"}}
{"name":"device.router.property","repeated":true,"attrs":{"Name":"optional","Type":"required","ID":"optional","Value":"required","id":"optional"}}
{"name":"device.property","repeated":true,"attrs":{"desc":"optional","Extensions":"optional","Type":"required","id":"required","Value":"required","XML_version":"optional"}}
{"name":"device.router.subpath.router.subpath.router.subpath","repeated":true,"attrs":{"id":"required"}}
{"name":"device.jtag.property.choice.property.choice","repeated":false,"attrs":{"value":"optional","Name":"required"}}
{"name":"device.jtag.property.choice","repeated":true,"attrs":{"value":"optional","Name":"required"}}
{"name":"device.instance","repeated":true,"attrs":{"xml":"required","isa":"optional","href":"required","desc":"optional","description":"optional","xmlpath":"required","id":"required","XML_revision":"optional","XML_version":"optional"}}
{"name":"device.jtag.property.choice.property.choice.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.cpu.instance","repeated":true,"attrs":{"href":"required","requestor":"optional","size":"required","xmlpath":"required","id":"required","xml":"required","accessnumbytes":"required","description":"required","permissions":"required","baseaddr":"required","endaddr":"optional","HW_version":"optional","HW_revision":"optional"}}
{"name":"device.router.subpath","repeated":true,"attrs":{"desc":"optional","id":"required"}}
{"name":"device.cpu","repeated":true,"attrs":{"HW_revision":"required","isa":"required","description":"required","desc":"optional","id":"required","deviceSim":"optional","XML_version":"required"}}
{"name":"device.router.subpath.cpu.instance","repeated":true,"attrs":{"href":"required","size":"optional","requestor":"optional","xmlpath":"required","id":"required","xml":"required","accessnumbytes":"required","permissions":"required","description":"optional","baseaddr":"required","endaddr":"optional","HW_version":"optional","HW_revision":"optional"}}
{"name":"device.router.subpath.router.subpath.cpu.memory","repeated":true,"attrs":{"accessnumbytes":"required","populated":"required","size":"required","requestor":"required","permissions":"required","endaddress":"required","id":"required","description":"required","startaddress":"required"}}
{"name":"device.router.subpath.router.subpath.router.subpath.cpu","repeated":true,"attrs":{"XML_version":"required","description":"required","id":"required","isa":"required","deviceSim":"optional","HW_revision":"required"}}
{"name":"device.jtag.property","repeated":true,"attrs":{"Name":"optional","Type":"required","id":"optional","Value":"required","ID":"optional"}}
{"name":"device.jtag","repeated":false}
{"name":"device.router.jtag.property.choice.property","repeated":false,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.router.jtag.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"device.router.subpath.router.instance","repeated":true,"attrs":{"xml":"required","accessnumbytes":"required","href":"required","size":"required","description":"required","permissions":"required","xmlpath":"required","id":"required","baseaddr":"required","endaddr":"required","HW_version":"required","requestor":"optional"}}
{"name":"device.router.subpath.router.subpath.instance","repeated":true,"attrs":{"xml":"required","isa":"optional","href":"required","desc":"optional","xmlpath":"required","id":"required","XML_version":"optional"}}
{"name":"device.router.subpath.router.subpath.cpu","repeated":true,"attrs":{"HW_revision":"required","isa":"required","desc":"optional","description":"required","id":"required","deviceSim":"optional","XML_version":"required"}}

@ -0,0 +1,2 @@
{"name":"properties.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}}
{"name":"properties","repeated":false,"attrs":{"XML_version":"required"}}

@ -543,7 +543,6 @@ pub fn initFromAtdf(allocator: Allocator, doc: *xml.Doc) !Database {
errdefer db.deinit(); errdefer db.deinit();
if (xml.findNode(tools_node.children orelse return error.NoChildren, "modules")) |modules_node| { if (xml.findNode(tools_node.children orelse return error.NoChildren, "modules")) |modules_node| {
std.log.debug("looking at modules", .{});
var module_it: ?*xml.Node = xml.findNode(modules_node.children.?, "module"); var module_it: ?*xml.Node = xml.findNode(modules_node.children.?, "module");
while (module_it != null) : (module_it = xml.findNode(module_it.?.next, "module")) { while (module_it != null) : (module_it = xml.findNode(module_it.?.next, "module")) {
const module_nodes: *xml.Node = module_it.?.children orelse continue; const module_nodes: *xml.Node = module_it.?.children orelse continue;
@ -642,7 +641,6 @@ pub fn initFromAtdf(allocator: Allocator, doc: *xml.Doc) !Database {
}); });
} }
std.log.debug("found register group: {s}", .{group_name});
try register_groups.put(try db.arena.allocator().dupe(u8, group_name), .{ try register_groups.put(try db.arena.allocator().dupe(u8, group_name), .{
.description = if (xml.getAttribute(register_group_it, "caption")) |caption| .description = if (xml.getAttribute(register_group_it, "caption")) |caption|
try db.arena.allocator().dupe(u8, caption) try db.arena.allocator().dupe(u8, caption)

@ -0,0 +1,178 @@
const std = @import("std");
const json = std.json;
const xml = @import("xml.zig");
const Results = std.StringHashMap(struct {
repeated: bool,
total_count: usize,
attr_counts: std.StringHashMapUnmanaged(usize),
});
const AttrUsage = enum {
// this doesn't necessarily mean an attr is required, just that it's used
// every time
required,
optional,
};
const PrintedResult = struct {
key: []const u8,
repeated: bool,
attrs: std.StringHashMapUnmanaged(AttrUsage),
fn lessThan(_: void, lhs: PrintedResult, rhs: PrintedResult) bool {
return std.ascii.lessThanIgnoreCase(lhs.key, rhs.key);
}
};
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
var arena = std.heap.ArenaAllocator.init(gpa.allocator());
defer arena.deinit();
var results = Results.init(gpa.allocator());
defer {
var it = results.iterator();
while (it.next()) |entry|
entry.value_ptr.attr_counts.deinit(gpa.allocator());
results.deinit();
}
var path_buf: [4096]u8 = undefined;
const stdin = std.io.getStdIn().reader();
while (try stdin.readUntilDelimiterOrEof(&path_buf, '\n')) |path| {
// path is not needed outside of the loop
std.log.info("path: {s}", .{path});
const file = try std.fs.cwd().openFile(path, .{});
defer file.close();
const text = try file.readToEndAlloc(gpa.allocator(), std.math.maxInt(usize));
defer gpa.allocator().free(text);
const doc = try xml.readFromMemory(text);
defer xml.freeDoc(doc);
var found = std.StringHashMap(void).init(gpa.allocator());
defer found.deinit();
const root_element: *xml.Node = xml.docGetRootElement(doc) orelse return error.NoRoot;
try recursiveCharacterize(&arena, root_element, &.{}, &found, &results);
}
var ordered = std.ArrayList(PrintedResult).init(gpa.allocator());
defer {
for (ordered.items) |*item|
item.attrs.deinit(gpa.allocator());
ordered.deinit();
}
const stdout = std.io.getStdOut().writer();
var it = results.iterator();
while (it.next()) |entry| {
var tree = json.ValueTree{
.arena = std.heap.ArenaAllocator.init(gpa.allocator()),
.root = json.Value{ .Object = json.ObjectMap.init(gpa.allocator()) },
};
defer {
var tree_it = tree.root.Object.iterator();
while (tree_it.next()) |tree_entry|
if (tree_entry.value_ptr.* == .Object)
tree_entry.value_ptr.Object.deinit();
tree.root.Object.deinit();
tree.deinit();
}
try tree.root.Object.put("name", .{
.String = entry.key_ptr.*,
});
try tree.root.Object.put("repeated", .{
.Bool = entry.value_ptr.repeated,
});
if (entry.value_ptr.attr_counts.count() > 0) {
var obj = json.Value{ .Object = json.ObjectMap.init(gpa.allocator()) };
var attr_it = entry.value_ptr.attr_counts.iterator();
while (attr_it.next()) |attr_entry| {
try obj.Object.put(attr_entry.key_ptr.*, json.Value{
.String = if (entry.value_ptr.total_count == attr_entry.value_ptr.*)
"required"
else
"optional",
});
}
try tree.root.Object.put("attrs", obj);
}
try tree.root.jsonStringify(.{}, stdout);
try stdout.writeByte('\n');
}
}
const CharacterizeError = error{OutOfMemory};
fn recursiveCharacterize(
arena: *std.heap.ArenaAllocator,
node: *xml.Node,
parent_location: []const []const u8,
parent_found: *std.StringHashMap(void),
results: *Results,
) CharacterizeError!void {
const allocator = arena.child_allocator;
var location = std.ArrayList([]const u8).init(allocator);
defer location.deinit();
if (node.name) |name| {
try location.appendSlice(parent_location);
try location.append(std.mem.span(name));
} else return;
const key = try std.mem.join(arena.allocator(), ".", location.items);
const result = try results.getOrPut(key);
if (!result.found_existing) {
result.value_ptr.* = .{
.repeated = false,
.attr_counts = .{},
.total_count = 0,
};
}
result.value_ptr.total_count += 1;
var attr_it: ?*xml.Attr = node.properties;
while (attr_it != null) : (attr_it = attr_it.?.next) {
if (attr_it.?.name) |name| {
const name_slice = std.mem.span(name);
if (result.value_ptr.attr_counts.getEntry(name_slice)) |entry| {
entry.value_ptr.* += 1;
} else {
try result.value_ptr.attr_counts.put(
allocator,
try arena.allocator().dupe(u8, name_slice),
1,
);
}
}
}
if (parent_found.contains(key))
result.value_ptr.repeated = true
else
try parent_found.put(key, {});
var found = std.StringHashMap(void).init(allocator);
defer found.deinit();
var child_it: ?*xml.Node = node.children;
while (child_it != null) : (child_it = child_it.?.next) {
if (child_it.?.type != 1)
continue;
try recursiveCharacterize(arena, child_it.?, location.items, &found, results);
}
}

@ -3,7 +3,7 @@ const std = @import("std");
const json = std.json; const json = std.json;
const assert = std.debug.assert; const assert = std.debug.assert;
const xml = @import("xml"); const xml = @import("xml.zig");
const ContextMap = std.StringHashMap(std.StringHashMapUnmanaged([]const u8)); const ContextMap = std.StringHashMap(std.StringHashMapUnmanaged([]const u8));
@ -32,6 +32,8 @@ pub fn main() !void {
return error.NoComponents; return error.NoComponents;
const doc = xml.readFile(path.ptr, null, 0) orelse return error.ReadXmlFile; const doc = xml.readFile(path.ptr, null, 0) orelse return error.ReadXmlFile;
defer xml.freeDoc(doc);
const root_element: *xml.Node = xml.docGetRootElement(doc) orelse return error.NoRoot; const root_element: *xml.Node = xml.docGetRootElement(doc) orelse return error.NoRoot;
if (!std.mem.eql(u8, components.items[0], std.mem.span(root_element.name))) if (!std.mem.eql(u8, components.items[0], std.mem.span(root_element.name)))
return; return;
Loading…
Cancel
Save