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.
- pyplcopen-0.20.0/.clang-tidy +22 -0
- pyplcopen-0.20.0/.github/ISSUE_TEMPLATE/task.yml +63 -0
- pyplcopen-0.20.0/.github/pull_request_template.md +17 -0
- pyplcopen-0.20.0/.github/workflows/core-nightly.yml +173 -0
- pyplcopen-0.20.0/.github/workflows/coverage.yml +29 -0
- pyplcopen-0.20.0/.github/workflows/docs.yml +30 -0
- pyplcopen-0.20.0/.github/workflows/linux-ci.yml +148 -0
- pyplcopen-0.20.0/.github/workflows/mutation-score.yml +18 -0
- pyplcopen-0.20.0/.github/workflows/wheels.yml +72 -0
- pyplcopen-0.20.0/.github/workflows/windows-ci.yml +74 -0
- pyplcopen-0.20.0/.gitignore +51 -0
- pyplcopen-0.20.0/.version +1 -0
- pyplcopen-0.20.0/AGENTS.md +9 -0
- pyplcopen-0.20.0/BUILD_LINUX.md +78 -0
- pyplcopen-0.20.0/BUILD_README.md +107 -0
- pyplcopen-0.20.0/CHANGELOG.md +543 -0
- pyplcopen-0.20.0/CLAUDE.md +71 -0
- pyplcopen-0.20.0/CMakeLists.txt +205 -0
- pyplcopen-0.20.0/CONTEXT.md +51 -0
- pyplcopen-0.20.0/LICENSE +201 -0
- pyplcopen-0.20.0/PKG-INFO +224 -0
- pyplcopen-0.20.0/PROVENANCE.md +89 -0
- pyplcopen-0.20.0/README.md +199 -0
- pyplcopen-0.20.0/ROADMAP.md +187 -0
- pyplcopen-0.20.0/STATUS.md +101 -0
- pyplcopen-0.20.0/VISION.md +297 -0
- pyplcopen-0.20.0/build.ps1 +327 -0
- pyplcopen-0.20.0/build.sh +125 -0
- pyplcopen-0.20.0/ci/smoke_test.py +58 -0
- pyplcopen-0.20.0/cmake/Doxyfile.in +43 -0
- pyplcopen-0.20.0/cmake/clang_tidy_gate.cmake +80 -0
- pyplcopen-0.20.0/cmake/core_cross_compile_smoke.cmake +74 -0
- pyplcopen-0.20.0/cmake/coverage_gate.cmake +144 -0
- pyplcopen-0.20.0/cmake/generate_part1_io_matrix.cmake +154 -0
- pyplcopen-0.20.0/cmake/generate_part1_part2_matrix.cmake +100 -0
- pyplcopen-0.20.0/cmake/generate_part5_io_matrix.cmake +171 -0
- pyplcopen-0.20.0/cmake/generate_st_binding_pin_catalog.cmake +44 -0
- pyplcopen-0.20.0/cmake/mutation_score_gate.cmake +252 -0
- pyplcopen-0.20.0/cmake/mutation_smoke.cmake +67 -0
- pyplcopen-0.20.0/cmake/plcopenConfig.cmake.in +5 -0
- pyplcopen-0.20.0/cmake/rt_safety_scan.cmake +126 -0
- pyplcopen-0.20.0/cmake/toolchain-aarch64-linux-gnu.cmake +12 -0
- pyplcopen-0.20.0/cmake/verify_replay_fixtures.cmake +147 -0
- pyplcopen-0.20.0/cmake/verify_st_binding_fb_catalog.cmake +130 -0
- pyplcopen-0.20.0/cmake/verify_st_conformance.cmake +88 -0
- pyplcopen-0.20.0/cmake/verify_st_feature_set.cmake +202 -0
- pyplcopen-0.20.0/cmake/verify_st_l1a_conversions.cmake +66 -0
- pyplcopen-0.20.0/conanfile.py +48 -0
- pyplcopen-0.20.0/core/.clang-format +10 -0
- pyplcopen-0.20.0/core/CMakeLists.txt +528 -0
- pyplcopen-0.20.0/core/README.md +55 -0
- pyplcopen-0.20.0/core/adapters/README.md +24 -0
- pyplcopen-0.20.0/core/adapters/cia402.h +154 -0
- pyplcopen-0.20.0/core/adapters/feetech.h +531 -0
- pyplcopen-0.20.0/core/adapters/mode_manager.h +81 -0
- pyplcopen-0.20.0/core/adapters/servo.h +130 -0
- pyplcopen-0.20.0/core/axis/README.md +145 -0
- pyplcopen-0.20.0/core/axis/group.h +7744 -0
- pyplcopen-0.20.0/core/axis/group_takeover_connector.h +261 -0
- pyplcopen-0.20.0/core/axis/state.h +3907 -0
- pyplcopen-0.20.0/core/bench/core_benchmark.cpp +351 -0
- pyplcopen-0.20.0/core/bench/jitter_harness.cpp +235 -0
- pyplcopen-0.20.0/core/bench/legacy_compare.cpp +330 -0
- pyplcopen-0.20.0/core/demo/basic_fb_cycle.cpp +22 -0
- pyplcopen-0.20.0/core/demo/group_linear_move.cpp +46 -0
- pyplcopen-0.20.0/core/demo/group_path_motion.cpp +133 -0
- pyplcopen-0.20.0/core/demo/rt_executor_demo.cpp +445 -0
- pyplcopen-0.20.0/core/demo/trajectory_stream.cpp +116 -0
- pyplcopen-0.20.0/core/exec/README.md +25 -0
- pyplcopen-0.20.0/core/exec/sampler.h +65 -0
- pyplcopen-0.20.0/core/exec/sync.h +464 -0
- pyplcopen-0.20.0/core/fb/README.md +108 -0
- pyplcopen-0.20.0/core/fb/base.h +178 -0
- pyplcopen-0.20.0/core/fb/basic.h +286 -0
- pyplcopen-0.20.0/core/fb/group.h +1296 -0
- pyplcopen-0.20.0/core/fb/homing.h +1739 -0
- pyplcopen-0.20.0/core/fb/io.h +540 -0
- pyplcopen-0.20.0/core/fb/management.h +440 -0
- pyplcopen-0.20.0/core/fb/motion.h +1289 -0
- pyplcopen-0.20.0/core/fb/parameter.h +330 -0
- pyplcopen-0.20.0/core/fb/path_table.h +705 -0
- pyplcopen-0.20.0/core/fb/probe.h +187 -0
- pyplcopen-0.20.0/core/fb/profile.h +474 -0
- pyplcopen-0.20.0/core/fb/sync.h +765 -0
- pyplcopen-0.20.0/core/fb/tracking.h +137 -0
- pyplcopen-0.20.0/core/geom/README.md +32 -0
- pyplcopen-0.20.0/core/geom/frame.h +250 -0
- pyplcopen-0.20.0/core/geom/geometry.h +799 -0
- pyplcopen-0.20.0/core/kin/README.md +60 -0
- pyplcopen-0.20.0/core/kin/gantry.h +83 -0
- pyplcopen-0.20.0/core/kin/kinematics.h +53 -0
- pyplcopen-0.20.0/core/kin/pose.h +45 -0
- pyplcopen-0.20.0/core/kin/scara.h +118 -0
- pyplcopen-0.20.0/core/kin/verify.h +135 -0
- pyplcopen-0.20.0/core/kin/wrist6r.h +297 -0
- pyplcopen-0.20.0/core/otg/README.md +55 -0
- pyplcopen-0.20.0/core/otg/profile1d.h +291 -0
- pyplcopen-0.20.0/core/otg/time_optimal.h +1332 -0
- pyplcopen-0.20.0/core/plan/README.md +29 -0
- pyplcopen-0.20.0/core/plan/path.h +243 -0
- pyplcopen-0.20.0/core/plan/topp.h +237 -0
- pyplcopen-0.20.0/core/plan/topp_executor.h +411 -0
- pyplcopen-0.20.0/core/plan/topp_jerk.h +326 -0
- pyplcopen-0.20.0/core/rt/README.md +30 -0
- pyplcopen-0.20.0/core/rt/cycle.h +71 -0
- pyplcopen-0.20.0/core/rt/error.h +69 -0
- pyplcopen-0.20.0/core/rt/error_text.h +31 -0
- pyplcopen-0.20.0/core/rt/spsc_queue.h +69 -0
- pyplcopen-0.20.0/core/rt/static_vector.h +85 -0
- pyplcopen-0.20.0/core/rt/units.h +87 -0
- pyplcopen-0.20.0/core/st/README.md +73 -0
- pyplcopen-0.20.0/core/st/ast.h +352 -0
- pyplcopen-0.20.0/core/st/bind.h +121 -0
- pyplcopen-0.20.0/core/st/binding.h +109 -0
- pyplcopen-0.20.0/core/st/binding_manifest.h +318 -0
- pyplcopen-0.20.0/core/st/binding_registry.h +238 -0
- pyplcopen-0.20.0/core/st/binding_storage.h +126 -0
- pyplcopen-0.20.0/core/st/bytecode.h +1056 -0
- pyplcopen-0.20.0/core/st/codegen.h +1250 -0
- pyplcopen-0.20.0/core/st/compile.h +809 -0
- pyplcopen-0.20.0/core/st/configuration_runtime.h +1012 -0
- pyplcopen-0.20.0/core/st/conv.h +168 -0
- pyplcopen-0.20.0/core/st/debug.h +1180 -0
- pyplcopen-0.20.0/core/st/debug_types.h +320 -0
- pyplcopen-0.20.0/core/st/diag.h +205 -0
- pyplcopen-0.20.0/core/st/generated/mc_pins.h +150 -0
- pyplcopen-0.20.0/core/st/generated/st_binding_catalog.h +1865 -0
- pyplcopen-0.20.0/core/st/generated/st_binding_native.h +37138 -0
- pyplcopen-0.20.0/core/st/generated/st_binding_pins.h +1697 -0
- pyplcopen-0.20.0/core/st/generated/st_binding_types.h +490 -0
- pyplcopen-0.20.0/core/st/l2b.h +2220 -0
- pyplcopen-0.20.0/core/st/lexer.h +1123 -0
- pyplcopen-0.20.0/core/st/parser.h +1433 -0
- pyplcopen-0.20.0/core/st/pins.h +78 -0
- pyplcopen-0.20.0/core/st/process_image.h +1046 -0
- pyplcopen-0.20.0/core/st/sema.h +3584 -0
- pyplcopen-0.20.0/core/st/sfc.h +1206 -0
- pyplcopen-0.20.0/core/st/st.h +16 -0
- pyplcopen-0.20.0/core/st/standard_functions.h +119 -0
- pyplcopen-0.20.0/core/st/standard_names.h +23 -0
- pyplcopen-0.20.0/core/st/tasking.h +784 -0
- pyplcopen-0.20.0/core/st/token.h +161 -0
- pyplcopen-0.20.0/core/st/type_desc.h +917 -0
- pyplcopen-0.20.0/core/st/types.h +341 -0
- pyplcopen-0.20.0/core/st/vm.h +4332 -0
- pyplcopen-0.20.0/core/stream/README.md +73 -0
- pyplcopen-0.20.0/core/stream/filter.h +888 -0
- pyplcopen-0.20.0/core/stream/joint_group.h +103 -0
- pyplcopen-0.20.0/core/stream/quintic_fast_path.h +238 -0
- pyplcopen-0.20.0/core/test/a2_alloc_guard_tests.cpp +310 -0
- pyplcopen-0.20.0/core/test/a3_circular_tests.cpp +696 -0
- pyplcopen-0.20.0/core/test/a4_blending_tests.cpp +647 -0
- pyplcopen-0.20.0/core/test/a5_lookahead_tests.cpp +869 -0
- pyplcopen-0.20.0/core/test/adapters_tests.cpp +413 -0
- pyplcopen-0.20.0/core/test/cam_tests.cpp +368 -0
- pyplcopen-0.20.0/core/test/cartesian_tests.cpp +1941 -0
- pyplcopen-0.20.0/core/test/commercial_precision_tests.cpp +256 -0
- pyplcopen-0.20.0/core/test/coordinate_tests.cpp +347 -0
- pyplcopen-0.20.0/core/test/core_rt_tests.cpp +179 -0
- pyplcopen-0.20.0/core/test/feetech_fuzz.cpp +47 -0
- pyplcopen-0.20.0/core/test/feetech_tests.cpp +275 -0
- pyplcopen-0.20.0/core/test/geom_derivative_tests.cpp +299 -0
- pyplcopen-0.20.0/core/test/geom_third_derivative_tests.cpp +237 -0
- pyplcopen-0.20.0/core/test/kinematics_tests.cpp +446 -0
- pyplcopen-0.20.0/core/test/otg_fuzz.cpp +113 -0
- pyplcopen-0.20.0/core/test/otg_optimality_oracle.cpp +806 -0
- pyplcopen-0.20.0/core/test/otg_oracle.cpp +88 -0
- pyplcopen-0.20.0/core/test/otg_time_optimal_tests.cpp +1292 -0
- pyplcopen-0.20.0/core/test/part1_c4_tests.cpp +826 -0
- pyplcopen-0.20.0/core/test/part4_c3_fuzz.cpp +88 -0
- pyplcopen-0.20.0/core/test/part4_c3_tests.cpp +1067 -0
- pyplcopen-0.20.0/core/test/part4_management_tests.cpp +1745 -0
- pyplcopen-0.20.0/core/test/part4_p4b1_fuzz.cpp +145 -0
- pyplcopen-0.20.0/core/test/part4_p4b1_tests.cpp +1071 -0
- pyplcopen-0.20.0/core/test/part4_p4b2_fuzz.cpp +132 -0
- pyplcopen-0.20.0/core/test/part4_p4b2_tests.cpp +1061 -0
- pyplcopen-0.20.0/core/test/part4_p4b3_fuzz.cpp +108 -0
- pyplcopen-0.20.0/core/test/part4_p4b3_tests.cpp +920 -0
- pyplcopen-0.20.0/core/test/part4_pathtable_tests.cpp +1484 -0
- pyplcopen-0.20.0/core/test/part5_c5_tests.cpp +608 -0
- pyplcopen-0.20.0/core/test/part5_homing_tests.cpp +3612 -0
- pyplcopen-0.20.0/core/test/pose_tests.cpp +484 -0
- pyplcopen-0.20.0/core/test/r2_motion_tests.cpp +454 -0
- pyplcopen-0.20.0/core/test/r3_group_fb_tests.cpp +1975 -0
- pyplcopen-0.20.0/core/test/r3_io_tests.cpp +698 -0
- pyplcopen-0.20.0/core/test/r3_motion_family_tests.cpp +1525 -0
- pyplcopen-0.20.0/core/test/r3_parameter_tests.cpp +693 -0
- pyplcopen-0.20.0/core/test/r3_probe_tests.cpp +384 -0
- pyplcopen-0.20.0/core/test/r3_profile_tests.cpp +1175 -0
- pyplcopen-0.20.0/core/test/r3_semantics_tests.cpp +1016 -0
- pyplcopen-0.20.0/core/test/r3_sync_tests.cpp +1962 -0
- pyplcopen-0.20.0/core/test/readback_tests.cpp +584 -0
- pyplcopen-0.20.0/core/test/replay_regression.cpp +751 -0
- pyplcopen-0.20.0/core/test/st_fuzz.cpp +1206 -0
- pyplcopen-0.20.0/core/test/st_l0_compiler_tests.cpp +588 -0
- pyplcopen-0.20.0/core/test/st_l0_golden_tests.cpp +236 -0
- pyplcopen-0.20.0/core/test/st_l0_quality_tests.cpp +314 -0
- pyplcopen-0.20.0/core/test/st_l0_runtime_tests.cpp +2677 -0
- pyplcopen-0.20.0/core/test/st_l1a_conversion_tests.cpp +472 -0
- pyplcopen-0.20.0/core/test/st_l1a_types_tests.cpp +394 -0
- pyplcopen-0.20.0/core/test/st_l1b1_tests.cpp +534 -0
- pyplcopen-0.20.0/core/test/st_l1b2_tests.cpp +622 -0
- pyplcopen-0.20.0/core/test/st_l1b3_tests.cpp +828 -0
- pyplcopen-0.20.0/core/test/st_l2a_tests.cpp +610 -0
- pyplcopen-0.20.0/core/test/st_l2b_tests.cpp +1662 -0
- pyplcopen-0.20.0/core/test/st_l2c_tests.cpp +3382 -0
- pyplcopen-0.20.0/core/test/st_l3_tests.cpp +986 -0
- pyplcopen-0.20.0/core/test/st_l4_tests.cpp +902 -0
- pyplcopen-0.20.0/core/test/st_l5_frontend_tests.cpp +391 -0
- pyplcopen-0.20.0/core/test/st_l5_tests.cpp +1494 -0
- pyplcopen-0.20.0/core/test/st_l6_tests.cpp +1470 -0
- pyplcopen-0.20.0/core/test/st_l7_tests.cpp +1566 -0
- pyplcopen-0.20.0/core/test/st_numeric_semantics_tests.cpp +187 -0
- pyplcopen-0.20.0/core/test/st_type_desc_tests.cpp +400 -0
- pyplcopen-0.20.0/core/test/state_transition_matrix_tests.cpp +3570 -0
- pyplcopen-0.20.0/core/test/stream_fastpath_oracle.cpp +458 -0
- pyplcopen-0.20.0/core/test/stream_filter_tests.cpp +1232 -0
- pyplcopen-0.20.0/core/test/stream_session_tests.cpp +438 -0
- pyplcopen-0.20.0/core/test/topp_executor_tests.cpp +400 -0
- pyplcopen-0.20.0/core/test/topp_jerk_oracle.cpp +272 -0
- pyplcopen-0.20.0/core/test/topp_oracle.cpp +506 -0
- pyplcopen-0.20.0/core/test/topp_shadow_oracle.cpp +266 -0
- pyplcopen-0.20.0/core/test/wrist6r_tests.cpp +226 -0
- pyplcopen-0.20.0/core/test/y7_group_takeover_tests.cpp +756 -0
- pyplcopen-0.20.0/coverage.ps1 +307 -0
- pyplcopen-0.20.0/doc/archive/ADJUSTMENT_PLAN.md +312 -0
- pyplcopen-0.20.0/doc/archive/README.md +20 -0
- pyplcopen-0.20.0/doc/archive/buffer-mode-blending-design.md +612 -0
- pyplcopen-0.20.0/doc/archive/buffer-mode-blending-plan.md +404 -0
- pyplcopen-0.20.0/doc/archive/design_doc.md +280 -0
- pyplcopen-0.20.0/doc/archive/part1-part2-completion-plan.md +242 -0
- pyplcopen-0.20.0/doc/archive/part4-linear-motion-plan.md +188 -0
- pyplcopen-0.20.0/doc/archive/r0-evidence-package.md +155 -0
- pyplcopen-0.20.0/doc/archive/r0-r4-work-breakdown.md +237 -0
- pyplcopen-0.20.0/doc/archive/r3-migration-matrix.md +21 -0
- pyplcopen-0.20.0/doc/archive/r4-evidence-package.md +127 -0
- pyplcopen-0.20.0/doc/archive/rewrite-plan.md +297 -0
- pyplcopen-0.20.0/doc/archive/roadmap-history.md +353 -0
- pyplcopen-0.20.0/doc/archive/v0.11.0-release-draft.md +52 -0
- pyplcopen-0.20.0/doc/compliance/CODEX-TASK-part1-fb-audit.md +172 -0
- pyplcopen-0.20.0/doc/compliance/branch-coverage-baseline.md +90 -0
- pyplcopen-0.20.0/doc/compliance/cam-curve-semantics.md +99 -0
- pyplcopen-0.20.0/doc/compliance/cartesian-interpolation-semantics.md +174 -0
- pyplcopen-0.20.0/doc/compliance/ci-gates.md +28 -0
- pyplcopen-0.20.0/doc/compliance/commercial-gate-evidence.md +51 -0
- pyplcopen-0.20.0/doc/compliance/feetech-sts-adapter-semantics.md +95 -0
- pyplcopen-0.20.0/doc/compliance/generated/plcopen-motion-part1-io.md +752 -0
- pyplcopen-0.20.0/doc/compliance/generated/plcopen-motion-part5-io.md +243 -0
- pyplcopen-0.20.0/doc/compliance/generated/plcopen-motion-v2-function-blocks.md +55 -0
- pyplcopen-0.20.0/doc/compliance/generated/st-binding-fb-pins.yml +12885 -0
- pyplcopen-0.20.0/doc/compliance/generated/st-binding-native-gaps.yml +5 -0
- pyplcopen-0.20.0/doc/compliance/group-takeover-semantics.md +64 -0
- pyplcopen-0.20.0/doc/compliance/iec-basic-fb-io.yml +63 -0
- pyplcopen-0.20.0/doc/compliance/kinematics-plugin-semantics.md +129 -0
- pyplcopen-0.20.0/doc/compliance/known-boundaries.md +131 -0
- pyplcopen-0.20.0/doc/compliance/orientation-semantics.md +94 -0
- pyplcopen-0.20.0/doc/compliance/part1-c4-semantics.md +88 -0
- pyplcopen-0.20.0/doc/compliance/part1-digital-cam-switch-semantics.md +63 -0
- pyplcopen-0.20.0/doc/compliance/part1-move-absolute-direction-semantics.md +91 -0
- pyplcopen-0.20.0/doc/compliance/part1-phasing-axis-references-semantics.md +49 -0
- pyplcopen-0.20.0/doc/compliance/part1-set-override-semantics.md +103 -0
- pyplcopen-0.20.0/doc/compliance/part4-blending-semantics.md +66 -0
- pyplcopen-0.20.0/doc/compliance/part4-c3-semantics.md +62 -0
- pyplcopen-0.20.0/doc/compliance/part4-coordinate-semantics.md +90 -0
- pyplcopen-0.20.0/doc/compliance/part4-coverage.md +100 -0
- pyplcopen-0.20.0/doc/compliance/part4-lookahead-semantics.md +97 -0
- pyplcopen-0.20.0/doc/compliance/part4-lookahead-v2-jerk.md +45 -0
- pyplcopen-0.20.0/doc/compliance/part4-management-semantics.md +56 -0
- pyplcopen-0.20.0/doc/compliance/part4-p4b1-semantics.md +124 -0
- pyplcopen-0.20.0/doc/compliance/part4-p4b2-semantics.md +149 -0
- pyplcopen-0.20.0/doc/compliance/part4-pathtable-semantics.md +37 -0
- pyplcopen-0.20.0/doc/compliance/part5-c5-semantics.md +73 -0
- pyplcopen-0.20.0/doc/compliance/part5-homing-semantics.md +57 -0
- pyplcopen-0.20.0/doc/compliance/part5-p5b-semantics.md +95 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-beckhoff-parity-matrix.md +90 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-conformance-audit.md +178 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-guides-audit.md +371 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-motion-logic-supplement-audit.md +133 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-motion-part1-io.yml +714 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-motion-part4-circular-matrix.md +72 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-motion-part4-io.yml +967 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-motion-part4-linear-matrix.md +94 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-motion-part5-io.yml +220 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-motion-v2-function-block-matrix.md +159 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-motion-v2-function-blocks.yml +296 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-opcua-audit.md +153 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-part1-clause-matrix.md +687 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-part3-audit.md +67 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-part4-clause-audit.md +352 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-part5-part6-audit.md +114 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-safety-audit.md +198 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-specs-manifest.md +71 -0
- pyplcopen-0.20.0/doc/compliance/plcopen-xml-tc6-audit.md +113 -0
- pyplcopen-0.20.0/doc/compliance/readback-semantics.md +73 -0
- pyplcopen-0.20.0/doc/compliance/runtime-thread-ownership-semantics.md +68 -0
- pyplcopen-0.20.0/doc/compliance/st-binding-adapters.yml +2151 -0
- pyplcopen-0.20.0/doc/compliance/st-binding-fb-catalog.yml +170 -0
- pyplcopen-0.20.0/doc/compliance/st-binding-types.yml +54 -0
- pyplcopen-0.20.0/doc/compliance/st-feature-set.yml +261 -0
- pyplcopen-0.20.0/doc/compliance/st-feature-table.md +63 -0
- pyplcopen-0.20.0/doc/compliance/st-l0-conformance.yaml +194 -0
- pyplcopen-0.20.0/doc/compliance/st-l0-semantics.md +179 -0
- pyplcopen-0.20.0/doc/compliance/st-l1a-conformance.yaml +66 -0
- pyplcopen-0.20.0/doc/compliance/st-l1a-conversions.yaml +221 -0
- pyplcopen-0.20.0/doc/compliance/st-l1a-semantics.md +120 -0
- pyplcopen-0.20.0/doc/compliance/st-l1b1-semantics.md +116 -0
- pyplcopen-0.20.0/doc/compliance/st-l1b2-semantics.md +71 -0
- pyplcopen-0.20.0/doc/compliance/st-l1b3-semantics.md +70 -0
- pyplcopen-0.20.0/doc/compliance/st-l2a-semantics.md +121 -0
- pyplcopen-0.20.0/doc/compliance/st-l2b-semantics.md +78 -0
- pyplcopen-0.20.0/doc/compliance/st-l2c-semantics.md +77 -0
- pyplcopen-0.20.0/doc/compliance/st-l3-semantics.md +74 -0
- pyplcopen-0.20.0/doc/compliance/st-l4-semantics.md +107 -0
- pyplcopen-0.20.0/doc/compliance/st-l5-semantics.md +90 -0
- pyplcopen-0.20.0/doc/compliance/st-l6-semantics.md +91 -0
- pyplcopen-0.20.0/doc/compliance/st-l7-semantics.md +71 -0
- pyplcopen-0.20.0/doc/compliance/sto-ss1-integration-boundary.md +145 -0
- pyplcopen-0.20.0/doc/compliance/trajectory-stream-semantics.md +179 -0
- pyplcopen-0.20.0/doc/design/README.md +20 -0
- pyplcopen-0.20.0/doc/design/architecture-review-2026-07.md +49 -0
- pyplcopen-0.20.0/doc/design/core/algorithm-contracts.md +135 -0
- pyplcopen-0.20.0/doc/design/core/architecture.md +273 -0
- pyplcopen-0.20.0/doc/design/core/floating-point-semantics.md +60 -0
- pyplcopen-0.20.0/doc/design/core/l0-l1-rt-otg.md +124 -0
- pyplcopen-0.20.0/doc/design/core/l2-l4-motion-core.md +56 -0
- pyplcopen-0.20.0/doc/design/core/l5-l6-semantic-layer.md +100 -0
- pyplcopen-0.20.0/doc/design/core/otg-oracle-design.md +82 -0
- pyplcopen-0.20.0/doc/design/core/priority-tracks-design.md +76 -0
- pyplcopen-0.20.0/doc/design/core/st-runtime-design.md +91 -0
- pyplcopen-0.20.0/doc/design/core/stream-fastpath-design.md +97 -0
- pyplcopen-0.20.0/doc/design/decisions/0000-template.md +21 -0
- pyplcopen-0.20.0/doc/design/decisions/0001-v0x-license-strategy.md +49 -0
- pyplcopen-0.20.0/doc/design/decisions/0002-core-cpp17-standard.md +29 -0
- pyplcopen-0.20.0/doc/design/decisions/0003-ruckig-oracle-boundary.md +29 -0
- pyplcopen-0.20.0/doc/design/decisions/0004-servo-adapter-interface.md +55 -0
- pyplcopen-0.20.0/doc/design/decisions/0005-humanoid-multi-chain-model.md +44 -0
- pyplcopen-0.20.0/doc/design/decisions/0006-fieldbus-process-model.md +83 -0
- pyplcopen-0.20.0/doc/design/decisions/0007-executor-committed-trajectory.md +60 -0
- pyplcopen-0.20.0/doc/migration-v0-to-v1.md +126 -0
- pyplcopen-0.20.0/doc/planning/README.md +40 -0
- pyplcopen-0.20.0/doc/planning/adoption-plan.md +55 -0
- pyplcopen-0.20.0/doc/planning/ai-collaboration.md +138 -0
- pyplcopen-0.20.0/doc/planning/axis-group-split-plan-2026-07-09.md +52 -0
- pyplcopen-0.20.0/doc/planning/coverage-gate-implementation-notes.md +51 -0
- pyplcopen-0.20.0/doc/planning/embodied-strategy.md +76 -0
- pyplcopen-0.20.0/doc/planning/execution-plan-2026-07-12.md +115 -0
- pyplcopen-0.20.0/doc/planning/full-project-review-2026-07-09.md +159 -0
- pyplcopen-0.20.0/doc/planning/hardware-price-watch.md +46 -0
- pyplcopen-0.20.0/doc/planning/humanoid-h1-plan.md +91 -0
- pyplcopen-0.20.0/doc/planning/humanoid-platform-survey.md +75 -0
- pyplcopen-0.20.0/doc/planning/l-series-implementation-notes.md +387 -0
- pyplcopen-0.20.0/doc/planning/l-series-work-breakdown.md +126 -0
- pyplcopen-0.20.0/doc/planning/long-term-plan.md +972 -0
- pyplcopen-0.20.0/doc/planning/master-plan.md +165 -0
- pyplcopen-0.20.0/doc/planning/part1-gear-phasing-native-implementation-notes.md +36 -0
- pyplcopen-0.20.0/doc/planning/part4-native-gap-implementation-notes.md +15 -0
- pyplcopen-0.20.0/doc/planning/phase-b-software-work-breakdown.md +162 -0
- pyplcopen-0.20.0/doc/planning/plcopen-beckhoff-parity-closure.md +94 -0
- pyplcopen-0.20.0/doc/planning/plcopen-c2-implementation-notes.md +50 -0
- pyplcopen-0.20.0/doc/planning/plcopen-c3-implementation-notes.md +47 -0
- pyplcopen-0.20.0/doc/planning/plcopen-c3-implementation-plan.md +135 -0
- pyplcopen-0.20.0/doc/planning/plcopen-c4-implementation-notes.md +56 -0
- pyplcopen-0.20.0/doc/planning/plcopen-c4-implementation-plan.md +122 -0
- pyplcopen-0.20.0/doc/planning/plcopen-c5-implementation-notes.md +39 -0
- pyplcopen-0.20.0/doc/planning/plcopen-conformance-plan.md +203 -0
- pyplcopen-0.20.0/doc/planning/r1-rt-report-template.md +50 -0
- pyplcopen-0.20.0/doc/planning/robot-integration.md +152 -0
- pyplcopen-0.20.0/doc/planning/signal-channel-plan.md +36 -0
- pyplcopen-0.20.0/doc/planning/software-excellence-plan.md +244 -0
- pyplcopen-0.20.0/doc/planning/v0.20.0-release-draft.md +84 -0
- pyplcopen-0.20.0/doc/planning/v1.0.0-alpha-release-draft.md +92 -0
- pyplcopen-0.20.0/doc/reference/plcopen_motion_control_overview-/344/270/255/346/226/207.pdf +0 -0
- pyplcopen-0.20.0/doc/reference/plcopen_motion_control_overview.pdf +0 -0
- pyplcopen-0.20.0/doc/reference/plcopen_motion_control_part_1_version_2.0-/344/270/255/346/226/207.pdf +0 -0
- pyplcopen-0.20.0/doc/reference/plcopen_motion_control_part_1_version_2.0.pdf +0 -0
- pyplcopen-0.20.0/doc/vision/README.md +110 -0
- pyplcopen-0.20.0/doc/vision/archived-milestones.md +214 -0
- pyplcopen-0.20.0/doc/vision/archived-plan.md +390 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/architecture-decisions.md +394 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/current-status-summary.md +265 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-communication.md +819 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-function-block-engine.md +0 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-io-system.md +852 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-memory-manager.md +0 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-motion-algorithms.md +313 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-realtime-scheduler.md +459 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-security.md +343 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design-st-compiler.md +226 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/design.md +407 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/glossary.md +298 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/improvement-summary.md +362 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/p0-action-plan.md +280 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/requirements.md +270 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/tasks.md +295 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/technical-debt-analysis.md +299 -0
- pyplcopen-0.20.0/doc/vision/archived-specs/plc-runtime-core/traceability-matrix.md +132 -0
- pyplcopen-0.20.0/docs/getting-started/algorithms.md +144 -0
- pyplcopen-0.20.0/docs/getting-started/cpp.md +202 -0
- pyplcopen-0.20.0/docs/getting-started/python.md +172 -0
- pyplcopen-0.20.0/docs/guides/realtime-integration.md +53 -0
- pyplcopen-0.20.0/docs/guides/tuning.md +48 -0
- pyplcopen-0.20.0/docs/guides/twinCAT-codesys-migration.md +64 -0
- pyplcopen-0.20.0/docs/index.md +147 -0
- pyplcopen-0.20.0/docs/operations.md +41 -0
- pyplcopen-0.20.0/docs/references/fb-reference.md +79 -0
- pyplcopen-0.20.0/docs/releases/v0.20.0.md +129 -0
- pyplcopen-0.20.0/mkdocs.yml +53 -0
- pyplcopen-0.20.0/pyproject.toml +54 -0
- pyplcopen-0.20.0/python/pyplcopen.cpp +580 -0
- pyplcopen-0.20.0/src/CMakeLists.txt +168 -0
- pyplcopen-0.20.0/src/CMakeSettings.json +27 -0
- pyplcopen-0.20.0/src/demo/axes_group_lifecycle.cpp +145 -0
- pyplcopen-0.20.0/src/demo/axis_cam.cpp +98 -0
- pyplcopen-0.20.0/src/demo/axis_gear.cpp +97 -0
- pyplcopen-0.20.0/src/demo/axis_homing.cpp +136 -0
- pyplcopen-0.20.0/src/demo/axis_move.cpp +131 -0
- pyplcopen-0.20.0/src/demo/axis_move_oscilloscope.cpp +292 -0
- pyplcopen-0.20.0/src/demo/axis_sync.cpp +95 -0
- pyplcopen-0.20.0/src/demo/basic_fb_cycle.cpp +38 -0
- pyplcopen-0.20.0/src/demo/follower_demo_support.h +114 -0
- pyplcopen-0.20.0/src/demo/golden_replay_recorder.cpp +133 -0
- pyplcopen-0.20.0/src/demo/group_linear_move.cpp +82 -0
- pyplcopen-0.20.0/src/fb/FbBasic.cpp +306 -0
- pyplcopen-0.20.0/src/fb/FbBasic.h +266 -0
- pyplcopen-0.20.0/src/fb/FbMultiAxis.cpp +464 -0
- pyplcopen-0.20.0/src/fb/FbMultiAxis.h +342 -0
- pyplcopen-0.20.0/src/fb/FbPLCOpenBase.cpp +279 -0
- pyplcopen-0.20.0/src/fb/FbPLCOpenBase.h +268 -0
- pyplcopen-0.20.0/src/fb/FbSingleAxis.cpp +2103 -0
- pyplcopen-0.20.0/src/fb/FbSingleAxis.h +800 -0
- pyplcopen-0.20.0/src/fb/FunctionBlock.cpp +31 -0
- pyplcopen-0.20.0/src/fb/FunctionBlock.h +65 -0
- pyplcopen-0.20.0/src/fb/PLCTypes.h +122 -0
- pyplcopen-0.20.0/src/misc/Event.h +50 -0
- pyplcopen-0.20.0/src/misc/ExeclQueue.cpp +257 -0
- pyplcopen-0.20.0/src/misc/ExeclQueue.h +96 -0
- pyplcopen-0.20.0/src/misc/LinkList.cpp +90 -0
- pyplcopen-0.20.0/src/misc/LinkList.h +50 -0
- pyplcopen-0.20.0/src/misc/Queue.h +185 -0
- pyplcopen-0.20.0/src/motion/AxesGroup.cpp +778 -0
- pyplcopen-0.20.0/src/motion/AxesGroup.h +78 -0
- pyplcopen-0.20.0/src/motion/CamTable.cpp +85 -0
- pyplcopen-0.20.0/src/motion/CamTable.h +27 -0
- pyplcopen-0.20.0/src/motion/Global.h +458 -0
- pyplcopen-0.20.0/src/motion/Scheduler.cpp +187 -0
- pyplcopen-0.20.0/src/motion/Scheduler.h +106 -0
- pyplcopen-0.20.0/src/motion/Servo.cpp +145 -0
- pyplcopen-0.20.0/src/motion/Servo.h +89 -0
- pyplcopen-0.20.0/src/motion/axis/Axis.cpp +69 -0
- pyplcopen-0.20.0/src/motion/axis/Axis.h +54 -0
- pyplcopen-0.20.0/src/motion/axis/AxisBase.cpp +778 -0
- pyplcopen-0.20.0/src/motion/axis/AxisBase.h +119 -0
- pyplcopen-0.20.0/src/motion/axis/AxisHoming.cpp +538 -0
- pyplcopen-0.20.0/src/motion/axis/AxisHoming.h +59 -0
- pyplcopen-0.20.0/src/motion/axis/AxisMotion.cpp +48 -0
- pyplcopen-0.20.0/src/motion/axis/AxisMotion.h +49 -0
- pyplcopen-0.20.0/src/motion/axis/AxisMotionBase.cpp +179 -0
- pyplcopen-0.20.0/src/motion/axis/AxisMotionBase.h +99 -0
- pyplcopen-0.20.0/src/motion/axis/AxisMove.cpp +882 -0
- pyplcopen-0.20.0/src/motion/axis/AxisMove.h +154 -0
- pyplcopen-0.20.0/src/motion/axis/AxisStatus.cpp +171 -0
- pyplcopen-0.20.0/src/motion/axis/AxisStatus.h +54 -0
- pyplcopen-0.20.0/src/motion/axis/AxisSync.cpp +895 -0
- pyplcopen-0.20.0/src/motion/axis/AxisSync.h +97 -0
- pyplcopen-0.20.0/src/motion/interpolation/GroupLinearPlanner.cpp +105 -0
- pyplcopen-0.20.0/src/motion/interpolation/GroupLinearPlanner.h +50 -0
- pyplcopen-0.20.0/src/motion/interpolation/MathUtils.h +81 -0
- pyplcopen-0.20.0/src/motion/interpolation/ProfilePlanner.cpp +917 -0
- pyplcopen-0.20.0/src/motion/interpolation/ProfilePlanner.h +160 -0
- pyplcopen-0.20.0/src/motion/interpolation/ProfilesPlanner.cpp +57 -0
- pyplcopen-0.20.0/src/motion/interpolation/ProfilesPlanner.h +71 -0
- pyplcopen-0.20.0/src/plcopen.cmake +26 -0
- pyplcopen-0.20.0/src/python/pyplcopen.cpp +319 -0
- pyplcopen-0.20.0/src/test/test_axes_group.cpp +491 -0
- pyplcopen-0.20.0/src/test/test_axis_status.cpp +237 -0
- pyplcopen-0.20.0/src/test/test_basic.cpp +736 -0
- pyplcopen-0.20.0/src/test/test_fb_basic.cpp +424 -0
- pyplcopen-0.20.0/src/test/test_fb_multi_axis.cpp +3261 -0
- pyplcopen-0.20.0/src/test/test_fb_single_axis.cpp +4775 -0
- pyplcopen-0.20.0/src/test/test_group_linear_planner.cpp +125 -0
- pyplcopen-0.20.0/src/test/test_main.cpp +6 -0
- pyplcopen-0.20.0/src/test/test_profile_planner.cpp +153 -0
- pyplcopen-0.20.0/test_package/fetchcontent/CMakeLists.txt +22 -0
- pyplcopen-0.20.0/test_package/fetchcontent/main.cpp +47 -0
- pyplcopen-0.20.0/test_package/find_package/CMakeLists.txt +11 -0
- pyplcopen-0.20.0/test_package/find_package/main.cpp +47 -0
- pyplcopen-0.20.0/testdata/replay/README.md +73 -0
- pyplcopen-0.20.0/testdata/replay/core-group-blend-v2.jsonl +228 -0
- pyplcopen-0.20.0/testdata/replay/core-group-blend.jsonl +232 -0
- pyplcopen-0.20.0/testdata/replay/core-group-cartesian-window.jsonl +384 -0
- pyplcopen-0.20.0/testdata/replay/core-group-cartesian.jsonl +297 -0
- pyplcopen-0.20.0/testdata/replay/core-group-circular.jsonl +60 -0
- pyplcopen-0.20.0/testdata/replay/core-group-linear-v2.jsonl +44 -0
- pyplcopen-0.20.0/testdata/replay/core-group-linear.jsonl +32 -0
- pyplcopen-0.20.0/testdata/replay/core-group-pcs.jsonl +166 -0
- pyplcopen-0.20.0/testdata/replay/core-group-window-arc.jsonl +178 -0
- pyplcopen-0.20.0/testdata/replay/core-group-window.jsonl +186 -0
- pyplcopen-0.20.0/testdata/replay/core-single-axis-move-v2.jsonl +67 -0
- pyplcopen-0.20.0/testdata/replay/core-single-axis-move.jsonl +240 -0
- pyplcopen-0.20.0/testdata/replay/core-stream-session.jsonl +243 -0
- pyplcopen-0.20.0/testdata/replay/core-velocity-stop-v2.jsonl +21 -0
- pyplcopen-0.20.0/testdata/replay/core-velocity-stop.jsonl +21 -0
- pyplcopen-0.20.0/testdata/replay/format-smoke-single-axis.jsonl +3 -0
- pyplcopen-0.20.0/testdata/replay/format-smoke-stop.jsonl +3 -0
- pyplcopen-0.20.0/testdata/replay/format-smoke-two-axis.jsonl +4 -0
- pyplcopen-0.20.0/testdata/replay/manifest.json +174 -0
- pyplcopen-0.20.0/tools/fetch-plcopen-specs.sh +105 -0
- pyplcopen-0.20.0/tools/generate_st_binding_pin_catalog.py +2791 -0
- pyplcopen-0.20.0/tools/generate_st_binding_types.py +592 -0
- pyplcopen-0.20.0/tools/plcopen_trace.py +88 -0
- 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/
|