@tscircuit/core 0.0.1360 → 0.0.1362

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 +156 -52
  2. package/dist/index.js +123 -43
  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();
@@ -4513,19 +4539,29 @@ function Trace_doInitialPcbTraceRender(trace) {
4513
4539
  subcircuit_id: trace.getSubcircuit()?.subcircuit_id,
4514
4540
  trace_length: traceLength
4515
4541
  });
4542
+ const subcircuitConnectivityMapKey = trace.subcircuit_connectivity_map_key ?? db.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key;
4516
4543
  trace._portsRoutedOnPcb = ports;
4517
4544
  trace.pcb_trace_id = pcb_trace.pcb_trace_id;
4518
4545
  for (const point6 of mergedRoute) {
4519
4546
  if (point6.route_type === "via") {
4547
+ const fromLayer = point6.from_layer;
4548
+ const toLayer = point6.to_layer;
4520
4549
  db.pcb_via.insert({
4521
4550
  pcb_trace_id: pcb_trace.pcb_trace_id,
4522
4551
  x: point6.x,
4523
4552
  y: point6.y,
4524
4553
  hole_diameter: holeDiameter,
4525
4554
  outer_diameter: padDiameter,
4526
- layers: [point6.from_layer, point6.to_layer],
4527
- from_layer: point6.from_layer,
4528
- to_layer: point6.to_layer
4555
+ layers: getViaSpanLayers({
4556
+ fromLayer,
4557
+ toLayer,
4558
+ layerCount: subcircuit._getSubcircuitLayerCount()
4559
+ }),
4560
+ from_layer: fromLayer,
4561
+ to_layer: toLayer,
4562
+ subcircuit_id: subcircuit?.subcircuit_id ?? void 0,
4563
+ pcb_group_id: trace.getGroup()?.pcb_group_id ?? void 0,
4564
+ subcircuit_connectivity_map_key: subcircuitConnectivityMapKey
4529
4565
  });
4530
4566
  }
4531
4567
  }
@@ -4756,6 +4792,7 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4756
4792
  const { maybeFlipLayer } = trace._getPcbPrimitiveFlippedHelpers();
4757
4793
  const transform2 = trace._computePcbGlobalTransformBeforeLayout();
4758
4794
  const insertedRoutes = [];
4795
+ const subcircuitConnectivityMapKey2 = trace.subcircuit_connectivity_map_key ?? db.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key;
4759
4796
  for (const inflatedPcbTrace of inflatedPcbTraces) {
4760
4797
  const transformedRoute = inflatedPcbTrace.route.map((point6) => {
4761
4798
  if (point6.route_type === "wire") {
@@ -4809,10 +4846,11 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4809
4846
  const toLayer = maybeFlipLayer(
4810
4847
  inflatedPcbVia?.to_layer ?? point6.to_layer
4811
4848
  );
4812
- const layers = (inflatedPcbVia?.layers ?? [
4813
- point6.from_layer,
4814
- point6.to_layer
4815
- ]).map((layer2) => maybeFlipLayer(layer2));
4849
+ const layers = (inflatedPcbVia?.layers ?? getViaSpanLayers({
4850
+ fromLayer: point6.from_layer,
4851
+ toLayer: point6.to_layer,
4852
+ layerCount: subcircuit._getSubcircuitLayerCount()
4853
+ })).map((layer2) => maybeFlipLayer(layer2));
4816
4854
  db.pcb_via.insert({
4817
4855
  pcb_trace_id: pcb_trace2.pcb_trace_id,
4818
4856
  x: point6.x,
@@ -4824,7 +4862,7 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4824
4862
  to_layer: toLayer,
4825
4863
  subcircuit_id: subcircuit?.subcircuit_id ?? void 0,
4826
4864
  pcb_group_id: trace.getGroup()?.pcb_group_id ?? void 0,
4827
- subcircuit_connectivity_map_key: inflatedPcbVia?.subcircuit_connectivity_map_key,
4865
+ subcircuit_connectivity_map_key: inflatedPcbVia?.subcircuit_connectivity_map_key ?? subcircuitConnectivityMapKey2,
4828
4866
  net_is_assignable: inflatedPcbVia?.net_is_assignable,
4829
4867
  net_assigned: inflatedPcbVia?.net_assigned,
4830
4868
  is_tented: inflatedPcbVia?.is_tented
@@ -5008,19 +5046,29 @@ function Trace_doInitialPcbManualTraceRender(trace) {
5008
5046
  pcb_group_id: trace.getGroup()?.pcb_group_id ?? void 0,
5009
5047
  trace_length: traceLength
5010
5048
  });
5049
+ const subcircuitConnectivityMapKey = trace.subcircuit_connectivity_map_key ?? db.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key;
5011
5050
  const pcbStyle = trace.getInheritedMergedProperty("pcbStyle");
5012
5051
  const { holeDiameter, padDiameter } = getViaDiameterDefaults(pcbStyle);
5013
5052
  for (const point6 of route) {
5014
5053
  if (point6.route_type === "via") {
5054
+ const fromLayer = point6.from_layer;
5055
+ const toLayer = point6.to_layer;
5015
5056
  db.pcb_via.insert({
5016
5057
  pcb_trace_id: pcb_trace.pcb_trace_id,
5017
5058
  x: point6.x,
5018
5059
  y: point6.y,
5019
5060
  hole_diameter: holeDiameter,
5020
5061
  outer_diameter: padDiameter,
5021
- layers: [point6.from_layer, point6.to_layer],
5022
- from_layer: point6.from_layer,
5023
- to_layer: point6.to_layer
5062
+ layers: getViaSpanLayers({
5063
+ fromLayer,
5064
+ toLayer,
5065
+ layerCount: subcircuit._getSubcircuitLayerCount()
5066
+ }),
5067
+ from_layer: fromLayer,
5068
+ to_layer: toLayer,
5069
+ subcircuit_id: subcircuit?.subcircuit_id ?? void 0,
5070
+ pcb_group_id: trace.getGroup()?.pcb_group_id ?? void 0,
5071
+ subcircuit_connectivity_map_key: subcircuitConnectivityMapKey
5024
5072
  });
5025
5073
  }
5026
5074
  }
@@ -7241,26 +7289,6 @@ import { viaProps } from "@tscircuit/props";
7241
7289
  import {
7242
7290
  layer_ref
7243
7291
  } 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
7292
  import { z as z6 } from "zod";
7265
7293
  var pcbViaProps = viaProps.extend({
7266
7294
  layers: z6.array(layer_ref).optional(),
@@ -18445,8 +18473,8 @@ function convertTreeToMatchPackInputProblem(tree, db, group) {
18445
18473
  problem.chipPinMap[pinId] = {
18446
18474
  pinId,
18447
18475
  offset: {
18448
- x: (port.center?.x || 0) - (schematicComponent.center.x || 0) + marginXShift,
18449
- y: (port.center?.y || 0) - (schematicComponent.center.y || 0) + marginYShift
18476
+ x: (port.center?.x || 0) - (schematicComponent.center.x || 0),
18477
+ y: (port.center?.y || 0) - (schematicComponent.center.y || 0)
18450
18478
  },
18451
18479
  side
18452
18480
  };
@@ -22803,21 +22831,39 @@ var Group5 = class extends NormalComponent3 {
22803
22831
  continue;
22804
22832
  }
22805
22833
  if (pcb_trace.type === "pcb_trace") {
22834
+ const sourceTraceId = getSourceTraceIdForRoutedTrace({
22835
+ db,
22836
+ trace: pcb_trace,
22837
+ subcircuit_id: this.subcircuit_id
22838
+ });
22839
+ const { connection_name: inputConnectionName } = pcb_trace;
22840
+ let subcircuitConnectivityMapKey;
22841
+ if (sourceTraceId) {
22842
+ subcircuitConnectivityMapKey = db.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key;
22843
+ }
22844
+ if (!subcircuitConnectivityMapKey && inputConnectionName) {
22845
+ const sourceNet = db.source_net.get(inputConnectionName);
22846
+ if (sourceNet) {
22847
+ subcircuitConnectivityMapKey = sourceNet.subcircuit_connectivity_map_key;
22848
+ }
22849
+ }
22806
22850
  for (const point6 of pcb_trace.route) {
22807
22851
  if (point6.route_type === "via") {
22808
22852
  const routedViaPoint = point6;
22853
+ const fromLayer = point6.from_layer;
22854
+ const toLayer = point6.to_layer;
22809
22855
  db.pcb_via.insert({
22810
22856
  pcb_trace_id: pcb_trace.pcb_trace_id,
22811
22857
  x: point6.x,
22812
22858
  y: point6.y,
22813
22859
  hole_diameter: routedViaPoint.via_hole_diameter ?? routedViaPoint.hole_diameter ?? routedViaHoleDiameter,
22814
22860
  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
22861
+ layers: getViaBoardLayers(this._getSubcircuitLayerCount()),
22862
+ from_layer: fromLayer,
22863
+ to_layer: toLayer,
22864
+ subcircuit_id: this.subcircuit_id,
22865
+ pcb_group_id: this.pcb_group_id ?? void 0,
22866
+ subcircuit_connectivity_map_key: subcircuitConnectivityMapKey
22821
22867
  });
22822
22868
  }
22823
22869
  }
@@ -24240,7 +24286,7 @@ import { identity as identity5 } from "transformation-matrix";
24240
24286
  var package_default = {
24241
24287
  name: "@tscircuit/core",
24242
24288
  type: "module",
24243
- version: "0.0.1359",
24289
+ version: "0.0.1361",
24244
24290
  types: "dist/index.d.ts",
24245
24291
  main: "dist/index.js",
24246
24292
  module: "dist/index.js",
@@ -24277,7 +24323,7 @@ var package_default = {
24277
24323
  "@tscircuit/checks": "0.0.138",
24278
24324
  "@tscircuit/circuit-json-util": "^0.0.96",
24279
24325
  "@tscircuit/common": "^0.0.20",
24280
- "@tscircuit/copper-pour-solver": "^0.0.34",
24326
+ "@tscircuit/copper-pour-solver": "0.0.35",
24281
24327
  "@tscircuit/footprinter": "^0.0.357",
24282
24328
  "@tscircuit/image-utils": "^0.0.8",
24283
24329
  "@tscircuit/infer-cable-insertion-point": "^0.0.2",
@@ -24288,11 +24334,11 @@ var package_default = {
24288
24334
  "@tscircuit/matchpack": "^0.0.29",
24289
24335
  "@tscircuit/math-utils": "^0.0.36",
24290
24336
  "@tscircuit/miniflex": "^0.0.4",
24291
- "@tscircuit/props": "^0.0.555",
24292
24337
  "@tscircuit/ngspice-spice-engine": "^0.0.18",
24338
+ "@tscircuit/props": "^0.0.557",
24293
24339
  "@tscircuit/schematic-match-adapt": "^0.0.18",
24294
- "@tscircuit/solver-utils": "^0.0.16",
24295
24340
  "@tscircuit/schematic-trace-solver": "^0.0.72",
24341
+ "@tscircuit/solver-utils": "^0.0.16",
24296
24342
  "@tscircuit/soup-util": "^0.0.41",
24297
24343
  "@types/bun": "^1.2.16",
24298
24344
  "@types/debug": "^4.1.12",
@@ -25333,6 +25379,38 @@ var Subcircuit = class extends Group5 {
25333
25379
  doInitialRenderIsolatedSubcircuits() {
25334
25380
  Subcircuit_doInitialRenderIsolatedSubcircuits(this);
25335
25381
  }
25382
+ doInitialCreateNetsFromProps() {
25383
+ super.doInitialCreateNetsFromProps();
25384
+ this._createTracesForExposedNets();
25385
+ }
25386
+ _createTracesForExposedNets() {
25387
+ const exposedNets = this._parsedProps.exposedNets;
25388
+ if (!exposedNets?.length) return;
25389
+ const parentSubcircuit = this.parent?.getSubcircuit?.();
25390
+ if (!parentSubcircuit) return;
25391
+ if (!this.name) return;
25392
+ for (const exposedNetName of exposedNets) {
25393
+ const netName = normalizeExposedNetName(exposedNetName);
25394
+ const parentNetSelector = `net.${netName}`;
25395
+ const childNetSelector = `.${this.name} > net.${netName}`;
25396
+ const traceName = `exposed_net.${netName}`;
25397
+ if (!parentSubcircuit.selectOne(parentNetSelector, { type: "net" })) {
25398
+ parentSubcircuit.add(new Net({ name: netName }));
25399
+ }
25400
+ const existingTrace = parentSubcircuit.children.find(
25401
+ (child) => child instanceof Trace3 && child._parsedProps.name === traceName
25402
+ );
25403
+ if (existingTrace) continue;
25404
+ parentSubcircuit.add(
25405
+ new Trace3({
25406
+ name: traceName,
25407
+ from: childNetSelector,
25408
+ to: parentNetSelector,
25409
+ displayName: netName
25410
+ })
25411
+ );
25412
+ }
25413
+ }
25336
25414
  /**
25337
25415
  * During this phase, we inflate the subcircuit circuit json into class
25338
25416
  * instances
@@ -25361,6 +25439,7 @@ var Subcircuit = class extends Group5 {
25361
25439
  inflateCircuitJson(this, circuitJson, children);
25362
25440
  }
25363
25441
  };
25442
+ var normalizeExposedNetName = (netName) => netName.startsWith("net.") ? netName.slice("net.".length) : netName;
25364
25443
 
25365
25444
  // lib/components/normal-components/MountedBoard.ts
25366
25445
  var MountedBoard = class extends Subcircuit {
@@ -29153,6 +29232,7 @@ var CopperPour = class extends PrimitiveComponent2 {
29153
29232
  const clearance = props.clearance ?? 0.2;
29154
29233
  const inputProblem = convertCircuitJsonToInputProblem(circuitJson, {
29155
29234
  layer: props.layer,
29235
+ subcircuit_id: subcircuit?.subcircuit_id ?? void 0,
29156
29236
  source_net_id: net.source_net_id,
29157
29237
  pad_margin: props.padMargin ?? clearance,
29158
29238
  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.1360",
4
+ "version": "0.0.1362",
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.557",
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",