lib/accy/src/validation/composition/model.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const choir = @import("choir");
3 const namespace = @import("root.zig");
4
5 const Allocator = std.mem.Allocator;
6 const composition = choir.composition;
7 const Artifact = choir.backends.artifact.Artifact;
8 const source = namespace.source;
9
10 pub const Products = struct {
11 choice: composition.TargetChoiceSpec,
12 host_artifact: *const Artifact,
13 host_plan: *const composition.FragmentPlan,
14 accy_artifacts: []const Artifact,
15 accy_plan: *const composition.FragmentPlan,
16 };
17
18 pub fn buildComposition(
19 allocator: Allocator,
20 program: *const source.Program,
21 products: Products,
22 ) !composition.CompositionModule {
23 var module = try composition.CompositionModule.init(allocator, &program.partitioned);
24 errdefer module.deinit();
25 try module.addFragment(.{
26 .id = products.host_plan.id,
27 .partition = products.host_plan.input.partition,
28 .pipeline = products.host_plan.input.pipeline,
29 .pipeline_input = products.host_plan.input.product,
30 .artifacts = &.{products.host_artifact.*},
31 .exports = &.{.{
32 .name = "entry",
33 .symbol = products.host_plan.export_symbol,
34 .abi_version = products.host_plan.abi_version,
35 }},
36 .imports = &.{.{
37 .name = "invoke",
38 .symbol = composition.abi.invoke_symbol,
39 .abi_version = composition.abi.version,
40 .kind = .runtime,
41 }},
42 .provenance = .{
43 .path = source.source_path,
44 .symbol = source.host_symbol,
45 .line = 1,
46 .column = 1,
47 },
48 });
49 try module.addFragment(.{
50 .id = products.accy_plan.id,
51 .partition = products.accy_plan.input.partition,
52 .pipeline = products.accy_plan.input.pipeline,
53 .pipeline_input = products.accy_plan.input.product,
54 .artifacts = products.accy_artifacts,
55 .exports = &.{.{
56 .name = source.accy_export_name,
57 .symbol = products.accy_plan.export_symbol,
58 .abi_version = products.accy_plan.abi_version,
59 }},
60 .provenance = .{
61 .path = source.source_path,
62 .symbol = program.add.symbol,
63 .line = 2,
64 .column = 5,
65 },
66 });
67 try module.addVariant(.{
68 .id = source.composition_variant,
69 .choice = products.choice,
70 .fragments = &.{ products.host_plan.id, products.accy_plan.id },
71 .call_sites = &.{.{
72 .id = program.add.call_site,
73 .name = "hybrid/add",
74 .caller = products.host_plan.id,
75 .caller_export = "entry",
76 .runtime_import = "invoke",
77 .callee = products.accy_plan.id,
78 .callee_export = source.accy_export_name,
79 .inputs = &.{ program.add.lhs, program.add.rhs },
80 .outputs = &.{program.add.output},
81 .abi_version = composition.abi.version,
82 .provenance = .{
83 .path = source.source_path,
84 .symbol = program.add.symbol,
85 .line = 2,
86 .column = 5,
87 },
88 }},
89 });
90 try module.verify();
91 return module;
92 }