1package internal
2
3import (
4 "fmt"
5 "slices"
6 "strconv"
7)
8
9type netRef struct {
10 componentID string
11 pin string
12}
13
14func (r netRef) String() string {
15 return r.componentID + "." + r.pin
16}
17
18func (c xmlComponent) resolvePin(pt string) string {
19 idx, ok := pinIndex(pt)
20 if !ok {
21 return pt
22 }
23 if v, ok := c.prop("p" + strconv.Itoa(idx)); ok && v != "" {
24 return v
25 }
26 if v, ok := c.prop("#" + strconv.Itoa(idx)); ok && v != "" {
27 return v
28 }
29 return pt
30}
31
32func (c *Component) addPin(name string) {
33 if name == "" {
34 return
35 }
36 if slices.Contains(c.Pins, name) {
37 return
38 }
39 c.Pins = append(c.Pins, name)
40}
41
42func collectConnections(xmlComps []xmlComponent, components []Component) [][]string {
43 nets := make(map[string][]netRef)
44 var order []string
45
46 for i, xc := range xmlComps {
47 id := components[i].ID
48 for _, cn := range xc.Conns {
49 pin := xc.resolvePin(cn.Pin)
50 if _, seen := nets[cn.ID]; !seen {
51 order = append(order, cn.ID)
52 }
53 nets[cn.ID] = append(nets[cn.ID], netRef{componentID: id, pin: pin})
54 }
55 }
56
57 connections := make([][]string, 0, len(order))
58 for _, netID := range order {
59 refs := nets[netID]
60 if len(refs) < 2 {
61 fmt.Printf("Warning: Circuit has a dangling connection %v\n", refs)
62 continue
63 }
64 row := make([]string, len(refs))
65 for i, ref := range refs {
66 row[i] = ref.String()
67 }
68 connections = append(connections, row)
69 }
70 return connections
71}