From 5abce8b655f7782df65c83126d46569d2bee3b76 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Wed, 17 Sep 2025 14:38:46 +0200 Subject: [PATCH] test: Report route lengths for benchmarking purposes --- .woodpecker/build_and_test.yaml | 2 +- tests/common/mod.rs | 47 +++++++++++++++++++++-- tests/single_layer.rs | 67 +++++++++++++++++++++++---------- 3 files changed, 92 insertions(+), 24 deletions(-) diff --git a/.woodpecker/build_and_test.yaml b/.woodpecker/build_and_test.yaml index 16d9e30..81c91fc 100644 --- a/.woodpecker/build_and_test.yaml +++ b/.woodpecker/build_and_test.yaml @@ -32,7 +32,7 @@ steps: - curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash - cargo binstall --no-confirm cargo-nextest - rustup default "$CHANNEL" - - cargo nextest run -j4 --verbose --no-default-features --features "$FEATURES" + - cargo nextest run -j4 --hide-progress-bar --success-output final --no-default-features --features "$FEATURES" when: event: [pull_request, push, tag] # Only run tests for stable channel to avoid straining Codeberg's CI. diff --git a/tests/common/mod.rs b/tests/common/mod.rs index ebcdab6..661fd6c 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -12,7 +12,10 @@ use topola::{ Autorouter, }, board::{edit::BoardEdit, AccessMesadata, Board}, - drawing::graph::{GetMaybeNet, PrimitiveIndex}, + drawing::{ + graph::{GetMaybeNet, MakePrimitiveRef, PrimitiveIndex}, + primitive::MakePrimitiveShape, + }, geometry::{shape::MeasureLength, GenericNode, GetLayer}, graph::{GetIndex, MakeRef}, router::{navmesh::Navmesh, RouterOptions}, @@ -43,11 +46,16 @@ pub fn create_invoker_and_assert( invoker } -pub fn replay_and_assert(invoker: &mut Invoker, filename: &str, variant: &str) { +pub fn replay_and_assert_and_report( + invoker: &mut Invoker, + filename: &str, + variant: &str, +) { let file = File::open(filename).unwrap(); let history: History = serde_json::from_reader(file).unwrap(); invoker.replay(history); + report_route_lengths(invoker.autorouter()); if variant == "with_undo_redo_replay" { assert_undo_redo_replay(invoker, filename); @@ -162,7 +170,7 @@ pub fn assert_navnode_count( assert_eq!(navmesh.graph().node_count(), expected_count); } -pub fn assert_single_layer_groundless_autoroute( +pub fn assert_that_all_single_layer_groundless_ratlines_are_autorouted( autorouter: &mut Autorouter, layername: &str, ) { @@ -262,3 +270,36 @@ pub fn assert_band_length( rel_err ); } + +pub fn report_route_lengths(autorouter: &Autorouter) { + let mut total_length = 0.0; + + for layer in 0..autorouter.board().layout().drawing().layer_count() { + let mut layer_total_length = 0.0; + + for primitive in autorouter + .board() + .layout() + .drawing() + .layer_primitive_nodes(layer) + { + match primitive { + PrimitiveIndex::LooseDot(..) + | PrimitiveIndex::LoneLooseSeg(..) + | PrimitiveIndex::SeqLooseSeg(..) => { + layer_total_length += primitive + .primitive_ref(autorouter.board().layout().drawing()) + .shape() + .length(); + } + _ => (), + } + } + + dbg!(layer, layer_total_length); + + total_length += layer_total_length; + } + + dbg!(total_length); +} diff --git a/tests/single_layer.rs b/tests/single_layer.rs index 863e64b..011b641 100644 --- a/tests/single_layer.rs +++ b/tests/single_layer.rs @@ -28,14 +28,17 @@ fn autoroute_4x4_1206_led_matrix_breakout(variant: &str) { "tests/single_layer/4x4_1206_led_matrix_breakout/4x4_1206_led_matrix_breakout.dsn", ); let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/4x4_1206_led_matrix_breakout/autoroute_all.cmd", variant, ); let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); } #[apply(test_master)] @@ -44,14 +47,17 @@ fn autoroute_4x4_1206_led_matrix_breakout_in_predefined_order(variant: &str) { "tests/single_layer/4x4_1206_led_matrix_breakout/4x4_1206_led_matrix_breakout.dsn", ); let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/4x4_1206_led_matrix_breakout/autoroute_all_in_predefined_order.cmd", variant, ); let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); } #[apply(test_master)] @@ -60,14 +66,17 @@ fn autoroute_tht_de9_to_tht_de9(variant: &str) { common::load_design("tests/single_layer/tht_de9_to_tht_de9/tht_de9_to_tht_de9.dsn"); let mut invoker = common::create_invoker_and_assert(autorouter); common::undo_all_and_assert(&mut invoker); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/tht_de9_to_tht_de9/autoroute_all.cmd", variant, ); let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); } #[apply(test_master)] @@ -75,14 +84,17 @@ fn autoroute_tht_de9_to_tht_de9_in_predefined_order(variant: &str) { let autorouter = common::load_design("tests/single_layer/tht_de9_to_tht_de9/tht_de9_to_tht_de9.dsn"); let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/tht_de9_to_tht_de9/autoroute_all_in_predefined_order.cmd", variant, ); let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); } #[apply(test_master)] @@ -90,7 +102,7 @@ fn autoroute_0603_breakout(variant: &str) { let mut autorouter = common::load_design("tests/single_layer/0603_breakout/0603_breakout.dsn"); common::assert_navnode_count(&mut autorouter, "R1-2", "J1-2", 22); let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/0603_breakout/autoroute_all.cmd", variant, @@ -98,7 +110,10 @@ fn autoroute_0603_breakout(variant: &str) { let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); //common::assert_number_of_conncomps(&mut autorouter, 2); } @@ -109,7 +124,7 @@ fn autoroute_tht_diode_bridge_rectifier(variant: &str) { ); common::assert_navnode_count(&mut autorouter, "J2-2", "D4-2", 68); let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/tht_diode_bridge_rectifier/autoroute_all.cmd", variant, @@ -117,7 +132,10 @@ fn autoroute_tht_diode_bridge_rectifier(variant: &str) { let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); //common::assert_number_of_conncomps(&mut autorouter, 4); common::assert_band_length(autorouter.board(), "J2-2", "D4-2", 15906.760439007436, 0.01); @@ -146,7 +164,7 @@ fn autoroute_4x_3rd_order_smd_lc_filters(variant: &str) { ); common::assert_navnode_count(&mut autorouter, "J1-1", "L1-1", 558); let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/4x_3rd_order_smd_lc_filters/autoroute_signals.cmd", variant, @@ -154,7 +172,10 @@ fn autoroute_4x_3rd_order_smd_lc_filters(variant: &str) { let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); //common::assert_number_of_conncomps(&mut autorouter, 16); } @@ -170,7 +191,7 @@ fn test_tht_3pin_xlr_to_tht_3pin_xlr(#[case] variant: &str) { ); //common::assert_navnode_count(&mut autorouter, "R1-2", "J1-2", ?); let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/tht_3pin_xlr_to_tht_3pin_xlr/autoroute_all.cmd", "undo_redo_replay", @@ -178,7 +199,7 @@ fn test_tht_3pin_xlr_to_tht_3pin_xlr(#[case] variant: &str) { let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted(&mut autorouter, "F.Cu"); }*/ #[apply(test_master)] @@ -187,7 +208,7 @@ fn autoroute_vga_dac_breakout(variant: &str) { common::load_design("tests/single_layer/vga_dac_breakout/vga_dac_breakout.dsn"); common::assert_navnode_count(&mut autorouter, "J1-2", "R4-1", 272); let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/vga_dac_breakout/autoroute_all.cmd", variant, @@ -195,7 +216,10 @@ fn autoroute_vga_dac_breakout(variant: &str) { let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); } #[apply(test_master)] @@ -205,7 +229,7 @@ fn autoroute_smd_non_rectangular_buck_converter(variant: &str) { let mut invoker = common::create_invoker_and_assert(autorouter); - common::replay_and_assert( + common::replay_and_assert_and_report( &mut invoker, "tests/single_layer/smd_non_rectangular_buck_converter/route_all.cmd", variant, @@ -213,6 +237,9 @@ fn autoroute_smd_non_rectangular_buck_converter(variant: &str) { let (mut autorouter, ..) = invoker.dissolve(); - common::assert_single_layer_groundless_autoroute(&mut autorouter, "F.Cu"); + common::assert_that_all_single_layer_groundless_ratlines_are_autorouted( + &mut autorouter, + "F.Cu", + ); //common::assert_number_of_conncomps(&mut autorouter, 16); }