Skip to content

Release v0.9.8

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Jul 08:57
12e28af

🚀 Release v0.9.8

📦 What's Included

C++ Build Artifacts

Contains: Compiled C++ libraries, public headers, CMake config files, and dependencies.

System Packages (.deb / .rpm)

  • Ubuntu 22.04: DEB packages are attached under Assets
  • Ubuntu 24.04: DEB packages are attached under Assets
  • Ubuntu 24.04 (arm64): DEB packages are attached under Assets
  • Fedora 39: RPM packages are attached under Assets
  • Includes: umd-runtime, umd-dev and umd-python packages

Python Wheels

  • manylinux_2_28 wheels for Python 3.9-3.13 (x86_64 and aarch64)
  • Compatible with Ubuntu 20.04+, RHEL 8+, and other modern Linux distributions
  • Includes Python bindings for tt-umd
  • PyPI: https://pypi.org/project/tt-umd/

🚀 Release Notes for v0.9.8

Changed

  • Release notes for version 0.9.8 not found in CHANGELOG file.

📋 Pull Requests Summary

  • Bump version from 0.9.7 to 0.9.8 (#2961)
  • Rename and move set_power_state logic to set_clock_state in TTDevice (#2936)
  • Introduce SimulationTTDevice base and hoist shared simulation device members (#2913)
  • Add CI perf regression detection (#2691)
  • RemoteChip: accept Chip* base instead of LocalChip* (#2952)
  • Get latest ttsim in run-ttsim-tests.yml (#2962)
  • Fix verify_routing_firmware_state() check condition (#2946)
  • sw_emule_chip: right-size worker L1 pool to num_tensix (#2950)
  • Log all cached vars in cmake (#2949)
  • Add per-op MMIO timeout for TLB-mapped device access (#2629)
  • Add NOC-mapping perf benchmarks to IOMMU microbenchmark suite (#2787)
  • Move "newer than the latest fully tested version" from warning to debug (#2948)
  • Simulation: client-mode simulation TTDevices over a slim SimulationClient (#2868)
  • Simulation: add SimulationClient, the slim client-facing host handle (#2902)
  • ci: switch build-device.yml to free GitHub-hosted runners (#2870)
  • Wait on telemetry initialization (#2474)
  • AICLK target tolerance (#2924)
  • Remove noc_multicast from WormholeTTDevice (#2941)
  • Skip build only jobs on PR gate (#2942)
  • Simulation: rename SimulationSocket to SimulationServerSocket (#2940)
  • Remove C++ comment period check (#2937)
  • Deprecate xy_pair usage in TTDevice (part 1) (#2912)
  • Simulation: SimulationConnector (host-vs-client decision) (#2811)

📝 Detailed Pull Request Information

Bump version from 0.9.7 to 0.9.8 (#2961)

Author: Aleksandar Djordjevic | Date: 2026-07-01 | Commit: be3fada

No description section found.

Rename and move set_power_state logic to set_clock_state in TTDevice (#2936)

Author: Aleksa Jovanovic | Date: 2026-07-01 | Commit: ca692e2

Moves clock-state management from Chip into the TTDevice base API,
renaming set_power_state(DevicePowerState) to set_clock_state.
Chip::set_clock_state now delegates to TTDevice.

Introduce SimulationTTDevice base and hoist shared simulation device members (#2913)

Author: Pavle Janevski | Date: 2026-07-01 | Commit: a2b6c8a

First step toward a common implementation for the RTL and TTSim
simulation TTDevice backends. Introduces a SimulationTTDevice
intermediary base class and moves the member variables that were
duplicated across TTSimTTDevice and RtlSimulationTTDevice into it.
No behavior is moved yet — every method override stays in the derived
classes, and follow-up PRs migrate the shared logic incrementally.

Add CI perf regression detection (#2691)

Author: Aleksa Jovanovic | Date: 2026-07-01 | Commit: 78c3e95

Introduces ci regression detection, which for now due to unstable
testing environment, summarizes regression only on n150 architecture
(binding microbenchmark test runs for that arch to bgd-lab-06), on
ClusterConstructor test. This pipeline now bound only to n150 arch
should be the base, to which tests when stabilized can be added easily
later.

RemoteChip: accept Chip* base instead of LocalChip* (#2952)

Author: Pavle Janevski | Date: 2026-07-01 | Commit: 41b9a56

Widen RemoteChip's gateway pointer from LocalChip* to Chip* so a
RemoteChip can sit behind any Chip (e.g. a SimulationChip
gateway), not only a LocalChip. Behaviour-preserving: all uses go
through Chip virtuals and existing callers pass a LocalChip* which
is-a Chip*.

Get latest ttsim in run-ttsim-tests.yml (#2962)

Author: Aleksa Marković | Date: 2026-07-01 | Commit: 4b27c1c

Get latest ttsim in run-ttsim-tests.yml instead of looking up tt-metal
workflows.

Fix verify_routing_firmware_state() check condition (#2946)

Author: Aleksa Marković | Date: 2026-06-30 | Commit: fa06d8d

Revert verify_routing_firmware_state() check condition to before
introducing the new error type. This should fix the tt-metal bump.
Instead of checking for 0, we check for not 1, as t3k has value 2 for
multimesh mode.

sw_emule_chip: right-size worker L1 pool to num_tensix (#2950)

Author: Armin Ale | Date: 2026-06-30 | Commit: 50ab5be

SWEmuleChip sized its worker-core L1Pool at 2 × num_tensix. All
coordinate namings for a worker (physical / NOC1 / translated) resolve
to one Core / one L1, and only WORKER cores draw from this pool, so
num_tensix is an exact upper bound on slot demand — the 2× headroom is
unnecessary.
This change has no impact no silicon.

Log all cached vars in cmake (#2949)

Author: Bojan Roško | Date: 2026-06-30 | Commit: 96dd36b

I've grown frustrated by some of the behavior which wasn't obvious
related to how cmake caches the options.
These messages will help greatly surface this kind of issues, and are
harmless

Add per-op MMIO timeout for TLB-mapped device access (#2629)

Author: Pavle Janevski | Date: 2026-06-30 | Commit: 2479010

memcpy_to_device / memcpy_from_device store/load against TLB-mapped
device memory with no liveness check. The existing SIGBUS guard
(SiliconTlbWindow::execute_safe) only recovers when the platform PCIe
completion timeout fires (a mapping/hardware fault), so it misses two
cases: slow degradation (ops complete, just far slower — the host
grinds) and posted-write pile-up (writes succeed locally into a dead
device before back-pressure stalls the CPU).
This PR adds a per-op wall-clock budget to the TLB-touching transfer
paths: each transfer constructs an OpTimeoutGuard (from #2842) with
the per-op budget, an optional liveness veto, and an overrun action that
throws DeviceTimeoutError (from #2840). On overrun the veto decides:

  • no veto, or veto reports the NOC hung → throw
    DeviceTimeoutError;
  • veto reports the NOC healthy → continue; the next op gets a fresh
    budget.
    The veto consumer is HangDetector, wired by
    TTDevice::set_hang_detector (called from the Wormhole/Blackhole device
    constructors). The hang check is stored on the SiliconTlbWindow (via
    set_io_timeout_hang_check), which binds the in-flight NOC into the
    per-op veto. On PCIe the liveness check runs from inside the timed-out
    transfer, so it reads through a dedicated, separately-locked probe
    window owned by the injected reader lambda — it never re-takes the
    io_lock_ the stalled op holds and never recurses into the timed path.
    Only single-op stalls are caught; total transfer time is not bounded,
    and the check cannot preempt a CPU already stalled mid-access (SIGBUS
    still covers mapping invalidation, e.g. on reset).
    The default budget is timeout::MMIO_OP_TIMEOUT (10 ms, headroom
    over the multi-ms single-op latency seen on contended/virtualized hosts)
    and is configurable at runtime via MmioTimeoutConfig::set_op_timeout,
    also exposed to Python as tt_umd.MmioTimeoutConfig. The budget bounds
    a single op (a bulk block, finer in the tails), not the whole transfer.

Add NOC-mapping perf benchmarks to IOMMU microbenchmark suite (#2787)

Author: Pavle Janevski | Date: 2026-06-30 | Commit: fc70dda

Add benchmarks for mapping host buffers to be visible to the device over
NOC (map_buffer_to_noc, i.e. IOMMU mapping + iATU configuration),
complementing the existing map_for_dma (IOMMU-only) benchmarks. Three
tests are added to the MicrobenchmarkIOMMU suite:

  • MapDifferentSizesBufferToNOC – same size sweep as
    MapDifferentSizes (single page up to 1 GiB), but through
    map_buffer_to_noc instead of map_for_dma.
  • Map1GBPages – maps three coexisting 1 GiB buffers to NOC,
    simulating the metal use case of several large buffers mapped
    simultaneously.
  • Map1GBPagesSysmemBuffers – the same 1 GiB scenario through the
    SysmemBuffer class, to confirm there is no overhead versus the raw
    path.
    Mapping/unmapping a 1 GiB page through SysmemBuffer measured
    essentially identical to the raw path (~12.4 ms map, ~5.1 ms unmap).

Move "newer than the latest fully tested version" from warning to debug (#2948)

Author: Bojan Roško | Date: 2026-06-30 | Commit: cf2db6c

Per popular request, reducing the level of this log so it is not
confusing for somebody using the newest code on the newest system.

Simulation: client-mode simulation TTDevices over a slim SimulationClient (#2868)

Author: Pavle Janevski | Date: 2026-06-30 | Commit: bb94853

Today SimulationConnector throws when a live host already owns the
chip's socket. This makes it construct a client simulation device
instead, attaching to the host over the socket via SimulationClient
(added in #2902) — for both backends (tt_sim .so and RTL).

  • TTSimTTDevice and RtlSimulationTTDevice gain constructor-bound
    lifecycle dispatch (setup_/teardown_ callables) — the genuine
    host-vs-client difference today: host mode drives the in-process backend
    (the communicator); client mode drives the remote host (client_
    attach/detach). read_from_device/write_to_device stay direct and
    throw in client mode until SimulationClient grows device I/O.
  • SimulationConnector picks the backend by simulator path (.so
    tt_sim, else RTL) and the host-vs-client role socket-first (via
    SimulationServerSocket), constructing a client device for either
    backend when a live host already owns the socket. The dispatch lives in
    a file-local create_simulation_device() helper.
    Scope is intentionally narrow: this proves construction +
    connect/disconnect in both modes and both backends; client-mode device
    I/O throws until the API grows.

Simulation: add SimulationClient, the slim client-facing host handle (#2902)

Author: Pavle Janevski | Date: 2026-06-30 | Commit: 51bea8f

Adds SimulationClient — the slim, always-built client-facing handle to
a simulation host, reached over its per-chip UNIX socket. attach()
connects, detach() closes; no request protocol yet. Grows
operation-by-operation as the server work lands, at which point
TTSimTTDevice's client-mode dispatch is rebound onto these calls. The
asio transport is held behind a pImpl so the public header stays
asio-free (mirroring SimulationServerSocket).

ci: switch build-device.yml to free GitHub-hosted runners (#2870)

Author: Bryan Wilder Field Lozano | Date: 2026-06-30 | Commit: 921968b

No description section found.

Wait on telemetry initialization (#2474)

Author: Bojan Roško | Date: 2026-06-29 | Commit: c1f7c8d

Stumbled upon this while looking at
https://tenstorrent.atlassian.net/browse/SYS-3873.
There is a possible race condition where we waited on ARC to report
completion on booting, but the telemetry is not ready. This PR adds a
path which also waits for the last telemetry entry to be filled up. This
was already present on one path, so unified the approaches (it is
slightly different for smbus telemetry and new telemetry).
Regarding the referenced issue, the issue grows deeper and telemetry
won't ever become available.

AICLK target tolerance (#2924)

Author: Bojan Roško | Date: 2026-06-29 | Commit: 2651234

Don't wait and send warnings if AICLK is close to the target.

Remove noc_multicast from WormholeTTDevice (#2941)

Author: Bojan Roško | Date: 2026-06-29 | Commit: eae2209

So in paralel to my huge stack of multicast PRs, Nenad worked on device
protocol changes. Due to this, I messed up a bit when rebasing at one
moment, so I mistakenly left the WormholeTTDevice::noc_multicast_write.
This one shouldn't exist, all should go though
TTDevice::noc_multicast_write
This PR added this function
#2537
Probably got intertwined with
#2418
and this PR should've probably changed the wormhole one instead of this
one #2572
In anycase, my intention was not to have two separate implementations of
this function.

Skip build only jobs on PR gate (#2942)

Author: Bojan Roško | Date: 2026-06-29 | Commit: 755341c

As another approach of reducing load on compute machines, as an
alternative to #2869
Some build job will always run anyway as part of build when running
tests on pr gate.

Simulation: rename SimulationSocket to SimulationServerSocket (#2940)

Author: Pavle Janevski | Date: 2026-06-29 | Commit: ccb37d8

Pure rename, no behavior change: SimulationSocket
SimulationServerSocket (class + files). It's the socket to the
server
(the simulation host); the slim client handle in #2902 connects
to it.

Remove C++ comment period check (#2937)

Author: Aleksa Marković | Date: 2026-06-29 | Commit: d9c2998

Remove C++ comment period check. The script messes with comment pragmas
and it's a burden to improve on it, with little to gain than cosmetics.

Deprecate xy_pair usage in TTDevice (part 1) (#2912)

Author: Aleksa Marković | Date: 2026-06-29 | Commit: 373e70d

This PR removes the xy_pair variants of read/write methods in
TTDevice, only leaving the CoreCoord version, as per the base API
specification. Also it introduces UnresolvableCoordinateError to
provide a richer error message to any non-literal coordinate IO on an
uninit'd TTDevice.

Simulation: SimulationConnector (host-vs-client decision) (#2811)

Author: Pavle Janevski | Date: 2026-06-29 | Commit: 2d18f83

Adds SimulationConnector — the entry point that scans the per-chip
socket path and
decides, per device, host vs client. Host path: no live socket → bring
up a host backend
that binds + exposes its socket. The backend is selected from the
simulator path
(.soTTSimTTDevice, directory → RtlSimulationTTDevice),
mirroring the simulation
device factory. The client/attach branch lands in a later PR; for now a
live socket is
reported as an error.
The sim TTDevice ctors no longer auto-bind; the connector creates the
SimulationSocket
and hands ownership to the device via adopt_socket.
num_host_mem_channels is threaded
through createcreate_for_chip → ctor.
(Renamed from SimulationTopologyDiscovery: it does not inherit from or
match the
TopologyDiscovery interface, so the shared name was misleading.)



This release was automatically generated when the VERSION file was updated.
Release notes were extracted from CHANGELOG file.