tests: add four 3rd order SMD LC filters test

This commit is contained in:
Mikolaj Wielgus 2024-06-01 00:34:09 +02:00
parent 540d9707dc
commit 765d8495c6
12 changed files with 110075 additions and 35 deletions

View File

@ -11,4 +11,4 @@ steps:
environment: [CARGO_TERM_COLOR=always]
commands:
- rustup default "$CHANNEL"
- cargo test --features "$FEATURES"
- cargo test --verbose --features "$FEATURES"

View File

@ -63,7 +63,7 @@ impl Autoroute {
return Err(AutorouterError::NothingToRoute);
};
let (source, target) = Self::ratline_endpoints(autorouter, cur_ratline);
let (source, target) = autorouter.ratline_endpoints(cur_ratline);
let navmesh = Some(Navmesh::new(autorouter.board.layout(), source, target)?);
let this = Self {
@ -81,7 +81,7 @@ impl Autoroute {
observer: &mut impl RouterObserverTrait<R>,
) -> Result<AutorouterStatus, AutorouterError> {
let (new_navmesh, new_ratline) = if let Some(cur_ratline) = self.ratlines_iter.next() {
let (source, target) = Self::ratline_endpoints(autorouter, cur_ratline);
let (source, target) = autorouter.ratline_endpoints(cur_ratline);
(
Some(
@ -117,37 +117,6 @@ impl Autoroute {
}
}
fn ratline_endpoints<R: RulesTrait>(
autorouter: &mut Autorouter<R>,
ratline: EdgeIndex<usize>,
) -> (FixedDotIndex, FixedDotIndex) {
let (source, target) = autorouter.ratsnest.graph().edge_endpoints(ratline).unwrap();
let source_dot = match autorouter
.ratsnest
.graph()
.node_weight(source)
.unwrap()
.vertex_index()
{
RatsnestVertexIndex::FixedDot(dot) => dot,
RatsnestVertexIndex::Zone(zone) => autorouter.board.layout_mut().zone_apex(zone),
};
let target_dot = match autorouter
.ratsnest
.graph()
.node_weight(target)
.unwrap()
.vertex_index()
{
RatsnestVertexIndex::FixedDot(dot) => dot,
RatsnestVertexIndex::Zone(zone) => autorouter.board.layout_mut().zone_apex(zone),
};
(source_dot, target_dot)
}
pub fn navmesh(&self) -> &Option<Navmesh> {
&self.navmesh
}
@ -200,6 +169,37 @@ impl<R: RulesTrait> Autorouter<R> {
}
}
pub fn ratline_endpoints(
&mut self,
ratline: EdgeIndex<usize>,
) -> (FixedDotIndex, FixedDotIndex) {
let (source, target) = self.ratsnest.graph().edge_endpoints(ratline).unwrap();
let source_dot = match self
.ratsnest
.graph()
.node_weight(source)
.unwrap()
.vertex_index()
{
RatsnestVertexIndex::FixedDot(dot) => dot,
RatsnestVertexIndex::Zone(zone) => self.board.layout_mut().zone_apex(zone),
};
let target_dot = match self
.ratsnest
.graph()
.node_weight(target)
.unwrap()
.vertex_index()
{
RatsnestVertexIndex::FixedDot(dot) => dot,
RatsnestVertexIndex::Zone(zone) => self.board.layout_mut().zone_apex(zone),
};
(source_dot, target_dot)
}
fn selected_ratlines(&self, selection: &Selection) -> Vec<EdgeIndex<usize>> {
self.ratsnest
.graph()

View File

@ -65,6 +65,10 @@ impl<R: RulesTrait> Invoker<R> {
}
}
pub fn destruct(self) -> (Autorouter<R>, History) {
(self.autorouter, self.history)
}
pub fn execute(
&mut self,
command: Command,

View File

@ -73,6 +73,6 @@ fn test() {
.unwrap()
.vertex_index()
.node_index();
assert!(unionfind.equiv(from_index, to_index));
assert_eq!(unionfind.find(from_index), unionfind.find(to_index));
}
}

View File

@ -0,0 +1,73 @@
{
"done": [
{
"Autoroute": {
"pins": [
"L3-1",
"L3-2",
"C3-1",
"L1-2",
"C2-1",
"L2-2",
"J2-1",
"J1-1",
"L1-1",
"C1-1",
"L2-1"
]
}
},
{
"Autoroute": {
"pins": [
"C6-1",
"J4-1",
"L5-1",
"J3-1",
"C5-1",
"L6-2",
"L5-2",
"C4-1",
"L6-1",
"L4-1",
"L4-2"
]
}
},
{
"Autoroute": {
"pins": [
"C9-1",
"J5-1",
"L7-1",
"J6-1",
"L9-2",
"C7-1",
"L8-2",
"L9-1",
"L8-1",
"L7-2",
"C8-1"
]
}
},
{
"Autoroute": {
"pins": [
"L10-1",
"L12-1",
"J7-1",
"L10-2",
"C10-1",
"C12-1",
"L12-2",
"L11-1",
"C11-1",
"L11-2",
"J8-1"
]
}
}
],
"undone": []
}

View File

@ -0,0 +1,288 @@
(pcb /home/mikolaj/proj/topola/tests/data/four_3rd_order_smd_lc_filters/four_3rd_order_smd_lc_filters.dsn
(parser
(string_quote ")
(space_in_quoted_tokens on)
(host_cad "KiCad's Pcbnew")
(host_version "8.0.2")
)
(resolution um 10)
(unit um)
(structure
(layer F.Cu
(type signal)
(property
(index 0)
)
)
(layer B.Cu
(type signal)
(property
(index 1)
)
)
(boundary
(path pcb 0 122682 -88900 109220 -88900 109220 -68834 122682 -68834
122682 -88900)
)
(via "Via[0-1]_600:300_um")
(rule
(width 200)
(clearance 200)
(clearance 200 (type default_smd))
(clearance 50 (type smd_smd))
)
)
(placement
(component Inductor_SMD:L_0603_1608Metric_Pad1.05x0.95mm_HandSolder
(place L12 119267.000000 -86487.000000 front 0.000000 (PN L))
(place L1 112649.000000 -69723.000000 front 0.000000 (PN L))
(place L6 119239.000000 -75311.000000 front 0.000000 (PN L))
(place L5 115937.000000 -75311.000000 front 0.000000 (PN L))
(place L7 112649.000000 -80899.000000 front 0.000000 (PN L))
(place L10 112663.000000 -86487.000000 front 0.000000 (PN L))
(place L3 119253.000000 -69723.000000 front 0.000000 (PN L))
(place L9 119253.000000 -80899.000000 front 0.000000 (PN L))
(place L2 115951.000000 -69723.000000 front 0.000000 (PN L))
(place L8 115951.000000 -80899.000000 front 0.000000 (PN L))
(place L11 115965.000000 -86487.000000 front 0.000000 (PN L))
(place L4 112635.000000 -75311.000000 front 0.000000 (PN L))
)
(component Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder
(place C12 119267.000000 -88011.000000 front 180.000000 (PN C))
(place C3 119253.000000 -71247.000000 front 180.000000 (PN C))
(place C4 112635.000000 -76835.000000 front 180.000000 (PN C))
(place C7 112649.000000 -82423.000000 front 180.000000 (PN C))
(place C6 119239.000000 -76835.000000 front 180.000000 (PN C))
(place C1 112649.000000 -71247.000000 front 180.000000 (PN C))
(place C11 115965.000000 -88011.000000 front 180.000000 (PN C))
(place C9 119253.000000 -82423.000000 front 180.000000 (PN C))
(place C10 112663.000000 -88011.000000 front 180.000000 (PN C))
(place C2 115951.000000 -71247.000000 front 180.000000 (PN C))
(place C5 115937.000000 -76835.000000 front 180.000000 (PN C))
(place C8 115951.000000 -82423.000000 front 180.000000 (PN C))
)
(component Connector_PinHeader_1.00mm:PinHeader_1x02_P1.00mm_Horizontal
(place J1 110000.000000 -70000.000000 back 0.000000 (PN Conn_01x02_Męski))
(place J3 109968.000000 -75565.000000 back 0.000000 (PN Conn_01x02_Męski))
(place J7 109974.000000 -86733.000000 back 0.000000 (PN Conn_01x02_Męski))
(place J5 109982.000000 -81153.000000 back 0.000000 (PN Conn_01x02_Męski))
)
(component Connector_PinHeader_1.00mm:PinHeader_1x02_P1.00mm_Horizontal::1
(place J6 121920.000000 -82161.000000 back 180.000000 (PN Conn_01x02_Męski))
(place J8 121956.000000 -87749.000000 back 180.000000 (PN Conn_01x02_Męski))
(place J2 121920.000000 -70993.000000 back 180.000000 (PN Conn_01x02_Męski))
(place J4 121906.000000 -76565.000000 back 180.000000 (PN Conn_01x02_Męski))
)
)
(library
(image Inductor_SMD:L_0603_1608Metric_Pad1.05x0.95mm_HandSolder
(outline (path signal 120 -171.267 510 171.267 510))
(outline (path signal 120 -171.267 -510 171.267 -510))
(outline (path signal 50 -1650 730 1650 730))
(outline (path signal 50 -1650 -730 -1650 730))
(outline (path signal 50 1650 730 1650 -730))
(outline (path signal 50 1650 -730 -1650 -730))
(outline (path signal 100 -800 400 800 400))
(outline (path signal 100 -800 -400 -800 400))
(outline (path signal 100 800 400 800 -400))
(outline (path signal 100 800 -400 -800 -400))
(pin RoundRect[T]Pad_1050x950_238.404_um_0.000000_0 1 -875 0)
(pin RoundRect[T]Pad_1050x950_238.404_um_0.000000_0 2 875 0)
)
(image Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder
(outline (path signal 120 -146.267 -510 146.267 -510))
(outline (path signal 120 -146.267 510 146.267 510))
(outline (path signal 50 1650 -730 -1650 -730))
(outline (path signal 50 1650 730 1650 -730))
(outline (path signal 50 -1650 -730 -1650 730))
(outline (path signal 50 -1650 730 1650 730))
(outline (path signal 100 800 -400 -800 -400))
(outline (path signal 100 800 400 800 -400))
(outline (path signal 100 -800 -400 -800 400))
(outline (path signal 100 -800 400 800 400))
(pin RoundRect[T]Pad_1075x950_238.404_um_0.000000_0 1 -862.5 0)
(pin RoundRect[T]Pad_1075x950_238.404_um_0.000000_0 2 862.5 0)
)
(image Connector_PinHeader_1.00mm:PinHeader_1x02_P1.00mm_Horizontal
(outline (path signal 120 1310 210 3310 210))
(outline (path signal 120 1310 150 3310 150))
(outline (path signal 120 1310 30 3310 30))
(outline (path signal 120 1310 -90 3310 -90))
(outline (path signal 120 3310 210 3310 -210))
(outline (path signal 120 1310 -790 3310 -790))
(outline (path signal 120 3310 -790 3310 -1210))
(outline (path signal 120 685 560 1310 560))
(outline (path signal 120 3310 -210 1310 -210))
(outline (path signal 120 685 -500 1310 -500))
(outline (path signal 120 3310 -1210 1310 -1210))
(outline (path signal 120 1310 560 1310 -1560))
(outline (path signal 120 1310 -1560 394.493 -1560))
(outline (path signal 120 -685 685 0 685))
(outline (path signal 120 -685 0 -685 685))
(outline (path signal 50 3750 -2000 3750 1000))
(outline (path signal 50 -1000 -2000 3750 -2000))
(outline (path signal 50 3750 1000 -1000 1000))
(outline (path signal 50 -1000 1000 -1000 -2000))
(outline (path signal 100 1250 150 3250 150))
(outline (path signal 100 3250 150 3250 -150))
(outline (path signal 100 1250 -150 3250 -150))
(outline (path signal 100 1250 -850 3250 -850))
(outline (path signal 100 3250 -850 3250 -1150))
(outline (path signal 100 1250 -1150 3250 -1150))
(outline (path signal 100 500 500 1250 500))
(outline (path signal 100 1250 500 1250 -1500))
(outline (path signal 100 250 250 500 500))
(outline (path signal 100 250 -1500 250 250))
(outline (path signal 100 -150 150 250 150))
(outline (path signal 100 -150 -150 250 -150))
(outline (path signal 100 -150 -850 250 -850))
(outline (path signal 100 -150 -1150 250 -1150))
(outline (path signal 100 1250 -1500 250 -1500))
(outline (path signal 100 -150 150 -150 -150))
(outline (path signal 100 -150 -850 -150 -1150))
(pin Rect[A]Pad_850x850_um 1 0 0)
(pin Oval[A]Pad_850x850_um 2 0 -1000)
)
(image Connector_PinHeader_1.00mm:PinHeader_1x02_P1.00mm_Horizontal::1
(outline (path signal 120 -685 0 -685 685))
(outline (path signal 120 -685 685 0 685))
(outline (path signal 120 1310 -1560 394.493 -1560))
(outline (path signal 120 1310 560 1310 -1560))
(outline (path signal 120 3310 -1210 1310 -1210))
(outline (path signal 120 685 -500 1310 -500))
(outline (path signal 120 3310 -210 1310 -210))
(outline (path signal 120 685 560 1310 560))
(outline (path signal 120 3310 -790 3310 -1210))
(outline (path signal 120 1310 -790 3310 -790))
(outline (path signal 120 3310 210 3310 -210))
(outline (path signal 120 1310 -90 3310 -90))
(outline (path signal 120 1310 30 3310 30))
(outline (path signal 120 1310 150 3310 150))
(outline (path signal 120 1310 210 3310 210))
(outline (path signal 50 -1000 1000 -1000 -2000))
(outline (path signal 50 3750 1000 -1000 1000))
(outline (path signal 50 -1000 -2000 3750 -2000))
(outline (path signal 50 3750 -2000 3750 1000))
(outline (path signal 100 -150 -850 -150 -1150))
(outline (path signal 100 -150 150 -150 -150))
(outline (path signal 100 1250 -1500 250 -1500))
(outline (path signal 100 -150 -1150 250 -1150))
(outline (path signal 100 -150 -850 250 -850))
(outline (path signal 100 -150 -150 250 -150))
(outline (path signal 100 -150 150 250 150))
(outline (path signal 100 250 -1500 250 250))
(outline (path signal 100 250 250 500 500))
(outline (path signal 100 1250 500 1250 -1500))
(outline (path signal 100 500 500 1250 500))
(outline (path signal 100 1250 -1150 3250 -1150))
(outline (path signal 100 3250 -850 3250 -1150))
(outline (path signal 100 1250 -850 3250 -850))
(outline (path signal 100 1250 -150 3250 -150))
(outline (path signal 100 3250 150 3250 -150))
(outline (path signal 100 1250 150 3250 150))
(pin Rect[A]Pad_850x850_um 1 0 0)
(pin Oval[A]Pad_850x850_um 2 0 -1000)
)
(padstack Oval[A]Pad_850x850_um
(shape (path F.Cu 850 0 0 0 0))
(shape (path B.Cu 850 0 0 0 0))
(attach off)
)
(padstack RoundRect[T]Pad_1050x950_238.404_um_0.000000_0
(shape (polygon F.Cu 0 -525.904 237.5 -507.757 328.733 -456.077 406.077 -378.733 457.757
-287.5 475.904 287.5 475.904 378.733 457.757 456.077 406.077
507.757 328.733 525.904 237.5 525.904 -237.5 507.757 -328.733
456.077 -406.077 378.733 -457.757 287.5 -475.904 -287.5 -475.904
-378.733 -457.757 -456.077 -406.077 -507.757 -328.733 -525.904 -237.5
-525.904 237.5))
(attach off)
)
(padstack RoundRect[T]Pad_1075x950_238.404_um_0.000000_0
(shape (polygon F.Cu 0 -538.404 237.5 -520.257 328.733 -468.577 406.077 -391.233 457.757
-300 475.904 300 475.904 391.233 457.757 468.577 406.077
520.257 328.733 538.404 237.5 538.404 -237.5 520.257 -328.733
468.577 -406.077 391.233 -457.757 300 -475.904 -300 -475.904
-391.233 -457.757 -468.577 -406.077 -520.257 -328.733 -538.404 -237.5
-538.404 237.5))
(attach off)
)
(padstack Rect[A]Pad_850x850_um
(shape (rect F.Cu -425 -425 425 425))
(shape (rect B.Cu -425 -425 425 425))
(attach off)
)
(padstack "Via[0-1]_600:300_um"
(shape (circle F.Cu 600))
(shape (circle B.Cu 600))
(attach off)
)
)
(network
(net "Net-(C1-Pad1)"
(pins L1-2 C1-1 L2-1)
)
(net GND
(pins C12-2 C3-2 C4-2 C7-2 C6-2 C1-2 C11-2 C9-2 C10-2 C2-2 C5-2 C8-2 J1-2 J6-2
J8-2 J2-2 J3-2 J7-2 J4-2 J5-2)
)
(net "Net-(C2-Pad1)"
(pins L3-1 L2-2 C2-1)
)
(net "Net-(J2-Pin_1)"
(pins C3-1 L3-2 J2-1)
)
(net "Net-(C4-Pad1)"
(pins C4-1 L5-1 L4-2)
)
(net "Net-(C5-Pad1)"
(pins L6-1 L5-2 C5-1)
)
(net "Net-(J4-Pin_1)"
(pins L6-2 C6-1 J4-1)
)
(net "Net-(C7-Pad1)"
(pins C7-1 L7-2 L8-1)
)
(net "Net-(C8-Pad1)"
(pins L9-1 L8-2 C8-1)
)
(net "Net-(J6-Pin_1)"
(pins L9-2 C9-1 J6-1)
)
(net "Net-(C10-Pad1)"
(pins L10-2 C10-1 L11-1)
)
(net "Net-(C11-Pad1)"
(pins L12-1 C11-1 L11-2)
)
(net "Net-(J8-Pin_1)"
(pins L12-2 C12-1 J8-1)
)
(net "Net-(J1-Pin_1)"
(pins L1-1 J1-1)
)
(net "Net-(J3-Pin_1)"
(pins L4-1 J3-1)
)
(net "Net-(J5-Pin_1)"
(pins L7-1 J5-1)
)
(net "Net-(J7-Pin_1)"
(pins L10-1 J7-1)
)
(class kicad_default "" GND "Net-(C1-Pad1)" "Net-(C10-Pad1)" "Net-(C11-Pad1)"
"Net-(C2-Pad1)" "Net-(C4-Pad1)" "Net-(C5-Pad1)" "Net-(C7-Pad1)" "Net-(C8-Pad1)"
"Net-(J1-Pin_1)" "Net-(J2-Pin_1)" "Net-(J3-Pin_1)" "Net-(J4-Pin_1)"
"Net-(J5-Pin_1)" "Net-(J6-Pin_1)" "Net-(J7-Pin_1)" "Net-(J8-Pin_1)"
(circuit
(use_via Via[0-1]_600:300_um)
)
(rule
(width 200)
(clearance 200)
)
)
)
(wiring
)
)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,83 @@
{
"board": {
"active_layer": 44,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40
],
"visible_layers": "fffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "four_3rd_order_smd_lc_filters.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View File

@ -0,0 +1,582 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.762,
"height": 1.524,
"width": 1.524
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_near_hole": "error",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"conflicting_netclasses": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "four_3rd_order_smd_lc_filters.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "",
"pos_files": "",
"specctra_dsn": "four_3rd_order_smd_lc_filters.dsn",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"bom_fmt_presets": [],
"bom_fmt_settings": {
"field_delimiter": ",",
"keep_line_breaks": false,
"keep_tabs": false,
"name": "CSV",
"ref_delimiter": ",",
"ref_range_delimiter": "",
"string_delimiter": "\""
},
"bom_presets": [],
"bom_settings": {
"exclude_dnp": false,
"fields_ordered": [
{
"group_by": false,
"label": "Reference",
"name": "Reference",
"show": true
},
{
"group_by": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
},
{
"group_by": false,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "${QUANTITY}",
"show": true
},
{
"group_by": true,
"label": "DNP",
"name": "${DNP}",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"name": "Grouped By Value",
"sort_asc": true,
"sort_field": "Reference"
},
"connection_grid_size": 50.0,
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"operating_point_overlay_i_precision": 3,
"operating_point_overlay_i_range": "~A",
"operating_point_overlay_v_precision": 3,
"operating_point_overlay_v_range": "~V",
"overbar_offset_ratio": 1.23,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"page_layout_descr_file": "",
"plot_directory": "",
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_dissipations": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"c335cb5a-108f-4efe-927e-854b96e1559e",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,86 @@
use std::fs::File;
use petgraph::{
unionfind::UnionFind,
visit::{EdgeRef, IntoEdgeReferences, NodeIndexable},
};
use topola::{
autorouter::{invoker::Invoker, Autorouter},
drawing::graph::GetMaybeNet,
dsn::design::DsnDesign,
graph::GetNodeIndex,
triangulation::GetVertexIndex,
};
#[test]
fn test() {
let design = DsnDesign::load_from_file(
"tests/data/four_3rd_order_smd_lc_filters/four_3rd_order_smd_lc_filters.dsn",
);
let board = design.unwrap().make_board();
let mut invoker = Invoker::new(Autorouter::new(board).unwrap());
let file = File::open("tests/data/four_3rd_order_smd_lc_filters/autoroute_signal.cmd").unwrap();
invoker.replay(serde_json::from_reader(file).unwrap());
let (mut autorouter, ..) = invoker.destruct();
for ratline in autorouter.ratsnest().graph().edge_indices() {
// Accessing endpoints may create new dots because apex construction is lazy, so we access
// tem all before starting unionfind, as it requires a constant index bound.
let _ = autorouter.ratline_endpoints(ratline);
}
let mut unionfind = UnionFind::new(
autorouter
.board()
.layout()
.drawing()
.geometry()
.graph()
.node_bound(),
);
for edge in autorouter
.board()
.layout()
.drawing()
.geometry()
.graph()
.edge_references()
{
unionfind.union(edge.source(), edge.target());
}
for ratline in autorouter.ratsnest().graph().edge_indices() {
let (source_dot, target_dot) = autorouter.ratline_endpoints(ratline);
let source_net = autorouter
.board()
.layout()
.drawing()
.primitive(source_dot)
.maybe_net();
let target_net = autorouter
.board()
.layout()
.drawing()
.primitive(target_dot)
.maybe_net();
assert_eq!(source_net, target_net);
let net = source_net.unwrap();
if let Some(netname) = autorouter.board().netname(net) {
dbg!(netname);
// We don't route GND.
if netname != "GND" {
dbg!(source_dot, target_dot);
assert_eq!(
unionfind.find(source_dot.node_index()),
unionfind.find(target_dot.node_index())
);
}
}
}
}