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