routing link crossover violation added

This commit is contained in:
2026-05-29 23:47:26 +08:00
parent 80d7514740
commit 2d9b2b0983
5 changed files with 285 additions and 2 deletions
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 262 KiB

@@ -0,0 +1,99 @@
# =============================================
# mxPIC Cell/Project Definition File
# =============================================
schema_version: "2.0.0"
kind: cell
coordinate_system: gds_y_up
canvas_size:
width: 5000
height: 5000
project: mxpic_project_1
name: mxpic_project_1
type: project
version: "1.0.0"
# 1. External Ports (How this cell connects to the outside world)
ports: []
# 2. Instances (The sub-components dropped onto this canvas)
instances:
MMI_1:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
x: 476.0
y: -2453.2
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length:
MMI_2:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
x: 723.1
y: -2241.8
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length:
MMI_3:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
x: 438.9
y: -2230.2
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length:
MMI_4:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
x: 750.9
y: -2468.7
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length:
elements:
anchor_1:
type: anchor
x: 421.9
y: -2624.7
angle: 0.0
layer: WG_CORE
width: 0.5
description: ""
# 3. Bundles (Grouped links for multi-bus/parallel routing)
bundles:
output_bus:
routing_type: euler_bend
links:
- from: MMI_2:a1
to: MMI_1:b1
xsection: strip
family: optical
width: 0.45
radius: 10
routing_type: euler_bend
- from: anchor_1:right
to: MMI_4:a1
xsection: strip
family: optical
width: 0.45
radius: 10
routing_type: euler_bend
- from: anchor_1:left
to: MMI_3:a1
xsection: strip
family: optical
width: 0.45
radius: 10
routing_type: euler_bend
Binary file not shown.
+9 -1
View File
@@ -5181,13 +5181,21 @@
style: view.style, style: view.style,
data: { route } data: { route }
}; };
const nodeMap = Object.fromEntries(activePage.nodes.map(node => [node.id, node]));
const conflict = findSameTypeRouteCrossing(candidate, activePage.edges, nodeMap, technologyManifest);
if (conflict) {
const source = nodeMap[conflict.conflictEdge.source]?.data?.componentDisplayName || conflict.conflictEdge.source;
const target = nodeMap[conflict.conflictEdge.target]?.data?.componentDisplayName || conflict.conflictEdge.target;
addLog(`Connection rejected: ${route.xsection} route crosses ${source} to ${target}.`);
return;
}
setPages(prev => prev.map(p => ( setPages(prev => prev.map(p => (
p.id === activePageId p.id === activePageId
? { ...p, edges: addEdge(candidate, p.edges) } ? { ...p, edges: addEdge(candidate, p.edges) }
: p : p
))); )));
addLog(`Connected ${connection.sourceHandle} to ${connection.targetHandle}.`); addLog(`Connected ${connection.sourceHandle} to ${connection.targetHandle}.`);
}, [activePageId, activePage, rulerMode, currentLinkRoute, addLog]); }, [activePageId, activePage, rulerMode, currentLinkRoute, technologyManifest, addLog]);
const handleRouteEdgeMouseDown = useCallback((event) => { const handleRouteEdgeMouseDown = useCallback((event) => {
if (rulerMode) return false; if (rulerMode) return false;
+3 -1
View File
@@ -92,9 +92,11 @@ assert(
canvasHtml.includes('onConnect={handleBasicConnection}') && canvasHtml.includes('onConnect={handleBasicConnection}') &&
canvasHtml.includes('nodesConnectable={true}') && canvasHtml.includes('nodesConnectable={true}') &&
canvasHtml.includes('connectionMode="loose"') && canvasHtml.includes('connectionMode="loose"') &&
canvasHtml.includes('const conflict = findSameTypeRouteCrossing(candidate, activePage.edges, nodeMap, technologyManifest);') &&
canvasHtml.includes('Connection rejected:') &&
canvasHtml.includes('data: { route }') && canvasHtml.includes('data: { route }') &&
canvasHtml.includes('addEdge(candidate, p.edges)'), canvasHtml.includes('addEdge(candidate, p.edges)'),
'canvas should use React Flow native pin-to-pin connections for new links' 'canvas should use React Flow native pin-to-pin connections and reject same-xsection crossings for new links'
); );
assert( assert(
!canvasHtml.includes('linkDraft') && !canvasHtml.includes('linkDraft') &&