chiark / gitweb /
set polarity of interferers during resolution (involves breaking out resmain_getmovpos)
authorian <ian>
Mon, 5 May 2008 11:12:57 +0000 (11:12 +0000)
committerian <ian>
Mon, 5 May 2008 11:12:57 +0000 (11:12 +0000)
hostside/resolve.c

index 1909396c13600efaf76c688f8e145beb687afb27..151c471d0232053d79e3534336169ff5e865c036 100644 (file)
  */
 #define iselem_u mark0
 
+static int resmain_getmovpos(TrackLocation *t, TrackAdvanceContext *c,
+                            MovPosComb *use_io) {
+  Segment *d= t->seg;
+
+  if (d->home && d->home->resolution == RR_H) {
+    d->tr_backwards= d->ho_backwards;
+    *use_io= 0; /* a bit kludgey */
+  } else if (d->owner) {
+    d->tr_backwards ^= d->owner->backwards;
+    *use_io= d->movposcomb;
+  } else {
+    *use_io= -1;
+  }
+  return 0;
+}
+
 static int resolve_complete_main(void) {
   int problems, phase, nextphase;
   TRAIN_ITERVARS(t);
@@ -294,22 +310,29 @@ static int resolve_complete_main(void) {
     }
   }
     
+  TrackLocation tloc;
+  TrackAdvanceContext tac;
+  Segment *interferer;
+  tac.getmovpos= resmain_getmovpos;
+  int r;
+
   FOR_SEGMENT(d,NOOP,NOOP) {
-    if (problems)
-      return problems;
+    if (problems) return problems;
+    tloc.seg= d;
 
     d->iselem_u= 0;
 
-    MovPosComb target= -1;
-
-    if (d->home && d->home->resolution == RR_H) {
-      d->tr_backwards= d->ho_backwards;
-      target= 0; /* a bit kludgey */
-    } else if (d->owner) {
-      d->tr_backwards ^= d->owner->backwards;
-      target= d->movposcomb;
+    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();
     }
 
+    MovPosComb target;
+    r= resmain_getmovpos(&tloc,&tac,&target);  assert(!r);
+
     if (d->i->n_poscombs>1) {
       d->movposcomb= -1;
       if (target >= 0) {