41 KiB
41 KiB
Source Reuse Map
Purpose
This map records which LinuxCNC source files are currently vendored into the standalone WASM port, why they are present, which standalone boundary they touch, and how the port verifies that they still come directly from upstream LinuxCNC.
The authoritative extraction list is tools/source-manifest.txt. The upstream
baseline is recorded in tools/upstream-baseline.txt and
docs/scope-and-baseline.md.
Validation Contract
Current validation is intentionally mechanical:
tools/verify_upstream_baseline.shchecks that../linuxcncis at the recorded upstream commit.tools/verify_vendor_sync.shchecks that every manifest file exists invendor/linuxcnc/, that no extra vendored file exists, and that each vendored file is byte-identical to the matching upstream file.tools/build_native_probes.shbuilds source-level native compile probes for every.cand.ccfile in the manifest.tests/native/verify_native_probes.shchecks that every manifest.cand.ccfile has a matching source probe inbuild/native/source-probes.tsv.tools/verify_no_standalone_cnc_semantics.shrejects standaloneInterp::...member definitions outsidevendor/linuxcnc/, except for the documented Python/remap runtime-edge stubs inruntime/core/linuxcnc_wrap/linuxcnc_interp_edge_stubs.cpp.
The project-level release handoff in docs/project-release-handoff.md links
this source reuse map to the README, panel entry documentation, SDK surface,
OPFS/session release gate, sim-config coverage gate, host/runtime blocked
families, and drift report.
Reuse Matrix
| Capability | LinuxCNC source files | Port classification | Standalone boundary | Current validation |
|---|---|---|---|---|
| INI parsing | src/emc/ini/inifile.cc, inifile.h, inifile.hh |
Copy unchanged | Native file IO remains LinuxCNC-style in the vendored parser; browser OPFS integration remains outside this layer; runtime/sdk/src/index.js exports the INI SDK wrapper around the generated WASM C ABI, including LinuxCNC iniFindBool() for machine-session flags and LinuxCNC string lookup for INI-declared [RS274NGC]PARAMETER_FILE and [EMCIO]TOOL_TABLE machine file names |
Vendor byte sync, linuxcnc_ini_probe, linuxcnc_inifile_source_probe, tests/wasm/node/verify_ini_wasm.sh boolean plus file-name lookup assertions, tests/browser/verify_ini_panel_browser.sh, tests/host/verify_host_smokes.sh |
| RTAPI compatibility headers | src/rtapi/rtapi_*.h in the manifest |
Copy unchanged plus standalone shim include path | runtime/core/shims/rtapi.h supplies the minimal standalone RTAPI surface needed by vendored code |
Vendor byte sync, compile coverage through dependent source probes |
| Canon/NML-facing interpreter types | src/emc/nml_intf/canon*.hh, emctool.h, interp_return.hh, motion_types.h, emcpose.*, emcpos.h, debugflags.h, src/emc/linuxcnc.h |
Copy unchanged plus narrow standalone status shim | NML transport is not ported; runtime/core/shims/nml_intf/emc.hh exposes only the emcStatus machine-units status edge currently needed by vendored interpreter conversion and initialization code |
Vendor byte sync, dependent source probes, linuxcnc_emc_status_probe, linuxcnc_tp_api_probe, interpreter harnesses, tests/wasm/node/verify_interp_wasm.sh and tests/browser/verify_interp_browser.sh Interp::init() machine-unit assertions |
| Motion state headers | src/emc/motion/state_tag.h, emcmotcfg.h, simple_tp.h, motion.h, mot_priv.h, axis.h |
Copy unchanged | Realtime motion process is not ported; standalone probes seed the small motion status/config state required by TP calls | Vendor byte sync, linuxcnc_tp_api_probe, tests/wasm/node/verify_tp_wasm.sh |
| Native task / motion / HAL sync phase 0 references | tools/task-hal-source-manifest.txt lists src/emc/task/*, selected src/emc/motion/*, src/hal/*, src/emc/nml_intf/emc.hh, and src/libnml/posemath/* |
Reference proof for task/motion/HAL Web simulation runtime | tools/verify_task_hal_source_manifest.sh compares the local LinuxCNC reference tree and vendored tree where present, emits task/HAL/motion/NML/libnml counts. tests/native/probe_trt_task_hal_runtime.sh is opt-in for exclusive host LinuxCNC runtime probing and does not promote by default; Web simulation validation is handled by task/HAL WASM and browser gates while readiness remains false. |
tests/native/verify_task_hal_phase0.sh |
| HAL runtime phase 2 minimal boundary | src/hal/hal_lib.c, src/hal/hal_priv.h, src/hal/components/threads.c, src/hal/utils/halcmd_commands.cc as source references; runtime/core/shims/hal.h type boundary |
Runtime-edge adapter, not full native HAL promotion | runtime/core/linuxcnc_wrap/linuxcnc_hal_runtime.cpp owns C/C++ HAL pin, signal, param, net, and thread scheduler state behind LinuxCNC-style hal_* APIs and lchal_* C ABI; loadusr is blocked evidence; task runtime and native HAL comparison remain future work |
tests/wasm/node/verify_hal_runtime.sh WASM Node smoke; native fallback only when emcc is unavailable |
| Motion/HAL sync phase 3 minimal boundary | src/emc/motion/motion.h, src/emc/motion/command.c, src/emc/motion/control.c, src/emc/motion/mot_priv.h, src/emc/task/taskintf.cc as source references |
Runtime-edge adapter, not full native motion promotion | runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c exposes the planned lcmot_* C ABI, accepts LinuxCNC-style motion command JSON, advances deterministic servo cycles, and synchronizes motion.*, axis.*, and joint.* HAL pins through the phase 2 HAL runtime; full LinuxCNC emcmotController() and task/NML queue integration remain future work |
tests/wasm/node/verify_motion_hal_sync.sh WASM Node smoke |
| Task/motion/HAL simulation runtime | src/emc/task/task.hh, src/emc/task/emctask.cc, src/emc/task/emctaskmain.cc, src/emc/task/taskintf.cc, src/emc/task/emccanon.cc, src/emc/nml_intf/emc.hh, and upstream src/emc/nml_intf/emc_nml.hh as an evaluated but not vendored status-container reference |
Runtime-edge adapter, not full native task/HAL promotion | runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp exposes the planned lctask_* C ABI, stages files, opens a program, tracks task state/mode/interp/exec status, and routes RUN/PAUSE/RESUME/ABORT/MDI/JOG/HOME through the phase 3 motion command queue. The current WASM simulation path uses narrow emctask.cc, taskintf.cc, and emccanon.cc source-anchored subsets for status update, task-to-motion command envelopes, and canonical straight motion envelopes. T-007 adds StandaloneEmcStatus as the current EMC_STAT-equivalent container for top/task/motion/io required fields; statusSource=StandaloneEmcStatus and emcStatus are written from that centralized status snapshot. T-051 through T-055 close the status JSON contract batches: emcStatus.motion.traj, task current/read/motion line fields, emcStatus.motion.axis[]/joint[], IO aux/tool/coolant shim boundaries, and the dedicated schema gate; T-056 removes legacy task status top-level fields and gates their absence. T-033 adds a narrow taskintf.cc motion bridge for emcMotionInit()/emcMotionUpdate()/emcMotionAbort() over lcmot_*, including lcmot_read_config_snapshot() and lcmot_read_error_message() for config/error reads. T-034 extends the taskintf.cc traj control subset so emcTrajEnable()/emcTrajDisable()/emcTrajAbort()/emcTrajPause()/emcTrajStep()/emcTrajResume()/emcTrajSetMotionId() map to lcmot command/state. T-035 maps emcTrajLinearMove() to structured lcmot_write_linear_move() instead of task-owned linear move JSON on the taskintf path. T-036 maps emcJogIncr()、emcJointHome()、emcJointUnhome() and emcMotionSetAout() to structured lcmot_write_jog_incr()、lcmot_write_joint_home()、lcmot_write_joint_unhome() and lcmot_write_aout(). T-037 maps emcTaskAbort()、emcTaskSetMode() and emcTaskSetState() into the emctask.cc subset so abort/state/mode decisions come from a source-anchored command result while task-cycle command buffering remains intact. T-038 feeds determineMode()、determineState() and emcTaskUpdate() from LcmotStatusSnapshot plus the IO estop/error latch instead of deriving update inputs from task-owned state strings. T-039 maps emcTaskPlanSetWait()、emcTaskPlanIsWait()、emcTaskPlanClearWait()、emcTaskPlanSynch()、emcTaskPlanOpen()、emcTaskPlanClose() and emcTaskPlanReset() into the emctask.cc subset so plan wait/open/synch/reset state is driven by source-anchored plan results over the staged FS boundary. T-040 maps emcTaskPlanRead()、emcTaskPlanExecute()、emcTaskPlanLine()、emcTaskPlanLevel() and emcTaskPlanCommand() into the emctask.cc subset so staged program lines can drive the interp_list/taskintf path without requiring host-provided JSON motion plans. It now has task-cycle motion snapshots, WAITING_FOR_MOTION/queue semantics, motion ERROR and soft-limit injection coverage, and top/task/motion/io DONE/EXEC/ERROR aggregation matching the emctaskmain.cc top-level status order. T-029 deliberately keeps full emc_nml.hh out of the vendor tree and records a phased StandaloneEmcStatus/typedef path while NML transport remains unpromoted. Full emctaskmain.cc/NML/native HAL/native motion process topology is not promoted. task_hal_runtime_promoted=0, nativeTaskReady=false, nativeHalSyncReady=false, and fullLinuxCncProgramExecutionReady=false are the current readiness contract. Hardware drive, host realtime kernel, external user-M process, full tool DB process, and full LinuxCNC program execution remain future work. |
tools/verify_task_full_closure.sh; tools/verify_task_status_json_contract.sh; tools/verify_task_standalone_emc_status.sh; tools/verify_task_working_closure.sh; tools/verify_task_hal_readiness_contract.sh; tools/verify_task_emc_nml_reuse_plan.sh; tools/verify_task_source_reuse_drift_docs.sh; tools/verify_task_emctask_state_mode.sh; tools/verify_task_emctask_update_snapshot.sh; tools/verify_task_emctask_plan_open_wait.sh; tools/verify_task_emctask_plan_read_execute.sh; tools/verify_task_taskintf_motion_bridge.sh; tools/verify_task_taskintf_traj_control.sh; tools/verify_task_taskintf_linear_move.sh; tools/verify_task_taskintf_jog_home_switchkins.sh; tests/wasm/node/verify_task_status_json_contract.mjs; tests/wasm/node/verify_task_hal_wasm.sh; tests/wasm/node/verify_task_hal_sdk.sh; web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs; browser smoke |
| Task/motion/HAL simulation runtime T-041 canon state | src/emc/task/emccanon.cc init/finish/unit/getter references |
Runtime-edge adapter, not full native canon promotion | T-041 maps INIT_CANON()、ON_RESET()、FINISH()、USE_LENGTH_UNITS()、GET_EXTERNAL_LENGTH_UNITS()、GET_EXTERNAL_ANGLE_UNITS() and GET_EXTERNAL_POSITION*() into the emccanon.cc subset so canonical units, reset/finish counters, and external endpoint state are tracked from motion/config snapshots and surfaced through task status JSON without promoting full interpreter/canon ownership. |
tools/verify_task_emccanon_init_finish_unit.sh; tests/wasm/node/verify_task_hal_wasm.sh |
| Task/motion/HAL simulation runtime T-042 canon straight motion | src/emc/task/emccanon.cc straight traverse/feed references |
Runtime-edge adapter, not full native canon promotion | T-042 maps generate_fast_move()、generate_move()、STRAIGHT_TRAVERSE() and STRAIGHT_FEED() into the emccanon.cc subset so canonical straight traverse/feed calls produce EMC_TRAJ_LINEAR_MOVE evidence on the task interp_list path before crossing into the structured taskintf.cc / lcmot_write_linear_move() motion boundary. |
tools/verify_task_emccanon_straight_motion.sh; tests/wasm/node/verify_task_hal_wasm.sh |
| Task/motion/HAL simulation runtime T-043 canon dwell/path-control | src/emc/task/emccanon.cc dwell and term-condition references |
Runtime-edge adapter, not full native canon promotion | T-043 maps DWELL() and SET_MOTION_CONTROL_MODE() into the emccanon.cc subset so canonical dwell emits EMC_TRAJ_DELAY evidence and path-control emits EMC_TRAJ_SET_TERM_COND evidence on the task interp_list path without promoting full native canon blending, queue, or NML ownership. |
tools/verify_task_emccanon_dwell_path_control.sh; tests/wasm/node/verify_task_hal_wasm.sh |
| Task/motion/HAL simulation runtime T-044 canon spindle/tool | src/emc/task/emccanon.cc spindle and tool command references |
Runtime-edge adapter, not full native canon promotion | T-044 maps SET_SPINDLE_SPEED()、START_SPINDLE_CLOCKWISE()、START_SPINDLE_COUNTERCLOCKWISE()、STOP_SPINDLE_TURNING()、SELECT_TOOL()、CHANGE_TOOL()、CHANGE_TOOL_NUMBER() and RELOAD_TOOLDATA() into the emccanon.cc subset so spindle/tool command envelopes emit EMC_SPINDLE_* and EMC_TOOL_* / interp_list evidence without promoting full native spindle control, tool DB ownership, IO, or NML transport. |
tools/verify_task_emccanon_spindle_tool.sh; tests/wasm/node/verify_task_hal_wasm.sh |
| Task/motion/HAL simulation runtime T-045 canon motion output/switchkins | src/emc/task/emccanon.cc motion output and wait references |
Runtime-edge adapter, not full native canon promotion | T-045 maps SET_MOTION_OUTPUT_BIT()、CLEAR_MOTION_OUTPUT_BIT()、SET_AUX_OUTPUT_BIT()、CLEAR_AUX_OUTPUT_BIT()、SET_MOTION_OUTPUT_VALUE()、SET_AUX_OUTPUT_VALUE() and WAIT() into the emccanon.cc subset so M62-M68/M66 command envelopes emit EMC_MOTION_SET_DOUT、EMC_MOTION_SET_AOUT and EMC_AUX_INPUT_WAIT / interp_list evidence. M428-M430 now enter through canon SET_AUX_OUTPUT_VALUE() before crossing the existing taskintf.cc emcMotionSetAout() / lcmot_write_aout() boundary for switchkins; full native digital IO, analog IO wait semantics, queue ownership, and NML transport remain unpromoted. |
tools/verify_task_emccanon_motion_output.sh; tests/wasm/node/verify_task_hal_wasm.sh |
| Task/motion/HAL simulation runtime T-046 no-JSON main RUN path | src/emc/task/emctask.cc, src/emc/task/emccanon.cc, and src/emc/task/taskintf.cc plan/canon/issue references |
Runtime-edge adapter, not full native task promotion | T-046 removes host-provided JSON motion plans from the primary RUN validation path. The default staged-program path now proves emcTaskPlanRead() / emcTaskPlanCommand() / emcTaskPlanExecute() through emccanon.cc command envelopes and taskintf.cc motion issue without calling lctask_load_program_motion_plan_json(). loadProgramMotionPlan() remains exposed only as a timed-plan compatibility/debug SDK entry with separate tests, not as the main program execution path. |
tools/verify_task_no_json_motion_plan_main_path.sh; tests/wasm/node/verify_task_hal_wasm.sh; tests/wasm/node/verify_task_hal_sdk.sh; tests/wasm/node/verify_task_state_matrix.mjs |
| Identity/trivial kinematics | src/emc/kinematics/kinematics.h, cubic.h, kins_util.c, trivkins.c |
Copy unchanged | HAL component lifecycle and RTAPI module metadata are replaced by standalone shims; forward/inverse mapping behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, linuxcnc_kinematics_probe |
| Switchable 5-axis bridge kinematics | src/emc/kinematics/5axiskins.c, switchkins.c, switchkins.h, userkfuncs.c, plus src/rtapi/rtapi_ctype.h |
Copy unchanged | HAL pin allocation, HAL component lifecycle, and RTAPI module metadata are standalone runtime edges; switchable 5-axis forward/inverse behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, linuxcnc_5axis_kinematics_probe |
| TRT table-rotary kinematics | src/emc/kinematics/trtfuncs.c, xyzac-trt-kins.c, xyzbc-trt-kins.c |
Copy unchanged | HAL pin allocation and switchkins lifecycle stay runtime boundaries; XYZAC/XYZBC TRT forward/inverse behavior remains LinuxCNC source | Vendor byte sync, per-file source probes, linuxcnc_xyzac_trt_kinematics_probe, linuxcnc_xyzbc_trt_kinematics_probe |
| Five-axis switchkins machine configs and M428/M429/M430 remaps | configs/sim/axis/vismach/5axis/bridgemill/*, table-dual-rotary/*, and table-rotary-tilting/* selected INI, HAL, tool-table, XML, demo, and remap_subs/*.ngc files plus src/emc/rs274ngc/interp_remap.cc |
Copy unchanged | M428, M429, and M430 remain LinuxCNC REMAP entries that call LinuxCNC NGC subroutines using M68, M66, _hal[motion.switchkins-type], and the INI/HAL motion.analog-out-03 => motion.switchkins-type link; standalone remap descriptor parsing routes through vendored Interp::parse_remap() and find_ngc_file(), and NGC remap/file execution routes through vendored LinuxCNC O-word and open()/read()/execute() paths while HAL synchronization stays a runtime adapter boundary |
Vendor byte sync, linuxcnc_5axis_remap_asset_probe, linuxcnc_remap_parse_harness, linuxcnc_remap_hal_sync_harness, linuxcnc_5axis_remap_execute_harness, tests/wasm/node/verify_interp_wasm.sh, tests/wasm/node/verify_sim_configs_wasm.sh, tests/browser/verify_interp_browser.sh, tests/browser/verify_ini_panel_browser.sh |
| Representative sim-config machine programs | configs/sim/axis/foam/*, configs/sim/axis/geometry/M110, xyzc.ini, xyzc.ngc, configs/sim/axis/external_offsets/M111, dyn_demo.ngc, dynamic_offsets.ini, eoffsets.ngc, eoffsets.ini, jwp_z.ngc, jwp_z.ini, opa_demo.ngc, opa.ini, circles.ngc, eoffset.tbl, configs/sim/axis/sim.tbl, configs/sim/axis/gladevcp/gladevcp_panel.ini, probe.ngc, sim.tbl, configs/sim/axis/vismach/melfa-sim/*, selected configs/sim/axis/vismach/puma/*, and configs/sim/woodpecker/on_abort.ngc, tool.tbl, woodpecker.ini |
Copy unchanged | The foam, xyzc, external-offset, plain gladevcp/probe.ngc, melfa-sim, PUMA, and deterministic woodpecker/on_abort.ngc sample programs remain LinuxCNC sim-config assets. The standalone boundary only copies INI, tool table, G-code, executable user-M files, SUBROUTINE_PATH files, and remap-NGC files into the native or WASM filesystem, then calls vendored LinuxCNC INI parsing and Interp::open()/read()/execute() or the existing five-axis remap execution C ABI through the machine-config adapter. The native sim-config harness now prefers [DISPLAY]OPEN_FILE when several INI files live beside a program, so each program is judged with its corresponding machine context. The JS SDK planIniFileContextStaging() is a generic manifest-based file-plan helper, planSimConfigStaging() is its configs/sim wrapper, and runSimConfigProgram() only writes caller-provided text files to the Emscripten filesystem, applies executable bits, and forwards to LinuxCNC-backed C ABI entry points. M110/M111 process execution stays a runtime boundary represented by deterministic USER_M_COMMAND canonical events, while GUI driver, HAL process launch, and external userspace process startup remain outside standalone Node/browser execution. The TWP table-rotary_spindle-rotary-nutating demo family remains outside this representative row because its Layer 4 promotion still depends on a deliberate Python-remap runtime boundary, not on additional JS-owned staging logic. |
Vendor byte sync, tests/native/verify_sim_configs.sh, tests/wasm/node/verify_sim_configs_wasm.sh, tests/wasm/node/verify_sim_configs_inventory_wasm.sh, tests/browser/verify_interp_browser.sh, tests/host/verify_host_smokes.sh |
| Sim-config inventory and blocked-boundary assets | Selected configs/sim/axis/db_demo/*, axis/rose_engine/*, axis/vismach/millturn/*, configs/sim/qtdragon/*, configs/sim/qtdragon_hd/*, and configs/sim/qtvcp_screens/qtdragon/* files |
Copy unchanged | These assets are vendored for the machine-readable configs/sim Node inventory and blocked-boundary accounting. Eligible on_abort and plain INI/tool-table rows run through the same LinuxCNC-backed runSimConfigProgram() staging path as other sim-config samples. Rows such as axis/db_demo/base.ngc and axis/vismach/millturn/example.ngc remain explicit Layer 4 blocked entries because their native LinuxCNC configs depend on tool-database or external user-M process boundaries; Node/browser inventory records those dependencies instead of reducing them to standalone file execution. |
Vendor byte sync, tests/native/verify_sim_configs.sh, tests/wasm/node/verify_sim_configs_inventory_wasm.sh, tests/host/verify_host_smokes.sh |
Representative nc_files examples |
nc_files/3D_Chips.ngc, nc_files/arcspiral.ngc, nc_files/factorial.ngc, nc_files/hole-circle.ngc, nc_files/m6demo.ngc |
Copy unchanged | These upstream linuxcnc/nc_files examples are copied byte-for-byte into the WASM vendor tree after the native nc_files harness classifies the broader directory. Node and browser tests only stage the original .ngc text and, for 3D_Chips.ngc, the minimal INI-declared tool table context required by its upstream T1 M6 line in the Emscripten filesystem, then call the LinuxCNC-backed Interp::open(), read(), and execute() path through the existing SDK; no G-code, O-word, tool-change, or M-code behavior is implemented in JavaScript |
Vendor byte sync, tests/native/verify_nc_files.sh, tests/wasm/node/verify_nc_files_wasm.sh, tests/browser/verify_interp_browser.sh, tests/host/verify_host_smokes.sh |
| LinuxCNC remap regression fixtures | tests/remap/duplicate-o-word/*, tests/remap/fail/args.0/*, tests/remap/fail/args.1/*, tests/remap/fail/args.2/*, tests/remap/fail/body-ngc/*, tests/remap/m30-interaction/*, tests/remap/nested-remaps-oword/*, tests/remap/posargs.0/*, tests/remap/sequencing/*, selected NGC-only tests/remap/remap-io/test-ngc.ini plus io_*.ngc, and src/emc/rs274ngc/interp_remap.cc plus interp_o_word.cc |
Copy unchanged | The upstream duplicate O-word, NGC-only remap failure, M30/remap-level interaction, nested O-word remap, positional-argument remap, G/M remap sequencing, and remap-IO NGC subroutine regressions remain LinuxCNC REMAP/O-word/file or MDI execution tests. The standalone boundary only copies the upstream test files into native or WASM filesystems, reads LinuxCNC INI SUBROUTINE_PATH, REMAP, and OWORD_NARGS entries, and calls vendored Interp::parse_remap(), open(), read(), and execute() or feeds the upstream remap-IO MDI sequence into vendored Interp::execute(); the continue-on-error runner path only mirrors LinuxCNC rs274 -n 0 test execution and does not implement duplicate-label, O-word, nested remap, M30, positional-argument, failure, sequencing, M62-M68, M66 input, or remap semantics |
Vendor byte sync, linuxcnc_duplicate_oword_remap_harness, tests/wasm/node/verify_interp_wasm.sh, tests/browser/verify_interp_browser.sh |
| LinuxCNC interpreter regression fixtures | tests/interp/do-while-break/*, tests/interp/oword-bug315/*, tests/interp/oword-bug315-p2/*, tests/interp/exists/*, tests/interp/return-value/*, tests/interp/subs-follow-main/*, tests/interp/fractional-linenumbers/*, tests/interp/cam-nisley/*, tests/interp/namedparam-bug424/*, tests/interp/flowsnake/*, selected tests/interp/good/*.ngc center-format arc tolerance fixtures, tests/interp/g6164/*, tests/interp/inside-corners/*, tests/interp/inverse-time-with-comp/*, selected tests/ccomp/* standalone cutter-compensation fixtures, selected tests/interp/bad/*.ngc file-error fixtures, tests/interp/g33.1/*, selected tests/interp/g71-*/* and tests/interp/g72-*/* lathe canned-cycle fixtures, tests/interp/g76/*, tests/interp/g10/*, tests/interp/g52/g52-g92-interaction/*, selected tests/interp/rotation/* pure interpreter cases, tests/interp/iniparam/*, tests/interp/iniparam-failassign/*, tests/interp/m19/*, tests/interp/magic_comments/param_format_printing/*, selected tests/interp/m98m99/* pure interpreter cases, tests/interp/sub-call-from-sub/*, tests/interp/sequence-number/*, tests/interp/nested-sub-error/*, tests/interp/nested-sub-in-file-error/*, tests/interp/oword-unwind/*, tests/interp/abort-hot-comment/*, plus vendored interpreter/O-word sources including interp_o_word.cc, interp_read.cc, interp_execute.cc, interp_find.cc, interp_namedparams.cc, and rs274ngc_pre.cc |
Copy unchanged | The upstream do/while/break, O-word bug315, EXISTS[], subroutine return-value, subs-after-main, fractional line-number, storm-door latch cam toolpath with upstream tool-table context, named-parameter, recursive O-word flowsnake toolpath, selected center-format arc tolerance acceptance/rejection cases, G61/G64 path-control and naive-cam tolerance behavior, cutter-compensation concave/convex/tangent geometry, inverse-time feed and cutter-compensation interaction, selected standalone cutter-compensation file execution with upstream tool tables, selected file-execution error cases including canned-cycle A-axis rejection, center-format arc radius mismatch rejection, cutter-compensation arc-exit/gouging rejection, and malformed EXISTS[], rigid-tap G33.1, G71/G72 lathe canned-cycle iteration behavior, G76 lathe threading with upstream tool-table context, G10 L1/L10/L11/L2/L20 tool-table/offset/G5X/G92/rotation regressions, G52/G92 shared-offset interaction, selected rotation/G53/G28 absolute-position and endpoint, INI named-parameter lookup/read-only protection, M19 spindle-orient offset/timeout handling, magic-comment parameter formatting, selected Fanuc M98/M99 call, loop, missing-P-word, missing-subprogram, mixed Fanuc/RS274NGC sub-style, DISABLE_FANUC_STYLE_SUB, main-program O-word termination, and O-expression regressions, external-subroutine-call, external-subroutine line-number, nested-subroutine-definition rejection, blocked forward-seek-to-later-numbered-sub, O-word stack unwind after a subroutine error, (ABORT,...) hot-comment parameter-expansion regressions, and INI-declared G92 parameter-file startup persistence remain LinuxCNC interpreter file-execution or initialization tests. The standalone boundary only vendors the original upstream assets, copies *.ngc, test.ini, test.tbl, subs/*.ngc, referenced external subroutine .ngc files, and staged variable files into native or WASM filesystems where applicable, sets the LinuxCNC INI_FILE_NAME runtime edge for _ini[...], applies LinuxCNC INI machine settings such as [RS274NGC]ORIENT_OFFSET, loads upstream tool tables through LinuxCNC tooldata_load()/Interp::load_tool_table(), reads LinuxCNC INI SUBROUTINE_PATH, passes [RS274NGC]PARAMETER_FILE through vendored ini_load()/Interp::init()/restore_parameters() when the staged variable file exists, captures LinuxCNC (PRINT,...) output through the existing stdout/Emscripten print boundary, and calls vendored Interp::open(), read(), and execute(); it does not implement O-word loop, break, unwind, subroutine, dynamic call, M98/M99, EXISTS[], named-parameter, canned-cycle, cutter-compensation, inverse-time feed, recursive O-word or cam toolpath generation, path-control, naive-cam tolerance, arc tolerance, threading, rigid tap, G10, G52/G92 offset behavior, G92 persistence, tool-offset, absolute-position named-parameter, G28/G53 endpoint, INI-variable, read-only parameter, line-number, spindle-speed, spindle-orient, magic-comment formatting, subroutine lookup, ABORT hot-comment, error, or branch semantics |
Vendor byte sync, linuxcnc_interp_minimal_harness, tests/wasm/node/verify_interp_wasm.sh, tests/browser/verify_interp_browser.sh |
| Additional non-switchable kinematics | src/emc/kinematics/corexykins.c, rotatekins.c, rosekins.c, maxkins.c, lineardeltakins.c, lineardeltakins-common.h, rotarydeltakins.c, rotarydeltakins-common.h, scorbot-kins.c, tripodkins.c, scarakins.c, pumakins.c, pumakins.h, genhexkins.c, genhexkins.h, genserfuncs.c, genserkins.c, genserkins.h, ugenserkins.c, pentakins.c, pentakins.h, cubic.c |
Copy unchanged | HAL pin allocation, HAL parameter allocation, HAL component lifecycle, RTAPI module metadata, Go math C/C++ linkage, switchkins iterative-forward warmup, and userspace test-program process entry remain standalone runtime edges; forward/inverse behavior remains LinuxCNC source where the module exposes it | Vendor byte sync, per-file source probes, linuxcnc_corexy_kinematics_probe, linuxcnc_rotate_kinematics_probe, linuxcnc_rose_kinematics_probe, linuxcnc_max_kinematics_probe, linuxcnc_lineardelta_kinematics_probe, linuxcnc_rotarydelta_kinematics_probe, linuxcnc_scorbot_kinematics_probe, linuxcnc_tripod_kinematics_probe, linuxcnc_scara_kinematics_probe, linuxcnc_puma_kinematics_probe, linuxcnc_genser_kinematics_probe, linuxcnc_genhex_kinematics_probe, linuxcnc_pentakins_kinematics_probe |
| Trajectory planner | src/emc/tp/tp.c, tc.c, tcq.c, spherical_arc.c, blendmath.c, sp_scurve.c, ruckig_wrapper.c, plus matching *.h files |
Copy unchanged | Native realtime scheduling and motion process state are replaced by standalone probe setup; the WASM TP probe uses the same deterministic status/config boundary and calls vendored TP APIs through a narrow C ABI | Vendor byte sync, per-file source probes, linuxcnc_tp_api_probe, tests/wasm/node/verify_tp_wasm.sh |
| Ruckig C planner support | Selected src/emc/tp/cruckig/*.c and *.h files in the manifest |
Copy unchanged | Used as LinuxCNC planner support code through vendored TP sources | Vendor byte sync, per-file source probes, tests/wasm/node/verify_tp_wasm.sh |
| Posemath | src/libnml/posemath/posemath.cc, _posemath.c, gomath.c, sincos.c, and matching headers |
Copy unchanged | gomath.c is compiled as C; rtapi.h shim is C/C++ compatible for this boundary |
Vendor byte sync, per-file source probes, TP native and WASM probes |
| RS274 interpreter state and parser | src/emc/rs274ngc/modal_state.*, interp_internal.*, interp_read.cc, interp_check.cc, interp_execute.cc, interp_find.cc, interp_array.cc, interp_queue.*, rs274ngc*, units.h |
Copy unchanged | Python/remap/runtime edges are isolated in standalone wrappers and shims; parser and execution logic remain LinuxCNC source | Vendor byte sync, per-file source probes, interpreter harness fixtures |
| RS274 conversion semantics | src/emc/rs274ngc/interp_convert.cc, interp_arc.cc, interp_inverse.cc, interp_cycles.cc, interp_g7x.cc, interp_o_word.cc, interp_write.cc |
Copy unchanged | Canonical calls are captured by standalone event sink functions; conversion behavior stays in vendored LinuxCNC files; feed-rate state is read back through the canonical runtime boundary during length-unit conversion; single-axis rotary indexer lock/unlock dispatch remains vendored LinuxCNC issue_straight_index() behavior |
Vendor byte sync, per-file source probes, canonical fixture suite, no standalone Interp::convert_g() guard, linuxcnc_indexer_harness, tests/wasm/node/verify_interp_wasm.sh and tests/browser/verify_interp_browser.sh rotary-indexer assertions |
| User M-code registration boundary | src/emc/task/emctask.cc, src/emc/rs274ngc/interp_convert.cc, src/emc/rs274ngc/interp_queue.cc |
Runtime-edge adapter | Vendored interpreter conversion still checks LinuxCNC USER_DEFINED_FUNCTION before accepting M100..M199 and queues through vendored enqueue_M_USER_COMMAND(). The standalone machine-config adapter mirrors LinuxCNC task search order for [DISPLAY]PROGRAM_PREFIX and [RS274NGC]USER_M_PATH, registers executable M-code files in USER_DEFINED_FUNCTION, calls the canonical FINISH() boundary, and records deterministic USER_M_COMMAND events instead of spawning host processes in WASM/browser. |
linuxcnc_interp_minimal_harness sim M110/M111 probes, tests/wasm/node/verify_interp_wasm.sh minimal M110/M111 fixtures |
| Named parameters and tool slot status | src/emc/rs274ngc/interp_namedparams.cc, related interpreter headers |
Copy unchanged | _ini[...] and _hal[...] resolve through standalone INI/HAL adapters while lookup order stays LinuxCNC-derived; current/selected tool slot reads for vendored Interp::synch() come from the standalone tool adapter |
Vendor byte sync, source probe, linuxcnc_namedparam_harness, linuxcnc_interp_init_harness, tests/wasm/node/verify_interp_wasm.sh and tests/browser/verify_interp_browser.sh Interp::synch() tool-slot assertions plus Interp::init_named_parameters()/find_named_param() named-parameter lookup assertions |
| Tool table parsing and formatting | src/emc/tooldata/tooldata_common.cc |
Copy unchanged plus standalone storage callbacks | Native file parsing/formatting stays in vendored LinuxCNC source; the standalone tool adapter supplies tooldata_get()/tooldata_put() storage and index lookup, the WASM boundary only selects the LinuxCNC non-random or random-toolchanger branch via tooldata_init(), and OPFS remains a host-side persistence boundary |
Vendor byte sync, linuxcnc_tooldata_common_source_probe, tests/wasm/node/verify_interp_wasm.sh non-random/random load/save tool-table assertions |
| Dynamic interpreter base | src/emc/rs274ngc/interp_base.* |
Copy unchanged | interp_base.cc source probe uses standalone EMC2_HOME compile-time path boundary for LinuxCNC dynamic interpreter lookup |
Vendor byte sync, linuxcnc_interp_base_source_probe |
Dependency Matrix
| Dependency | LinuxCNC files that expose it | Standalone treatment |
|---|---|---|
| Native file IO | inifile.cc, rs274ngc_pre.cc, tooldata_common.cc, parameter file paths, tool table paths |
Allowed in native probes; the interpreter WASM C ABI validates direct parameter-file restore/save by calling vendored Interp::restore_parameters() and Interp::save_parameters(), validates startup G92 parameter persistence by passing staged [RS274NGC]PARAMETER_FILE paths through vendored ini_load()/Interp::init()/restore_parameters(), including missing required numeric parameter defaulting and DISABLE_G92_PERSISTENCE, and validates tool-table load/save by calling vendored tooldata_load() and tooldata_save() against Emscripten filesystem paths; browser OPFS remains a host-side adapter under runtime/opfs/, with path ownership in runtime/opfs/path-model.js, generic snapshot persistence in runtime/opfs/snapshot-store.js, pure-text machine-file persistence in runtime/opfs/machine-file-store.js, OPFS-to-WASM parameter-file copying in runtime/opfs/linuxcnc-parameter-bridge.js, OPFS-to-WASM tool-table copying in runtime/opfs/linuxcnc-tool-table-bridge.js, and grouped INI/parameter/tool-table session loading in runtime/opfs/linuxcnc-machine-session-bridge.js, including INI-derived [RS274NGC]PARAMETER_FILE and [EMCIO]TOOL_TABLE OPFS filename selection through the LinuxCNC-backed INI SDK; explicit host session file-name options take precedence over INI-derived names, missing INI file-name values fall back to host default linuxcnc.var and tool.tbl paths, and OPFS path validation rejects traversal and nested segments before host storage access |
| RTAPI | rtapi_*.h, TP, posemath, motion headers |
Minimal standalone shim in runtime/core/shims/rtapi.h |
| NML transport | emc.hh, motion/NML type headers |
Transport is not ported; only the status/type edges needed by vendored compute code are exposed through standalone shims and probes |
| HAL runtime | named parameter lookup, kinematics component lifecycle, and runtime status edges | Existing kinematics/interpreter HAL adapter remains under runtime/core/linuxcnc_wrap/linuxcnc_hal_adapter.cpp; phase 2 task-HAL work adds linuxcnc_hal_runtime.cpp for owned pin/signal/param/net/thread scheduler state, still unpromoted for native HAL sync |
| User M-code process execution | emctask.cc, interp_convert.cc, interp_queue.cc |
Search and registration are mirrored at the standalone machine-config boundary; native/WASM tests record deterministic USER_M_COMMAND events and do not spawn host processes |
| Python/remap | rs274ngc_pre.cc, interp_o_word.cc, interp_remap.cc, remap hooks, selected LinuxCNC configs/sim/axis/vismach/5axis/*/remap_subs/*.ngc files, tests/remap/duplicate-o-word/*, tests/remap/fail/args.0/*, tests/remap/fail/args.1/*, tests/remap/fail/args.2/*, tests/remap/fail/body-ngc/*, tests/remap/m30-interaction/*, tests/remap/nested-remaps-oword/*, tests/remap/posargs.0/*, tests/remap/sequencing/*, and NGC-only tests/remap/remap-io/test-ngc.ini plus io_*.ngc |
Python calls remain stubbed at the runtime boundary today; five-axis M428/M429/M430 source assets and the upstream NGC remap regression files are vendored unchanged. NGC remap descriptor paths parse through vendored LinuxCNC code, native/WASM/browser validation executes the NGC remap files through vendored LinuxCNC O-word and file execution paths, and the remap-IO NGC-only branch feeds the upstream MDI sequence into vendored LinuxCNC Interp::execute() while external M66 input values and _hal[...] synchronization remain standalone runtime adapter boundaries |
| Canonical machine actions | interp_convert.cc, interp_execute.cc, interp_queue.cc, selected tests/interp/* regression assets |
Captured by standalone canonical event sink functions for regression fixtures; vendored upstream interpreter test assets remain unchanged and are executed through LinuxCNC file execution |
| Realtime scheduling | TP and motion headers | Not ported; native TP probes seed deterministic status/config state |
| GUI | None used as implementation | Native LinuxCNC GUI remains reference-only |
Known Gaps
- Additional non-trivial kinematics implementation files are now extracted at
source-probe level. Serial
genserkins, hexapodgenhexkins, and pentapodpentakinshave native runtime baselines; full runtime machine baselines for userspace genser flows are not yet established. - Five-axis M428/M429/M430 source assets are now vendored for bridge-mill,
dual-rotary, and table-rotary-tilting LinuxCNC sample machines. NGC remap
descriptors for the TRT, TDR, and bridge-mill sample machines are parsed
through vendored
Interp::parse_remap()andfind_ngc_file()bylinuxcnc_remap_parse_harness; native, WASM Node, browser interpreter, and INI panel UI validation execute the selected switchkins demo files through vendored LinuxCNC O-word remap dispatch, fileopen()/read()/execute(), and the standalone HAL adapter boundary forM68/M66plus_hal[motion.switchkins-type]readback. - Cutter compensation positive motion and negative interpreter paths are
fixture-covered through vendored
interp_convert.ccandinterp_queue.cc. - Browser/WASM C ABI and JS SDK layers are now present for the INI parser, the
current interpreter-core smoke scope, and a trajectory-planner TP probe. The interpreter SDK is a thin
allocation, filesystem, and C ABI wrapper over vendored LinuxCNC execution
paths, including parameter-file restore/save through vendored
rs274ngc_pre.ccand non-random/random tool-table load/save through vendoredtooldata_common.cc; it does not define G-code, parameter, or tool-table semantics. The TP WASM probe calls vendored LinuxCNC planner APIs directly and does not expose a browser planner SDK yet; full planner/session SDK coverage remains future work. - OPFS persistence is connected to the INI panel through the host-side
runtime/opfs/file-service.jsadapter.runtime/opfs/path-model.jsnow defines paths for INI, tool table, parameter file, G-code program, preview-cache, and session-snapshot targets.runtime/opfs/snapshot-store.jsadds a generic JSON session snapshot envelope, supports custom snapshot filenames under the session directory, and validates its format, version, session id, metadata, payload shape, and filename boundary.runtime/opfs/machine-file-store.jsadds pure-text storage for INI, tool table, parameter file, and G-code program content, with G-code program filenames constrained byruntime/opfs/path-model.js.runtime/opfs/linuxcnc-parameter-bridge.jscopies OPFS-backed parameter files into the interpreter SDK filesystem and writes back the LinuxCNC-saved parameter file plus backup.runtime/opfs/linuxcnc-tool-table-bridge.jscopies OPFS-backed tool tables into the interpreter SDK filesystem and writes back the LinuxCNC-saved tool table.runtime/opfs/linuxcnc-machine-session-bridge.jsgroups INI, parameter, and tool-table loading into one host-side session load boundary and can derive the random-toolchanger tooldata mode from[EMCIO]RANDOM_TOOLCHANGERplus parameter/tool-table OPFS file names from[RS274NGC]PARAMETER_FILEand[EMCIO]TOOL_TABLEthrough the LinuxCNC-backed INI SDK. Explicit host session file-name options take precedence over those INI-derived names, missing INI file-name values fall back to the default host path model, and invalid traversal or nested file names are rejected byruntime/opfs/path-model.js. Full machine-state restoration remains future work. - Native LinuxCNC GUI code remains out of scope for implementation.
- Native task/motion/HAL sync remains a partial Web simulation adapter, not a
full LinuxCNC task/HAL promotion. Phase 0 source/probe gates, phase 2 HAL
registry, phase 3 motion/HAL servo-cycle C ABI, phase 4 task shim, SDK
wrapper, machine-file session handoff, Worker/client files, store action
mapping, diagnostics, and narrow
emctask.cc/taskintf.cc/emccanon.ccsource-anchored subsets are present. Motion ERROR/soft-limit injection, task/top-level RCS DONE/EXEC/ERROR aggregation, and theemc_nml.hhreuse decision are documented and gated, but the status container is still a phased standalone boundary rather than a directEMC_STATinclude. The readiness fields intentionally staynativeTaskReady=false,nativeHalSyncReady=false, andfullLinuxCncProgramExecutionReady=falseuntil full native task cycle, native HAL sync, and full LinuxCNC program execution are implemented and independently verified.