Native Shell
Native Shell은 모든 플랫폼의 앱 안에서 만들어지는 AI UI입니다
처리량·지연 요구에 맞춰 호스트, 링크, 가속기, DRAM, 칩내 패브릭·랙을 전력·성능·면적과 함께 최적화합니다
Size the host, links, accelerators, DRAM, on-chip fabric and racks of a data-processing system from its throughput and latency requirements, with power, performance and area, an optimiser and a design
개발 도구HTML · PythonGitHub @BrendanJamesLynskey최근 접속 확인 실패운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Hardware System Design Explorer: size host, links, accelerators, DRAM, on-chip fabric and racks from throughput and latency requirements, with PPA, percentiles, an optimiser and a plain-language design assistant
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗An interactive sizing tool for data-processing systems: a host CPU and its memory, a host link (PCIe or on-package UCIe), accelerators with on-chip SRAM and device DRAM, scale-up fabrics and scale-out networks up to many racks, optionally fed from the network or NVMe storage. You set the requirements (processing rate, latency budget, block size, peak-to-average ratio, headroom) and the workload (bytes over the link and through DRAM per byte processed, arithmetic per byte), and it shows which component is the bottleneck. It also gives the minimum specification of every component, and the power, performance and area (PPA) of the result.
Live app: https://hw-system-design-explorer.vercel.app/ (also mirrored on GitHub Pages)
Case study: what it models, how it is checked, and five things it shows
User guide: how to use it, with diagrams and live demos (guide.html; also from the Guide button in the app)
A sober black-and-white page with little on screen at once: the verdict, a one-line summary of the requirements and a compact live block diagram, with the analysis in tabs below. Detail is hidden until you ask for it: hover a block for its figures, click it for its settings, and open the legend, the less-used tabs (Latency, Headroom, Roofline, Model), the impractical DRAM options and the passing checks only when you want them. Status is shown by weight and inversion rather than colour (grey within the utilisation ceiling, dashed above it, white over capacity, the bottleneck inverted). Inputs live in a drawer that slides in from the left; clicking any block opens its settings in a drawer on the right. On wide screens the drawers push the page aside so the diagram stays visible while you drag.
Hover the mouse over almost anything, or tab to it, and a box explains it:
Clicking a headline figure still opens the full working. On touch screens, where there is no hover, a tap does that. The loaded example's name and description stay under the requirements line, and its name in the examples picker, until another example or a new design replaces it; once its inputs change it is marked (modified).
Set accelerators per node, nodes per rack and racks. Each accelerator then handles its share of the rate and each host its node's share. Peer traffic splits into what stays inside the scale-up domain (a node or a whole rack, over PCIe peer-to-peer, NVLink 4/5, UALink or Ethernet scale-up) and what crosses the scale-out network (200G to 1.6T NICs). The Racks tab draws the rack elevation and checks rack power against a cooling limit (air, rear-door, direct liquid). The sizing says how many accelerators this design needs, and the fabric table shows which fabrics fit and whether the domain is too big for them.
Type what the system has to do in plain language, for example "serve a 70B model at 3,000 tokens/s, under 50 ms per token", and the assistant turns it into the model's inputs. It asks up to three short follow-up questions with clickable answers when something that would change the design is missing, and assumes typical values (and says so) when you can't say. It then picks the hardware itself, or runs the optimiser, until every component sits under the utilisation ceiling, and the page redraws as it goes.
It runs in your browser with your own API key from OpenAI, Google (Gemini) or OpenRouter (Anthropic works too). Pick the provider, paste the key, and choose a model from the provider's own live list; a sensible default is preselected. The key goes only to that provider's API, and it is kept only in your browser: for the session, or longer if you tick remember. Under the hood:
store: false.generateContent with function declarations.Six tools drive the page: set_requirements, set_hardware, evaluate, optimise, load_example and
ask_user. Without a key, a small rule-based parser reads rates, latencies and the kind of workload, and
starts from the nearest example.
Watch a demo (next to Design it) replays an assistant session, with no API key needed. Its tool calls run for real, so the page changes as you watch. It is a recorded session with OpenAI gpt-6-sol (26 October 2026). Asked to serve Llama 3.1 70B to 2,000 users at 20 tokens/s each with 2,000-token prompts, on separate prefill and decode pools, and to show the chip inside each accelerator, it starts from the split-pool example, sizes the prefill pool up to three racks, then sets the chip: four chiplets carrying 64 weight-stationary 128×128 8-bit arrays at 0.75 V and 1 GHz. After the optimiser it trims the memory to three HBM4 stacks. It ends on 16 decode and 96 prefill accelerators: 47 ms per token at p99, a 59 ms minimum to first token, junction temperature 88 °C, and 17.8 kW per decode rack at full load. Every figure in its reply matches the model's replay of the session.
OPENAI_API_KEY=… node tools/record_demo.js (or GEMINI_API_KEY, OPENROUTER_API_KEY,
ANTHROPIC_API_KEY) records a real session through the same page and embeds it between the
DEMO-START / DEMO-END markers. The demo then says it is a recorded session, naming the model and the
date. The key stays in your environment and goes only to that provider's API.
Shared links show a social-preview card (og.png, rendered by tools/og.js).
Each accelerator has an on-chip interconnect and SRAM banks. It can be a network-on-chip (2-D mesh, torus, ring or full crossbar) or one of the AMBA fabrics:
Choosing a type sets its typical width and clock. DRAM, host-link and peer traffic enter at the die edge, and tile-to-tile traffic follows a pattern (all-to-all, nearest neighbour, or mostly local). Each kind is checked where it actually saturates: edge channels, bisection and tile ports for a NoC; memory ports, master ports and the crossbar for AXI; pipeline entries and the busiest link for streams; the single bus for AHB and APB. SRAM bank bandwidth is checked for all of them. The Notes tab covers AXI outstanding transactions (bandwidth × DRAM latency) and warns when AHB or APB is asked to carry bulk data. The On-chip tab draws the chosen fabric and compares all ten at their typical settings. Edge-device and FPGA examples use AXI; the detector trigger uses AXI4-Stream.
The Checks tab (under More) compares the model with published figures:
| Reference | What it tests | Result |
|---|---|---|
| H100 SXM: 3.35 TB/s HBM3 | DRAM speed-grade arithmetic (5 stacks at 5.2 Gb/s) | −0.7 % |
| Apple M2 Max: 409.6 GB/s | LPDDR5-6400, 512-bit | 0.0 % |
| Jetson AGX Orin: 204.8 GB/s | LPDDR5-6400, 256-bit | 0.0 % |
| AMD MI300X: 5.3 TB/s · MI355X: 8 TB/s | HBM3 and HBM3E, 8 stacks | +0.5 %, +2.4 % (AMD rounds 8.19) |
| Intel Gaudi 3: 3.7 TB/s · Google TPU v5p: 2,765 GB/s | HBM2E, 8 and 6 stacks | −0.4 %, 0.0 % |
| EPYC Genoa STREAM Triad: about 376 GB/s per socket | DRAM efficiency model (refresh, row misses, turnaround) | +5.2 % |
| The same, from the memory-controller model | Banks, timings, queue depth, turnaround, refresh | +3.6 % |
| PCIe 5.0 x16 pinned copies: 56.2 GB/s H→D, 55.1 GB/s D→H | PCIe protocol overheads | −0.2 %, +0.4 % |
| DGX H100: 10.2 kW maximum | System composition: accelerators, hosts, switches, NICs, fans, power supplies | −18 % (a planning maximum) |
| GB200 NVL72: about 120 kW per rack | Rack composition, liquid cooled | −5.0 % |
| GB200 NVL72 compute tray: 6.3 kW maximum | Node composition: 4 GPUs, 2 Grace, NICs, DPUs, drives, 48→12 V | −3.0 % |
| MLPerf v5.0 Llama 2 70B, 8 × H200: 34,988 tokens/s | LLM serving: decode and prefill, best batch and parallelism | +11.5 % |
Four more are calibration points rather than validations. Energy per operation is set from the H100 (700 W) and B200 (1,000 W) TDPs. The cost model's packaging price and effective defect density were chosen with two published build-cost estimates in view: H100 about $3,320 (Silicon Analysts, −7.4 %) and B200 about $6,400 (Epoch AI, −7.6 %). Every reference links its source in the app.
Three rows are indicative rather than pass/fail. They apply the energy per operation calibrated on NVIDIA parts (H100's for 5 nm-class chips, B200's for MI355X) to other vendors' accelerators at full load: AMD MI300X comes out +24 % (750 W published), MI355X −22 % (1,400 W) and Intel Gaudi 3 −26 % (900 W). So one energy-per-operation figure carries across vendors to about ±25 %; to model a specific part closely, set its pJ/op from its own TDP.
The LLM workload is checked against MLPerf Inference v5.0 (Llama 2 70B, Offline, 8 GPUs). The search runs every batch and tensor-parallel size whose KV caches fit in memory, with compute at the default 60 % of peak and operations counted in 8-bit equivalents (FP4 weight matmuls at twice the rate, attention no faster than 8-bit). The mean prompt, 222.33 tokens, was measured from MLCommons' 24,576-sample dataset file by the sibling AI Accelerators Explained site, and MLPerf's reference reply is 294.45 tokens. Both rows had ±25 % fixed before the run.
Fans and power conversion are no longer a flat 15 %. They follow the rack's cooling, read from its power limit. Air-cooled racks add 8 % for fans and lose 5 % in Titanium server supplies. Direct-liquid racks add 2 % for fans and lose power twice, in ORv3 power shelves (96.5 %) and in each tray's 48→12 V converter (97.5 %). The reference hosts are built from their parts lists (CPUs, DIMMs, drives, storage NICs, DPUs, BMC). DGX H100 still sits 18 % low. Its 10.2 kW is a provisioning maximum with fans at full speed, and fan power is the likeliest gap. NICs are counted only when traffic leaves the system (scale-out traffic above zero), so independent copies of a model no longer pay for a network they don't use.
npm test (also run in GitHub Actions on every push) reruns these checks in headless Chrome. It also
checks that every overhead breakdown multiplies out to the model's capacities, that the optimiser finds a
design for every example that can be fixed, that the rate sweep finds a design at every rate, that compare
round-trips through a shared link, that every example (changed or not) survives a short link exactly, that each
spec sheet fits one A4 page, that each explanation works out to its headline figure, that every hover explanation names its figure, that the LLM serving and training workloads match hand calculations, that the cost parts add up and the
cost goal finds the cheapest design, and that all 32 examples match their golden results within 2 %. An axe-core
audit then checks the page, all 14 tabs, the drawers, the spec sheet, an explanation panel and a simulation
in progress and finished for accessibility violations, with none allowed. Text meets WCAG AA contrast. Tables that scroll sideways, the headline figures and
the diagram's blocks are reachable by keyboard. Focus moves into a drawer when it opens and back when it closes,
and closed drawers are out of the tab order. Every view fits a 390 px phone screen without sideways scrolling.
The latency and throughput figures rest on analytic shortcuts:
A discrete-event simulation checks those shortcuts. It does not check the catalogue, which the published-figure rows above cover.
design.json and sim.py. Then:
pip install simpy==4.1.1 && python sim.py design.json --runs 200 --seed 1 --json out.json.
hw-explorer-sim/1, simSpec() in the page) comes from the model's computed stages, not the
inputs. Per stage it holds the fixed latency, service time, both CVs, the average utilisation and the model's
wait.sim/sim.py, SimPy, pure Python) runs each pool as a line of FIFO servers in m.stages
order.
sim.py under Pyodide
0.27.7 in a Web Worker: 10 runs of 10,000 blocks per pool, with a progress bar.
py/simpy-4.1.1-py3-none-any.whl, verified against PyPI's SHA-256 when
committed and again in the worker before it is installed), so nothing comes from PyPI.sim/compare.py runs all 32 examples (10 runs × 20,000 blocks, seed 1) and writes
sim/results.json, which the Checks tab shows. CI re-runs it and fails if any verdict or figure changes.
sim/TOLERANCE.md, was committed before the first run. A check agrees when the
model's figure is inside the simulation's 95 % CI widened by 2 % (ceiling, utilisation), 5 % (mean) or 10 %
(queue waits, the percentile). The stack must be at least the simulated percentile.Outcome, in two runs under the same rule:
First run (901b1ac): 210 of 234 agree, 24 misses in two patterns.
The model was changed for both, with standard queueing results rather than fitted, and the change was committed before the re-run (0df9bfc):
Golden latencies moved in 14 examples. Nothing else moved.
Second run: 210 of 234 agree, 23 misses, and the unsafe ones are gone.
Microsoft publishes one-hour samples of two production LLM services (code completion and conversation) from the
Splitwise paper (Patel et al., ISCA 2024; CC BY 4.0). They give each request's arrival time and its prompt and reply
lengths. The two files are in sim/traces/, unchanged and SHA-256-pinned, with provenance in
SOURCE.md; a test checks their medians against the paper.
sim/trace_compare.py replays them through the split-pool example's prefill pool (time to first token):
The model is judged three times, each by a rule fixed before its replay (in sim/TOLERANCE.md): with the
example's inputs, given the trace's measured arrival CV, and figured for the trace's busiest minute.
Outcome: 4 of 14 rows agree. Both utilisation rows agree, and so does code completion's mean, both once the model has the trace's CV and once it is figured for the busiest minute.
Decode isn't replayed: its steps are clocked and batched. The cross-check below covers it.
sim/disagg_compare.py runs the explorer's LLM serving designs through
Disaggregated_Inference_Sim (pinned at
a2c14e2), a SimPy simulator of prefill/decode serving with continuous batching and roofline steps.
simLlmSpec, to sim/disagg/specs/) with the explorer's own
peak rates, efficiencies and memory, so the two tools differ only in how they model serving.llmserve (batch 128, batch 32, Llama 3.1 8B), fixed in
sim/TOLERANCE.md with the rule before the first run.Outcome: 5 of 19 rows agree. Every miss has a cause the stage breakdowns show:
llmsplit the explorer's p99 step of 50.7 ms is
just over.ba37774), its prefill dispatcher counted waiting
prompts but not the one in service, so new prompts piled onto the first instance (busy 99 %, 99 %, 62 %, 0 %; a
38 ms mean wait). That wait offset the explorer's all-reduce, and the p99 time to first token agreed (6 of 19).
Fixed on 2026-10-28 (PR #2, the only
change in a2c14e2) and re-run under the same rule and seeds: the instances run 83 %, 81 %, 76 %, 19 % busy, the
step and memory figures are unchanged, and that one agreement becomes a miss. The earlier run is kept in
sim/disagg_results_ba37774.json.sim/simfront_compare.py runs the matrix multiply each design's Chip tab analyses through simfront.accel, the SimPy
accelerator model in Torch_Sim_Frontend (pinned at
53b1419, installed without PyTorch). It cuts the multiply into blocks that fit its buffer and runs them event by
event through DMA engines, the buffer and an output-stationary array.
simChipSpec, to sim/simfront/specs/): the explorer's cores as
one array at their combined clock, its SRAM (half per tile), and its DRAM bandwidth.chiparray, llmserve (each weight- and output-stationary), llmserve at batch 32 and trainllm,
fixed in sim/TOLERANCE.md with the rule (±10 % on array time, traffic and time; matching bound verdicts) before
the first run.Outcome: 18 of 24 rows agree.
The Checks tab ends with a table of rows that agree, by kind of figure and by simulator, counted from the rows above:
210 of 233 for the explorer's own simulator on the examples, 4 of 14 on the Azure traces, 5 of 19 for
Disaggregated_Inference_Sim and 18 of 24 for simfront.accel.
Files:
sim/sim.py: the simulator.sim/test_sim.py: the closed-form tests.sim/compare.py: every example against the rule.sim/TOLERANCE.md: the rule.sim/examples/*.json: each example's exported spec.sim/results.json: the committed run.sim/disagg_compare.py, sim/disagg/specs/*.json and sim/disagg_results.json: the Disaggregated_Inference_Sim
cross-check; sim/disagg_results_ba37774.json is its first run, on the simulator before the dispatch fix.sim/simfront_compare.py, sim/simfront/specs/*.json and sim/simfront_results.json: the Torch_Sim_Frontend
cross-check.sim/requirements.txt: pinned SimPy and pytest.sim/traces/: the Azure LLM traces and their source; sim/azure_trace.py loads and resamples them;
sim/trace_compare.py replays them and writes sim/trace_results.json; sim/test_azure_trace.py tests them.py/simpy-4.1.1-py3-none-any.whl: SimPy for the in-browser run, served from the site.tools/sim_sync.js: re-exports the specs and embeds sim.py and the results in the page; --check in
npm test.test/sim.js: the in-browser run end to end, at desktop and phone width (npm run test:sim).The user guide is guide.html (served at /guide, linked from the app's header), with screenshots in guide-img/
made by tools/guide_shots.js; test/guide.js (in npm test) checks its links, images, demos and accessibility.
The Optimise tab searches every DRAM type and speed grade, the host link, the on-chip interconnect, the scale-up fabric and the NICs. Where they limit, it also raises peak compute and SRAM banks, widens host memory (up to 12 channels, then faster DDR) and adds host cores. When a design misses the latency budget, it widens whichever transfer dominates (more DRAM units or a wider link). It adds accelerators, if allowed, only when nothing fits with the count as it is. It returns the best design for power, die area or a balance of the two, plus the trade-off between them, each design one click from being applied.
Practical limits apply unless you switch them off:
A search takes about 20 ms. The assistant can call it as a tool.
Applying a design from the table pins the one you had as A, so the change is compared straight away (below).
The Rate sweep tab asks the sizing questions again at 25 rates from a hundredth to a hundred times the target. First, for the accelerators you have, it shows the lowest-power practical device DRAM at each rate as a band, with each boundary found by bisection. A sentence sums it up, for example "LPDDR5X up to about 4.9 GB/s, then LPDDR6 up to about 196 GB/s, then HBM4". Below that it plots the DRAM power of the fastest grade of each type. A line goes faint where the width is a stretch and stops where the type becomes impractical.
Then it runs the optimiser at every rate and plots the system power and die area of the cheapest whole design. Your current design (and a pinned A) is drawn up to the rate where it runs out of capacity. A table lists where the DRAM type changes and where accelerators have to be added. The sweep takes about 0.4 s and runs in the background.
Compare pins the current design as A. Change anything, and a line under the weakest-link strip shows how the current design (B) differs on power, die area, maximum rate and latency. Bold means better than A. details opens the full table: the components that changed, the most loaded part, full-load power and energy per byte. swap exchanges A and B, and re-pin makes B the new A. The shared link carries A too, so a link opens the comparison as you left it.
Spec sheet (next to Edit inputs) puts the current design on one page: the requirement and the result, every part with its quantity and power (adding up to the system total, fans and conversion included), the load on every limit, and the open issues from the Notes tab. Print or save as PDF prints just the sheet in black on white, on one A4 page. Printing from the browser's menu prints the sheet too. The sheet carries the design's share link, so a printed copy leads back to the live model.
Click any of the five figures at the top (most loaded part, maximum rate, latency, power, cost) and the sum behind it opens underneath, with this design's numbers in it:
The test suite checks that each explanation ends on exactly the figure shown, in every example.
The Chip tab goes below the accelerator's headline numbers.
The tests check the array formulas, an exactly divisible weight-stationary case against M ÷ (M + rows + columns), and that chiplets add die-to-die power for the crossing traffic and split the silicon.
LLM serving (top of Inputs) derives the workload from the model instead of asking for bytes and op/B. Pick a model (Llama 3.1 8B, 70B or 405B, Mixtral 8×7B, DeepSeek-V3, or a custom shape), the weight and KV-cache precision, how many users decode at once, tokens per second per user, users per copy of the model (the batch) and the average context. Each copy reads every weight once per decode step, plus the KV cache of every user in its batch:
The derived inputs are locked while it is on, and follow the accelerator count, so the optimiser and the rate sweep work as usual (the sweep scales the users). For Llama 3.1 70B at 8 bits, 2,000 users at 20 tokens/s, 500 per copy and 4k-token contexts, that is 32.5 TB/s of reads, and 83 % of each step is KV cache rather than weights. The test suite checks the rate against the same sum done by hand.
Include prefill adds the prompts. Each request brings a prompt and gets a reply, so prompt tokens arrive at users × tokens/s × prompt ÷ reply. They are chunked into the same steps as decode (2,048 tokens a chunk, as vLLM and SGLang do), so they add no weight reads. They add arithmetic (2 × active parameters per token plus causal attention), KV-cache writes, and re-reads of each prompt's KV cache chunk by chunk. The context then averages the prompt plus half the reply, and the summary gives the shortest possible time to first token: one prompt alone on its copy's compute. With 3,600-token prompts and 1,000-token replies, prompts are about three quarters of the arithmetic, and the example becomes compute-bound.
Split prefill and decode across two pools (with prefill on) makes the hardware the decode pool and adds a prefill pool of the same accelerators, with its own node and rack counts and a time-to-first-token budget. That is how production serving increasingly runs (DistServe, Splitwise, NVIDIA Dynamo).
The example Prefill and decode on separate pools shows why it matters. On 48 accelerators in one pool the prompts' arithmetic stretches each decode step to 73 ms against a 50 ms budget. Split 16 for decode and 32 for prefill, decode steps stay inside the budget and the first token comes in about 140 ms. Tests check that the arithmetic divides exactly between the pools and that power and capital add up.
The new example LLM serving from the model's shape starts here, and the assistant has a matching
set_llm_workload tool.
LLM training (in Inputs, below serving) derives the workload for pre-training from the model's shape, the precision (BF16 or FP8), training tokens per second, sequence length, global batch, micro-batch, and tensor and pipeline parallelism. Data parallelism is whatever the accelerator count leaves.
The summary gives the parallel layout, the bubble, memory, traffic, the maximum tokens/s on the hardware, and the days and cost of a whole run (15T tokens by default). Cost is per million training tokens. The new example LLM training from the model's shape (Llama 3.1 70B, BF16, 1,024 accelerators) is compute-bound at 62 % with a 19 % bubble. Tests check the arithmetic and memory against the formulas by hand.
The training model is not checked against a published run. The public ones don't give enough detail to make it a real test: Meta's Llama 3.1 405B run used interleaved pipeline schedules and memory settings that aren't fully published, and its 70B run's parallelism isn't published at all. Choosing those settings until the GPU-hours match would be fitting, not checking.
The Cost tab, and a fifth figure in the strip at the top, put a price on the design.
The default is build cost, what the parts cost to make. Purchase price adds a vendor gross margin on the accelerators (NVIDIA reports about 75 %). Electricity price, write-off period and the share of time at the target rate are under Cost assumptions in Inputs. Wafer, HBM, packaging and facility prices come from published 2025–26 estimates (Epoch AI, Silicon Analysts, JLL, DigiTimes); fabric, network and host prices are rough assumptions. Cost also appears on the spec sheet and in Compare, and the optimiser can aim for the lowest cost a year.
The address holds the example the design started from plus only the fields that differ from it, so an unchanged
example is #d=nvl72 and a changed one reads like #d=nvl72,T:2e12,dev.units:6. A pinned A follows as
&a=… in the same form. Links that changed designs typically stay well under 150 characters, against about
1,350 when the whole state was stored. Older links, which held the full state as base64 JSON (#s=…), still
load. A short link names its example, so if that example is edited in a later version, the link opens the
edited version plus the same changes.
Every link's drawer breaks its rate down from raw to usable, and the products are exactly the efficiencies the model uses:
The Minimum specs link table shows each option's total overhead.
Device DRAM comes as 51 speed grades in 16 types, for example DDR5-4800 to 7200, GDDR6 14–20 Gb/s, HBM3 5.2–6.4 Gb/s, HBM3E 8.0–9.8 Gb/s and HBM4 6.4–10 Gb/s. You pick the type, the speed grade and the number of channels, devices or stacks.
Two DDR6 grades (8,800 and 17,600 MT/s) are listed for comparison as host memory only. JEDEC has not published DDR6: the rates are reported targets and every other figure is DDR5's. They are not offered as device DRAM and the optimiser does not search them; with them the Model tab's catalogue lists 53 grades in 17 types.
Sizing everything for the same simultaneous peak, and adding up every stage's worst latency, stacks tolerances to a worst case that rarely happens. A collapsed Variability & tolerances section offers the alternative:
A weakest-link strip under the headline figures lists every component on the data path, in order, with the rate it alone could sustain. The weakest is inverted and sets the system's maximum rate. With tolerance on, each link also shows how often it came out weakest.
A system has to process 1 GB of data per millisecond. How wide would a bank of LPDDR4 at full speed have to be? Would it need HBM? If every byte processed also has to cross the host link in each direction, what link does it need?
1 GB/ms is 1 TB/s. At 3200 MT/s an x16 LPDDR4 channel peaks at 6.4 GB/s, so even at 100 % efficiency with no headroom the bus would be about 2,500 bits wide. At a realistic 92 % streaming efficiency and an 80 % utilisation ceiling it is 213 channels, a 3,408-bit bus: about 7,000 signal balls, 190 mm of PHY beachfront on the die and roughly 230 mm² of PHY. That is far beyond the 256-bit to 1024-bit that LPDDR is ever built at. Two HBM3E stacks carry the same traffic with 14 mm of edge. The link is the harder problem: a PCIe 5.0 x16 delivers about 52 GB/s per direction after encoding and TLP overhead, so 1 TB/s each way needs 24 of them (6 even at PCIe 7.0). The tool's answer is to move less data across the link, or to put the accelerator on the package. It also shows that the host's own DRAM would have to carry 4 TB/s to feed that link.
Everything flows from the processing rate T, the bytes of input processed per second. For each component:
How each kind of component is treated:
All catalogue numbers are indicative, first-order figures for a 5 nm-class accelerator (JEDEC data rates, public datasheets and published estimates). They are good for seeing which component limits and by roughly how much, not for sign-off. The Model tab in the app lists every value.
It is one self-contained index.html file with no build step: open it in any modern browser. npm install && npm test runs the checks, including mocked runs of the assistant against each provider's API.
The simulator: python3 -m venv .venv && .venv/bin/pip install -r sim/requirements.txt, then
.venv/bin/python -m pytest sim and .venv/bin/python sim/compare.py (about 15 minutes for every example on one
core; --jobs 4 in CI). After a model change, node tools/sim_sync.js re-exports the specs and re-embeds the page's
copies.