Add Domains and Power rails views for functional groups.

Sidebar tabs show routing-first topology from placement_plan/functional_groups, with IC groups and satellite roles highlighted per domain and per supply rail.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-13 17:17:16 +02:00
co-authored by Cursor
parent e124ac2de7
commit fc11df59fc
10 changed files with 553 additions and 48 deletions
+2 -18
View File
@@ -21,6 +21,7 @@ import type {
LcscPayload,
NetlistPreviewDesignator,
PauseCheckpoint,
PlacementPlan,
Project,
SkippedComponent,
ValidationReport,
@@ -608,24 +609,7 @@ export function placementEventsUrl(projectId: string): string {
return `${BASE}/api/pipeline/${projectId}/placement/events`;
}
export async function fetchPlacementPlan(projectId: string): Promise<{
objective?: string;
domains: Array<{
domain_id: string;
power_nets: string[];
ic_refs: string[];
assemble_order: string[];
}>;
groups: Array<{
ref: string;
mpn?: string | null;
component_subtype?: string | null;
rank?: number;
satellites: Array<{ ref: string; role_hint?: string; hop?: number }>;
layout_rules?: unknown[];
assemble_order?: string[];
}>;
}> {
export async function fetchPlacementPlan(projectId: string): Promise<PlacementPlan> {
const res = await authFetch(`${BASE}/api/pipeline/${projectId}/placement/plan`);
if (!res.ok) {
const err = await res.json().catch(() => ({ detail: "Placement plan not found" }));
+45
View File
@@ -285,6 +285,51 @@ export interface Project {
placementState?: Record<string, unknown> | null;
}
export type RoleHint =
| "decoupling"
| "bulk"
| "load_cap"
| "filter"
| "pullup"
| "series"
| "divider"
| "bridge"
| "crystal"
| "other";
export interface PlacementSatellite {
ref: string;
component_type?: string;
component_subtype?: string | null;
nets?: string[];
hop?: number;
role_hint?: RoleHint;
}
export interface PlacementIcGroup {
ref: string;
mpn?: string | null;
component_subtype?: string | null;
rank?: number;
nets?: string[];
satellites: PlacementSatellite[];
layout_rules?: unknown[];
assemble_order?: string[];
}
export interface PlacementDomain {
domain_id: string;
power_nets: string[];
ic_refs: string[];
assemble_order: string[];
}
export interface PlacementPlan {
objective?: string;
domains: PlacementDomain[];
groups: PlacementIcGroup[];
}
// One entry per EDIF sub-design (`&NNNN` ID prefix). Returned by the upload
// endpoint and the subdesigns inspection endpoint; consumed by the wizard's
// sub-design picker step.