awooter: atomics instead
This commit is contained in:
parent
1b80a559e2
commit
3931daefc7
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user