Overview
TOML schema, units, runtime scope, and backend boundaries.
Scope: Days AGO and Legacy Days. Days uses one TOML scenario format with two consumers:
- Days AGO lowers the supported subset in
src/scenario/compile.rsinto aSimulationImage, then runs it on Scalar, CPU, Metal, or CUDA. Its entry point is thedaysCLI. - Legacy Days validates the complete legacy vocabulary in
legacy/src/config.rsand runs the scenario with Nexosim, through thedays-legacyCLI.
The pages in this section mark which engine accepts each key.
Units
| Value | Unit |
|---|---|
Times such as duration, initial_delay, and report_interval | seconds unless the key ends in _ns or the page says otherwise |
switch.port_rate | bits per second |
DCQCN *_rate_gbps values | gigabits per second |
| Traffic sizes, packet sizes, and most buffers | bytes |
| Topology and flow identifiers | non-negative integers |
Days AGO represents time in integer nanoseconds. It rejects values that cannot be represented exactly in the field's integer scale.
Root keys
The strict legacy loader accepts the following root keys. Unknown root keys fail validation in both engines: Days AGO refuses an unknown key in every table, naming the key and the table it sits in (TOML parse error ... unknown field ... (in [table])), and accepts without reading exactly the twelve root keys that only the legacy engine uses: ui_interval, threading, num_threads, hot_workers, concurrency_level, log_path, csv_logging, report_interval, mailbox_capacity, legacy_e5_metrics, model_host_attachment, and app_source (LEGACY_ENGINE_ROOT_KEYS in src/scenario/compile.rs; a test keeps the list equal to the legacy loader's). Days AGO also requires every arr_dist and pkt_size_dist to be a one-line inline table with no comment and no trailing comma.
| Keys | Purpose | Scope |
|---|---|---|
seed, duration | Determinism and stop time | Both |
ui_interval | Progress refresh interval | Legacy |
threading, num_threads, hot_workers, concurrency_level | Nexosim runtime selection | Legacy |
time_quantum_ns | Nexosim time quantization | Legacy; Days AGO requires zero or omission |
mailbox_capacity | Actor mailbox capacity | Legacy |
log_path, csv_logging, report_interval | CSV reports and protocol traces | Legacy logger |
legacy_e5_metrics | Opt-in E5 TCP correctness rows | Legacy |
edges, hosts, topology | Network graph and host attachments | Both; the SpectrumX category is Days AGO only |
switch | Port rate, queue, scheduler, and AQM policy | Both, with capability differences |
link | PFC and propagation | Both, with capability differences |
model_host_attachment | Explicit host injection/delivery stages | Legacy |
routing | Scenario-wide ShortestPath, FatTreeEcmp, or SimAiEcmp | Both; SimAiEcmp is Days AGO only |
flow, flow_set | Point-to-point traffic | Both, with a smaller exact subset |
collective, collective_set | Collective traffic | Both, with different algorithm sets |
compute | Delay-only compute stages that collectives can wait for | Days AGO; the legacy loader rejects the key |
workload | An AICB/SimAI training trace as the scenario's traffic | Days AGO; the legacy loader rejects the key |
app_source | Actor-managed byte buffers for TCP Broadcast/RingAllReduce | Legacy |
See the pages in this section for field-level constraints. A key can belong to the vocabulary and still fail when its value or combination is inactive. The strict loader rejects examples such as switch.ecn_capacity_bytes without switch.ecn or switch.ecn_by_rate, [link.pfc] without link.mode = "Pfc", and [app_source] without a supported TCP collective.
Minimal scenario
This custom topology runs in Legacy Days and lowers into Days AGO:
seed = 1
duration = 2.0
threading = "single"
csv_logging = false
edges = [[0, 1]]
hosts = [0, 1]
[switch]
port_rate = 1000000000
capacity = 100
discipline = "FIFO"
drop = "TailDrop"
[[flow]]
flow_type = "PacketDistribution"
graph = [[0, 1]]
[flow.traffic]
initial_delay = 0.0
size = 10000
arr_dist = { type = "Uniform", low = 0.001, high = 0.001 }
pkt_size_dist = { type = "DiscreteUniform", low = 512, high = 512 }threading and csv_logging affect only the legacy run. Days AGO ignores those runtime fields; the caller selects a backend, for example with days --engine.
Cargo features and backend capabilities
Legacy protocol models use Cargo features:
flow_type = "DCQCN"requires-p days-legacy --features dcqcn.link.mode = "Pfc"requires-p days-legacy --features l2_pfc.- LeanGuard event CSVs require
leanplus the protocol feature where applicable.
Days AGO Scalar and CPU execute the full lowered mechanism set. Metal and CUDA accept deterministic packet traffic, exact TCP Reno/CUBIC, DCQCN, RoCE queue pairs, PFC, collective and compute stages, FIFO/SP/WFQ/DRR/WRR, TailDrop, and the ECN ramp, subject to device capacity checks. The error names the unsupported mechanism and directs you to Scalar or CPU.