Fix solver correctness and input-validation issues from code review
- Refuse the uniform contact model when the fills form multiple disconnected copper groups that each touch both terminals: the prescribed injection split is ill-posed and the grounded system was singular, silently returning garbage (e.g. negative gigaohms). connected_restrict now reports the component count; a power-balance backstop (SolverError) catches any other inconsistent solve. - Connect via/pad barrels to the nearest fill copper within the pad footprint (+1 cell) instead of only the exact center cell, so thermal-relief spokes still stitch layers; barrels that reach fill on fewer than two layers are warned about. ViaLink gains pad_nm (extracted from the padstack, JSON-roundtripped). - Validate dialog input on OK (layers, current > 0, cell > 0, parseable frequency, extra Cu >= 0) with an inline error instead of silently substituting defaults; parse_frequency raises on garbage; pipeline rejects i_test <= 0; choose_cell_size rejects non-positive overrides. - Warn when a contact part is dropped by the connectivity restriction; floor instead of truncate in cell_of; correct the uniform-model summary line; drop an unused variable; refresh plugin.json wording. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -54,8 +54,8 @@ class RasterStack:
|
||||
def cell_of(self, x_nm: float, y_nm: float) -> tuple[int, int] | None:
|
||||
"""(i, j) of the cell containing the point, or None if outside."""
|
||||
ny, nx = self.shape2d
|
||||
j = int((x_nm - self.x0_nm) / self.h_nm)
|
||||
i = int((y_nm - self.y0_nm) / self.h_nm)
|
||||
j = math.floor((x_nm - self.x0_nm) / self.h_nm)
|
||||
i = math.floor((y_nm - self.y0_nm) / self.h_nm)
|
||||
if 0 <= i < ny and 0 <= j < nx:
|
||||
return i, j
|
||||
return None
|
||||
@@ -81,6 +81,11 @@ def choose_cell_size(bbox_nm: tuple[int, int, int, int], nlayers: int) -> float:
|
||||
raise GridSizeError("Copper geometry has a degenerate bounding box.")
|
||||
|
||||
if config.CELL_UM_OVERRIDE is not None:
|
||||
if config.CELL_UM_OVERRIDE <= 0:
|
||||
raise GridSizeError(
|
||||
f"Cell size must be positive "
|
||||
f"(got {config.CELL_UM_OVERRIDE:g} um)."
|
||||
)
|
||||
h = config.CELL_UM_OVERRIDE * 1000.0
|
||||
else:
|
||||
h = math.sqrt(w * ht * nlayers / config.TARGET_CELLS)
|
||||
|
||||
Reference in New Issue
Block a user