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 }