上传文件至「mxpic_router」

This commit is contained in:
2026-06-03 02:04:10 +00:00
parent eb45d2f040
commit 5ba7b66e9e
+22 -4
View File
@@ -71,16 +71,17 @@ def _build_cell(spec: CellSpec, built_cells: dict, pdk_root: str, prefer_full_gd
pin_map = {} pin_map = {}
with nd.Cell(name=spec.name) as top: with nd.Cell(name=spec.name) as top:
for instance_name, instance in spec.instances.items(): for instance_name, instance in spec.instances.items():
layout_rotation = _layout_rotation(instance.rotation)
if _is_basic_component(instance.component): if _is_basic_component(instance.component):
basic_cell = _build_basic_component(instance, nd) basic_cell = _build_basic_component(instance, nd)
placed = basic_cell.put(instance.x, instance.y, instance.rotation, flip=instance.flip, flop=instance.flop) placed = basic_cell.put(instance.x, instance.y, layout_rotation, flip=instance.flip, flop=instance.flop)
for pin_name in getattr(placed, "pin", {}): for pin_name in getattr(placed, "pin", {}):
if pin_name != "org": if pin_name != "org":
pin_map[(instance_name, pin_name)] = placed.pin[pin_name] pin_map[(instance_name, pin_name)] = placed.pin[pin_name]
continue continue
if instance.component in built_cells: if instance.component in built_cells:
placed = built_cells[instance.component].put(instance.x, instance.y, instance.rotation, flip=instance.flip, flop=instance.flop) placed = built_cells[instance.component].put(instance.x, instance.y, layout_rotation, flip=instance.flip, flop=instance.flop)
for pin_name in getattr(placed, "pin", {}): for pin_name in getattr(placed, "pin", {}):
if pin_name != "org": if pin_name != "org":
pin_map[(instance_name, pin_name)] = placed.pin[pin_name] pin_map[(instance_name, pin_name)] = placed.pin[pin_name]
@@ -91,7 +92,7 @@ def _build_cell(spec: CellSpec, built_cells: dict, pdk_root: str, prefer_full_gd
warnings.append(f"Missing GDS for {instance_name}: {instance.component}") warnings.append(f"Missing GDS for {instance_name}: {instance.component}")
continue continue
loaded = nd.load_gds(asset["gds_path"]) loaded = nd.load_gds(asset["gds_path"])
loaded.put(instance.x, instance.y, instance.rotation, flip=instance.flip, flop=instance.flop) loaded.put(instance.x, instance.y, layout_rotation, flip=instance.flip, flop=instance.flop)
_register_metadata_pins(pin_map, instance_name, instance, asset.get("metadata") or {}, nd, pdk_root) _register_metadata_pins(pin_map, instance_name, instance, asset.get("metadata") or {}, nd, pdk_root)
for pin_name, pin in spec.pins.items(): for pin_name, pin in spec.pins.items():
@@ -227,6 +228,7 @@ def _safe_cell_name(value: str) -> str:
def _register_metadata_pins(pin_map, instance_name, instance, metadata: dict, nd, pdk_root: str) -> None: def _register_metadata_pins(pin_map, instance_name, instance, metadata: dict, nd, pdk_root: str) -> None:
layout_rotation = _layout_rotation(instance.rotation)
for pin_name, pin in _metadata_pins(metadata, pdk_root).items(): for pin_name, pin in _metadata_pins(metadata, pdk_root).items():
x, y, angle = _transform_port( x, y, angle = _transform_port(
_safe_float(pin.get("x"), 0.0), _safe_float(pin.get("x"), 0.0),
@@ -234,7 +236,7 @@ def _register_metadata_pins(pin_map, instance_name, instance, metadata: dict, nd
_safe_float(pin.get("a", pin.get("angle")), 0.0), _safe_float(pin.get("a", pin.get("angle")), 0.0),
instance.x, instance.x,
instance.y, instance.y,
instance.rotation, layout_rotation,
instance.flip, instance.flip,
instance.flop, instance.flop,
) )
@@ -474,6 +476,8 @@ def _route_method_name_for_pins(pin1, pin2) -> str:
delta = (angle2 - angle1) % 360 delta = (angle2 - angle1) % 360
if delta <= 1e-6 or abs(delta - 360) <= 1e-6: if delta <= 1e-6 or abs(delta - 360) <= 1e-6:
return "ubend_p2p" return "ubend_p2p"
if abs(delta - 90) <= 1e-6 or abs(delta - 270) <= 1e-6:
return "strt_bend_strt_p2p"
if 120 < delta < 240: if 120 < delta < 240:
return "sbend_p2p" return "sbend_p2p"
return "bend_p2p" return "bend_p2p"
@@ -562,6 +566,10 @@ def _transform_port(px: float, py: float, pa: float, ix: float, iy: float, rotat
return ix + px * c - py * s, iy + px * s + py * c, (pa + rotation) % 360 return ix + px * c - py * s, iy + px * s + py * c, (pa + rotation) % 360
def _layout_rotation(eda_rotation: float) -> float:
return -(_safe_float(eda_rotation, 0.0) or 0.0)
def _safe_float(value, default=0.0): def _safe_float(value, default=0.0):
if value is None: if value is None:
return default return default
@@ -620,6 +628,16 @@ class _NazcaInterconnectRoute:
arrow=arrow, arrow=arrow,
) )
def strt_bend_strt_p2p(self, pin1=None, pin2=None, width=None, radius=None, xs=None, arrow=True, **kwargs):
return self._interconnect.strt_bend_strt_p2p(
pin1=pin1,
pin2=pin2,
width=self._route_width(width),
radius=self._route_radius(radius),
xs=self._route_xs(xs),
arrow=arrow,
)
def bend_p2p(self, pin1=None, pin2=None, width=None, radius=None, xs=None, arrow=True, **kwargs): def bend_p2p(self, pin1=None, pin2=None, width=None, radius=None, xs=None, arrow=True, **kwargs):
route_method = getattr(self._interconnect, "bend_strt_bend_p2p", None) route_method = getattr(self._interconnect, "bend_strt_bend_p2p", None)
if route_method is None: if route_method is None: