flowrs-engine/crates/flowrs-core/PROVENANCE.md
flowRS 2b6f30d348 flowRS engine, cut from flowRS f907e0756a7c
Built alone from an empty CARGO_HOME, its tests passed, and flowrsc checked, ran and exported a
document from the conformance corpus; the export built alone.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-10 08:54:33 -05:00

39 lines
2.2 KiB
Markdown

# Provenance
What flowrs-core takes from other projects, beyond the crates it depends on. Each module that
ports more than an idea says so here.
## Graph functions (`src/graph/function.rs`)
**Ideas only, no code copied.** The model is LabVIEW's subVI (a subgraph with a typed connector
pane, called from many diagrams), with three choices taken from elsewhere:
- boundary nodes for a function's inputs and outputs, each with a name, a type, a default and a
place in the signature: Unreal Engine's material functions (`FunctionInput`,
`FunctionOutput`, their `SortPriority` and preview value), from Epic's documentation;
- a call pins the exact version it was made against and a newer version sits beside it:
Houdini's digital assets (`name::version`) and APEX's graph functions, from SideFX's
documentation;
- recursion refused and the call depth bounded, at both tiers: LabCraft's `--max-call-depth`
(`docs/cli.md`), whose default of 1,024 is lower here (64) because flowRS's interpreter
recurses on the thread's stack.
## The station call tree (`src/graph/corpus/station_call_tree.fdsl`)
**Translated, no code copied:** LabCraft, <https://github.com/corail-labs/labcraft>, read at
commit `22b8dff`, MIT OR Apache-2.0 (`Cargo.toml`, `NOTICE`), its contributors' copyright.
The call tree and what each function does are LabCraft's example programs:
| here | there |
|---|---|
| `station@1`: steps run in turn, the run passes when each does | `examples/station.lcf` |
| `run_step@1`: set the supply, settle, compare the reading with the step's low and high limits | `examples/run_step.lcf` |
| `settle@1`: read, compare with the target within a tolerance (0.2 V at its call, as there) | `examples/settle.lcf` |
| `dmm_driver.read_dc_volts@1`: `MEAS:VOLT:DC?`, the answer in volts | `examples/dmm_driver/read_dc_volts.lcf` |
| `scpi.query_f64@1`: a query whose answer is a number | `libs/scpi/query_f64.lcf` |
Where this differs, on purpose: there is no VISA session, error wire, state machine or loop
(flowRS has none of the first three yet, and phase 1 refuses a held wire in a body), so settle
reads once, the station runs its two steps side by side, and the instrument is simulated as a
supply behind 0.05 ohm under a 0.5 A load, in place of LabCraft's simulation file.