Skip to main content

powerio_matrix/synth/
lattice.rs

1//! Square 2-D lattice / grid topology. `n` is rounded up to the nearest
2//! perfect square.
3
4use rand::SeedableRng;
5use rand_chacha::ChaCha8Rng;
6
7use crate::network::Network;
8
9use super::SynthSpec;
10use super::tree::{make_branch, make_buses, net};
11
12pub fn generate_lattice(spec: &SynthSpec) -> Network {
13    let side = ((spec.n as f64).sqrt().ceil() as usize).max(2);
14    let n = side * side;
15    let mut rng = ChaCha8Rng::seed_from_u64(spec.seed);
16
17    let buses = make_buses(n);
18    let mut branches = Vec::with_capacity(2 * side * (side - 1));
19    for r in 0..side {
20        for c in 0..side {
21            let idx = r * side + c;
22            if c + 1 < side {
23                branches.push(make_branch(idx + 1, idx + 2, spec, &mut rng));
24            }
25            if r + 1 < side {
26                branches.push(make_branch(idx + 1, idx + side + 1, spec, &mut rng));
27            }
28        }
29    }
30
31    net(format!("synth_lattice_{side}x{side}"), buses, branches)
32}