rushabhcodes/ESP32-E-Reader

A compact ESP32-C3 e-reader PCB integrating LiPo charging/protection, USB-C, 3.3 V regulation, e-paper display bias generation, microSD storage, and tactile controls.

Version
1.0.85
License
unset
Stars
3

routing-output.ts

import type { SimpleRouteJson, SimplifiedPcbTrace } from "tscircuit";

/** Discard a disconnected solver seed only when a complete replacement exists.
 * Pipeline9 can return both an inner-layer seed and its route with endpoint vias.
 * Keeping the seed creates floating copper and bypasses the connector keepout.
 */
export function removeSupersededRoutingSeeds(
  input: SimpleRouteJson,
  traces: SimplifiedPcbTrace[],
) {
  const near = (a: { x: number; y: number }, b: { x: number; y: number }) =>
    Math.hypot(a.x - b.x, a.y - b.y) < 1e-5;
  const complete = (trace: SimplifiedPcbTrace) => {
    const connection = input.connections.find(c => c.name === trace.connection_name);
    if (connection?.pointsToConnect.length !== 2) return undefined;
    if (near(connection.pointsToConnect[0], connection.pointsToConnect[1])) return undefined;
    const wires = trace.route.filter(p => p.route_type === "wire");
    if (wires.length < 2) return false;
    const terminals = [wires[0], wires[wires.length - 1]].map(wire =>
      connection.pointsToConnect.findIndex(point => near(point, wire)));
    if (terminals.includes(-1) || terminals[0] === terminals[1]) return false;
    let layer = wires[0].layer;
    if (trace.route[0].route_type !== "wire") return undefined;
    let previous: Extract<SimplifiedPcbTrace["route"][number], { route_type: "wire" | "via" }> = wires[0];
    for (const point of trace.route) {
      if (point.route_type === "via") {
        if (!near(previous, point) || point.from_layer !== layer) return false;
        layer = point.to_layer;
      } else if (point.route_type === "wire") {
        if (point.layer !== layer || (previous.route_type === "via" && !near(previous, point))) return false;
      } else return undefined;
      previous = point;
    }
    return [wires[0], wires[wires.length - 1]].every(wire => {
      const point = connection.pointsToConnect.find(p => near(p, wire));
      if (!point) return false;
      const layers = point.layers ?? [point.layer];
      return layers.includes(wire.layer) || trace.route.some(p =>
        p.route_type === "via" && near(p, wire) &&
        (layers.includes(p.from_layer) || layers.includes(p.to_layer)));
    });
  };
  const sameTerminals = (a: SimplifiedPcbTrace, b: SimplifiedPcbTrace) => {
    const aPorts = a.connectsTo ?? [], bPorts = b.connectsTo ?? [];
    return a.connection_name === b.connection_name && aPorts.length === 2 &&
      bPorts.length === 2 && aPorts.every(id => bPorts.includes(id));
  };
  return traces.filter(trace => complete(trace) !== false ||
    !traces.some(replacement => replacement !== trace &&
      sameTerminals(trace, replacement) && complete(replacement) === true));
}