diff --git a/src/freeroute/route/fanout.py b/src/freeroute/route/fanout.py index 4821241..2ca934a 100644 --- a/src/freeroute/route/fanout.py +++ b/src/freeroute/route/fanout.py @@ -57,6 +57,12 @@ def plan_fanout(board: BasicBoard, rules: FanoutRules) -> list: for z in board.get_conduction_areas(): if z.net_nos and not board.layer_structure.arr[z.layer].is_signal: planes.setdefault(z.net_nos[0], []).append(z) + # copper pours on the routing layers, by net: a pad inside one is joined + # by the fill, and a stub there would take the room its thermal spokes need + pours: dict[int, list] = {} + for z in board.get_conduction_areas(): + if z.net_nos and board.layer_structure.arr[z.layer].is_signal: + pours.setdefault(z.net_nos[0], []).append(z) placed = _Placed(board, rules) by_net: dict[int, list[Pin]] = {} for pin in board.get_pins(): @@ -73,6 +79,9 @@ def plan_fanout(board: BasicBoard, rules: FanoutRules) -> list: if net is None: continue layer = next(layer for layer in pin.layers if layer in rules.signal_layers) + if any(z.layer == layer and z.polygon is not None and z.polygon.contains(pin.location) + for z in pours.get(net, [])): + continue # the pour joins it direction = _outward(pin.location, centre) reach = _pad_reach(pin, direction) + rules.clearance + half + rules.trace_width end = _step(pin.location, direction, reach)