Draw
Place blocks from the library navigator and join them with signal links. Subsystems nest beneath the top level, so a model stays readable as it grows.
ICore Blocks is a block-diagram modelling environment for control, robotics and machine-learning systems. It exports any level of a model to ten languages — then compiles that code, runs it, and compares it against its own simulation, sample by sample.
software targets · tolerance 0.1 % · observed agreement ≈1e-11 %
Four steps, in order. Everything in the window also has a console equivalent, so the same model can be driven from a build.
Place blocks from the library navigator and join them with signal links. Subsystems nest beneath the top level, so a model stays readable as it grows.
Set the start and stop time, the solver and the sampling. Continuous and discrete parts live in the same model — most real ones are mixed.
Scopes fill in as the run advances. Results are also variables: read them in the command window, chart them, or keep them for the next run.
Turn any subsystem — or the whole model — into a stand-alone program with a testbench and a build file, in the language the target needs.
Eleven things it does that you would otherwise assemble from separate tools.
Collapse a chain of linear blocks into a single state-space realization — in series, in parallel, or around a feedback loop, including unity feedback. The reduction resolves the algebraic loop the direct-feedthrough terms create, and refuses the merge when that loop is singular rather than inventing a result.
Read more →The diagram language is text, and the documentation describing it is public — so an
agent at your terminal can read the docs, write an .iscript, and hand it to
the Studio. Script Runner runs it and stops at the first failing line;
Import as ICore Recipe replays it into the level on screen; a file dropped in the
templates folder appears without a restart. generateRecipe writes the
current diagram back out, so the agent can read what it just built.
Move a level across in either direction — write a model out as a Simulink script, or read one back in. Blocks carry their own Simulink catalog mapping, and the parity suite checks them against Simulink, block by block, before every release.
Read more →Any subsystem becomes a stand-alone program: a deployable core advancing one sample per call, a testbench, and a build file. C, C++, Rust, Python, MATLAB, Java, VHDL, Verilog, SystemVerilog and IEC 61131-3 Structured Text.
Read more →Continuous or discrete. Fixed-step: Euler (RK1), Improved Euler / Heun (RK2), Bogacki–Shampine (RK3), Runge–Kutta (RK4). Variable-step: Dormand–Prince (RK45), Bogacki–Shampine (RK23). Subsystems may run at their own sampling rate, reconciled by a multi-rate tolerance you control.
Read more →A model that runs at several rates ships as several targets: each one names its own source subsystem, its own language and its own verification level, and each is generated at that subtree's rate. Targets are saved beside the project and go out together with Deploy All.
Read more →Drop a C or Python block into the diagram and your own source runs inside the simulation loop, with the ports you declare on it — for the part of a model that was never going to be a block.
Read more →The command window has a Python REPL's feel — a bare variable prints as a Python repr,
matrices print as lists — while keeping MATLAB's rules where they matter: a statement
ending in ; is silent, and matrices are stored in MATLAB syntax. Type either;
it understands both.
Make your own blocks and keep them. The wizard writes a .iblock file —
identity, ports, icon, description, and a body that is either recipe text or Python — and
it appears under My Blocks in the navigator, ready to import, export or hand to
someone else. A definition stamps into ordinary blocks when placed, so a project
that uses your library stays self-contained.
The linear algebra is Eigen underneath — Dense, plus Polynomials, Matrix Functions,
Splines, FFT, Numerical Differentiation and Levenberg–Marquardt — reached through
ICoreMatrix and its neighbours. You get the performance without binding your
own code to the dependency.
Matrices, polynomials, splines, time series and complex variables. Calculus, geometry, optimisation, signal processing and control-systems tooling — discretization, root locus, state-space and transfer-function conversion, time response — and the expression evaluator the console itself runs on.
Read more →Every export has the same shape: a deployable core that advances the model by exactly one sample per call, a testbench that drives it across the simulation window, and — where the language has one — a build file so the folder compiles as it is. Storage is fixed-size and nothing is allocated at run time.
| Target | Deploy writes | One call advances one sample |
|---|---|---|
| C | <name>_deployableCore.h/.c, testbench, CMakeLists.txt | DeployableCore_init(&core), then execute_blocks(&core) |
| C++ | <name>_deployableCore.hpp, testbench, CMakeLists.txt | struct DeployableCore · execute_blocks() |
| Rust | <name>_deployableCore.rs, testbench, Cargo.toml | execute_blocks(&mut self) |
| Python | <name>_deployableCore.py, testbench | execute_blocks() · needs numpy |
| MATLAB | <name>_deployableCore.m, testbench | classdef … < handle · core.execute_blocks() |
| Java | <name>_deployableCore.java, testbench | executeBlocks() |
| VHDL | icore_pkg.vhd, entity, testbench, Makefile (GHDL) | one rising clk edge |
| Verilog | icore_defs.vh, module, testbench, Makefile (Icarus) | one clk edge |
| SystemVerilog | icore_defs.svh, module, testbench, Makefile (Icarus) | one clk edge |
| PLC · ST | <name>_deployableCore.st, testbench | FUNCTION_BLOCK FB_<name> — one scan |
Most code generators ask for faith. This one exports the model, builds it with a real toolchain, runs it over the simulation window, and compares every sample against the solver — then reports the residual as a percentage. Choose how strict to be: output gates only, gates and sinks, or strict across all signals.
[[0], [0.632121], [0.864665], [0.950213], [0.981684], [0.993262]]
| Target class | Tolerance | Observed |
|---|---|---|
| Software · 7 languages | 0.1 % | ≈1e-11 % |
| HDL · Q16.16 | quantum 1.5e-5 | quantisation-bound |
Every block bridged to Simulink is driven with a seeded random stimulus. The identical samples go through the Simulink counterpart and through the block's own generated MATLAB, and the outputs are compared sample-by-sample against a per-block tolerance. It is a pre-release suite: a block that drifts fails the release.
308 of the 311 library blocks carry a sample from a real headless run — a step, impulse, sine or ramp response, or an input-to-output table where that is the point — regenerated with the software, never drawn by hand. The same rule governs this page: every number on it is a measurement.
Blocks carry typed matrix signals over port-based links, so a controller, an estimator and a classifier sit in the same diagram and export through the same path. Each block's description — its ports, parameters and what it computes — is one text, shown in the library navigator, in its configuration dialog and on its documentation page.
Closed-loop control, subsystem building blocks and more ship with the application. Opening one creates a project of its own, so the template is never modified.
Anything done in the window has a console equivalent, and the console runs without one:
--console executes a command and exits, which is how models are driven in a
build.
Blocks carry a Simulink catalog mapping, and the parity suite checks them against their Simulink counterparts before every release.
The same engine is available as a C++ SDK, in two layers you can adopt separately.
Download the application from the customer portal, or read the documentation first — the manual, every block with its measured response, and the full command reference are public.