chiark / gitweb /
really set polarity of interferers during resolution
authorian <ian>
Mon, 5 May 2008 11:23:49 +0000 (11:23 +0000)
committerian <ian>
Mon, 5 May 2008 11:23:49 +0000 (11:23 +0000)
hostside/resolve.c

index 151c471d0232053d79e3534336169ff5e865c036..0c5c55c749250454d27e66c3431673d6b2133081 100644 (file)
@@ -171,6 +171,16 @@ static int resmain_getmovpos(TrackLocation *t, TrackAdvanceContext *c,
   return 0;
 }
 
+static MovPosComb just_getmovpos(Segment *d, TrackAdvanceContext *tac) {
+  MovPosComb target;
+  TrackLocation tloc;
+  int r;
+
+  tloc.seg= d;
+  r= resmain_getmovpos(&tloc,tac,&target);  assert(!r);
+  return target;
+}
+
 static int resolve_complete_main(void) {
   int problems, phase, nextphase;
   TRAIN_ITERVARS(t);
@@ -310,28 +320,28 @@ static int resolve_complete_main(void) {
     }
   }
     
-  TrackLocation tloc;
+  if (problems) return problems;
+
   TrackAdvanceContext tac;
-  Segment *interferer;
+  MovPosComb target;
   tac.getmovpos= resmain_getmovpos;
-  int r;
 
   FOR_SEGMENT(d,NOOP,NOOP) {
     if (problems) return problems;
-    tloc.seg= d;
 
     d->iselem_u= 0;
 
-    interferer= segment_interferes(&tac,d);
-    if (interferer && interferer->i->invertible) {
-      actual_inversions_start();
-      interferer->seg_inverted= d->seg_inverted;
-      actual_inversions_segment(interferer);
-      actual_inversions_done();
-    }
+    target= just_getmovpos(d,&tac);
 
-    MovPosComb target;
-    r= resmain_getmovpos(&tloc,&tac,&target);  assert(!r);
+    if (d->i->invertible && target<0) {
+      Segment *interferer= segment_interferes(&tac,d);
+      if (interferer) {
+       actual_inversions_start();
+       d->seg_inverted= interferer->seg_inverted;
+       actual_inversions_segment(d);
+       actual_inversions_done();
+      }
+    }
 
     if (d->i->n_poscombs>1) {
       d->movposcomb= -1;