circuit-json-to-connectivity-map 0.0.3 → 0.0.5
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.
- package/README.md +67 -16
- package/dist/index.d.ts +14 -6
- package/dist/index.js +66 -11
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
# Circuit JSON to Connectivity Map
|
|
2
2
|
|
|
3
|
-
This
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- Find connected networks from a list of connections
|
|
8
|
-
- Generate source port connectivity maps from circuit JSON data
|
|
3
|
+
This library provides utilities to generate connectivity maps from circuit JSON data. It's designed to work with the `@tscircuit/soup` library and offers functionality to find connected networks and create connectivity maps.
|
|
9
4
|
|
|
10
5
|
## Installation
|
|
11
6
|
|
|
12
|
-
To install
|
|
7
|
+
To install the library, use npm or bun:
|
|
13
8
|
|
|
14
9
|
```bash
|
|
15
|
-
|
|
10
|
+
npm add circuit-json-to-connectivity-map
|
|
16
11
|
```
|
|
17
12
|
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- Find connected networks from a list of connections
|
|
16
|
+
- Generate source port connectivity maps from circuit JSON data
|
|
17
|
+
- Generate full connectivity maps from circuit JSON data
|
|
18
|
+
|
|
18
19
|
## Usage
|
|
19
20
|
|
|
20
21
|
### Finding Connected Networks
|
|
@@ -30,33 +31,83 @@ const connections = [
|
|
|
30
31
|
|
|
31
32
|
const result = findConnectedNetworks(connections)
|
|
32
33
|
console.log(result)
|
|
34
|
+
|
|
35
|
+
// Output:
|
|
36
|
+
// {
|
|
37
|
+
// connectivity_net0: ["A", "B", "C"],
|
|
38
|
+
// connectivity_net3: ["D", "E"],
|
|
39
|
+
// }
|
|
33
40
|
```
|
|
34
41
|
|
|
35
42
|
### Generating Source Port Connectivity Map
|
|
36
43
|
|
|
37
44
|
```typescript
|
|
38
|
-
import {
|
|
45
|
+
import { getSourcePortConnectivityMapFromCircuitJson } from "circuit-json-to-connectivity-map"
|
|
39
46
|
import type { AnySoupElement } from "@tscircuit/soup"
|
|
40
47
|
|
|
41
48
|
const circuitJson: AnySoupElement[] = [
|
|
42
49
|
// Your circuit JSON data here
|
|
43
50
|
]
|
|
44
51
|
|
|
45
|
-
const connectivityMap =
|
|
46
|
-
|
|
52
|
+
const connectivityMap = getSourcePortConnectivityMapFromCircuitJson(circuitJson)
|
|
53
|
+
|
|
54
|
+
// Check if two IDs are connected
|
|
55
|
+
console.log(connectivityMap.areIdsConnected("port1", "port2"))
|
|
56
|
+
|
|
57
|
+
// Get all IDs connected to a specific net
|
|
58
|
+
console.log(connectivityMap.getIdsConnectedToNet("net1"))
|
|
59
|
+
|
|
60
|
+
// Get the net connected to a specific ID
|
|
61
|
+
console.log(connectivityMap.getNetConnectedToId("port1"))
|
|
47
62
|
```
|
|
48
63
|
|
|
49
|
-
|
|
64
|
+
### Generating Full Connectivity Map
|
|
50
65
|
|
|
51
|
-
|
|
66
|
+
```typescript
|
|
67
|
+
import { getFullConnectivityMapFromCircuitJson } from "circuit-json-to-connectivity-map"
|
|
68
|
+
import type { AnySoupElement } from "@tscircuit/soup"
|
|
52
69
|
|
|
53
|
-
|
|
54
|
-
|
|
70
|
+
const circuitJson: AnySoupElement[] = [
|
|
71
|
+
// Your circuit JSON data here
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
const fullConnectivityMap = getFullConnectivityMapFromCircuitJson(circuitJson)
|
|
75
|
+
|
|
76
|
+
// Check if two IDs are connected (including PCB elements)
|
|
77
|
+
console.log(fullConnectivityMap.areIdsConnected("smtpad1", "port1"))
|
|
78
|
+
|
|
79
|
+
// Get all IDs connected to a specific net
|
|
80
|
+
console.log(fullConnectivityMap.getIdsConnectedToNet("net1"))
|
|
81
|
+
|
|
82
|
+
// Get the net connected to a specific ID
|
|
83
|
+
console.log(fullConnectivityMap.getNetConnectedToId("pcb_port1"))
|
|
55
84
|
```
|
|
56
85
|
|
|
86
|
+
## API Reference
|
|
87
|
+
|
|
88
|
+
### `findConnectedNetworks(connections: Array<string[]>): Record<string, string[]>`
|
|
89
|
+
|
|
90
|
+
Finds connected networks from a list of connections.
|
|
91
|
+
|
|
92
|
+
### `getSourcePortConnectivityMapFromCircuitJson(circuitJson: AnySoupElement[]): ConnectivityMap`
|
|
93
|
+
|
|
94
|
+
Generates a source port connectivity map from circuit JSON data.
|
|
95
|
+
|
|
96
|
+
### `getFullConnectivityMapFromCircuitJson(circuitJson: AnySoupElement[]): ConnectivityMap`
|
|
97
|
+
|
|
98
|
+
Generates a full connectivity map from circuit JSON data, including PCB elements.
|
|
99
|
+
|
|
100
|
+
### `ConnectivityMap`
|
|
101
|
+
|
|
102
|
+
A class representing the connectivity map with methods:
|
|
103
|
+
|
|
104
|
+
- `areIdsConnected(id1: string, id2: string): boolean`
|
|
105
|
+
- `getIdsConnectedToNet(netId: string): string[]`
|
|
106
|
+
- `getNetConnectedToId(id: string): string | undefined`
|
|
107
|
+
|
|
57
108
|
## Development
|
|
58
109
|
|
|
59
|
-
This project uses [Bun](https://bun.sh) as its JavaScript runtime.
|
|
110
|
+
This project uses [Bun](https://bun.sh) as its JavaScript runtime.
|
|
60
111
|
|
|
61
112
|
To start development:
|
|
62
113
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { AnySoupElement } from '@tscircuit/soup';
|
|
2
2
|
|
|
3
3
|
type NodeId = string;
|
|
4
|
-
declare function findConnectedNetworks(connections: Array<NodeId[]>):
|
|
5
|
-
netId: string;
|
|
6
|
-
connectedNodeIds: string[];
|
|
7
|
-
}>;
|
|
4
|
+
declare function findConnectedNetworks(connections: Array<NodeId[]>): Record<string, string[]>;
|
|
8
5
|
|
|
9
|
-
declare
|
|
6
|
+
declare class ConnectivityMap {
|
|
7
|
+
netMap: Record<string, string[]>;
|
|
8
|
+
idToNetMap: Record<string, string>;
|
|
9
|
+
constructor(netMap: Record<string, string[]>);
|
|
10
|
+
getIdsConnectedToNet(netId: string): string[];
|
|
11
|
+
getNetConnectedToId(id: string): string | undefined;
|
|
12
|
+
areIdsConnected(id1: string, id2: string): boolean;
|
|
13
|
+
}
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
declare const getSourcePortConnectivityMapFromCircuitJson: (circuitJson: AnySoupElement[]) => ConnectivityMap;
|
|
16
|
+
|
|
17
|
+
declare const getFullConnectivityMapFromCircuitJson: (circuitJson: AnySoupElement[]) => ConnectivityMap;
|
|
18
|
+
|
|
19
|
+
export { findConnectedNetworks, getFullConnectivityMapFromCircuitJson, getSourcePortConnectivityMapFromCircuitJson };
|
package/dist/index.js
CHANGED
|
@@ -33,32 +33,87 @@ function findConnectedNetworks(connections) {
|
|
|
33
33
|
network.add(nodeId);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
return
|
|
37
|
-
netId,
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
return Object.fromEntries(
|
|
37
|
+
Array.from(networks.entries()).map(([netId, connectedNodes]) => [
|
|
38
|
+
netId,
|
|
39
|
+
Array.from(connectedNodes)
|
|
40
|
+
])
|
|
41
|
+
);
|
|
40
42
|
}
|
|
41
43
|
|
|
44
|
+
// src/ConnectivityMap.ts
|
|
45
|
+
var ConnectivityMap = class {
|
|
46
|
+
netMap;
|
|
47
|
+
idToNetMap;
|
|
48
|
+
constructor(netMap) {
|
|
49
|
+
this.netMap = netMap;
|
|
50
|
+
this.idToNetMap = {};
|
|
51
|
+
for (const [netId, ids] of Object.entries(netMap)) {
|
|
52
|
+
for (const id of ids) {
|
|
53
|
+
this.idToNetMap[id] = netId;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
getIdsConnectedToNet(netId) {
|
|
58
|
+
return this.netMap[netId] || [];
|
|
59
|
+
}
|
|
60
|
+
getNetConnectedToId(id) {
|
|
61
|
+
return this.idToNetMap[id];
|
|
62
|
+
}
|
|
63
|
+
areIdsConnected(id1, id2) {
|
|
64
|
+
const netId1 = this.getNetConnectedToId(id1);
|
|
65
|
+
const netId2 = this.getNetConnectedToId(id2);
|
|
66
|
+
return netId1 === netId2 || netId2 === id1 || netId2 === id1;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
42
70
|
// src/getSourcePortConnectivityMapFromCircuitJson.ts
|
|
43
71
|
var getSourcePortConnectivityMapFromCircuitJson = (circuitJson) => {
|
|
44
|
-
const connectivityMap = /* @__PURE__ */ new Map();
|
|
45
72
|
const connections = [];
|
|
46
73
|
for (const element of circuitJson) {
|
|
47
74
|
if (element.type === "source_trace") {
|
|
48
75
|
connections.push([
|
|
49
|
-
...element.connected_source_port_ids,
|
|
50
|
-
...element.connected_source_net_ids
|
|
76
|
+
...element.connected_source_port_ids ?? [],
|
|
77
|
+
...element.connected_source_net_ids ?? []
|
|
51
78
|
]);
|
|
52
79
|
}
|
|
53
80
|
}
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
81
|
+
const netMap = findConnectedNetworks(connections);
|
|
82
|
+
return new ConnectivityMap(netMap);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// src/getFullConnectivityMapFromCircuitJson.ts
|
|
86
|
+
var getFullConnectivityMapFromCircuitJson = (circuitJson) => {
|
|
87
|
+
const connections = [];
|
|
88
|
+
for (const element of circuitJson) {
|
|
89
|
+
if (element.type === "source_trace") {
|
|
90
|
+
connections.push([
|
|
91
|
+
...element.connected_source_port_ids ?? [],
|
|
92
|
+
...element.connected_source_net_ids ?? []
|
|
93
|
+
]);
|
|
94
|
+
} else if (element.type === "pcb_port") {
|
|
95
|
+
const { pcb_port_id, source_port_id } = element;
|
|
96
|
+
if (source_port_id && pcb_port_id) {
|
|
97
|
+
connections.push([source_port_id, pcb_port_id]);
|
|
98
|
+
}
|
|
99
|
+
} else if (element.type === "pcb_smtpad") {
|
|
100
|
+
const { pcb_smtpad_id, pcb_port_id } = element;
|
|
101
|
+
if (pcb_port_id && pcb_smtpad_id) {
|
|
102
|
+
connections.push([pcb_smtpad_id, pcb_port_id]);
|
|
103
|
+
}
|
|
104
|
+
} else if (element.type === "pcb_plated_hole") {
|
|
105
|
+
const { pcb_plated_hole_id, pcb_port_id } = element;
|
|
106
|
+
if (pcb_port_id && pcb_plated_hole_id) {
|
|
107
|
+
connections.push([pcb_plated_hole_id, pcb_port_id]);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
57
110
|
}
|
|
58
|
-
|
|
111
|
+
const netMap = findConnectedNetworks(connections);
|
|
112
|
+
return new ConnectivityMap(netMap);
|
|
59
113
|
};
|
|
60
114
|
export {
|
|
61
115
|
findConnectedNetworks,
|
|
116
|
+
getFullConnectivityMapFromCircuitJson,
|
|
62
117
|
getSourcePortConnectivityMapFromCircuitJson
|
|
63
118
|
};
|
|
64
119
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/findConnectedNetworks.ts","../src/getSourcePortConnectivityMapFromCircuitJson.ts"],"sourcesContent":["type NodeId = string\n\nexport function findConnectedNetworks(\n connections: Array<NodeId[]>,\n):
|
|
1
|
+
{"version":3,"sources":["../src/findConnectedNetworks.ts","../src/ConnectivityMap.ts","../src/getSourcePortConnectivityMapFromCircuitJson.ts","../src/getFullConnectivityMapFromCircuitJson.ts"],"sourcesContent":["type NodeId = string\n\nexport function findConnectedNetworks(\n connections: Array<NodeId[]>,\n): Record<string, string[]> {\n const networks: Map<string, Set<string>> = new Map()\n let netCounter = 0\n\n function getOrCreateNetwork(nodeId: string): Set<string> {\n for (const [, network] of networks) {\n if (network.has(nodeId)) {\n return network\n }\n }\n const newNetwork = new Set<string>()\n networks.set(`connectivity_net${netCounter++}`, newNetwork)\n return newNetwork\n }\n\n for (const connection of connections) {\n let network: Set<string> | null = null\n\n for (const nodeId of connection) {\n if (!network) {\n network = getOrCreateNetwork(nodeId)\n } else if (!network.has(nodeId)) {\n const existingNetwork = getOrCreateNetwork(nodeId)\n if (existingNetwork !== network) {\n // Merge networks\n for (const node of existingNetwork) {\n network.add(node)\n }\n networks.delete(\n Array.from(networks.entries()).find(\n ([, net]) => net === existingNetwork,\n )![0],\n )\n }\n }\n network.add(nodeId)\n }\n }\n\n return Object.fromEntries(\n Array.from(networks.entries()).map(([netId, connectedNodes]) => [\n netId,\n Array.from(connectedNodes),\n ]),\n )\n}\n","export class ConnectivityMap {\n netMap: Record<string, string[]>\n\n idToNetMap: Record<string, string>\n\n constructor(netMap: Record<string, string[]>) {\n this.netMap = netMap\n this.idToNetMap = {}\n for (const [netId, ids] of Object.entries(netMap)) {\n for (const id of ids) {\n this.idToNetMap[id] = netId\n }\n }\n }\n\n getIdsConnectedToNet(netId: string): string[] {\n return this.netMap[netId] || []\n }\n\n getNetConnectedToId(id: string): string | undefined {\n return this.idToNetMap[id]\n }\n\n areIdsConnected(id1: string, id2: string): boolean {\n const netId1 = this.getNetConnectedToId(id1)\n const netId2 = this.getNetConnectedToId(id2)\n return netId1 === netId2 || netId2 === id1 || netId2 === id1\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { findConnectedNetworks } from \"./findConnectedNetworks\"\nimport { ConnectivityMap } from \"./ConnectivityMap\"\n\nexport const getSourcePortConnectivityMapFromCircuitJson = (\n circuitJson: AnySoupElement[],\n) => {\n const connections: string[][] = []\n\n for (const element of circuitJson) {\n if (element.type === \"source_trace\") {\n connections.push([\n ...(element.connected_source_port_ids ?? []),\n ...(element.connected_source_net_ids ?? []),\n ])\n }\n }\n\n const netMap = findConnectedNetworks(connections)\n\n return new ConnectivityMap(netMap)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { findConnectedNetworks } from \"./findConnectedNetworks\"\nimport { ConnectivityMap } from \"./ConnectivityMap\"\n\nexport const getFullConnectivityMapFromCircuitJson = (\n circuitJson: AnySoupElement[],\n) => {\n const connections: string[][] = []\n\n for (const element of circuitJson) {\n if (element.type === \"source_trace\") {\n connections.push([\n ...(element.connected_source_port_ids ?? []),\n ...(element.connected_source_net_ids ?? []),\n ])\n } else if (element.type === \"pcb_port\") {\n const { pcb_port_id, source_port_id } = element\n if (source_port_id && pcb_port_id) {\n connections.push([source_port_id, pcb_port_id])\n }\n } else if (element.type === \"pcb_smtpad\") {\n const { pcb_smtpad_id, pcb_port_id } = element\n if (pcb_port_id && pcb_smtpad_id) {\n connections.push([pcb_smtpad_id, pcb_port_id])\n }\n } else if (element.type === \"pcb_plated_hole\") {\n const { pcb_plated_hole_id, pcb_port_id } = element\n if (pcb_port_id && pcb_plated_hole_id) {\n connections.push([pcb_plated_hole_id, pcb_port_id])\n }\n }\n }\n\n const netMap = findConnectedNetworks(connections)\n\n return new ConnectivityMap(netMap)\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
"name": "circuit-json-to-connectivity-map",
|
|
3
3
|
"module": "dist/index.js",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.5",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist"
|
|
8
8
|
],
|
|
9
9
|
"scripts": {
|
|
10
|
-
"build": "tsup-node src/index.ts --format esm --sourcemap --dts"
|
|
10
|
+
"build": "tsup-node src/index.ts --format esm --sourcemap --dts",
|
|
11
|
+
"format:check": "biome format .",
|
|
12
|
+
"format": "biome format --write ."
|
|
11
13
|
},
|
|
12
14
|
"devDependencies": {
|
|
13
15
|
"@tscircuit/soup": "^0.0.68",
|