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,324 @@
|
|
|
1
|
+
"""Process inventory as data: stage tables plus readiness planning.
|
|
2
|
+
|
|
3
|
+
Each stage carries its PRD identifier, a short step summary, the
|
|
4
|
+
evidence it must leave, its applicability condition, whether it gates
|
|
5
|
+
a "fully verified" claim, and the engine operations that execute it.
|
|
6
|
+
Full prose lives in the PRD; this module is the machine-readable
|
|
7
|
+
projection the planner and UI consume.
|
|
8
|
+
|
|
9
|
+
Limitation (v1): every planned stage is marked required. Evaluating
|
|
10
|
+
the prose `when` conditions into true applicability is a later slice;
|
|
11
|
+
until then a missing backend blocks completion claims rather than
|
|
12
|
+
silently narrowing scope.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
_SCRIPTED = frozenset({"project scripting", "get_capabilities", "ip_instantiate"})
|
|
16
|
+
|
|
17
|
+
STAGES = {
|
|
18
|
+
"digital": [
|
|
19
|
+
{"id": "D01", "step": "Define logic, clocks, interfaces, limits.", "evidence": "Specification and verification plan.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
20
|
+
{"id": "D02", "step": "Select and lock PDK, cells, memories, tools, HDL features.", "evidence": "Pinned libraries and capability report.", "when": "always", "required": True, "entrypoints": ["get_capabilities"]},
|
|
21
|
+
{"id": "D03", "step": "Write or import RTL; resolve files, parameters, IP.", "evidence": "Saved RTL revision and dependency closure.", "when": "always", "required": True, "entrypoints": ["ip_instantiate"]},
|
|
22
|
+
{"id": "D04", "step": "Parse RTL; syntax, widths, latches, lint.", "evidence": "Located diagnostics and waiver reasons.", "when": "always", "required": True, "entrypoints": ["run_syntax"]},
|
|
23
|
+
{"id": "D05", "step": "Elaborate and compile design with testbench.", "evidence": "Build result and executable simulation.", "when": "always", "required": True, "entrypoints": ["run_hdl_test"]},
|
|
24
|
+
{"id": "D06", "step": "Run functional tests incl. boundaries and resets.", "evidence": "Assertions, seeds, cycles, waveforms.", "when": "always", "required": True, "entrypoints": ["run_hdl_test"]},
|
|
25
|
+
{"id": "D07", "step": "Review coverage; add tests for gaps.", "evidence": "Required scenario and coverage report.", "when": "always", "required": True, "entrypoints": ["run_hdl_test"]},
|
|
26
|
+
{"id": "D08", "step": "Check clock/reset crossings and formal properties.", "evidence": "Crossing findings, proof scope, counterexamples.", "when": "multiple clock/reset domains or formal requirements", "required": True, "entrypoints": ["run_formal"]},
|
|
27
|
+
{"id": "D09", "step": "Write physical and timing constraints from the spec.", "evidence": "Clocks, IO delays, die and placement limits.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
28
|
+
{"id": "D10", "step": "Plan power domains, macros, manufacturing test.", "evidence": "Supply connections and test/scan plan.", "when": "multiple supplies, test insertion, or hard macros", "required": True, "entrypoints": ["project scripting"]},
|
|
29
|
+
{"id": "D11", "step": "Start the LibreLane flow; inspect enabled stages.", "evidence": "Exact flow, configuration, stage list.", "when": "always", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
30
|
+
{"id": "D12", "step": "Recheck lint; synthesize to standard cells.", "evidence": "Mapped netlist, cell counts, area.", "when": "always", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
31
|
+
{"id": "D13", "step": "Pre-placement constraint and timing check.", "evidence": "Constraint coverage and timing estimates.", "when": "always", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
32
|
+
{"id": "D14", "step": "Floorplan; place hard macros.", "evidence": "Die geometry, macro sites, halos.", "when": "always", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
33
|
+
{"id": "D15", "step": "Power connections, taps, power grid.", "evidence": "Supply graph and power-grid checks.", "when": "always", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
34
|
+
{"id": "D16", "step": "Place cells and IO; repair timing/electrical.", "evidence": "Legal placement, congestion, timing.", "when": "always", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
35
|
+
{"id": "D17", "step": "Build and balance the clock tree.", "evidence": "Clock network, skew, timing findings.", "when": "clocked design with CTS enabled", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
36
|
+
{"id": "D18", "step": "Global routing; repair antenna/timing.", "evidence": "Global routes and congestion reports.", "when": "always", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
37
|
+
{"id": "D19", "step": "Detail routing; check violations and opens.", "evidence": "Routed database and diagnostics.", "when": "always", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
38
|
+
{"id": "D20", "step": "Filler cells and density features.", "evidence": "Added geometry and density coverage.", "when": "process requires", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
39
|
+
{"id": "D21", "step": "Extract interconnect R/C from routed database.", "evidence": "SPEF, corner, coverage.", "when": "parasitic-aware timing required", "required": True, "entrypoints": ["run_digital_flow", "run_extraction"]},
|
|
40
|
+
{"id": "D22", "step": "Multi-corner STA with extracted parasitics.", "evidence": "Setup/hold, paths, limits.", "when": "always", "required": True, "entrypoints": ["run_digital_flow", "run_timing"]},
|
|
41
|
+
{"id": "D23", "step": "Power and IR-drop analysis.", "evidence": "Power assumptions, hotspots, limits.", "when": "required by power plan", "required": True, "entrypoints": ["run_digital_flow"]},
|
|
42
|
+
{"id": "D24", "step": "Stream GDS/LEF and model views.", "evidence": "GDS, LEF, netlists, timing models.", "when": "always", "required": True, "entrypoints": ["run_digital_flow", "generate_views"]},
|
|
43
|
+
{"id": "D25", "step": "Final foundry-deck DRC (plus XOR where configured).", "evidence": "Geometry-difference and rule reports.", "when": "DRC required for qualification", "required": True, "entrypoints": ["run_drc"]},
|
|
44
|
+
{"id": "D26", "step": "Extract layout devices; LVS vs reference.", "evidence": "Extracted circuit and LVS report.", "when": "electrical verification required", "required": True, "entrypoints": ["run_lvs"]},
|
|
45
|
+
{"id": "D27", "step": "Equivalence and final manufacturing gates.", "evidence": "Per-stage acceptance and summary.", "when": "required delivery gates", "required": True, "entrypoints": ["run_digital_flow", "run_formal"]},
|
|
46
|
+
{"id": "D28", "step": "Gate-level timing or interface SPICE sim.", "evidence": "Reset/X/timing scenarios.", "when": "design-specific requirements", "required": True, "entrypoints": ["run_hdl_test", "run_post_layout"]},
|
|
47
|
+
{"id": "D29", "step": "Chip-level density/antenna/ESD/pad rules.", "evidence": "Rule coverage and blockers.", "when": "chip-level delivery", "required": True, "entrypoints": ["run_drc", "run_lvs"]},
|
|
48
|
+
{"id": "D30", "step": "Repeat affected stages; freeze delivery.", "evidence": "Pinned bundle and unresolved limits.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
49
|
+
],
|
|
50
|
+
"analog": [
|
|
51
|
+
{"id": "A01", "step": "Define gain, bandwidth, noise, supply, load, power.", "evidence": "Measurable acceptance criteria.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
52
|
+
{"id": "A02", "step": "Select PDK devices, corners, simulator, decks.", "evidence": "Pinned device/model/deck references.", "when": "always", "required": True, "entrypoints": ["get_capabilities"]},
|
|
53
|
+
{"id": "A03", "step": "Create schematic/netlist bound to real devices.", "evidence": "Sizes, pin order, hierarchy, reference netlist.", "when": "always", "required": True, "entrypoints": ["ip_instantiate"]},
|
|
54
|
+
{"id": "A04", "step": "Check syntax, connectivity, ERC.", "evidence": "Located syntax/connectivity/ERC findings.", "when": "always", "required": True, "entrypoints": ["run_syntax", "run_connectivity", "run_erc"]},
|
|
55
|
+
{"id": "A05", "step": "Build testbenches with sources, loads, limits.", "evidence": "Versioned testbenches and measures.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
56
|
+
{"id": "A06", "step": "DC operating point and sweeps.", "evidence": "Op points, regions, convergence.", "when": "applicable modes", "required": True, "entrypoints": ["run_spice"]},
|
|
57
|
+
{"id": "A07", "step": "Frequency response and loop stability.", "evidence": "Gain, bandwidth, phase margin.", "when": "applicable AC requirements", "required": True, "entrypoints": ["run_spice"]},
|
|
58
|
+
{"id": "A08", "step": "Transient and startup checks.", "evidence": "Settling, slew, overshoot, startup.", "when": "applicable transient requirements", "required": True, "entrypoints": ["run_spice"]},
|
|
59
|
+
{"id": "A09", "step": "Noise, distortion, periodic/RF analyses.", "evidence": "Noise/distortion figures and limits.", "when": "required by spec", "required": True, "entrypoints": ["run_spice"]},
|
|
60
|
+
{"id": "A10", "step": "PVT corners and mismatch/Monte Carlo.", "evidence": "Worst corners, stats, yield estimate.", "when": "robustness plan requires", "required": True, "entrypoints": ["run_spice"]},
|
|
61
|
+
{"id": "A11", "step": "Resize/retune to pre-layout targets.", "evidence": "Accepted revision and measurements.", "when": "always", "required": True, "entrypoints": ["run_spice"]},
|
|
62
|
+
{"id": "A12", "step": "Set matching, symmetry, floorplan constraints.", "evidence": "Explicit analog physical constraints.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
63
|
+
{"id": "A13", "step": "Place PDK devices, wells, guards, dummies.", "evidence": "Device layout and pin mapping.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
64
|
+
{"id": "A14", "step": "Route signals, supplies, shields; fill.", "evidence": "Routed geometry and supply graph.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
65
|
+
{"id": "A15", "step": "Incremental DRC during layout.", "evidence": "Rule findings linked to geometry.", "when": "physical qualification", "required": True, "entrypoints": ["run_drc"]},
|
|
66
|
+
{"id": "A16", "step": "LVS vs independent schematic netlist.", "evidence": "Device identities, nets, pin maps.", "when": "physical qualification", "required": True, "entrypoints": ["run_lvs"]},
|
|
67
|
+
{"id": "A17", "step": "Extract layout parasitics.", "evidence": "PEX netlist, coverage, settings.", "when": "physical performance qualification", "required": True, "entrypoints": ["run_extraction"]},
|
|
68
|
+
{"id": "A18", "step": "Build post-layout testbench on extraction.", "evidence": "Pin order and conditions preserved.", "when": "after qualified extraction", "required": True, "entrypoints": ["project scripting"]},
|
|
69
|
+
{"id": "A19", "step": "Repeat required sims with parasitics.", "evidence": "Post-layout results and deltas.", "when": "supported analyses", "required": True, "entrypoints": ["run_post_layout"]},
|
|
70
|
+
{"id": "A20", "step": "Coupling, IR drop, thermal checks.", "evidence": "Hotspots, margins.", "when": "sensitive circuits", "required": True, "entrypoints": ["run_em", "run_thermal"]},
|
|
71
|
+
{"id": "A21", "step": "Repair layout/sizing; rerun affected gates.", "evidence": "Fresh evidence for new geometry.", "when": "required gate failure", "required": True, "entrypoints": ["run_drc", "run_lvs", "run_extraction", "run_post_layout"]},
|
|
72
|
+
{"id": "A22", "step": "Final GDS, readback, recheck.", "evidence": "Final-byte validation and evidence.", "when": "always", "required": True, "entrypoints": ["generate_views", "run_drc", "run_lvs"]},
|
|
73
|
+
{"id": "A23", "step": "Freeze macro/chip package.", "evidence": "GDS, netlists, models, reports.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
74
|
+
],
|
|
75
|
+
"photonic": [
|
|
76
|
+
{"id": "P01", "step": "Define optical/electrical targets and interfaces.", "evidence": "Loss, bandwidth, phase, delay limits.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
77
|
+
{"id": "P02", "step": "Select PDK, stack, modes, model ranges.", "evidence": "Pinned tech/model refs and gaps.", "when": "always", "required": True, "entrypoints": ["get_capabilities"]},
|
|
78
|
+
{"id": "P03", "step": "Compose intended circuit from devices.", "evidence": "Independent connectivity and params.", "when": "always", "required": True, "entrypoints": ["ip_instantiate"]},
|
|
79
|
+
{"id": "P04", "step": "Validate ports, modes, bounds, coverage.", "evidence": "Mismatch and missing-model findings.", "when": "always", "required": True, "entrypoints": ["run_connectivity", "run_syntax"]},
|
|
80
|
+
{"id": "P05", "step": "Build device geometry/mesh/ports/boundaries.", "evidence": "Reproducible physical sim model.", "when": "outside existing model validity", "required": True, "entrypoints": ["generate_views"]},
|
|
81
|
+
{"id": "P06", "step": "Solve modes/fields; check convergence.", "evidence": "Modes, S-params, convergence.", "when": "characterization required", "required": True, "entrypoints": ["run_em"]},
|
|
82
|
+
{"id": "P07", "step": "Fit and validate a compact model.", "evidence": "Versioned model with validity range.", "when": "new model needed", "required": True, "entrypoints": ["project scripting"]},
|
|
83
|
+
{"id": "P08", "step": "Frequency-domain circuit simulation.", "evidence": "Spectra and target measurements.", "when": "frequency targets apply", "required": True, "entrypoints": ["run_optical"]},
|
|
84
|
+
{"id": "P09", "step": "Dynamic/active circuit simulation.", "evidence": "Transient behavior and limits.", "when": "active/time-dependent circuit", "required": True, "entrypoints": ["run_optical"]},
|
|
85
|
+
{"id": "P10", "step": "Variation sweeps; tune topology/params.", "evidence": "Worst cases and sensitivities.", "when": "robustness plan requires", "required": True, "entrypoints": ["run_optical"]},
|
|
86
|
+
{"id": "P11", "step": "Floorplan and place device instances.", "evidence": "Placed hierarchy and port map.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
87
|
+
{"id": "P12", "step": "Route waveguides with constraints.", "evidence": "Route geometry and failures.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
88
|
+
{"id": "P13", "step": "Route heaters/supplies; vias and fill.", "evidence": "Electrical geometry and features.", "when": "active devices or process rules", "required": True, "entrypoints": ["generate_views"]},
|
|
89
|
+
{"id": "P14", "step": "Layout rules; compare intended vs extracted.", "evidence": "DRC and connectivity findings.", "when": "always", "required": True, "entrypoints": ["run_drc", "run_view_sync"]},
|
|
90
|
+
{"id": "P15", "step": "Layout-aware optical extraction.", "evidence": "Derived netlist and coverage.", "when": "layout-aware verification required", "required": True, "entrypoints": ["run_extraction"]},
|
|
91
|
+
{"id": "P16", "step": "Electrical parasitics and coupling.", "evidence": "R/C and coupling models.", "when": "active/RF/thermal structures", "required": True, "entrypoints": ["run_extraction", "run_em"]},
|
|
92
|
+
{"id": "P17", "step": "Bind extraction to calibrated models.", "evidence": "Layout-aware simulation model.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
93
|
+
{"id": "P18", "step": "Rerun circuit sims on layout model.", "evidence": "Pre/post deltas, measurements.", "when": "supported analysis modes", "required": True, "entrypoints": ["run_optical"]},
|
|
94
|
+
{"id": "P19", "step": "Crosstalk, thermal, package checks.", "evidence": "Field/temperature margins.", "when": "sensitive structures", "required": True, "entrypoints": ["run_em", "run_thermal"]},
|
|
95
|
+
{"id": "P20", "step": "Repair layout/models; repeat gates.", "evidence": "Fresh evidence for new geometry.", "when": "required gate failure", "required": True, "entrypoints": ["run_extraction", "run_optical", "run_drc"]},
|
|
96
|
+
{"id": "P21", "step": "Final dataprep, streamout, readback.", "evidence": "Final GDS, units, layers.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
97
|
+
{"id": "P22", "step": "Final DRC/connectivity recheck.", "evidence": "Final geometry acceptance.", "when": "always", "required": True, "entrypoints": ["run_drc", "run_connectivity"]},
|
|
98
|
+
{"id": "P23", "step": "Freeze photonic block/chip.", "evidence": "GDS, models, complete evidence.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
99
|
+
],
|
|
100
|
+
"mixed": [
|
|
101
|
+
{"id": "M01", "step": "Define system; partition domains.", "evidence": "System limits and contracts.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
102
|
+
{"id": "M02", "step": "Verify compatibility; plan supplies/interfaces.", "evidence": "Compatibility and supply plan.", "when": "always", "required": True, "entrypoints": ["get_capabilities"]},
|
|
103
|
+
{"id": "M03", "step": "Top reference schematic + behavioral bench.", "evidence": "Reference nets and system tests.", "when": "always", "required": True, "entrypoints": ["project scripting"]},
|
|
104
|
+
{"id": "M04", "step": "Harden blocks via their domain flows.", "evidence": "Pinned bundles and coverage.", "when": "always", "required": True, "entrypoints": ["run_digital_flow", "run_spice", "run_optical"]},
|
|
105
|
+
{"id": "M05", "step": "Import layouts; bind pins and views.", "evidence": "Consistent interfaces, hierarchy.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
106
|
+
{"id": "M06", "step": "Top-level floorplan with keepouts.", "evidence": "Floorplan and reserved areas.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
107
|
+
{"id": "M07", "step": "Connect blocks; shields, wells, taps.", "evidence": "Top geometry and connectivity.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
108
|
+
{"id": "M08", "step": "Chip structures, pads, seal, fill.", "evidence": "Deliverable boundary.", "when": "full-chip delivery", "required": True, "entrypoints": ["generate_views"]},
|
|
109
|
+
{"id": "M09", "step": "Top-level DRC, ERC, LVS.", "evidence": "Violations and mismatches.", "when": "top-level qualification", "required": True, "entrypoints": ["run_drc", "run_erc", "run_lvs"]},
|
|
110
|
+
{"id": "M10", "step": "Top-level extraction, counted once.", "evidence": "Top PEX and coverage.", "when": "physical performance required", "required": True, "entrypoints": ["run_extraction"]},
|
|
111
|
+
{"id": "M11", "step": "Top timing with real loads.", "evidence": "Chip timing and boundary constraints.", "when": "clocked digital interfaces", "required": True, "entrypoints": ["run_timing"]},
|
|
112
|
+
{"id": "M12", "step": "Post-layout mixed-signal tests.", "evidence": "System response and interfaces.", "when": "always", "required": True, "entrypoints": ["run_post_layout"]},
|
|
113
|
+
{"id": "M13", "step": "ADC transfer and dynamic metrics.", "evidence": "DNL/INL/SNR/ENOB, sample limits.", "when": "ADC design", "required": True, "entrypoints": ["run_post_layout"]},
|
|
114
|
+
{"id": "M14", "step": "System corners, coupling, thermal.", "evidence": "Worst-system margins.", "when": "system qualification plan", "required": True, "entrypoints": ["run_em", "run_thermal", "run_spice"]},
|
|
115
|
+
{"id": "M15", "step": "Repair; repeat block and top gates.", "evidence": "Updated evidence, open blockers.", "when": "gate failure or changed inputs", "required": True, "entrypoints": ["run_drc", "run_lvs", "run_extraction", "run_post_layout"]},
|
|
116
|
+
{"id": "M16", "step": "Final export, readback, archive.", "evidence": "Final hash, models, manifest.", "when": "always", "required": True, "entrypoints": ["generate_views"]},
|
|
117
|
+
],
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
# Deck join (WORKFLOW-COVERAGE, ADR-007): curated op -> deck tools.
|
|
122
|
+
#
|
|
123
|
+
# Each entry cites the Engine solver registry (composition.py
|
|
124
|
+
# Engine._solvers: operation -> {deck-tool: adapter}) plus the
|
|
125
|
+
# provision need from interfaces/setup.py SOLVER_DEPS (binaries +
|
|
126
|
+
# python probes flattened). Curated here so stage planning stays a
|
|
127
|
+
# pure function of its inputs (no imports, no I/O); freshness is
|
|
128
|
+
# pinned mechanically by tests/test_stages_decks.py against the live
|
|
129
|
+
# registry and SOLVER_DEPS, so a new solver without a DECKS entry
|
|
130
|
+
# fails loudly instead of rotting.
|
|
131
|
+
DECKS = {
|
|
132
|
+
"run_syntax": [{"tool": "slang", "needs": ["slang"]}],
|
|
133
|
+
"run_synth": [{"tool": "yosys", "needs": ["yosys"]}],
|
|
134
|
+
"run_connectivity": [{"tool": "connectgraph", "needs": []}],
|
|
135
|
+
"run_erc": [{"tool": "connectgraph", "needs": []}],
|
|
136
|
+
"run_view_sync": [{"tool": "connectgraph", "needs": []}],
|
|
137
|
+
"run_drc": [
|
|
138
|
+
{"tool": "magic", "needs": ["magic"]},
|
|
139
|
+
{"tool": "klayout", "needs": ["klayout"]},
|
|
140
|
+
],
|
|
141
|
+
"run_antenna": [{"tool": "klayout", "needs": ["klayout"]}],
|
|
142
|
+
"run_xschem": [{"tool": "xschem", "needs": ["xschem"]}],
|
|
143
|
+
"run_lvs": [{"tool": "netgen", "needs": ["netgen"]}],
|
|
144
|
+
"run_spice": [{"tool": "ngspice", "needs": ["ngspice"]}],
|
|
145
|
+
"run_post_layout": [{"tool": "ngspice", "needs": ["ngspice"]}],
|
|
146
|
+
"run_optical": [
|
|
147
|
+
{"tool": "sax", "needs": ["sax"]},
|
|
148
|
+
{"tool": "circulax", "needs": ["circulax"]},
|
|
149
|
+
],
|
|
150
|
+
"run_digital_flow": [{"tool": "librelane", "needs": ["librelane"]}],
|
|
151
|
+
"run_timing": [{"tool": "opensta", "needs": ["sta"]}],
|
|
152
|
+
"run_extraction": [{"tool": "magic", "needs": ["magic"]}],
|
|
153
|
+
"run_em": [{"tool": "meow", "needs": ["meow"]}],
|
|
154
|
+
"run_formal": [{"tool": "sby", "needs": ["sby"]}],
|
|
155
|
+
"run_hdl_test": [{"tool": "icarus", "needs": ["iverilog", "vvp"]}],
|
|
156
|
+
"run_cosim": [{"tool": "cosim", "needs": ["ngspice", "iverilog", "vvp"]}],
|
|
157
|
+
"generate_views": [{"tool": "gdsfactory", "needs": ["gdsfactory"]}],
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
_UNCOVERED_REASONS = {
|
|
161
|
+
"run_thermal": "no solver registered: run_thermal.",
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def covering_decks(entrypoint, solvers=None, operations=None):
|
|
166
|
+
"""Cite the covering decks for one stage entrypoint.
|
|
167
|
+
|
|
168
|
+
A scripted entrypoint cites itself (no backend needed). A tool
|
|
169
|
+
entrypoint with registered solvers cites one deck per tool with
|
|
170
|
+
its provision need, plus live readiness when an operations
|
|
171
|
+
mapping (as from `report_capabilities`) is given. An entrypoint
|
|
172
|
+
with no registered solver is an explicit uncovered marker with
|
|
173
|
+
its reason — never a silent gap.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
entrypoint: Stage entrypoint name to cover.
|
|
177
|
+
solvers: Operation -> deck-tool cites (tool plus needs).
|
|
178
|
+
Defaults to the curated DECKS table.
|
|
179
|
+
operations: Per-operation readiness mapping as reported by
|
|
180
|
+
`report_capabilities`; None means unprobed.
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
List of deck cites (deck, scripted, or uncovered marker).
|
|
184
|
+
"""
|
|
185
|
+
table = DECKS if solvers is None else solvers
|
|
186
|
+
if entrypoint in _SCRIPTED:
|
|
187
|
+
return [{"entrypoint": entrypoint, "kind": "scripted"}]
|
|
188
|
+
cites = table.get(entrypoint)
|
|
189
|
+
if not cites:
|
|
190
|
+
return [
|
|
191
|
+
{
|
|
192
|
+
"entrypoint": entrypoint,
|
|
193
|
+
"kind": "uncovered",
|
|
194
|
+
"reason": _UNCOVERED_REASONS.get(
|
|
195
|
+
entrypoint, f"no solver registered: {entrypoint}."
|
|
196
|
+
),
|
|
197
|
+
}
|
|
198
|
+
]
|
|
199
|
+
return [_deck_cite(entrypoint, cite, operations) for cite in cites]
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _deck_cite(entrypoint, cite, operations):
|
|
203
|
+
"""One deck cite with live readiness when probed.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
entrypoint: Stage entrypoint the deck serves.
|
|
207
|
+
cite: Deck cite with tool plus provision needs.
|
|
208
|
+
operations: Per-operation readiness mapping, or None.
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
Deck cite with readiness (ready/blocked/unprobed).
|
|
212
|
+
"""
|
|
213
|
+
deck = {
|
|
214
|
+
"entrypoint": entrypoint,
|
|
215
|
+
"kind": "deck",
|
|
216
|
+
"tool": cite["tool"],
|
|
217
|
+
"needs": list(cite["needs"]),
|
|
218
|
+
}
|
|
219
|
+
if operations is None:
|
|
220
|
+
return {**deck, "readiness": "unprobed"}
|
|
221
|
+
row = operations.get(entrypoint, {})
|
|
222
|
+
readiness = row.get("readiness", "unsupported")
|
|
223
|
+
deck["readiness"] = readiness
|
|
224
|
+
if readiness != "ready":
|
|
225
|
+
deck["reason"] = row.get(
|
|
226
|
+
"reason", f"no capability report: {entrypoint}."
|
|
227
|
+
)
|
|
228
|
+
deck["missing"] = list(row.get("missing") or [entrypoint])
|
|
229
|
+
if row.get("remedy"):
|
|
230
|
+
deck["remedy"] = row["remedy"]
|
|
231
|
+
return deck
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def flow_cover(flow, solvers=None, operations=None):
|
|
235
|
+
"""Cover every stage of a flow with its decks or gap markers.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
flow: Flow inventory to cover (digital/analog/photonic/mixed).
|
|
239
|
+
solvers: Operation -> deck-tool cites; the DECKS table when
|
|
240
|
+
omitted.
|
|
241
|
+
operations: Per-operation readiness mapping; None means
|
|
242
|
+
unprobed (deck cites without live readiness).
|
|
243
|
+
|
|
244
|
+
Returns:
|
|
245
|
+
Stage list with per-stage cover cites in stage order.
|
|
246
|
+
|
|
247
|
+
Raises:
|
|
248
|
+
ValueError: Unknown flow name.
|
|
249
|
+
"""
|
|
250
|
+
try:
|
|
251
|
+
stages = STAGES[flow]
|
|
252
|
+
except KeyError:
|
|
253
|
+
raise ValueError(f"Unknown flow: {flow}.") from None
|
|
254
|
+
covered = []
|
|
255
|
+
for stage in stages:
|
|
256
|
+
cover = []
|
|
257
|
+
for entrypoint in stage["entrypoints"]:
|
|
258
|
+
cover.extend(covering_decks(entrypoint, solvers, operations))
|
|
259
|
+
covered.append({**stage, "cover": cover})
|
|
260
|
+
return covered
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def render_lane(flow, solvers=None, operations=None):
|
|
264
|
+
"""Render one flow lane as stage -> deck cover lines.
|
|
265
|
+
|
|
266
|
+
Args:
|
|
267
|
+
flow: Flow inventory to render (digital/analog/photonic/mixed).
|
|
268
|
+
solvers: Operation -> deck-tool cites; the DECKS table when
|
|
269
|
+
omitted.
|
|
270
|
+
operations: Per-operation readiness mapping; None means
|
|
271
|
+
unprobed.
|
|
272
|
+
|
|
273
|
+
Returns:
|
|
274
|
+
Text lane render, one line per stage.
|
|
275
|
+
|
|
276
|
+
Raises:
|
|
277
|
+
ValueError: Unknown flow name.
|
|
278
|
+
"""
|
|
279
|
+
lines = []
|
|
280
|
+
for stage in flow_cover(flow, solvers, operations):
|
|
281
|
+
parts = []
|
|
282
|
+
for cite in stage["cover"]:
|
|
283
|
+
if cite["kind"] == "deck":
|
|
284
|
+
needs = ",".join(cite["needs"]) if cite["needs"] else "builtin"
|
|
285
|
+
parts.append(
|
|
286
|
+
f"{cite['entrypoint']}/{cite['tool']}"
|
|
287
|
+
f"[{cite['readiness']}:{needs}]"
|
|
288
|
+
)
|
|
289
|
+
elif cite["kind"] == "scripted":
|
|
290
|
+
parts.append(f"{cite['entrypoint']}[scripted]")
|
|
291
|
+
else:
|
|
292
|
+
parts.append(f"{cite['entrypoint']}[uncovered: {cite['reason']}]")
|
|
293
|
+
lines.append(f"{stage['id']} {stage['step']} :: {' + '.join(parts)}")
|
|
294
|
+
return "\n".join(lines) + "\n"
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def applicable_stages(flow, available_backends):
|
|
298
|
+
"""Plan a flow against installed backends.
|
|
299
|
+
|
|
300
|
+
Scripted entrypoints need no backend. A stage whose tool
|
|
301
|
+
entrypoints are all available is ready; otherwise it stays
|
|
302
|
+
required-but-blocked (never silently dropped).
|
|
303
|
+
|
|
304
|
+
Args:
|
|
305
|
+
flow: Flow inventory to plan (digital/analog/photonic/mixed).
|
|
306
|
+
available_backends: Installed backend entrypoint names.
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
Stage list with per-stage readiness (ready/blocked).
|
|
310
|
+
|
|
311
|
+
Raises:
|
|
312
|
+
ValueError: Unknown flow name.
|
|
313
|
+
"""
|
|
314
|
+
try:
|
|
315
|
+
stages = STAGES[flow]
|
|
316
|
+
except KeyError:
|
|
317
|
+
raise ValueError(f"Unknown flow: {flow}.") from None
|
|
318
|
+
available = set(available_backends)
|
|
319
|
+
planned = []
|
|
320
|
+
for stage in stages:
|
|
321
|
+
needed = [e for e in stage["entrypoints"] if e not in _SCRIPTED]
|
|
322
|
+
readiness = "ready" if all(e in available for e in needed) else "blocked"
|
|
323
|
+
planned.append({**stage, "readiness": readiness})
|
|
324
|
+
return planned
|