wolfpine 2.1__tar.gz → 2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. {wolfpine-2.1 → wolfpine-2.2}/PKG-INFO +68 -16
  2. {wolfpine-2.1 → wolfpine-2.2}/README.md +67 -15
  3. wolfpine-2.2/framework/arch/__init__.py +14 -0
  4. wolfpine-2.2/framework/arch/blackhole.py +172 -0
  5. wolfpine-2.2/framework/arch/profile.py +296 -0
  6. wolfpine-2.2/framework/arch/wormhole.py +82 -0
  7. {wolfpine-2.1 → wolfpine-2.2}/framework/behaviour.py +5 -1
  8. wolfpine-2.2/framework/bridge/__init__.py +71 -0
  9. wolfpine-2.2/framework/bridge/_flatbuf/DEVICE_COMMAND.py +12 -0
  10. wolfpine-2.2/framework/bridge/_flatbuf/DeviceRequestResponse.py +121 -0
  11. wolfpine-2.2/framework/bridge/_flatbuf/__init__.py +0 -0
  12. wolfpine-2.2/framework/bridge/_flatbuf/tt_vcs_core.py +37 -0
  13. wolfpine-2.2/framework/bridge/convention_guard_test.py +148 -0
  14. wolfpine-2.2/framework/bridge/cores.py +387 -0
  15. wolfpine-2.2/framework/bridge/cores_test.py +181 -0
  16. wolfpine-2.2/framework/bridge/device.py +558 -0
  17. wolfpine-2.2/framework/bridge/fabric.py +296 -0
  18. wolfpine-2.2/framework/bridge/fabric_test.py +169 -0
  19. wolfpine-2.2/framework/bridge/grid.py +107 -0
  20. wolfpine-2.2/framework/bridge/grid_test.py +154 -0
  21. wolfpine-2.2/framework/bridge/host_stop_test.py +193 -0
  22. wolfpine-2.2/framework/bridge/hostlink.py +245 -0
  23. wolfpine-2.2/framework/bridge/hostlink_test.py +224 -0
  24. wolfpine-2.2/framework/bridge/materialise.py +275 -0
  25. wolfpine-2.2/framework/bridge/materialise_test.py +401 -0
  26. wolfpine-2.2/framework/bridge/profiler_readback_test.py +377 -0
  27. wolfpine-2.2/framework/bridge/protocol.py +94 -0
  28. wolfpine-2.2/framework/bridge/trace.py +96 -0
  29. wolfpine-2.2/framework/bridge/transport.py +89 -0
  30. wolfpine-2.2/framework/cli.py +335 -0
  31. wolfpine-2.2/framework/cli_test.py +85 -0
  32. wolfpine-2.2/framework/device/__init__.py +0 -0
  33. wolfpine-2.2/framework/device/blackhole.py +69 -0
  34. wolfpine-2.2/framework/device/clock.py +694 -0
  35. wolfpine-2.2/framework/device/clock_test.py +445 -0
  36. wolfpine-2.2/framework/device/deadlock.py +1076 -0
  37. wolfpine-2.2/framework/device/deadlock_test.py +947 -0
  38. wolfpine-2.2/framework/device/device.py +54 -0
  39. wolfpine-2.2/framework/device/dram_banks_test.py +227 -0
  40. wolfpine-2.2/framework/device/dram_cost_model_test.py +731 -0
  41. wolfpine-2.2/framework/device/noc_translation_test.py +486 -0
  42. wolfpine-2.2/framework/device/parity_test.py +216 -0
  43. wolfpine-2.2/framework/device/reset.py +22 -0
  44. wolfpine-2.2/framework/device/tiles.py +1100 -0
  45. wolfpine-2.2/framework/device/tt_device.py +1031 -0
  46. wolfpine-2.2/framework/device/wormhole.py +191 -0
  47. wolfpine-2.2/framework/memory/__init__.py +0 -0
  48. wolfpine-2.2/framework/memory/mem_mapable.py +15 -0
  49. wolfpine-2.2/framework/memory/memory.py +400 -0
  50. wolfpine-2.2/framework/memory/memory_map.py +114 -0
  51. wolfpine-2.2/framework/memory/sparse_memory_test.py +131 -0
  52. wolfpine-2.2/framework/misc/__init__.py +0 -0
  53. wolfpine-2.2/framework/misc/mailbox.py +124 -0
  54. wolfpine-2.2/framework/misc/perf_counters.py +551 -0
  55. wolfpine-2.2/framework/misc/perf_counters_test.py +227 -0
  56. wolfpine-2.2/framework/misc/tile_ctrl.py +265 -0
  57. wolfpine-2.2/framework/misc/tile_ctrl_test.py +116 -0
  58. wolfpine-2.2/framework/misc/ttsync.py +114 -0
  59. wolfpine-2.2/framework/network/__init__.py +0 -0
  60. wolfpine-2.2/framework/network/alignment.py +148 -0
  61. wolfpine-2.2/framework/network/alignment_test.py +222 -0
  62. wolfpine-2.2/framework/network/attribution.py +572 -0
  63. wolfpine-2.2/framework/network/attribution_test.py +683 -0
  64. wolfpine-2.2/framework/network/multicast_order.py +260 -0
  65. wolfpine-2.2/framework/network/multicast_order_test.py +595 -0
  66. wolfpine-2.2/framework/network/noc_coords.py +72 -0
  67. wolfpine-2.2/framework/network/noc_cost_model_test.py +857 -0
  68. wolfpine-2.2/framework/network/noc_counter_accounting_test.py +363 -0
  69. wolfpine-2.2/framework/network/noc_endpoint_consistency_test.py +435 -0
  70. wolfpine-2.2/framework/network/noc_link_congestion_test.py +445 -0
  71. wolfpine-2.2/framework/network/noc_registers_test.py +141 -0
  72. wolfpine-2.2/framework/network/noc_routing_test.py +940 -0
  73. wolfpine-2.2/framework/network/noc_shadow.py +146 -0
  74. wolfpine-2.2/framework/network/noc_translation.py +115 -0
  75. wolfpine-2.2/framework/network/noc_translation_test.py +89 -0
  76. wolfpine-2.2/framework/network/tt_noc.py +2741 -0
  77. wolfpine-2.2/framework/pe/__init__.py +0 -0
  78. wolfpine-2.2/framework/pe/pcbuf.py +193 -0
  79. wolfpine-2.2/framework/pe/pcbuf_test.py +390 -0
  80. wolfpine-2.2/framework/pe/pe.py +27 -0
  81. wolfpine-2.2/framework/pe/register/__init__.py +0 -0
  82. wolfpine-2.2/framework/pe/register/register.py +68 -0
  83. wolfpine-2.2/framework/pe/register/register_file.py +69 -0
  84. wolfpine-2.2/framework/pe/rv/__init__.py +0 -0
  85. wolfpine-2.2/framework/pe/rv/babyriscv.py +339 -0
  86. wolfpine-2.2/framework/pe/rv/breakpoint.py +92 -0
  87. wolfpine-2.2/framework/pe/rv/breakpoint_test.py +99 -0
  88. wolfpine-2.2/framework/pe/rv/cost.py +816 -0
  89. wolfpine-2.2/framework/pe/rv/cost_test.py +776 -0
  90. wolfpine-2.2/framework/pe/rv/isa/__init__.py +0 -0
  91. wolfpine-2.2/framework/pe/rv/isa/a_isa.py +71 -0
  92. wolfpine-2.2/framework/pe/rv/isa/a_isa_test.py +112 -0
  93. wolfpine-2.2/framework/pe/rv/isa/b_isa.py +198 -0
  94. wolfpine-2.2/framework/pe/rv/isa/b_isa_test.py +118 -0
  95. wolfpine-2.2/framework/pe/rv/isa/guard_isa.py +64 -0
  96. wolfpine-2.2/framework/pe/rv/isa/i_isa.py +760 -0
  97. wolfpine-2.2/framework/pe/rv/isa/i_isa_test.py +212 -0
  98. wolfpine-2.2/framework/pe/rv/isa/m_isa.py +92 -0
  99. wolfpine-2.2/framework/pe/rv/isa/rv_isa.py +100 -0
  100. wolfpine-2.2/framework/pe/rv/isa/tt_isa.py +53 -0
  101. wolfpine-2.2/framework/pe/rv/isa/zfh_isa.py +247 -0
  102. wolfpine-2.2/framework/pe/rv/isa/zfh_isa_test.py +253 -0
  103. wolfpine-2.2/framework/pe/rv/isa/zicsr_isa.py +570 -0
  104. wolfpine-2.2/framework/pe/rv/isa/zicsr_isa_test.py +517 -0
  105. wolfpine-2.2/framework/pe/rv/rv32.py +421 -0
  106. wolfpine-2.2/framework/pe/rv/spin.py +749 -0
  107. wolfpine-2.2/framework/pe/rv/spin_test.py +512 -0
  108. wolfpine-2.2/framework/pe/tensix/__init__.py +0 -0
  109. wolfpine-2.2/framework/pe/tensix/backend.py +423 -0
  110. wolfpine-2.2/framework/pe/tensix/backend_cost_model_test.py +1277 -0
  111. wolfpine-2.2/framework/pe/tensix/backends/__init__.py +0 -0
  112. wolfpine-2.2/framework/pe/tensix/backends/backend_base.py +675 -0
  113. wolfpine-2.2/framework/pe/tensix/backends/config.py +455 -0
  114. wolfpine-2.2/framework/pe/tensix/backends/fpu_jit.py +156 -0
  115. wolfpine-2.2/framework/pe/tensix/backends/fpu_jit_kernel.py +184 -0
  116. wolfpine-2.2/framework/pe/tensix/backends/matrix.py +2505 -0
  117. wolfpine-2.2/framework/pe/tensix/backends/misc.py +486 -0
  118. wolfpine-2.2/framework/pe/tensix/backends/mover.py +195 -0
  119. wolfpine-2.2/framework/pe/tensix/backends/packer.py +917 -0
  120. wolfpine-2.2/framework/pe/tensix/backends/sync.py +425 -0
  121. wolfpine-2.2/framework/pe/tensix/backends/thcon.py +860 -0
  122. wolfpine-2.2/framework/pe/tensix/backends/unpacker.py +1817 -0
  123. wolfpine-2.2/framework/pe/tensix/backends/vector.py +2363 -0
  124. wolfpine-2.2/framework/pe/tensix/blackhole_decode_test.py +161 -0
  125. wolfpine-2.2/framework/pe/tensix/blackhole_ops_test.py +235 -0
  126. wolfpine-2.2/framework/pe/tensix/conversion_batch_test.py +361 -0
  127. wolfpine-2.2/framework/pe/tensix/elementwise_datapath_test.py +464 -0
  128. wolfpine-2.2/framework/pe/tensix/fma_model_test.py +92 -0
  129. wolfpine-2.2/framework/pe/tensix/fpu_accumulate_test.py +545 -0
  130. wolfpine-2.2/framework/pe/tensix/frontend.py +1170 -0
  131. wolfpine-2.2/framework/pe/tensix/frontend_backpressure_test.py +399 -0
  132. wolfpine-2.2/framework/pe/tensix/implied_src_format_test.py +104 -0
  133. wolfpine-2.2/framework/pe/tensix/matrix_cost_model_test.py +224 -0
  134. wolfpine-2.2/framework/pe/tensix/matrix_mov_pool_test.py +611 -0
  135. wolfpine-2.2/framework/pe/tensix/mop_clobber_test.py +175 -0
  136. wolfpine-2.2/framework/pe/tensix/mover_cost_model_test.py +321 -0
  137. wolfpine-2.2/framework/pe/tensix/pack_dest_rd_ctrl_test.py +235 -0
  138. wolfpine-2.2/framework/pe/tensix/pack_intf_sel_test.py +235 -0
  139. wolfpine-2.2/framework/pe/tensix/pack_strided_test.py +365 -0
  140. wolfpine-2.2/framework/pe/tensix/pack_yzw_addr_test.py +243 -0
  141. wolfpine-2.2/framework/pe/tensix/registers.py +296 -0
  142. wolfpine-2.2/framework/pe/tensix/registers_test.py +273 -0
  143. wolfpine-2.2/framework/pe/tensix/semaphore_contract.py +286 -0
  144. wolfpine-2.2/framework/pe/tensix/semaphore_contract_test.py +316 -0
  145. wolfpine-2.2/framework/pe/tensix/setdvalid_srcrow_test.py +309 -0
  146. wolfpine-2.2/framework/pe/tensix/sfpu_blackhole_modes_test.py +536 -0
  147. wolfpine-2.2/framework/pe/tensix/sfpu_blackhole_test.py +132 -0
  148. wolfpine-2.2/framework/pe/tensix/sfpu_lut_transp_test.py +478 -0
  149. wolfpine-2.2/framework/pe/tensix/sync_mixed_queue_test.py +70 -0
  150. wolfpine-2.2/framework/pe/tensix/sync_mutex_issue_test.py +95 -0
  151. wolfpine-2.2/framework/pe/tensix/sync_mutex_queue_test.py +146 -0
  152. wolfpine-2.2/framework/pe/tensix/tdma.py +104 -0
  153. wolfpine-2.2/framework/pe/tensix/tensix.py +81 -0
  154. wolfpine-2.2/framework/pe/tensix/tensix_backend_cfg.yaml +3637 -0
  155. wolfpine-2.2/framework/pe/tensix/tensix_backend_cfg_blackhole.yaml +3280 -0
  156. wolfpine-2.2/framework/pe/tensix/tensix_instruction_costs.yaml +1489 -0
  157. wolfpine-2.2/framework/pe/tensix/tensix_instructions.yaml +3192 -0
  158. wolfpine-2.2/framework/pe/tensix/unpack_stride_test.py +489 -0
  159. wolfpine-2.2/framework/pe/tensix/unpack_untilize_test.py +433 -0
  160. wolfpine-2.2/framework/pe/tensix/unpacker_cost_model_test.py +1001 -0
  161. wolfpine-2.2/framework/pe/tensix/util.py +649 -0
  162. wolfpine-2.2/framework/pe/tensix/waitgate_allowed_client_test.py +256 -0
  163. wolfpine-2.2/framework/pe/tensix/waitgate_latched_wait_test.py +257 -0
  164. wolfpine-2.2/framework/pe/tensix/waitgate_multi_semaphore_test.py +254 -0
  165. wolfpine-2.2/framework/pe/tensix/waitgate_stallwait_blocked_test.py +148 -0
  166. wolfpine-2.2/framework/pe/tensix/zeroacc_blackhole_test.py +293 -0
  167. wolfpine-2.2/framework/perf/__init__.py +10 -0
  168. wolfpine-2.2/framework/perf/costs.py +456 -0
  169. wolfpine-2.2/framework/perf/costs_test.py +1217 -0
  170. wolfpine-2.2/framework/perf/datasets/dramratebench-blackhole-2026-08-09.csv +103 -0
  171. wolfpine-2.2/framework/perf/datasets/nocbench-blackhole-2026-08-09-2224-epoch.csv +163 -0
  172. wolfpine-2.2/framework/perf/datasets/nocbench-blackhole-2026-08-09-2224.csv +154 -0
  173. wolfpine-2.2/framework/perf/datasets/nocbench-blackhole-2026-08-09-repeat.csv +163 -0
  174. wolfpine-2.2/framework/perf/datasets/nocbench-blackhole-2026-08-09.csv +145 -0
  175. wolfpine-2.2/framework/perf/datasets/nocbench-blackhole-sizes.csv +130 -0
  176. wolfpine-2.2/framework/perf/datasets/nocbench-blackhole.csv +124 -0
  177. wolfpine-2.2/framework/perf/datasets/nocbench-grid-blackhole.csv +136 -0
  178. wolfpine-2.2/framework/perf/datasets/nocbench-grid-wormhole-sim.csv +78 -0
  179. wolfpine-2.2/framework/perf/datasets/nocreadbench-blackhole-2026-08-09.csv +145 -0
  180. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-2026-08-09-gset1.csv +37 -0
  181. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-2026-08-09-gset2.csv +37 -0
  182. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-2026-08-09-gset3.csv +42 -0
  183. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-2026-08-09-gset4.csv +42 -0
  184. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-2026-08-09-pairs.csv +50 -0
  185. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-2026-08-09-qdrain.csv +144 -0
  186. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-2026-08-09-repeat.csv +1618 -0
  187. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-2026-08-09.csv +1615 -0
  188. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-blocks8.csv +1687 -0
  189. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-gset1.csv +56 -0
  190. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole-gset2.csv +56 -0
  191. wolfpine-2.2/framework/perf/datasets/riscvbench-blackhole.csv +1751 -0
  192. wolfpine-2.2/framework/perf/datasets/riscvbench-qdrain.csv +225 -0
  193. wolfpine-2.2/framework/perf/datasets/tensixbench-blackhole-2026-08-09-blocks64.csv +511 -0
  194. wolfpine-2.2/framework/perf/datasets/tensixbench-blackhole-2026-08-09.csv +542 -0
  195. wolfpine-2.2/framework/perf/datasets/tensixbench-blackhole-dvalid-per-thread.csv +524 -0
  196. wolfpine-2.2/framework/perf/datasets/tensixbench-blackhole-unpacr-nop-bf16.csv +160 -0
  197. wolfpine-2.2/framework/perf/datasets/tensixbench-blackhole-unpacr-nop-fp16.csv +159 -0
  198. wolfpine-2.2/framework/perf/datasets/tensixbench-blackhole-unpacr-nop-fp32.csv +160 -0
  199. wolfpine-2.2/framework/perf/datasets/tensixbench-blackhole-unpacr-nop-tf32.csv +159 -0
  200. wolfpine-2.2/framework/perf/datasets/tensixbench-blackhole.csv +556 -0
  201. wolfpine-2.2/framework/perf/dram_rate_sweep.py +721 -0
  202. wolfpine-2.2/framework/perf/dram_rate_sweep_test.py +523 -0
  203. wolfpine-2.2/framework/perf/energy_activity.py +283 -0
  204. wolfpine-2.2/framework/perf/energy_activity_test.py +163 -0
  205. wolfpine-2.2/framework/perf/energy_quarantine_test.py +88 -0
  206. wolfpine-2.2/framework/perf/energy_rank.py +2028 -0
  207. wolfpine-2.2/framework/perf/energy_rank_test.py +2082 -0
  208. wolfpine-2.2/framework/perf/model.py +1472 -0
  209. wolfpine-2.2/framework/perf/model_test.py +344 -0
  210. wolfpine-2.2/framework/perf/noc_congestion_plan.py +1454 -0
  211. wolfpine-2.2/framework/perf/noc_congestion_plan_test.py +468 -0
  212. wolfpine-2.2/framework/perf/noc_congestion_sweep.py +963 -0
  213. wolfpine-2.2/framework/perf/noc_congestion_sweep_test.py +606 -0
  214. wolfpine-2.2/framework/perf/noc_dataset_sweep.py +1358 -0
  215. wolfpine-2.2/framework/perf/noc_dataset_sweep_test.py +452 -0
  216. wolfpine-2.2/framework/perf/noc_events.py +1648 -0
  217. wolfpine-2.2/framework/perf/noc_events_test.py +867 -0
  218. wolfpine-2.2/framework/perf/noc_issue_loop.py +345 -0
  219. wolfpine-2.2/framework/perf/noc_issue_loop_test.py +195 -0
  220. wolfpine-2.2/framework/perf/retire_attribution.py +1248 -0
  221. wolfpine-2.2/framework/perf/retire_attribution_test.py +646 -0
  222. wolfpine-2.2/framework/perf/riscv_bench_sweep.py +2600 -0
  223. wolfpine-2.2/framework/perf/riscv_bench_sweep_test.py +1422 -0
  224. wolfpine-2.2/framework/perf/stall_attribution.py +1370 -0
  225. wolfpine-2.2/framework/perf/stall_attribution_test.py +947 -0
  226. wolfpine-2.2/framework/perf/tensix_bench_sweep.py +1252 -0
  227. wolfpine-2.2/framework/perf/tensix_bench_sweep_test.py +824 -0
  228. wolfpine-2.2/framework/perf/unit_costs.yaml +2042 -0
  229. wolfpine-2.2/framework/sim/__init__.py +17 -0
  230. wolfpine-2.2/framework/sim/blackhole/__init__.py +6 -0
  231. wolfpine-2.2/framework/sim/blackhole/__main__.py +221 -0
  232. wolfpine-2.2/framework/sim/blackhole/bh_device.py +36 -0
  233. wolfpine-2.2/framework/sim/blackhole/cluster_descriptor.yaml +50 -0
  234. wolfpine-2.2/framework/sim/blackhole/coords.py +144 -0
  235. wolfpine-2.2/framework/sim/blackhole/run.sh +43 -0
  236. wolfpine-2.2/framework/sim/blackhole/soc_descriptor.yaml +131 -0
  237. wolfpine-2.2/framework/sim/wormhole/__init__.py +6 -0
  238. wolfpine-2.2/framework/sim/wormhole/__main__.py +300 -0
  239. wolfpine-2.2/framework/sim/wormhole/cluster_descriptor.yaml +43 -0
  240. wolfpine-2.2/framework/sim/wormhole/coords.py +206 -0
  241. wolfpine-2.2/framework/sim/wormhole/run.sh +43 -0
  242. wolfpine-2.2/framework/sim/wormhole/soc_descriptor.yaml +160 -0
  243. wolfpine-2.2/framework/sim/wormhole/wh_device.py +30 -0
  244. wolfpine-2.2/framework/trace/README.md +876 -0
  245. wolfpine-2.2/framework/trace/__init__.py +92 -0
  246. wolfpine-2.2/framework/trace/attribution_test.py +655 -0
  247. wolfpine-2.2/framework/trace/auto.py +398 -0
  248. wolfpine-2.2/framework/trace/benchmark.py +107 -0
  249. wolfpine-2.2/framework/trace/bus.py +80 -0
  250. wolfpine-2.2/framework/trace/counters.py +206 -0
  251. wolfpine-2.2/framework/trace/diff_spike.py +79 -0
  252. wolfpine-2.2/framework/trace/diff_state.py +75 -0
  253. wolfpine-2.2/framework/trace/dwarf.py +386 -0
  254. wolfpine-2.2/framework/trace/elfdisc.py +346 -0
  255. wolfpine-2.2/framework/trace/events.py +438 -0
  256. wolfpine-2.2/framework/trace/hotspots.py +165 -0
  257. wolfpine-2.2/framework/trace/ids.py +71 -0
  258. wolfpine-2.2/framework/trace/invariants.py +217 -0
  259. wolfpine-2.2/framework/trace/observability_test.py +1224 -0
  260. wolfpine-2.2/framework/trace/queries/README.md +68 -0
  261. wolfpine-2.2/framework/trace/queries/counters.sql +163 -0
  262. wolfpine-2.2/framework/trace/report.py +886 -0
  263. wolfpine-2.2/framework/trace/state_dump.py +113 -0
  264. wolfpine-2.2/framework/trace/writers/__init__.py +3 -0
  265. wolfpine-2.2/framework/trace/writers/cachegrind.py +68 -0
  266. wolfpine-2.2/framework/trace/writers/commitlog.py +75 -0
  267. wolfpine-2.2/framework/trace/writers/jsonl.py +52 -0
  268. wolfpine-2.2/framework/trace/writers/lcov.py +85 -0
  269. wolfpine-2.2/framework/trace/writers/noc_parquet.py +144 -0
  270. wolfpine-2.2/framework/trace/writers/parquet.py +92 -0
  271. wolfpine-2.2/framework/trace/writers/perfetto.py +440 -0
  272. wolfpine-2.2/framework/util/__init__.py +0 -0
  273. wolfpine-2.2/framework/util/bits.py +105 -0
  274. wolfpine-2.2/framework/util/conversion.py +48 -0
  275. wolfpine-2.2/framework/util/yaml_cache.py +80 -0
  276. {wolfpine-2.1 → wolfpine-2.2}/pyproject.toml +11 -3
  277. {wolfpine-2.1 → wolfpine-2.2}/wolfpine.egg-info/PKG-INFO +68 -16
  278. wolfpine-2.2/wolfpine.egg-info/SOURCES.txt +284 -0
  279. wolfpine-2.2/wolfpine.egg-info/entry_points.txt +2 -0
  280. wolfpine-2.1/wolfpine.egg-info/SOURCES.txt +0 -11
  281. {wolfpine-2.1 → wolfpine-2.2}/LICENSE +0 -0
  282. {wolfpine-2.1 → wolfpine-2.2}/framework/__init__.py +0 -0
  283. {wolfpine-2.1 → wolfpine-2.2}/framework/behaviour_test.py +0 -0
  284. {wolfpine-2.1 → wolfpine-2.2}/setup.cfg +0 -0
  285. {wolfpine-2.1 → wolfpine-2.2}/wolfpine.egg-info/dependency_links.txt +0 -0
  286. {wolfpine-2.1 → wolfpine-2.2}/wolfpine.egg-info/requires.txt +0 -0
  287. {wolfpine-2.1 → wolfpine-2.2}/wolfpine.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wolfpine
3
- Version: 2.1
3
+ Version: 2.2
4
4
  Summary: A framework for simulating AI accelerators, with Tenstorrent Wormhole and Blackhole backends
5
5
  Author: Nick Brown
6
6
  License-Expression: BSD-3-Clause
@@ -41,6 +41,7 @@ down, poke at simulator state directly from a driver script.
41
41
 
42
42
  ## Contents
43
43
 
44
+ - [Quick start](#quick-start)
44
45
  - [Installation](#installation)
45
46
  - [Using Wolfpine as a simulator for tt-metal](#using-wolfpine-as-a-simulator-for-tt-metal)
46
47
  - [Repository overview](#repository-overview)
@@ -53,11 +54,56 @@ Building tooling on those outputs: [`docs/trace-schema.md`](docs/trace-schema.md
53
54
  is the stable, versioned schema — field meanings, units and what you may
54
55
  rely on.
55
56
 
57
+ ## Quick start
58
+
59
+ You need Python ≥ 3.10 and a built [tt-metal](https://github.com/tenstorrent/tt-metal)
60
+ checkout. Install Wolfpine from PyPI and tell it where tt-metal is:
61
+
62
+ ```bash
63
+ pip install wolfpine
64
+ wolfpine config --tt-metal /path/to/tt-metal # once; saved to ~/.config/wolfpine
65
+ wolfpine doctor # check what it found
66
+ ```
67
+
68
+ Then run any tt-metal program against the simulator with `wolfpine run <target>`, where the
69
+ target is `wormhole`, `blackhole`, or `hw` for real hardware. The program needs no changes:
70
+
71
+ ```bash
72
+ cd /path/to/tt-metal/build/programming_examples
73
+ wolfpine run wormhole ./metal_example_add_2_integers_in_compute # simulated Wormhole
74
+ wolfpine run blackhole ./metal_example_add_2_integers_in_compute # simulated Blackhole
75
+ wolfpine run hw ./metal_example_add_2_integers_in_compute # the same binary on hardware
76
+ ```
77
+
78
+ `wolfpine run` sets tt-metal's environment variables (`TT_METAL_SIMULATOR`,
79
+ `TT_METAL_SLOW_DISPATCH_MODE`, `TT_METAL_RUNTIME_ROOT`, `LD_LIBRARY_PATH`) for that one
80
+ command only, so nothing is left behind in your shell. Leave out the command to get a
81
+ subshell with the target switched on (`exit` to leave it). To switch your current shell
82
+ instead — handy when building your own programs with CMake — `eval` the exports; `off`
83
+ puts back exactly what was there before:
84
+
85
+ ```bash
86
+ eval "$(wolfpine env blackhole)" # or wormhole, or hw
87
+ cmake -B build -S . && cmake --build build && ./build/my_program
88
+ eval "$(wolfpine env off)"
89
+ ```
90
+
91
+ Run `wolfpine --help` for the full list of commands.
92
+
56
93
  ## Installation
57
94
 
58
- Wolfpine is pure Python and requires Python ≥ 3.10. Clone the repository and install it in
59
- editable mode, which pulls in its dependencies (numpy, pyyaml, pynng, flatbuffers,
60
- pyarrow, pyelftools):
95
+ Wolfpine is pure Python and requires Python ≥ 3.10. It depends on numpy, pyyaml, pynng,
96
+ flatbuffers, pyarrow and pyelftools, which pip installs for you.
97
+
98
+ **From PyPI** — the simulator library plus the `wolfpine` command, everything needed to run
99
+ tt-metal programs:
100
+
101
+ ```bash
102
+ pip install wolfpine
103
+ ```
104
+
105
+ **From source** — for the example programs, the low-level driver scripts and the test
106
+ suite, or to hack on the simulator itself:
61
107
 
62
108
  ```bash
63
109
  git clone https://github.com/hedgehope/wolfpine.git
@@ -65,9 +111,9 @@ cd wolfpine
65
111
  pip install -e . # add [dev] for the ruff + pytest tooling: pip install -e .[dev]
66
112
  ```
67
113
 
68
- This installs the `framework` simulator library. The example drivers live under `driver/`
69
- and are run from the repository root, so keep the repo root on your `PYTHONPATH` when
70
- invoking them directly (the tt-metal flow below wires this up for you automatically):
114
+ Both install the `framework` simulator library and the `wolfpine` command. The example
115
+ drivers under `driver/` are not part of the package; they run from the repository root, so
116
+ keep the repo root on your `PYTHONPATH` when invoking them directly:
71
117
 
72
118
  ```bash
73
119
  export PYTHONPATH=$PWD:$PYTHONPATH
@@ -75,22 +121,28 @@ export PYTHONPATH=$PWD:$PYTHONPATH
75
121
 
76
122
  ## Using Wolfpine as a simulator for tt-metal
77
123
 
78
- tt-metal's UMD has a "simulation" chip backend: point `TT_METAL_SIMULATOR` at the
79
- [`driver/wormhole`](driver/wormhole) directory and UMD launches Wolfpine in place of real
80
- silicon, so an ordinary tt-metal program runs against the simulator over a socket — no
81
- code changes, exactly as it would run on hardware. The minimal setup:
124
+ tt-metal's UMD has a "simulation" chip backend: point `TT_METAL_SIMULATOR` at a simulator
125
+ directory and UMD launches Wolfpine in place of real silicon, so an ordinary tt-metal program
126
+ runs against the simulator over a socket — no code changes, exactly as it would run on
127
+ hardware. The simulator directories ship inside the package (`framework/sim/wormhole` and
128
+ `framework/sim/blackhole`), which is why the [`wolfpine` command](#quick-start) is the easy
129
+ way in: it finds them for you.
130
+
131
+ `wolfpine` looks for tt-metal in this order: `--tt-metal` (given before the target, e.g.
132
+ `wolfpine run --tt-metal /path wormhole ./prog`), then `$TT_METAL_RUNTIME_ROOT` or
133
+ `$TT_METAL_HOME`, then the path saved by `wolfpine config`. If you would rather export
134
+ the variables yourself, these are the ones it manages:
82
135
 
83
136
  ```bash
84
137
  export TT_METAL_RUNTIME_ROOT=/path/to/tt-metal # your built tt-metal checkout
85
- export TT_METAL_SIMULATOR="$PWD/driver/wormhole" # the switch: route execution to Wolfpine
138
+ export TT_METAL_SIMULATOR="$(python3 -c 'from framework.sim import simulator_dir; print(simulator_dir("wormhole"))')"
86
139
  export TT_METAL_SLOW_DISPATCH_MODE=1 # the only launch path the sim models
87
140
  export LD_LIBRARY_PATH="$TT_METAL_RUNTIME_ROOT/build/lib:$LD_LIBRARY_PATH"
88
-
89
- # then run any tt-metal program, e.g. an upstream example:
90
- cd "$TT_METAL_RUNTIME_ROOT/build/programming_examples"
91
- ./metal_example_add_2_integers_in_compute
92
141
  ```
93
142
 
143
+ In a repository checkout `driver/wormhole` and `driver/blackhole` link to the same simulator
144
+ directories, so `TT_METAL_SIMULATOR=$PWD/driver/wormhole` works too.
145
+
94
146
  A set of ready-to-run example programs, plus a build-and-run test suite, lives under
95
147
  [`examples`](examples). For the full walkthrough — building the
96
148
  examples, the `TT_SIM_TENSIX_COORDS` grid-pinning knob, diagnostics, structured tracing and
@@ -20,6 +20,7 @@ down, poke at simulator state directly from a driver script.
20
20
 
21
21
  ## Contents
22
22
 
23
+ - [Quick start](#quick-start)
23
24
  - [Installation](#installation)
24
25
  - [Using Wolfpine as a simulator for tt-metal](#using-wolfpine-as-a-simulator-for-tt-metal)
25
26
  - [Repository overview](#repository-overview)
@@ -32,11 +33,56 @@ Building tooling on those outputs: [`docs/trace-schema.md`](docs/trace-schema.md
32
33
  is the stable, versioned schema — field meanings, units and what you may
33
34
  rely on.
34
35
 
36
+ ## Quick start
37
+
38
+ You need Python ≥ 3.10 and a built [tt-metal](https://github.com/tenstorrent/tt-metal)
39
+ checkout. Install Wolfpine from PyPI and tell it where tt-metal is:
40
+
41
+ ```bash
42
+ pip install wolfpine
43
+ wolfpine config --tt-metal /path/to/tt-metal # once; saved to ~/.config/wolfpine
44
+ wolfpine doctor # check what it found
45
+ ```
46
+
47
+ Then run any tt-metal program against the simulator with `wolfpine run <target>`, where the
48
+ target is `wormhole`, `blackhole`, or `hw` for real hardware. The program needs no changes:
49
+
50
+ ```bash
51
+ cd /path/to/tt-metal/build/programming_examples
52
+ wolfpine run wormhole ./metal_example_add_2_integers_in_compute # simulated Wormhole
53
+ wolfpine run blackhole ./metal_example_add_2_integers_in_compute # simulated Blackhole
54
+ wolfpine run hw ./metal_example_add_2_integers_in_compute # the same binary on hardware
55
+ ```
56
+
57
+ `wolfpine run` sets tt-metal's environment variables (`TT_METAL_SIMULATOR`,
58
+ `TT_METAL_SLOW_DISPATCH_MODE`, `TT_METAL_RUNTIME_ROOT`, `LD_LIBRARY_PATH`) for that one
59
+ command only, so nothing is left behind in your shell. Leave out the command to get a
60
+ subshell with the target switched on (`exit` to leave it). To switch your current shell
61
+ instead — handy when building your own programs with CMake — `eval` the exports; `off`
62
+ puts back exactly what was there before:
63
+
64
+ ```bash
65
+ eval "$(wolfpine env blackhole)" # or wormhole, or hw
66
+ cmake -B build -S . && cmake --build build && ./build/my_program
67
+ eval "$(wolfpine env off)"
68
+ ```
69
+
70
+ Run `wolfpine --help` for the full list of commands.
71
+
35
72
  ## Installation
36
73
 
37
- Wolfpine is pure Python and requires Python ≥ 3.10. Clone the repository and install it in
38
- editable mode, which pulls in its dependencies (numpy, pyyaml, pynng, flatbuffers,
39
- pyarrow, pyelftools):
74
+ Wolfpine is pure Python and requires Python ≥ 3.10. It depends on numpy, pyyaml, pynng,
75
+ flatbuffers, pyarrow and pyelftools, which pip installs for you.
76
+
77
+ **From PyPI** — the simulator library plus the `wolfpine` command, everything needed to run
78
+ tt-metal programs:
79
+
80
+ ```bash
81
+ pip install wolfpine
82
+ ```
83
+
84
+ **From source** — for the example programs, the low-level driver scripts and the test
85
+ suite, or to hack on the simulator itself:
40
86
 
41
87
  ```bash
42
88
  git clone https://github.com/hedgehope/wolfpine.git
@@ -44,9 +90,9 @@ cd wolfpine
44
90
  pip install -e . # add [dev] for the ruff + pytest tooling: pip install -e .[dev]
45
91
  ```
46
92
 
47
- This installs the `framework` simulator library. The example drivers live under `driver/`
48
- and are run from the repository root, so keep the repo root on your `PYTHONPATH` when
49
- invoking them directly (the tt-metal flow below wires this up for you automatically):
93
+ Both install the `framework` simulator library and the `wolfpine` command. The example
94
+ drivers under `driver/` are not part of the package; they run from the repository root, so
95
+ keep the repo root on your `PYTHONPATH` when invoking them directly:
50
96
 
51
97
  ```bash
52
98
  export PYTHONPATH=$PWD:$PYTHONPATH
@@ -54,22 +100,28 @@ export PYTHONPATH=$PWD:$PYTHONPATH
54
100
 
55
101
  ## Using Wolfpine as a simulator for tt-metal
56
102
 
57
- tt-metal's UMD has a "simulation" chip backend: point `TT_METAL_SIMULATOR` at the
58
- [`driver/wormhole`](driver/wormhole) directory and UMD launches Wolfpine in place of real
59
- silicon, so an ordinary tt-metal program runs against the simulator over a socket — no
60
- code changes, exactly as it would run on hardware. The minimal setup:
103
+ tt-metal's UMD has a "simulation" chip backend: point `TT_METAL_SIMULATOR` at a simulator
104
+ directory and UMD launches Wolfpine in place of real silicon, so an ordinary tt-metal program
105
+ runs against the simulator over a socket — no code changes, exactly as it would run on
106
+ hardware. The simulator directories ship inside the package (`framework/sim/wormhole` and
107
+ `framework/sim/blackhole`), which is why the [`wolfpine` command](#quick-start) is the easy
108
+ way in: it finds them for you.
109
+
110
+ `wolfpine` looks for tt-metal in this order: `--tt-metal` (given before the target, e.g.
111
+ `wolfpine run --tt-metal /path wormhole ./prog`), then `$TT_METAL_RUNTIME_ROOT` or
112
+ `$TT_METAL_HOME`, then the path saved by `wolfpine config`. If you would rather export
113
+ the variables yourself, these are the ones it manages:
61
114
 
62
115
  ```bash
63
116
  export TT_METAL_RUNTIME_ROOT=/path/to/tt-metal # your built tt-metal checkout
64
- export TT_METAL_SIMULATOR="$PWD/driver/wormhole" # the switch: route execution to Wolfpine
117
+ export TT_METAL_SIMULATOR="$(python3 -c 'from framework.sim import simulator_dir; print(simulator_dir("wormhole"))')"
65
118
  export TT_METAL_SLOW_DISPATCH_MODE=1 # the only launch path the sim models
66
119
  export LD_LIBRARY_PATH="$TT_METAL_RUNTIME_ROOT/build/lib:$LD_LIBRARY_PATH"
67
-
68
- # then run any tt-metal program, e.g. an upstream example:
69
- cd "$TT_METAL_RUNTIME_ROOT/build/programming_examples"
70
- ./metal_example_add_2_integers_in_compute
71
120
  ```
72
121
 
122
+ In a repository checkout `driver/wormhole` and `driver/blackhole` link to the same simulator
123
+ directories, so `TT_METAL_SIMULATOR=$PWD/driver/wormhole` works too.
124
+
73
125
  A set of ready-to-run example programs, plus a build-and-run test suite, lives under
74
126
  [`examples`](examples). For the full walkthrough — building the
75
127
  examples, the `TT_SIM_TENSIX_COORDS` grid-pinning knob, diagnostics, structured tracing and
@@ -0,0 +1,14 @@
1
+ """Architecture profiles for Wolfpine.
2
+
3
+ An :class:`~framework.arch.profile.ArchProfile` carries every hardware constant
4
+ that differs between Tenstorrent architectures (Wormhole, Blackhole, ...). The
5
+ device/tile classes read these values from a profile rather than hardcoding
6
+ them, so a new architecture is (largely) a new profile plus per-arch strategies
7
+ rather than a fork. See ``docs/plans/blackhole-support.md``.
8
+ """
9
+
10
+ from framework.arch.blackhole import BLACKHOLE_PROFILE
11
+ from framework.arch.profile import ArchProfile
12
+ from framework.arch.wormhole import WORMHOLE_PROFILE
13
+
14
+ __all__ = ["ArchProfile", "BLACKHOLE_PROFILE", "WORMHOLE_PROFILE"]
@@ -0,0 +1,172 @@
1
+ """The Blackhole A0 architecture profile.
2
+
3
+ Numbers are sourced in ``docs/plans/blackhole-reference.md`` (ttsim
4
+ ``src/config.h`` + tt-metal's ``blackhole_140_arch.yaml``). Unlike Wormhole,
5
+ Blackhole tiles use their **physical NoC 0 coordinate** as the tile-directory
6
+ coord directly (there is no "unified" indirection — that exists only to serve
7
+ the Wormhole wire bridge). See ``docs/plans/blackhole-support.md``.
8
+
9
+ This is a *minimal bring-up* profile: one DRAM channel + one Tensix worker,
10
+ matching the scope decision. Expanding to the full 8 DRAM channels / 140 workers
11
+ is mechanical (extend the coord tuples), exactly as for Wormhole.
12
+ """
13
+
14
+ from framework.arch.profile import ArchProfile
15
+ from framework.network.noc_coords import BlackholeNocCoords
16
+
17
+ BLACKHOLE_PROFILE = ArchProfile(
18
+ name="blackhole",
19
+ # NoC grid: 17 columns x 12 rows, per BlackholeA0/NoC/MemoryMap.md and the
20
+ # SoC descriptor's grid.x_size/y_size.
21
+ noc_grid_x=17,
22
+ noc_grid_y=12,
23
+ # Max single NoC transfer: 16384 bytes (config.h NOC_MAX_PACKET_SIZE).
24
+ noc_max_burst_size=16384,
25
+ # DRAM-sourced NoC reads must be congruent modulo 64 (ttsim tile.cpp checks
26
+ # `(src_addr & 63) == (dst_addr & 63)` under TT_ARCH_VERSION == 1), matching
27
+ # Blackhole's 64 B NoC byte-enable span vs Wormhole's 32 B.
28
+ noc_dram_read_congruence=64,
29
+ # Tensix L1 SRAM: TENSIX_SRAM_SIZE = 1536 * 1024 = 1,572,864 bytes.
30
+ tensix_l1_size=1536 * 1024,
31
+ # Baby-core local data memories are doubled vs Wormhole (ttsim config.h,
32
+ # TT_ARCH_VERSION 1) — the firmware stack lives at the top of this region.
33
+ brisc_local_mem_size=8 * 1024,
34
+ ncrisc_local_mem_size=8 * 1024,
35
+ trisc_local_mem_size=4 * 1024,
36
+ # Blackhole moves the reset-PC override to the RISCV_DEBUG_REG block.
37
+ baby_core_reset_pc_debug_regs=True,
38
+ # Blackhole's Tensix backend config state is larger than Wormhole's
39
+ # (ttsim sim.h TT_ARCH_VERSION 1: 56 config / 68 thread-config registers).
40
+ tensix_cfg_state_size=56,
41
+ tensix_thd_state_size=68,
42
+ # Use Blackhole Tensix semantics: BH config-register layout + STALLWAIT bits.
43
+ tensix_blackhole=True,
44
+ # Blackhole baby cores add, over RV32IM: Zba address-gen + Zbb basic
45
+ # bit-manip (tt-metal's Blackhole kernels use them, e.g. zext.h / sh2add for
46
+ # loop-bound and pointer arithmetic), Zaamo local-L1 atomics, and an F/Zfh
47
+ # guard (floating-point is partially supported by hardware but not yet
48
+ # modelled — the guard makes any use fail loudly). The V vector extension is
49
+ # TRISC2-only, so its guard is attached there. Zicsr brings the CSR file
50
+ # (BabyRISCV/CSRs.md), including mcycle/minstret; Wormhole documents no CSRs
51
+ # at all, so it stays off that profile and a CSR instruction there raises.
52
+ baby_core_isa_extensions=("zba", "zbb", "zaamo", "zfh", "f_guard", "zicsr"),
53
+ trisc2_isa_extensions=("v_guard",),
54
+ # All 8 DRAM channels' worker-visible endpoints, in SoC-descriptor channel
55
+ # order. tt-metal interleaves a buffer's tiles round-robin across every
56
+ # channel (default InterleavedBufferConfig), so an example that reads more
57
+ # than one tile — e.g. `six`'s 128^3 matmul, whose A/B tiles land on all 8
58
+ # banks — reads zeros for any channel not modelled. Each channel's NoC 0 and
59
+ # NoC 1 worker endpoints are *different* subchannels of its 3-endpoint DRAM
60
+ # row: the coords below come from the descriptor's `dram` array indexed by
61
+ # `dram_views[ch].worker_endpoint = [noc0_idx, noc1_idx]`:
62
+ # ch: dram row worker_endpoint -> NoC0 NoC1
63
+ # 0: [0-0, 0-1, 0-11] [2, 1] -> (0,11) (0,1)
64
+ # 1: [0-2, 0-10, 0-3] [0, 1] -> (0,2) (0,10)
65
+ # 2: [0-9, 0-4, 0-8] [0, 1] -> (0,9) (0,4)
66
+ # 3: [0-5, 0-7, 0-6] [0, 1] -> (0,5) (0,7)
67
+ # 4: [9-0, 9-1, 9-11] [2, 1] -> (9,11) (9,1)
68
+ # 5: [9-2, 9-10, 9-3] [2, 1] -> (9,3) (9,10)
69
+ # 6: [9-9, 9-4, 9-8] [2, 1] -> (9,8) (9,4)
70
+ # 7: [9-5, 9-7, 9-6] [2, 1] -> (9,6) (9,7)
71
+ # Blackhole uses physical coords as the tile coord, so unified == NoC 0.
72
+ dram_channel_unified_coords=(
73
+ (0, 11),
74
+ (0, 2),
75
+ (0, 9),
76
+ (0, 5),
77
+ (9, 11),
78
+ (9, 3),
79
+ (9, 8),
80
+ (9, 6),
81
+ ),
82
+ dram_channel_physical_noc0_coords=(
83
+ ((0, 11),),
84
+ ((0, 2),),
85
+ ((0, 9),),
86
+ ((0, 5),),
87
+ ((9, 11),),
88
+ ((9, 3),),
89
+ ((9, 8),),
90
+ ((9, 6),),
91
+ ),
92
+ # Each channel's NoC 1 worker endpoint (a different subchannel than NoC 0);
93
+ # a NoC 1 read/write to the channel targets the grid-mirror of this coord.
94
+ dram_channel_physical_noc1_coords=(
95
+ (0, 1),
96
+ (0, 10),
97
+ (0, 4),
98
+ (0, 7),
99
+ (9, 1),
100
+ (9, 10),
101
+ (9, 4),
102
+ (9, 7),
103
+ ),
104
+ # Translated coords of the same two sub-endpoints, in the same order.
105
+ # ``BlackholeCoordinateManager::map_dram_banks`` walks (bank, port) in
106
+ # descriptor order and hands out ``x = 17`` for banks 0-3 and ``x = 18``
107
+ # for banks 4-7, with ``y`` starting at 12 and incrementing once per port
108
+ # (3 ports per bank) — so bank b, port p is
109
+ # ``(17 + b//4, 12 + 3*(b%4) + p)``. Applying that to the ports named in
110
+ # the table above (ch0 uses port 2 on NoC 0 and port 1 on NoC 1, ch1-ch3
111
+ # port 0 and port 1, ch4-ch7 port 2 and port 1) gives the pairs below, and
112
+ # they reproduce the ``dram_bank_to_noc_xy`` table read off the wire from a
113
+ # translated run exactly: NoC 0 (17,14) (17,15) (17,18) (17,21) (18,14)
114
+ # (18,17) (18,20) (18,23), NoC 1 (17,13) (17,16) (17,19) (17,22) (18,13)
115
+ # (18,16) (18,19) (18,22).
116
+ dram_channel_translated_coords=(
117
+ ((17, 14), (17, 13)),
118
+ ((17, 15), (17, 16)),
119
+ ((17, 18), (17, 19)),
120
+ ((17, 21), (17, 22)),
121
+ ((18, 14), (18, 13)),
122
+ ((18, 17), (18, 16)),
123
+ ((18, 20), (18, 19)),
124
+ ((18, 23), (18, 22)),
125
+ ),
126
+ # DRAM per channel: soc_descriptor.yaml `dram_bank_size` / `dram_view_size`
127
+ # = 4,278,190,080 = 0xFF00_0000, one view per channel; 8 channels = 31.9
128
+ # GiB. The physical channel is 4 GiB (ttsim config.h DRAM_CHANNEL_SIZE,
129
+ # TT_ARCH_VERSION 1) but the top 16 MiB of a tile's NoC address space is the
130
+ # register aperture, which is why the descriptor stops at 0xFF00_0000 — and
131
+ # why a top-down allocation tops out at 0xFEFF_FC00, inside this range.
132
+ dram_channel_size=0xFF00_0000,
133
+ # First functional worker: physical (1, 2).
134
+ tensix_unified_coords=((1, 2),),
135
+ # Blackhole holds the destination coord in the dedicated HI register.
136
+ noc_coord_strategy=BlackholeNocCoords(),
137
+ noc_blackhole_cmd_buf_layout=True,
138
+ # No Tensix mirror aliases on NoC 1. `RiscFirmwareInitializer::
139
+ # virtual_noc0_coordinate` early-outs on `|| cluster_.arch() ==
140
+ # ARCH::BLACKHOLE`, so `l1_bank_to_noc_xy`'s NoC 1 half is byte-identical to
141
+ # its NoC 0 half here (measured off the wire) and nothing on Blackhole ever
142
+ # addresses a worker by its mirror. Registering the aliases anyway displaced
143
+ # 96 of the 140 live workers from their own canonical NoC 1 cell. DRAM's
144
+ # mirrors are unaffected — that table *is* mirrored. Wormhole must keep
145
+ # them; see `ArchProfile.noc1_tensix_mirror_aliases`.
146
+ noc1_tensix_mirror_aliases=False,
147
+ # ...and the self-address side of the same fact. `NOC_ID_LOGICAL` is
148
+ # `NOC_CFG(0x12)` here, not Wormhole's `NOC_CFG(0xE)` — Blackhole's ID
149
+ # translation tables are six entries per axis, so 0xE is
150
+ # NOC_Y_ID_TRANSLATE_TABLE_2 and reading the Wormhole offset answered 0 for
151
+ # every core, which is what tt-metal's firmware fills `my_x[]`/`my_y[]`
152
+ # from. And it reports the canonical coord on *both* NoCs, because
153
+ # Blackhole's L1 bank table is not mirrored on NoC 1 and its NoC 1 directory
154
+ # has no Tensix mirror keys.
155
+ noc_id_logical_cfg_index=0x12,
156
+ noc_id_logical_mirrored_on_noc1=False,
157
+ # A Blackhole core's *translated* coord is a NoC 0 Tensix coord, so the
158
+ # translated and physical ranges are one numeric range and there is no
159
+ # second space for NoC 1 to keep. Under translation its mirror keys go
160
+ # entirely: `(16-x, 11-y)` of one worker is another worker's translated
161
+ # coordinate, so a leftover mirror is a misroute rather than dead weight.
162
+ # See `ArchProfile.translated_coords_off_physical_grid`.
163
+ translated_coords_off_physical_grid=False,
164
+ # Baby-core firmware bases (blackhole/dev_mem_map.h): with no IRAM
165
+ # constraints every core boots from L1. Computed from the mailbox/zeros/LLK
166
+ # chain: BRISC 0x39E0, then NCRISC 0x5BE0, TRISC0/1/2 0x65E0/0x6FE0/0x79E0.
167
+ # (BRISC always boots from the 0x0 boot vector, so it needs no override.)
168
+ ncrisc_firmware_base=0x5BE0,
169
+ trisc0_firmware_base=0x65E0,
170
+ trisc1_firmware_base=0x6FE0,
171
+ trisc2_firmware_base=0x79E0,
172
+ )