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.
- rocket_engine/__init__.py +8 -0
- rocket_engine/__main__.py +12 -0
- rocket_engine/adapters/README.md +54 -0
- rocket_engine/adapters/__init__.py +7 -0
- rocket_engine/adapters/api.py +39 -0
- rocket_engine/adapters/base.py +46 -0
- rocket_engine/adapters/cace/__init__.py +163 -0
- rocket_engine/adapters/circulax/README.md +10 -0
- rocket_engine/adapters/circulax/__init__.py +112 -0
- rocket_engine/adapters/circulax/_driver.py +190 -0
- rocket_engine/adapters/circulax/adapter.py +538 -0
- rocket_engine/adapters/circulax/results.py +291 -0
- rocket_engine/adapters/cli/README.md +34 -0
- rocket_engine/adapters/cli/__init__.py +305 -0
- rocket_engine/adapters/connectivity/__init__.py +196 -0
- rocket_engine/adapters/connectivity/results.py +214 -0
- rocket_engine/adapters/cosim/README.md +9 -0
- rocket_engine/adapters/cosim/__init__.py +1390 -0
- rocket_engine/adapters/cosim/results.py +214 -0
- rocket_engine/adapters/devsim/__init__.py +171 -0
- rocket_engine/adapters/digital_flow/README.md +9 -0
- rocket_engine/adapters/digital_flow/__init__.py +1121 -0
- rocket_engine/adapters/digital_flow/results.py +227 -0
- rocket_engine/adapters/digital_flow/state.py +462 -0
- rocket_engine/adapters/drc/README.klayout.md +7 -0
- rocket_engine/adapters/drc/README.md +7 -0
- rocket_engine/adapters/drc/__init__.py +1 -0
- rocket_engine/adapters/drc/klayout.py +952 -0
- rocket_engine/adapters/drc/magic.py +287 -0
- rocket_engine/adapters/drc/results.py +184 -0
- rocket_engine/adapters/drc/results_kl.py +188 -0
- rocket_engine/adapters/elmer/__init__.py +163 -0
- rocket_engine/adapters/envelope.py +120 -0
- rocket_engine/adapters/equivalence/__init__.py +156 -0
- rocket_engine/adapters/errors.py +181 -0
- rocket_engine/adapters/extract_magic/README.md +15 -0
- rocket_engine/adapters/extract_magic/__init__.py +425 -0
- rocket_engine/adapters/extract_magic/results.py +209 -0
- rocket_engine/adapters/formal_sby/README.md +7 -0
- rocket_engine/adapters/formal_sby/__init__.py +773 -0
- rocket_engine/adapters/formal_sby/formal_edge.py +195 -0
- rocket_engine/adapters/formal_sby/results.py +185 -0
- rocket_engine/adapters/gdsfactory/__init__.py +194 -0
- rocket_engine/adapters/gdsfactory/_driver.py +459 -0
- rocket_engine/adapters/gdsfactory/adapter.py +609 -0
- rocket_engine/adapters/gdsfactory/results.py +181 -0
- rocket_engine/adapters/hdl_sim/README.md +7 -0
- rocket_engine/adapters/hdl_sim/__init__.py +369 -0
- rocket_engine/adapters/hdl_sim/ghdl.py +155 -0
- rocket_engine/adapters/hdl_sim/results.py +178 -0
- rocket_engine/adapters/hdl_sim/verilator.py +167 -0
- rocket_engine/adapters/http/README.md +15 -0
- rocket_engine/adapters/http/__init__.py +458 -0
- rocket_engine/adapters/http/events.py +63 -0
- rocket_engine/adapters/ipc/README.md +9 -0
- rocket_engine/adapters/ipc/__init__.py +111 -0
- rocket_engine/adapters/lvs_netgen/README.md +20 -0
- rocket_engine/adapters/lvs_netgen/__init__.py +889 -0
- rocket_engine/adapters/lvs_netgen/results.py +168 -0
- rocket_engine/adapters/mcp/README.md +19 -0
- rocket_engine/adapters/mcp/__init__.py +85 -0
- rocket_engine/adapters/mcp/api-schema.json +6107 -0
- rocket_engine/adapters/mcp/pull.py +246 -0
- rocket_engine/adapters/mcp/server.py +794 -0
- rocket_engine/adapters/meep/__init__.py +167 -0
- rocket_engine/adapters/meow/README.md +7 -0
- rocket_engine/adapters/meow/__init__.py +190 -0
- rocket_engine/adapters/meow/_driver.py +227 -0
- rocket_engine/adapters/meow/_envelope.py +108 -0
- rocket_engine/adapters/meow/adapter.py +491 -0
- rocket_engine/adapters/meow/results.py +218 -0
- rocket_engine/adapters/mutation/__init__.py +192 -0
- rocket_engine/adapters/ngspice/README.md +28 -0
- rocket_engine/adapters/ngspice/__init__.py +627 -0
- rocket_engine/adapters/ngspice/results.py +215 -0
- rocket_engine/adapters/postlayout/README.md +28 -0
- rocket_engine/adapters/postlayout/__init__.py +17 -0
- rocket_engine/adapters/postlayout/adapter.py +1062 -0
- rocket_engine/adapters/postlayout/results.py +330 -0
- rocket_engine/adapters/postlayout/translate.py +71 -0
- rocket_engine/adapters/profile.py +220 -0
- rocket_engine/adapters/sax/README.md +23 -0
- rocket_engine/adapters/sax/__init__.py +516 -0
- rocket_engine/adapters/sax/_driver.py +148 -0
- rocket_engine/adapters/sax/results.py +291 -0
- rocket_engine/adapters/stdio_console.py +1151 -0
- rocket_engine/adapters/syntax/README.md +5 -0
- rocket_engine/adapters/syntax/__init__.py +366 -0
- rocket_engine/adapters/syntax/results.py +181 -0
- rocket_engine/adapters/synth_yosys/README.md +7 -0
- rocket_engine/adapters/synth_yosys/__init__.py +655 -0
- rocket_engine/adapters/synth_yosys/amaranth.py +120 -0
- rocket_engine/adapters/synth_yosys/ghdl.py +128 -0
- rocket_engine/adapters/synth_yosys/results.py +173 -0
- rocket_engine/adapters/timing_sta/README.md +9 -0
- rocket_engine/adapters/timing_sta/__init__.py +726 -0
- rocket_engine/adapters/view_sync/__init__.py +185 -0
- rocket_engine/adapters/view_sync/results.py +189 -0
- rocket_engine/adapters/vlsir/__init__.py +142 -0
- rocket_engine/adapters/xschem/__init__.py +440 -0
- rocket_engine/adapters/xschem/deck.py +266 -0
- rocket_engine/clients/__init__.py +5 -0
- rocket_engine/clients/runtime.py +255 -0
- rocket_engine/composition.py +2279 -0
- rocket_engine/execution/README.md +30 -0
- rocket_engine/execution/__init__.py +150 -0
- rocket_engine/execution/apig/__init__.py +1 -0
- rocket_engine/execution/apig/pool.py +463 -0
- rocket_engine/execution/apig/submit.py +124 -0
- rocket_engine/execution/block_runs_scope.py +479 -0
- rocket_engine/execution/coalesce.py +414 -0
- rocket_engine/execution/console/__init__.py +1 -0
- rocket_engine/execution/console/apply_session.py +318 -0
- rocket_engine/execution/console/lifecycle.py +265 -0
- rocket_engine/execution/dispatch.py +205 -0
- rocket_engine/execution/errors.py +31 -0
- rocket_engine/execution/ports.py +797 -0
- rocket_engine/execution/pyexec/__init__.py +1 -0
- rocket_engine/execution/pyexec/apply_context.py +547 -0
- rocket_engine/execution/pyexec/approvals.py +173 -0
- rocket_engine/execution/pyexec/runner.py +404 -0
- rocket_engine/execution/pyexec/support.py +464 -0
- rocket_engine/execution/python_exec.py +897 -0
- rocket_engine/execution/queue.py +85 -0
- rocket_engine/execution/replay_safe.py +601 -0
- rocket_engine/execution/routing/__init__.py +1 -0
- rocket_engine/execution/routing/calls.py +364 -0
- rocket_engine/execution/routing/namespace.py +785 -0
- rocket_engine/execution/routing/ports.py +102 -0
- rocket_engine/execution/routing/tools.py +346 -0
- rocket_engine/execution/runner.py +311 -0
- rocket_engine/execution/runtime.py +1149 -0
- rocket_engine/execution/service.py +279 -0
- rocket_engine/execution/worker.py +464 -0
- rocket_engine/interfaces/README.md +26 -0
- rocket_engine/interfaces/__init__.py +58 -0
- rocket_engine/interfaces/apig_assets.py +407 -0
- rocket_engine/interfaces/celllink.py +461 -0
- rocket_engine/interfaces/documents.py +92 -0
- rocket_engine/interfaces/envelopes.py +131 -0
- rocket_engine/interfaces/errors.py +16 -0
- rocket_engine/interfaces/layout.py +410 -0
- rocket_engine/interfaces/layout_schema.yaml +278 -0
- rocket_engine/interfaces/paths.py +223 -0
- rocket_engine/interfaces/pdks.py +550 -0
- rocket_engine/interfaces/ports.py +72 -0
- rocket_engine/interfaces/references.py +115 -0
- rocket_engine/interfaces/refs.py +85 -0
- rocket_engine/interfaces/runparams.py +304 -0
- rocket_engine/interfaces/setup.py +552 -0
- rocket_engine/interfaces/setup_catalogue.yaml +243 -0
- rocket_engine/interfaces/setup_probes.py +66 -0
- rocket_engine/interfaces/vocabulary.py +58 -0
- rocket_engine/interfaces/yaml_dump.py +31 -0
- rocket_engine/library/README.md +22 -0
- rocket_engine/library/__init__.py +13 -0
- rocket_engine/library/apig_catalog.py +371 -0
- rocket_engine/library/catalog.py +185 -0
- rocket_engine/library/errors.py +16 -0
- rocket_engine/mutate/__init__.py +776 -0
- rocket_engine/mutate/operators.py +700 -0
- rocket_engine/ops/__init__.py +1 -0
- rocket_engine/ops/deferred.py +279 -0
- rocket_engine/ops/editors.py +404 -0
- rocket_engine/ops/evidence.py +194 -0
- rocket_engine/ops/gates.py +262 -0
- rocket_engine/ops/ports.py +76 -0
- rocket_engine/ops/queries.py +417 -0
- rocket_engine/ops/runs.py +553 -0
- rocket_engine/ops/submit.py +614 -0
- rocket_engine/project/README.md +27 -0
- rocket_engine/project/__init__.py +6 -0
- rocket_engine/project/canvas/__init__.py +55 -0
- rocket_engine/project/canvas/compile.py +109 -0
- rocket_engine/project/canvas/integrate.py +48 -0
- rocket_engine/project/canvas/schema.py +241 -0
- rocket_engine/project/canvas/templates.py +46 -0
- rocket_engine/project/canvas/validate.py +603 -0
- rocket_engine/project/edit/__init__.py +5 -0
- rocket_engine/project/edit/cas.py +87 -0
- rocket_engine/project/edit/transactions.py +282 -0
- rocket_engine/project/errors.py +16 -0
- rocket_engine/project/frontend13.py +685 -0
- rocket_engine/project/geometry/__init__.py +23 -0
- rocket_engine/project/geometry/ops.py +451 -0
- rocket_engine/project/geometry/snap.py +103 -0
- rocket_engine/project/ip/__init__.py +1 -0
- rocket_engine/project/ip/blocks.py +195 -0
- rocket_engine/project/ip/entry.schema.json +78 -0
- rocket_engine/project/ip/lifecycle.py +402 -0
- rocket_engine/project/ip/verbs.py +123 -0
- rocket_engine/project/layers/__init__.py +6 -0
- rocket_engine/project/layers/bindings.py +115 -0
- rocket_engine/project/layers/catalog.py +228 -0
- rocket_engine/project/layers/presets.py +43 -0
- rocket_engine/project/ledger/__init__.py +1 -0
- rocket_engine/project/ledger/docs.py +167 -0
- rocket_engine/project/ledger/entities.py +176 -0
- rocket_engine/project/ledger/events.py +29 -0
- rocket_engine/project/ledger/runs.py +257 -0
- rocket_engine/project/ledger/shared.py +174 -0
- rocket_engine/project/ledger/snapshots.py +385 -0
- rocket_engine/project/ledger/wires.py +552 -0
- rocket_engine/project/process/__init__.py +14 -0
- rocket_engine/project/process/model.py +193 -0
- rocket_engine/project/process/recipes.py +121 -0
- rocket_engine/project/schematic/__init__.py +1 -0
- rocket_engine/project/schematic/hierarchy.py +312 -0
- rocket_engine/project/schematic/instances.py +393 -0
- rocket_engine/project/schematic/sheets.py +198 -0
- rocket_engine/project/service.py +2941 -0
- rocket_engine/project/symbols/__init__.py +1 -0
- rocket_engine/project/symbols/cells.py +324 -0
- rocket_engine/project/symbols/linkage.py +356 -0
- rocket_engine/project/symbols/symbols.py +352 -0
- rocket_engine/project/templates/__init__.py +303 -0
- rocket_engine/project/templates/errors.py +25 -0
- rocket_engine/project/testbench/__init__.py +49 -0
- rocket_engine/project/testbench/blocks.py +619 -0
- rocket_engine/project/testbench/templates.py +134 -0
- rocket_engine/stores/README.md +12 -0
- rocket_engine/stores/__init__.py +6 -0
- rocket_engine/stores/ecs.py +1508 -0
- rocket_engine/stores/layers.py +1023 -0
- rocket_engine/stores/settings.py +1188 -0
- rocket_engine/stores/wireplace.py +1324 -0
- rocket_engine/workflows/README.md +18 -0
- rocket_engine/workflows/__init__.py +53 -0
- rocket_engine/workflows/capability_plan.py +102 -0
- rocket_engine/workflows/completion.py +228 -0
- rocket_engine/workflows/connectgraph.py +734 -0
- rocket_engine/workflows/connectgraph_emit.py +336 -0
- rocket_engine/workflows/gates.py +144 -0
- rocket_engine/workflows/photonic_wire.py +76 -0
- rocket_engine/workflows/stages.py +324 -0
- rocket_engine/workflows/viewsync.py +399 -0
- rocket_engine-0.0.2b1.dist-info/METADATA +200 -0
- rocket_engine-0.0.2b1.dist-info/RECORD +241 -0
- rocket_engine-0.0.2b1.dist-info/WHEEL +4 -0
- rocket_engine-0.0.2b1.dist-info/entry_points.txt +2 -0
- rocket_engine-0.0.2b1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""Ngspice v1 normalizer: v0 parse output to a ResultBundle.
|
|
2
|
+
|
|
3
|
+
Maps the ``run_spice`` parse shape (``measurements[]`` with value,
|
|
4
|
+
unit, target, margin, and pass/fail status plus ``sim_fail``
|
|
5
|
+
violations) onto typed v1 datasets, views, measurements, and
|
|
6
|
+
findings. Pure function of the parsed output: no I/O, no tool
|
|
7
|
+
calls, deterministic ids derived from the run id.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
TASK = "run_spice"
|
|
11
|
+
|
|
12
|
+
_DIAG_CAP = 240
|
|
13
|
+
|
|
14
|
+
_SEVERITY = {"error": "error", "warning": "warning"}
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _cap(text):
|
|
18
|
+
"""Cap one diagnostic string at the bundle prose limit.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
text: Raw diagnostic text, possibly unbounded tool prose.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
The text unchanged when short, else truncated with an
|
|
25
|
+
ellipsis marker.
|
|
26
|
+
"""
|
|
27
|
+
text = text if isinstance(text, str) else str(text)
|
|
28
|
+
if len(text) <= _DIAG_CAP:
|
|
29
|
+
return text
|
|
30
|
+
return text[: _DIAG_CAP - 3] + "..."
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _quantity(value, unit):
|
|
34
|
+
"""Build one v1 Quantity, mapping unitless to dimensionless.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
value: Numeric value.
|
|
38
|
+
unit: Unit string, possibly empty for unitless measures.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
Quantity mapping with an explicit unit.
|
|
42
|
+
"""
|
|
43
|
+
return {"value": float(value), "unit": unit if unit else "1"}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _limit(item):
|
|
47
|
+
"""Pick the binding target bound for one measurement.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
item: v0 measurement with a ``target`` min/max mapping.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
The bound closest to the measured value (the margin
|
|
54
|
+
binding bound), or None when the target is empty.
|
|
55
|
+
"""
|
|
56
|
+
target = item.get("target") or {}
|
|
57
|
+
scored = []
|
|
58
|
+
if target.get("min") is not None:
|
|
59
|
+
scored.append((float(item["value"]) - float(target["min"]),
|
|
60
|
+
float(target["min"])))
|
|
61
|
+
if target.get("max") is not None:
|
|
62
|
+
scored.append((float(target["max"]) - float(item["value"]),
|
|
63
|
+
float(target["max"])))
|
|
64
|
+
if not scored:
|
|
65
|
+
return None
|
|
66
|
+
return min(scored)[1]
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _provenance(project_id, run_id, tools, provenance):
|
|
70
|
+
"""Build ResultProvenance, defaulting to a placeholder closure.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
project_id: Project the run belongs to.
|
|
74
|
+
run_id: Run the bundle describes.
|
|
75
|
+
tools: Tool ingredient mappings (id, version, digest?).
|
|
76
|
+
provenance: Full provenance mapping when the caller has
|
|
77
|
+
one; a deterministic placeholder otherwise.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
Provenance mapping valid against the v1 schema.
|
|
81
|
+
"""
|
|
82
|
+
if provenance is not None:
|
|
83
|
+
return provenance
|
|
84
|
+
ref = {"scope": "project", "id": project_id, "revision": "r1"}
|
|
85
|
+
return {
|
|
86
|
+
"snapshot": dict(ref),
|
|
87
|
+
"input_lock": dict(ref),
|
|
88
|
+
"closure_hash": "0" * 64,
|
|
89
|
+
"tools": [
|
|
90
|
+
{
|
|
91
|
+
"id": item["id"],
|
|
92
|
+
"version": item.get("version", ""),
|
|
93
|
+
"digest": item.get("digest", "0" * 64),
|
|
94
|
+
}
|
|
95
|
+
for item in tools
|
|
96
|
+
],
|
|
97
|
+
"parents": [],
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def normalize(parsed, *, run_id, project_id="project", target=None,
|
|
102
|
+
tools=(), provenance=None):
|
|
103
|
+
"""Normalize one ngspice parse output to a v1 ResultBundle.
|
|
104
|
+
|
|
105
|
+
Measurement rows become a table dataset (names, values,
|
|
106
|
+
margins, statuses; canonical units live on ``measurements[]``)
|
|
107
|
+
plus a bound table view; violations become findings with
|
|
108
|
+
capped messages. PASS measurements keep value, target,
|
|
109
|
+
margin, and status.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
parsed: v0 parse mapping with ``violations[]`` and
|
|
113
|
+
``measurements[]``.
|
|
114
|
+
run_id: Run the bundle describes (anchors all ids).
|
|
115
|
+
project_id: Project the run belongs to.
|
|
116
|
+
target: v1 target mapping; project kind by default.
|
|
117
|
+
tools: Tool ingredient mappings for provenance.
|
|
118
|
+
provenance: Full provenance mapping when the caller has
|
|
119
|
+
one; a deterministic placeholder otherwise.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
Schema-valid ResultBundle mapping.
|
|
123
|
+
"""
|
|
124
|
+
measurements_in = parsed.get("measurements") or []
|
|
125
|
+
violations = parsed.get("violations") or []
|
|
126
|
+
table_id = f"{run_id}:dataset:measurements"
|
|
127
|
+
columns = [
|
|
128
|
+
{
|
|
129
|
+
"id": f"{table_id}:name",
|
|
130
|
+
"name": "name",
|
|
131
|
+
"dtype": "utf8",
|
|
132
|
+
"unit": "1",
|
|
133
|
+
"data": [item["name"] for item in measurements_in],
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": f"{table_id}:value",
|
|
137
|
+
"name": "value",
|
|
138
|
+
"dtype": "float64",
|
|
139
|
+
"unit": "1",
|
|
140
|
+
"data": [float(item["value"]) for item in measurements_in],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"id": f"{table_id}:margin",
|
|
144
|
+
"name": "margin",
|
|
145
|
+
"dtype": "float64",
|
|
146
|
+
"unit": "1",
|
|
147
|
+
"data": [float(item["margin"]) for item in measurements_in],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": f"{table_id}:status",
|
|
151
|
+
"name": "status",
|
|
152
|
+
"dtype": "utf8",
|
|
153
|
+
"unit": "1",
|
|
154
|
+
"data": [item["status"] for item in measurements_in],
|
|
155
|
+
},
|
|
156
|
+
]
|
|
157
|
+
datasets = [
|
|
158
|
+
{
|
|
159
|
+
"id": table_id,
|
|
160
|
+
"kind": "table",
|
|
161
|
+
"row_count": len(measurements_in),
|
|
162
|
+
"columns": columns,
|
|
163
|
+
"conditions": [],
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
views = [
|
|
167
|
+
{
|
|
168
|
+
"id": f"{run_id}:view:measurements",
|
|
169
|
+
"kind": "table",
|
|
170
|
+
"dataset_id": table_id,
|
|
171
|
+
"name": "measurements",
|
|
172
|
+
}
|
|
173
|
+
]
|
|
174
|
+
measurements = []
|
|
175
|
+
for item in measurements_in:
|
|
176
|
+
entry = {
|
|
177
|
+
"name": item["name"],
|
|
178
|
+
"value": _quantity(item["value"], item.get("unit", "")),
|
|
179
|
+
"margin": _quantity(item["margin"], item.get("unit", "")),
|
|
180
|
+
"status": "PASS" if item["status"] == "pass" else "FAIL",
|
|
181
|
+
}
|
|
182
|
+
bound = _limit(item)
|
|
183
|
+
if bound is not None:
|
|
184
|
+
entry["limit"] = _quantity(bound, item.get("unit", ""))
|
|
185
|
+
measurements.append(entry)
|
|
186
|
+
findings = [
|
|
187
|
+
{
|
|
188
|
+
"id": f"{run_id}:finding:{index}",
|
|
189
|
+
"severity": _SEVERITY.get(v.get("severity"), "info"),
|
|
190
|
+
"code": v.get("rule", "sim_fail"),
|
|
191
|
+
"message": _cap(v.get("message", "")),
|
|
192
|
+
}
|
|
193
|
+
for index, v in enumerate(violations)
|
|
194
|
+
]
|
|
195
|
+
converged = not any(v.get("rule") == "sim_fail" for v in violations)
|
|
196
|
+
return {
|
|
197
|
+
"schema": "rocketeda/results/v1",
|
|
198
|
+
"ref": {"scope": "project", "id": run_id, "revision": "r1"},
|
|
199
|
+
"run_id": run_id,
|
|
200
|
+
"task": TASK,
|
|
201
|
+
"target": dict(target)
|
|
202
|
+
if target is not None
|
|
203
|
+
else {"project_id": project_id, "kind": "project"},
|
|
204
|
+
"state": "complete",
|
|
205
|
+
"freshness": "current",
|
|
206
|
+
"convergence": "converged" if converged else "not_converged",
|
|
207
|
+
"provenance": _provenance(project_id, run_id, tools, provenance),
|
|
208
|
+
"datasets": datasets,
|
|
209
|
+
"views": views,
|
|
210
|
+
"measurements": measurements,
|
|
211
|
+
"findings": findings,
|
|
212
|
+
"artifacts": [],
|
|
213
|
+
"logs": [],
|
|
214
|
+
"gaps": [],
|
|
215
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# postlayout adapter
|
|
2
|
+
|
|
3
|
+
`run_post_layout` behind the ToolAdapter port (POSTLAYOUT).
|
|
4
|
+
|
|
5
|
+
Job: `extracted_netlist` (simmed first body) + `testbench`
|
|
6
|
+
(optional second body), `extraction_provenance`
|
|
7
|
+
(`extraction_run_id`/`netlist_sha256`, freshness-verified —
|
|
8
|
+
stale records refuse loudly, never sim a schematic as
|
|
9
|
+
extracted), `measurements` (`name`/`expr`/`min`/`max`/`unit`,
|
|
10
|
+
bounds judge POST), `schematic_run_id` (`run_id` alias) plus
|
|
11
|
+
`schematic_measurements` or a `runs` resolver for the pre
|
|
12
|
+
side, optional `waveforms` (`name`/`expr` dumped via wrdata),
|
|
13
|
+
`analyses` (default `op`), `options` (default `wnflag=1`),
|
|
14
|
+
`params`, `corner` (default `tt`), `temp_c` (default 27),
|
|
15
|
+
optional `pdk` (`id`/`revision`/`model_rel`/`engine_root`,
|
|
16
|
+
resolved through the PDK store).
|
|
17
|
+
|
|
18
|
+
Staging: `postlayout_deck.spice` (preamble + bodies + generated
|
|
19
|
+
`.control` with `let`/`print meas_*` plus `wrdata`) and
|
|
20
|
+
`.spiceinit` (`ngbehavior=hsa`). Runs
|
|
21
|
+
`ngspice -b -o postlayout.log postlayout_deck.spice`.
|
|
22
|
+
|
|
23
|
+
Parse: `meas_* = value` lines evaluated against bounds (SAX
|
|
24
|
+
`measurements` shape) joined with schematic pre values into a
|
|
25
|
+
`comparison` table (`pre`/`post`/`delta`/`rel` per row; deltas
|
|
26
|
+
never gate the verdict); missing values synthesize `sim_fail`
|
|
27
|
+
violations carrying ngspice's own error text. The verdict
|
|
28
|
+
always comes from parsed output, never the exit code.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Post-layout SPICE adapter package (POSTLAYOUT lane).
|
|
2
|
+
|
|
3
|
+
`adapter.py` serves run_post_layout behind the ToolAdapter port; this
|
|
4
|
+
package re-exports its surface so the integrator wiring reads
|
|
5
|
+
`rocket_engine.adapters.postlayout`.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .adapter import OPERATION, PostLayoutAdapter, build_deck, build_provenance
|
|
9
|
+
from .adapter import delta_table
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"OPERATION",
|
|
13
|
+
"PostLayoutAdapter",
|
|
14
|
+
"build_deck",
|
|
15
|
+
"build_provenance",
|
|
16
|
+
"delta_table",
|
|
17
|
+
]
|