From: ian Date: Mon, 19 Dec 2005 11:58:38 +0000 (+0000) Subject: compute cycles etc. in perl, not asm ifdefs (wip) X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=9e09060e61511124d6bf081c622fe4c524147521;p=trains.git compute cycles etc. in perl, not asm ifdefs (wip) --- diff --git a/detpic/Makefile b/detpic/Makefile index 9617b97..3636637 100644 --- a/detpic/Makefile +++ b/detpic/Makefile @@ -33,6 +33,6 @@ syncwrite.asm: ../iwjpictest/syncwrite.asm cp $< $@ %+clocks.inc: make-clocks %.clocks - ./$+ $o + ./$+ $(CLOCKS) $o clean: manypic-clean diff --git a/detpic/make-clocks b/detpic/make-clocks index a121e62..b8708b1 100755 --- a/detpic/make-clocks +++ b/detpic/make-clocks @@ -3,6 +3,14 @@ use strict qw(vars); use POSIX; +our (%defs); +while ($ARGV[$#ARGV] =~ m/^\-/) { + $_ = pop @argv; + last if m/^\-\-$/; + die unless m/^\-D(\w+)\=(\w+)$/; + $defs{$1}= $2; +} + our ($name,$ms,$interval,$msclock); # $interval is in seconds # mclock or sclock is in kHz @@ -17,19 +25,19 @@ sub p ($) { print $_[0] or die $!; } sub scaleable ($$$$$) { my ($width, $foscscale, $scalebitnums, $scales, $deadcycles) = @_; - my ($maxcycles, $scalespec, $scalebits, $maxmsclock); - my ($lastmaxmsclock, $cycles_per_msclock, $cyclesexpr, @scalebits); - my ($prescale, $shift); + my ($maxcycles, $scalespec, $scalebits); + my ($cycles, $cyequ, @scalebits); + my ($prescale); $maxcycles = (1 << $width) - $deadcycles; foreach $scalespec (@$scales) { $scalespec =~ m/^(\d+)\:([01]+)$/; ($prescale,$scalebits) = ($1,$2); length($scalebits) == @$scalebitnums or die "$scalespec @$scalebitnums"; - $maxmsclock= floor($maxcycles * $prescale / ($foscscale * $interval)); - p(" if"); - p(" $msclock > $lastmaxmsclock &&") if defined $lastmaxmsclock; - p(" $msclock <= $maxmsclock\n"); + + $cycles= $interval * $foscscale * $msclock / $prescale; + next if $cycles > $maxcycles; + if (length($scalebits)) { p("${name}scale equ "); @scalebits = (map { "(1<<$_)" } @@ -39,26 +47,20 @@ sub scaleable ($$$$$) { p(join '|', @scalebits); p("; $prescale:1\n"); } - $cycles_per_msclock = $interval * $foscscale / $prescale; - $shift = 31 - ceil(log($maxmsclock * $cycles_per_msclock) / log(2.0)); - p(sprintf "%scycles equ (%s * %d) >> %d\n", - $name, $msclock, $cycles_per_msclock * (1<<$shift), $shift); - $cyclesexpr= sprintf("(%d - %scycles)", - (1<<$width) - $deadcycles, $name); + + $cyequ= "${name}cycles"; + p(sprintf "%s equ %d\n", $cyequ, $cycles); if ($width == 16) { - p("${name}inith equ $cyclesexpr / 256\n"); - p("${name}initl equ $cyclesexpr & 255\n"); + p("${name}inith equ $cyequ / 256\n"); + p("${name}initl equ $cyequ & 255\n"); } elsif ($width == 8) { - p("${name}init equ $cyclesexpr\n"); + p("${name}init equ $cyequ\n"); } else { die "$width"; } - p(" endif\n"); - $lastmaxmsclock= $maxmsclock; + return; } - p(" if $msclock > $lastmaxmsclock\n"); - p(" error \"clock speed too high for $name\"\n"); - p(" endif\n"); + warn "clock speed too high for $name\n"; } sub do_T13ov ($) { @@ -98,6 +100,8 @@ sub doline () { foreach $ms (qw(m s)) { next unless $mswant =~ m/$ms/i; $msclock= "${ms}clock"; + die $msclock unless exists $defs{$msclock}; + $msclock= $defs{$msclock}; $name = $orgname.'_'.($ms eq 'm' ? 'master' : 'slave'); p(";---------- $name ----------\n"); &{ "do_$how" };