properly calculate final delay
This commit is contained in:
parent
3cec25db6c
commit
50aae5935d
@ -128,7 +128,7 @@ impl PartialOrd for QueuedWire {
|
|||||||
|
|
||||||
struct PerNetData {
|
struct PerNetData {
|
||||||
wires: HashMap<WireId, (PipId, u32)>,
|
wires: HashMap<WireId, (PipId, u32)>,
|
||||||
done_sinks: HashMap<WireId, f32>,
|
done_sinks: HashSet<WireId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PerWireData {
|
struct PerWireData {
|
||||||
@ -185,7 +185,7 @@ impl Router {
|
|||||||
for _ in 0..nets.len() {
|
for _ in 0..nets.len() {
|
||||||
self.nets.push(PerNetData {
|
self.nets.push(PerNetData {
|
||||||
wires: HashMap::new(),
|
wires: HashMap::new(),
|
||||||
done_sinks: HashMap::new(),
|
done_sinks: HashSet::new(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,10 +380,8 @@ impl Router {
|
|||||||
self.dirty_wires.push(source_wire);
|
self.dirty_wires.push(source_wire);
|
||||||
self.dirty_wires.push(sink_wire);
|
self.dirty_wires.push(sink_wire);
|
||||||
|
|
||||||
let mut delay = 0.0;
|
if let Some(_) = nd.done_sinks.get(&arc.get_sink_wire()) {
|
||||||
if let Some(old_delay) = nd.done_sinks.get(&arc.get_sink_wire()) {
|
|
||||||
found_meeting_point = Some(*self.wire_to_idx.get(&arc.sink_wire).unwrap());
|
found_meeting_point = Some(*self.wire_to_idx.get(&arc.sink_wire).unwrap());
|
||||||
delay = *old_delay;
|
|
||||||
|
|
||||||
let source = arc.get_source_wire();
|
let source = arc.get_source_wire();
|
||||||
let mut wire = arc.get_sink_wire();
|
let mut wire = arc.get_sink_wire();
|
||||||
@ -494,7 +492,6 @@ impl Router {
|
|||||||
}
|
}
|
||||||
|
|
||||||
found_meeting_point = Some(sink);
|
found_meeting_point = Some(sink);
|
||||||
delay = sum_delay;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,10 +499,9 @@ impl Router {
|
|||||||
|
|
||||||
if false && verbose {
|
if false && verbose {
|
||||||
log_info!(
|
log_info!(
|
||||||
" bwd: {}: -> {} @ ({}, {}, {}) = {}\n",
|
" bwd: {}: -> {} ({}, {}) = {}\n",
|
||||||
ctx.name_of_pip(pip).to_str().unwrap(),
|
ctx.name_of_pip(pip).to_str().unwrap(),
|
||||||
ctx.name_of_wire(ctx.pip_dst_wire(pip)).to_str().unwrap(),
|
ctx.name_of_wire(ctx.pip_dst_wire(pip)).to_str().unwrap(),
|
||||||
delay,
|
|
||||||
congest,
|
congest,
|
||||||
criticality,
|
criticality,
|
||||||
qw.score()
|
qw.score()
|
||||||
@ -613,7 +609,6 @@ impl Router {
|
|||||||
}
|
}
|
||||||
|
|
||||||
found_meeting_point = Some(source);
|
found_meeting_point = Some(source);
|
||||||
delay = sum_delay;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -621,10 +616,9 @@ impl Router {
|
|||||||
|
|
||||||
if false && verbose {
|
if false && verbose {
|
||||||
log_info!(
|
log_info!(
|
||||||
" bwd: {}: -> {} @ ({}, {}, {}) = {}\n",
|
" bwd: {}: -> {} @ ({}, {}) = {}\n",
|
||||||
ctx.name_of_pip(pip).to_str().unwrap(),
|
ctx.name_of_pip(pip).to_str().unwrap(),
|
||||||
ctx.name_of_wire(ctx.pip_dst_wire(pip)).to_str().unwrap(),
|
ctx.name_of_wire(ctx.pip_dst_wire(pip)).to_str().unwrap(),
|
||||||
delay,
|
|
||||||
congest,
|
congest,
|
||||||
criticality,
|
criticality,
|
||||||
qw.score()
|
qw.score()
|
||||||
@ -685,6 +679,8 @@ impl Router {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut calculated_delay = 0.0;
|
||||||
|
|
||||||
while wire != source_wire {
|
while wire != source_wire {
|
||||||
if verbose {
|
if verbose {
|
||||||
println!(
|
println!(
|
||||||
@ -705,6 +701,12 @@ impl Router {
|
|||||||
wire
|
wire
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let node_delay = ctx.pip_delay(pip)
|
||||||
|
+ ctx.wire_delay(self.flat_wires[wire as usize].wire)
|
||||||
|
+ ctx.delay_epsilon();
|
||||||
|
calculated_delay += node_delay;
|
||||||
|
|
||||||
self.bind_pip_internal(arc.net(), wire, pip);
|
self.bind_pip_internal(arc.net(), wire, pip);
|
||||||
wire = *self.wire_to_idx.get(&ctx.pip_src_wire(pip)).unwrap();
|
wire = *self.wire_to_idx.get(&ctx.pip_src_wire(pip)).unwrap();
|
||||||
}
|
}
|
||||||
@ -714,14 +716,20 @@ impl Router {
|
|||||||
assert!(pip != PipId::null());
|
assert!(pip != PipId::null());
|
||||||
// do note that the order is inverted from the fwd loop
|
// do note that the order is inverted from the fwd loop
|
||||||
wire = *self.wire_to_idx.get(&ctx.pip_dst_wire(pip)).unwrap();
|
wire = *self.wire_to_idx.get(&ctx.pip_dst_wire(pip)).unwrap();
|
||||||
|
|
||||||
|
let node_delay = ctx.pip_delay(pip)
|
||||||
|
+ ctx.wire_delay(self.flat_wires[wire as usize].wire)
|
||||||
|
+ ctx.delay_epsilon();
|
||||||
|
calculated_delay += node_delay;
|
||||||
|
|
||||||
self.bind_pip_internal(arc.net(), wire, pip);
|
self.bind_pip_internal(arc.net(), wire, pip);
|
||||||
}
|
}
|
||||||
let nd = &mut self.nets[arc.net().into_inner() as usize];
|
let nd = &mut self.nets[arc.net().into_inner() as usize];
|
||||||
nd.done_sinks.insert(arc.get_sink_wire(), delay);
|
nd.done_sinks.insert(arc.get_sink_wire());
|
||||||
|
|
||||||
self.reset_wires();
|
self.reset_wires();
|
||||||
|
|
||||||
delay
|
calculated_delay
|
||||||
}
|
}
|
||||||
|
|
||||||
fn was_visited_fwd(&self, wire: u32) -> bool {
|
fn was_visited_fwd(&self, wire: u32) -> bool {
|
||||||
|
Loading…
Reference in New Issue
Block a user