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,205 @@
1
+ """Op dispatch: the inbound port shared by CLI, console, and MCP.
2
+
3
+ One catalog (`interfaces.vocabulary`), one parser of record. Op-call
4
+ text — `run_drc tech=scmos timeout_s=30` — parses here into a
5
+ validated (operation, arguments) pair; the CLI adapter, batch files,
6
+ the REPL, and console-history replay all compile through
7
+ `parse_op_call`/`parse_op_tokens` and `OpDispatcher`, so one syntax
8
+ is tested once. MCP validates names against the same catalog for
9
+ its structured calls. Names in OPERATIONS execute via `engine.run`;
10
+ names in QUERIES read via `engine.submit`. Unknown names and
11
+ malformed args raise UsageError (the caller maps it to a usage
12
+ exit); engine failures propagate untouched so callers report them
13
+ honestly. This module imports no adapter and no engine: the engine
14
+ arrives as a duck-typed port (`run`/`submit`).
15
+ """
16
+
17
+ import shlex
18
+
19
+ from ruamel.yaml import YAML
20
+
21
+ from ..adapters import api
22
+ from ..interfaces.vocabulary import OPERATIONS, QUERIES
23
+ from .errors import UsageError
24
+
25
+ __all__ = ["OpDispatcher", "parse_op_call", "parse_op_tokens"]
26
+
27
+ _yaml = YAML(typ="safe")
28
+
29
+
30
+ def _parse_value(text):
31
+ try:
32
+ return _yaml.load(text)
33
+ except Exception:
34
+ return text
35
+
36
+
37
+ def _check_name(name):
38
+ if name not in OPERATIONS and name not in QUERIES:
39
+ raise UsageError("unsupported_operation", f"Unknown operation: {name}.")
40
+
41
+
42
+ def parse_op_tokens(tokens):
43
+ """Validate pre-split op-call tokens (argv path, no re-splitting).
44
+
45
+ First token is the operation, the rest are `key=value` pairs with
46
+ YAML-scalar values (`benches=[ac,tran]`, `deck={tool: klayout}`).
47
+ Unparseable values pass through as raw strings: the CLI owns
48
+ lexical shape, the engine owns semantic validation.
49
+
50
+ Args:
51
+ tokens: Pre-split op call; first token is the operation,
52
+ the rest are `key=value` pairs.
53
+
54
+ Returns:
55
+ (operation, arguments) pair with YAML-scalar values.
56
+
57
+ Raises:
58
+ UsageError: invalid_command for an empty call or a
59
+ malformed argument, unsupported_operation for an
60
+ unknown operation.
61
+ """
62
+ tokens = list(tokens)
63
+ if not tokens:
64
+ raise UsageError("invalid_command", "Empty op call.")
65
+ name = tokens[0]
66
+ _check_name(name)
67
+ arguments = {}
68
+ for token in tokens[1:]:
69
+ key, sep, value_text = token.partition("=")
70
+ if not sep or not key or not value_text:
71
+ raise UsageError(
72
+ "invalid_command",
73
+ f"Malformed argument (want key=value): {token}.",
74
+ )
75
+ arguments[key] = _parse_value(value_text)
76
+ return name, arguments
77
+
78
+
79
+ def parse_op_call(text):
80
+ """Parse one op-call line (batch/REPL path) via `parse_op_tokens`.
81
+
82
+ Args:
83
+ text: One op-call line, shell-split before validation.
84
+
85
+ Returns:
86
+ (operation, arguments) pair with YAML-scalar values.
87
+
88
+ Raises:
89
+ UsageError: invalid_command when the line cannot be split
90
+ or an argument is malformed, unsupported_operation
91
+ for an unknown operation.
92
+ """
93
+ try:
94
+ tokens = shlex.split(text)
95
+ except ValueError as exc:
96
+ raise UsageError(
97
+ "invalid_command", f"Cannot parse op call: {exc}."
98
+ ) from exc
99
+ return parse_op_tokens(tokens)
100
+
101
+
102
+ class OpDispatcher:
103
+ """Route validated op calls to the engine port.
104
+
105
+ Args:
106
+ engine: Duck-typed engine port (`run`/`submit`).
107
+ project_id: Project id stamped on every command.
108
+ actor: Actor stamped on every command.
109
+ """
110
+
111
+ def __init__(self, engine, project_id="default", actor="cli"):
112
+ self._engine = engine
113
+ self._project_id = project_id
114
+ self._actor = actor
115
+
116
+ @property
117
+ def project_id(self):
118
+ """Project id stamped on every dispatched command.
119
+
120
+ Returns:
121
+ Bound project id.
122
+ """
123
+ return self._project_id
124
+
125
+ @property
126
+ def actor(self):
127
+ """Actor stamped on every dispatched command.
128
+
129
+ Returns:
130
+ Bound actor name.
131
+ """
132
+ return self._actor
133
+
134
+ def execute(self, operation, arguments, request_id=None):
135
+ """Route one validated op call to the engine port.
136
+
137
+ Every call — operations and queries alike — goes through
138
+ the api contract (`adapters.api.submit`), the one admission
139
+ path (ledger, revision gate, idempotency). Like the MCP
140
+ server's project binding,
141
+ an operation missing expected_revision is filled from the
142
+ bound engine's current head, so interactive callers admit
143
+ against what they see; an explicit revision always wins,
144
+ and read queries pass through untouched (tier-1 reads never
145
+ carry admission data). Engine failures propagate untouched
146
+ so callers report them honestly.
147
+
148
+ Args:
149
+ operation: Cataloged operation or query name.
150
+ arguments: Operation arguments (deck.tool selects the
151
+ solver for runs).
152
+ request_id: Envelope id; generated when omitted.
153
+
154
+ Returns:
155
+ Engine result for the operation or query.
156
+
157
+ Raises:
158
+ UsageError: unsupported_operation for an unknown name.
159
+ """
160
+ _check_name(operation)
161
+ stamped = dict(arguments)
162
+ if operation not in QUERIES and "expected_revision" not in stamped:
163
+ head = self._current_head()
164
+ if head is not None:
165
+ stamped["expected_revision"] = head
166
+ return api.submit(
167
+ self._engine, self._project_id, operation, stamped,
168
+ request_id=request_id,
169
+ )
170
+
171
+ def _current_head(self):
172
+ """Bound engine's head revision, or None when unknowable.
173
+
174
+ Duck-typed engines without a snapshot read simply leave
175
+ the call unstamped — the engine then enforces its own gate.
176
+
177
+ Returns:
178
+ Current revision string, or None.
179
+ """
180
+ snapshot = getattr(self._engine, "snapshot", None)
181
+ if not callable(snapshot):
182
+ return None
183
+ try:
184
+ return snapshot().get("current_revision")
185
+ except Exception:
186
+ return None
187
+
188
+ def execute_line(self, line, request_id=None):
189
+ """Parse one op-call line and route it to the engine port.
190
+
191
+ Args:
192
+ line: One op-call line (`operation [key=value ...]`).
193
+ request_id: Envelope id; generated when omitted.
194
+
195
+ Returns:
196
+ (operation, result) pair for the routed call.
197
+
198
+ Raises:
199
+ UsageError: invalid_command for a malformed line,
200
+ unsupported_operation for an unknown name.
201
+ """
202
+ operation, arguments = parse_op_call(line)
203
+ return operation, self.execute(
204
+ operation, arguments, request_id=request_id
205
+ )
@@ -0,0 +1,31 @@
1
+ """Error type for execution violations. Carries a stable machine code."""
2
+
3
+
4
+ class ExecutionError(Exception):
5
+ """Execution violation with a stable machine code.
6
+
7
+ Args:
8
+ code: Stable machine-readable error code.
9
+ message: Human-readable detail.
10
+ fields: Itemized fields, when the error names any.
11
+ """
12
+
13
+ def __init__(self, code, message, fields=None):
14
+ super().__init__(message)
15
+ self.code = code
16
+ self.fields = fields or []
17
+
18
+
19
+ class UsageError(Exception):
20
+ """Op-call validation failure: unknown op or malformed args.
21
+
22
+ Raised by the dispatch port; inbound adapters map it to a usage
23
+ exit (CLI: exit 2). Codes reuse the stable engine vocabulary:
24
+ `unsupported_operation` for unknown names, `invalid_command`
25
+ for malformed calls.
26
+ """
27
+
28
+ def __init__(self, code, message, fields=None):
29
+ super().__init__(message)
30
+ self.code = code
31
+ self.fields = fields or []