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,124 @@
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 os
22
+ import yaml
23
+ import ast
24
+ from pathlib import Path
25
+
26
+ def iter_python_files(base_path):
27
+ for root, _, files in os.walk(base_path):
28
+ for f in files:
29
+ if f.endswith(".py") and f != "__init__.py":
30
+ yield os.path.join(root, f)
31
+
32
+
33
+ def find_block_classes(filepath):
34
+ """Find all classes inheriting directly or indirectly from 'Block'."""
35
+ with open(filepath, "r", encoding="utf-8") as f:
36
+ source = f.read()
37
+
38
+ tree = ast.parse(source)
39
+
40
+ class_parents = {}
41
+
42
+ for node in ast.walk(tree):
43
+ if isinstance(node, ast.ClassDef):
44
+ parents = []
45
+ for base in node.bases:
46
+ if isinstance(base, ast.Name):
47
+ parents.append(base.id)
48
+ elif isinstance(base, ast.Attribute):
49
+ parents.append(base.attr)
50
+ class_parents[node.name] = parents
51
+
52
+ def is_block_class(cls):
53
+ visited = set()
54
+ to_visit = [cls]
55
+
56
+ while to_visit:
57
+ current = to_visit.pop()
58
+ if current in visited:
59
+ continue
60
+ visited.add(current)
61
+
62
+ if "block" in current.lower():
63
+ return True
64
+
65
+ parents = class_parents.get(current, [])
66
+ to_visit.extend(parents)
67
+
68
+ return False
69
+
70
+ block_classes = []
71
+ for cls in class_parents:
72
+ if is_block_class(cls):
73
+ block_classes.append(cls)
74
+
75
+ return block_classes
76
+
77
+
78
+ def generate_blocks_index():
79
+ blocks_dir = Path(__file__).resolve().parents[1] / "blocks"
80
+ output_path = Path(__file__).resolve().parents[1] / "project" / "pySimBlocks_blocks_index.yaml"
81
+
82
+ index = {}
83
+
84
+ for group in os.listdir(blocks_dir):
85
+ group_path = blocks_dir / group
86
+
87
+ if (
88
+ not group_path.is_dir()
89
+ or group.startswith("_")
90
+ or group.startswith(".")
91
+ or group == "__pycache__"
92
+ ):
93
+ continue
94
+
95
+ index[group] = {}
96
+
97
+ for filepath in iter_python_files(group_path):
98
+ classes = find_block_classes(filepath)
99
+ if not classes:
100
+ continue
101
+
102
+ file_stem = Path(filepath).stem # snake_case name -> key in YAML
103
+
104
+ # Compute module path
105
+ rel_path = filepath.split("pySimBlocks")[-1].lstrip("/\\")
106
+ module_path = "pySimBlocks." + rel_path.replace("/", ".").replace("\\", ".").removesuffix(".py")
107
+
108
+ # Only one block class per file (pySimBlocks rule)
109
+ class_name = classes[0]
110
+
111
+ index[group][file_stem] = {
112
+ "class": class_name,
113
+ "module": module_path
114
+ }
115
+
116
+ with open(output_path, "w") as f:
117
+ yaml.dump(index, f, sort_keys=True)
118
+
119
+ print(f"[OK] Block index written to {output_path}")
120
+ return index
121
+
122
+
123
+ if __name__ == "__main__":
124
+ generate_blocks_index()
@@ -0,0 +1,180 @@
1
+ Metadata-Version: 2.4
2
+ Name: pySimBlocks
3
+ Version: 0.1.0
4
+ Summary: A block-diagram simulation environment with PySide6 editor
5
+ Author-email: Antoine Alessandrini <antoine.alessandrini@univ-lille.fr>
6
+ License-Expression: LGPL-3.0-or-later
7
+ Project-URL: Homepage, https://github.com/AlessandriniAntoine/pySimBlocks
8
+ Project-URL: Repository, https://github.com/AlessandriniAntoine/pySimBlocks
9
+ Project-URL: Issues, https://github.com/AlessandriniAntoine/pySimBlocks/issues
10
+ Keywords: simulation,block-diagram,control,discrete-time,pyside6
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Intended Audience :: Education
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Scientific/Engineering
19
+ Classifier: Topic :: Scientific/Engineering :: Visualization
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE.md
23
+ Requires-Dist: numpy
24
+ Requires-Dist: matplotlib
25
+ Requires-Dist: pyyaml
26
+ Requires-Dist: PySide6
27
+ Requires-Dist: typing_extensions; python_version < "3.11"
28
+ Provides-Extra: examples
29
+ Requires-Dist: control; extra == "examples"
30
+ Requires-Dist: qpsolvers[clarabel,osqp]; extra == "examples"
31
+ Provides-Extra: tests
32
+ Requires-Dist: pytest; extra == "tests"
33
+ Requires-Dist: pytest-qt; extra == "tests"
34
+ Dynamic: license-file
35
+
36
+ # pySimBlocks
37
+
38
+ A deterministic block-diagram simulation framework for discrete-time modeling,
39
+ co-simulation and research prototyping in Python.
40
+
41
+ pySimBlocks allows you to build, configure, and execute discrete-time systems
42
+ using either:
43
+
44
+ - A pure Python API
45
+ - A graphical editor (PySide6)
46
+ - YAML project configuration
47
+ - Optional SOFA and hardware integration
48
+
49
+ ![pySimBlocks graphical editor](https://raw.githubusercontent.com/AlessandriniAntoine/pySimBlocks/main/docs/User_Guide/images/gui_example.png)
50
+
51
+ ## Features
52
+
53
+ - Block-based modeling (Simulink-like)
54
+ - Deterministic discrete-time simulation engine
55
+ - PySide6 graphical editor
56
+ - YAML-based project serialization
57
+ - Exportable Python runner (`run.py`)
58
+ - Extensible block architecture
59
+
60
+ ## Installation
61
+
62
+ ### From GitHub
63
+
64
+ Install directly from GitHub using pip:
65
+ ```
66
+ pip install git+https://github.com/AlessandriniAntoine/pySimBlocks
67
+ ```
68
+
69
+ ### Locally
70
+
71
+ Clone the repository and install locally:
72
+ ```
73
+ git clone https://github.com/AlessandriniAntoine/pySimBlocks.git
74
+ cd pySimBlocks
75
+ pip install .
76
+ ```
77
+
78
+ ## Getting Started
79
+
80
+ ### Quick Example
81
+
82
+ The following example models a simple first-order low-pass filter, defined by
83
+ the difference equation:
84
+
85
+ $$ y[k] = \alpha x[k] + (1-\alpha) y[k-1] $$
86
+
87
+ It can be implemented in pySimBlocks using the following code:
88
+
89
+ ```python
90
+ from pySimBlocks import Model, Simulator, SimulationConfig, PlotConfig
91
+ from pySimBlocks.blocks.operators import Gain, Sum, Delay
92
+ from pySimBlocks.blocks.sources import WhiteNoise
93
+ from pySimBlocks.project.plot_from_config import plot_from_config
94
+
95
+ # 1. Create the blocks
96
+ noise = WhiteNoise(name="noise", std=1.0)
97
+ delay = Delay(name="delay")
98
+ filtered = Sum("filtered", signs="++")
99
+ alpha_gain = Gain(name="alpha", gain=0.1)
100
+ complement = Gain(name="complement", gain=0.9)
101
+
102
+ # 2. Build the model
103
+ model = Model("Example")
104
+ for block in [noise, delay, filtered, alpha_gain, complement]:
105
+ model.add_block(block)
106
+
107
+ model.connect("noise", "out", "alpha", "in")
108
+ model.connect("delay", "out", "complement", "in")
109
+ model.connect("alpha", "out", "filtered", "in1")
110
+ model.connect("complement", "out", "filtered", "in2")
111
+ model.connect("filtered", "out", "delay", "in")
112
+
113
+ # 3. Simulate the model
114
+ sim_cfg = SimulationConfig(dt=0.05, T=30.)
115
+ sim = Simulator(model, sim_cfg)
116
+ logs = sim.run(logging=["noise.outputs.out", "filtered.outputs.out"])
117
+
118
+ # 4. Plot the results
119
+ plot_cfg = PlotConfig([
120
+ {"title": "Noisy signal vs Filtered",
121
+ "signals": ["noise.outputs.out", "filtered.outputs.out"],},
122
+ ])
123
+ plot_from_config(logs, plot_cfg)
124
+ ```
125
+
126
+ The resulting plot should look like this:
127
+
128
+ ![Noise filtered](https://raw.githubusercontent.com/AlessandriniAntoine/pySimBlocks/main/docs/User_Guide/images/quick_example.png)
129
+
130
+ See [examples/quick_start/filter.py](./examples/quick_start/filter.py)
131
+ to run the example yourself.
132
+
133
+ ### Graphical Editor
134
+
135
+ The exact same model can be constructed visually using the graphical editor (as
136
+ shown in the image above of this README).
137
+
138
+ To open the graphical editor, run:
139
+ ```bash
140
+ pysimblocks gui examples/quick_start/gui
141
+ ```
142
+
143
+ The quick-start GUI project is stored in a single
144
+ [examples/quick_start/gui/project.yaml](./examples/quick_start/gui/project.yaml) file.
145
+
146
+ ### Learning Resources
147
+
148
+
149
+ #### Tutorials
150
+
151
+ Three step-by-step tutorials are available detailed in the
152
+ [guide](./docs/User_Guide/getting_started.md):
153
+
154
+ | | Tutorial | Description |
155
+ |---|---|---|
156
+ | 1 | [Python API](./docs/User_Guide/tutorial_1_python.md) | Build a closed-loop PI control system in pure Python |
157
+ | 2 | [GUI](./docs/User_Guide/tutorial_2_gui.md) | Build the same system visually with the graphical editor |
158
+ | 3 | [SOFA](./docs/User_Guide/tutorial_3_sofa.md) | Replace the plant with a SOFA physics simulation |
159
+
160
+
161
+ #### Other Examples
162
+
163
+ A collection of basic and advanced examples is available in the
164
+ [examples](./examples) directory, including:
165
+
166
+ - Control system demonstrations
167
+ - SOFA-based simulations (tested with SOFA v24.06 and later.)
168
+ - Hardware and real-time use cases
169
+ - Comparisons with external tools
170
+
171
+ See [examples/README.md](./examples/README.md) for an overview.
172
+
173
+ ## Information
174
+
175
+ ### License
176
+
177
+ pySimBlocks is licensed under [LGPL-3.0-or-later](./LICENSE.md).
178
+
179
+ ---
180
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,262 @@
1
+ examples/advanced/hardware/block_diagram.py,sha256=HYNk3L0-koVO4deqqkc-BPPaD24FwwFjxmxKymp-xRg,4994
2
+ examples/advanced/hardware/camera.py,sha256=O9aRIbayjHlY4InjhpsBnaaRjEbyc7Gb1PfWhq6tErQ,2956
3
+ examples/advanced/hardware/gui_emio.py,sha256=YdAfg5HLlGy382bBHudl9EQkWQzkl7R1iDQvY2t7Nr4,8831
4
+ examples/advanced/hardware/lmi.py,sha256=AHr26xH0togG7KeOuzLIF5v9YqvEkyJNbCCQb-K9KA0,1983
5
+ examples/advanced/hardware/main.py,sha256=BdzhBftR-AllcEBxsf89NqzdZvUVaTto08JOBc4Unqw,1522
6
+ examples/advanced/hardware/parameters.py,sha256=kfL8AyIUfJxuYuxh0Zr6U-EK2b3iHKG18rPav1Py5dY,1147
7
+ examples/advanced/qp_problem/params.py,sha256=mOcO1IQ_L5XdMHHMOTMEgZg_vL7PiAgj4lqtYwCUJxA,267
8
+ examples/advanced/qp_problem/run.py,sha256=1b7CZGC3akQAK_0mi6pMQzgYVcz81c1JcQWL2wbRUgQ,407
9
+ examples/advanced/sofa/gui/finger/Finger.py,sha256=4CzX-7yYZxiaMkPPkTP8fK5H94dWJ_goyL2DPo7CrPs,5643
10
+ examples/advanced/sofa/gui/finger/FingerController.py,sha256=VvKMZ7ieWfFRdu5soxHjq9PzW_sXwMRnGV2Y4-IT7lo,1549
11
+ examples/advanced/sofa/gui/finger/parameters_auto.py,sha256=ylLAnXux0G-dTOH2vkUPax2EkpeDklnHqGf0KSx8b70,411
12
+ examples/advanced/sofa/gui/sofa_plant/run.py,sha256=1b7CZGC3akQAK_0mi6pMQzgYVcz81c1JcQWL2wbRUgQ,407
13
+ examples/advanced/sofa/python/Finger.py,sha256=3VFutRXn_PuQ7PcOZsMJW4vSLvC7evk1wu0M8nJkTTU,5694
14
+ examples/advanced/sofa/python/FingerController.py,sha256=EIbVyYD1FxXZeXKL_ZOxffGe-gGK9OTrA-6327Ux_eQ,1460
15
+ examples/advanced/sofa/python/closedloop.py,sha256=o95fMT0t0PokS5yVshj73OYCKS1lrjvEbZaOBhHJWls,1831
16
+ examples/advanced/sofa/python/openloop.py,sha256=WN-f-fD_08mP9wwHQUK3Bb20K8JE23CfLk38UY0kZfc,1365
17
+ examples/basics/observer.py,sha256=UZbgpM4OnrflQry7wd1_HzPScGtQLHdKvCTdnGGTlKM,1922
18
+ examples/basics/algebraic_function/g.py,sha256=L1XdViDcxE3mcBIUSreURlkqQMe4vy9SyiMUJ6oaISw,113
19
+ examples/basics/algebraic_function/run.py,sha256=8DASmbSULTz47j_Db976fo0tg4Pifdv1ZpH0NNPrx9U,407
20
+ examples/basics/dc_motor/multiple_order.py,sha256=VFUc_ouNz1hqTCegK7szaQI8gtVMnVthO7R7hNsE7S0,2726
21
+ examples/basics/dc_motor/openloop.py,sha256=2gxX2ySOsM--DfQqnEh2NysVsbis6_oBeFUaD8TTwck,1531
22
+ examples/basics/dc_motor/pi.py,sha256=FEaBJwQeYnQ4wMXGfPDFvsQ-6-vo3QPz7Piwhqq_fqM,3002
23
+ examples/basics/dc_motor/pid.py,sha256=il_li_4wkptAxl5HKDhUZkP3Z3I7VLKc5aChOF_KdWQ,3535
24
+ examples/basics/dc_motor/pid_block.py,sha256=98lx0Vy60LNFHTxhy6F67aTsMb0kRjPMW7hXW-OjpFY,2172
25
+ examples/basics/dc_motor/pid_block_vs_manual.py,sha256=oJ14zZBy91LFhye_UbP-OaT_-UR0Gz6sZQCwvPPQ-N4,4640
26
+ examples/basics/dc_motor/gui/run.py,sha256=1b7CZGC3akQAK_0mi6pMQzgYVcz81c1JcQWL2wbRUgQ,407
27
+ examples/basics/external/parameters.py,sha256=r7Uxvdvs3ZrIXQGumrTAauCsyC53bEEwGM4BQUpq1gk,64
28
+ examples/basics/external/run.py,sha256=1b7CZGC3akQAK_0mi6pMQzgYVcz81c1JcQWL2wbRUgQ,407
29
+ examples/basics/file_sources/temp.py,sha256=Em4oIXuoNAy4_knl4RpRpQOlXihCONvdSbKu-XgZLJM,391
30
+ examples/basics/state_feedback/state_feedback.py,sha256=-ut1V9nVbk4Jeux2W2KcKiJECk_ptkEO5jeSZJK_rhA,2748
31
+ examples/basics/state_feedback/gui/parameters.py,sha256=1csncxDPMbYR5LDSkIWye_dymF-u7BYpw9Q6k5KSs8w,227
32
+ examples/basics/state_feedback/gui/run.py,sha256=8DASmbSULTz47j_Db976fo0tg4Pifdv1ZpH0NNPrx9U,407
33
+ examples/basics/state_space/linear/ss_block.py,sha256=jRCoRHMFiDU7RmZNsuINw9yHtTLF-xUnQuiZBs_t8c0,2204
34
+ examples/basics/state_space/linear/ss_manual.py,sha256=Y7Yw2ChLUGURGyQg4s0KjQdJdOrLJcSoWPObyJB704Q,3375
35
+ examples/basics/state_space/linear/gui/run.py,sha256=1b7CZGC3akQAK_0mi6pMQzgYVcz81c1JcQWL2wbRUgQ,407
36
+ examples/basics/state_space/non_linear/nlss.py,sha256=IXK3Tr9qnQUtzA2BmZHZwej3IOPifsez5fGCwSvy_ho,977
37
+ examples/basics/state_space/non_linear/run.py,sha256=1b7CZGC3akQAK_0mi6pMQzgYVcz81c1JcQWL2wbRUgQ,407
38
+ examples/basics/state_space/polytope/params.py,sha256=3zxd-GZknN8OiuCTRJTmpfFALnlLUOFURVSRHZqFkc0,694
39
+ examples/basics/state_space/polytope/weights.py,sha256=yF2g-7xVS15NP1MpUzLETvBC-O1aNzcxlHqvkp7cN20,291
40
+ examples/comparison/simulink/convert.py,sha256=zpKKvL-VkmFb43nn52lRVlY4kIcZhCHZaH7ZrPQmoy4,600
41
+ examples/comparison/simulink/openloop.py,sha256=sWWUk71be7OkgUUAQiXIM52io1JR_4kMwhTHZP9V_60,3822
42
+ examples/comparison/simulink/pi.py,sha256=1RWmTPSU6qqYvRkK2xCNKdZszPUCemApKIc70sjNunc,4595
43
+ examples/comparison/simulink/pid.py,sha256=Z6XAKbu6YJ8GZeJNxNQs16KcbkMgMtcxbwovX8MT_zI,5047
44
+ examples/comparison/simulink/pid_backward.py,sha256=zUa74IdqcwO5hqx_zatPSbuzNz1gsIpstR6Hi4XHkb4,5196
45
+ examples/quick_start/filter.py,sha256=uevsLTgGPSvcTsD0Z1aGn06Zcp5bySP8hLsM2iNTM40,1216
46
+ examples/quick_start/gui/run.py,sha256=8DASmbSULTz47j_Db976fo0tg4Pifdv1ZpH0NNPrx9U,407
47
+ examples/tutorials/tutorial_1_python/main.py,sha256=-BQZxdImaOc2D0CLka0BcAxdrATntUkmvVXSnxyP3_Q,3271
48
+ examples/tutorials/tutorial_3_sofa/finger/Finger.py,sha256=CrJW-CCoti_EgP2y0XddYmqgbKI-6uUb-aRKy1JULGQ,6697
49
+ examples/tutorials/tutorial_3_sofa/finger/FingerController.py,sha256=yPwUBSHOlunkHu_J0fkVGuuZWiWAyLL-7oWpKUc3kuY,1172
50
+ pySimBlocks/__init__.py,sha256=GSMcn6ftAz0t84i9-3Vj8OxL1lmycVOisi4woN6_LoM,1464
51
+ pySimBlocks/cli.py,sha256=ouKJ-wS2PV2BUSkl07vqD5Qo7cqiP5zwgutrAjeinbA,4465
52
+ pySimBlocks/blocks/__init__.py,sha256=jwrc-sQ6jJq-fZnXBpGyeYNz19AaKOFs2XjGgMBRXJ8,2150
53
+ pySimBlocks/blocks/controllers/__init__.py,sha256=ORdofO3Jhg8afTB7UrgyKRYfXSxkNhubxU2tyMyebAU,1305
54
+ pySimBlocks/blocks/controllers/pid.py,sha256=vXKZLF7Eu-tODDveL_E7IYKvzc7Ema-TgvSQwlMW3qU,8860
55
+ pySimBlocks/blocks/controllers/state_feedback.py,sha256=-4EgUFKbEoEVaieGICWRzn0wwJAEWr7YkoHGegbe9V0,5041
56
+ pySimBlocks/blocks/interfaces/__init__.py,sha256=Lzr25AAFjCFLPXh1BD4FEdYBVS_pYStPnq85b6uv4sc,1337
57
+ pySimBlocks/blocks/interfaces/external_input.py,sha256=UTe7lsKhQ-V_kV-tPNa0PrSoYeoFmD7irlodhg76Mk4,3991
58
+ pySimBlocks/blocks/interfaces/external_output.py,sha256=2sf_C9TyXfYL8KggN4RqmB6RJPP_EBAgo9FGWCpu4pI,4052
59
+ pySimBlocks/blocks/observers/__init__.py,sha256=waBXuuSvjqsD7vrx0DfaonQ6mrliHSa-G1LCEocu4ms,1221
60
+ pySimBlocks/blocks/observers/luenberger.py,sha256=ShlocF8LVL4D2SZx6J_VDtDSlRiUCtIe9OhdITAMdfQ,6347
61
+ pySimBlocks/blocks/operators/__init__.py,sha256=cC7lGgeu5H0nTKZJtKCUkXB6bsr79i6XcBz-pF7Bwtc,2080
62
+ pySimBlocks/blocks/operators/algebraic_function.py,sha256=6lj2mqsCE54CNNRwQOANHhAKWgJtvD39Q2K_98JN2so,9964
63
+ pySimBlocks/blocks/operators/dead_zone.py,sha256=-mCCVX4eG-2u48r5b86xh1loF3YfauQuFGsJ04oo1l4,7167
64
+ pySimBlocks/blocks/operators/delay.py,sha256=Eb5-eYcIOhQ9AXjFOtkkNpuB2VPywom8qv26VlHZAw4,9898
65
+ pySimBlocks/blocks/operators/demux.py,sha256=qf_1CNkLWgHrblwU-Rkxzmgce_WaunDI-A7tGyJUnmI,4372
66
+ pySimBlocks/blocks/operators/discrete_derivator.py,sha256=NRE4etXMxkQeoUwNA_DE3Q3tdwTppJccJ1ZfGeCFTGI,9573
67
+ pySimBlocks/blocks/operators/discrete_integrator.py,sha256=HwWHzjqz2OGJJ7-NT-hZJlCU3HOI9GdBVWi5YOOF_nQ,10668
68
+ pySimBlocks/blocks/operators/gain.py,sha256=j26MlzMxwtfDBxHX4QEBVX4FUhN4MlkpcynWMDKcrWw,10558
69
+ pySimBlocks/blocks/operators/mux.py,sha256=IOiCYNdkI4HrsNBqrZHmcf9rMMY2rvGryknCQH8lQbY,4763
70
+ pySimBlocks/blocks/operators/product.py,sha256=Lre9lf6MUtOMhxSYTOMTJjwUF7H2KOz3jdfsQJ-wrIo,7600
71
+ pySimBlocks/blocks/operators/rate_limiter.py,sha256=v6ny5bcjk_41QJ1lJQzFq6qshwIO6s5YKkYfnuKffCY,8373
72
+ pySimBlocks/blocks/operators/saturation.py,sha256=qoYNac27BkjxtgMKaIRQzFS7qMsEgfb75hYypB3jPdQ,6738
73
+ pySimBlocks/blocks/operators/sum.py,sha256=UqncQLnQDNiMwEbut7tdcIhOTpwGsi-encP74xPTxi4,7090
74
+ pySimBlocks/blocks/operators/zero_order_hold.py,sha256=nVI_LG1fIsapUSU_AfyjPfOp9yKSPKadjaSro8f0hHs,5071
75
+ pySimBlocks/blocks/optimizers/__init__.py,sha256=fZtNolx2L7CKAI2-4F4Agrn3knHtNJg1Kw5KU1OOTBY,1245
76
+ pySimBlocks/blocks/optimizers/quadratic_program.py,sha256=EBdGFvBOH1z867dTORGImnhuv9u9Bj6osyYgitDxlhA,11935
77
+ pySimBlocks/blocks/sources/__init__.py,sha256=F_F4p6LqGneyEN-dYuWFZDeHpGwfgc5-dbtcwIPMGSM,1677
78
+ pySimBlocks/blocks/sources/chirp.py,sha256=yBfHv6eJrYsUNzO6R-tAGBr2V10tWYNaW18xXZgFxq8,5727
79
+ pySimBlocks/blocks/sources/constant.py,sha256=UyclOBQtlnLk0Ua5v72iGomauci0NfxVupmkiRPfj7A,3091
80
+ pySimBlocks/blocks/sources/file_source.py,sha256=EAquC3KR6FzY2d9JimbXod5pVkL9Ab8ZsKrETz6UGWI,11383
81
+ pySimBlocks/blocks/sources/function_source.py,sha256=7l_jkePCw10OL4pRoyW0DWqILxk2UTWBVJGf6ACjXis,7538
82
+ pySimBlocks/blocks/sources/ramp.py,sha256=M78JCQ23UrXQ4TBwtWCDzPbETBd4MLi6GjtuoLlAiRU,4136
83
+ pySimBlocks/blocks/sources/sinusoidal.py,sha256=0aK14axdiwBDKIwWzoWdxrjfd1iFbTV5Zn6NKae1au4,4391
84
+ pySimBlocks/blocks/sources/step.py,sha256=drnaSO7CQ1kJaAqy6CfQiektVA3JhuCg2Gj3-scsWHY,5061
85
+ pySimBlocks/blocks/sources/white_noise.py,sha256=dJSFULn8K7w1wkxu7HYaCudPBUoHga--GO_YIDhz4Ok,4091
86
+ pySimBlocks/blocks/systems/__init__.py,sha256=RGJEO8YeDVTO6aGspYUYfZfWvJLEhGa_r0s1Iw_rLdc,1358
87
+ pySimBlocks/blocks/systems/linear_state_space.py,sha256=diFGRNDi_TQNKLDmETErsZ5xYY-0L9p721UAZKTmaxs,6436
88
+ pySimBlocks/blocks/systems/non_linear_state_space.py,sha256=Yqfwgkbq3f8AUbFlbCzysuuTwCY7_wA1BrAH9LOPhVk,11184
89
+ pySimBlocks/blocks/systems/polytopic_state_space.py,sha256=WbAurzJXv6Cuu0e27zEoMApiIDW39XSWBh-BMRM1ObU,7011
90
+ pySimBlocks/blocks/systems/sofa/__init__.py,sha256=pe1ZFXJH5XU3GtAzCCYQFgJY9ulEyOBZ38yc7YFjyTU,1451
91
+ pySimBlocks/blocks/systems/sofa/sofa_controller.py,sha256=wwYqjKK_aUhIc5WNlytIa85G1qq6w1T_uCO0khYhRMI,18107
92
+ pySimBlocks/blocks/systems/sofa/sofa_exchange_i_o.py,sha256=8ny4ufy5ndNQmVuakKn6k98pXM7jRkPxO0BFDBzwwNQ,4418
93
+ pySimBlocks/blocks/systems/sofa/sofa_plant.py,sha256=qYU7hsbwiTMJ34E6ERkQWxVa6vdrK0cdyU-IDU5I2M0,10015
94
+ pySimBlocks/core/__init__.py,sha256=nCbABFl_lIP8PVRg0R0kP9--Z_5RXRIeahNVyQDn8s0,1431
95
+ pySimBlocks/core/block.py,sha256=Ej-dK9Jndv-9I96W_ajk9xcfDk51jUocfnJzTQefiWA,5837
96
+ pySimBlocks/core/block_source.py,sha256=-1EWmhdcnIXqbg-WMgb5xBhyG5puQPp4XzKVUMzJSnk,3941
97
+ pySimBlocks/core/config.py,sha256=0XLnm3R_QtRI6yo7FQpMoaHAZ9LoLQd3SAafuGDK3jo,3239
98
+ pySimBlocks/core/fixed_time_manager.py,sha256=lMjbt_uQEocG0Y_IUVqZGWbGM1LyBBcBAguspjUG1Sk,2087
99
+ pySimBlocks/core/model.py,sha256=ckOb-H5Al6BnW9T_MFApk0uw9vPchdjHWJznSo1HEDs,9383
100
+ pySimBlocks/core/scheduler.py,sha256=-gSJt6sn5l3je1zaNY4MgdNbpeJ--Hik98UIvQtVvsM,1541
101
+ pySimBlocks/core/simulator.py,sha256=NvoqjC_7rsnzOrCHVBPwM8cXTg8hWC_X2_SYYGyu1Ec,12378
102
+ pySimBlocks/core/task.py,sha256=kt6mQ8ew3Zr2AESYPeO3bDR13rC7C5zWixUAXljA_5U,2978
103
+ pySimBlocks/docs/blocks/controllers/pid.md,sha256=KkiyckyLyMH2Oj1aTpvnRkXeeCZ5-bSEhddBppmpFHE,1889
104
+ pySimBlocks/docs/blocks/controllers/state_feedback.md,sha256=7OIlWJRRlziaUtBOVfaKqChxhJYkUy_zxmYfDPeCN7U,1190
105
+ pySimBlocks/docs/blocks/interfaces/external_input.md,sha256=x96J605gLGenmTT_-ef-m0yJG0Se2pLsJl5h1LmiRWE,837
106
+ pySimBlocks/docs/blocks/interfaces/external_output.md,sha256=TXuQmSNoZq4ulviduZNT8cI1K5-AXc00u2VJ3vcPi8o,852
107
+ pySimBlocks/docs/blocks/observers/luenberger.md,sha256=uPW87_mM27eHoKx2m5JF09xBmA6Az-3h3AQgmC6til4,1510
108
+ pySimBlocks/docs/blocks/operators/algebraic_function.md,sha256=ToonLKJ97V3lGcQCd4uJfYyFEzruqAjCovsggb95NOA,2072
109
+ pySimBlocks/docs/blocks/operators/dead_zone.md,sha256=0Y_Q9youGEs9_GbIk5gpgu0f38ysz4OujoL2xfKDCUA,1691
110
+ pySimBlocks/docs/blocks/operators/delay.md,sha256=uUdg1W7lSv-ctYGyU1LByZiaP29UY3lZvgDwmbXlIdQ,2183
111
+ pySimBlocks/docs/blocks/operators/demux.md,sha256=d7AJTMghBCWX0gezMQfJWODckbG0R9xnqLUX-bmFtaQ,1425
112
+ pySimBlocks/docs/blocks/operators/discrete_derivator.md,sha256=jXkBsSKLezXAzFiaxgiYyskAS_dNoBimjKhR4JRaGFk,1412
113
+ pySimBlocks/docs/blocks/operators/discrete_integrator.md,sha256=gtTv3FlMcBY1g-OVJazOjMR2VfTnM6Yyl_DecJqfph4,2350
114
+ pySimBlocks/docs/blocks/operators/gain.md,sha256=LzZxd2nHetvPtMF2zGXwUwgrKtItyERnmSg9g-wobcw,2289
115
+ pySimBlocks/docs/blocks/operators/mux.md,sha256=KO-8ZdwQj_h0R3Vg-PFQZ-0zqdKNxT_6PRaWVFj0NfA,1319
116
+ pySimBlocks/docs/blocks/operators/product.md,sha256=IQ3NYG3iNOETrtJ2qHhFBNiGV-h8YvIBXgp5N5NpbJQ,1668
117
+ pySimBlocks/docs/blocks/operators/rate_limiter.md,sha256=NTgSyq2Y37CjpkvgYR5NC5xSasdaz0y03HlUUNi81ls,1850
118
+ pySimBlocks/docs/blocks/operators/saturation.md,sha256=nnO3348TPT-wGnLejPLfQBjQiGoDwqKazfuV70BDLZE,1469
119
+ pySimBlocks/docs/blocks/operators/sum.md,sha256=S3XenKh3LlQ0Tn_MZhii1mvpxQPVtcW8mYUjEhhlt0g,1085
120
+ pySimBlocks/docs/blocks/operators/zero_order_hold.md,sha256=Y58Ae3KprGMk5NeMIY_xCsoMTWjocmkraTpvOqxEbOU,1372
121
+ pySimBlocks/docs/blocks/optimizers/quadratic_program.md,sha256=ZP9hRvafD15hkxGelZXuZnuuFz0PVOdwMzz_gxXVazo,3183
122
+ pySimBlocks/docs/blocks/sources/chirp.md,sha256=z80CrJCZWBnsdK08LkW3XlZTxCxFz4fI-D3XTEpBp3o,2667
123
+ pySimBlocks/docs/blocks/sources/constant.md,sha256=7kjs8YNI1n00KEJ0ZeOf1MJhFqjdV0nQjp-eDzB2ZLM,1013
124
+ pySimBlocks/docs/blocks/sources/file_source.md,sha256=4xdyAfQJoUi0WVwJ8_iX36Lnv5i3M--r-R0UwxC169U,1531
125
+ pySimBlocks/docs/blocks/sources/function_source.md,sha256=l2HOiUIxZ_-l5q8LC5_nG9OIhev37mbcQjPf852ihGQ,1379
126
+ pySimBlocks/docs/blocks/sources/ramp.md,sha256=DBTW5YNFl35f1pUSrcjS5LC2OKTpdXhwomNSSwCgji8,1360
127
+ pySimBlocks/docs/blocks/sources/sinusoidal.md,sha256=t2htB4GkX3V5KzGbue8kOQ7IejzNZTLi-qIWeQDckI4,1479
128
+ pySimBlocks/docs/blocks/sources/step.md,sha256=OLykuwVr4gRd5jqjwkzqSILWzfxFbix3ltqsrzXLFs8,1452
129
+ pySimBlocks/docs/blocks/sources/white_noise.md,sha256=oILSK3I5FwcVXV6Ipvgwbwtnz5IOsFjdFn5rM75TcZo,1428
130
+ pySimBlocks/docs/blocks/systems/linear_state_space.md,sha256=upopyDYyjFWQX72jfjJtWs14LLLD4-czt-eImko0fyE,1401
131
+ pySimBlocks/docs/blocks/systems/non_linear_state_space.md,sha256=0Ek_LpR05yCvwQLjhwcQ_w6JDy1_8UFsWMbxg1VZMZM,2783
132
+ pySimBlocks/docs/blocks/systems/polytopic_state_space.md,sha256=GUtjUOxnYBPSI-iRdVCKdRWN2123IusFdn0EbwRhRfk,1819
133
+ pySimBlocks/docs/blocks/systems/sofa/sofa_exchange_i_o.md,sha256=9sr2GmEHfQ_r0hEfAzyihCZt453fI_owJDPFwv15OjI,1789
134
+ pySimBlocks/docs/blocks/systems/sofa/sofa_plant.md,sha256=4R5x15qz_4N0zb3kiz--VsFpfRfdTpny02udkoGx3fI,2145
135
+ pySimBlocks/gui/__init__.py,sha256=85q7ju0Fmnx2kmYMXAP-BGpue5CZGOAcRImYfB0YjT0,1136
136
+ pySimBlocks/gui/editor.py,sha256=4GpVTlOa5L2Eopwci1eRmUE14Ew2cqcnXh4r1s5X_V4,1885
137
+ pySimBlocks/gui/main_window.py,sha256=UjlB7GWelvdJ1O4vGOV-QE-TILvuFhaYEMeoPirmYJM,7107
138
+ pySimBlocks/gui/project_controller.py,sha256=toXhfz9KJpw9VJyezEqijN_0eMt6r7FdN8ntCQX8p08,11815
139
+ pySimBlocks/gui/addons/__init__.py,sha256=8_Azcqim-lux41SWyhlVWGx9fhFWjPT5SzbUYS7d41c,1135
140
+ pySimBlocks/gui/addons/sofa/__init__.py,sha256=8_Azcqim-lux41SWyhlVWGx9fhFWjPT5SzbUYS7d41c,1135
141
+ pySimBlocks/gui/addons/sofa/sofa_dialog.py,sha256=pfN1bf6uoRoi3oK-G5Yiym7I_QK5kIGK0SXTcif8RWE,6124
142
+ pySimBlocks/gui/addons/sofa/sofa_service.py,sha256=gqYuoda9BGQio4aKdCf-VMgwneoQ7wncEug8hgTtq6M,8628
143
+ pySimBlocks/gui/blocks/block_dialog_session.py,sha256=TXvbrmyhY5AeiSMqDKEz-70stuFkfyltB1eMo3Fma3A,1881
144
+ pySimBlocks/gui/blocks/block_meta.py,sha256=9VGHxMYjHkveWqI79otcKidvkt4cgUfKYvIRMbxhLp8,14226
145
+ pySimBlocks/gui/blocks/parameter_meta.py,sha256=5dvqCC15OXWzlf_-4CD9PfgOMV5UgIdRIyoY2tVgY3E,1456
146
+ pySimBlocks/gui/blocks/port_meta.py,sha256=uYdHLCLySZfWQHMEyucpWTXmu5ObuExHDzRyNVYw8wQ,1317
147
+ pySimBlocks/gui/blocks/controllers/pid.py,sha256=I3pvNWrXKNDNVcqx9E08merpwKCEHpjTYDSSDkiibeI,3949
148
+ pySimBlocks/gui/blocks/controllers/state_feedback.py,sha256=zl99xHJ8RMHkyTKdSocbKwYRllxQVPb5C-BGQjwC5_Q,2858
149
+ pySimBlocks/gui/blocks/interfaces/external_input.py,sha256=-ag5zfOkEEKabJSnZvNKZqUHBsD4eogQEj_kZU9zdnQ,2554
150
+ pySimBlocks/gui/blocks/interfaces/external_output.py,sha256=enZNWOtOFrXZT1-vZZBdiKScR9SWsN8Ll3oj0wBkueo,2531
151
+ pySimBlocks/gui/blocks/observers/luenberger.py,sha256=znJas5pvDQwa-BBmSLonMzr1o9SbDpdSpoZv88ZzKU8,3676
152
+ pySimBlocks/gui/blocks/operators/algebraic_function.py,sha256=dcYQUI0-6WE_oGz6LoL4R_zBAc1h5JS-FXKBcciAYiE,8541
153
+ pySimBlocks/gui/blocks/operators/dead_zone.py,sha256=Q4K9rDSEqDARKA1Uvvro6VLwBPmJTW3FCuRkCrjys9M,2931
154
+ pySimBlocks/gui/blocks/operators/delay.py,sha256=7pWZNa0TFjKpsWcYslkrqcKQGcY91YNmS0aP6BPOnyU,2808
155
+ pySimBlocks/gui/blocks/operators/demux.py,sha256=Irjq9p21OOppvfnEEkUU88I8Afpu8BuDSBUepGurSRo,3512
156
+ pySimBlocks/gui/blocks/operators/discrete_derivator.py,sha256=iKqKHCPh5xARxcpWLTR-2V-_5S0avHlfeqrvUAmfi3E,2488
157
+ pySimBlocks/gui/blocks/operators/discrete_integrator.py,sha256=RFWU4fp9CTPRfE4Qrfte5mfNUt5LoR9pGEHNTf0xxFQ,2889
158
+ pySimBlocks/gui/blocks/operators/gain.py,sha256=eEUrdFeGIQb2txhn_3VniPWf6rMDXngN4aO8vjxmCYI,2801
159
+ pySimBlocks/gui/blocks/operators/mux.py,sha256=vUv2oqWWmddDjWeuqbrA-fDQODN6_Tp7tbXeC4TYVlM,3563
160
+ pySimBlocks/gui/blocks/operators/product.py,sha256=WpDfPtNFBxkneZ10e4SrEva7GTPX-q_BBGRgdEQidwo,4022
161
+ pySimBlocks/gui/blocks/operators/rate_limiter.py,sha256=qN3Y2Hz6xq272d14Uo598OvSWcJavspznbdDGu5SdI8,2899
162
+ pySimBlocks/gui/blocks/operators/saturation.py,sha256=yRvfW-hL3Xa4hnO2024nP-Wnwht4nWwosMiB4ViY06M,2642
163
+ pySimBlocks/gui/blocks/operators/sum.py,sha256=K4NfEK_QE12kH_LeRbi9Izey8dTtKLuAlk-81lcxiC4,3150
164
+ pySimBlocks/gui/blocks/operators/zero_order_hold.py,sha256=k1Ug8NjkSHtIVGKUHO4cs6hdqXVOYk5xX_1cBWwOHco,2453
165
+ pySimBlocks/gui/blocks/optimizers/quadratic_program.py,sha256=_ShhfShOEw5hlB9bgxHr5b-2hSEZ9jcYQ-3AOH5g9hs,4934
166
+ pySimBlocks/gui/blocks/sources/chirp.py,sha256=vDAF45uIEhGvzQ2DlCb3xQ2D8DvIl10YXNDMfWm7Ltg,4819
167
+ pySimBlocks/gui/blocks/sources/constant.py,sha256=-xV1SAiHFOpHfgiNR02Y_HR4Nb5i0yEZNx9zZ9COZfI,2324
168
+ pySimBlocks/gui/blocks/sources/file_source.py,sha256=FVO6y5ISp9MdN3gWJnyubItkOUbfiJCDmTVp5qC2ntU,7432
169
+ pySimBlocks/gui/blocks/sources/function_source.py,sha256=PC-NZvj0iwYkI-QYxTG3ADQD5ikv9usnV80JT6SAZi8,7635
170
+ pySimBlocks/gui/blocks/sources/ramp.py,sha256=hCA_rJaboplOzsF-7v_p12XBjifLEAn-Mo6jLxL8iJs,2779
171
+ pySimBlocks/gui/blocks/sources/sinusoidal.py,sha256=lkb5jPhcELhOm4SaGO0W7lEOzNIlL1ksjGxQuy8FwqA,3082
172
+ pySimBlocks/gui/blocks/sources/step.py,sha256=3tv0kd8hC8ndOcnorTGY5-n6GaVf7IV1QV1YUy7fTlY,3061
173
+ pySimBlocks/gui/blocks/sources/white_noise.py,sha256=Uzh1EM4RcE4TN4rufuQzJloaG5uxm0qj4Ip48yzGtbM,2716
174
+ pySimBlocks/gui/blocks/systems/linear_state_space.py,sha256=m6griIN2xIEZ_ekuduPyMGet5zBHie-zIDjt1_FtQlc,3472
175
+ pySimBlocks/gui/blocks/systems/non_linear_state_space.py,sha256=9_cMldEcJmOam_G7tqIMLwpPesqLEfLvv5UPxQwJzYU,8850
176
+ pySimBlocks/gui/blocks/systems/polytopic_state_space.py,sha256=abMKJA-Hu7fXlzxuAV3T9dkI4pPn15_47PQ0moXU-gE,3897
177
+ pySimBlocks/gui/blocks/systems/sofa/sofa_exchange_i_o.py,sha256=2EJgHlDh9q5g9F7yO-ED2QBoTk-WIJ_wkc6b6OO3MOA,8131
178
+ pySimBlocks/gui/blocks/systems/sofa/sofa_plant.py,sha256=8-dzNiSy1Gl8rDR8S_TELxtjEwTRBx-m-6CR-zSah3I,7900
179
+ pySimBlocks/gui/dialogs/__init__.py,sha256=8_Azcqim-lux41SWyhlVWGx9fhFWjPT5SzbUYS7d41c,1135
180
+ pySimBlocks/gui/dialogs/block_dialog.py,sha256=KDHc0aAEgUMAKl-eQCZNGr34gMzi87gpfn1-RBRb6H0,4695
181
+ pySimBlocks/gui/dialogs/display_yaml_dialog.py,sha256=AGgG0vPv13yCZKiMWcG_Uk8U9hdczDZ4mh5y5NdvvIk,3134
182
+ pySimBlocks/gui/dialogs/help_dialog.py,sha256=SBuxPBcfXGkA0DiyQyDj-kxJQqnYINEJ7TMNAqT2yM0,1641
183
+ pySimBlocks/gui/dialogs/plot_dialog.py,sha256=m47JQGcdqI7AZi3jLpgbX7Oeug_NgjjpAD6hikyElaU,8101
184
+ pySimBlocks/gui/dialogs/settings_dialog.py,sha256=C7sC3gRbtJbS9W8dpiqQuMqY6KSTxBYZQEnDy5i71dc,3414
185
+ pySimBlocks/gui/dialogs/unsaved_dialog.py,sha256=MoDXQCFa5X-0lUhZLr-5uz416HaU3qRsCofZfSMGmBc,3225
186
+ pySimBlocks/gui/dialogs/settings/plots.py,sha256=KsCpcuO-rkvIGM1zLtoiB6QFe688IppAqO9mEfZ6jFk,6652
187
+ pySimBlocks/gui/dialogs/settings/project.py,sha256=GsDSXmTtDmW2R1T5GyOmDF21VFxFJ09JcwAl4Kpdo0Y,5694
188
+ pySimBlocks/gui/dialogs/settings/simulation.py,sha256=iDi--we8jouq4bER_VPZppRW0Kh1zpCbUKUJyClTs10,5394
189
+ pySimBlocks/gui/graphics/__init__.py,sha256=1luRkzpmlwbGq3y4zHF1cj9o07ba83KdtKPei2i19xg,1387
190
+ pySimBlocks/gui/graphics/block_item.py,sha256=YiZBWRpWEzH5_q6OOv0Hz2Qkvs9IicypTLXKqRGQ9Ik,11674
191
+ pySimBlocks/gui/graphics/connection_item.py,sha256=-8_8_SAqv7OkjguSLSMkj1Lo7BjHOt4PmSMJ0kyJi-Y,10115
192
+ pySimBlocks/gui/graphics/port_item.py,sha256=uBrYFkT_U0sR0KhvCF9-vryKwRGN6gDFRQlUZRc5XHM,6081
193
+ pySimBlocks/gui/graphics/theme.py,sha256=vnsBtsyQYlSYSqwxsRqXNiUGFw7z9UjFNwaTEaKJMyY,4050
194
+ pySimBlocks/gui/models/__init__.py,sha256=lMkpPJpjzRq17M5uj6dCqo8oVlCXCfw2SirqsAl-FmM,1499
195
+ pySimBlocks/gui/models/block_instance.py,sha256=QRYPewS0LoQ9m00vPuBoLhj9BdArvg4MpeorgKYH9Uk,3790
196
+ pySimBlocks/gui/models/connection_instance.py,sha256=zIhM2TS02hv3zE36bfFyMgC_8oo-0XH0CqKVl9IhMcA,1810
197
+ pySimBlocks/gui/models/port_instance.py,sha256=rzCZ2KHGtrusAwFbKuLogv-0g8aKBeU9qYm_aL-V_Ac,2165
198
+ pySimBlocks/gui/models/project_simulation_params.py,sha256=U6PjmGTJZkkOUR-93Ml0rc82oBMbMx9rh3pEiiN4PFg,1985
199
+ pySimBlocks/gui/models/project_state.py,sha256=L-u0x_72aayBmky4cNdBt1qL3BEoI7xMicfLdeY_LhE,4460
200
+ pySimBlocks/gui/services/__init__.py,sha256=85q7ju0Fmnx2kmYMXAP-BGpue5CZGOAcRImYfB0YjT0,1136
201
+ pySimBlocks/gui/services/project_loader.py,sha256=qKL5nPuJUKTb1e6vXnQcwf-mbINDRJKS71LZ21JsoUY,14647
202
+ pySimBlocks/gui/services/project_saver.py,sha256=puX_LNZG1fQ7pSUm8FXs2jg1GLOpK4x0_DqU5AgQIQ4,2555
203
+ pySimBlocks/gui/services/simulation_runner.py,sha256=A7nDtWofqAv0I0Wz4jaSfcH8PmKymoE1-p0-y9nPk08,2562
204
+ pySimBlocks/gui/services/yaml_tools.py,sha256=keZM9T8DdzNDm6vk82dC75DJM96ejgzTXcrEm3tRr24,7971
205
+ pySimBlocks/gui/widgets/__init__.py,sha256=8_Azcqim-lux41SWyhlVWGx9fhFWjPT5SzbUYS7d41c,1135
206
+ pySimBlocks/gui/widgets/block_list.py,sha256=F-M13VtbgGsEjz5znkfoFnh-hcuGeF3WUK173V7yFN0,4998
207
+ pySimBlocks/gui/widgets/diagram_view.py,sha256=CqQzqTfW7v8aUQLgpgsgBCqnAIvBg7mH0vOkNXWQqog,13443
208
+ pySimBlocks/gui/widgets/toolbar_view.py,sha256=KlCd-O_H0RMIMZkZvYK4WcDrKtu88wE4ffBdbPU6vC8,6235
209
+ pySimBlocks/project/__init__.py,sha256=0zfDsE4Udf2Wa1_eidnBBr7DFe9loIvwpVelOU4rVO8,1713
210
+ pySimBlocks/project/build_model.py,sha256=xh8B4jW6DabXRnDNLHa97wRmogxyJQtV6NGWJgE-V7g,3798
211
+ pySimBlocks/project/generate_run_script.py,sha256=_NnCgzDWpQmBGAh7Ubv9eC0cZt89REnx_2xN3qRX58A,3665
212
+ pySimBlocks/project/generate_sofa_controller.py,sha256=fJ2LIJ_Z3D_dnXgIPJ5z7pP4tM5V0yEfjGOnWxYHWfo,7014
213
+ pySimBlocks/project/load_project_config.py,sha256=cmyXpbCivOkkXIQLOCBAU9NtXYQEXRU7zstj6DTLwhY,7182
214
+ pySimBlocks/project/load_simulation_config.py,sha256=VFrdu8sdwBP3gxZ9PVG5cZF-jXwzitcThDU0usEikzw,5505
215
+ pySimBlocks/project/load_simulator.py,sha256=td6xqbZSjVHLc8JQfOTPk5qD0BvEVF5WT3lPHK2VoQ0,1938
216
+ pySimBlocks/project/plot_from_config.py,sha256=vfCDd3-fN67yFPUtCiZ4Bd8nbWtJO5YrYcc-jj9qDUI,5810
217
+ pySimBlocks/project/pySimBlocks_blocks_index.yaml,sha256=rW9wx6dz9t-wG9h-NE08UhmaWdQM_lqVIXigtuS_uQY,3086
218
+ pySimBlocks/real_time/__init__.py,sha256=L8qDmJbnYk2kU-a_if0EuEFQ132XOvJI88qFV6KL_2w,1232
219
+ pySimBlocks/real_time/real_time_runner.py,sha256=mS-ZJdA70NHWcKwI-pdKZh3jYhaHBDLJH3-tgboeU9c,5458
220
+ pySimBlocks/tools/__init__.py,sha256=8_Azcqim-lux41SWyhlVWGx9fhFWjPT5SzbUYS7d41c,1135
221
+ pySimBlocks/tools/blocks_registry.py,sha256=iydb7dko6K6AtqbuJDbc5G4Ousykav1GJHf9Lub5Uh4,4196
222
+ pySimBlocks/tools/generate_blocks_index.py,sha256=qsSIRsfPtt3jEXZG5Dg44_K5xpCB2bTAmcP2Z4mk-Cw,4000
223
+ pysimblocks-0.1.0.dist-info/licenses/LICENSE.md,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
224
+ tests/blocks/controllers/test_pid.py,sha256=R7YNdAqpjGxnFS_mAHwB_leBz8vps_8iQd-FxvXYYGk,4607
225
+ tests/blocks/controllers/test_state_feedback.py,sha256=sei2PJNwPJ6PVfIAOOb3XnnSstaW4msaxjMiadB_yKI,6016
226
+ tests/blocks/observers/test_luenberger.py,sha256=Lw0OlLs1gLhh36qa1-cFrRklr9A-A0mZHLZIpD0VEZc,6725
227
+ tests/blocks/operators/test_algebraic_function.py,sha256=Urmrv5NXUfvuqQKlOtSgOnshbZsJmf8D1jVMxhf4pFg,7431
228
+ tests/blocks/operators/test_dead_zone.py,sha256=EDT8N9kRFwQhamSQYl-jEgvOC6tfMRj6MmNKXW3_TLE,3041
229
+ tests/blocks/operators/test_delay.py,sha256=2KLS-0cXt43UXE5XN2p1xqmr6c2NGkRgs1juRcQvwa0,5329
230
+ tests/blocks/operators/test_demux.py,sha256=OVZUeljxKyfMV-y8vvaRRJLMwFsXOjpiUsOyNQCW8qA,3025
231
+ tests/blocks/operators/test_discrete_derivator.py,sha256=5Gj_WC2yUz_ZSd35QvEw5pGPokQMIY2h9Ls2IZ9KbA0,5075
232
+ tests/blocks/operators/test_discrete_integrator.py,sha256=N8FMO359fJkq7_X4jvPBXAtk0x0Vx5SdF4hC4pjN8jk,5573
233
+ tests/blocks/operators/test_gain.py,sha256=4RBopLrto1LqnB0oIO-5WvPxofOMg8Q6TRicKwT4L30,5648
234
+ tests/blocks/operators/test_mux.py,sha256=Lys71QLWm48kdliUq3h3xSjJdRHgGpynOEIKyJMnkXs,2848
235
+ tests/blocks/operators/test_product.py,sha256=hLiLg_xr2tOfhfFOlpHrcFdxMw-fV_bAPJB1V760jBg,5777
236
+ tests/blocks/operators/test_rate_limiter.py,sha256=V62hRFnF9j57kJCwdPnVZeHnZsMjFg7qB-_Xer03yec,5163
237
+ tests/blocks/operators/test_saturation.py,sha256=4566kAZDdayFNtmhxBxgQB4MElbv0YPwmaE1BiNYQ8E,5382
238
+ tests/blocks/operators/test_sum.py,sha256=wOTRET5CY2hrCpRV-3TPnxW9D_2OlFHR2RpA9P9IKBA,5584
239
+ tests/blocks/operators/test_zero_order_hold.py,sha256=0qJn_9ffTL4Ixr4utFjOs6LUxEG21V-nNR4QhTEa3TE,3208
240
+ tests/blocks/sources/test_chirp.py,sha256=M6mj2CE4PPR09MrtzTcYCXZGuXK8C0aI0gc9GGlBWgI,4360
241
+ tests/blocks/sources/test_constant.py,sha256=HqdO-y3zy8LvTwgl78tS3uN_YijpU8-Wm_flui0wcuU,1938
242
+ tests/blocks/sources/test_file_source.py,sha256=ir1wNpZOOaIydMmQic3AV8N3rsHqK0eo_wdELNv2SE4,5358
243
+ tests/blocks/sources/test_function_source.py,sha256=KYE7oYWxhS9-4BnGAAMLh35WFWmRwCXn1DmnOb9R19g,3741
244
+ tests/blocks/sources/test_ramp.py,sha256=atxsz51oQSLMgd9kI6-wzxViQRMj1ib-7TP03OJb9jE,3552
245
+ tests/blocks/sources/test_sinusoidal.py,sha256=Zql-3wiXPjkDd_apzZ5kB6L0AvAxF-yDu047LaIUowg,3625
246
+ tests/blocks/sources/test_step.py,sha256=jofZ5rQ31t_DnrKqYuXgap92svwy2_eJkpULv7svPsU,2070
247
+ tests/blocks/sources/test_white_noise.py,sha256=d9TbgcwpHxYEL6clNbpBJAbHy08Uv82k8tSLpPCNprk,3376
248
+ tests/blocks/systems/test_linear_state_space.py,sha256=zbglAt6_P_VTnFR1rokYiSr9avd0PL42AVuQYfSI5jM,3612
249
+ tests/blocks/systems/test_polytopic_state_space.py,sha256=LCRlglO_pZ31VoguOQjAXV72s2kY0af1E3GVmNnmhfw,3694
250
+ tests/core/test_core_errors_and_determinism.py,sha256=mm_megCrAIx8IpreG9U4nNA1Ijp9wODYeVtE3_H2ny0,2515
251
+ tests/core/test_core_multirate_tasks.py,sha256=2Tp0c0Wik1Lz7lfQuIZeIiDUguuFLQu38yywj6js6jY,2741
252
+ tests/core/test_core_two_phase_and_propagation.py,sha256=f3pkGZisd2LL20-A8TMZf0J4Ln2tyyv3gdQ7QrcK6jE,3780
253
+ tests/gui/main_window_open_test.py,sha256=toZOX09_HoORMHeXPI2N_Z3vimy-SPcZg5G5Vsil_-0,3853
254
+ tests/gui/test_block_meta_param_cache.py,sha256=vo-oz8XqfFPuB877IOUdHxolOCIIB9Zzi6suPyhMncM,545
255
+ tests/gui/test_file_source_meta.py,sha256=hAvScPqPKv0vGJZy1xF1oyFgsqq-7Ru49Lvtjalu2Ng,679
256
+ tests/gui/test_function_source_meta.py,sha256=Rq1xSW_9qY0E3ej4j6UYSCGcqvfDBa96GcEYeOGYHG4,895
257
+ tests/regression/test_simulink_dc_motor.py,sha256=CoxJckIKTR6x89ST9HXb2ZOfViNIAN38I5D8i5aFfx4,7801
258
+ pysimblocks-0.1.0.dist-info/METADATA,sha256=0Bn7FfpD1mA9D17c83jfqs4J7fS6c2R9Y0NsCFR5n54,5712
259
+ pysimblocks-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
260
+ pysimblocks-0.1.0.dist-info/entry_points.txt,sha256=n7l2cIzly0z8W9KOES4rIU4H1jV-8NLKMmhFjYaSPyE,53
261
+ pysimblocks-0.1.0.dist-info/top_level.txt,sha256=dewg9n-HlEYSsW3-S9w-BDaPQATU6b_hh59OGZOoFaw,27
262
+ pysimblocks-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ pysimblocks = pySimBlocks.cli:main