Skip to main content

fmi_export/fmi3/
export.rs

1/// Generates getter and setter functions for FMI3 data types.
2#[macro_export]
3macro_rules! generate_getset_functions {
4    ($ty:ty, $type_name:ident, $fmi_type:ty) => {
5        $crate::paste::paste! {
6            #[unsafe(export_name = stringify!([<fmi3Get $type_name>]))]
7            #[cfg_attr(coverage_nightly, coverage(off))]
8            pub unsafe extern "C" fn [<fmi3_get_ $type_name:snake>](
9                instance: ::fmi::fmi3::binding::fmi3Instance,
10                value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
11                n_value_references: usize,
12                values: *mut $fmi_type,
13                n_values: usize,
14            ) -> ::fmi::fmi3::binding::fmi3Status {
15                <$ty as $crate::fmi3::Fmi3Common>::[<fmi3_get_ $type_name:snake>](
16                    instance,
17                    value_references,
18                    n_value_references,
19                    values,
20                    n_values
21                )
22            }
23
24            #[unsafe(export_name = stringify!([<fmi3Set $type_name>]))]
25            #[cfg_attr(coverage_nightly, coverage(off))]
26            pub unsafe extern "C" fn [<fmi3_set_ $type_name:snake>](
27                instance: ::fmi::fmi3::binding::fmi3Instance,
28                value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
29                n_value_references: usize,
30                values: *const $fmi_type,
31                n_values: usize,
32            ) -> ::fmi::fmi3::binding::fmi3Status {
33                <$ty as $crate::fmi3::Fmi3Common>::[<fmi3_set_ $type_name:snake>](
34                    instance,
35                    value_references,
36                    n_value_references,
37                    values,
38                    n_values
39                )
40            }
41        }
42    };
43}
44
45/// Main macro for exporting an FMI 3.0 model as a shared library.
46///
47/// This macro generates all the required C API functions for an FMI 3.0 Functional Mockup Unit (FMU).
48/// It creates the complete interface required by an FMU importer.
49///
50/// # Parameters
51///
52/// - `$ty`: The model type that implements the `Model` trait
53///
54/// # Requirements
55///
56/// The model type `$ty` must implement:
57/// - `Model` trait: Provides model metadata and core simulation functionality
58/// - `Default`: For creating initial model instances
59/// - `UserModel`: For user-defined model behavior
60///
61/// # Static Exports
62///
63/// The macro also exports static symbols that can be extracted from the compiled library:
64/// - `FMI3_MODEL_VARIABLES`: XML description of model variables
65/// - `FMI3_MODEL_STRUCTURE`: XML description of model structure
66/// - `FMI3_INSTANTIATION_TOKEN`: Unique token for model validation
67///
68/// # Safety
69///
70/// All generated functions include appropriate safety checks:
71/// - Null pointer validation for instance parameters
72/// - Array bounds checking for multi-value operations
73/// - Proper error handling and status reporting
74/// - Safe conversion between C and Rust data types
75#[macro_export]
76macro_rules! export_fmu {
77    ($ty:ty) => {
78        /// Export the model components
79        #[unsafe(export_name = "model_metadata")]
80        pub fn model_metadata() -> (
81            ::fmi::fmi3::schema::ModelVariables,
82            ::fmi::fmi3::schema::ModelStructure,
83        ) {
84            <$ty as ::fmi_export::fmi3::Model>::build_toplevel_metadata()
85        }
86
87        #[unsafe(export_name = "FMI3_INSTANTIATION_TOKEN")]
88        pub static FMI3_INSTANTIATION_TOKEN: &'static str =
89            <$ty as ::fmi_export::fmi3::Model>::INSTANTIATION_TOKEN;
90
91        #[unsafe(export_name = "fmi3SupportsModelExchange")]
92        #[cfg_attr(coverage_nightly, coverage(off))]
93        pub unsafe extern "C" fn fmi3_supports_model_exchange() -> ::fmi::fmi3::binding::fmi3Boolean
94        {
95            <$ty as ::fmi_export::fmi3::Model>::SUPPORTS_MODEL_EXCHANGE as _
96        }
97
98        #[unsafe(export_name = "fmi3SupportsCoSimulation")]
99        #[cfg_attr(coverage_nightly, coverage(off))]
100        pub unsafe extern "C" fn fmi3_supports_co_simulation() -> ::fmi::fmi3::binding::fmi3Boolean
101        {
102            <$ty as ::fmi_export::fmi3::Model>::SUPPORTS_CO_SIMULATION as _
103        }
104
105        #[unsafe(export_name = "fmi3SupportsScheduledExecution")]
106        #[cfg_attr(coverage_nightly, coverage(off))]
107        pub unsafe extern "C" fn fmi3_supports_scheduled_execution()
108        -> ::fmi::fmi3::binding::fmi3Boolean {
109            <$ty as ::fmi_export::fmi3::Model>::SUPPORTS_SCHEDULED_EXECUTION as _
110        }
111
112        // Inquire version numbers and set debug logging
113
114        #[unsafe(export_name = "fmi3GetVersion")]
115        #[cfg_attr(coverage_nightly, coverage(off))]
116        pub unsafe extern "C" fn fmi3_get_version() -> *const ::std::os::raw::c_char {
117            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_version()
118        }
119
120        #[unsafe(export_name = "fmi3SetDebugLogging")]
121        #[cfg_attr(coverage_nightly, coverage(off))]
122        pub unsafe extern "C" fn fmi3_set_debug_logging(
123            instance: ::fmi::fmi3::binding::fmi3Instance,
124            logging_on: ::fmi::fmi3::binding::fmi3Boolean,
125            n_categories: usize,
126            categories: *const ::fmi::fmi3::binding::fmi3String,
127        ) -> ::fmi::fmi3::binding::fmi3Status {
128            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_debug_logging(
129                instance,
130                logging_on,
131                n_categories,
132                categories,
133            )
134        }
135
136        // Creation and destruction of FMU instances
137
138        #[unsafe(export_name = "fmi3InstantiateModelExchange")]
139        #[cfg_attr(coverage_nightly, coverage(off))]
140        unsafe extern "C" fn fmi3_instantiate_model_exchange(
141            instance_name: ::fmi::fmi3::binding::fmi3String,
142            instantiation_token: ::fmi::fmi3::binding::fmi3String,
143            resource_path: ::fmi::fmi3::binding::fmi3String,
144            visible: ::fmi::fmi3::binding::fmi3Boolean,
145            logging_on: ::fmi::fmi3::binding::fmi3Boolean,
146            instance_environment: ::fmi::fmi3::binding::fmi3InstanceEnvironment,
147            log_message: ::fmi::fmi3::binding::fmi3LogMessageCallback,
148        ) -> ::fmi::fmi3::binding::fmi3Instance {
149            <$ty as $crate::fmi3::Fmi3Common>::fmi3_instantiate_model_exchange(
150                instance_name,
151                instantiation_token,
152                resource_path,
153                visible,
154                logging_on,
155                instance_environment,
156                log_message,
157            )
158        }
159
160        #[unsafe(export_name = "fmi3InstantiateCoSimulation")]
161        #[cfg_attr(coverage_nightly, coverage(off))]
162        unsafe extern "C" fn fmi3_instantiate_co_simulation(
163            instance_name: ::fmi::fmi3::binding::fmi3String,
164            instantiation_token: ::fmi::fmi3::binding::fmi3String,
165            resource_path: ::fmi::fmi3::binding::fmi3String,
166            visible: ::fmi::fmi3::binding::fmi3Boolean,
167            logging_on: ::fmi::fmi3::binding::fmi3Boolean,
168            event_mode_used: ::fmi::fmi3::binding::fmi3Boolean,
169            early_return_allowed: ::fmi::fmi3::binding::fmi3Boolean,
170            required_intermediate_variables: *const ::fmi::fmi3::binding::fmi3ValueReference,
171            n_required_intermediate_variables: usize,
172            instance_environment: ::fmi::fmi3::binding::fmi3InstanceEnvironment,
173            log_message: ::fmi::fmi3::binding::fmi3LogMessageCallback,
174            intermediate_update: ::fmi::fmi3::binding::fmi3IntermediateUpdateCallback,
175        ) -> ::fmi::fmi3::binding::fmi3Instance {
176            <$ty as $crate::fmi3::Fmi3Common>::fmi3_instantiate_co_simulation(
177                instance_name,
178                instantiation_token,
179                resource_path,
180                visible,
181                logging_on,
182                event_mode_used,
183                early_return_allowed,
184                required_intermediate_variables,
185                n_required_intermediate_variables,
186                instance_environment,
187                log_message,
188                intermediate_update,
189            )
190        }
191
192        #[unsafe(export_name = "fmi3InstantiateScheduledExecution")]
193        #[cfg_attr(coverage_nightly, coverage(off))]
194        unsafe extern "C" fn fmi3_instantiate_scheduled_execution(
195            instance_name: ::fmi::fmi3::binding::fmi3String,
196            instantiation_token: ::fmi::fmi3::binding::fmi3String,
197            resource_path: ::fmi::fmi3::binding::fmi3String,
198            visible: ::fmi::fmi3::binding::fmi3Boolean,
199            logging_on: ::fmi::fmi3::binding::fmi3Boolean,
200            instance_environment: ::fmi::fmi3::binding::fmi3InstanceEnvironment,
201            log_message: ::fmi::fmi3::binding::fmi3LogMessageCallback,
202            clock_update: ::fmi::fmi3::binding::fmi3ClockUpdateCallback,
203            lock_preemption: ::fmi::fmi3::binding::fmi3LockPreemptionCallback,
204            unlock_preemption: ::fmi::fmi3::binding::fmi3UnlockPreemptionCallback,
205        ) -> ::fmi::fmi3::binding::fmi3Instance {
206            <$ty as $crate::fmi3::Fmi3Common>::fmi3_instantiate_scheduled_execution(
207                instance_name,
208                instantiation_token,
209                resource_path,
210                visible,
211                logging_on,
212                instance_environment,
213                log_message,
214                clock_update,
215                lock_preemption,
216                unlock_preemption,
217            )
218        }
219
220        #[unsafe(export_name = "fmi3FreeInstance")]
221        #[cfg_attr(coverage_nightly, coverage(off))]
222        unsafe extern "C" fn fmi3_free_instance(instance: ::fmi::fmi3::binding::fmi3Instance) {
223            <$ty as $crate::fmi3::Fmi3Common>::fmi3_free_instance(instance)
224        }
225
226        // Enter and exit initialization mode, terminate and reset
227
228        #[unsafe(export_name = "fmi3EnterInitializationMode")]
229        #[cfg_attr(coverage_nightly, coverage(off))]
230        unsafe extern "C" fn fmi3_enter_initialization_mode(
231            instance: ::fmi::fmi3::binding::fmi3Instance,
232            tolerance_defined: ::fmi::fmi3::binding::fmi3Boolean,
233            tolerance: ::fmi::fmi3::binding::fmi3Float64,
234            start_time: ::fmi::fmi3::binding::fmi3Float64,
235            stop_time_defined: ::fmi::fmi3::binding::fmi3Boolean,
236            stop_time: ::fmi::fmi3::binding::fmi3Float64,
237        ) -> ::fmi::fmi3::binding::fmi3Status {
238            <$ty as $crate::fmi3::Fmi3Common>::fmi3_enter_initialization_mode(
239                instance,
240                tolerance_defined,
241                tolerance,
242                start_time,
243                stop_time_defined,
244                stop_time,
245            )
246        }
247
248        #[unsafe(export_name = "fmi3ExitInitializationMode")]
249        #[cfg_attr(coverage_nightly, coverage(off))]
250        unsafe extern "C" fn fmi3_exit_initialization_mode(
251            instance: ::fmi::fmi3::binding::fmi3Instance,
252        ) -> ::fmi::fmi3::binding::fmi3Status {
253            <$ty as $crate::fmi3::Fmi3Common>::fmi3_exit_initialization_mode(instance)
254        }
255
256        #[unsafe(export_name = "fmi3EnterEventMode")]
257        #[cfg_attr(coverage_nightly, coverage(off))]
258        unsafe extern "C" fn fmi3_enter_event_mode(
259            instance: ::fmi::fmi3::binding::fmi3Instance,
260        ) -> ::fmi::fmi3::binding::fmi3Status {
261            <$ty as $crate::fmi3::Fmi3Common>::fmi3_enter_event_mode(instance)
262        }
263
264        #[unsafe(export_name = "fmi3Terminate")]
265        #[cfg_attr(coverage_nightly, coverage(off))]
266        unsafe extern "C" fn fmi3_terminate(
267            instance: ::fmi::fmi3::binding::fmi3Instance,
268        ) -> ::fmi::fmi3::binding::fmi3Status {
269            <$ty as $crate::fmi3::Fmi3Common>::fmi3_terminate(instance)
270        }
271
272        #[unsafe(export_name = "fmi3Reset")]
273        #[cfg_attr(coverage_nightly, coverage(off))]
274        unsafe extern "C" fn fmi3_reset(
275            instance: ::fmi::fmi3::binding::fmi3Instance,
276        ) -> ::fmi::fmi3::binding::fmi3Status {
277            <$ty as $crate::fmi3::Fmi3Common>::fmi3_reset(instance)
278        }
279
280        // Getting and setting variable values
281
282        $crate::generate_getset_functions!($ty, Float64, ::fmi::fmi3::binding::fmi3Float64);
283        $crate::generate_getset_functions!($ty, Float32, ::fmi::fmi3::binding::fmi3Float32);
284        $crate::generate_getset_functions!($ty, Int64, ::fmi::fmi3::binding::fmi3Int64);
285        $crate::generate_getset_functions!($ty, Int32, ::fmi::fmi3::binding::fmi3Int32);
286        $crate::generate_getset_functions!($ty, Int16, ::fmi::fmi3::binding::fmi3Int16);
287        $crate::generate_getset_functions!($ty, Int8, ::fmi::fmi3::binding::fmi3Int8);
288        $crate::generate_getset_functions!($ty, UInt64, ::fmi::fmi3::binding::fmi3UInt64);
289        $crate::generate_getset_functions!($ty, UInt32, ::fmi::fmi3::binding::fmi3UInt32);
290        $crate::generate_getset_functions!($ty, UInt16, ::fmi::fmi3::binding::fmi3UInt16);
291        $crate::generate_getset_functions!($ty, UInt8, ::fmi::fmi3::binding::fmi3UInt8);
292        $crate::generate_getset_functions!($ty, Boolean, ::fmi::fmi3::binding::fmi3Boolean);
293
294        // String and Binary types need special handling due to their different signatures
295        #[unsafe(export_name = "fmi3GetString")]
296        pub unsafe extern "C" fn fmi3_get_string(
297            instance: ::fmi::fmi3::binding::fmi3Instance,
298            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
299            n_value_references: usize,
300            values: *mut ::fmi::fmi3::binding::fmi3String,
301            n_values: usize,
302        ) -> ::fmi::fmi3::binding::fmi3Status {
303            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_string(
304                instance,
305                value_references,
306                n_value_references,
307                values,
308                n_values,
309            )
310        }
311
312        #[unsafe(export_name = "fmi3SetString")]
313        pub unsafe extern "C" fn fmi3_set_string(
314            instance: ::fmi::fmi3::binding::fmi3Instance,
315            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
316            n_value_references: usize,
317            values: *const ::fmi::fmi3::binding::fmi3String,
318            n_values: usize,
319        ) -> ::fmi::fmi3::binding::fmi3Status {
320            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_string(
321                instance,
322                value_references,
323                n_value_references,
324                values,
325                n_values,
326            )
327        }
328
329        #[unsafe(export_name = "fmi3GetBinary")]
330        pub unsafe extern "C" fn fmi3_get_binary(
331            instance: ::fmi::fmi3::binding::fmi3Instance,
332            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
333            n_value_references: usize,
334            value_sizes: *mut usize,
335            values: *mut *mut ::fmi::fmi3::binding::fmi3Byte,
336            n_values: usize,
337        ) -> ::fmi::fmi3::binding::fmi3Status {
338            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_binary(
339                instance,
340                value_references,
341                n_value_references,
342                value_sizes,
343                values,
344                n_values,
345            )
346        }
347
348        #[unsafe(export_name = "fmi3SetBinary")]
349        pub unsafe extern "C" fn fmi3_set_binary(
350            instance: ::fmi::fmi3::binding::fmi3Instance,
351            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
352            n_value_references: usize,
353            value_sizes: *const usize,
354            values: *const *const ::fmi::fmi3::binding::fmi3Byte,
355            n_values: usize,
356        ) -> ::fmi::fmi3::binding::fmi3Status {
357            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_binary(
358                instance,
359                value_references,
360                n_value_references,
361                value_sizes,
362                values,
363                n_values,
364            )
365        }
366
367        #[unsafe(export_name = "fmi3GetClock")]
368        pub unsafe extern "C" fn fmi3_get_clock(
369            instance: ::fmi::fmi3::binding::fmi3Instance,
370            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
371            n_value_references: usize,
372            values: *mut ::fmi::fmi3::binding::fmi3Clock,
373        ) -> ::fmi::fmi3::binding::fmi3Status {
374            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_clock(
375                instance,
376                value_references,
377                n_value_references,
378                values,
379            )
380        }
381
382        #[unsafe(export_name = "fmi3SetClock")]
383        pub unsafe extern "C" fn fmi3_set_clock(
384            instance: ::fmi::fmi3::binding::fmi3Instance,
385            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
386            n_value_references: usize,
387            values: *const ::fmi::fmi3::binding::fmi3Clock,
388        ) -> ::fmi::fmi3::binding::fmi3Status {
389            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_clock(
390                instance,
391                value_references,
392                n_value_references,
393                values,
394            )
395        }
396
397        // Getting Variable Dependency Information
398
399        #[unsafe(export_name = "fmi3GetNumberOfVariableDependencies")]
400        unsafe extern "C" fn fmi3_get_number_of_variable_dependencies(
401            instance: ::fmi::fmi3::binding::fmi3Instance,
402            value_reference: ::fmi::fmi3::binding::fmi3ValueReference,
403            n_dependencies: *mut usize,
404        ) -> ::fmi::fmi3::binding::fmi3Status {
405            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_number_of_variable_dependencies(
406                instance,
407                value_reference,
408                n_dependencies,
409            )
410        }
411
412        #[unsafe(export_name = "fmi3GetVariableDependencies")]
413        unsafe extern "C" fn fmi3_get_variable_dependencies(
414            instance: ::fmi::fmi3::binding::fmi3Instance,
415            dependent: ::fmi::fmi3::binding::fmi3ValueReference,
416            element_indices_of_dependent: *mut usize,
417            independents: *mut ::fmi::fmi3::binding::fmi3ValueReference,
418            element_indices_of_independents: *mut usize,
419            dependency_kinds: *mut ::fmi::fmi3::binding::fmi3DependencyKind,
420            n_dependencies: usize,
421        ) -> ::fmi::fmi3::binding::fmi3Status {
422            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_variable_dependencies(
423                instance,
424                dependent,
425                element_indices_of_dependent,
426                independents,
427                element_indices_of_independents,
428                dependency_kinds,
429                n_dependencies,
430            )
431        }
432
433        // Getting and setting the internal FMU state
434
435        #[unsafe(export_name = "fmi3GetFMUState")]
436        unsafe extern "C" fn fmi3_get_fmu_state(
437            instance: ::fmi::fmi3::binding::fmi3Instance,
438            fmu_state: *mut ::fmi::fmi3::binding::fmi3FMUState,
439        ) -> ::fmi::fmi3::binding::fmi3Status {
440            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_fmu_state(instance, fmu_state)
441        }
442
443        #[unsafe(export_name = "fmi3SetFMUState")]
444        unsafe extern "C" fn fmi3_set_fmu_state(
445            instance: ::fmi::fmi3::binding::fmi3Instance,
446            fmu_state: ::fmi::fmi3::binding::fmi3FMUState,
447        ) -> ::fmi::fmi3::binding::fmi3Status {
448            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_fmu_state(instance, fmu_state)
449        }
450
451        #[unsafe(export_name = "fmi3FreeFMUState")]
452        unsafe extern "C" fn fmi3_free_fmu_state(
453            instance: ::fmi::fmi3::binding::fmi3Instance,
454            fmu_state: *mut ::fmi::fmi3::binding::fmi3FMUState,
455        ) -> ::fmi::fmi3::binding::fmi3Status {
456            <$ty as $crate::fmi3::Fmi3Common>::fmi3_free_fmu_state(instance, fmu_state)
457        }
458
459        #[unsafe(export_name = "fmi3SerializedFMUStateSize")]
460        unsafe fn fmi3_serialized_fmu_state_size(
461            instance: ::fmi::fmi3::binding::fmi3Instance,
462            fmu_state: ::fmi::fmi3::binding::fmi3FMUState,
463            size: *mut usize,
464        ) -> ::fmi::fmi3::binding::fmi3Status {
465            <$ty as $crate::fmi3::Fmi3Common>::fmi3_serialized_fmu_state_size(
466                instance, fmu_state, size,
467            )
468        }
469
470        #[unsafe(export_name = "fmi3SerializeFMUState")]
471        unsafe fn fmi3_serialize_fmu_state(
472            instance: ::fmi::fmi3::binding::fmi3Instance,
473            fmu_state: ::fmi::fmi3::binding::fmi3FMUState,
474            serialized_state: *mut ::fmi::fmi3::binding::fmi3Byte,
475            size: usize,
476        ) -> ::fmi::fmi3::binding::fmi3Status {
477            <$ty as $crate::fmi3::Fmi3Common>::fmi3_serialize_fmu_state(
478                instance,
479                fmu_state,
480                serialized_state,
481                size,
482            )
483        }
484
485        #[unsafe(export_name = "fmi3DeserializeFMUState")]
486        pub unsafe fn fmi3_deserialize_fmu_state(
487            instance: ::fmi::fmi3::binding::fmi3Instance,
488            serialized_state: *const ::fmi::fmi3::binding::fmi3Byte,
489            size: usize,
490            fmu_state: *mut ::fmi::fmi3::binding::fmi3FMUState,
491        ) -> ::fmi::fmi3::binding::fmi3Status {
492            <$ty as $crate::fmi3::Fmi3Common>::fmi3_deserialize_fmu_state(
493                instance,
494                serialized_state,
495                size,
496                fmu_state,
497            )
498        }
499
500        // Getting partial derivatives
501
502        #[unsafe(export_name = "fmi3GetDirectionalDerivative")]
503        unsafe extern "C" fn fmi3_get_directional_derivative(
504            instance: ::fmi::fmi3::binding::fmi3Instance,
505            unknowns: *const ::fmi::fmi3::binding::fmi3ValueReference,
506            n_unknowns: usize,
507            knowns: *const ::fmi::fmi3::binding::fmi3ValueReference,
508            n_knowns: usize,
509            seed: *const ::fmi::fmi3::binding::fmi3Float64,
510            n_seed: usize,
511            sensitivity: *mut ::fmi::fmi3::binding::fmi3Float64,
512            n_sensitivity: usize,
513        ) -> ::fmi::fmi3::binding::fmi3Status {
514            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_directional_derivative(
515                instance,
516                unknowns,
517                n_unknowns,
518                knowns,
519                n_knowns,
520                seed,
521                n_seed,
522                sensitivity,
523                n_sensitivity,
524            )
525        }
526
527        #[unsafe(export_name = "fmi3GetAdjointDerivative")]
528        unsafe extern "C" fn fmi3_get_adjoint_derivative(
529            instance: ::fmi::fmi3::binding::fmi3Instance,
530            unknowns: *const ::fmi::fmi3::binding::fmi3ValueReference,
531            n_unknowns: usize,
532            knowns: *const ::fmi::fmi3::binding::fmi3ValueReference,
533            n_knowns: usize,
534            seed: *const ::fmi::fmi3::binding::fmi3Float64,
535            n_seed: usize,
536            sensitivity: *mut ::fmi::fmi3::binding::fmi3Float64,
537            n_sensitivity: usize,
538        ) -> ::fmi::fmi3::binding::fmi3Status {
539            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_adjoint_derivative(
540                instance,
541                unknowns,
542                n_unknowns,
543                knowns,
544                n_knowns,
545                seed,
546                n_seed,
547                sensitivity,
548                n_sensitivity,
549            )
550        }
551
552        // Entering and exiting the Configuration or Reconfiguration Mode
553
554        #[unsafe(export_name = "fmi3EnterConfigurationMode")]
555        unsafe extern "C" fn fmi3_enter_configuration_mode(
556            instance: ::fmi::fmi3::binding::fmi3Instance,
557        ) -> ::fmi::fmi3::binding::fmi3Status {
558            <$ty as $crate::fmi3::Fmi3Common>::fmi3_enter_configuration_mode(instance)
559        }
560
561        #[unsafe(export_name = "fmi3ExitConfigurationMode")]
562        unsafe extern "C" fn fmi3_exit_configuration_mode(
563            instance: ::fmi::fmi3::binding::fmi3Instance,
564        ) -> ::fmi::fmi3::binding::fmi3Status {
565            <$ty as $crate::fmi3::Fmi3Common>::fmi3_exit_configuration_mode(instance)
566        }
567
568        // Clock related functions
569
570        #[unsafe(export_name = "fmi3GetIntervalDecimal")]
571        unsafe fn fmi3_get_interval_decimal(
572            instance: ::fmi::fmi3::binding::fmi3Instance,
573            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
574            n_value_references: usize,
575            intervals: *mut ::fmi::fmi3::binding::fmi3Float64,
576            qualifiers: *mut ::fmi::fmi3::binding::fmi3IntervalQualifier,
577        ) -> ::fmi::fmi3::binding::fmi3Status {
578            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_interval_decimal(
579                instance,
580                value_references,
581                n_value_references,
582                intervals,
583                qualifiers,
584            )
585        }
586
587        #[unsafe(export_name = "fmi3GetIntervalFraction")]
588        unsafe extern "C" fn fmi3_get_interval_fraction(
589            instance: ::fmi::fmi3::binding::fmi3Instance,
590            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
591            n_value_references: usize,
592            counters: *mut ::fmi::fmi3::binding::fmi3UInt64,
593            resolutions: *mut ::fmi::fmi3::binding::fmi3UInt64,
594            qualifiers: *mut ::fmi::fmi3::binding::fmi3IntervalQualifier,
595        ) -> ::fmi::fmi3::binding::fmi3Status {
596            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_interval_fraction(
597                instance,
598                value_references,
599                n_value_references,
600                counters,
601                resolutions,
602                qualifiers,
603            )
604        }
605
606        #[unsafe(export_name = "fmi3GetShiftDecimal")]
607        unsafe extern "C" fn fmi3_get_shift_decimal(
608            instance: ::fmi::fmi3::binding::fmi3Instance,
609            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
610            n_value_references: usize,
611            shifts: *mut ::fmi::fmi3::binding::fmi3Float64,
612        ) -> ::fmi::fmi3::binding::fmi3Status {
613            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_shift_decimal(
614                instance,
615                value_references,
616                n_value_references,
617                shifts,
618            )
619        }
620
621        #[unsafe(export_name = "fmi3GetShiftFraction")]
622        unsafe extern "C" fn fmi3_get_shift_fraction(
623            instance: ::fmi::fmi3::binding::fmi3Instance,
624            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
625            n_value_references: usize,
626            counters: *mut ::fmi::fmi3::binding::fmi3UInt64,
627            resolutions: *mut ::fmi::fmi3::binding::fmi3UInt64,
628        ) -> ::fmi::fmi3::binding::fmi3Status {
629            <$ty as $crate::fmi3::Fmi3Common>::fmi3_get_shift_fraction(
630                instance,
631                value_references,
632                n_value_references,
633                counters,
634                resolutions,
635            )
636        }
637
638        #[unsafe(export_name = "fmi3SetIntervalDecimal")]
639        unsafe extern "C" fn fmi3_set_interval_decimal(
640            instance: ::fmi::fmi3::binding::fmi3Instance,
641            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
642            n_value_references: usize,
643            intervals: *const ::fmi::fmi3::binding::fmi3Float64,
644        ) -> ::fmi::fmi3::binding::fmi3Status {
645            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_interval_decimal(
646                instance,
647                value_references,
648                n_value_references,
649                intervals,
650            )
651        }
652
653        #[unsafe(export_name = "fmi3SetIntervalFraction")]
654        unsafe extern "C" fn fmi3_set_interval_fraction(
655            instance: ::fmi::fmi3::binding::fmi3Instance,
656            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
657            n_value_references: usize,
658            counters: *const ::fmi::fmi3::binding::fmi3UInt64,
659            resolutions: *const ::fmi::fmi3::binding::fmi3UInt64,
660        ) -> ::fmi::fmi3::binding::fmi3Status {
661            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_interval_fraction(
662                instance,
663                value_references,
664                n_value_references,
665                counters,
666                resolutions,
667            )
668        }
669
670        #[unsafe(export_name = "fmi3SetShiftDecimal")]
671        unsafe extern "C" fn fmi3_set_shift_decimal(
672            instance: ::fmi::fmi3::binding::fmi3Instance,
673            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
674            n_value_references: usize,
675            shifts: *const ::fmi::fmi3::binding::fmi3Float64,
676        ) -> ::fmi::fmi3::binding::fmi3Status {
677            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_shift_decimal(
678                instance,
679                value_references,
680                n_value_references,
681                shifts,
682            )
683        }
684
685        #[unsafe(export_name = "fmi3SetShiftFraction")]
686        unsafe extern "C" fn fmi3_set_shift_fraction(
687            instance: ::fmi::fmi3::binding::fmi3Instance,
688            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
689            n_value_references: usize,
690            counters: *const ::fmi::fmi3::binding::fmi3UInt64,
691            resolutions: *const ::fmi::fmi3::binding::fmi3UInt64,
692        ) -> ::fmi::fmi3::binding::fmi3Status {
693            <$ty as $crate::fmi3::Fmi3Common>::fmi3_set_shift_fraction(
694                instance,
695                value_references,
696                n_value_references,
697                counters,
698                resolutions,
699            )
700        }
701
702        #[unsafe(export_name = "fmi3EvaluateDiscreteStates")]
703        unsafe extern "C" fn fmi3_evaluate_discrete_states(
704            instance: ::fmi::fmi3::binding::fmi3Instance,
705        ) -> ::fmi::fmi3::binding::fmi3Status {
706            <$ty as $crate::fmi3::Fmi3Common>::fmi3_evaluate_discrete_states(instance)
707        }
708
709        #[unsafe(export_name = "fmi3UpdateDiscreteStates")]
710        unsafe extern "C" fn fmi3_update_discrete_states(
711            instance: ::fmi::fmi3::binding::fmi3Instance,
712            discrete_states_need_update: *mut ::fmi::fmi3::binding::fmi3Boolean,
713            terminate_simulation: *mut ::fmi::fmi3::binding::fmi3Boolean,
714            nominals_of_continuous_states_changed: *mut ::fmi::fmi3::binding::fmi3Boolean,
715            values_of_continuous_states_changed: *mut ::fmi::fmi3::binding::fmi3Boolean,
716            next_event_time_defined: *mut ::fmi::fmi3::binding::fmi3Boolean,
717            next_event_time: *mut ::fmi::fmi3::binding::fmi3Float64,
718        ) -> ::fmi::fmi3::binding::fmi3Status {
719            <$ty as $crate::fmi3::Fmi3Common>::fmi3_update_discrete_states(
720                instance,
721                discrete_states_need_update,
722                terminate_simulation,
723                nominals_of_continuous_states_changed,
724                values_of_continuous_states_changed,
725                next_event_time_defined,
726                next_event_time,
727            )
728        }
729
730        // # Functions for Model Exchange
731
732        #[unsafe(export_name = "fmi3EnterContinuousTimeMode")]
733        unsafe extern "C" fn fmi3_enter_continuous_time_mode(
734            instance: ::fmi::fmi3::binding::fmi3Instance,
735        ) -> ::fmi::fmi3::binding::fmi3Status {
736            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_enter_continuous_time_mode(instance)
737        }
738
739        #[unsafe(export_name = "fmi3CompletedIntegratorStep")]
740        unsafe extern "C" fn fmi3_completed_integrator_step(
741            instance: ::fmi::fmi3::binding::fmi3Instance,
742            no_set_fmu_state_prior: ::fmi::fmi3::binding::fmi3Boolean,
743            enter_event_mode: *mut ::fmi::fmi3::binding::fmi3Boolean,
744            terminate_simulation: *mut ::fmi::fmi3::binding::fmi3Boolean,
745        ) -> ::fmi::fmi3::binding::fmi3Status {
746            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_completed_integrator_step(
747                instance,
748                no_set_fmu_state_prior,
749                enter_event_mode,
750                terminate_simulation,
751            )
752        }
753
754        // Providing independent variables and re-initialization of caching
755
756        #[unsafe(export_name = "fmi3SetTime")]
757        unsafe extern "C" fn fmi3_set_time(
758            instance: ::fmi::fmi3::binding::fmi3Instance,
759            time: ::fmi::fmi3::binding::fmi3Float64,
760        ) -> ::fmi::fmi3::binding::fmi3Status {
761            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_set_time(instance, time)
762        }
763
764        #[unsafe(export_name = "fmi3SetContinuousStates")]
765        unsafe extern "C" fn fmi3_set_continuous_states(
766            instance: ::fmi::fmi3::binding::fmi3Instance,
767            continuous_states: *const ::fmi::fmi3::binding::fmi3Float64,
768            n_continuous_states: usize,
769        ) -> ::fmi::fmi3::binding::fmi3Status {
770            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_set_continuous_states(
771                instance,
772                continuous_states,
773                n_continuous_states,
774            )
775        }
776
777        // Evaluation of the model equations
778
779        #[unsafe(export_name = "fmi3GetContinuousStateDerivatives")]
780        unsafe extern "C" fn fmi3_get_continuous_state_derivatives(
781            instance: ::fmi::fmi3::binding::fmi3Instance,
782            derivatives: *mut ::fmi::fmi3::binding::fmi3Float64,
783            n_continuous_states: usize,
784        ) -> ::fmi::fmi3::binding::fmi3Status {
785            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_get_continuous_state_derivatives(
786                instance,
787                derivatives,
788                n_continuous_states,
789            )
790        }
791
792        #[unsafe(export_name = "fmi3GetEventIndicators")]
793        unsafe extern "C" fn fmi3_get_event_indicators(
794            instance: ::fmi::fmi3::binding::fmi3Instance,
795            event_indicators: *mut ::fmi::fmi3::binding::fmi3Float64,
796            n_event_indicators: usize,
797        ) -> ::fmi::fmi3::binding::fmi3Status {
798            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_get_event_indicators(
799                instance,
800                event_indicators,
801                n_event_indicators,
802            )
803        }
804
805        #[unsafe(export_name = "fmi3GetContinuousStates")]
806        unsafe extern "C" fn fmi3_get_continuous_states(
807            instance: ::fmi::fmi3::binding::fmi3Instance,
808            continuous_states: *mut ::fmi::fmi3::binding::fmi3Float64,
809            n_continuous_states: usize,
810        ) -> ::fmi::fmi3::binding::fmi3Status {
811            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_get_continuous_states(
812                instance,
813                continuous_states,
814                n_continuous_states,
815            )
816        }
817
818        #[unsafe(export_name = "fmi3GetNominalsOfContinuousStates")]
819        unsafe extern "C" fn fmi3_get_nominals_of_continuous_states(
820            instance: ::fmi::fmi3::binding::fmi3Instance,
821            nominals: *mut ::fmi::fmi3::binding::fmi3Float64,
822            n_continuous_states: usize,
823        ) -> ::fmi::fmi3::binding::fmi3Status {
824            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_get_nominals_of_continuous_states(
825                instance,
826                nominals,
827                n_continuous_states,
828            )
829        }
830
831        #[unsafe(export_name = "fmi3GetNumberOfEventIndicators")]
832        unsafe extern "C" fn fmi3_get_number_of_event_indicators(
833            instance: ::fmi::fmi3::binding::fmi3Instance,
834            n_event_indicators: *mut usize,
835        ) -> ::fmi::fmi3::binding::fmi3Status {
836            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_get_number_of_event_indicators(
837                instance,
838                n_event_indicators,
839            )
840        }
841
842        #[unsafe(export_name = "fmi3GetNumberOfContinuousStates")]
843        unsafe extern "C" fn fmi3_get_number_of_continuous_states(
844            instance: ::fmi::fmi3::binding::fmi3Instance,
845            n_continuous_states: *mut usize,
846        ) -> ::fmi::fmi3::binding::fmi3Status {
847            <$ty as $crate::fmi3::Fmi3ModelExchange>::fmi3_get_number_of_continuous_states(
848                instance,
849                n_continuous_states,
850            )
851        }
852
853        // # Functions for Co-Simulation
854
855        #[unsafe(export_name = "fmi3EnterStepMode")]
856        unsafe extern "C" fn fmi3_enter_step_mode(
857            instance: ::fmi::fmi3::binding::fmi3Instance,
858        ) -> ::fmi::fmi3::binding::fmi3Status {
859            <$ty as $crate::fmi3::Fmi3CoSimulation>::fmi3_enter_step_mode(instance)
860        }
861
862        #[unsafe(export_name = "fmi3GetOutputDerivatives")]
863        unsafe extern "C" fn fmi3_get_output_derivatives(
864            instance: ::fmi::fmi3::binding::fmi3Instance,
865            value_references: *const ::fmi::fmi3::binding::fmi3ValueReference,
866            n_value_references: usize,
867            orders: *const ::fmi::fmi3::binding::fmi3Int32,
868            values: *mut ::fmi::fmi3::binding::fmi3Float64,
869            n_values: usize,
870        ) -> ::fmi::fmi3::binding::fmi3Status {
871            <$ty as $crate::fmi3::Fmi3CoSimulation>::fmi3_get_output_derivatives(
872                instance,
873                value_references,
874                n_value_references,
875                orders,
876                values,
877                n_values,
878            )
879        }
880
881        #[unsafe(export_name = "fmi3DoStep")]
882        unsafe extern "C" fn fmi3_do_step(
883            instance: ::fmi::fmi3::binding::fmi3Instance,
884            current_communication_point: ::fmi::fmi3::binding::fmi3Float64,
885            communication_step_size: ::fmi::fmi3::binding::fmi3Float64,
886            no_set_fmu_state_prior_to_current_point: ::fmi::fmi3::binding::fmi3Boolean,
887            event_handling_needed: *mut ::fmi::fmi3::binding::fmi3Boolean,
888            terminate_simulation: *mut ::fmi::fmi3::binding::fmi3Boolean,
889            early_return: *mut ::fmi::fmi3::binding::fmi3Boolean,
890            last_successful_time: *mut ::fmi::fmi3::binding::fmi3Float64,
891        ) -> ::fmi::fmi3::binding::fmi3Status {
892            <$ty as $crate::fmi3::Fmi3CoSimulation>::fmi3_do_step(
893                instance,
894                current_communication_point,
895                communication_step_size,
896                no_set_fmu_state_prior_to_current_point,
897                event_handling_needed,
898                terminate_simulation,
899                early_return,
900                last_successful_time,
901            )
902        }
903
904        #[unsafe(export_name = "fmi3ActivateModelPartition")]
905        unsafe extern "C" fn fmi3_activate_model_partition(
906            instance: ::fmi::fmi3::binding::fmi3Instance,
907            clock_reference: ::fmi::fmi3::binding::fmi3ValueReference,
908            activation_time: ::fmi::fmi3::binding::fmi3Float64,
909        ) -> ::fmi::fmi3::binding::fmi3Status {
910            <$ty as $crate::fmi3::Fmi3ScheduledExecution>::fmi3_activate_model_partition(
911                instance,
912                clock_reference,
913                activation_time,
914            )
915        }
916    };
917}