aboutsummaryrefslogtreecommitdiffstats
path: root/ice40/arch.cc
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2018-08-04 16:54:12 +0200
committerClifford Wolf <clifford@clifford.at>2018-08-04 16:54:12 +0200
commit31fe52581b34e58189310637ef55b82041c1e04a (patch)
treed389eda9bba44b35d0960706bfee8455f9eaf8c3 /ice40/arch.cc
parentbd36cc12755e4c90cfdaaa593e5af31c5ba38fa5 (diff)
downloadnextpnr-31fe52581b34e58189310637ef55b82041c1e04a.tar.gz
nextpnr-31fe52581b34e58189310637ef55b82041c1e04a.tar.bz2
nextpnr-31fe52581b34e58189310637ef55b82041c1e04a.zip
Add generation of models to tmfuzz
Signed-off-by: Clifford Wolf <clifford@clifford.at>
Diffstat (limited to 'ice40/arch.cc')
-rw-r--r--ice40/arch.cc30
1 files changed, 30 insertions, 0 deletions
diff --git a/ice40/arch.cc b/ice40/arch.cc
index d44d8c19..3b9a6992 100644
--- a/ice40/arch.cc
+++ b/ice40/arch.cc
@@ -651,6 +651,7 @@ delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const
return 250;
}
+#if 1
int xd = sink_loc.x - driver_loc.x, yd = sink_loc.y - driver_loc.y;
int xscale = 120, yscale = 120, offset = 0;
@@ -665,6 +666,35 @@ delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const
offset += 260;
return xscale * abs(xd) + yscale * abs(yd) + offset;
+#else
+ float model1_param_offset = 902.1066988;
+ float model1_param_norm1 = 169.80428447;
+ float model1_param_norm2 = -503.28635487;
+ float model1_param_norm3 = 402.96583807;
+
+ float model2_param_offset = -1.09578873e+03;
+ float model2_param_linear = 5.01094876e-01;
+ float model2_param_sqrt = 4.71761281e+01;
+
+ float dx = fabsf(sink_loc.x - driver_loc.x);
+ float dy = fabsf(sink_loc.y - driver_loc.y);
+ float norm1 = dx + dy;
+
+ float dx2 = dx * dx;
+ float dy2 = dy * dy;
+ float norm2 = sqrtf(dx2 + dy2);
+
+ float dx3 = dx2 * dx;
+ float dy3 = dy2 * dy;
+ float norm3 = powf(dx3 + dy3, 1.0/3.0);
+
+ float v = model1_param_offset;
+ v += model1_param_norm1 * norm1;
+ v += model1_param_norm2 * norm2;
+ v += model1_param_norm3 * norm3;
+
+ return model2_param_offset + model2_param_linear * v + model2_param_sqrt * sqrtf(v);
+#endif
}
delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const