Skip to main content

powerio_synth/
tree.rs

1//! Random spanning tree topology.
2
3use rand::RngExt;
4use rand::SeedableRng;
5use rand_chacha::ChaCha8Rng;
6
7use powerio_tx::BalancedNetwork;
8
9use super::{SynthSpec, make_branch, make_buses, net};
10
11pub fn generate_tree(spec: &SynthSpec) -> BalancedNetwork {
12    let n = spec.n.max(2);
13    let mut rng = ChaCha8Rng::seed_from_u64(spec.seed);
14    let buses = make_buses(n);
15
16    let mut branches = Vec::with_capacity(n - 1);
17    for k in 1..n {
18        let parent = rng.random_range(0..k);
19        branches.push(make_branch(parent + 1, k + 1, spec, &mut rng));
20    }
21
22    net(format!("synth_tree_n{n}"), buses, branches)
23}