diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b5e3e45e..c588a141 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,45 +4,15 @@ on: branches: [main, zig-master] pull_request: branches: [main, zig-master] + workflow_dispatch: env: ZIG_VERSION: ${{ github.ref == 'refs/heads/zig-master' && 'master' || '0.13.0' }} jobs: - build: - name: Build - runs-on: ${{ matrix.os }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Zig - uses: mlugg/setup-zig@v1 - with: - version: ${{ env.ZIG_VERSION }} - - name: Build - run: zig build -Doptimize=ReleaseSmall - - unit-test-ports: - name: Unit Test Ports - runs-on: ${{ matrix.os }} - needs: build - strategy: - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - port_dir: [gigadevice/gd32, raspberrypi/rp2xxx, stmicro/stm32] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Zig - uses: mlugg/setup-zig@v1 - with: - version: ${{ env.ZIG_VERSION }} - - name: Unit Test Ports - run: zig build test - working-directory: port/${{ matrix.port_dir }} - unit-test-regz: name: Unit Test Regz + continue-on-error: true strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] @@ -60,6 +30,7 @@ jobs: unit-test-uf2: name: Unit Test UF2 + continue-on-error: true strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] @@ -75,9 +46,38 @@ jobs: run: zig build test working-directory: tools/uf2 - build-website: - name: Build Website + stm32-gen-check: + name: Check that stm32 generated code is up to date + continue-on-error: true runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup Zig + uses: mlugg/setup-zig@v1 + with: + version: ${{ env.ZIG_VERSION }} + - name: Generate Code + run: zig build -Dgenerate + working-directory: port/stmicro/stm32 + - name: Check for code diffs + run: | + if [[ $(git status --porcelain | grep -v '^??') ]]; then + echo "Code differences detected:" + git diff + echo "Please commit or fix these changes to proceed." + exit 1 + else + echo "No code differences detected." + fi + + build: + name: Build + continue-on-error: true + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] steps: - name: Checkout uses: actions/checkout@v4 @@ -85,13 +85,17 @@ jobs: uses: mlugg/setup-zig@v1 with: version: ${{ env.ZIG_VERSION }} - - name: Build Website - run: zig build - working-directory: website + - name: Build + run: zig build -Doptimize=ReleaseSmall - dry-run-packaging: - name: Dry Run Packaging - runs-on: macos-latest + unit-test-ports: + name: Unit Test Ports + continue-on-error: true + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + port_dir: [gigadevice/gd32, raspberrypi/rp2xxx, stmicro/stm32] steps: - name: Checkout uses: actions/checkout@v4 @@ -99,24 +103,14 @@ jobs: uses: mlugg/setup-zig@v1 with: version: ${{ env.ZIG_VERSION }} - - name: Dry Run Packaging - run: | - MICROZIG_VERSION=$(zig build package -- get-version) - echo microzig version: $MICROZIG_VERSION - zig build package -- http://localhost:8000 - python3 -m http.server 8000 --directory boxzer-out & - sleep 1 - - cd tools/package-test - zig fetch --save=microzig http://localhost:8000/${MICROZIG_VERSION}/microzig.tar.gz - zig build -Doptimize=ReleaseSmall - - jobs -p | xargs kill + - name: Unit Test Ports + run: zig build test + working-directory: port/${{ matrix.port_dir }} build-examples: name: Build Examples + continue-on-error: true runs-on: ubuntu-latest - needs: build strategy: matrix: example_dir: @@ -142,26 +136,44 @@ jobs: run: zig build -Doptimize=ReleaseSmall --summary all working-directory: examples/${{ matrix.example_dir }} - stm32-gen-check: - name: Check that stm32 generated code is up to date + + + build-website: + name: Build Website + continue-on-error: true runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v3 + - name: Checkout + uses: actions/checkout@v4 - name: Setup Zig uses: mlugg/setup-zig@v1 with: version: ${{ env.ZIG_VERSION }} - - name: Generate Code - run: zig build -Dgenerate - working-directory: port/stmicro/stm32 - - name: Check for code diffs + - name: Build Website + run: zig build + working-directory: website + + dry-run-packaging: + name: Dry Run Packaging + continue-on-error: true + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Zig + uses: mlugg/setup-zig@v1 + with: + version: ${{ env.ZIG_VERSION }} + - name: Dry Run Packaging run: | - if [[ $(git status --porcelain | grep -v '^??') ]]; then - echo "Code differences detected:" - git diff - echo "Please commit or fix these changes to proceed." - exit 1 - else - echo "No code differences detected." - fi + MICROZIG_VERSION=$(zig build package -- get-version) + echo microzig version: $MICROZIG_VERSION + zig build package -- http://localhost:8000 + python3 -m http.server 8000 --directory boxzer-out & + sleep 1 + + cd tools/package-test + zig fetch --save=microzig http://localhost:8000/${MICROZIG_VERSION}/microzig.tar.gz + zig build -Doptimize=ReleaseSmall + + jobs -p | xargs kill diff --git a/build.zig b/build.zig index fa3698c3..dedabb4a 100644 --- a/build.zig +++ b/build.zig @@ -387,6 +387,7 @@ pub fn MicroBuild(port_select: PortSelect) type { .atdf, .svd => |file| blk: { const regz_run = b.addRunArtifact(regz_exe); + regz_run.addArg("--microzig"); regz_run.addArg("--format"); regz_run.addArg(@tagName(target.chip.register_definition)); diff --git a/port/stmicro/stm32/src/generate.zig b/port/stmicro/stm32/src/generate.zig index 425e4e1b..b1a4623f 100644 --- a/port/stmicro/stm32/src/generate.zig +++ b/port/stmicro/stm32/src/generate.zig @@ -421,7 +421,7 @@ pub fn main() !void { try db.backup("stm32.regz"); - db.to_zig(out_file.writer()) catch |err| { + db.to_zig(out_file.writer(), .{ .for_microzig = true }) catch |err| { std.log.err("Failed to write", .{}); return err; }; diff --git a/tools/regz/src/Database.zig b/tools/regz/src/Database.zig index 06201da7..b4d8c3fe 100644 --- a/tools/regz/src/Database.zig +++ b/tools/regz/src/Database.zig @@ -2031,8 +2031,10 @@ pub fn apply_patch(db: *Database, ndjson: []const u8) !void { } } -pub fn to_zig(db: *Database, out_writer: anytype) !void { - try gen.to_zig(db, out_writer); +pub const ToZigOptions = gen.ToZigOptions; + +pub fn to_zig(db: *Database, out_writer: anytype, opts: ToZigOptions) !void { + try gen.to_zig(db, out_writer, opts); } test "all" { diff --git a/tools/regz/src/gen.zig b/tools/regz/src/gen.zig index 2c1ee2d5..360a554a 100644 --- a/tools/regz/src/gen.zig +++ b/tools/regz/src/gen.zig @@ -19,7 +19,11 @@ const riscv = @import("arch/riscv.zig"); const log = std.log.scoped(.gen); -pub fn to_zig(db: *Database, out_writer: anytype) !void { +pub const ToZigOptions = struct { + for_microzig: bool = false, +}; + +pub fn to_zig(db: *Database, out_writer: anytype, opts: ToZigOptions) !void { var arena = std.heap.ArenaAllocator.init(db.gpa); defer arena.deinit(); @@ -29,11 +33,18 @@ pub fn to_zig(db: *Database, out_writer: anytype) !void { defer buffer.deinit(); const writer = buffer.writer(); - try writer.writeAll( - \\const micro = @import("microzig"); - \\const mmio = micro.mmio; - \\ - ); + if (opts.for_microzig) { + try writer.writeAll( + \\const micro = @import("microzig"); + \\const mmio = micro.mmio; + \\ + ); + } else { + try writer.writeAll( + \\const mmio = @import("mmio"); + \\ + ); + } try write_devices(db, allocator, writer); try write_types(db, allocator, writer); try writer.writeByte(0); @@ -839,7 +850,7 @@ test "gen.peripheral instantiation" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -873,7 +884,7 @@ test "gen.peripherals with a shared type" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -908,7 +919,7 @@ test "gen.peripheral with modes" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -970,7 +981,7 @@ test "gen.peripheral with enum" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -999,7 +1010,7 @@ test "gen.peripheral with enum, enum is exhausted of values" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1027,7 +1038,7 @@ test "gen.field with named enum" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1059,7 +1070,7 @@ test "gen.field with anonymous enum" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1089,7 +1100,7 @@ test "gen.namespaced register groups" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1131,7 +1142,7 @@ test "gen.peripheral with reserved register" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1164,7 +1175,7 @@ test "gen.peripheral with count" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1197,7 +1208,7 @@ test "gen.peripheral with count, padding required" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1231,7 +1242,7 @@ test "gen.register with count" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1264,7 +1275,7 @@ test "gen.register with count and fields" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1300,7 +1311,7 @@ test "gen.field with count, width of one, offset, and padding" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1336,7 +1347,7 @@ test "gen.field with count, multi-bit width, offset, and padding" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1366,7 +1377,7 @@ test "gen.interrupts.avr" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1395,7 +1406,7 @@ test "gen.peripheral type with register and field" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1424,7 +1435,7 @@ test "gen.name collisions in enum name cause them to be anonymous" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1460,7 +1471,7 @@ test "gen.pick one enum field in value collisions" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1489,7 +1500,7 @@ test "gen.pick one enum field in name collisions" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; @@ -1518,7 +1529,7 @@ test "gen.register fields with name collision" { var buffer = std.ArrayList(u8).init(std.testing.allocator); defer buffer.deinit(); - try db.to_zig(buffer.writer()); + try db.to_zig(buffer.writer(), .{ .for_microzig = true }); try std.testing.expectEqualStrings( \\const micro = @import("microzig"); \\const mmio = micro.mmio; diff --git a/tools/regz/src/main.zig b/tools/regz/src/main.zig index cb3a78c7..0d0864cc 100644 --- a/tools/regz/src/main.zig +++ b/tools/regz/src/main.zig @@ -26,6 +26,7 @@ const Arguments = struct { output_path: ?[:0]const u8 = null, patch_path: ?[]const u8 = null, dump: bool = false, + microzig: bool = false, help: bool = false, fn deinit(args: *Arguments) void { @@ -40,6 +41,7 @@ fn print_usage(writer: anytype) !void { \\regz \\ --help Display this help and exit \\ --dump Dump SQLite file instead of generate code + \\ --microzig Generate for microzig instead of a standalone file \\ --format Explicitly set format type, one of: svd, atdf, json \\ --output_path Write to a file \\ --patch_path After reading format, apply NDJSON based patch file @@ -63,6 +65,8 @@ fn parse_args(allocator: Allocator) !Arguments { ret.help = true; } else if (std.mem.eql(u8, args[i], "--dump")) { ret.dump = true; + } else if (std.mem.eql(u8, args[i], "--microzig")) { + ret.microzig = true; } else if (std.mem.eql(u8, args[i], "--format")) { i += 1; if (i >= args.len) @@ -177,6 +181,6 @@ fn main_impl() anyerror!void { std.io.getStdOut().writer(); var buffered = std.io.bufferedWriter(raw_writer); - try db.to_zig(buffered.writer()); + try db.to_zig(buffered.writer(), .{ .for_microzig = args.microzig }); try buffered.flush(); }