From 8424dc79d2555ce6b070371c9a5fb11aa76e950d Mon Sep 17 00:00:00 2001 From: YRabbit Date: Thu, 29 Dec 2022 11:17:45 +1000 Subject: gowin: correct the delay calculation And do a full enumeration when searching for a delay because it is not yet clear whether the orderliness of the vector is guaranteed. Signed-off-by: YRabbit --- gowin/arch.cc | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/gowin/arch.cc b/gowin/arch.cc index 8c908b04..40570af7 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -698,17 +698,28 @@ template const T *genericLookup(const T *first, int len, cons } } +template const T *timingLookup(const T *first, int len, const T val, C compare) +{ + for (int i = 0; i < len; ++i) { + auto res = &first[i]; + if (!(compare(*res, val) || compare(val, *res))) { + return res; + } + } + return nullptr; +} + DelayQuad delayLookup(const TimingPOD *first, int len, IdString name) { TimingPOD needle; needle.name_id = name.index; - const TimingPOD *timing = genericLookup(first, len, needle, timingCompare); + const TimingPOD *timing = timingLookup(first, len, needle, timingCompare); DelayQuad delay; if (timing != nullptr) { - delay.fall.max_delay = std::max(timing->ff, timing->rf) / 1000; - delay.fall.min_delay = std::min(timing->ff, timing->rf) / 1000; - delay.rise.max_delay = std::max(timing->rr, timing->fr) / 1000; - delay.rise.min_delay = std::min(timing->rr, timing->fr) / 1000; + delay.fall.max_delay = std::max(timing->ff, timing->rf) / 1000.; + delay.fall.min_delay = std::min(timing->ff, timing->rf) / 1000.; + delay.rise.max_delay = std::max(timing->rr, timing->fr) / 1000.; + delay.rise.min_delay = std::min(timing->rr, timing->fr) / 1000.; } else { delay = DelayQuad(0); } -- cgit v1.2.3