main
c49a4ab ยท 23 days ago 6 commits
 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}