pyplcopen 0.20.0__tar.gz

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 (511) hide show
  1. pyplcopen-0.20.0/.clang-tidy +22 -0
  2. pyplcopen-0.20.0/.github/ISSUE_TEMPLATE/task.yml +63 -0
  3. pyplcopen-0.20.0/.github/pull_request_template.md +17 -0
  4. pyplcopen-0.20.0/.github/workflows/core-nightly.yml +173 -0
  5. pyplcopen-0.20.0/.github/workflows/coverage.yml +29 -0
  6. pyplcopen-0.20.0/.github/workflows/docs.yml +30 -0
  7. pyplcopen-0.20.0/.github/workflows/linux-ci.yml +148 -0
  8. pyplcopen-0.20.0/.github/workflows/mutation-score.yml +18 -0
  9. pyplcopen-0.20.0/.github/workflows/wheels.yml +72 -0
  10. pyplcopen-0.20.0/.github/workflows/windows-ci.yml +74 -0
  11. pyplcopen-0.20.0/.gitignore +51 -0
  12. pyplcopen-0.20.0/.version +1 -0
  13. pyplcopen-0.20.0/AGENTS.md +9 -0
  14. pyplcopen-0.20.0/BUILD_LINUX.md +78 -0
  15. pyplcopen-0.20.0/BUILD_README.md +107 -0
  16. pyplcopen-0.20.0/CHANGELOG.md +543 -0
  17. pyplcopen-0.20.0/CLAUDE.md +71 -0
  18. pyplcopen-0.20.0/CMakeLists.txt +205 -0
  19. pyplcopen-0.20.0/CONTEXT.md +51 -0
  20. pyplcopen-0.20.0/LICENSE +201 -0
  21. pyplcopen-0.20.0/PKG-INFO +224 -0
  22. pyplcopen-0.20.0/PROVENANCE.md +89 -0
  23. pyplcopen-0.20.0/README.md +199 -0
  24. pyplcopen-0.20.0/ROADMAP.md +187 -0
  25. pyplcopen-0.20.0/STATUS.md +101 -0
  26. pyplcopen-0.20.0/VISION.md +297 -0
  27. pyplcopen-0.20.0/build.ps1 +327 -0
  28. pyplcopen-0.20.0/build.sh +125 -0
  29. pyplcopen-0.20.0/ci/smoke_test.py +58 -0
  30. pyplcopen-0.20.0/cmake/Doxyfile.in +43 -0
  31. pyplcopen-0.20.0/cmake/clang_tidy_gate.cmake +80 -0
  32. pyplcopen-0.20.0/cmake/core_cross_compile_smoke.cmake +74 -0
  33. pyplcopen-0.20.0/cmake/coverage_gate.cmake +144 -0
  34. pyplcopen-0.20.0/cmake/generate_part1_io_matrix.cmake +154 -0
  35. pyplcopen-0.20.0/cmake/generate_part1_part2_matrix.cmake +100 -0
  36. pyplcopen-0.20.0/cmake/generate_part5_io_matrix.cmake +171 -0
  37. pyplcopen-0.20.0/cmake/generate_st_binding_pin_catalog.cmake +44 -0
  38. pyplcopen-0.20.0/cmake/mutation_score_gate.cmake +252 -0
  39. pyplcopen-0.20.0/cmake/mutation_smoke.cmake +67 -0
  40. pyplcopen-0.20.0/cmake/plcopenConfig.cmake.in +5 -0
  41. pyplcopen-0.20.0/cmake/rt_safety_scan.cmake +126 -0
  42. pyplcopen-0.20.0/cmake/toolchain-aarch64-linux-gnu.cmake +12 -0
  43. pyplcopen-0.20.0/cmake/verify_replay_fixtures.cmake +147 -0
  44. pyplcopen-0.20.0/cmake/verify_st_binding_fb_catalog.cmake +130 -0
  45. pyplcopen-0.20.0/cmake/verify_st_conformance.cmake +88 -0
  46. pyplcopen-0.20.0/cmake/verify_st_feature_set.cmake +202 -0
  47. pyplcopen-0.20.0/cmake/verify_st_l1a_conversions.cmake +66 -0
  48. pyplcopen-0.20.0/conanfile.py +48 -0
  49. pyplcopen-0.20.0/core/.clang-format +10 -0
  50. pyplcopen-0.20.0/core/CMakeLists.txt +528 -0
  51. pyplcopen-0.20.0/core/README.md +55 -0
  52. pyplcopen-0.20.0/core/adapters/README.md +24 -0
  53. pyplcopen-0.20.0/core/adapters/cia402.h +154 -0
  54. pyplcopen-0.20.0/core/adapters/feetech.h +531 -0
  55. pyplcopen-0.20.0/core/adapters/mode_manager.h +81 -0
  56. pyplcopen-0.20.0/core/adapters/servo.h +130 -0
  57. pyplcopen-0.20.0/core/axis/README.md +145 -0
  58. pyplcopen-0.20.0/core/axis/group.h +7744 -0
  59. pyplcopen-0.20.0/core/axis/group_takeover_connector.h +261 -0
  60. pyplcopen-0.20.0/core/axis/state.h +3907 -0
  61. pyplcopen-0.20.0/core/bench/core_benchmark.cpp +351 -0
  62. pyplcopen-0.20.0/core/bench/jitter_harness.cpp +235 -0
  63. pyplcopen-0.20.0/core/bench/legacy_compare.cpp +330 -0
  64. pyplcopen-0.20.0/core/demo/basic_fb_cycle.cpp +22 -0
  65. pyplcopen-0.20.0/core/demo/group_linear_move.cpp +46 -0
  66. pyplcopen-0.20.0/core/demo/group_path_motion.cpp +133 -0
  67. pyplcopen-0.20.0/core/demo/rt_executor_demo.cpp +445 -0
  68. pyplcopen-0.20.0/core/demo/trajectory_stream.cpp +116 -0
  69. pyplcopen-0.20.0/core/exec/README.md +25 -0
  70. pyplcopen-0.20.0/core/exec/sampler.h +65 -0
  71. pyplcopen-0.20.0/core/exec/sync.h +464 -0
  72. pyplcopen-0.20.0/core/fb/README.md +108 -0
  73. pyplcopen-0.20.0/core/fb/base.h +178 -0
  74. pyplcopen-0.20.0/core/fb/basic.h +286 -0
  75. pyplcopen-0.20.0/core/fb/group.h +1296 -0
  76. pyplcopen-0.20.0/core/fb/homing.h +1739 -0
  77. pyplcopen-0.20.0/core/fb/io.h +540 -0
  78. pyplcopen-0.20.0/core/fb/management.h +440 -0
  79. pyplcopen-0.20.0/core/fb/motion.h +1289 -0
  80. pyplcopen-0.20.0/core/fb/parameter.h +330 -0
  81. pyplcopen-0.20.0/core/fb/path_table.h +705 -0
  82. pyplcopen-0.20.0/core/fb/probe.h +187 -0
  83. pyplcopen-0.20.0/core/fb/profile.h +474 -0
  84. pyplcopen-0.20.0/core/fb/sync.h +765 -0
  85. pyplcopen-0.20.0/core/fb/tracking.h +137 -0
  86. pyplcopen-0.20.0/core/geom/README.md +32 -0
  87. pyplcopen-0.20.0/core/geom/frame.h +250 -0
  88. pyplcopen-0.20.0/core/geom/geometry.h +799 -0
  89. pyplcopen-0.20.0/core/kin/README.md +60 -0
  90. pyplcopen-0.20.0/core/kin/gantry.h +83 -0
  91. pyplcopen-0.20.0/core/kin/kinematics.h +53 -0
  92. pyplcopen-0.20.0/core/kin/pose.h +45 -0
  93. pyplcopen-0.20.0/core/kin/scara.h +118 -0
  94. pyplcopen-0.20.0/core/kin/verify.h +135 -0
  95. pyplcopen-0.20.0/core/kin/wrist6r.h +297 -0
  96. pyplcopen-0.20.0/core/otg/README.md +55 -0
  97. pyplcopen-0.20.0/core/otg/profile1d.h +291 -0
  98. pyplcopen-0.20.0/core/otg/time_optimal.h +1332 -0
  99. pyplcopen-0.20.0/core/plan/README.md +29 -0
  100. pyplcopen-0.20.0/core/plan/path.h +243 -0
  101. pyplcopen-0.20.0/core/plan/topp.h +237 -0
  102. pyplcopen-0.20.0/core/plan/topp_executor.h +411 -0
  103. pyplcopen-0.20.0/core/plan/topp_jerk.h +326 -0
  104. pyplcopen-0.20.0/core/rt/README.md +30 -0
  105. pyplcopen-0.20.0/core/rt/cycle.h +71 -0
  106. pyplcopen-0.20.0/core/rt/error.h +69 -0
  107. pyplcopen-0.20.0/core/rt/error_text.h +31 -0
  108. pyplcopen-0.20.0/core/rt/spsc_queue.h +69 -0
  109. pyplcopen-0.20.0/core/rt/static_vector.h +85 -0
  110. pyplcopen-0.20.0/core/rt/units.h +87 -0
  111. pyplcopen-0.20.0/core/st/README.md +73 -0
  112. pyplcopen-0.20.0/core/st/ast.h +352 -0
  113. pyplcopen-0.20.0/core/st/bind.h +121 -0
  114. pyplcopen-0.20.0/core/st/binding.h +109 -0
  115. pyplcopen-0.20.0/core/st/binding_manifest.h +318 -0
  116. pyplcopen-0.20.0/core/st/binding_registry.h +238 -0
  117. pyplcopen-0.20.0/core/st/binding_storage.h +126 -0
  118. pyplcopen-0.20.0/core/st/bytecode.h +1056 -0
  119. pyplcopen-0.20.0/core/st/codegen.h +1250 -0
  120. pyplcopen-0.20.0/core/st/compile.h +809 -0
  121. pyplcopen-0.20.0/core/st/configuration_runtime.h +1012 -0
  122. pyplcopen-0.20.0/core/st/conv.h +168 -0
  123. pyplcopen-0.20.0/core/st/debug.h +1180 -0
  124. pyplcopen-0.20.0/core/st/debug_types.h +320 -0
  125. pyplcopen-0.20.0/core/st/diag.h +205 -0
  126. pyplcopen-0.20.0/core/st/generated/mc_pins.h +150 -0
  127. pyplcopen-0.20.0/core/st/generated/st_binding_catalog.h +1865 -0
  128. pyplcopen-0.20.0/core/st/generated/st_binding_native.h +37138 -0
  129. pyplcopen-0.20.0/core/st/generated/st_binding_pins.h +1697 -0
  130. pyplcopen-0.20.0/core/st/generated/st_binding_types.h +490 -0
  131. pyplcopen-0.20.0/core/st/l2b.h +2220 -0
  132. pyplcopen-0.20.0/core/st/lexer.h +1123 -0
  133. pyplcopen-0.20.0/core/st/parser.h +1433 -0
  134. pyplcopen-0.20.0/core/st/pins.h +78 -0
  135. pyplcopen-0.20.0/core/st/process_image.h +1046 -0
  136. pyplcopen-0.20.0/core/st/sema.h +3584 -0
  137. pyplcopen-0.20.0/core/st/sfc.h +1206 -0
  138. pyplcopen-0.20.0/core/st/st.h +16 -0
  139. pyplcopen-0.20.0/core/st/standard_functions.h +119 -0
  140. pyplcopen-0.20.0/core/st/standard_names.h +23 -0
  141. pyplcopen-0.20.0/core/st/tasking.h +784 -0
  142. pyplcopen-0.20.0/core/st/token.h +161 -0
  143. pyplcopen-0.20.0/core/st/type_desc.h +917 -0
  144. pyplcopen-0.20.0/core/st/types.h +341 -0
  145. pyplcopen-0.20.0/core/st/vm.h +4332 -0
  146. pyplcopen-0.20.0/core/stream/README.md +73 -0
  147. pyplcopen-0.20.0/core/stream/filter.h +888 -0
  148. pyplcopen-0.20.0/core/stream/joint_group.h +103 -0
  149. pyplcopen-0.20.0/core/stream/quintic_fast_path.h +238 -0
  150. pyplcopen-0.20.0/core/test/a2_alloc_guard_tests.cpp +310 -0
  151. pyplcopen-0.20.0/core/test/a3_circular_tests.cpp +696 -0
  152. pyplcopen-0.20.0/core/test/a4_blending_tests.cpp +647 -0
  153. pyplcopen-0.20.0/core/test/a5_lookahead_tests.cpp +869 -0
  154. pyplcopen-0.20.0/core/test/adapters_tests.cpp +413 -0
  155. pyplcopen-0.20.0/core/test/cam_tests.cpp +368 -0
  156. pyplcopen-0.20.0/core/test/cartesian_tests.cpp +1941 -0
  157. pyplcopen-0.20.0/core/test/commercial_precision_tests.cpp +256 -0
  158. pyplcopen-0.20.0/core/test/coordinate_tests.cpp +347 -0
  159. pyplcopen-0.20.0/core/test/core_rt_tests.cpp +179 -0
  160. pyplcopen-0.20.0/core/test/feetech_fuzz.cpp +47 -0
  161. pyplcopen-0.20.0/core/test/feetech_tests.cpp +275 -0
  162. pyplcopen-0.20.0/core/test/geom_derivative_tests.cpp +299 -0
  163. pyplcopen-0.20.0/core/test/geom_third_derivative_tests.cpp +237 -0
  164. pyplcopen-0.20.0/core/test/kinematics_tests.cpp +446 -0
  165. pyplcopen-0.20.0/core/test/otg_fuzz.cpp +113 -0
  166. pyplcopen-0.20.0/core/test/otg_optimality_oracle.cpp +806 -0
  167. pyplcopen-0.20.0/core/test/otg_oracle.cpp +88 -0
  168. pyplcopen-0.20.0/core/test/otg_time_optimal_tests.cpp +1292 -0
  169. pyplcopen-0.20.0/core/test/part1_c4_tests.cpp +826 -0
  170. pyplcopen-0.20.0/core/test/part4_c3_fuzz.cpp +88 -0
  171. pyplcopen-0.20.0/core/test/part4_c3_tests.cpp +1067 -0
  172. pyplcopen-0.20.0/core/test/part4_management_tests.cpp +1745 -0
  173. pyplcopen-0.20.0/core/test/part4_p4b1_fuzz.cpp +145 -0
  174. pyplcopen-0.20.0/core/test/part4_p4b1_tests.cpp +1071 -0
  175. pyplcopen-0.20.0/core/test/part4_p4b2_fuzz.cpp +132 -0
  176. pyplcopen-0.20.0/core/test/part4_p4b2_tests.cpp +1061 -0
  177. pyplcopen-0.20.0/core/test/part4_p4b3_fuzz.cpp +108 -0
  178. pyplcopen-0.20.0/core/test/part4_p4b3_tests.cpp +920 -0
  179. pyplcopen-0.20.0/core/test/part4_pathtable_tests.cpp +1484 -0
  180. pyplcopen-0.20.0/core/test/part5_c5_tests.cpp +608 -0
  181. pyplcopen-0.20.0/core/test/part5_homing_tests.cpp +3612 -0
  182. pyplcopen-0.20.0/core/test/pose_tests.cpp +484 -0
  183. pyplcopen-0.20.0/core/test/r2_motion_tests.cpp +454 -0
  184. pyplcopen-0.20.0/core/test/r3_group_fb_tests.cpp +1975 -0
  185. pyplcopen-0.20.0/core/test/r3_io_tests.cpp +698 -0
  186. pyplcopen-0.20.0/core/test/r3_motion_family_tests.cpp +1525 -0
  187. pyplcopen-0.20.0/core/test/r3_parameter_tests.cpp +693 -0
  188. pyplcopen-0.20.0/core/test/r3_probe_tests.cpp +384 -0
  189. pyplcopen-0.20.0/core/test/r3_profile_tests.cpp +1175 -0
  190. pyplcopen-0.20.0/core/test/r3_semantics_tests.cpp +1016 -0
  191. pyplcopen-0.20.0/core/test/r3_sync_tests.cpp +1962 -0
  192. pyplcopen-0.20.0/core/test/readback_tests.cpp +584 -0
  193. pyplcopen-0.20.0/core/test/replay_regression.cpp +751 -0
  194. pyplcopen-0.20.0/core/test/st_fuzz.cpp +1206 -0
  195. pyplcopen-0.20.0/core/test/st_l0_compiler_tests.cpp +588 -0
  196. pyplcopen-0.20.0/core/test/st_l0_golden_tests.cpp +236 -0
  197. pyplcopen-0.20.0/core/test/st_l0_quality_tests.cpp +314 -0
  198. pyplcopen-0.20.0/core/test/st_l0_runtime_tests.cpp +2677 -0
  199. pyplcopen-0.20.0/core/test/st_l1a_conversion_tests.cpp +472 -0
  200. pyplcopen-0.20.0/core/test/st_l1a_types_tests.cpp +394 -0
  201. pyplcopen-0.20.0/core/test/st_l1b1_tests.cpp +534 -0
  202. pyplcopen-0.20.0/core/test/st_l1b2_tests.cpp +622 -0
  203. pyplcopen-0.20.0/core/test/st_l1b3_tests.cpp +828 -0
  204. pyplcopen-0.20.0/core/test/st_l2a_tests.cpp +610 -0
  205. pyplcopen-0.20.0/core/test/st_l2b_tests.cpp +1662 -0
  206. pyplcopen-0.20.0/core/test/st_l2c_tests.cpp +3382 -0
  207. pyplcopen-0.20.0/core/test/st_l3_tests.cpp +986 -0
  208. pyplcopen-0.20.0/core/test/st_l4_tests.cpp +902 -0
  209. pyplcopen-0.20.0/core/test/st_l5_frontend_tests.cpp +391 -0
  210. pyplcopen-0.20.0/core/test/st_l5_tests.cpp +1494 -0
  211. pyplcopen-0.20.0/core/test/st_l6_tests.cpp +1470 -0
  212. pyplcopen-0.20.0/core/test/st_l7_tests.cpp +1566 -0
  213. pyplcopen-0.20.0/core/test/st_numeric_semantics_tests.cpp +187 -0
  214. pyplcopen-0.20.0/core/test/st_type_desc_tests.cpp +400 -0
  215. pyplcopen-0.20.0/core/test/state_transition_matrix_tests.cpp +3570 -0
  216. pyplcopen-0.20.0/core/test/stream_fastpath_oracle.cpp +458 -0
  217. pyplcopen-0.20.0/core/test/stream_filter_tests.cpp +1232 -0
  218. pyplcopen-0.20.0/core/test/stream_session_tests.cpp +438 -0
  219. pyplcopen-0.20.0/core/test/topp_executor_tests.cpp +400 -0
  220. pyplcopen-0.20.0/core/test/topp_jerk_oracle.cpp +272 -0
  221. pyplcopen-0.20.0/core/test/topp_oracle.cpp +506 -0
  222. pyplcopen-0.20.0/core/test/topp_shadow_oracle.cpp +266 -0
  223. pyplcopen-0.20.0/core/test/wrist6r_tests.cpp +226 -0
  224. pyplcopen-0.20.0/core/test/y7_group_takeover_tests.cpp +756 -0
  225. pyplcopen-0.20.0/coverage.ps1 +307 -0
  226. pyplcopen-0.20.0/doc/archive/ADJUSTMENT_PLAN.md +312 -0
  227. pyplcopen-0.20.0/doc/archive/README.md +20 -0
  228. pyplcopen-0.20.0/doc/archive/buffer-mode-blending-design.md +612 -0
  229. pyplcopen-0.20.0/doc/archive/buffer-mode-blending-plan.md +404 -0
  230. pyplcopen-0.20.0/doc/archive/design_doc.md +280 -0
  231. pyplcopen-0.20.0/doc/archive/part1-part2-completion-plan.md +242 -0
  232. pyplcopen-0.20.0/doc/archive/part4-linear-motion-plan.md +188 -0
  233. pyplcopen-0.20.0/doc/archive/r0-evidence-package.md +155 -0
  234. pyplcopen-0.20.0/doc/archive/r0-r4-work-breakdown.md +237 -0
  235. pyplcopen-0.20.0/doc/archive/r3-migration-matrix.md +21 -0
  236. pyplcopen-0.20.0/doc/archive/r4-evidence-package.md +127 -0
  237. pyplcopen-0.20.0/doc/archive/rewrite-plan.md +297 -0
  238. pyplcopen-0.20.0/doc/archive/roadmap-history.md +353 -0
  239. pyplcopen-0.20.0/doc/archive/v0.11.0-release-draft.md +52 -0
  240. pyplcopen-0.20.0/doc/compliance/CODEX-TASK-part1-fb-audit.md +172 -0
  241. pyplcopen-0.20.0/doc/compliance/branch-coverage-baseline.md +90 -0
  242. pyplcopen-0.20.0/doc/compliance/cam-curve-semantics.md +99 -0
  243. pyplcopen-0.20.0/doc/compliance/cartesian-interpolation-semantics.md +174 -0
  244. pyplcopen-0.20.0/doc/compliance/ci-gates.md +28 -0
  245. pyplcopen-0.20.0/doc/compliance/commercial-gate-evidence.md +51 -0
  246. pyplcopen-0.20.0/doc/compliance/feetech-sts-adapter-semantics.md +95 -0
  247. pyplcopen-0.20.0/doc/compliance/generated/plcopen-motion-part1-io.md +752 -0
  248. pyplcopen-0.20.0/doc/compliance/generated/plcopen-motion-part5-io.md +243 -0
  249. pyplcopen-0.20.0/doc/compliance/generated/plcopen-motion-v2-function-blocks.md +55 -0
  250. pyplcopen-0.20.0/doc/compliance/generated/st-binding-fb-pins.yml +12885 -0
  251. pyplcopen-0.20.0/doc/compliance/generated/st-binding-native-gaps.yml +5 -0
  252. pyplcopen-0.20.0/doc/compliance/group-takeover-semantics.md +64 -0
  253. pyplcopen-0.20.0/doc/compliance/iec-basic-fb-io.yml +63 -0
  254. pyplcopen-0.20.0/doc/compliance/kinematics-plugin-semantics.md +129 -0
  255. pyplcopen-0.20.0/doc/compliance/known-boundaries.md +131 -0
  256. pyplcopen-0.20.0/doc/compliance/orientation-semantics.md +94 -0
  257. pyplcopen-0.20.0/doc/compliance/part1-c4-semantics.md +88 -0
  258. pyplcopen-0.20.0/doc/compliance/part1-digital-cam-switch-semantics.md +63 -0
  259. pyplcopen-0.20.0/doc/compliance/part1-move-absolute-direction-semantics.md +91 -0
  260. pyplcopen-0.20.0/doc/compliance/part1-phasing-axis-references-semantics.md +49 -0
  261. pyplcopen-0.20.0/doc/compliance/part1-set-override-semantics.md +103 -0
  262. pyplcopen-0.20.0/doc/compliance/part4-blending-semantics.md +66 -0
  263. pyplcopen-0.20.0/doc/compliance/part4-c3-semantics.md +62 -0
  264. pyplcopen-0.20.0/doc/compliance/part4-coordinate-semantics.md +90 -0
  265. pyplcopen-0.20.0/doc/compliance/part4-coverage.md +100 -0
  266. pyplcopen-0.20.0/doc/compliance/part4-lookahead-semantics.md +97 -0
  267. pyplcopen-0.20.0/doc/compliance/part4-lookahead-v2-jerk.md +45 -0
  268. pyplcopen-0.20.0/doc/compliance/part4-management-semantics.md +56 -0
  269. pyplcopen-0.20.0/doc/compliance/part4-p4b1-semantics.md +124 -0
  270. pyplcopen-0.20.0/doc/compliance/part4-p4b2-semantics.md +149 -0
  271. pyplcopen-0.20.0/doc/compliance/part4-pathtable-semantics.md +37 -0
  272. pyplcopen-0.20.0/doc/compliance/part5-c5-semantics.md +73 -0
  273. pyplcopen-0.20.0/doc/compliance/part5-homing-semantics.md +57 -0
  274. pyplcopen-0.20.0/doc/compliance/part5-p5b-semantics.md +95 -0
  275. pyplcopen-0.20.0/doc/compliance/plcopen-beckhoff-parity-matrix.md +90 -0
  276. pyplcopen-0.20.0/doc/compliance/plcopen-conformance-audit.md +178 -0
  277. pyplcopen-0.20.0/doc/compliance/plcopen-guides-audit.md +371 -0
  278. pyplcopen-0.20.0/doc/compliance/plcopen-motion-logic-supplement-audit.md +133 -0
  279. pyplcopen-0.20.0/doc/compliance/plcopen-motion-part1-io.yml +714 -0
  280. pyplcopen-0.20.0/doc/compliance/plcopen-motion-part4-circular-matrix.md +72 -0
  281. pyplcopen-0.20.0/doc/compliance/plcopen-motion-part4-io.yml +967 -0
  282. pyplcopen-0.20.0/doc/compliance/plcopen-motion-part4-linear-matrix.md +94 -0
  283. pyplcopen-0.20.0/doc/compliance/plcopen-motion-part5-io.yml +220 -0
  284. pyplcopen-0.20.0/doc/compliance/plcopen-motion-v2-function-block-matrix.md +159 -0
  285. pyplcopen-0.20.0/doc/compliance/plcopen-motion-v2-function-blocks.yml +296 -0
  286. pyplcopen-0.20.0/doc/compliance/plcopen-opcua-audit.md +153 -0
  287. pyplcopen-0.20.0/doc/compliance/plcopen-part1-clause-matrix.md +687 -0
  288. pyplcopen-0.20.0/doc/compliance/plcopen-part3-audit.md +67 -0
  289. pyplcopen-0.20.0/doc/compliance/plcopen-part4-clause-audit.md +352 -0
  290. pyplcopen-0.20.0/doc/compliance/plcopen-part5-part6-audit.md +114 -0
  291. pyplcopen-0.20.0/doc/compliance/plcopen-safety-audit.md +198 -0
  292. pyplcopen-0.20.0/doc/compliance/plcopen-specs-manifest.md +71 -0
  293. pyplcopen-0.20.0/doc/compliance/plcopen-xml-tc6-audit.md +113 -0
  294. pyplcopen-0.20.0/doc/compliance/readback-semantics.md +73 -0
  295. pyplcopen-0.20.0/doc/compliance/runtime-thread-ownership-semantics.md +68 -0
  296. pyplcopen-0.20.0/doc/compliance/st-binding-adapters.yml +2151 -0
  297. pyplcopen-0.20.0/doc/compliance/st-binding-fb-catalog.yml +170 -0
  298. pyplcopen-0.20.0/doc/compliance/st-binding-types.yml +54 -0
  299. pyplcopen-0.20.0/doc/compliance/st-feature-set.yml +261 -0
  300. pyplcopen-0.20.0/doc/compliance/st-feature-table.md +63 -0
  301. pyplcopen-0.20.0/doc/compliance/st-l0-conformance.yaml +194 -0
  302. pyplcopen-0.20.0/doc/compliance/st-l0-semantics.md +179 -0
  303. pyplcopen-0.20.0/doc/compliance/st-l1a-conformance.yaml +66 -0
  304. pyplcopen-0.20.0/doc/compliance/st-l1a-conversions.yaml +221 -0
  305. pyplcopen-0.20.0/doc/compliance/st-l1a-semantics.md +120 -0
  306. pyplcopen-0.20.0/doc/compliance/st-l1b1-semantics.md +116 -0
  307. pyplcopen-0.20.0/doc/compliance/st-l1b2-semantics.md +71 -0
  308. pyplcopen-0.20.0/doc/compliance/st-l1b3-semantics.md +70 -0
  309. pyplcopen-0.20.0/doc/compliance/st-l2a-semantics.md +121 -0
  310. pyplcopen-0.20.0/doc/compliance/st-l2b-semantics.md +78 -0
  311. pyplcopen-0.20.0/doc/compliance/st-l2c-semantics.md +77 -0
  312. pyplcopen-0.20.0/doc/compliance/st-l3-semantics.md +74 -0
  313. pyplcopen-0.20.0/doc/compliance/st-l4-semantics.md +107 -0
  314. pyplcopen-0.20.0/doc/compliance/st-l5-semantics.md +90 -0
  315. pyplcopen-0.20.0/doc/compliance/st-l6-semantics.md +91 -0
  316. pyplcopen-0.20.0/doc/compliance/st-l7-semantics.md +71 -0
  317. pyplcopen-0.20.0/doc/compliance/sto-ss1-integration-boundary.md +145 -0
  318. pyplcopen-0.20.0/doc/compliance/trajectory-stream-semantics.md +179 -0
  319. pyplcopen-0.20.0/doc/design/README.md +20 -0
  320. pyplcopen-0.20.0/doc/design/architecture-review-2026-07.md +49 -0
  321. pyplcopen-0.20.0/doc/design/core/algorithm-contracts.md +135 -0
  322. pyplcopen-0.20.0/doc/design/core/architecture.md +273 -0
  323. pyplcopen-0.20.0/doc/design/core/floating-point-semantics.md +60 -0
  324. pyplcopen-0.20.0/doc/design/core/l0-l1-rt-otg.md +124 -0
  325. pyplcopen-0.20.0/doc/design/core/l2-l4-motion-core.md +56 -0
  326. pyplcopen-0.20.0/doc/design/core/l5-l6-semantic-layer.md +100 -0
  327. pyplcopen-0.20.0/doc/design/core/otg-oracle-design.md +82 -0
  328. pyplcopen-0.20.0/doc/design/core/priority-tracks-design.md +76 -0
  329. pyplcopen-0.20.0/doc/design/core/st-runtime-design.md +91 -0
  330. pyplcopen-0.20.0/doc/design/core/stream-fastpath-design.md +97 -0
  331. pyplcopen-0.20.0/doc/design/decisions/0000-template.md +21 -0
  332. pyplcopen-0.20.0/doc/design/decisions/0001-v0x-license-strategy.md +49 -0
  333. pyplcopen-0.20.0/doc/design/decisions/0002-core-cpp17-standard.md +29 -0
  334. pyplcopen-0.20.0/doc/design/decisions/0003-ruckig-oracle-boundary.md +29 -0
  335. pyplcopen-0.20.0/doc/design/decisions/0004-servo-adapter-interface.md +55 -0
  336. pyplcopen-0.20.0/doc/design/decisions/0005-humanoid-multi-chain-model.md +44 -0
  337. pyplcopen-0.20.0/doc/design/decisions/0006-fieldbus-process-model.md +83 -0
  338. pyplcopen-0.20.0/doc/design/decisions/0007-executor-committed-trajectory.md +60 -0
  339. pyplcopen-0.20.0/doc/migration-v0-to-v1.md +126 -0
  340. pyplcopen-0.20.0/doc/planning/README.md +40 -0
  341. pyplcopen-0.20.0/doc/planning/adoption-plan.md +55 -0
  342. pyplcopen-0.20.0/doc/planning/ai-collaboration.md +138 -0
  343. pyplcopen-0.20.0/doc/planning/axis-group-split-plan-2026-07-09.md +52 -0
  344. pyplcopen-0.20.0/doc/planning/coverage-gate-implementation-notes.md +51 -0
  345. pyplcopen-0.20.0/doc/planning/embodied-strategy.md +76 -0
  346. pyplcopen-0.20.0/doc/planning/execution-plan-2026-07-12.md +115 -0
  347. pyplcopen-0.20.0/doc/planning/full-project-review-2026-07-09.md +159 -0
  348. pyplcopen-0.20.0/doc/planning/hardware-price-watch.md +46 -0
  349. pyplcopen-0.20.0/doc/planning/humanoid-h1-plan.md +91 -0
  350. pyplcopen-0.20.0/doc/planning/humanoid-platform-survey.md +75 -0
  351. pyplcopen-0.20.0/doc/planning/l-series-implementation-notes.md +387 -0
  352. pyplcopen-0.20.0/doc/planning/l-series-work-breakdown.md +126 -0
  353. pyplcopen-0.20.0/doc/planning/long-term-plan.md +972 -0
  354. pyplcopen-0.20.0/doc/planning/master-plan.md +165 -0
  355. pyplcopen-0.20.0/doc/planning/part1-gear-phasing-native-implementation-notes.md +36 -0
  356. pyplcopen-0.20.0/doc/planning/part4-native-gap-implementation-notes.md +15 -0
  357. pyplcopen-0.20.0/doc/planning/phase-b-software-work-breakdown.md +162 -0
  358. pyplcopen-0.20.0/doc/planning/plcopen-beckhoff-parity-closure.md +94 -0
  359. pyplcopen-0.20.0/doc/planning/plcopen-c2-implementation-notes.md +50 -0
  360. pyplcopen-0.20.0/doc/planning/plcopen-c3-implementation-notes.md +47 -0
  361. pyplcopen-0.20.0/doc/planning/plcopen-c3-implementation-plan.md +135 -0
  362. pyplcopen-0.20.0/doc/planning/plcopen-c4-implementation-notes.md +56 -0
  363. pyplcopen-0.20.0/doc/planning/plcopen-c4-implementation-plan.md +122 -0
  364. pyplcopen-0.20.0/doc/planning/plcopen-c5-implementation-notes.md +39 -0
  365. pyplcopen-0.20.0/doc/planning/plcopen-conformance-plan.md +203 -0
  366. pyplcopen-0.20.0/doc/planning/r1-rt-report-template.md +50 -0
  367. pyplcopen-0.20.0/doc/planning/robot-integration.md +152 -0
  368. pyplcopen-0.20.0/doc/planning/signal-channel-plan.md +36 -0
  369. pyplcopen-0.20.0/doc/planning/software-excellence-plan.md +244 -0
  370. pyplcopen-0.20.0/doc/planning/v0.20.0-release-draft.md +84 -0
  371. pyplcopen-0.20.0/doc/planning/v1.0.0-alpha-release-draft.md +92 -0
  372. pyplcopen-0.20.0/doc/reference/plcopen_motion_control_overview-/344/270/255/346/226/207.pdf +0 -0
  373. pyplcopen-0.20.0/doc/reference/plcopen_motion_control_overview.pdf +0 -0
  374. pyplcopen-0.20.0/doc/reference/plcopen_motion_control_part_1_version_2.0-/344/270/255/346/226/207.pdf +0 -0
  375. pyplcopen-0.20.0/doc/reference/plcopen_motion_control_part_1_version_2.0.pdf +0 -0
  376. pyplcopen-0.20.0/doc/vision/README.md +110 -0
  377. pyplcopen-0.20.0/doc/vision/archived-milestones.md +214 -0
  378. pyplcopen-0.20.0/doc/vision/archived-plan.md +390 -0
  379. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/architecture-decisions.md +394 -0
  380. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/current-status-summary.md +265 -0
  381. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-communication.md +819 -0
  382. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-function-block-engine.md +0 -0
  383. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-io-system.md +852 -0
  384. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-memory-manager.md +0 -0
  385. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-motion-algorithms.md +313 -0
  386. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-realtime-scheduler.md +459 -0
  387. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-security.md +343 -0
  388. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-st-compiler.md +226 -0
  389. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design.md +407 -0
  390. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/glossary.md +298 -0
  391. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/improvement-summary.md +362 -0
  392. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/p0-action-plan.md +280 -0
  393. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/requirements.md +270 -0
  394. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/tasks.md +295 -0
  395. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/technical-debt-analysis.md +299 -0
  396. pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/traceability-matrix.md +132 -0
  397. pyplcopen-0.20.0/docs/getting-started/algorithms.md +144 -0
  398. pyplcopen-0.20.0/docs/getting-started/cpp.md +202 -0
  399. pyplcopen-0.20.0/docs/getting-started/python.md +172 -0
  400. pyplcopen-0.20.0/docs/guides/realtime-integration.md +53 -0
  401. pyplcopen-0.20.0/docs/guides/tuning.md +48 -0
  402. pyplcopen-0.20.0/docs/guides/twinCAT-codesys-migration.md +64 -0
  403. pyplcopen-0.20.0/docs/index.md +147 -0
  404. pyplcopen-0.20.0/docs/operations.md +41 -0
  405. pyplcopen-0.20.0/docs/references/fb-reference.md +79 -0
  406. pyplcopen-0.20.0/docs/releases/v0.20.0.md +129 -0
  407. pyplcopen-0.20.0/mkdocs.yml +53 -0
  408. pyplcopen-0.20.0/pyproject.toml +54 -0
  409. pyplcopen-0.20.0/python/pyplcopen.cpp +580 -0
  410. pyplcopen-0.20.0/src/CMakeLists.txt +168 -0
  411. pyplcopen-0.20.0/src/CMakeSettings.json +27 -0
  412. pyplcopen-0.20.0/src/demo/axes_group_lifecycle.cpp +145 -0
  413. pyplcopen-0.20.0/src/demo/axis_cam.cpp +98 -0
  414. pyplcopen-0.20.0/src/demo/axis_gear.cpp +97 -0
  415. pyplcopen-0.20.0/src/demo/axis_homing.cpp +136 -0
  416. pyplcopen-0.20.0/src/demo/axis_move.cpp +131 -0
  417. pyplcopen-0.20.0/src/demo/axis_move_oscilloscope.cpp +292 -0
  418. pyplcopen-0.20.0/src/demo/axis_sync.cpp +95 -0
  419. pyplcopen-0.20.0/src/demo/basic_fb_cycle.cpp +38 -0
  420. pyplcopen-0.20.0/src/demo/follower_demo_support.h +114 -0
  421. pyplcopen-0.20.0/src/demo/golden_replay_recorder.cpp +133 -0
  422. pyplcopen-0.20.0/src/demo/group_linear_move.cpp +82 -0
  423. pyplcopen-0.20.0/src/fb/FbBasic.cpp +306 -0
  424. pyplcopen-0.20.0/src/fb/FbBasic.h +266 -0
  425. pyplcopen-0.20.0/src/fb/FbMultiAxis.cpp +464 -0
  426. pyplcopen-0.20.0/src/fb/FbMultiAxis.h +342 -0
  427. pyplcopen-0.20.0/src/fb/FbPLCOpenBase.cpp +279 -0
  428. pyplcopen-0.20.0/src/fb/FbPLCOpenBase.h +268 -0
  429. pyplcopen-0.20.0/src/fb/FbSingleAxis.cpp +2103 -0
  430. pyplcopen-0.20.0/src/fb/FbSingleAxis.h +800 -0
  431. pyplcopen-0.20.0/src/fb/FunctionBlock.cpp +31 -0
  432. pyplcopen-0.20.0/src/fb/FunctionBlock.h +65 -0
  433. pyplcopen-0.20.0/src/fb/PLCTypes.h +122 -0
  434. pyplcopen-0.20.0/src/misc/Event.h +50 -0
  435. pyplcopen-0.20.0/src/misc/ExeclQueue.cpp +257 -0
  436. pyplcopen-0.20.0/src/misc/ExeclQueue.h +96 -0
  437. pyplcopen-0.20.0/src/misc/LinkList.cpp +90 -0
  438. pyplcopen-0.20.0/src/misc/LinkList.h +50 -0
  439. pyplcopen-0.20.0/src/misc/Queue.h +185 -0
  440. pyplcopen-0.20.0/src/motion/AxesGroup.cpp +778 -0
  441. pyplcopen-0.20.0/src/motion/AxesGroup.h +78 -0
  442. pyplcopen-0.20.0/src/motion/CamTable.cpp +85 -0
  443. pyplcopen-0.20.0/src/motion/CamTable.h +27 -0
  444. pyplcopen-0.20.0/src/motion/Global.h +458 -0
  445. pyplcopen-0.20.0/src/motion/Scheduler.cpp +187 -0
  446. pyplcopen-0.20.0/src/motion/Scheduler.h +106 -0
  447. pyplcopen-0.20.0/src/motion/Servo.cpp +145 -0
  448. pyplcopen-0.20.0/src/motion/Servo.h +89 -0
  449. pyplcopen-0.20.0/src/motion/axis/Axis.cpp +69 -0
  450. pyplcopen-0.20.0/src/motion/axis/Axis.h +54 -0
  451. pyplcopen-0.20.0/src/motion/axis/AxisBase.cpp +778 -0
  452. pyplcopen-0.20.0/src/motion/axis/AxisBase.h +119 -0
  453. pyplcopen-0.20.0/src/motion/axis/AxisHoming.cpp +538 -0
  454. pyplcopen-0.20.0/src/motion/axis/AxisHoming.h +59 -0
  455. pyplcopen-0.20.0/src/motion/axis/AxisMotion.cpp +48 -0
  456. pyplcopen-0.20.0/src/motion/axis/AxisMotion.h +49 -0
  457. pyplcopen-0.20.0/src/motion/axis/AxisMotionBase.cpp +179 -0
  458. pyplcopen-0.20.0/src/motion/axis/AxisMotionBase.h +99 -0
  459. pyplcopen-0.20.0/src/motion/axis/AxisMove.cpp +882 -0
  460. pyplcopen-0.20.0/src/motion/axis/AxisMove.h +154 -0
  461. pyplcopen-0.20.0/src/motion/axis/AxisStatus.cpp +171 -0
  462. pyplcopen-0.20.0/src/motion/axis/AxisStatus.h +54 -0
  463. pyplcopen-0.20.0/src/motion/axis/AxisSync.cpp +895 -0
  464. pyplcopen-0.20.0/src/motion/axis/AxisSync.h +97 -0
  465. pyplcopen-0.20.0/src/motion/interpolation/GroupLinearPlanner.cpp +105 -0
  466. pyplcopen-0.20.0/src/motion/interpolation/GroupLinearPlanner.h +50 -0
  467. pyplcopen-0.20.0/src/motion/interpolation/MathUtils.h +81 -0
  468. pyplcopen-0.20.0/src/motion/interpolation/ProfilePlanner.cpp +917 -0
  469. pyplcopen-0.20.0/src/motion/interpolation/ProfilePlanner.h +160 -0
  470. pyplcopen-0.20.0/src/motion/interpolation/ProfilesPlanner.cpp +57 -0
  471. pyplcopen-0.20.0/src/motion/interpolation/ProfilesPlanner.h +71 -0
  472. pyplcopen-0.20.0/src/plcopen.cmake +26 -0
  473. pyplcopen-0.20.0/src/python/pyplcopen.cpp +319 -0
  474. pyplcopen-0.20.0/src/test/test_axes_group.cpp +491 -0
  475. pyplcopen-0.20.0/src/test/test_axis_status.cpp +237 -0
  476. pyplcopen-0.20.0/src/test/test_basic.cpp +736 -0
  477. pyplcopen-0.20.0/src/test/test_fb_basic.cpp +424 -0
  478. pyplcopen-0.20.0/src/test/test_fb_multi_axis.cpp +3261 -0
  479. pyplcopen-0.20.0/src/test/test_fb_single_axis.cpp +4775 -0
  480. pyplcopen-0.20.0/src/test/test_group_linear_planner.cpp +125 -0
  481. pyplcopen-0.20.0/src/test/test_main.cpp +6 -0
  482. pyplcopen-0.20.0/src/test/test_profile_planner.cpp +153 -0
  483. pyplcopen-0.20.0/test_package/fetchcontent/CMakeLists.txt +22 -0
  484. pyplcopen-0.20.0/test_package/fetchcontent/main.cpp +47 -0
  485. pyplcopen-0.20.0/test_package/find_package/CMakeLists.txt +11 -0
  486. pyplcopen-0.20.0/test_package/find_package/main.cpp +47 -0
  487. pyplcopen-0.20.0/testdata/replay/README.md +73 -0
  488. pyplcopen-0.20.0/testdata/replay/core-group-blend-v2.jsonl +228 -0
  489. pyplcopen-0.20.0/testdata/replay/core-group-blend.jsonl +232 -0
  490. pyplcopen-0.20.0/testdata/replay/core-group-cartesian-window.jsonl +384 -0
  491. pyplcopen-0.20.0/testdata/replay/core-group-cartesian.jsonl +297 -0
  492. pyplcopen-0.20.0/testdata/replay/core-group-circular.jsonl +60 -0
  493. pyplcopen-0.20.0/testdata/replay/core-group-linear-v2.jsonl +44 -0
  494. pyplcopen-0.20.0/testdata/replay/core-group-linear.jsonl +32 -0
  495. pyplcopen-0.20.0/testdata/replay/core-group-pcs.jsonl +166 -0
  496. pyplcopen-0.20.0/testdata/replay/core-group-window-arc.jsonl +178 -0
  497. pyplcopen-0.20.0/testdata/replay/core-group-window.jsonl +186 -0
  498. pyplcopen-0.20.0/testdata/replay/core-single-axis-move-v2.jsonl +67 -0
  499. pyplcopen-0.20.0/testdata/replay/core-single-axis-move.jsonl +240 -0
  500. pyplcopen-0.20.0/testdata/replay/core-stream-session.jsonl +243 -0
  501. pyplcopen-0.20.0/testdata/replay/core-velocity-stop-v2.jsonl +21 -0
  502. pyplcopen-0.20.0/testdata/replay/core-velocity-stop.jsonl +21 -0
  503. pyplcopen-0.20.0/testdata/replay/format-smoke-single-axis.jsonl +3 -0
  504. pyplcopen-0.20.0/testdata/replay/format-smoke-stop.jsonl +3 -0
  505. pyplcopen-0.20.0/testdata/replay/format-smoke-two-axis.jsonl +4 -0
  506. pyplcopen-0.20.0/testdata/replay/manifest.json +174 -0
  507. pyplcopen-0.20.0/tools/fetch-plcopen-specs.sh +105 -0
  508. pyplcopen-0.20.0/tools/generate_st_binding_pin_catalog.py +2791 -0
  509. pyplcopen-0.20.0/tools/generate_st_binding_types.py +592 -0
  510. pyplcopen-0.20.0/tools/plcopen_trace.py +88 -0
  511. pyplcopen-0.20.0/vcpkg.json +18 -0
@@ -0,0 +1,22 @@
1
+ Checks: >
2
+ -*,
3
+ bugprone-*,
4
+ clang-analyzer-*,
5
+ performance-*,
6
+ readability-*,
7
+ -bugprone-easily-swappable-parameters,
8
+ -performance-enum-size,
9
+ -readability-magic-numbers,
10
+ -readability-identifier-length,
11
+ -readability-function-cognitive-complexity,
12
+ -readability-braces-around-statements
13
+
14
+ WarningsAsErrors: >
15
+ bugprone-*,
16
+ clang-analyzer-*,
17
+ performance-*,
18
+ -bugprone-easily-swappable-parameters,
19
+ -performance-enum-size
20
+
21
+ HeaderFilterRegex: 'core/.*\.h$'
22
+ FormatStyle: none
@@ -0,0 +1,63 @@
1
+ name: AI executable task
2
+ description: A bounded task with acceptance criteria and verification evidence.
3
+ title: "[Task] "
4
+ labels:
5
+ - task
6
+ body:
7
+ - type: textarea
8
+ id: goal
9
+ attributes:
10
+ label: Goal
11
+ description: What should be true when this task is complete?
12
+ placeholder: "Example: Add a regression test for KB-001 and make it pass."
13
+ validations:
14
+ required: true
15
+
16
+ - type: dropdown
17
+ id: risk
18
+ attributes:
19
+ label: Risk level
20
+ description: Use the project T0-T3 change policy from CLAUDE.md.
21
+ options:
22
+ - T0 - docs, comments, demos, tests, formatting, CI scripts
23
+ - T1 - non-RT implementation, tooling, pyplcopen, build config
24
+ - T2 - RT path, OTG/planner algorithms, state semantics, public API
25
+ - T3 - license, provenance, release tags, external safety claims
26
+ validations:
27
+ required: true
28
+
29
+ - type: input
30
+ id: scope
31
+ attributes:
32
+ label: Affected layers or KB ids
33
+ description: Name the core layer(s), compliance rows, or known-boundary ids.
34
+ placeholder: "Example: L0 rt, KB-001, Part 1 MC_MoveAbsolute"
35
+ validations:
36
+ required: true
37
+
38
+ - type: textarea
39
+ id: done
40
+ attributes:
41
+ label: Definition of done
42
+ description: List the observable acceptance criteria.
43
+ placeholder: "- Failing test added first\n- Implementation passes the test\n- Docs updated if public behavior changes"
44
+ validations:
45
+ required: true
46
+
47
+ - type: textarea
48
+ id: verification
49
+ attributes:
50
+ label: Verification commands
51
+ description: Commands that must pass before the task is done.
52
+ placeholder: ".\\build.ps1 -Test"
53
+ validations:
54
+ required: true
55
+
56
+ - type: textarea
57
+ id: docs
58
+ attributes:
59
+ label: Documentation impact
60
+ description: State which docs change, or why no docs change is needed.
61
+ placeholder: "Example: Update doc/compliance/...; no docs change for test-only task."
62
+ validations:
63
+ required: true
@@ -0,0 +1,17 @@
1
+ # Summary
2
+
3
+ -
4
+
5
+ # Scope
6
+
7
+ - Affected layers / KB ids:
8
+ - Semantic matrix: approved / not touched
9
+ - Declared change (replay baseline re-recorded): yes / no
10
+
11
+ # Evidence
12
+
13
+ - Gates (build / tests / replay / RT-safety / benchmarks):
14
+
15
+ # AI statement
16
+
17
+ - AI-assisted: yes / no
@@ -0,0 +1,173 @@
1
+ name: Core Nightly
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule:
6
+ - cron: '23 2 * * *'
7
+
8
+ jobs:
9
+ fuzz-smoke-suite:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v7
15
+
16
+ - name: Configure CMake
17
+ run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
18
+
19
+ - name: Build fuzz smoke suite
20
+ run: >
21
+ cmake --build build --parallel --target
22
+ plcopen_core_otg_fuzz
23
+ plcopen_core_st_fuzz
24
+ plcopen_core_feetech_fuzz
25
+ plcopen_core_part4_p4b1_fuzz
26
+ plcopen_core_part4_p4b2_fuzz
27
+ plcopen_core_part4_p4b3_fuzz
28
+ plcopen_core_part4_c3_fuzz
29
+
30
+ - name: Run fuzz smoke suite
31
+ run: ctest --test-dir build --output-on-failure -L fuzz
32
+
33
+ deterministic-otg-fuzz:
34
+ runs-on: ubuntu-latest
35
+
36
+ steps:
37
+ - name: Checkout
38
+ uses: actions/checkout@v7
39
+
40
+ - name: Configure CMake
41
+ run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
42
+
43
+ - name: Build deterministic OTG fuzz
44
+ run: cmake --build build --target plcopen_core_otg_fuzz --parallel
45
+
46
+ - name: Run deterministic OTG fuzz
47
+ run: ./build/core/plcopen_core_otg_fuzz --iterations 1000000
48
+
49
+ a2-allocation-soak:
50
+ runs-on: ubuntu-latest
51
+
52
+ steps:
53
+ - name: Checkout
54
+ uses: actions/checkout@v7
55
+
56
+ - name: Configure CMake
57
+ run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
58
+
59
+ - name: Build allocation guard
60
+ run: cmake --build build --target plcopen_core_a2_alloc_guard --parallel
61
+
62
+ - name: Run allocation-guard soak (A2)
63
+ run: ./build/core/plcopen_core_a2_alloc_guard --cycles 50000000
64
+
65
+ time-optimal-otg-fuzz:
66
+ runs-on: ubuntu-latest
67
+
68
+ steps:
69
+ - name: Checkout
70
+ uses: actions/checkout@v7
71
+
72
+ - name: Configure CMake
73
+ run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
74
+
75
+ - name: Build time-optimal OTG fuzz
76
+ run: cmake --build build --target plcopen_core_otg_time_optimal_tests --parallel
77
+
78
+ - name: Run time-optimal OTG fuzz
79
+ run: ./build/core/plcopen_core_otg_time_optimal_tests --iterations 1000000
80
+
81
+ executor-tsan:
82
+ runs-on: ubuntu-latest
83
+
84
+ steps:
85
+ - name: Checkout
86
+ uses: actions/checkout@v7
87
+
88
+ - name: Configure CMake (TSan)
89
+ run: >
90
+ cmake -S . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo
91
+ -DCMAKE_CXX_FLAGS="-fsanitize=thread -g"
92
+ -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=thread"
93
+
94
+ - name: Build dual-domain executor demo
95
+ run: cmake --build build --target plcopen_core_rt_executor_demo --parallel
96
+
97
+ - name: Build ST L3 process-image concurrency tests
98
+ run: cmake --build build --target plcopen_core_st_l3_tests --parallel
99
+
100
+ - name: Build ST L5 task and motion isolation tests
101
+ run: cmake --build build --target plcopen_core_st_l5_tests --parallel
102
+
103
+ # setarch -R: TSan is incompatible with the high ASLR entropy of
104
+ # ubuntu-24.04 kernels (unexpected memory mapping otherwise).
105
+ - name: Run executor under ThreadSanitizer (ADR-0007)
106
+ run: >
107
+ setarch $(uname -m) -R
108
+ ./build/core/plcopen_core_rt_executor_demo
109
+ --cycles 20000 --period-ns 250000 --trace /tmp/tsan_trace.bin
110
+
111
+ - name: Run ST L3 process image under ThreadSanitizer
112
+ run: >
113
+ setarch $(uname -m) -R
114
+ ./build/core/plcopen_core_st_l3_tests
115
+
116
+ - name: Run ST L5 task and motion isolation under ThreadSanitizer
117
+ run: >
118
+ setarch $(uname -m) -R
119
+ ./build/core/plcopen_core_st_l5_tests
120
+
121
+ st-frontend-fuzz-sanitized:
122
+ runs-on: ubuntu-latest
123
+
124
+ steps:
125
+ - name: Checkout
126
+ uses: actions/checkout@v7
127
+
128
+ - name: Configure CMake (ASan/UBSan)
129
+ run: >
130
+ cmake -S . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo
131
+ -DCMAKE_CXX_FLAGS="-fsanitize=address,undefined
132
+ -fno-sanitize-recover=all"
133
+ -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address,undefined"
134
+
135
+ - name: Build ST fuzz
136
+ run: cmake --build build --target plcopen_core_st_fuzz --parallel
137
+
138
+ - name: Run ST front-end fuzz (metric 5.2)
139
+ run: ./build/core/plcopen_core_st_fuzz --iterations 100000
140
+
141
+ - name: Run ST multi-POU fuzz (L2b-A07)
142
+ run: ./build/core/plcopen_core_st_fuzz --iterations 100000 --l2b
143
+
144
+ - name: Run ST configuration graph fuzz (L5-A08)
145
+ run: ./build/core/plcopen_core_st_fuzz --iterations 100000 --l5
146
+
147
+ - name: Run ST textual SFC fuzz (L6-A08)
148
+ run: ./build/core/plcopen_core_st_fuzz --iterations 100000 --l6
149
+
150
+ - name: Run ST debugger state-machine fuzz (L7-A08)
151
+ run: ./build/core/plcopen_core_st_fuzz --iterations 100000 --l7
152
+
153
+ st-l7-debug-tsan:
154
+ runs-on: ubuntu-latest
155
+
156
+ steps:
157
+ - name: Checkout
158
+ uses: actions/checkout@v7
159
+
160
+ - name: Configure CMake (TSan)
161
+ run: >
162
+ cmake -S . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo
163
+ -DCMAKE_CXX_FLAGS="-fsanitize=thread -g"
164
+ -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=thread"
165
+
166
+ - name: Build ST L7 debugger concurrency tests
167
+ run: cmake --build build --target plcopen_core_st_l7_tests --parallel
168
+
169
+ # setarch -R avoids the high-ASLR mapping conflict on ubuntu-24.04.
170
+ - name: Run ST L7 debugger under ThreadSanitizer
171
+ run: >
172
+ setarch $(uname -m) -R
173
+ ./build/core/plcopen_core_st_l7_tests
@@ -0,0 +1,29 @@
1
+ name: Coverage Gate
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule:
6
+ - cron: '47 3 * * 1'
7
+
8
+ jobs:
9
+ coverage:
10
+ runs-on: ubuntu-latest
11
+ timeout-minutes: 20
12
+
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v7
16
+
17
+ - name: Install gcovr
18
+ run: python -m pip install gcovr==8.6
19
+
20
+ - name: Run coverage gate (E4)
21
+ run: cmake -P cmake/coverage_gate.cmake
22
+
23
+ - name: Upload coverage summaries
24
+ if: always()
25
+ uses: actions/upload-artifact@v7
26
+ with:
27
+ name: linux-coverage-summaries
28
+ path: out/coverage-linux
29
+ retention-days: 30
@@ -0,0 +1,30 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - 'docs/**'
8
+ - 'mkdocs.yml'
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: write
13
+
14
+ jobs:
15
+ deploy:
16
+ runs-on: ubuntu-latest
17
+ timeout-minutes: 10
18
+
19
+ steps:
20
+ - uses: actions/checkout@v7
21
+
22
+ - uses: actions/setup-python@v6
23
+ with:
24
+ python-version: '3.x'
25
+
26
+ - name: Install mkdocs
27
+ run: pip install mkdocs mkdocs-material
28
+
29
+ - name: Deploy to GitHub Pages
30
+ run: mkdocs gh-deploy --force
@@ -0,0 +1,148 @@
1
+ name: Linux CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ build-test:
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ compiler: [gcc, clang]
17
+ include:
18
+ - compiler: gcc
19
+ cc: gcc
20
+ cxx: g++
21
+ - compiler: clang
22
+ cc: clang
23
+ cxx: clang++
24
+
25
+ steps:
26
+ - name: Checkout
27
+ uses: actions/checkout@v7
28
+
29
+ - name: Run RT-safety static scan
30
+ run: cmake -P cmake/rt_safety_scan.cmake
31
+
32
+ - name: Verify generated compliance matrix
33
+ run: |
34
+ cmake -P cmake/generate_part1_part2_matrix.cmake
35
+ cmake -P cmake/generate_part1_io_matrix.cmake
36
+ cmake -P cmake/generate_part5_io_matrix.cmake
37
+
38
+ - name: Verify replay fixtures
39
+ run: cmake -P cmake/verify_replay_fixtures.cmake
40
+
41
+ - name: Set up Python
42
+ if: matrix.compiler == 'gcc'
43
+ uses: actions/setup-python@v6
44
+ with:
45
+ python-version: '3.12'
46
+
47
+ - name: Configure CMake
48
+ run: >
49
+ cmake -S . -B build
50
+ -DCMAKE_BUILD_TYPE=Release
51
+ -DCMAKE_C_COMPILER=${{ matrix.cc }}
52
+ -DCMAKE_CXX_COMPILER=${{ matrix.cxx }}
53
+ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
54
+
55
+ - name: Build
56
+ run: cmake --build build --parallel
57
+
58
+ - name: Test
59
+ run: ctest --test-dir build --output-on-failure -LE fuzz
60
+
61
+ - name: Print core benchmark baseline
62
+ run: ctest --test-dir build --output-on-failure -R plcopen_core_benchmark -V
63
+
64
+ - name: clang-tidy gate (E2)
65
+ if: matrix.compiler == 'clang'
66
+ run: cmake -P cmake/clang_tidy_gate.cmake
67
+
68
+ - name: Core cross-compile smoke (legacy)
69
+ if: matrix.compiler == 'gcc'
70
+ run: cmake -P cmake/core_cross_compile_smoke.cmake
71
+
72
+ - name: Verify installed find_package consumer
73
+ if: matrix.compiler == 'gcc'
74
+ run: |
75
+ install_prefix="$PWD/build/ci-install"
76
+ cmake --install build --prefix "$install_prefix"
77
+ cmake -S test_package/find_package -B build/ci-find -DCMAKE_PREFIX_PATH="$install_prefix"
78
+ cmake --build build/ci-find --parallel
79
+ ./build/ci-find/plcopen_find_package_smoke
80
+
81
+ - name: Verify FetchContent consumer
82
+ if: matrix.compiler == 'gcc'
83
+ run: |
84
+ cmake -S test_package/fetchcontent -B build/ci-fetch -DPLCOPEN_SOURCE_DIR="$PWD"
85
+ cmake --build build/ci-fetch --parallel
86
+ consumer="$(find build/ci-fetch -name 'plcopen_fetchcontent_smoke' -type f -print -quit)"
87
+ test -n "$consumer"
88
+ "$consumer"
89
+
90
+ - name: Build and test Python bindings
91
+ if: matrix.compiler == 'gcc'
92
+ run: |
93
+ cmake -S . -B build-python \
94
+ -DCMAKE_BUILD_TYPE=Release \
95
+ -DCMAKE_CXX_COMPILER=${{ matrix.cxx }} \
96
+ -DPLCOPEN_BUILD_DEMOS=OFF \
97
+ -DPLCOPEN_BUILD_TESTS=OFF \
98
+ -DPLCOPEN_BUILD_PYTHON_BINDINGS=ON
99
+ cmake --build build-python --parallel
100
+ ctest --test-dir build-python -R pyplcopen_smoke --output-on-failure
101
+
102
+ - name: Install Doxygen
103
+ if: matrix.compiler == 'gcc'
104
+ run: |
105
+ sudo apt-get update
106
+ sudo apt-get install -y doxygen graphviz
107
+ dot -V
108
+
109
+ - name: Generate API documentation
110
+ if: matrix.compiler == 'gcc'
111
+ run: |
112
+ cmake -S . -B build-docs \
113
+ -DCMAKE_BUILD_TYPE=Release \
114
+ -DCMAKE_CXX_COMPILER=${{ matrix.cxx }} \
115
+ -DBUILD_TESTING=OFF \
116
+ -DPLCOPEN_BUILD_DEMOS=OFF \
117
+ -DPLCOPEN_BUILD_TESTS=OFF \
118
+ -DPLCOPEN_BUILD_DOCS=ON
119
+ cmake --build build-docs --target docs
120
+ test -s build-docs/docs/api/html/index.html
121
+ find build-docs/docs/api/html -name '*.png' -type f -print -quit | grep -q .
122
+ find build-docs/docs/api/html -name '*.map' -type f -print -quit | grep -q .
123
+
124
+ arm64-cross:
125
+ runs-on: ubuntu-latest
126
+ steps:
127
+ - name: Checkout
128
+ uses: actions/checkout@v7
129
+
130
+ - name: Install ARM64 toolchain and QEMU
131
+ run: |
132
+ sudo apt-get update
133
+ sudo apt-get install -y g++-aarch64-linux-gnu qemu-user-static
134
+
135
+ - name: Configure (ARM64 cross-compile)
136
+ run: >
137
+ cmake -S . -B build-arm64
138
+ -DCMAKE_BUILD_TYPE=Release
139
+ -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64-linux-gnu.cmake
140
+ -DPLCOPEN_BUILD_DEMOS=OFF
141
+
142
+ - name: Build
143
+ run: cmake --build build-arm64 --parallel
144
+
145
+ - name: Test (via QEMU user-mode)
146
+ run: >
147
+ ctest --test-dir build-arm64 --output-on-failure
148
+ -E "(benchmark|jitter_harness)" -LE fuzz
@@ -0,0 +1,18 @@
1
+ name: Mutation Score Gate
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule:
6
+ - cron: '17 3 * * 1'
7
+
8
+ jobs:
9
+ mutation-score:
10
+ runs-on: ubuntu-latest
11
+ timeout-minutes: 30
12
+
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v7
16
+
17
+ - name: Run mutation score gate (E3)
18
+ run: cmake -P cmake/mutation_score_gate.cmake
@@ -0,0 +1,72 @@
1
+ name: Wheels
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ tags: ['v*']
7
+
8
+ jobs:
9
+ build_wheels:
10
+ name: Wheels · ${{ matrix.os }}
11
+ runs-on: ${{ matrix.os }}
12
+ timeout-minutes: 30
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ os: [ubuntu-latest, windows-latest, macos-latest]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v7
20
+
21
+ - uses: pypa/cibuildwheel@v4.1.0
22
+ env:
23
+ CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-*"
24
+ CIBW_SKIP: "*-musllinux_*"
25
+ CIBW_TEST_COMMAND: "python {project}/ci/smoke_test.py"
26
+ CIBW_ARCHS_MACOS: "x86_64 arm64"
27
+
28
+ - uses: actions/upload-artifact@v7
29
+ with:
30
+ name: wheels-${{ matrix.os }}
31
+ path: ./wheelhouse/*.whl
32
+
33
+ build_sdist:
34
+ name: Source distribution
35
+ runs-on: ubuntu-latest
36
+ timeout-minutes: 10
37
+
38
+ steps:
39
+ - uses: actions/checkout@v7
40
+
41
+ - name: Build sdist
42
+ run: pipx run build --sdist
43
+
44
+ - uses: actions/upload-artifact@v7
45
+ with:
46
+ name: sdist
47
+ path: dist/*.tar.gz
48
+
49
+ # PyPI 发布(Trusted Publishing / OIDC,无 token secret)。
50
+ # 首次发布的人专属前置(未完成前本作业必然失败):维护者在 PyPI 注册
51
+ # trusted publisher(project: pyplcopen, owner: lusipad, repo: plcopen,
52
+ # workflow: wheels.yml, environment: pypi)并在仓库建 pypi environment。
53
+ # 仅 tag 推送触发;维护者明确授权版本与目标提交后,AI 可代为推送 tag。
54
+ publish_pypi:
55
+ name: Publish to PyPI
56
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
57
+ needs: [build_wheels, build_sdist]
58
+ runs-on: ubuntu-latest
59
+ timeout-minutes: 15
60
+ environment: pypi
61
+ permissions:
62
+ id-token: write
63
+
64
+ steps:
65
+ - uses: actions/download-artifact@v8
66
+ with:
67
+ path: dist
68
+ merge-multiple: true
69
+
70
+ - uses: pypa/gh-action-pypi-publish@release/v1
71
+ with:
72
+ packages-dir: dist
@@ -0,0 +1,74 @@
1
+ name: Windows CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ build-test:
11
+ runs-on: windows-latest
12
+
13
+ defaults:
14
+ run:
15
+ shell: pwsh
16
+
17
+ steps:
18
+ - name: Checkout
19
+ uses: actions/checkout@v7
20
+
21
+ - name: Run RT-safety static scan
22
+ run: cmake -P cmake/rt_safety_scan.cmake
23
+
24
+ - name: Verify generated compliance matrix
25
+ run: |
26
+ cmake -P cmake/generate_part1_part2_matrix.cmake
27
+ cmake -P cmake/generate_part1_io_matrix.cmake
28
+ cmake -P cmake/generate_part5_io_matrix.cmake
29
+
30
+ - name: Verify replay fixtures
31
+ run: cmake -P cmake/verify_replay_fixtures.cmake
32
+
33
+ - name: Clean build and run regular CTest suite
34
+ run: .\build.ps1 -Clean -Test -ExcludeFuzz
35
+
36
+ - name: Collect coverage
37
+ run: .\coverage.ps1 -ExcludeFuzz
38
+
39
+ - name: Upload coverage report
40
+ uses: actions/upload-artifact@v7
41
+ with:
42
+ name: windows-coverage
43
+ path: out/coverage
44
+ retention-days: 14
45
+
46
+ - name: Verify installed find_package consumer
47
+ run: |
48
+ $InstallPrefix = Join-Path $env:GITHUB_WORKSPACE "build/ci-install"
49
+ cmake --install build --config Release --prefix $InstallPrefix
50
+ cmake -S test_package/find_package -B build/ci-find "-DCMAKE_PREFIX_PATH=$InstallPrefix"
51
+ cmake --build build/ci-find --config Release --parallel -- /p:TrackFileAccess=false /nodeReuse:false
52
+
53
+ $Consumer = Get-ChildItem build/ci-find -Recurse -File -Filter plcopen_find_package_smoke.exe | Select-Object -First 1
54
+ if (-not $Consumer) {
55
+ throw "find_package consumer executable was not produced"
56
+ }
57
+ & $Consumer.FullName
58
+ if ($LASTEXITCODE -ne 0) {
59
+ throw "find_package consumer failed"
60
+ }
61
+
62
+ - name: Verify FetchContent consumer with Windows path
63
+ run: |
64
+ cmake -S test_package/fetchcontent -B build/ci-fetch "-DPLCOPEN_SOURCE_DIR=$env:GITHUB_WORKSPACE"
65
+ cmake --build build/ci-fetch --config Release --parallel -- /p:TrackFileAccess=false /nodeReuse:false
66
+
67
+ $Consumer = Get-ChildItem build/ci-fetch -Recurse -File -Filter plcopen_fetchcontent_smoke.exe | Select-Object -First 1
68
+ if (-not $Consumer) {
69
+ throw "FetchContent consumer artifacts were not produced"
70
+ }
71
+ & $Consumer.FullName
72
+ if ($LASTEXITCODE -ne 0) {
73
+ throw "FetchContent consumer failed"
74
+ }
@@ -0,0 +1,51 @@
1
+ # Prerequisites
2
+ *.d
3
+
4
+ # Compiled Object files
5
+ *.slo
6
+ *.lo
7
+ *.o
8
+ *.obj
9
+
10
+ # Precompiled Headers
11
+ *.gch
12
+ *.pch
13
+
14
+ # Compiled Dynamic libraries
15
+ *.so
16
+ *.dylib
17
+ *.dll
18
+
19
+ # Fortran module files
20
+ *.mod
21
+ *.smod
22
+
23
+ # Compiled Static libraries
24
+ *.lai
25
+ *.la
26
+ *.a
27
+ *.lib
28
+
29
+ # Executables
30
+ *.exe
31
+ *.out
32
+ *.app
33
+
34
+ .vs
35
+ build
36
+ build-*/
37
+ out
38
+ .cache
39
+ .playwright-cli/
40
+ .omx/
41
+ site/
42
+
43
+ # Local AI session state stays ignored, but the versioned harness
44
+ # (.claude/skills/) is part of the repository.
45
+ .claude/*
46
+ !.claude/skills/
47
+
48
+ # PLCopen 规格文档本地缓存(版权文档,不再分发——见
49
+ # doc/compliance/plcopen-specs-manifest.md;用 tools/fetch-plcopen-specs.sh 取回)
50
+ refs/plcopen-specs/
51
+ refs/zeroth-01/