Routing problem for multi-pin port and anchors are debugged

This commit is contained in:
2026-05-31 22:16:44 +08:00
parent 9b4e8da796
commit ce7f6e95c4
36 changed files with 2470 additions and 676 deletions
+26 -7
View File
@@ -90,22 +90,41 @@ assert(
gdsBuilderPy.includes('_cells_have_links') && gdsBuilderPy.includes('Routed Build GDS requires mxpic_router'),
'Build GDS should not silently fall back to unrouted gdstk when links are present'
);
assert(
gdsBuilderPy.includes('_cells_have_elements') &&
gdsBuilderPy.includes('Build GDS with Port/Anchor elements requires Nazca') &&
gdsBuilderPy.indexOf('if _cells_have_elements(cells):') < gdsBuilderPy.indexOf('return _build_with_gdstk'),
'Build GDS should route layouts with Port/Anchor elements through Nazca so element pins survive as cell metadata'
);
assert(
gdsBuilderPy.includes('_build_nazca_element_cells') &&
gdsBuilderPy.includes('_build_nazca_element_cell') &&
gdsBuilderPy.includes('element.get("pin_number"') &&
gdsBuilderPy.includes('_element_pin_names') &&
gdsBuilderPy.includes('nd.Pin(pin_name, width=width).put(0.0, y, 180.0)') &&
gdsBuilderPy.includes('nd.Pin(anchor_pin_names[index * 2], width=width).put(0.0, y, 180.0)') &&
gdsBuilderPy.includes('nd.Pin(anchor_pin_names[index * 2 + 1], width=width).put(0.0, y, 0.0)') &&
gdsBuilderPy.includes('element_cell.put(x, y, rotation)'),
'Nazca fallback should model Port and Anchor objects as placed element cells with named local nd.Pin definitions'
);
const routerDir = path.resolve(root, '..', 'mxpic_router', 'mxpic_router');
if (fs.existsSync(routerDir)) {
const routerLoaderPy = fs.readFileSync(path.join(routerDir, 'eda_loader.py'), 'utf8');
const routerBuilderPy = fs.readFileSync(path.join(routerDir, 'builder.py'), 'utf8');
assert(
routerLoaderPy.includes('port_number: int = 1') &&
routerLoaderPy.includes('pins: Dict[str, PinSpec]') &&
routerLoaderPy.includes('pin_number') &&
routerLoaderPy.includes('pitch: float = 10.0') &&
routerLoaderPy.includes('port_number=_int(element.get("port_number"'),
'mxpic_router loader should parse multi-port anchor metadata from exported elements'
routerLoaderPy.includes('pins=_pins(element.get("pins"))'),
'mxpic_router loader should parse pins-only layout metadata from exported elements'
);
assert(
routerBuilderPy.includes('for index in range(port_number):') &&
routerBuilderPy.includes('a{index + 1}') &&
routerBuilderPy.includes('b{index + 1}'),
'mxpic_router builder should register aN/bN pins for multi-port anchors'
routerBuilderPy.includes('_port_element_pin_entries') &&
routerBuilderPy.includes('_anchor_element_pin_entries') &&
routerBuilderPy.includes('_metadata_pins') &&
routerBuilderPy.includes('link.src_pin'),
'mxpic_router builder should register named element pins and route through pin endpoints'
);
}