X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=blobdiff_plain;f=layout%2Fdata2safety;h=5c7df3702d3637d3f3f83d2857059d413f2f3acd;hb=98ba3b8e00a7c2e27528801ae891fa89c178c558;hp=4713b6bacc60d7c880091723295b7751fd7f3ce9;hpb=5e07c0177cb6a5bae05d4acab65c58c7ddbac90a;p=trains.git diff --git a/layout/data2safety b/layout/data2safety index 4713b6b..5c7df37 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -324,8 +324,8 @@ sub boob_used_bit ($$$) { return defined boob_used($boardnum,$obj,$kind) ? 1 : 0; } -sub so_boob ($$$) { - my ($kind,$mkused,$bo) = @_; +sub so_boob ($$$;$) { + my ($kind,$mkused,$bo, $objnum_rr) = @_; my ($type,$pi); if (defined $bo) { my ($board,$obj)= @$bo; @@ -338,17 +338,25 @@ sub so_boob ($$$) { " board type $type") unless defined $pi->[$obj]; $objnum= boob2objnum($board,$obj,$kind,$mkused); +#print "so_boob >$objnum_rr|$$objnum_rr< = $objnum\n"; + $$objnum_rr= $objnum; $pin_used{$kind}[$objnum]= [ $board, $pi->[$obj], $obj ] if $mkused; - return sprintf("%#4x /* %d.%-2d*/", $objnum, $board, $obj); + return sprintf("%#5x /* %d.%-2d*/", $objnum, $board, $obj); } else { +#print "so_boob >$objnum_rr|$$objnum_rr< -\n"; return " 0 /*none*/ "; } } -sub so_objboob ($$$) { - my ($kind,$mkused,$obj) = @_; - return so_boob($kind,$mkused, defined $obj ? $obj->{BoOb} : undef); +sub so_objboob ($$$;$) { + my ($kind,$mkused,$obj, $objnum_rr) = @_; +# return so_boob($kind,$mkused, defined $obj ? $obj->{BoOb} : undef ); +#print "so_objboob >$objnum_rr|$$objnum_rr<\n"; + return so_boob($kind,$mkused, + defined $obj ? $obj->{BoOb} : undef + , $objnum_rr + ); } sub mainread () { @@ -477,7 +485,9 @@ sub writeout () { } o("const SegmentNum info_nsegments=NUM_SEGMENTS;\n"); o("const SegmentInfo info_segments[NUM_SEGMENTS]= {"); + my (@sensemap,$segnum,$sensenum,$i,$j); $delim= ''; + $segnum= 0; foreach $seg (@segs) { $segr= $segs{$seg}; o("$delim\n"); @@ -485,12 +495,27 @@ sub writeout () { "\"$seg\",", $segr->{Inv}, $segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'), $segr->{Posns}, "spci_$seg,", - so_objboob('sense',1, $segr), + so_objboob('sense',1, $segr, \$sensenum), so_objboob('reverse',1, $segr->{Inv} ? $segr : undef)); $delim= ','; + o("/* sensmap[$sensenum]=$segnum */"); + $sensemap[$sensenum]= $segnum++; } o("\n};\n"); o("const BoardObject info_maxreverse= $maxreverseobjnum;\n"); + o("#define U -1\n"); + o("const SegmentNumInMap info_segmentmap[]= {\n"); + $i=0; $j=0; + foreach $seg (@sensemap) { + o(!$i ? ' ' : + (grep { $i == $_ } @sensesbase) ? ($j=0,"\n ") : + !(++$j % 30) ? ",\n " : + ","); + o($seg || 'U'); + $i++; + } + o("\n};\n". + "const int info_segmentmaplen= ".scalar(@sensemap).";\n"); } # writeasm_KIND()