awooter: atomics instead

This commit is contained in:
Lofty 2022-11-26 20:01:50 +00:00
parent 1b80a559e2
commit 3931daefc7

View File

@ -219,40 +219,40 @@ fn partition_nets(
north += 1; north += 1;
pips_n pips_n
.entry((loc.x, loc.y)) .entry((loc.x, loc.y))
.and_modify(|pip_list: &mut Vec<(npnr::PipId, RwLock<Vec<npnr::IdString>>)>| { .and_modify(|pip_list: &mut Vec<(npnr::PipId, AtomicUsize)>| {
pip_list.push((pip, RwLock::new(Vec::new()))) pip_list.push((pip, AtomicUsize::new(0)))
}) })
.or_insert_with(|| vec![(pip, RwLock::new(Vec::new()))]); .or_insert_with(|| vec![(pip, AtomicUsize::new(0))]);
} }
if dir.x > 0 { if dir.x > 0 {
south += 1; south += 1;
pips_s pips_s
.entry((loc.x, loc.y)) .entry((loc.x, loc.y))
.and_modify(|pip_list: &mut Vec<(npnr::PipId, RwLock<Vec<npnr::IdString>>)>| { .and_modify(|pip_list: &mut Vec<(npnr::PipId, AtomicUsize)>| {
pip_list.push((pip, RwLock::new(Vec::new()))) pip_list.push((pip, AtomicUsize::new(0)))
}) })
.or_insert_with(|| vec![(pip, RwLock::new(Vec::new()))]); .or_insert_with(|| vec![(pip, AtomicUsize::new(0))]);
} }
if dir.y < 0 { if dir.y < 0 {
east += 1; east += 1;
pips_e pips_e
.entry((loc.x, loc.y)) .entry((loc.x, loc.y))
.and_modify(|pip_list: &mut Vec<(npnr::PipId, RwLock<Vec<npnr::IdString>>)>| { .and_modify(|pip_list: &mut Vec<(npnr::PipId, AtomicUsize)>| {
pip_list.push((pip, RwLock::new(Vec::new()))) pip_list.push((pip, AtomicUsize::new(0)))
}) })
.or_insert_with(|| vec![(pip, RwLock::new(Vec::new()))]); .or_insert_with(|| vec![(pip, AtomicUsize::new(0))]);
} }
if dir.y > 0 { if dir.y > 0 {
west += 1; west += 1;
pips_w pips_w
.entry((loc.x, loc.y)) .entry((loc.x, loc.y))
.and_modify(|pip_list: &mut Vec<(npnr::PipId, RwLock<Vec<npnr::IdString>>)>| { .and_modify(|pip_list: &mut Vec<(npnr::PipId, AtomicUsize)>| {
pip_list.push((pip, RwLock::new(Vec::new()))) pip_list.push((pip, AtomicUsize::new(0)))
}) })
.or_insert_with(|| vec![(pip, RwLock::new(Vec::new()))]); .or_insert_with(|| vec![(pip, AtomicUsize::new(0))]);
} }
} }
} }
@ -342,12 +342,11 @@ fn partition_nets(
let src_to_pip = let src_to_pip =
ctx.estimate_delay(source_wire, ctx.pip_src_wire(*pip)); ctx.estimate_delay(source_wire, ctx.pip_src_wire(*pip));
let pip_to_snk = ctx.estimate_delay(ctx.pip_dst_wire(*pip), sink_wire); let pip_to_snk = ctx.estimate_delay(ctx.pip_dst_wire(*pip), sink_wire);
let uses = uses.read().unwrap(); let uses = uses.load(std::sync::atomic::Ordering::Acquire);
let uses = uses.len() - (uses.contains(name) as usize);
(1000.0 * (src_to_pip + ((uses + 1) as f32) * pip_to_snk)) as u64 (1000.0 * (src_to_pip + ((uses + 1) as f32) * pip_to_snk)) as u64
}) })
.unwrap(); .unwrap();
pip_uses.write().unwrap().push(*name); pip_uses.fetch_add(1, std::sync::atomic::Ordering::Release);
let selected_pip = *selected_pip; let selected_pip = *selected_pip;
explored_pips.fetch_add(pips.len(), std::sync::atomic::Ordering::SeqCst); explored_pips.fetch_add(pips.len(), std::sync::atomic::Ordering::SeqCst);
@ -376,14 +375,13 @@ fn partition_nets(
let src_to_pip = let src_to_pip =
ctx.estimate_delay(source_wire, ctx.pip_src_wire(*pip)); ctx.estimate_delay(source_wire, ctx.pip_src_wire(*pip));
let pip_to_snk = ctx.estimate_delay(ctx.pip_dst_wire(*pip), sink_wire); let pip_to_snk = ctx.estimate_delay(ctx.pip_dst_wire(*pip), sink_wire);
let uses = uses.read().unwrap(); let uses = uses.load(std::sync::atomic::Ordering::Acquire);
let uses = uses.len() - (uses.contains(name) as usize);
(1000.0 * (src_to_pip + ((uses + 1) as f32) * pip_to_snk)) as u64 (1000.0 * (src_to_pip + ((uses + 1) as f32) * pip_to_snk)) as u64
}) })
.unwrap(); .unwrap();
pip_uses.write().unwrap().push(*name); pip_uses.fetch_add(1, std::sync::atomic::Ordering::Release);
let selected_pip = *selected_pip; let selected_pip = *selected_pip;
explored_pips.fetch_add(pips.len(), std::sync::atomic::Ordering::SeqCst); explored_pips.fetch_add(pips.len(), std::sync::atomic::Ordering::Relaxed);
let pip_loc = ctx.pip_location(selected_pip); let pip_loc = ctx.pip_location(selected_pip);
let src_to_pip = ((source.x, source.y), (pip_loc.x, pip_loc.y)); let src_to_pip = ((source.x, source.y), (pip_loc.x, pip_loc.y));
@ -394,7 +392,7 @@ fn partition_nets(
(false, true) => (Segment::Southeast, Segment::Southwest), (false, true) => (Segment::Southeast, Segment::Southwest),
(false, false) => (Segment::Southwest, Segment::Southeast), (false, false) => (Segment::Southwest, Segment::Southeast),
}; };
part_vert.fetch_add(1, std::sync::atomic::Ordering::SeqCst); part_vert.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
vec![(seg1, src_to_pip), (seg2, pip_to_dst)] vec![(seg1, src_to_pip), (seg2, pip_to_dst)]
} else { } else {
let middle = (x, split_line_over_x((source, sink_loc), x)); let middle = (x, split_line_over_x((source, sink_loc), x));
@ -410,14 +408,13 @@ fn partition_nets(
let src_to_pip = let src_to_pip =
ctx.estimate_delay(source_wire, ctx.pip_src_wire(*pip)); ctx.estimate_delay(source_wire, ctx.pip_src_wire(*pip));
let pip_to_snk = ctx.estimate_delay(ctx.pip_dst_wire(*pip), sink_wire); let pip_to_snk = ctx.estimate_delay(ctx.pip_dst_wire(*pip), sink_wire);
let uses = uses.read().unwrap(); let uses = uses.load(std::sync::atomic::Ordering::Acquire);
let uses = uses.len() - (uses.contains(name) as usize);
(1000.0 * (src_to_pip + ((uses + 1) as f32) * pip_to_snk)) as u64 (1000.0 * (src_to_pip + ((uses + 1) as f32) * pip_to_snk)) as u64
}) })
.unwrap(); .unwrap();
pip_uses.write().unwrap().push(*name); pip_uses.fetch_add(1, std::sync::atomic::Ordering::Release);
let horiz_pip = *horiz_pip; let horiz_pip = *horiz_pip;
explored_pips.fetch_add(pips.len(), std::sync::atomic::Ordering::SeqCst); explored_pips.fetch_add(pips.len(), std::sync::atomic::Ordering::Relaxed);
let middle = (split_line_over_y((source, sink_loc), y), y); let middle = (split_line_over_y((source, sink_loc), y), y);
let middle = (middle.0.clamp(1, ctx.grid_dim_x()-1), middle.1.clamp(1, ctx.grid_dim_y()-1)); let middle = (middle.0.clamp(1, ctx.grid_dim_x()-1), middle.1.clamp(1, ctx.grid_dim_y()-1));
@ -432,14 +429,13 @@ fn partition_nets(
let src_to_pip = let src_to_pip =
ctx.estimate_delay(source_wire, ctx.pip_src_wire(*pip)); ctx.estimate_delay(source_wire, ctx.pip_src_wire(*pip));
let pip_to_snk = ctx.estimate_delay(ctx.pip_dst_wire(*pip), sink_wire); let pip_to_snk = ctx.estimate_delay(ctx.pip_dst_wire(*pip), sink_wire);
let uses = uses.read().unwrap(); let uses = uses.load(std::sync::atomic::Ordering::Acquire);
let uses = uses.len() - (uses.contains(name) as usize);
(1000.0 * (src_to_pip + ((uses + 1) as f32) * pip_to_snk)) as u64 (1000.0 * (src_to_pip + ((uses + 1) as f32) * pip_to_snk)) as u64
}) })
.unwrap(); .unwrap();
pip_uses.write().unwrap().push(*name); pip_uses.fetch_add(1, std::sync::atomic::Ordering::Release);
let vert_pip = *vert_pip; let vert_pip = *vert_pip;
explored_pips.fetch_add(pips.len(), std::sync::atomic::Ordering::SeqCst); explored_pips.fetch_add(pips.len(), std::sync::atomic::Ordering::Relaxed);
let horiz_loc = ctx.pip_location(horiz_pip); let horiz_loc = ctx.pip_location(horiz_pip);
let horiz_is_east = horiz_loc.y < y; let horiz_is_east = horiz_loc.y < y;