Skip to main content

chronon::TickSimulation

More...

#include <TickSimulation.hpp>

Public Functions

Name
~TickSimulation()
voidwriteTimelineTrace()
Write the scheduler execution timeline at end of run.
boolwasTerminationRequested() const
boolusesClockDomains() const
booluseParallelExecution() const
size_tunitCount() const
size_ttransparentBroadcastConnectionCount() const
uint64_ttotalTransportOverflowEvents() const
uint64_ttotalStagingOverflowEvents() const
const std::string &timelineTraceFile() const
booltimelineTraceEnabled() const
uint64_ttickFrequencyHz() const
const TerminationRequest &terminationRequest() const
Only valid after runUntilTermination() returns.
voidsetUnitName(Unit & unit, std::string name)
Assign the factory instance identity before initialization. Host-only.
voidsetPrecomputedUnitCosts(std::vector< double > unit_costs, PlatformMetrics metrics)
Provide explicit per-unit costs instead of using uniform-cost initial partitioning.
uint64_tschedulerSteps() const
uint64_trunUntilTime(SimTime exclusive_limit)
uint64_trunUntilTermination(uint64_t max_cycles =UINT64_MAX)
uint64_trunUntilComplete(uint64_t max_cycles =UINT64_MAX)
template <typename Predicate >
uint64_t
runUntil(Predicate && should_stop, uint64_t max_cycles =UINT64_MAX)
Run until should_stop() returns true or max_cycles reached.
uint64_trunDomainCycles(ClockDomainId id, uint64_t additional_edges)
uint64_trunClockEvents(uint64_t max_event_batches)
uint64_trun(uint64_t num_cycles)
voidresetTermination()
Reconstructs the stop_source (inplace_stop_source is non-resettable).
voidrequestTermination(TerminationReason reason, int32_t exit_code =0, std::string_view message ="")
Externally-driven termination, e.g. signal handlers or API calls.
voidregisterConnection(ConnectionBase * connection)
Type-erased connection registration used by configuration builders.
uint64_trebalanceCount() const
PortDirectory &portDirectory()
const PortDirectory &portDirectory() const
exec::static_thread_pool &pool()
Used by observation async I/O.
const std::string &parallelFallbackReason() const
TickSimulation &operator=(const TickSimulation & ) =delete
size_tnormalizeThreadCount(size_t requested)
SimTimelastCommittedTime() const
boolisParallelBeneficial() const
boolisInitialized() const
boolisFinalized() const
voidinitialize()
boolhasTightConnectionsInGraph() const
stdexec::inplace_stop_tokenget_stop_token() const
const std::vector< double > &getUnitCosts() const
TickableUnit *getUnit(const std::string & name)
template <typename UnitT >
UnitT *
getUnit(const std::string & name)
const PlatformMetrics &getPlatformMetrics() const
voidforceStableConnectionQueues()
voidfinalize()
uint64_tepochFreeRunCount() const
uint64_tdrainCdc(uint64_t max_event_batches)
Call after stopping producers; includes RAM, output registers and pointer synchronization.
uint64_tdomainCycleCount(ClockDomainId id) const
const DependencyGraph &dependencyGraph() const
uint64_tcurrentCycle() const
template <typename UnitT ,typename ParameterSetT >
UnitT *
createUnitWithParameters(std::unique_ptr< ParameterSetT > parameters)
template <typename UnitT ,typename... Args>
UnitT *
createUnitInDomain(ClockDomainId id, Args &&... args)
template <typename UnitT ,typename... Args>
UnitT *
createUnit(Args &&... args)
template <typename T >
AsyncFifo< T > *
connectAsyncFifo(uint32_t id, AsyncWritePort< T > & write, AsyncReadPort< T > & read, AsyncFifoConfig config ={})
template <typename T >
Connection< T > *
connect(OutPort< T > & from, InPort< T > & to, uint32_t delay =1)
voidconfigureObservation(const observe::ObservationYAMLConfig & config)
voidconfigureClockTrace(observe::ClockTraceRecorder::Config config)
voidcloseClockTrace()
observe::ClockTraceRecorder *clockTraceRecorder()
const std::vector< ClockSchedulerProfile > &clockSchedulerProfile() const
Host-only, between run calls. Empty unless profile_clock_scheduler is enabled.
uint64_tclockPartitionTimeNs() const
const ClockDomain &clockDomain(ClockDomainId id) const
boolcdcDrained() const
voidbindTreeNode(Unit & unit, tree::TreeNode & node)
size_tassignedThread(Unit * unit) const
voidassignClockDomain(Unit & unit, ClockDomainId id)
const ClockDomain &addClockDomain(ClockDomain domain)
Static configuration only. ID 0 is the legacy default clock; UINT32_MAX is reserved.
TickSimulation(const TickSimulationConfig & config ={})
TickSimulation(const TickSimulation & ) =delete

Friends

Name
structTransparentBroadcastFusionTestAccess
Test-only transparent-broadcast fusion selection inspection.
structTransitiveDependencyPruneTestAccess
Test-only white-box access for transitive dependency pruning.
structSchedulerScratchTestAccess
structPredecessorCycleCacheTestAccess
Test-only white-box access for test_predecessor_cycle_cache.
structLookaheadFloorTestAccess
Test-only white-box access for test_lookahead_floor_progress.
structEpochFreeDifferentialTestAccess
structDynamicMigrationTestAccess
Test-only source-owner migration commit validation.
structClockScalingTestAccess

Detailed Description

class chronon::TickSimulation;

High-performance simulation using stdexec.

Execution model: Chronon selects sequential or epoch-free lookahead at initialization. Tight clusters advance on dependency-progress atomics when the epoch-free safety gate proves that no barrier or per-epoch flush is required; otherwise the simulation uses the sequential reference path.

TickSimulation sim;
auto* fetch = sim.createUnit<FetchUnit>();
auto* decode = sim.createUnit<DecodeUnit>();
sim.connect(fetch->out, decode->in, 1);
sim.initialize();
sim.run(1'000'000);

Public Functions Documentation

function ~TickSimulation

~TickSimulation()

function writeTimelineTrace

void writeTimelineTrace()

Write the scheduler execution timeline at end of run.

Always written as a standalone file (scheduler_timeline.pftrace) separate from the simulation's timeline.pftrace. When the observation backend is running, the file is placed in its timestamped output directory; otherwise it is written relative to cwd.

function wasTerminationRequested

inline bool wasTerminationRequested() const

function usesClockDomains

inline bool usesClockDomains() const

function useParallelExecution

inline bool useParallelExecution() const

function unitCount

inline size_t unitCount() const

function transparentBroadcastConnectionCount

inline size_t transparentBroadcastConnectionCount() const

function totalTransportOverflowEvents

inline uint64_t totalTransportOverflowEvents() const

Total direct-lane pushes rejected by a full physical ring. Nonzero means the lookahead window outran transport capacity — a correctness failure. Always 0 for sequential execution.

function totalStagingOverflowEvents

inline uint64_t totalStagingOverflowEvents() const

function timelineTraceFile

inline const std::string & timelineTraceFile() const

function timelineTraceEnabled

inline bool timelineTraceEnabled() const

function tickFrequencyHz

inline uint64_t tickFrequencyHz() const

function terminationRequest

inline const TerminationRequest & terminationRequest() const

Only valid after runUntilTermination() returns.

function setUnitName

void setUnitName(
Unit & unit,
std::string name
)

Assign the factory instance identity before initialization. Host-only.

function setPrecomputedUnitCosts

inline void setPrecomputedUnitCosts(
std::vector< double > unit_costs,
PlatformMetrics metrics
)

Provide explicit per-unit costs instead of using uniform-cost initial partitioning.

function schedulerSteps

inline uint64_t schedulerSteps() const

function runUntilTime

uint64_t runUntilTime(
SimTime exclusive_limit
)

function runUntilTermination

uint64_t runUntilTermination(
uint64_t max_cycles =UINT64_MAX
)

Run until termination is requested or max_cycles is reached.

Termination is observed at scheduler boundaries with very low overhead; parallel lookahead paths also propagate the stop token into spin waits. If max_cycles is reached without a request, the controller is updated with MaxCyclesReached.

function runUntilComplete

inline uint64_t runUntilComplete(
uint64_t max_cycles =UINT64_MAX
)

function runUntil

template <typename Predicate >
inline uint64_t runUntil(
Predicate && should_stop,
uint64_t max_cycles =UINT64_MAX
)

Run until should_stop() returns true or max_cycles reached.

function runDomainCycles

uint64_t runDomainCycles(
ClockDomainId id,
uint64_t additional_edges
)

function runClockEvents

uint64_t runClockEvents(
uint64_t max_event_batches
)

Multiclock limits are explicit: event batches, absolute exclusive time, or a number of additional edges of one specified hardware domain. Parallel termination settles through the latest already-started edge; lastCommittedTime() can therefore exceed the termination request time.

function run

uint64_t run(
uint64_t num_cycles
)

function resetTermination

inline void resetTermination()

Reconstructs the stop_source (inplace_stop_source is non-resettable).

function requestTermination

inline void requestTermination(
TerminationReason reason,
int32_t exit_code =0,
std::string_view message =""
)

Externally-driven termination, e.g. signal handlers or API calls.

function registerConnection

void registerConnection(
ConnectionBase * connection
)

Type-erased connection registration used by configuration builders.

function rebalanceCount

inline uint64_t rebalanceCount() const

function portDirectory

PortDirectory & portDirectory()

function portDirectory

const PortDirectory & portDirectory() const

function pool

inline exec::static_thread_pool & pool()

Used by observation async I/O.

function parallelFallbackReason

inline const std::string & parallelFallbackReason() const

function operator=

TickSimulation & operator=(
const TickSimulation &
) =delete

function normalizeThreadCount

static inline size_t normalizeThreadCount(
size_t requested
)

function lastCommittedTime

inline SimTime lastCommittedTime() const

function isParallelBeneficial

inline bool isParallelBeneficial() const

function isInitialized

inline bool isInitialized() const

function isFinalized

inline bool isFinalized() const

function initialize

void initialize()

function hasTightConnectionsInGraph

inline bool hasTightConnectionsInGraph() const

function get_stop_token

inline stdexec::inplace_stop_token get_stop_token() const

Token reflects both unit-initiated termination and exception-driven abort. Used by external coordination (e.g. observation backends).

function getUnitCosts

inline const std::vector< double > & getUnitCosts() const

function getUnit

TickableUnit * getUnit(
const std::string & name
)

function getUnit

template <typename UnitT >
inline UnitT * getUnit(
const std::string & name
)

function getPlatformMetrics

inline const PlatformMetrics & getPlatformMetrics() const

function forceStableConnectionQueues

inline void forceStableConnectionQueues()

Preserve topology-stable multi-producer admission even for a fixed thread assignment. Configure before initialize() when an out-of-band transport replaces physical connection fanout.

function finalize

void finalize()

End this session. Calls every successfully initialized unit's finalize() once, in creation order, even if another finalizer throws. Idempotent. Call explicitly to observe finalizer failures; destruction is best effort. Host-only, between runs. A finalized simulation cannot be run again.

function epochFreeRunCount

inline uint64_t epochFreeRunCount() const

Number of epoch-free scheduler invocations. Sequential fallback leaves this unchanged, making the counter useful for safety-gate coverage.

function drainCdc

uint64_t drainCdc(
uint64_t max_event_batches
)

Call after stopping producers; includes RAM, output registers and pointer synchronization.

function domainCycleCount

uint64_t domainCycleCount(
ClockDomainId id
) const

function dependencyGraph

inline const DependencyGraph & dependencyGraph() const

function currentCycle

inline uint64_t currentCycle() const

function createUnitWithParameters

template <typename UnitT ,
typename ParameterSetT >
inline UnitT * createUnitWithParameters(
std::unique_ptr< ParameterSetT > parameters
)

Construct a unit from parameters owned by this simulation. Parameters outlive every unit destructor and are released when the simulation ends. A failed creation releases only that attempt's parameters.

function createUnitInDomain

template <typename UnitT ,
typename... Args>
inline UnitT * createUnitInDomain(
ClockDomainId id,
Args &&... args
)

function createUnit

template <typename UnitT ,
typename... Args>
inline UnitT * createUnit(
Args &&... args
)

function connectAsyncFifo

template <typename T >
inline AsyncFifo< T > * connectAsyncFifo(
uint32_t id,
AsyncWritePort< T > & write,
AsyncReadPort< T > & read,
AsyncFifoConfig config ={}
)

function connect

template <typename T >
inline Connection< T > * connect(
OutPort< T > & from,
InPort< T > & to,
uint32_t delay =1
)

function configureObservation

void configureObservation(
const observe::ObservationYAMLConfig & config
)

Own the process observation backend for this session. Configure before initialize(). Observed sessions are exclusive; multiclock uses configureClockTrace instead.

function configureClockTrace

void configureClockTrace(
observe::ClockTraceRecorder::Config config
)

function closeClockTrace

void closeClockTrace()

function clockTraceRecorder

inline observe::ClockTraceRecorder * clockTraceRecorder()

function clockSchedulerProfile

inline const std::vector< ClockSchedulerProfile > & clockSchedulerProfile() const

Host-only, between run calls. Empty unless profile_clock_scheduler is enabled.

function clockPartitionTimeNs

inline uint64_t clockPartitionTimeNs() const

function clockDomain

const ClockDomain & clockDomain(
ClockDomainId id
) const

function cdcDrained

bool cdcDrained() const

function bindTreeNode

void bindTreeNode(
Unit & unit,
tree::TreeNode & node
)

function assignedThread

size_t assignedThread(
Unit * unit
) const

function assignClockDomain

void assignClockDomain(
Unit & unit,
ClockDomainId id
)

function addClockDomain

const ClockDomain & addClockDomain(
ClockDomain domain
)

Static configuration only. ID 0 is the legacy default clock; UINT32_MAX is reserved.

function TickSimulation

explicit TickSimulation(
const TickSimulationConfig & config ={}
)

function TickSimulation

TickSimulation(
const TickSimulation &
) =delete

Friends

friend TransparentBroadcastFusionTestAccess

friend struct TransparentBroadcastFusionTestAccess(
TransparentBroadcastFusionTestAccess
);

Test-only transparent-broadcast fusion selection inspection.

friend TransitiveDependencyPruneTestAccess

friend struct TransitiveDependencyPruneTestAccess(
TransitiveDependencyPruneTestAccess
);

Test-only white-box access for transitive dependency pruning.

friend SchedulerScratchTestAccess

friend struct SchedulerScratchTestAccess(
SchedulerScratchTestAccess
);

friend PredecessorCycleCacheTestAccess

friend struct PredecessorCycleCacheTestAccess(
PredecessorCycleCacheTestAccess
);

Test-only white-box access for test_predecessor_cycle_cache.

friend LookaheadFloorTestAccess

friend struct LookaheadFloorTestAccess(
LookaheadFloorTestAccess
);

Test-only white-box access for test_lookahead_floor_progress.

friend EpochFreeDifferentialTestAccess

friend struct EpochFreeDifferentialTestAccess(
EpochFreeDifferentialTestAccess
);

Test-only safe-point migration used by the epoch-free differential harness. The seam is intentionally outside the worker hot path.

friend DynamicMigrationTestAccess

friend struct DynamicMigrationTestAccess(
DynamicMigrationTestAccess
);

Test-only source-owner migration commit validation.

friend ClockScalingTestAccess

friend struct ClockScalingTestAccess(
ClockScalingTestAccess
);

Updated on 2026-09-20 at 14:23:39 +0000