Skip to content

Commit

Permalink
GateScheduleCanvasVisualizer: fix runtime error on Windows
Browse files Browse the repository at this point in the history
The "displayTime=..." line produced simtime overflow error,
because indexStart was bogus a huge positive integer.

It was computed as:

auto indexStart = (int)... * durations.size();

which is signed * unsigned multiplication, whose result was signed on Linux,
and unsigned on Windows.

Workaround: factor out durations.size() as int numDurations, to eliminate
mixed-sign multiplications in the code. Also, make indexStart / indexEnd
explicit signed int.
  • Loading branch information
avarga committed Aug 29, 2023
1 parent 8bcf8ce commit da115df
Showing 1 changed file with 6 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ void GateScheduleCanvasVisualizer::refreshGateVisualization(const GateVisualizat
auto durations = gate->getDurations();
bool open = gate->getInitiallyOpen();
clocktime_t scheduleDuration = 0;
for (size_t i = 0; i < durations.size(); i++)
int numDurations = (int)durations.size(); // make it signed, to avoid mixed-sign multiplications in the code below
for (int i = 0; i < numDurations; i++)
scheduleDuration += durations[i];
if (scheduleDuration == 0)
figure->addSchedule(0, width, open);
Expand All @@ -90,12 +91,12 @@ void GateScheduleCanvasVisualizer::refreshGateVisualization(const GateVisualizat
clocktime_t schedulePosition = std::fmod((currentTime + gate->getInitialOffset()).dbl(), scheduleDuration.dbl());
auto scheduleDisplayStart = schedulePosition - (currentTimePosition / width) * displayDuration;
auto scheduleDisplayEnd = scheduleDisplayStart + displayDuration;
int indexStart = (int)std::floor(scheduleDisplayStart.dbl() / scheduleDuration.dbl()) * durations.size();
int indexEnd = (int)std::ceil(scheduleDisplayEnd.dbl() / scheduleDuration.dbl()) * durations.size();
clocktime_t displayTime = currentTime - schedulePosition + indexStart / (int)durations.size() * scheduleDuration;
int indexStart = (int)std::floor(scheduleDisplayStart.dbl() / scheduleDuration.dbl()) * numDurations;
int indexEnd = (int)std::ceil(scheduleDisplayEnd.dbl() / scheduleDuration.dbl()) * numDurations;
clocktime_t displayTime = currentTime - schedulePosition + indexStart / numDurations * scheduleDuration;
figure->clearSchedule();
for (int i = indexStart; i <= indexEnd; i++) {
auto duration = durations[(i + durations.size()) % durations.size()];
auto duration = durations[(i + numDurations) % numDurations];
clocktime_t startTime = displayTime - currentTime;
clocktime_t endTime = displayTime + duration - currentTime;
double factor = width / displayDuration.dbl();
Expand Down

0 comments on commit da115df

Please sign in to comment.