Core Concepts & Architecture
Simulatte models two complementary domains — production planning (job-shop) and intralogistics (warehouse and AGV) — both built on a shared SimPy Environment that drives the simulation clock and event queue. The two domains can run independently or side by side within the same simulation; their orchestrators (ShopFloor and FleetCoordinator) coordinate all domain-specific behaviour while delegating timing to the common environment.
Production planning
The Router is the stochastic arrival process: it creates ProductionJobs — each carrying its server routing, processing times, and absolute due date — and feeds them into the PreShopPool (in a pull system) or directly to the ShopFloor (in a push system). A release policy (LumsCor, SLAR, SlarLimit, DRACO, ConWIP, or ContinuousRelease) monitors the pool and admits jobs to the ShopFloor, the central orchestrator that tracks WIP, fires lifecycle hooks, and maintains EMA performance metrics. The ShopFloor then routes each job through its sequence of Servers. Each Server is a SimPy priority resource that re-orders its queue before every dispatch — calling sort_queue to re-evaluate the job's priority policy — and that priority policy is the dispatching rule (SPT, EDD, ATC, Focus, and others). Runner repeats the whole simulation across multiple seeds. Every state change is published as a typed event on the environment's event bus, where log sinks, KPI collectors and trace recorders pick it up (see Observability).
graph TD
Env["Environment<br/>clock + events"]
Router["Router<br/>stochastic arrivals"]
Job["ProductionJob<br/>routing · processing times · due date"]
PSP["PreShopPool"]
RP["Release Policy<br/>LumsCor / SLAR / SlarLimit / DRACO / ConWIP / ContinuousRelease"]
SF["ShopFloor<br/>orchestrator · WIP"]
S["Server<br/>priority queue"]
DR["Dispatching Rule<br/>SPT / EDD / ATC / Focus"]
Runner["Runner<br/>multi-seed runs"]
Log["Event bus<br/>sinks · collectors · trace"]
Router -->|creates| Job
Router -->|pull system| PSP
Router -->|push system| SF
RP -->|releases jobs from| PSP
PSP -->|released to| SF
SF -->|routes job through| S
S -->|queue ordered by| DR
S -->|completes step| SF
Env -.drives.-> Router
Env -.drives.-> SF
Env -.drives.-> S
SF -.records.-> Log
Runner -.runs many.-> SF
Intralogistics
A TransferOrder is queued in the FleetCoordinator, the central orchestrator for all AGV missions. The coordinator assigns an AGV via pluggable dispatch and repositioning policies, plans its path across the LayoutGraph (a directed graph of nodes and arcs), and enforces node-capacity constraints via a TrafficManager. The AGV picks inventory from a source Warehouse, transits to the destination, puts it down, and then either recharges at a ChargingStation or parks at a ParkingArea. Every state change is published as an event on the environment's bus, and the order and time-series metrics are collectors subscribed to it.
graph TD
Env2["Environment"]
LG["LayoutGraph<br/>Nodes + Arcs"]
WH["Warehouse<br/>inventory + bays"]
TO["TransferOrder"]
FC["FleetCoordinator<br/>orchestrator"]
DP["Dispatch / Repositioning /<br/>Replenishment / Load-recovery policies"]
TM["TrafficManager"]
AGV["AGV<br/>AGVType + SpeedProfile + Battery"]
CH["ChargingStation"]
PK["ParkingArea"]
M["Event bus<br/>collectors · trace"]
TO -->|queued in| FC
FC -->|assigns via| DP
FC -->|paths on| LG
LG -->|guarded by| TM
FC -->|commands| AGV
AGV -->|picks/puts at| WH
AGV -->|charges at| CH
AGV -->|parks at| PK
Env2 -.drives.-> FC
Env2 -.drives.-> AGV
FC -.records.-> M
Observability: events, traces and KPIs
The Environment carries an event bus. Components such as Server, ShopFloor, PreShopPool, FleetCoordinator and AGV register as entities with stable ids (job-0, wc-1, agv-0) and publish typed events with state deltas when they change. Subscribers sit on the bus and never alter the simulation: log sinks write log events, collectors (EMACollector, ShopFloorKPIs, FleetTimeSeries, ...) compute metrics, the semantic digest fingerprints the trajectory and a TraceRecorder writes the whole run to a file that Trace can replay and verify. Randomness comes from named streams derived from the environment seed, so a seeded run is reproducible and its manifest says how. The Events, traces and KPIs guide covers each piece.
How the two domains connect
Both orchestrators — ShopFloor for production and FleetCoordinator for intralogistics — run as SimPy processes on the same Environment clock, so their events interleave naturally without any special coupling. You can combine them in a single simulation by passing the shared env instance to both. For the full API surface see the API Reference; for worked walkthroughs see the Production Planning & Control guide and the Intralogistics guide.