pxl_rust/
ffi.rs

1//! PXL FFI bindings
2//!
3//! This module provides the Rust FFI (Foreign Function Interface) bridge to C++ PXL using `cxx::bridge`.
4
5#[cxx::bridge]
6pub mod ffi {
7    #[namespace = "pxl::runtime"]
8    #[repr(u32)]
9    #[derive(Debug)]
10    enum ArgType {
11        Constant,
12        DeviceMemory,
13        NDArray,
14    }
15    #[namespace = "pxl::runtime"]
16    #[derive(Debug)]
17    struct ArgInfo_t {
18        arg_type: ArgType,
19        address: *const c_void,
20        total_size: usize,
21    }
22
23    #[namespace = "pxl"]
24    #[repr(u32)]
25    #[derive(Debug)]
26    enum PxlResult {
27        Success,
28        Failure,
29    }
30
31    #[namespace = "pxl"]
32    #[repr(u32)]
33    #[derive(Debug)]
34    enum DeviceAttr {
35        CxlEnabled,
36        GaiaEnabled,
37        NumClusterPerSub,
38        NumMuPerCluster,
39        NumThreadPerMu,
40        TotalSubCount,
41        CxlMemoryCapacity,
42        IoMemoryCapacity,
43    }
44
45    #[namespace = "pxl"]
46    #[repr(u32)]
47    #[derive(Debug)]
48    enum MemType {
49        CxlMem,
50        IoMem,
51        HostMem,
52    }
53
54    #[namespace = "pxl"]
55    #[derive(Debug)]
56    struct MemInfo_t {
57        r#type: MemType,
58        size: usize,
59    }
60
61    #[namespace = "pxl"]
62    #[repr(u32)]
63    #[derive(Debug)]
64    enum ExecuteStatus {
65        Idle,
66        Running,
67        IssueDone,
68        ExecuteDone,
69        Fail,
70        Error,
71    }
72
73    #[namespace = "pxl"]
74    #[derive(Debug, Clone)]
75    struct KernelError_t {
76        beginIndex: u32,
77        endIndex: u32,
78    }
79    unsafe extern "C++" {
80        #[namespace = "pxl"]
81        include!("pxl/pxl.hpp");
82        include!("pxl_wrapper.hpp");
83
84        // Types definitions
85        #[namespace = "pxl"]
86        pub type c_void;
87        #[namespace = "pxl"]
88        pub type PxlResult;
89        #[namespace = "pxl"]
90        pub type DeviceAttr;
91        #[namespace = "pxl"]
92        pub type MemType;
93        #[namespace = "pxl"]
94        pub type MemInfo_t;
95        #[namespace = "pxl"]
96        pub type ExecuteStatus;
97        #[namespace = "pxl"]
98        pub type KernelError_t;
99        #[namespace = "pxl"]
100        pub type ArgType;
101        #[namespace = "pxl"]
102        pub type ArgInfo_t;
103
104        #[namespace = "pxl::kernel"]
105        pub type Module;
106        #[namespace = "pxl::kernel"]
107        pub type Function;
108
109        #[namespace = "pxl::runtime"]
110        pub type Map;
111        #[namespace = "pxl::runtime"]
112        pub type Stream;
113        #[namespace = "pxl::runtime"]
114        pub type Context;
115        #[namespace = "pxl::runtime"]
116        pub type Job;
117
118        // kernel API
119        #[namespace = "pxl::kernel"]
120        pub unsafe fn createModule(filename: *const c_char) -> *mut Module;
121
122        #[namespace = "pxl::kernel"]
123        pub unsafe fn destroyModule(module: *mut Module);
124
125        #[namespace = "pxl::kernel"]
126        pub unsafe fn createFunction(
127            self: Pin<&mut Module>,
128            muFuncName: *const c_char,
129        ) -> *mut Function;
130
131        #[namespace = "pxl::kernel"]
132        pub unsafe fn destroyFunction(self: Pin<&mut Module>, function: *mut Function);
133
134        // runtime API
135        #[namespace = "pxl::runtime"]
136        pub fn getNumDevice() -> u32;
137        #[namespace = "pxl::runtime"]
138        pub fn createContext(device_id: u32) -> *mut Context;
139        #[namespace = "pxl::runtime"]
140        pub unsafe fn destroyContext(context: *mut Context);
141        #[namespace = "pxl::runtime"]
142        pub unsafe fn createStream() -> *mut Stream;
143        #[namespace = "pxl::runtime"]
144        pub unsafe fn destroyStream(stream: *mut Stream);
145
146        // context.hpp
147        #[namespace = "pxl::runtime"]
148        pub fn deviceId(self: &Context) -> u32;
149
150        #[namespace = "pxl::runtime"]
151        pub fn createJob(self: Pin<&mut Context>) -> *mut Job;
152        #[namespace = "pxl::runtime"]
153        pub unsafe fn create_job_with_sub(context: *mut Context, num_sub: u32) -> *mut Job;
154        #[namespace = "pxl::runtime"]
155        pub unsafe fn destroyJob(self: Pin<&mut Context>, job: *mut Job) -> PxlResult;
156
157        #[namespace = "pxl::runtime"]
158        pub fn stream(self: &Context) -> *mut Stream;
159
160        #[namespace = "pxl::runtime"]
161        pub fn availableSubCount(self: &Context) -> u32;
162        #[namespace = "pxl::runtime"]
163        pub fn availableMemSize(self: &Context) -> u64;
164        #[namespace = "pxl::runtime"]
165        pub fn availableIoMemSize(self: &Context) -> u64;
166
167        #[namespace = "pxl::runtime"]
168        pub fn getAttribute(self: &Context, attr: DeviceAttr, value: &mut u64) -> PxlResult;
169
170        #[namespace = "pxl::runtime"]
171        pub fn memAlloc(self: Pin<&mut Context>, size: usize) -> *mut c_void;
172        #[namespace = "pxl::runtime"]
173        pub fn memCalloc(self: Pin<&mut Context>, num: usize, size: usize) -> *mut c_void;
174        #[namespace = "pxl::runtime"]
175        pub fn ioMemAlloc(self: Pin<&mut Context>, size: usize) -> *mut c_void;
176        #[namespace = "pxl::runtime"]
177        pub unsafe fn memFree(self: Pin<&mut Context>, ptr: *const c_void);
178
179        #[namespace = "pxl::runtime"]
180        pub unsafe fn copyToDevice(
181            self: Pin<&mut Context>,
182            device_ptr: *const c_void,
183            host_ptr: *const c_void,
184            size: usize,
185        ) -> PxlResult;
186        #[namespace = "pxl::runtime"]
187        pub unsafe fn copyFromDevice(
188            self: Pin<&mut Context>,
189            host_ptr: *const c_void,
190            device_ptr: *const c_void,
191            size: usize,
192        ) -> PxlResult;
193        #[namespace = "pxl::runtime"]
194        pub unsafe fn syncToDevice(
195            self: Pin<&mut Context>,
196            device_ptr: *const c_void,
197            size: usize,
198        ) -> PxlResult;
199        #[namespace = "pxl::runtime"]
200        pub unsafe fn syncFromDevice(
201            self: Pin<&mut Context>,
202            device_ptr: *const c_void,
203            size: usize,
204        ) -> PxlResult;
205        #[namespace = "pxl::runtime"]
206        pub unsafe fn getMemInfo(self: Pin<&mut Context>, host_ptr: *const c_void) -> MemInfo_t;
207
208        // job.hpp
209        #[namespace = "pxl::runtime"]
210        pub unsafe fn load(self: Pin<&mut Job>, filename: *const c_char) -> PxlResult;
211        #[namespace = "pxl::runtime"]
212        pub fn isLoaded(self: &Job) -> bool;
213        #[namespace = "pxl::runtime"]
214        pub fn subAlloc(self: Pin<&mut Job>) -> PxlResult;
215        #[namespace = "pxl::runtime"]
216        pub fn subFree(self: Pin<&mut Job>);
217        #[namespace = "pxl::runtime"]
218        pub unsafe fn buildMap(
219            self: Pin<&mut Job>,
220            function: *const Function,
221            count: u32,
222        ) -> *mut Map;
223
224        // map.hpp
225        #[namespace = "pxl::runtime"]
226        pub fn synchronize(self: Pin<&mut Map>) -> PxlResult;
227        #[namespace = "pxl::runtime"]
228        pub unsafe fn setStream(self: Pin<&mut Map>, stream: *mut Stream);
229        #[namespace = "pxl::runtime"]
230        pub unsafe fn setBatchSize(self: Pin<&mut Map>, batch_size: &u32);
231        #[namespace = "pxl::runtime"]
232        pub fn setClusterBitmap(self: Pin<&mut Map>, cluster_bitmap: &u32);
233        #[namespace = "pxl::runtime"]
234        pub fn streamId(self: &Map) -> u32;
235        #[namespace = "pxl::runtime"]
236        pub fn getExecuteStatus(self: &Map) -> ExecuteStatus;
237
238        // stream.hpp
239        #[namespace = "pxl::runtime"]
240        pub fn streamId(self: &Stream) -> u32;
241
242        // Wrappers
243
244        #[namespace = "pxl::runtime"]
245        pub unsafe fn job_load_module(job: *mut Job, module: *mut Module) -> PxlResult; // required because of name conflict
246        #[namespace = "pxl::runtime"]
247        pub unsafe fn job_get_sub_id_list(
248            job: *mut Job,
249            sub_ids: *mut u32,
250            max_size: usize,
251        ) -> usize;
252        #[namespace = "pxl::runtime"]
253        pub unsafe fn job_sub_alloc_with_num(job: *mut Job, num_sub: u32) -> PxlResult;
254        #[namespace = "pxl::runtime"]
255        pub unsafe fn job_sub_free_with_num(job: *mut Job, num_sub: u32);
256        #[namespace = "pxl::runtime"]
257        pub unsafe fn job_build_map_with_func_name(
258            job: *mut Job,
259            mu_func_name: *const c_char,
260            test_count: u32,
261        ) -> *mut Map;
262        #[namespace = "pxl::runtime"]
263        pub unsafe fn job_build_map_with_count(job: *mut Job, test_count: u32) -> *mut Map;
264        #[namespace = "pxl::runtime"]
265        pub unsafe fn destroy_map(map: *mut Map);
266        #[namespace = "pxl::runtime"]
267        pub unsafe fn map_execute(
268            map: *mut Map,
269            args: *mut ArgInfo_t,
270            num_args: usize,
271        ) -> PxlResult;
272        #[namespace = "pxl::runtime"]
273        pub unsafe fn check_callback_interface(
274            callback_ptr: *mut c_void,
275            user_data: *mut c_void,
276        ) -> bool;
277        #[namespace = "pxl::runtime"]
278        pub unsafe fn map_set_completion_callback(
279            map: *mut Map,
280            callback_ptr: *mut c_void,
281            user_data: *mut c_void,
282        );
283        #[namespace = "pxl::runtime"]
284        pub unsafe fn map_set_error_callback(
285            map: *mut Map,
286            callback_ptr: *mut c_void,
287            user_data: *mut c_void,
288        );
289        #[namespace = "pxl::runtime"]
290        pub unsafe fn map_set_message_callback(
291            map: *mut Map,
292            callback_ptr: *mut c_void,
293            user_data: *mut c_void,
294        );
295        #[namespace = "pxl::runtime"]
296        pub unsafe fn map_set_default_stream(map: *mut Map);
297        #[namespace = "pxl::runtime"]
298        pub unsafe fn map_get_kernel_error(
299            map: *mut Map,
300            error_count: *mut usize,
301        ) -> *const KernelError_t;
302    }
303}
304
305pub use ffi::*;