rocket-engine 0.0.2b1__py3-none-any.whl

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 (241) hide show
  1. rocket_engine/__init__.py +8 -0
  2. rocket_engine/__main__.py +12 -0
  3. rocket_engine/adapters/README.md +54 -0
  4. rocket_engine/adapters/__init__.py +7 -0
  5. rocket_engine/adapters/api.py +39 -0
  6. rocket_engine/adapters/base.py +46 -0
  7. rocket_engine/adapters/cace/__init__.py +163 -0
  8. rocket_engine/adapters/circulax/README.md +10 -0
  9. rocket_engine/adapters/circulax/__init__.py +112 -0
  10. rocket_engine/adapters/circulax/_driver.py +190 -0
  11. rocket_engine/adapters/circulax/adapter.py +538 -0
  12. rocket_engine/adapters/circulax/results.py +291 -0
  13. rocket_engine/adapters/cli/README.md +34 -0
  14. rocket_engine/adapters/cli/__init__.py +305 -0
  15. rocket_engine/adapters/connectivity/__init__.py +196 -0
  16. rocket_engine/adapters/connectivity/results.py +214 -0
  17. rocket_engine/adapters/cosim/README.md +9 -0
  18. rocket_engine/adapters/cosim/__init__.py +1390 -0
  19. rocket_engine/adapters/cosim/results.py +214 -0
  20. rocket_engine/adapters/devsim/__init__.py +171 -0
  21. rocket_engine/adapters/digital_flow/README.md +9 -0
  22. rocket_engine/adapters/digital_flow/__init__.py +1121 -0
  23. rocket_engine/adapters/digital_flow/results.py +227 -0
  24. rocket_engine/adapters/digital_flow/state.py +462 -0
  25. rocket_engine/adapters/drc/README.klayout.md +7 -0
  26. rocket_engine/adapters/drc/README.md +7 -0
  27. rocket_engine/adapters/drc/__init__.py +1 -0
  28. rocket_engine/adapters/drc/klayout.py +952 -0
  29. rocket_engine/adapters/drc/magic.py +287 -0
  30. rocket_engine/adapters/drc/results.py +184 -0
  31. rocket_engine/adapters/drc/results_kl.py +188 -0
  32. rocket_engine/adapters/elmer/__init__.py +163 -0
  33. rocket_engine/adapters/envelope.py +120 -0
  34. rocket_engine/adapters/equivalence/__init__.py +156 -0
  35. rocket_engine/adapters/errors.py +181 -0
  36. rocket_engine/adapters/extract_magic/README.md +15 -0
  37. rocket_engine/adapters/extract_magic/__init__.py +425 -0
  38. rocket_engine/adapters/extract_magic/results.py +209 -0
  39. rocket_engine/adapters/formal_sby/README.md +7 -0
  40. rocket_engine/adapters/formal_sby/__init__.py +773 -0
  41. rocket_engine/adapters/formal_sby/formal_edge.py +195 -0
  42. rocket_engine/adapters/formal_sby/results.py +185 -0
  43. rocket_engine/adapters/gdsfactory/__init__.py +194 -0
  44. rocket_engine/adapters/gdsfactory/_driver.py +459 -0
  45. rocket_engine/adapters/gdsfactory/adapter.py +609 -0
  46. rocket_engine/adapters/gdsfactory/results.py +181 -0
  47. rocket_engine/adapters/hdl_sim/README.md +7 -0
  48. rocket_engine/adapters/hdl_sim/__init__.py +369 -0
  49. rocket_engine/adapters/hdl_sim/ghdl.py +155 -0
  50. rocket_engine/adapters/hdl_sim/results.py +178 -0
  51. rocket_engine/adapters/hdl_sim/verilator.py +167 -0
  52. rocket_engine/adapters/http/README.md +15 -0
  53. rocket_engine/adapters/http/__init__.py +458 -0
  54. rocket_engine/adapters/http/events.py +63 -0
  55. rocket_engine/adapters/ipc/README.md +9 -0
  56. rocket_engine/adapters/ipc/__init__.py +111 -0
  57. rocket_engine/adapters/lvs_netgen/README.md +20 -0
  58. rocket_engine/adapters/lvs_netgen/__init__.py +889 -0
  59. rocket_engine/adapters/lvs_netgen/results.py +168 -0
  60. rocket_engine/adapters/mcp/README.md +19 -0
  61. rocket_engine/adapters/mcp/__init__.py +85 -0
  62. rocket_engine/adapters/mcp/api-schema.json +6107 -0
  63. rocket_engine/adapters/mcp/pull.py +246 -0
  64. rocket_engine/adapters/mcp/server.py +794 -0
  65. rocket_engine/adapters/meep/__init__.py +167 -0
  66. rocket_engine/adapters/meow/README.md +7 -0
  67. rocket_engine/adapters/meow/__init__.py +190 -0
  68. rocket_engine/adapters/meow/_driver.py +227 -0
  69. rocket_engine/adapters/meow/_envelope.py +108 -0
  70. rocket_engine/adapters/meow/adapter.py +491 -0
  71. rocket_engine/adapters/meow/results.py +218 -0
  72. rocket_engine/adapters/mutation/__init__.py +192 -0
  73. rocket_engine/adapters/ngspice/README.md +28 -0
  74. rocket_engine/adapters/ngspice/__init__.py +627 -0
  75. rocket_engine/adapters/ngspice/results.py +215 -0
  76. rocket_engine/adapters/postlayout/README.md +28 -0
  77. rocket_engine/adapters/postlayout/__init__.py +17 -0
  78. rocket_engine/adapters/postlayout/adapter.py +1062 -0
  79. rocket_engine/adapters/postlayout/results.py +330 -0
  80. rocket_engine/adapters/postlayout/translate.py +71 -0
  81. rocket_engine/adapters/profile.py +220 -0
  82. rocket_engine/adapters/sax/README.md +23 -0
  83. rocket_engine/adapters/sax/__init__.py +516 -0
  84. rocket_engine/adapters/sax/_driver.py +148 -0
  85. rocket_engine/adapters/sax/results.py +291 -0
  86. rocket_engine/adapters/stdio_console.py +1151 -0
  87. rocket_engine/adapters/syntax/README.md +5 -0
  88. rocket_engine/adapters/syntax/__init__.py +366 -0
  89. rocket_engine/adapters/syntax/results.py +181 -0
  90. rocket_engine/adapters/synth_yosys/README.md +7 -0
  91. rocket_engine/adapters/synth_yosys/__init__.py +655 -0
  92. rocket_engine/adapters/synth_yosys/amaranth.py +120 -0
  93. rocket_engine/adapters/synth_yosys/ghdl.py +128 -0
  94. rocket_engine/adapters/synth_yosys/results.py +173 -0
  95. rocket_engine/adapters/timing_sta/README.md +9 -0
  96. rocket_engine/adapters/timing_sta/__init__.py +726 -0
  97. rocket_engine/adapters/view_sync/__init__.py +185 -0
  98. rocket_engine/adapters/view_sync/results.py +189 -0
  99. rocket_engine/adapters/vlsir/__init__.py +142 -0
  100. rocket_engine/adapters/xschem/__init__.py +440 -0
  101. rocket_engine/adapters/xschem/deck.py +266 -0
  102. rocket_engine/clients/__init__.py +5 -0
  103. rocket_engine/clients/runtime.py +255 -0
  104. rocket_engine/composition.py +2279 -0
  105. rocket_engine/execution/README.md +30 -0
  106. rocket_engine/execution/__init__.py +150 -0
  107. rocket_engine/execution/apig/__init__.py +1 -0
  108. rocket_engine/execution/apig/pool.py +463 -0
  109. rocket_engine/execution/apig/submit.py +124 -0
  110. rocket_engine/execution/block_runs_scope.py +479 -0
  111. rocket_engine/execution/coalesce.py +414 -0
  112. rocket_engine/execution/console/__init__.py +1 -0
  113. rocket_engine/execution/console/apply_session.py +318 -0
  114. rocket_engine/execution/console/lifecycle.py +265 -0
  115. rocket_engine/execution/dispatch.py +205 -0
  116. rocket_engine/execution/errors.py +31 -0
  117. rocket_engine/execution/ports.py +797 -0
  118. rocket_engine/execution/pyexec/__init__.py +1 -0
  119. rocket_engine/execution/pyexec/apply_context.py +547 -0
  120. rocket_engine/execution/pyexec/approvals.py +173 -0
  121. rocket_engine/execution/pyexec/runner.py +404 -0
  122. rocket_engine/execution/pyexec/support.py +464 -0
  123. rocket_engine/execution/python_exec.py +897 -0
  124. rocket_engine/execution/queue.py +85 -0
  125. rocket_engine/execution/replay_safe.py +601 -0
  126. rocket_engine/execution/routing/__init__.py +1 -0
  127. rocket_engine/execution/routing/calls.py +364 -0
  128. rocket_engine/execution/routing/namespace.py +785 -0
  129. rocket_engine/execution/routing/ports.py +102 -0
  130. rocket_engine/execution/routing/tools.py +346 -0
  131. rocket_engine/execution/runner.py +311 -0
  132. rocket_engine/execution/runtime.py +1149 -0
  133. rocket_engine/execution/service.py +279 -0
  134. rocket_engine/execution/worker.py +464 -0
  135. rocket_engine/interfaces/README.md +26 -0
  136. rocket_engine/interfaces/__init__.py +58 -0
  137. rocket_engine/interfaces/apig_assets.py +407 -0
  138. rocket_engine/interfaces/celllink.py +461 -0
  139. rocket_engine/interfaces/documents.py +92 -0
  140. rocket_engine/interfaces/envelopes.py +131 -0
  141. rocket_engine/interfaces/errors.py +16 -0
  142. rocket_engine/interfaces/layout.py +410 -0
  143. rocket_engine/interfaces/layout_schema.yaml +278 -0
  144. rocket_engine/interfaces/paths.py +223 -0
  145. rocket_engine/interfaces/pdks.py +550 -0
  146. rocket_engine/interfaces/ports.py +72 -0
  147. rocket_engine/interfaces/references.py +115 -0
  148. rocket_engine/interfaces/refs.py +85 -0
  149. rocket_engine/interfaces/runparams.py +304 -0
  150. rocket_engine/interfaces/setup.py +552 -0
  151. rocket_engine/interfaces/setup_catalogue.yaml +243 -0
  152. rocket_engine/interfaces/setup_probes.py +66 -0
  153. rocket_engine/interfaces/vocabulary.py +58 -0
  154. rocket_engine/interfaces/yaml_dump.py +31 -0
  155. rocket_engine/library/README.md +22 -0
  156. rocket_engine/library/__init__.py +13 -0
  157. rocket_engine/library/apig_catalog.py +371 -0
  158. rocket_engine/library/catalog.py +185 -0
  159. rocket_engine/library/errors.py +16 -0
  160. rocket_engine/mutate/__init__.py +776 -0
  161. rocket_engine/mutate/operators.py +700 -0
  162. rocket_engine/ops/__init__.py +1 -0
  163. rocket_engine/ops/deferred.py +279 -0
  164. rocket_engine/ops/editors.py +404 -0
  165. rocket_engine/ops/evidence.py +194 -0
  166. rocket_engine/ops/gates.py +262 -0
  167. rocket_engine/ops/ports.py +76 -0
  168. rocket_engine/ops/queries.py +417 -0
  169. rocket_engine/ops/runs.py +553 -0
  170. rocket_engine/ops/submit.py +614 -0
  171. rocket_engine/project/README.md +27 -0
  172. rocket_engine/project/__init__.py +6 -0
  173. rocket_engine/project/canvas/__init__.py +55 -0
  174. rocket_engine/project/canvas/compile.py +109 -0
  175. rocket_engine/project/canvas/integrate.py +48 -0
  176. rocket_engine/project/canvas/schema.py +241 -0
  177. rocket_engine/project/canvas/templates.py +46 -0
  178. rocket_engine/project/canvas/validate.py +603 -0
  179. rocket_engine/project/edit/__init__.py +5 -0
  180. rocket_engine/project/edit/cas.py +87 -0
  181. rocket_engine/project/edit/transactions.py +282 -0
  182. rocket_engine/project/errors.py +16 -0
  183. rocket_engine/project/frontend13.py +685 -0
  184. rocket_engine/project/geometry/__init__.py +23 -0
  185. rocket_engine/project/geometry/ops.py +451 -0
  186. rocket_engine/project/geometry/snap.py +103 -0
  187. rocket_engine/project/ip/__init__.py +1 -0
  188. rocket_engine/project/ip/blocks.py +195 -0
  189. rocket_engine/project/ip/entry.schema.json +78 -0
  190. rocket_engine/project/ip/lifecycle.py +402 -0
  191. rocket_engine/project/ip/verbs.py +123 -0
  192. rocket_engine/project/layers/__init__.py +6 -0
  193. rocket_engine/project/layers/bindings.py +115 -0
  194. rocket_engine/project/layers/catalog.py +228 -0
  195. rocket_engine/project/layers/presets.py +43 -0
  196. rocket_engine/project/ledger/__init__.py +1 -0
  197. rocket_engine/project/ledger/docs.py +167 -0
  198. rocket_engine/project/ledger/entities.py +176 -0
  199. rocket_engine/project/ledger/events.py +29 -0
  200. rocket_engine/project/ledger/runs.py +257 -0
  201. rocket_engine/project/ledger/shared.py +174 -0
  202. rocket_engine/project/ledger/snapshots.py +385 -0
  203. rocket_engine/project/ledger/wires.py +552 -0
  204. rocket_engine/project/process/__init__.py +14 -0
  205. rocket_engine/project/process/model.py +193 -0
  206. rocket_engine/project/process/recipes.py +121 -0
  207. rocket_engine/project/schematic/__init__.py +1 -0
  208. rocket_engine/project/schematic/hierarchy.py +312 -0
  209. rocket_engine/project/schematic/instances.py +393 -0
  210. rocket_engine/project/schematic/sheets.py +198 -0
  211. rocket_engine/project/service.py +2941 -0
  212. rocket_engine/project/symbols/__init__.py +1 -0
  213. rocket_engine/project/symbols/cells.py +324 -0
  214. rocket_engine/project/symbols/linkage.py +356 -0
  215. rocket_engine/project/symbols/symbols.py +352 -0
  216. rocket_engine/project/templates/__init__.py +303 -0
  217. rocket_engine/project/templates/errors.py +25 -0
  218. rocket_engine/project/testbench/__init__.py +49 -0
  219. rocket_engine/project/testbench/blocks.py +619 -0
  220. rocket_engine/project/testbench/templates.py +134 -0
  221. rocket_engine/stores/README.md +12 -0
  222. rocket_engine/stores/__init__.py +6 -0
  223. rocket_engine/stores/ecs.py +1508 -0
  224. rocket_engine/stores/layers.py +1023 -0
  225. rocket_engine/stores/settings.py +1188 -0
  226. rocket_engine/stores/wireplace.py +1324 -0
  227. rocket_engine/workflows/README.md +18 -0
  228. rocket_engine/workflows/__init__.py +53 -0
  229. rocket_engine/workflows/capability_plan.py +102 -0
  230. rocket_engine/workflows/completion.py +228 -0
  231. rocket_engine/workflows/connectgraph.py +734 -0
  232. rocket_engine/workflows/connectgraph_emit.py +336 -0
  233. rocket_engine/workflows/gates.py +144 -0
  234. rocket_engine/workflows/photonic_wire.py +76 -0
  235. rocket_engine/workflows/stages.py +324 -0
  236. rocket_engine/workflows/viewsync.py +399 -0
  237. rocket_engine-0.0.2b1.dist-info/METADATA +200 -0
  238. rocket_engine-0.0.2b1.dist-info/RECORD +241 -0
  239. rocket_engine-0.0.2b1.dist-info/WHEEL +4 -0
  240. rocket_engine-0.0.2b1.dist-info/entry_points.txt +2 -0
  241. rocket_engine-0.0.2b1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,243 @@
1
+ # Provision catalogue (ENGINE-SETUP): the data the Vivado-style setup
2
+ # menu renders. One entry per provisionable unit: what it provides,
3
+ # how to detect it, and where the install recipe lives. Recipes cite
4
+ # docs/provision-plan.md (PROV seed), scripts/install.sh modes
5
+ # (B10/DEMO-PATH), or the owning ticket — never a bare "install X".
6
+ # Load with rocket_engine.interfaces.setup.load_catalogue.
7
+ # GTKWave is EXCLUDED from engine provisioning by the headless rule
8
+ # (display-side, RocketIDE concern) — recorded, never installed.
9
+ catalogue_version: 1
10
+ entries:
11
+ - id: digital-bundle
12
+ kind: tool
13
+ label: Digital bundle (oss-cad-suite)
14
+ binaries: [iverilog, vvp, verilator, slang, yosys, ghdl, sby]
15
+ remedy: >-
16
+ Install the pinned oss-cad-suite bundle 20261025 (iverilog, vvp,
17
+ verilator, slang, yosys, ghdl, sby; run
18
+ scripts/provision_toolchain.sh --install); the scenario gate needs
19
+ dev-PATH with oss-cad-suite (see scenarios/README.md).
20
+ recipe: "scripts/provision_toolchain.sh: pinned tarball 20261025 + asserts (PROV phase 1)."
21
+ - id: librelane
22
+ kind: tool
23
+ label: LibreLane (RTL-to-GDS flow)
24
+ binaries: [librelane]
25
+ remedy: >-
26
+ Install the LibreLane 3.0.17 supported distribution (run
27
+ scripts/provision_toolchain.sh --install for the pinned AppImage
28
+ per the upstream install docs); inside a nix-shell env, `librelane
29
+ --version` must report 3.0.17.
30
+ recipe: "scripts/provision_toolchain.sh (PROV phase 1; upstream AppImage/Nix install docs)."
31
+ - id: opensta
32
+ kind: tool
33
+ label: OpenSTA (static timing)
34
+ binaries: [sta]
35
+ remedy: >-
36
+ Install the pinned OpenSTA build 857316f (run
37
+ scripts/provision_toolchain.sh --install for the CMake source
38
+ build per the upstream README); `sta` lands in
39
+ ~/tools/opensta-857316f/bin.
40
+ recipe: "scripts/provision_toolchain.sh (PROV phase 1; upstream OpenSTA README source build)."
41
+ - id: ngspice
42
+ kind: tool
43
+ label: ngspice (SPICE)
44
+ binaries: [ngspice]
45
+ remedy: >-
46
+ Provision ngspice (see docs/tickets/NGSPICE-LIVE.md).
47
+ recipe: "docs/provision-plan.md: apt pin or source build (B10)."
48
+ - id: netgen
49
+ kind: tool
50
+ label: Netgen (LVS)
51
+ binaries: [netgen]
52
+ banner: lvs
53
+ remedy: >-
54
+ Install opencircuitdesign netgen from source (see
55
+ docs/tickets/NGSPICE-LIVE.md); the `netgen` apt package is
56
+ the Schoeberl mesh-generator impostor, not the LVS tool.
57
+ recipe: "docs/tickets/NGSPICE-LIVE.md: opencircuitdesign source build (B10)."
58
+ - id: magic
59
+ kind: tool
60
+ label: Magic (DRC + extraction)
61
+ binaries: [magic]
62
+ remedy: >-
63
+ Install Magic from source per the rtimothyedwards docs (see
64
+ docs/provision-plan.md); ambient installs are kept and
65
+ version-asserted, never reinstalled.
66
+ recipe: "docs/provision-plan.md: source build with --prefix into the app-owned tools dir (B10)."
67
+ - id: klayout
68
+ kind: tool
69
+ label: KLayout (batch DRC)
70
+ binaries: [klayout]
71
+ remedy: >-
72
+ Install KLayout for batch DRC (see
73
+ docs/provision-plan.md); the engine uses `klayout -b`
74
+ batch only — GUI breakage never gates engine work.
75
+ recipe: "docs/provision-plan.md: ambient install kept and version-asserted (B10)."
76
+ - id: xyce
77
+ kind: tool
78
+ label: Xyce (parallel SPICE)
79
+ binaries: [Xyce]
80
+ remedy: >-
81
+ Install the pinned Xyce Release-7.10.0 build (Trilinos
82
+ trilinos-release-17-2-1 first; run
83
+ scripts/provision_toolchain.sh --install).
84
+ recipe: "scripts/provision_toolchain.sh (PROV phase 2; Xyce building guide recipe)."
85
+ - id: xschem
86
+ kind: tool
87
+ label: Xschem (schematic)
88
+ binaries: [xschem]
89
+ remedy: >-
90
+ Install Xschem from source at 7811010 (run
91
+ scripts/provision_toolchain.sh --install).
92
+ recipe: "scripts/provision_toolchain.sh (PROV phase 2; upstream xschem source build)."
93
+ - id: cace
94
+ kind: python
95
+ label: CACE (characterization)
96
+ python: [cace]
97
+ remedy: >-
98
+ Install cace==2.13.0 into the engine venv (run
99
+ scripts/provision_toolchain.sh --install; needs
100
+ xschem/magic/netgen/ngspice first).
101
+ recipe: "scripts/provision_toolchain.sh (PROV phase 2; pip into the engine venv)."
102
+ - id: bwrap
103
+ kind: tool
104
+ label: Bubblewrap (isolation)
105
+ binaries: [bwrap]
106
+ remedy: >-
107
+ B10 owns bwrap provenance (system vs bundled) and PATH
108
+ placement (see docs/probe-bwrap-isolation.md).
109
+ recipe: "docs/probe-bwrap-isolation.md (B10)."
110
+ - id: sax
111
+ kind: python
112
+ label: SAX (photonic sim)
113
+ python: [sax]
114
+ remedy: "sax not installed, uv sync (B10-owned tooling)"
115
+ recipe: "pyproject.toml [project] dependencies: plain `uv sync` installs everything (core library)."
116
+ - id: circulax
117
+ kind: python
118
+ label: Circulax (time-domain circuit sim)
119
+ python: [circulax]
120
+ remedy: "circulax not installed, uv sync (B10-owned tooling)"
121
+ recipe: "pyproject.toml [project] dependencies: plain `uv sync` installs everything (core library)."
122
+ - id: meow
123
+ kind: python
124
+ label: Meow (EME mode/field solver)
125
+ python: [meow]
126
+ remedy: "meow not installed, uv sync (B10-owned tooling)"
127
+ recipe: "pyproject.toml [project] dependencies: plain `uv sync` installs everything (core library)."
128
+ - id: gdsfactory
129
+ kind: python
130
+ label: gdsfactory (layout views)
131
+ python: [gdsfactory]
132
+ remedy: "gdsfactory not installed, uv sync (B10-owned tooling)"
133
+ recipe: "pyproject.toml [project] dependencies: plain `uv sync` installs everything (core library)."
134
+ - id: cvc
135
+ kind: tool
136
+ label: cvc (SMT solvers)
137
+ binaries: [cvc4, cvc5]
138
+ remedy: >-
139
+ Install the pinned oss-cad-suite bundle 20261025 (ships
140
+ the cvc4/cvc5 SMT solvers; run
141
+ scripts/provision_toolchain.sh --install).
142
+ recipe: "scripts/provision_toolchain.sh: pinned tarball 20261025 ships cvc4/cvc5 (PROV phase 1)."
143
+ - id: openroad
144
+ kind: tool
145
+ label: OpenROAD
146
+ binaries: [openroad]
147
+ remedy: >-
148
+ Install the LibreLane 3.0.17 supported distribution (run
149
+ scripts/provision_toolchain.sh --install); openroad ships
150
+ in its tool closure (see docs/provision-sources.md §3-§4).
151
+ recipe: "scripts/provision_toolchain.sh (PROV phase 1; LibreLane closure ships openroad)."
152
+ - id: pymeep
153
+ kind: python
154
+ label: pymeep (FDTD)
155
+ python: [meep]
156
+ remedy: >-
157
+ Provision pymeep==1.35.0 via the miniforge conda env (run
158
+ scripts/provision_toolchain.sh --install); it lives in
159
+ the conda env, not the engine venv, so verify with the
160
+ env python (see docs/provision-sources.md §10).
161
+ recipe: "scripts/provision_toolchain.sh (PROV-DEFERRED; conda-forge pymeep env)."
162
+ - id: openems
163
+ kind: tool
164
+ label: openEMS (EC-FDTD)
165
+ binaries: [openEMS]
166
+ remedy: >-
167
+ Install openEMS v0.37.0 + CSXCAD v0.7.0 from source (run
168
+ scripts/provision_toolchain.sh --install).
169
+ recipe: "scripts/provision_toolchain.sh (PROV-DEFERRED; docs.openEMS.de recipe)."
170
+ - id: elmer
171
+ kind: tool
172
+ label: Elmer (thermal/FEM)
173
+ binaries: [ElmerSolver]
174
+ remedy: >-
175
+ Install elmerfem-csc via the CSC PPA (needs sudo; run
176
+ scripts/provision_toolchain.sh --install).
177
+ recipe: "scripts/provision_toolchain.sh (PROV-DEFERRED; CSC PPA apt route)."
178
+ - id: devsim
179
+ kind: python
180
+ label: DEVSIM (TCAD)
181
+ python: [devsim]
182
+ remedy: >-
183
+ Install devsim==2.11.2 into the engine venv (run
184
+ scripts/provision_toolchain.sh --install).
185
+ recipe: "scripts/provision_toolchain.sh (PROV-DEFERRED; pip into the engine venv)."
186
+ - id: palace
187
+ kind: tool
188
+ label: Palace (full-wave FEM)
189
+ binaries: [palace]
190
+ provisionable: false
191
+ remedy: >-
192
+ Palace is unsourced: its install docs are not read yet
193
+ (docs/provision-sources.md §12). No row action.
194
+ recipe: "docs/provision-sources.md §12 (unsourced — no recipe yet)."
195
+ - id: pdk-sky130A
196
+ kind: pdk
197
+ label: PDK sky130A
198
+ pdk_id: sky130A
199
+ source_default: ~/.local/share/pdk/sky130A
200
+ decks:
201
+ - libs.tech/klayout/drc/sky130A.lydrc
202
+ - libs.tech/magic/sky130A.tech
203
+ - libs.tech/combined/sky130.lib.spice
204
+ - libs.tech/netgen/sky130A_setup.tcl
205
+ remedy: >-
206
+ Register the PDK into ROCKETEDA_HOME (run
207
+ scripts/install.sh --pdk-only with PDK_SOURCE set to the
208
+ sky130A tree).
209
+ recipe: "scripts/install.sh --pdk-only (PDK_SOURCE/PDK_ID/PDK_REVISION; see docs/demo-runbook.md)."
210
+ - id: pdk-ihp
211
+ kind: pdk
212
+ label: PDK ihp (IHP SG13G2 BiCMOS + RF)
213
+ pdk_id: ihp
214
+ source_default: ~/.local/share/pdk/ihp
215
+ decks:
216
+ - ihp/klayout/tech/drc/ihp-sg13g2.drc
217
+ remedy: >-
218
+ Provision ihp-gdsfactory 2.0.1 per docs/pdk/ihp/recipe.md
219
+ (pip pin + KLayout tech link + verify probe), then register
220
+ the tree via scripts/install.sh --pdk-only with PDK_ID=ihp.
221
+ The PDK deck needs KLayout newer than 0.30.7 (euclidean
222
+ metric; recipe §4).
223
+ recipe: "docs/pdk/ihp/recipe.md (PDK-IHP lane)."
224
+ - id: cloud-tidy3d
225
+ kind: cloud
226
+ label: Tidy3D web (cloud)
227
+ service: tidy3d web
228
+ remedy: >-
229
+ BYOC opt-in only (F12/I32): tidy3d web needs a
230
+ user-supplied key from the CLOUD-AUTH secure store (see
231
+ docs/tickets/CLOUD-AUTH.md); cloud never activates
232
+ without an explicit opt-in.
233
+ recipe: "CLOUD-AUTH (Backlog): OS keyring preferred, encrypted file fallback."
234
+ - id: cloud-gdsfactory-plus
235
+ kind: cloud
236
+ label: GDSFactory+ (cloud)
237
+ service: gdsfactory+
238
+ remedy: >-
239
+ BYOC opt-in only (F12/I32): gdsfactory+ needs a
240
+ user-supplied key from the CLOUD-AUTH secure store (see
241
+ docs/tickets/CLOUD-AUTH.md); cloud never activates
242
+ without an explicit opt-in.
243
+ recipe: "CLOUD-AUTH (Backlog): OS keyring preferred, encrypted file fallback."
@@ -0,0 +1,66 @@
1
+ """Shadow-proof Python-tool probes for the setup surface.
2
+
3
+ `detect_python` answers "is this tool module genuinely installed"
4
+ without false-readying on import shadows: a bare `find_spec` hit is
5
+ not enough, because an empty namespace directory on `sys.path` (a
6
+ stray dir, a partial uninstall, a foreign residue like the observed
7
+ `/tmp/gdsfactory/`) yields a loader-less namespace spec that the old
8
+ probe counted as installed and then stamped `found: True` when the
9
+ version lookup missed. This probe requires both a real loader and
10
+ installed distribution metadata before reporting found.
11
+ """
12
+
13
+ import importlib.metadata
14
+ import importlib.util
15
+
16
+
17
+ def detect_python(names):
18
+ """Split module names into found versions and missing names.
19
+
20
+ A module counts as found only when it resolves to a spec with a
21
+ real loader (namespace shadows carry `loader=None`) and its
22
+ distribution metadata answers a version. Anything else — no
23
+ spec, a loader-less spec, an unresolvable spec, or no installed
24
+ distribution — reports missing, never a bare `True`.
25
+
26
+ The distribution is resolved through the top-level mapping,
27
+ not by assuming the names match: the `meow` module ships as
28
+ the `meow-sim` distribution, and only the mapping knows that.
29
+ Dotted names look up their top-level parent; when the mapping
30
+ is silent (a dist-info without top_level records), a direct
31
+ version lookup under the module name is the fallback, so the
32
+ rule stays loader-plus-version either way.
33
+
34
+ Args:
35
+ names: Importable module names to probe, in order.
36
+
37
+ Returns:
38
+ (found, missing) pair: found maps each installed module to
39
+ its distribution version, missing lists the rest in
40
+ probe order.
41
+ """
42
+ try:
43
+ provided = importlib.metadata.packages_distributions()
44
+ except Exception:
45
+ provided = {}
46
+ found, missing = {}, []
47
+ for name in names:
48
+ try:
49
+ spec = importlib.util.find_spec(name)
50
+ except (ImportError, ValueError):
51
+ spec = None
52
+ if spec is None or spec.loader is None:
53
+ missing.append(name)
54
+ continue
55
+ candidates = list(provided.get(name.partition(".")[0]) or [])
56
+ if name not in candidates:
57
+ candidates.append(name)
58
+ for candidate in candidates:
59
+ try:
60
+ found[name] = importlib.metadata.version(candidate)
61
+ break
62
+ except importlib.metadata.PackageNotFoundError:
63
+ continue
64
+ else:
65
+ missing.append(name)
66
+ return found, missing
@@ -0,0 +1,58 @@
1
+ """Operation vocabulary: the single source of truth for callable names.
2
+
3
+ Transports gate inbound names against these sets; the composition root
4
+ gates outbound routing against them. Neither side keeps its own copy.
5
+ """
6
+
7
+ OPERATIONS = frozenset(
8
+ {
9
+ "generate_views", "run_hdl_test", "run_formal", "run_syntax",
10
+ "run_synth",
11
+ "run_connectivity", "run_drc", "run_lvs", "run_erc", "run_spice",
12
+ "run_optical", "run_digital_flow", "run_timing", "run_extraction",
13
+ "run_post_layout", "run_em", "run_thermal", "python_execute",
14
+ "run_view_sync", "run_cosim", "run_xschem", "run_antenna",
15
+ "python_open", "python_reset",
16
+ "run_job",
17
+ "resume_run", "discard_run", "resume_all_retryable", "cancel_job",
18
+ "create_project", "write_doc", "delete_doc", "apply_mutations",
19
+ "rewind", "place_cell", "write_settings",
20
+ "create_entity", "set_component", "attach_component",
21
+ "detach_component", "delete_entity",
22
+ "place_wire", "place_junction", "connect_endpoint", "move_wire",
23
+ "split_wire", "delete_wire", "delete_junction", "materialize_nets",
24
+ "apply_transaction",
25
+ "create_shape",
26
+ "create_sheet", "place_instance", "bind_block",
27
+ "create_symbol", "create_cell", "map_pins",
28
+ "ip_register", "ip_instantiate", "ip_promote",
29
+ "bind_layers", "annotate",
30
+ "create_testbench", "regenerate_testbench",
31
+ }
32
+ )
33
+ QUERIES = frozenset(
34
+ {
35
+ "api_search", "api_info", "api_help", "get_python_console",
36
+ "get_capabilities", "get_project_snapshot", "list_job_kinds",
37
+ "plan_checks", "get_design_completion",
38
+ "get_job_status", "get_check_results",
39
+ "get_events_since", "list_artifacts", "get_logs",
40
+ "get_findings",
41
+ "list_projects", "list_docs", "read_doc",
42
+ "get_component", "components_of", "entities_with",
43
+ "get_world_snapshot",
44
+ "list_cells", "serve_asset", "list_assets",
45
+ "read_settings", "get_resolved_config",
46
+ "get_layer_stackup", "get_layer_rows", "list_layer_presets",
47
+ "save_layer_preset", "delete_layer_preset", "apply_layer_preset",
48
+ "list_survivors",
49
+ "read_entity_revision",
50
+ "list_sheets", "get_sheet", "get_instance", "instances_on_sheet",
51
+ "list_symbols", "get_symbol", "get_cell",
52
+ "list_layers", "check_capability",
53
+ "ip_search", "ip_get",
54
+ "connection_graph", "net_occurrences", "xprobe", "resolve_pin",
55
+ "plot_export", "erc_check", "write_netlist", "update_netlist",
56
+ "list_testbenches", "describe_testbench",
57
+ }
58
+ )
@@ -0,0 +1,31 @@
1
+ """Fresh ruamel dumpers for YAML writes (RUAMEL-DUMPER).
2
+
3
+ A failed ruamel ``YAML(typ="safe").dump`` poisons that dumper
4
+ instance: every later dump through it emits empty text instead
5
+ of raising. A long-lived dumper therefore collapses distinct
6
+ writes onto one hollow identity after a single failure. Every
7
+ YAML write on the Engine/ProjectService path dumps through a
8
+ fresh instance per call, so a failure raises loudly and later
9
+ writes are unaffected.
10
+ """
11
+
12
+ import io
13
+
14
+ from ruamel.yaml import YAML
15
+
16
+ __all__ = ["dump_yaml_text"]
17
+
18
+
19
+ def dump_yaml_text(data):
20
+ """Render one YAML text through a fresh dumper.
21
+
22
+ Args:
23
+ data: Mapping or list to serialize.
24
+
25
+ Returns:
26
+ YAML text for the payload, byte-identical to a direct
27
+ fresh ``YAML(typ="safe")`` dump and never empty.
28
+ """
29
+ buf = io.StringIO()
30
+ YAML(typ="safe").dump(data, buf)
31
+ return buf.getvalue()
@@ -0,0 +1,22 @@
1
+ # library — PDK and reusable-cell catalogs
2
+
3
+ library/ supplies catalog lookups used by operations and capability checks. It currently contains PDK context/catalog logic and the APIG cell catalog; solver execution remains in adapters/ and project revisions remain in project/.
4
+
5
+ ## PDK catalog
6
+
7
+ catalog.py resolves versioned PDK references, reports per-operation readiness, registers and verifies catalog entries, and provides cell instantiate/promote helpers. The file-backed PDK registry and asset resolver live in [interfaces/pdks.py](../interfaces/pdks.py); registration records a revision and content identity, and upstream files are treated as read-only inputs.
8
+
9
+ ## Cell catalog
10
+
11
+ apig_catalog.py combines static providers with a GDSFactory provider, normalizes cell metadata, and supports list/get/placement methods. The engine currently exposes the list_cells query; the generated API marks place_cell unwired, and get_cell is not a public engine query yet. Check the [generated API](../../docs/engine-api.md) before depending on a caller-facing operation.
12
+
13
+ ## Readiness
14
+
15
+ Catalog metadata is distinct from verification. get_capabilities reports whether a tool, PDK, or deck is ready on the current machine and includes a remedy for blocked items. Registering a PDK or cell does not imply a design has passed its checks.
16
+
17
+ ## Routing
18
+
19
+ - PDK bytes, profiles, and setup probes → [interfaces](../interfaces/README.md) and [provision plan](../../docs/provision-plan.md).
20
+ - Project component state and revisions → [project](../project/README.md).
21
+ - Adapter execution → [adapters](../adapters/README.md).
22
+ - Product PDK model → [PRD PDK abstraction](../../../PRD/tools-research/pdk-abstraction.md).
@@ -0,0 +1,13 @@
1
+ """PDK registry, prepared-profile catalog, IP search/register/instantiate."""
2
+
3
+ from .apig_catalog import ApigCatalog, gdsfactory_provider, static_provider
4
+ from .catalog import Catalog
5
+ from .errors import LibraryError
6
+
7
+ __all__ = [
8
+ "ApigCatalog",
9
+ "Catalog",
10
+ "LibraryError",
11
+ "gdsfactory_provider",
12
+ "static_provider",
13
+ ]