diff --git a/tools/regz/build.zig b/tools/regz/build.zig index deeb967..5ae03c7 100644 --- a/tools/regz/build.zig +++ b/tools/regz/build.zig @@ -108,18 +108,23 @@ pub fn build(b: *std.build.Builder) !void { const run_step = b.step("run", "Run the app"); run_step.dependOn(&run_cmd.step); - const ndjson = b.addExecutable("ndjson", "src/ndjson.zig"); - ndjson.addPackagePath("xml", "src/xml.zig"); - regz.xml.link(ndjson); + const contextualize_fields = b.addExecutable("contextualize-fields", "src/contextualize-fields.zig"); + regz.xml.link(contextualize_fields); - const ndjson_run = ndjson.run(); - ndjson_run.step.dependOn(b.getInstallStep()); + const contextualize_fields_run = contextualize_fields.run(); if (b.args) |args| { - ndjson_run.addArgs(args); + contextualize_fields_run.addArgs(args); } - const ndjson_step = b.step("ndjson", "Run ndjson program"); - ndjson_step.dependOn(&ndjson_run.step); + const contextualize_fields_step = b.step("contextualize-fields", "Create ndjson of all the fields with the context of parent fields"); + 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"); diff --git a/tools/regz/characterized/atdf.ndjson b/tools/regz/characterized/atdf.ndjson new file mode 100644 index 0000000..6f0d29e --- /dev/null +++ b/tools/regz/characterized/atdf.ndjson @@ -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"}} diff --git a/tools/regz/characterized/targetdb/Modules/msp430.ndjson b/tools/regz/characterized/targetdb/Modules/msp430.ndjson new file mode 100644 index 0000000..6ba992b --- /dev/null +++ b/tools/regz/characterized/targetdb/Modules/msp430.ndjson @@ -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"}} diff --git a/tools/regz/characterized/targetdb/boards.ndjson b/tools/regz/characterized/targetdb/boards.ndjson new file mode 100644 index 0000000..90438a9 --- /dev/null +++ b/tools/regz/characterized/targetdb/boards.ndjson @@ -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"}} diff --git a/tools/regz/characterized/targetdb/cpus.ndjson b/tools/regz/characterized/targetdb/cpus.ndjson new file mode 100644 index 0000000..165f3d2 --- /dev/null +++ b/tools/regz/characterized/targetdb/cpus.ndjson @@ -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"}} diff --git a/tools/regz/characterized/targetdb/devices.ndjson b/tools/regz/characterized/targetdb/devices.ndjson new file mode 100644 index 0000000..cfbfc6e --- /dev/null +++ b/tools/regz/characterized/targetdb/devices.ndjson @@ -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"}} diff --git a/tools/regz/characterized/targetdb/options.ndjson b/tools/regz/characterized/targetdb/options.ndjson new file mode 100644 index 0000000..66cda12 --- /dev/null +++ b/tools/regz/characterized/targetdb/options.ndjson @@ -0,0 +1,2 @@ +{"name":"properties.property","repeated":true,"attrs":{"Type":"required","id":"required","Value":"required"}} +{"name":"properties","repeated":false,"attrs":{"XML_version":"required"}} diff --git a/tools/regz/src/Database.zig b/tools/regz/src/Database.zig index c7052a1..094f5c8 100644 --- a/tools/regz/src/Database.zig +++ b/tools/regz/src/Database.zig @@ -543,7 +543,6 @@ pub fn initFromAtdf(allocator: Allocator, doc: *xml.Doc) !Database { errdefer db.deinit(); 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"); while (module_it != null) : (module_it = xml.findNode(module_it.?.next, "module")) { 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), .{ .description = if (xml.getAttribute(register_group_it, "caption")) |caption| try db.arena.allocator().dupe(u8, caption) diff --git a/tools/regz/src/characterize.zig b/tools/regz/src/characterize.zig new file mode 100644 index 0000000..b94e9f8 --- /dev/null +++ b/tools/regz/src/characterize.zig @@ -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); + } +} diff --git a/tools/regz/src/ndjson.zig b/tools/regz/src/contextualize-fields.zig similarity index 98% rename from tools/regz/src/ndjson.zig rename to tools/regz/src/contextualize-fields.zig index 93d4075..6aa1ce0 100644 --- a/tools/regz/src/ndjson.zig +++ b/tools/regz/src/contextualize-fields.zig @@ -3,7 +3,7 @@ const std = @import("std"); const json = std.json; const assert = std.debug.assert; -const xml = @import("xml"); +const xml = @import("xml.zig"); const ContextMap = std.StringHashMap(std.StringHashMapUnmanaged([]const u8)); @@ -32,6 +32,8 @@ pub fn main() !void { return error.NoComponents; 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; if (!std.mem.eql(u8, components.items[0], std.mem.span(root_element.name))) return;