pySimBlocks 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. examples/advanced/hardware/block_diagram.py +162 -0
  2. examples/advanced/hardware/camera.py +93 -0
  3. examples/advanced/hardware/gui_emio.py +231 -0
  4. examples/advanced/hardware/lmi.py +69 -0
  5. examples/advanced/hardware/main.py +57 -0
  6. examples/advanced/hardware/parameters.py +54 -0
  7. examples/advanced/qp_problem/params.py +10 -0
  8. examples/advanced/qp_problem/run.py +14 -0
  9. examples/advanced/sofa/gui/finger/Finger.py +108 -0
  10. examples/advanced/sofa/gui/finger/FingerController.py +53 -0
  11. examples/advanced/sofa/gui/finger/parameters_auto.py +22 -0
  12. examples/advanced/sofa/gui/sofa_plant/run.py +14 -0
  13. examples/advanced/sofa/python/Finger.py +107 -0
  14. examples/advanced/sofa/python/FingerController.py +48 -0
  15. examples/advanced/sofa/python/closedloop.py +64 -0
  16. examples/advanced/sofa/python/openloop.py +58 -0
  17. examples/basics/algebraic_function/g.py +7 -0
  18. examples/basics/algebraic_function/run.py +14 -0
  19. examples/basics/dc_motor/gui/run.py +14 -0
  20. examples/basics/dc_motor/multiple_order.py +91 -0
  21. examples/basics/dc_motor/openloop.py +62 -0
  22. examples/basics/dc_motor/pi.py +99 -0
  23. examples/basics/dc_motor/pid.py +118 -0
  24. examples/basics/dc_motor/pid_block.py +82 -0
  25. examples/basics/dc_motor/pid_block_vs_manual.py +143 -0
  26. examples/basics/external/parameters.py +4 -0
  27. examples/basics/external/run.py +14 -0
  28. examples/basics/file_sources/temp.py +16 -0
  29. examples/basics/observer.py +76 -0
  30. examples/basics/state_feedback/gui/parameters.py +9 -0
  31. examples/basics/state_feedback/gui/run.py +14 -0
  32. examples/basics/state_feedback/state_feedback.py +102 -0
  33. examples/basics/state_space/linear/gui/run.py +14 -0
  34. examples/basics/state_space/linear/ss_block.py +89 -0
  35. examples/basics/state_space/linear/ss_manual.py +105 -0
  36. examples/basics/state_space/non_linear/nlss.py +47 -0
  37. examples/basics/state_space/non_linear/run.py +14 -0
  38. examples/basics/state_space/polytope/params.py +39 -0
  39. examples/basics/state_space/polytope/weights.py +12 -0
  40. examples/comparison/simulink/convert.py +29 -0
  41. examples/comparison/simulink/openloop.py +127 -0
  42. examples/comparison/simulink/pi.py +148 -0
  43. examples/comparison/simulink/pid.py +154 -0
  44. examples/comparison/simulink/pid_backward.py +155 -0
  45. examples/quick_start/filter.py +35 -0
  46. examples/quick_start/gui/run.py +14 -0
  47. examples/tutorials/tutorial_1_python/main.py +99 -0
  48. examples/tutorials/tutorial_3_sofa/finger/Finger.py +120 -0
  49. examples/tutorials/tutorial_3_sofa/finger/FingerController.py +37 -0
  50. pySimBlocks/__init__.py +35 -0
  51. pySimBlocks/blocks/__init__.py +68 -0
  52. pySimBlocks/blocks/controllers/__init__.py +27 -0
  53. pySimBlocks/blocks/controllers/pid.py +250 -0
  54. pySimBlocks/blocks/controllers/state_feedback.py +141 -0
  55. pySimBlocks/blocks/interfaces/__init__.py +27 -0
  56. pySimBlocks/blocks/interfaces/external_input.py +107 -0
  57. pySimBlocks/blocks/interfaces/external_output.py +113 -0
  58. pySimBlocks/blocks/observers/__init__.py +23 -0
  59. pySimBlocks/blocks/observers/luenberger.py +175 -0
  60. pySimBlocks/blocks/operators/__init__.py +47 -0
  61. pySimBlocks/blocks/operators/algebraic_function.py +258 -0
  62. pySimBlocks/blocks/operators/dead_zone.py +186 -0
  63. pySimBlocks/blocks/operators/delay.py +254 -0
  64. pySimBlocks/blocks/operators/demux.py +123 -0
  65. pySimBlocks/blocks/operators/discrete_derivator.py +237 -0
  66. pySimBlocks/blocks/operators/discrete_integrator.py +265 -0
  67. pySimBlocks/blocks/operators/gain.py +294 -0
  68. pySimBlocks/blocks/operators/mux.py +131 -0
  69. pySimBlocks/blocks/operators/product.py +194 -0
  70. pySimBlocks/blocks/operators/rate_limiter.py +214 -0
  71. pySimBlocks/blocks/operators/saturation.py +178 -0
  72. pySimBlocks/blocks/operators/sum.py +188 -0
  73. pySimBlocks/blocks/operators/zero_order_hold.py +141 -0
  74. pySimBlocks/blocks/optimizers/__init__.py +23 -0
  75. pySimBlocks/blocks/optimizers/quadratic_program.py +326 -0
  76. pySimBlocks/blocks/sources/__init__.py +37 -0
  77. pySimBlocks/blocks/sources/chirp.py +168 -0
  78. pySimBlocks/blocks/sources/constant.py +82 -0
  79. pySimBlocks/blocks/sources/file_source.py +294 -0
  80. pySimBlocks/blocks/sources/function_source.py +197 -0
  81. pySimBlocks/blocks/sources/ramp.py +99 -0
  82. pySimBlocks/blocks/sources/sinusoidal.py +113 -0
  83. pySimBlocks/blocks/sources/step.py +138 -0
  84. pySimBlocks/blocks/sources/white_noise.py +107 -0
  85. pySimBlocks/blocks/systems/__init__.py +27 -0
  86. pySimBlocks/blocks/systems/linear_state_space.py +180 -0
  87. pySimBlocks/blocks/systems/non_linear_state_space.py +309 -0
  88. pySimBlocks/blocks/systems/polytopic_state_space.py +193 -0
  89. pySimBlocks/blocks/systems/sofa/__init__.py +30 -0
  90. pySimBlocks/blocks/systems/sofa/sofa_controller.py +472 -0
  91. pySimBlocks/blocks/systems/sofa/sofa_exchange_i_o.py +120 -0
  92. pySimBlocks/blocks/systems/sofa/sofa_plant.py +306 -0
  93. pySimBlocks/cli.py +127 -0
  94. pySimBlocks/core/__init__.py +32 -0
  95. pySimBlocks/core/block.py +167 -0
  96. pySimBlocks/core/block_source.py +94 -0
  97. pySimBlocks/core/config.py +90 -0
  98. pySimBlocks/core/fixed_time_manager.py +46 -0
  99. pySimBlocks/core/model.py +250 -0
  100. pySimBlocks/core/scheduler.py +30 -0
  101. pySimBlocks/core/simulator.py +329 -0
  102. pySimBlocks/core/task.py +73 -0
  103. pySimBlocks/docs/blocks/controllers/pid.md +78 -0
  104. pySimBlocks/docs/blocks/controllers/state_feedback.md +60 -0
  105. pySimBlocks/docs/blocks/interfaces/external_input.md +39 -0
  106. pySimBlocks/docs/blocks/interfaces/external_output.md +39 -0
  107. pySimBlocks/docs/blocks/observers/luenberger.md +70 -0
  108. pySimBlocks/docs/blocks/operators/algebraic_function.md +76 -0
  109. pySimBlocks/docs/blocks/operators/dead_zone.md +67 -0
  110. pySimBlocks/docs/blocks/operators/delay.md +76 -0
  111. pySimBlocks/docs/blocks/operators/demux.md +64 -0
  112. pySimBlocks/docs/blocks/operators/discrete_derivator.md +61 -0
  113. pySimBlocks/docs/blocks/operators/discrete_integrator.md +87 -0
  114. pySimBlocks/docs/blocks/operators/gain.md +97 -0
  115. pySimBlocks/docs/blocks/operators/mux.md +64 -0
  116. pySimBlocks/docs/blocks/operators/product.md +51 -0
  117. pySimBlocks/docs/blocks/operators/rate_limiter.md +70 -0
  118. pySimBlocks/docs/blocks/operators/saturation.md +62 -0
  119. pySimBlocks/docs/blocks/operators/sum.md +49 -0
  120. pySimBlocks/docs/blocks/operators/zero_order_hold.md +61 -0
  121. pySimBlocks/docs/blocks/optimizers/quadratic_program.md +98 -0
  122. pySimBlocks/docs/blocks/sources/chirp.md +102 -0
  123. pySimBlocks/docs/blocks/sources/constant.md +53 -0
  124. pySimBlocks/docs/blocks/sources/file_source.md +51 -0
  125. pySimBlocks/docs/blocks/sources/function_source.md +52 -0
  126. pySimBlocks/docs/blocks/sources/ramp.md +58 -0
  127. pySimBlocks/docs/blocks/sources/sinusoidal.md +60 -0
  128. pySimBlocks/docs/blocks/sources/step.md +63 -0
  129. pySimBlocks/docs/blocks/sources/white_noise.md +58 -0
  130. pySimBlocks/docs/blocks/systems/linear_state_space.md +66 -0
  131. pySimBlocks/docs/blocks/systems/non_linear_state_space.md +90 -0
  132. pySimBlocks/docs/blocks/systems/polytopic_state_space.md +72 -0
  133. pySimBlocks/docs/blocks/systems/sofa/sofa_exchange_i_o.md +63 -0
  134. pySimBlocks/docs/blocks/systems/sofa/sofa_plant.md +62 -0
  135. pySimBlocks/gui/__init__.py +20 -0
  136. pySimBlocks/gui/addons/__init__.py +19 -0
  137. pySimBlocks/gui/addons/sofa/__init__.py +19 -0
  138. pySimBlocks/gui/addons/sofa/sofa_dialog.py +190 -0
  139. pySimBlocks/gui/addons/sofa/sofa_service.py +209 -0
  140. pySimBlocks/gui/blocks/block_dialog_session.py +47 -0
  141. pySimBlocks/gui/blocks/block_meta.py +408 -0
  142. pySimBlocks/gui/blocks/controllers/pid.py +116 -0
  143. pySimBlocks/gui/blocks/controllers/state_feedback.py +80 -0
  144. pySimBlocks/gui/blocks/interfaces/external_input.py +64 -0
  145. pySimBlocks/gui/blocks/interfaces/external_output.py +63 -0
  146. pySimBlocks/gui/blocks/observers/luenberger.py +108 -0
  147. pySimBlocks/gui/blocks/operators/algebraic_function.py +232 -0
  148. pySimBlocks/gui/blocks/operators/dead_zone.py +79 -0
  149. pySimBlocks/gui/blocks/operators/delay.py +79 -0
  150. pySimBlocks/gui/blocks/operators/demux.py +98 -0
  151. pySimBlocks/gui/blocks/operators/discrete_derivator.py +67 -0
  152. pySimBlocks/gui/blocks/operators/discrete_integrator.py +80 -0
  153. pySimBlocks/gui/blocks/operators/gain.py +79 -0
  154. pySimBlocks/gui/blocks/operators/mux.py +100 -0
  155. pySimBlocks/gui/blocks/operators/product.py +109 -0
  156. pySimBlocks/gui/blocks/operators/rate_limiter.py +79 -0
  157. pySimBlocks/gui/blocks/operators/saturation.py +72 -0
  158. pySimBlocks/gui/blocks/operators/sum.py +91 -0
  159. pySimBlocks/gui/blocks/operators/zero_order_hold.py +64 -0
  160. pySimBlocks/gui/blocks/optimizers/quadratic_program.py +128 -0
  161. pySimBlocks/gui/blocks/parameter_meta.py +34 -0
  162. pySimBlocks/gui/blocks/port_meta.py +31 -0
  163. pySimBlocks/gui/blocks/sources/chirp.py +146 -0
  164. pySimBlocks/gui/blocks/sources/constant.py +63 -0
  165. pySimBlocks/gui/blocks/sources/file_source.py +196 -0
  166. pySimBlocks/gui/blocks/sources/function_source.py +202 -0
  167. pySimBlocks/gui/blocks/sources/ramp.py +73 -0
  168. pySimBlocks/gui/blocks/sources/sinusoidal.py +81 -0
  169. pySimBlocks/gui/blocks/sources/step.py +83 -0
  170. pySimBlocks/gui/blocks/sources/white_noise.py +70 -0
  171. pySimBlocks/gui/blocks/systems/linear_state_space.py +102 -0
  172. pySimBlocks/gui/blocks/systems/non_linear_state_space.py +233 -0
  173. pySimBlocks/gui/blocks/systems/polytopic_state_space.py +109 -0
  174. pySimBlocks/gui/blocks/systems/sofa/sofa_exchange_i_o.py +221 -0
  175. pySimBlocks/gui/blocks/systems/sofa/sofa_plant.py +220 -0
  176. pySimBlocks/gui/dialogs/__init__.py +19 -0
  177. pySimBlocks/gui/dialogs/block_dialog.py +125 -0
  178. pySimBlocks/gui/dialogs/display_yaml_dialog.py +89 -0
  179. pySimBlocks/gui/dialogs/help_dialog.py +39 -0
  180. pySimBlocks/gui/dialogs/plot_dialog.py +230 -0
  181. pySimBlocks/gui/dialogs/settings/plots.py +187 -0
  182. pySimBlocks/gui/dialogs/settings/project.py +146 -0
  183. pySimBlocks/gui/dialogs/settings/simulation.py +137 -0
  184. pySimBlocks/gui/dialogs/settings_dialog.py +88 -0
  185. pySimBlocks/gui/dialogs/unsaved_dialog.py +92 -0
  186. pySimBlocks/gui/editor.py +49 -0
  187. pySimBlocks/gui/graphics/__init__.py +29 -0
  188. pySimBlocks/gui/graphics/block_item.py +289 -0
  189. pySimBlocks/gui/graphics/connection_item.py +266 -0
  190. pySimBlocks/gui/graphics/port_item.py +153 -0
  191. pySimBlocks/gui/graphics/theme.py +119 -0
  192. pySimBlocks/gui/main_window.py +162 -0
  193. pySimBlocks/gui/models/__init__.py +31 -0
  194. pySimBlocks/gui/models/block_instance.py +114 -0
  195. pySimBlocks/gui/models/connection_instance.py +43 -0
  196. pySimBlocks/gui/models/port_instance.py +52 -0
  197. pySimBlocks/gui/models/project_simulation_params.py +50 -0
  198. pySimBlocks/gui/models/project_state.py +114 -0
  199. pySimBlocks/gui/project_controller.py +302 -0
  200. pySimBlocks/gui/services/__init__.py +20 -0
  201. pySimBlocks/gui/services/project_loader.py +381 -0
  202. pySimBlocks/gui/services/project_saver.py +68 -0
  203. pySimBlocks/gui/services/simulation_runner.py +66 -0
  204. pySimBlocks/gui/services/yaml_tools.py +261 -0
  205. pySimBlocks/gui/widgets/__init__.py +19 -0
  206. pySimBlocks/gui/widgets/block_list.py +131 -0
  207. pySimBlocks/gui/widgets/diagram_view.py +312 -0
  208. pySimBlocks/gui/widgets/toolbar_view.py +161 -0
  209. pySimBlocks/project/__init__.py +35 -0
  210. pySimBlocks/project/build_model.py +92 -0
  211. pySimBlocks/project/generate_run_script.py +109 -0
  212. pySimBlocks/project/generate_sofa_controller.py +215 -0
  213. pySimBlocks/project/load_project_config.py +197 -0
  214. pySimBlocks/project/load_simulation_config.py +166 -0
  215. pySimBlocks/project/load_simulator.py +45 -0
  216. pySimBlocks/project/plot_from_config.py +174 -0
  217. pySimBlocks/project/pySimBlocks_blocks_index.yaml +106 -0
  218. pySimBlocks/real_time/__init__.py +23 -0
  219. pySimBlocks/real_time/real_time_runner.py +148 -0
  220. pySimBlocks/tools/__init__.py +19 -0
  221. pySimBlocks/tools/blocks_registry.py +141 -0
  222. pySimBlocks/tools/generate_blocks_index.py +124 -0
  223. pysimblocks-0.1.0.dist-info/METADATA +180 -0
  224. pysimblocks-0.1.0.dist-info/RECORD +262 -0
  225. pysimblocks-0.1.0.dist-info/WHEEL +5 -0
  226. pysimblocks-0.1.0.dist-info/entry_points.txt +2 -0
  227. pysimblocks-0.1.0.dist-info/licenses/LICENSE.md +165 -0
  228. pysimblocks-0.1.0.dist-info/top_level.txt +3 -0
  229. tests/blocks/controllers/test_pid.py +143 -0
  230. tests/blocks/controllers/test_state_feedback.py +193 -0
  231. tests/blocks/observers/test_luenberger.py +225 -0
  232. tests/blocks/operators/test_algebraic_function.py +230 -0
  233. tests/blocks/operators/test_dead_zone.py +106 -0
  234. tests/blocks/operators/test_delay.py +167 -0
  235. tests/blocks/operators/test_demux.py +111 -0
  236. tests/blocks/operators/test_discrete_derivator.py +160 -0
  237. tests/blocks/operators/test_discrete_integrator.py +149 -0
  238. tests/blocks/operators/test_gain.py +182 -0
  239. tests/blocks/operators/test_mux.py +101 -0
  240. tests/blocks/operators/test_product.py +171 -0
  241. tests/blocks/operators/test_rate_limiter.py +166 -0
  242. tests/blocks/operators/test_saturation.py +157 -0
  243. tests/blocks/operators/test_sum.py +183 -0
  244. tests/blocks/operators/test_zero_order_hold.py +106 -0
  245. tests/blocks/sources/test_chirp.py +157 -0
  246. tests/blocks/sources/test_constant.py +55 -0
  247. tests/blocks/sources/test_file_source.py +185 -0
  248. tests/blocks/sources/test_function_source.py +135 -0
  249. tests/blocks/sources/test_ramp.py +110 -0
  250. tests/blocks/sources/test_sinusoidal.py +113 -0
  251. tests/blocks/sources/test_step.py +76 -0
  252. tests/blocks/sources/test_white_noise.py +108 -0
  253. tests/blocks/systems/test_linear_state_space.py +135 -0
  254. tests/blocks/systems/test_polytopic_state_space.py +133 -0
  255. tests/core/test_core_errors_and_determinism.py +82 -0
  256. tests/core/test_core_multirate_tasks.py +88 -0
  257. tests/core/test_core_two_phase_and_propagation.py +132 -0
  258. tests/gui/main_window_open_test.py +162 -0
  259. tests/gui/test_block_meta_param_cache.py +16 -0
  260. tests/gui/test_file_source_meta.py +17 -0
  261. tests/gui/test_function_source_meta.py +28 -0
  262. tests/regression/test_simulink_dc_motor.py +217 -0
@@ -0,0 +1,67 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
21
+ from pySimBlocks.gui.blocks.block_meta import BlockMeta
22
+ from pySimBlocks.gui.blocks.parameter_meta import ParameterMeta
23
+ from pySimBlocks.gui.blocks.port_meta import PortMeta
24
+
25
+
26
+ class DiscreteDerivatorMeta(BlockMeta):
27
+
28
+ def __init__(self):
29
+ self.name = "DiscreteDerivator"
30
+ self.category = "operators"
31
+ self.type = "discrete_derivator"
32
+ self.summary = "Discrete-time differentiator block."
33
+ self.description = (
34
+ "Computes a backward finite-difference approximation of the derivative:\n"
35
+ "$$\n"
36
+ "y[k] = \\frac{u[k] - u[k-1]}{dt}\n"
37
+ "$$\n"
38
+ )
39
+
40
+ self.parameters = [
41
+ ParameterMeta(
42
+ name="initial_output",
43
+ type="scalar | vector | matrix"
44
+ ),
45
+ ParameterMeta(
46
+ name="sample_time",
47
+ type="float"
48
+ )
49
+ ]
50
+
51
+ self.inputs = [
52
+ PortMeta(
53
+ name="in",
54
+ display_as="in",
55
+ shape=["n", "m"],
56
+ description="Input signal."
57
+ )
58
+ ]
59
+
60
+ self.outputs = [
61
+ PortMeta(
62
+ name="out",
63
+ display_as="out",
64
+ shape=["n", "m"],
65
+ description="Discrete-time derivative of the input."
66
+ )
67
+ ]
@@ -0,0 +1,80 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
21
+ from pySimBlocks.gui.blocks.block_meta import BlockMeta
22
+ from pySimBlocks.gui.blocks.parameter_meta import ParameterMeta
23
+ from pySimBlocks.gui.blocks.port_meta import PortMeta
24
+
25
+
26
+ class DiscreteIntegratorMeta(BlockMeta):
27
+
28
+ def __init__(self):
29
+ self.name = "DiscreteIntegrator"
30
+ self.category = "operators"
31
+ self.type = "discrete_integrator"
32
+ self.summary = "Discrete-time integrator block."
33
+ self.description = (
34
+ "Implements a discrete-time integration of the input signal.\n"
35
+ "The state evolves according to:\n"
36
+ "$$\n"
37
+ "x[k+1] = x[k] + dt \\, u[k]\n"
38
+ "$$\n"
39
+ "with output:\n"
40
+ "$$\n"
41
+ "y[k] = x[k]\n"
42
+ "$$\n"
43
+ "for forward Euler integration."
44
+ )
45
+
46
+ self.parameters = [
47
+ ParameterMeta(
48
+ name="initial_state",
49
+ type="scalar | vector | matrix"
50
+ ),
51
+ ParameterMeta(
52
+ name="method",
53
+ type="enum",
54
+ autofill=True,
55
+ default="euler forward",
56
+ enum=["euler forward", "euler backward"]
57
+ ),
58
+ ParameterMeta(
59
+ name="sample_time",
60
+ type="float"
61
+ )
62
+ ]
63
+
64
+ self.inputs = [
65
+ PortMeta(
66
+ name="in",
67
+ display_as="in",
68
+ shape=["n", "m"],
69
+ description="Input signal to integrate."
70
+ )
71
+ ]
72
+
73
+ self.outputs = [
74
+ PortMeta(
75
+ name="out",
76
+ display_as="out",
77
+ shape=["n", "m"],
78
+ description="Integrated output signal."
79
+ )
80
+ ]
@@ -0,0 +1,79 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
21
+ from pySimBlocks.gui.blocks.block_meta import BlockMeta
22
+ from pySimBlocks.gui.blocks.parameter_meta import ParameterMeta
23
+ from pySimBlocks.gui.blocks.port_meta import PortMeta
24
+
25
+
26
+ class GainMeta(BlockMeta):
27
+
28
+ def __init__(self):
29
+ self.name = "Gain"
30
+ self.category = "operators"
31
+ self.type = "gain"
32
+ self.summary = "Static linear gain block."
33
+ self.description = (
34
+ "Computes:\n"
35
+ "$$\n"
36
+ "y = K \\cdot u\n"
37
+ "$$\n"
38
+ )
39
+
40
+ self.parameters = [
41
+ ParameterMeta(
42
+ name="gain",
43
+ type="scalar | vector | matrix",
44
+ required=True,
45
+ autofill=True,
46
+ default=1.0,
47
+ description="Gain coefficient."
48
+ ),
49
+ ParameterMeta(
50
+ name="multiplication",
51
+ type="enum",
52
+ autofill=True,
53
+ default="Element wise (K * u)",
54
+ enum=["Element wise (K * u)", "Matrix (K @ u)", "Matrix (u @ K)"],
55
+ description="Type of multiplication operation."
56
+ ),
57
+ ParameterMeta(
58
+ name="sample_time",
59
+ type="float"
60
+ )
61
+ ]
62
+
63
+ self.inputs = [
64
+ PortMeta(
65
+ name="in",
66
+ display_as="in",
67
+ shape=["n", "m"],
68
+ description="Input signal."
69
+ )
70
+ ]
71
+
72
+ self.outputs = [
73
+ PortMeta(
74
+ name="out",
75
+ display_as="out",
76
+ shape=["m", "m"],
77
+ description="Output signal."
78
+ )
79
+ ]
@@ -0,0 +1,100 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
21
+ from typing import Literal
22
+ from pySimBlocks.gui.blocks.block_meta import BlockMeta
23
+ from pySimBlocks.gui.blocks.parameter_meta import ParameterMeta
24
+ from pySimBlocks.gui.blocks.port_meta import PortMeta
25
+ from pySimBlocks.gui.models import BlockInstance, PortInstance
26
+
27
+
28
+ class MuxMeta(BlockMeta):
29
+
30
+ def __init__(self):
31
+ self.name = "Mux"
32
+ self.category = "operators"
33
+ self.type = "mux"
34
+ self.summary = "Vertical signal concatenation block."
35
+ self.description = (
36
+ "Concatenates multiple input column vectors vertically:\n"
37
+ "$$\n"
38
+ "\\mathrm{out} =\n"
39
+ "\\begin{bmatrix}\n"
40
+ "\\mathrm{in}_1 \\\\\n"
41
+ "\\mathrm{in}_2 \\\\\n"
42
+ "\\vdots \\\\\n"
43
+ "\\mathrm{in}_N\n"
44
+ "\\end{bmatrix}\n"
45
+ "$$\n"
46
+ )
47
+
48
+ self.parameters = [
49
+ ParameterMeta(
50
+ name="num_inputs",
51
+ type="int",
52
+ autofill=True,
53
+ default=2
54
+ ),
55
+ ParameterMeta(
56
+ name="sample_time",
57
+ type="float"
58
+ )
59
+ ]
60
+
61
+ self.inputs = [
62
+ PortMeta(
63
+ name="in",
64
+ display_as="",
65
+ shape=["n", 1],
66
+ description="Input column vectors to concatenate."
67
+ )
68
+ ]
69
+
70
+ self.outputs = [
71
+ PortMeta(
72
+ name="out",
73
+ display_as="out",
74
+ shape=["m", 1],
75
+ description="Vertically concatenated output vector."
76
+ )
77
+ ]
78
+
79
+ def resolve_port_group(self,
80
+ port_meta: PortMeta,
81
+ direction: Literal['input', 'output'],
82
+ instance: "BlockInstance"
83
+ ) -> list["PortInstance"]:
84
+
85
+ if direction == "input" and port_meta.name == "in":
86
+ num_inputs = instance.parameters.get("num_inputs", 0)
87
+ ports = []
88
+ for i in range(1, num_inputs + 1):
89
+ ports.append(
90
+ PortInstance(
91
+ name=f"{port_meta.name}{i}",
92
+ display_as="",
93
+ direction="input",
94
+ block=instance
95
+ )
96
+ )
97
+
98
+ return ports
99
+
100
+ return super().resolve_port_group(port_meta, direction, instance)
@@ -0,0 +1,109 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
21
+ import enum
22
+ from typing import Literal
23
+ from pySimBlocks.gui.blocks.block_meta import BlockMeta
24
+ from pySimBlocks.gui.blocks.parameter_meta import ParameterMeta
25
+ from pySimBlocks.gui.blocks.port_meta import PortMeta
26
+ from pySimBlocks.gui.models import BlockInstance, PortInstance
27
+
28
+
29
+ class ProductMeta(BlockMeta):
30
+
31
+ def __init__(self):
32
+ self.name = "Product"
33
+ self.category = "operators"
34
+ self.type = "product"
35
+ self.summary = "Multi-input product block."
36
+ self.description = (
37
+ "If \"Element-wise (*)\" is selected, this block computes the element-wise:\n"
38
+ "$$\n"
39
+ "y = u_1 operations_1 u_2 operations_2 ... operations_m-1 u_m\n"
40
+ "$$\n"
41
+ "where u_i are the input signals and operations_i are the operations selected * or /.\n\n"
42
+ "If \"Matrix (@)\" is selected, this block computes the matrix product:\n"
43
+ "$$\n"
44
+ "y = u_1 operations_1 u_2 operations_2 ... operations_m-1 u_m\n"
45
+ "$$\n"
46
+ "where u_i are the input signals and operations_i are the operations selected * (@) or / (inverse)."
47
+ )
48
+
49
+ self.parameters = [
50
+ ParameterMeta(
51
+ name="operations",
52
+ type="str",
53
+ autofill=True,
54
+ default="*"
55
+ ),
56
+ ParameterMeta(
57
+ name="multiplication",
58
+ type="enum",
59
+ autofill=True,
60
+ default="Element-wise (*)",
61
+ enum=["Element-wise (*)", "Matrix (@)"]
62
+ ),
63
+ ParameterMeta(
64
+ name="sample_time",
65
+ type="float"
66
+ )
67
+ ]
68
+
69
+ self.inputs = [
70
+ PortMeta(
71
+ name="in",
72
+ display_as="",
73
+ shape=["n", "m"],
74
+ description="Input signals."
75
+ )
76
+ ]
77
+
78
+ self.outputs = [
79
+ PortMeta(
80
+ name="out",
81
+ display_as="out",
82
+ shape=["n", "m"],
83
+ description="Output signal."
84
+ )
85
+ ]
86
+
87
+ def resolve_port_group(
88
+ self,
89
+ port_meta: PortMeta,
90
+ direction: Literal['input', 'output'],
91
+ instance: "BlockInstance"
92
+ ) -> list["PortInstance"]:
93
+
94
+ if direction == "input" and port_meta.name == "in":
95
+ operations_str = instance.parameters.get("operations", "")
96
+ ports = []
97
+ for i, op in enumerate(operations_str):
98
+ ports.append(
99
+ PortInstance(
100
+ name=f"{port_meta.name}_{i}",
101
+ display_as=op,
102
+ direction="input",
103
+ block=instance
104
+ )
105
+ )
106
+
107
+ return ports
108
+
109
+ return super().resolve_port_group(port_meta, direction, instance)
@@ -0,0 +1,79 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
21
+ from pySimBlocks.gui.blocks.block_meta import BlockMeta
22
+ from pySimBlocks.gui.blocks.parameter_meta import ParameterMeta
23
+ from pySimBlocks.gui.blocks.port_meta import PortMeta
24
+
25
+
26
+ class RateLimiterMeta(BlockMeta):
27
+
28
+ def __init__(self):
29
+ self.name = "RateLimiter"
30
+ self.category = "operators"
31
+ self.type = "rate_limiter"
32
+ self.summary = "Discrete-time rate limiter block."
33
+ self.description = (
34
+ "Limits the rate of change of the output signal according to:\n"
35
+ "$$\n"
36
+ "\\Delta u = u[k] - y[k-1]\n"
37
+ "$$\n"
38
+ "$$\n"
39
+ "y[k] = y[k-1] + \\mathrm{clip}(\\Delta u,\\; s^{-} dt,\\; s^{+} dt)\n"
40
+ "$$\n"
41
+ "where $s^{+}$ is the rising slope and $s^{-}$ is the falling slope."
42
+ )
43
+
44
+ self.parameters = [
45
+ ParameterMeta(
46
+ name="rising_slope",
47
+ type="scalar | vector | matrix"
48
+ ),
49
+ ParameterMeta(
50
+ name="falling_slope",
51
+ type="scalar | vector | matrix"
52
+ ),
53
+ ParameterMeta(
54
+ name="initial_output",
55
+ type="scalar | vector | matrix"
56
+ ),
57
+ ParameterMeta(
58
+ name="sample_time",
59
+ type="float"
60
+ )
61
+ ]
62
+
63
+ self.inputs = [
64
+ PortMeta(
65
+ name="in",
66
+ display_as="in",
67
+ shape=["n", "m"],
68
+ description="Input signal."
69
+ )
70
+ ]
71
+
72
+ self.outputs = [
73
+ PortMeta(
74
+ name="out",
75
+ display_as="out",
76
+ shape=["n", "m"],
77
+ description="Rate-limited output signal."
78
+ )
79
+ ]
@@ -0,0 +1,72 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
21
+ from pySimBlocks.gui.blocks.block_meta import BlockMeta
22
+ from pySimBlocks.gui.blocks.parameter_meta import ParameterMeta
23
+ from pySimBlocks.gui.blocks.port_meta import PortMeta
24
+
25
+
26
+ class SaturationMeta(BlockMeta):
27
+
28
+ def __init__(self):
29
+ self.name = "Saturation"
30
+ self.category = "operators"
31
+ self.type = "saturation"
32
+ self.summary = "Discrete-time saturation operator."
33
+ self.description = (
34
+ "Applies element-wise saturation to the input signal:\n"
35
+ "$$\n"
36
+ "y[k] = \\mathrm{clip}(u[k], u_{\\min}, u_{\\max})\n"
37
+ "$$\n"
38
+ "where $u_{\\min}$ and $u_{\\max}$ define the lower and upper bounds."
39
+ )
40
+
41
+ self.parameters = [
42
+ ParameterMeta(
43
+ name="u_min",
44
+ type="scalar | vector | matrix"
45
+ ),
46
+ ParameterMeta(
47
+ name="u_max",
48
+ type="scalar | vector | matrix"
49
+ ),
50
+ ParameterMeta(
51
+ name="sample_time",
52
+ type="float"
53
+ )
54
+ ]
55
+
56
+ self.inputs = [
57
+ PortMeta(
58
+ name="in",
59
+ display_as="in",
60
+ shape=["n", 1],
61
+ description="Input signal."
62
+ )
63
+ ]
64
+
65
+ self.outputs = [
66
+ PortMeta(
67
+ name="out",
68
+ display_as="out",
69
+ shape=["n", "m"],
70
+ description="Saturated output signal."
71
+ )
72
+ ]
@@ -0,0 +1,91 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
21
+
22
+ from typing import Literal
23
+ from pySimBlocks.gui.blocks.block_meta import BlockMeta, ParameterMeta
24
+ from pySimBlocks.gui.blocks.port_meta import PortMeta
25
+ from pySimBlocks.gui.models import BlockInstance, PortInstance
26
+
27
+ class SumMeta(BlockMeta):
28
+
29
+ def __init__(self):
30
+ self.name = "Sum"
31
+ self.category = "operators"
32
+ self.type = "sum"
33
+ self.summary = "Multi-input summation block."
34
+ self.description = (
35
+ "Computes:\n"
36
+ "$$\n"
37
+ r"y = \sum_i s_i \cdot u_i""\n"
38
+ "$$\n"
39
+ )
40
+
41
+ self.parameters = [
42
+ ParameterMeta(
43
+ name="signs",
44
+ type="str",
45
+ autofill=True,
46
+ default="++"
47
+ ),
48
+ ParameterMeta(
49
+ name="sample_time",
50
+ type="float"
51
+ )
52
+ ]
53
+
54
+ self.inputs = [
55
+ PortMeta(
56
+ name="in",
57
+ display_as="",
58
+ shape=["n", "m"]
59
+ ),
60
+ ]
61
+
62
+ self.outputs = [
63
+ PortMeta(
64
+ name="out",
65
+ display_as="out",
66
+ shape=["n", "m"]
67
+ ),
68
+ ]
69
+
70
+ def resolve_port_group(self,
71
+ port_meta: PortMeta,
72
+ direction: Literal['input', 'output'],
73
+ instance: "BlockInstance"
74
+ ) -> list["PortInstance"]:
75
+
76
+ if direction == "input" and port_meta.name == "in":
77
+ signs = instance.parameters.get("signs", "")
78
+ ports = []
79
+
80
+ for i, sign in enumerate(signs):
81
+ ports.append(
82
+ PortInstance(
83
+ name=f"{port_meta.name}{i + 1}",
84
+ display_as=sign,
85
+ direction="input",
86
+ block=instance
87
+ )
88
+ )
89
+ return ports
90
+
91
+ return super().resolve_port_group(port_meta, direction, instance)