@tscircuit/core 0.0.1361 → 0.0.1363

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.d.ts +163 -52
  2. package/dist/index.js +154 -45
  3. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -4206,6 +4206,32 @@ var jlcMinTolerances = {
4206
4206
  min_via_pad_diameter: 0.3
4207
4207
  };
4208
4208
 
4209
+ // lib/utils/getViaSpanLayers.ts
4210
+ var getViaSpanLayers = ({
4211
+ fromLayer,
4212
+ toLayer,
4213
+ layerCount
4214
+ }) => {
4215
+ if (fromLayer === toLayer) return [fromLayer];
4216
+ const stack = ["top"];
4217
+ for (let i = 1; i <= layerCount - 2; i++) {
4218
+ stack.push(`inner${i}`);
4219
+ }
4220
+ stack.push("bottom");
4221
+ const fromIndex = stack.indexOf(fromLayer);
4222
+ const toIndex = stack.indexOf(toLayer);
4223
+ if (fromIndex === -1 || toIndex === -1) return [fromLayer, toLayer];
4224
+ return fromIndex <= toIndex ? stack.slice(fromIndex, toIndex + 1) : stack.slice(toIndex, fromIndex + 1).reverse();
4225
+ };
4226
+ var getViaBoardLayers = (layerCount) => {
4227
+ if (layerCount <= 1) return ["top"];
4228
+ return getViaSpanLayers({
4229
+ fromLayer: "top",
4230
+ toLayer: "bottom",
4231
+ layerCount
4232
+ });
4233
+ };
4234
+
4209
4235
  // lib/components/primitive-components/Trace/Trace_doInitialPcbTraceRender.ts
4210
4236
  var portToObjective = (port) => {
4211
4237
  const portPosition = port._getGlobalPcbPositionAfterLayout();
@@ -4301,10 +4327,30 @@ function Trace_doInitialPcbTraceRender(trace) {
4301
4327
  }
4302
4328
  const nets = trace._findConnectedNets().netsWithSelectors;
4303
4329
  if (ports.length === 0 && nets.length === 2) {
4304
- trace.renderError(
4305
- `Trace connects two nets, we haven't implemented a way to route this yet`
4306
- );
4307
- return;
4330
+ const [netA, netB] = nets.map(({ net }) => net);
4331
+ const netAPorts = netA.getAllConnectedPorts();
4332
+ const netBPorts = netB.getAllConnectedPorts();
4333
+ if (netAPorts.length === 0 || netBPorts.length === 0) {
4334
+ console.log(
4335
+ "Nothing to connect this net to, one of the nets is empty. TODO should emit a warning!"
4336
+ );
4337
+ return;
4338
+ }
4339
+ let closestPortPair = [netAPorts[0], netBPorts[0]];
4340
+ let closestDistance = Infinity;
4341
+ for (const netAPort of netAPorts) {
4342
+ const closestNetBPort = getClosest(netAPort, netBPorts);
4343
+ const netAPortPosition = netAPort._getGlobalPcbPositionBeforeLayout();
4344
+ const netBPortPosition = closestNetBPort._getGlobalPcbPositionBeforeLayout();
4345
+ const distance19 = Math.sqrt(
4346
+ (netAPortPosition.x - netBPortPosition.x) ** 2 + (netAPortPosition.y - netBPortPosition.y) ** 2
4347
+ );
4348
+ if (distance19 < closestDistance) {
4349
+ closestDistance = distance19;
4350
+ closestPortPair = [netAPort, closestNetBPort];
4351
+ }
4352
+ }
4353
+ ports.push(...closestPortPair);
4308
4354
  } else if (ports.length === 1 && nets.length === 1) {
4309
4355
  const port = ports[0];
4310
4356
  const portsInNet = nets[0].net.getAllConnectedPorts();
@@ -4513,19 +4559,29 @@ function Trace_doInitialPcbTraceRender(trace) {
4513
4559
  subcircuit_id: trace.getSubcircuit()?.subcircuit_id,
4514
4560
  trace_length: traceLength
4515
4561
  });
4562
+ const subcircuitConnectivityMapKey = trace.subcircuit_connectivity_map_key ?? db.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key;
4516
4563
  trace._portsRoutedOnPcb = ports;
4517
4564
  trace.pcb_trace_id = pcb_trace.pcb_trace_id;
4518
4565
  for (const point6 of mergedRoute) {
4519
4566
  if (point6.route_type === "via") {
4567
+ const fromLayer = point6.from_layer;
4568
+ const toLayer = point6.to_layer;
4520
4569
  db.pcb_via.insert({
4521
4570
  pcb_trace_id: pcb_trace.pcb_trace_id,
4522
4571
  x: point6.x,
4523
4572
  y: point6.y,
4524
4573
  hole_diameter: holeDiameter,
4525
4574
  outer_diameter: padDiameter,
4526
- layers: [point6.from_layer, point6.to_layer],
4527
- from_layer: point6.from_layer,
4528
- to_layer: point6.to_layer
4575
+ layers: getViaSpanLayers({
4576
+ fromLayer,
4577
+ toLayer,
4578
+ layerCount: subcircuit._getSubcircuitLayerCount()
4579
+ }),
4580
+ from_layer: fromLayer,
4581
+ to_layer: toLayer,
4582
+ subcircuit_id: subcircuit?.subcircuit_id ?? void 0,
4583
+ pcb_group_id: trace.getGroup()?.pcb_group_id ?? void 0,
4584
+ subcircuit_connectivity_map_key: subcircuitConnectivityMapKey
4529
4585
  });
4530
4586
  }
4531
4587
  }
@@ -4756,6 +4812,7 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4756
4812
  const { maybeFlipLayer } = trace._getPcbPrimitiveFlippedHelpers();
4757
4813
  const transform2 = trace._computePcbGlobalTransformBeforeLayout();
4758
4814
  const insertedRoutes = [];
4815
+ const subcircuitConnectivityMapKey2 = trace.subcircuit_connectivity_map_key ?? db.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key;
4759
4816
  for (const inflatedPcbTrace of inflatedPcbTraces) {
4760
4817
  const transformedRoute = inflatedPcbTrace.route.map((point6) => {
4761
4818
  if (point6.route_type === "wire") {
@@ -4809,10 +4866,11 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4809
4866
  const toLayer = maybeFlipLayer(
4810
4867
  inflatedPcbVia?.to_layer ?? point6.to_layer
4811
4868
  );
4812
- const layers = (inflatedPcbVia?.layers ?? [
4813
- point6.from_layer,
4814
- point6.to_layer
4815
- ]).map((layer2) => maybeFlipLayer(layer2));
4869
+ const layers = (inflatedPcbVia?.layers ?? getViaSpanLayers({
4870
+ fromLayer: point6.from_layer,
4871
+ toLayer: point6.to_layer,
4872
+ layerCount: subcircuit._getSubcircuitLayerCount()
4873
+ })).map((layer2) => maybeFlipLayer(layer2));
4816
4874
  db.pcb_via.insert({
4817
4875
  pcb_trace_id: pcb_trace2.pcb_trace_id,
4818
4876
  x: point6.x,
@@ -4824,7 +4882,7 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4824
4882
  to_layer: toLayer,
4825
4883
  subcircuit_id: subcircuit?.subcircuit_id ?? void 0,
4826
4884
  pcb_group_id: trace.getGroup()?.pcb_group_id ?? void 0,
4827
- subcircuit_connectivity_map_key: inflatedPcbVia?.subcircuit_connectivity_map_key,
4885
+ subcircuit_connectivity_map_key: inflatedPcbVia?.subcircuit_connectivity_map_key ?? subcircuitConnectivityMapKey2,
4828
4886
  net_is_assignable: inflatedPcbVia?.net_is_assignable,
4829
4887
  net_assigned: inflatedPcbVia?.net_assigned,
4830
4888
  is_tented: inflatedPcbVia?.is_tented
@@ -5008,19 +5066,29 @@ function Trace_doInitialPcbManualTraceRender(trace) {
5008
5066
  pcb_group_id: trace.getGroup()?.pcb_group_id ?? void 0,
5009
5067
  trace_length: traceLength
5010
5068
  });
5069
+ const subcircuitConnectivityMapKey = trace.subcircuit_connectivity_map_key ?? db.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key;
5011
5070
  const pcbStyle = trace.getInheritedMergedProperty("pcbStyle");
5012
5071
  const { holeDiameter, padDiameter } = getViaDiameterDefaults(pcbStyle);
5013
5072
  for (const point6 of route) {
5014
5073
  if (point6.route_type === "via") {
5074
+ const fromLayer = point6.from_layer;
5075
+ const toLayer = point6.to_layer;
5015
5076
  db.pcb_via.insert({
5016
5077
  pcb_trace_id: pcb_trace.pcb_trace_id,
5017
5078
  x: point6.x,
5018
5079
  y: point6.y,
5019
5080
  hole_diameter: holeDiameter,
5020
5081
  outer_diameter: padDiameter,
5021
- layers: [point6.from_layer, point6.to_layer],
5022
- from_layer: point6.from_layer,
5023
- to_layer: point6.to_layer
5082
+ layers: getViaSpanLayers({
5083
+ fromLayer,
5084
+ toLayer,
5085
+ layerCount: subcircuit._getSubcircuitLayerCount()
5086
+ }),
5087
+ from_layer: fromLayer,
5088
+ to_layer: toLayer,
5089
+ subcircuit_id: subcircuit?.subcircuit_id ?? void 0,
5090
+ pcb_group_id: trace.getGroup()?.pcb_group_id ?? void 0,
5091
+ subcircuit_connectivity_map_key: subcircuitConnectivityMapKey
5024
5092
  });
5025
5093
  }
5026
5094
  }
@@ -7241,26 +7309,6 @@ import { viaProps } from "@tscircuit/props";
7241
7309
  import {
7242
7310
  layer_ref
7243
7311
  } from "circuit-json";
7244
-
7245
- // lib/utils/getViaSpanLayers.ts
7246
- var getViaSpanLayers = ({
7247
- fromLayer,
7248
- toLayer,
7249
- layerCount
7250
- }) => {
7251
- if (fromLayer === toLayer) return [fromLayer];
7252
- const stack = ["top"];
7253
- for (let i = 1; i <= layerCount - 2; i++) {
7254
- stack.push(`inner${i}`);
7255
- }
7256
- stack.push("bottom");
7257
- const fromIndex = stack.indexOf(fromLayer);
7258
- const toIndex = stack.indexOf(toLayer);
7259
- if (fromIndex === -1 || toIndex === -1) return [fromLayer, toLayer];
7260
- return fromIndex <= toIndex ? stack.slice(fromIndex, toIndex + 1) : stack.slice(toIndex, fromIndex + 1).reverse();
7261
- };
7262
-
7263
- // lib/components/primitive-components/PcbVia.ts
7264
7312
  import { z as z6 } from "zod";
7265
7313
  var pcbViaProps = viaProps.extend({
7266
7314
  layers: z6.array(layer_ref).optional(),
@@ -22803,21 +22851,39 @@ var Group5 = class extends NormalComponent3 {
22803
22851
  continue;
22804
22852
  }
22805
22853
  if (pcb_trace.type === "pcb_trace") {
22854
+ const sourceTraceId = getSourceTraceIdForRoutedTrace({
22855
+ db,
22856
+ trace: pcb_trace,
22857
+ subcircuit_id: this.subcircuit_id
22858
+ });
22859
+ const { connection_name: inputConnectionName } = pcb_trace;
22860
+ let subcircuitConnectivityMapKey;
22861
+ if (sourceTraceId) {
22862
+ subcircuitConnectivityMapKey = db.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key;
22863
+ }
22864
+ if (!subcircuitConnectivityMapKey && inputConnectionName) {
22865
+ const sourceNet = db.source_net.get(inputConnectionName);
22866
+ if (sourceNet) {
22867
+ subcircuitConnectivityMapKey = sourceNet.subcircuit_connectivity_map_key;
22868
+ }
22869
+ }
22806
22870
  for (const point6 of pcb_trace.route) {
22807
22871
  if (point6.route_type === "via") {
22808
22872
  const routedViaPoint = point6;
22873
+ const fromLayer = point6.from_layer;
22874
+ const toLayer = point6.to_layer;
22809
22875
  db.pcb_via.insert({
22810
22876
  pcb_trace_id: pcb_trace.pcb_trace_id,
22811
22877
  x: point6.x,
22812
22878
  y: point6.y,
22813
22879
  hole_diameter: routedViaPoint.via_hole_diameter ?? routedViaPoint.hole_diameter ?? routedViaHoleDiameter,
22814
22880
  outer_diameter: routedViaPoint.via_diameter ?? routedViaPoint.outer_diameter ?? routedViaPadDiameter,
22815
- layers: [
22816
- point6.from_layer,
22817
- point6.to_layer
22818
- ],
22819
- from_layer: point6.from_layer,
22820
- to_layer: point6.to_layer
22881
+ layers: getViaBoardLayers(this._getSubcircuitLayerCount()),
22882
+ from_layer: fromLayer,
22883
+ to_layer: toLayer,
22884
+ subcircuit_id: this.subcircuit_id,
22885
+ pcb_group_id: this.pcb_group_id ?? void 0,
22886
+ subcircuit_connectivity_map_key: subcircuitConnectivityMapKey
22821
22887
  });
22822
22888
  }
22823
22889
  }
@@ -24240,7 +24306,7 @@ import { identity as identity5 } from "transformation-matrix";
24240
24306
  var package_default = {
24241
24307
  name: "@tscircuit/core",
24242
24308
  type: "module",
24243
- version: "0.0.1360",
24309
+ version: "0.0.1362",
24244
24310
  types: "dist/index.d.ts",
24245
24311
  main: "dist/index.js",
24246
24312
  module: "dist/index.js",
@@ -24277,7 +24343,7 @@ var package_default = {
24277
24343
  "@tscircuit/checks": "0.0.138",
24278
24344
  "@tscircuit/circuit-json-util": "^0.0.96",
24279
24345
  "@tscircuit/common": "^0.0.20",
24280
- "@tscircuit/copper-pour-solver": "^0.0.34",
24346
+ "@tscircuit/copper-pour-solver": "0.0.35",
24281
24347
  "@tscircuit/footprinter": "^0.0.357",
24282
24348
  "@tscircuit/image-utils": "^0.0.8",
24283
24349
  "@tscircuit/infer-cable-insertion-point": "^0.0.2",
@@ -24288,11 +24354,11 @@ var package_default = {
24288
24354
  "@tscircuit/matchpack": "^0.0.29",
24289
24355
  "@tscircuit/math-utils": "^0.0.36",
24290
24356
  "@tscircuit/miniflex": "^0.0.4",
24291
- "@tscircuit/props": "^0.0.555",
24292
24357
  "@tscircuit/ngspice-spice-engine": "^0.0.18",
24358
+ "@tscircuit/props": "^0.0.558",
24293
24359
  "@tscircuit/schematic-match-adapt": "^0.0.18",
24294
- "@tscircuit/solver-utils": "^0.0.16",
24295
24360
  "@tscircuit/schematic-trace-solver": "^0.0.72",
24361
+ "@tscircuit/solver-utils": "^0.0.16",
24296
24362
  "@tscircuit/soup-util": "^0.0.41",
24297
24363
  "@types/bun": "^1.2.16",
24298
24364
  "@types/debug": "^4.1.12",
@@ -25333,6 +25399,47 @@ var Subcircuit = class extends Group5 {
25333
25399
  doInitialRenderIsolatedSubcircuits() {
25334
25400
  Subcircuit_doInitialRenderIsolatedSubcircuits(this);
25335
25401
  }
25402
+ doInitialCreateNetsFromProps() {
25403
+ super.doInitialCreateNetsFromProps();
25404
+ this._createTracesForExposedNets();
25405
+ }
25406
+ _createTracesForExposedNets() {
25407
+ const exposedNets = this._getNetNamesToExpose();
25408
+ if (!exposedNets?.length) return;
25409
+ const parentSubcircuit = this.parent?.getSubcircuit?.();
25410
+ if (!parentSubcircuit) return;
25411
+ if (!this.name) return;
25412
+ for (const exposedNetName of exposedNets) {
25413
+ const netName = normalizeExposedNetName(exposedNetName);
25414
+ const parentNetSelector = `> net.${netName}`;
25415
+ const childNetSelector = `.${this.name} > net.${netName}`;
25416
+ const traceName = `exposed_net.${netName}`;
25417
+ const parentHasDirectNet = parentSubcircuit.children.some(
25418
+ (child) => child instanceof Net && child._parsedProps.name === netName
25419
+ );
25420
+ if (!parentHasDirectNet) {
25421
+ parentSubcircuit.add(new Net({ name: netName }));
25422
+ }
25423
+ const existingTrace = parentSubcircuit.children.find(
25424
+ (child) => child instanceof Trace3 && child._parsedProps.name === traceName
25425
+ );
25426
+ if (existingTrace) continue;
25427
+ parentSubcircuit.add(
25428
+ new Trace3({
25429
+ name: traceName,
25430
+ from: childNetSelector,
25431
+ to: parentNetSelector,
25432
+ displayName: netName
25433
+ })
25434
+ );
25435
+ }
25436
+ }
25437
+ _getNetNamesToExpose() {
25438
+ const explicitExposedNets = this._parsedProps.exposedNets ?? [];
25439
+ if (!this._parsedProps.exposeNets) return explicitExposedNets;
25440
+ const childNetNames = this.selectAll("net").filter((net) => net instanceof Net && net.getSubcircuit() === this).map((net) => net._parsedProps.name);
25441
+ return Array.from(/* @__PURE__ */ new Set([...explicitExposedNets, ...childNetNames]));
25442
+ }
25336
25443
  /**
25337
25444
  * During this phase, we inflate the subcircuit circuit json into class
25338
25445
  * instances
@@ -25361,6 +25468,7 @@ var Subcircuit = class extends Group5 {
25361
25468
  inflateCircuitJson(this, circuitJson, children);
25362
25469
  }
25363
25470
  };
25471
+ var normalizeExposedNetName = (netName) => netName.startsWith("net.") ? netName.slice("net.".length) : netName;
25364
25472
 
25365
25473
  // lib/components/normal-components/MountedBoard.ts
25366
25474
  var MountedBoard = class extends Subcircuit {
@@ -29153,6 +29261,7 @@ var CopperPour = class extends PrimitiveComponent2 {
29153
29261
  const clearance = props.clearance ?? 0.2;
29154
29262
  const inputProblem = convertCircuitJsonToInputProblem(circuitJson, {
29155
29263
  layer: props.layer,
29264
+ subcircuit_id: subcircuit?.subcircuit_id ?? void 0,
29156
29265
  source_net_id: net.source_net_id,
29157
29266
  pad_margin: props.padMargin ?? clearance,
29158
29267
  trace_margin: props.traceMargin ?? clearance,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.1361",
4
+ "version": "0.0.1363",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -38,7 +38,7 @@
38
38
  "@tscircuit/checks": "0.0.138",
39
39
  "@tscircuit/circuit-json-util": "^0.0.96",
40
40
  "@tscircuit/common": "^0.0.20",
41
- "@tscircuit/copper-pour-solver": "^0.0.34",
41
+ "@tscircuit/copper-pour-solver": "0.0.35",
42
42
  "@tscircuit/footprinter": "^0.0.357",
43
43
  "@tscircuit/image-utils": "^0.0.8",
44
44
  "@tscircuit/infer-cable-insertion-point": "^0.0.2",
@@ -49,11 +49,11 @@
49
49
  "@tscircuit/matchpack": "^0.0.29",
50
50
  "@tscircuit/math-utils": "^0.0.36",
51
51
  "@tscircuit/miniflex": "^0.0.4",
52
- "@tscircuit/props": "^0.0.555",
53
52
  "@tscircuit/ngspice-spice-engine": "^0.0.18",
53
+ "@tscircuit/props": "^0.0.558",
54
54
  "@tscircuit/schematic-match-adapt": "^0.0.18",
55
- "@tscircuit/solver-utils": "^0.0.16",
56
55
  "@tscircuit/schematic-trace-solver": "^0.0.72",
56
+ "@tscircuit/solver-utils": "^0.0.16",
57
57
  "@tscircuit/soup-util": "^0.0.41",
58
58
  "@types/bun": "^1.2.16",
59
59
  "@types/debug": "^4.1.12",