chiark / gitweb /
cope with X1/X2 opposing interference
authorian <ian>
Mon, 5 May 2008 11:49:46 +0000 (11:49 +0000)
committerian <ian>
Mon, 5 May 2008 11:49:46 +0000 (11:49 +0000)
hostside/resolve.c
hostside/safety.c
layout/data2safety
layout/layout-data.h
layout/ours.wiring

index 0c5c55c749250454d27e66c3431673d6b2133081..7fdd39d4257fcd59a41c95d267ce0aeb51e9101a 100644 (file)
@@ -337,7 +337,8 @@ static int resolve_complete_main(void) {
       Segment *interferer= segment_interferes(&tac,d);
       if (interferer) {
        actual_inversions_start();
-       d->seg_inverted= interferer->seg_inverted;
+       d->seg_inverted= interferer->seg_inverted
+           ^ d->i->interferes_polarity_opposed;
        actual_inversions_segment(d);
        actual_inversions_done();
       }
index d21a05d3de2bdb5fd57c341d22d35e5862a8195f..803512eaad448bc047c7b484a1e145ad046965d2 100644 (file)
@@ -787,9 +787,8 @@ ErrorCode predict(Train *tra, int accelerate,
        Segment *interferer= segment_interferes(0,seg);
        if (interferer && !interferer->will_polarise &&
            interferer->i->invertible) {
-         /* no provision for interfering invertible segments
-          * with opposing ideas about neutral polarity */
-         interferer->seg_inverted= seg->seg_inverted;
+         interferer->seg_inverted= seg->seg_inverted
+           ^ seg->i->interferes_polarity_opposed;
          actual_inversions_segment(interferer);
        }
       } else {
index febe24320e233a676fb9048cdd4b0e695d65d48b..21e6b4d26b5493e0fa2f0c77bf9df0fdbbad2c76 100755 (executable)
@@ -26,8 +26,9 @@ our (%segs);
 # $segs{$seg}{Ends}[$combpos][$end] = [ $node,$side ]
 # $segs{$seg}{Dist}[$combpos]
 
-our (@interferences);
-# $interferences[][] = "$seg/$posre"   "/.*" added during parsing if necc.
+our (@interfs);
+# $interfs[]{Invert} = $invert 
+# $interfs[]{Segs}[] = "$seg/$posre"   "/.*" added during parsing if necc.
 
 our (%nodes);
 # $nodes{$node}[$side]{Seg}
@@ -191,9 +192,17 @@ sub begin_interferences () {
 sub line_interferences () {
     s/^\s+// or return syntaxerror();
     my ($is) = [ split /\s+/, $_ ];
-    map { s,$,/.*, unless m,/,; } @$is;
+    my ($invert)= 0;
+    if ($is->[0] eq '-') {
+       shift @$is;
+       $invert= 1;
+    }
+    map {
+       $invert ^= 1 if s/^\-//;
+       s,$,/.*, unless m,/,;
+    } @$is;
     return syntaxerror() if grep { !m,^\w+/, } @$is;
-    push @interferences, $is;
+    push @interfs, { Invert => $invert, Segs => $is };
 }
 
 sub mistake ($) {
@@ -393,7 +402,8 @@ sub so_boob ($$$;$) {
        $$objnum_rr= $objnum;
        $pin_used{$kind}[$objnum]= [ $board, $pi->[$obj], $obj ]
            if $mkused;
-       return sprintf("%#5x /* %d.%-2d*/", $objnum, $board, $obj);
+       return sprintf("%#5x /* %d.%-*d*/", $objnum, $board,
+                      $kind eq 'reverse' ? 1 : 2, $obj);
     } else {
 #print "so_boob >$objnum_rr|$$objnum_rr< -\n";
        return "    0 /*none*/ ";
@@ -456,7 +466,7 @@ sub writeout () {
     my (@segs,$segn,$seg,$segr,$pt,$ptv, $delim);
     my ($comb,$pi,$feat,$featr,$end,$boob);
     my ($node,$side,$otherend,$nodeotherside,$otherseg,$otherbackrelus);
-    my ($ourinter,$pcname,$inter,$intother);
+    my ($ourinter,$pcname,$intere,$intother);
     o("/* autogenerated - do not edit */\n\n");
     @segs=();
     for $seg (sort { nummap($a) cmp nummap($b) } keys %segs) {
@@ -483,6 +493,7 @@ sub writeout () {
        $delim='';
 
        $segr->{Inter}{Map}= 0;
+       $segr->{Inter}{Invert}= 0;
        $ourinter= $segr->{Inter};
        for ($comb=0; $comb < $segr->{Posns}; $comb++) {
            $pi='';
@@ -520,7 +531,8 @@ sub writeout () {
            $delim= ',';
 
            $pcname= "$seg/$pi";
-           for $inter (@interferences) {
+           for $intere (@interfs) {
+               my ($inter)= $intere->{Segs};
                next unless grep {
                    if ($pcname =~ m/^$_$/) {
                        s,/.*,/ ?,; 1;
@@ -539,6 +551,7 @@ sub writeout () {
                                       "involving $seg, $1, $ourinter->{Seg}");
                    } else {
                        $ourinter->{Seg}= $1;
+                       $ourinter->{Invert}= $intere->{Invert};
                    }
                }
                endmistake("unsupported too-moveable interference")
@@ -575,10 +588,10 @@ sub writeout () {
        }
        o("\n};\n");
     }
-    for $inter (@interferences) {
+    for $intere (@interfs) {
        map {
            warn "warning: unused interference specification $_\n" unless m, ,;
-       } @$inter;
+       } @{ $intere->{Segs} };
     }
 
     my (@sensemap,$sensenum,$i);
@@ -589,20 +602,20 @@ sub writeout () {
     foreach $seg (@segs) {
        $segr= $segs{$seg};
        o("$delim\n");
-       o(sprintf " { %-7s%d,%2d,%-9s%d,%-10s%-6s,%-7s",
-         "\"$seg\",",$segr->{Inv},
+       o(sprintf " { %-7s%d,%d,%2d,%-9s%d,%-10s%-6s,%-7s",
+         "\"$seg\",",$segr->{Inv},$segr->{Inter}{Invert},
          $segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'),
          $segr->{Posns}, "spci_$seg,",
          so_objboob('sense',1, $segr, \$sensenum),
          so_objboob('reverse',1, $segr->{Inv} ? $segr : undef).',');
        $ourinter= $segr->{Inter};
        if (defined $ourinter->{Seg}) {
-           o(sprintf "%5s,0%o", so_segnum($ourinter->{Seg}),
+           o(sprintf "%4s,0%o ", so_segnum($ourinter->{Seg}),
              $ourinter->{Map});
        } else {
-           o(" -1");
+           o(" -1 ");
        }
-       o(" }");
+       o("}");
        $delim= ',';
        $sensemap[$sensenum]= $seg;
        $segnum++;
index 82b581f5f294571945802c3dfb6713b0877ec2c2..8952f3f7c6baa03569f27294515029a574b8e696 100644 (file)
@@ -53,7 +53,7 @@ typedef struct {
 
 typedef struct {
   const char *pname;
-  unsigned invertible:1;
+  unsigned invertible:1, interferes_polarity_opposed:1;
   Small n_movfeats;
   const MovFeatInfo *movfeats;
   MovPosComb n_poscombs;
index 77f62228017398c4879323ea4c5f1e146fe4933c..604cdd2ca1cba50e02a37c1eeae562b68260faa6 100644 (file)
@@ -39,7 +39,7 @@ fixed
        A2/P0
 
 interferences
-       X1 X2
+       X1 X2
        A5/P0J1 A6/P0J1
 
 endwiring