# flowrs-instruments: where the ported material came from flowrs-instruments is Apache-2.0. Most of it is flowRS's own. What came from elsewhere: ## The simulated bench (`src/sim/`), from LabCraft LabCraft (, "a graphical dataflow programming language and IDE, built in pure Rust") is MIT OR Apache-2.0 (its `Cargo.toml`, `NOTICE`, `LICENSE-MIT`, `LICENSE-APACHE`). Read at commit `22b8dff` (2026-11-08). flowRS takes it under the MIT licence; the notice is in `LICENSES/LabCraft-MIT.txt`, and both of its licence texts sit beside the copied files in `data/sim/labcraft/`. | flowRS file | Came from | What was taken | Licence | |---|---|---|---| | `data/sim/labcraft/*.toml` | `libs/visa/sim/*.toml` | Copied unchanged: the fifteen simulated benches | MIT | | `data/sim/labcraft/LICENSE-MIT`, `LICENSE-APACHE` | `LICENSE-MIT`, `LICENSE-APACHE` | Copied unchanged | — | | `src/sim/noise.rs` | `libs/visa/simulation.md` §3; `SplitMix64` in `tools/lcf-poc/lcfpoc/sim.py` | The noise generator and the sum of twelve uniforms, bit for bit | MIT | | `src/sim/time.rs` | `simulation.md` §3–4 | The clock in whole nanoseconds, the conversion of a time, the six-decimal answer | MIT | | `src/sim/file.rs` | `simulation.md` §1–3, §5, §7; `check_keys`, `number`, `text`, `table`, `array`, `error_entry`, `command_key`, `Quantity.__init__`, `Instrument.__init__`, `World.load`, `World.check_sources` in `sim.py` | The file's keys, their types and ranges, and the refusals `visa:S001`…`visa:S011` with their meaning | MIT | | `src/sim/instrument.rs` | `simulation.md` §3–4; `Quantity.own_value`, `true_value`, `read`, `set`, `Instrument.push_error`, `execute`, `command_text` in `sim.py` | A quantity's true value and its ramp, a write that starts a move, the order a command is answered in, the error queue and its overflow | MIT | | `src/sim/mod.rs` | `simulation.md` §4, §6, §9; `World.open`, `wait`, `advance` in `sim.py`; `_send`, `_receive` in `tools/lcf-poc/lcfpoc/stdlib.py` | Sessions, `-410` for an unread answer, the read that waits for its timeout, VISA's error codes, `describe` | MIT | | `src/sim/tests.rs` | `class Simulation` in `tools/lcf-poc/tests/test_poc.py` | The cases of its tests (the refusal table, the answers of §4, the clock, the ramp), rewritten for this code; the expected values are LabCraft's own published ones and those of `tools/benchsim/oracle.py`, an independent reckoning written from the spec | MIT | | `spec/flowrs-bench-sim-1.md` §1–10 | `simulation.md` §1–10 | The contract, adapted: LabCraft's text where flowRS behaves as LabCraft does | MIT | What flowRS added (spec §11): SCPI matching, a catalogue `model` and `follows`, `scale`, `offset`, `clamp`, `min`/`max`, ranges and overload, switches and `routes`, waveforms and statistics, `faults.delay` and `faults.hang_ms`, `queue_depth`, `reset`, the strict LabCraft reading, and every `sim:` code. None of it is in LabCraft. ## pyvisa-sim's file format (`src/sim/pyvisa.rs`) pyvisa-sim () is MIT. The reader follows its YAML format (spec 1.0 and 1.1: devices, dialogues, properties with getters, setters and specs, error queues, status registers, resources) and its documented matching order. No code of it is copied; it is not linked, and flowRS's own `tools/scpi-sim/bench.yaml` is the file the tests read. The canonical SCPI form is the one `tools/scpi-sim/bridge.py` (flowRS's) applies. ## The catalogue (`data/*.json`) Facts from PyMeasure and python-ivi (both MIT): see `NOTICE`.