chiark / gitweb /
compute cycles etc. in perl, not asm ifdefs (wip)
authorian <ian>
Mon, 19 Dec 2005 11:58:38 +0000 (11:58 +0000)
committerian <ian>
Mon, 19 Dec 2005 11:58:38 +0000 (11:58 +0000)
detpic/Makefile
detpic/make-clocks

index 9617b978e8dad2a8367a7f5048882dc958924936..3636637d395dc0685de4168b32962d07a872ca93 100644 (file)
@@ -33,6 +33,6 @@ syncwrite.asm:        ../iwjpictest/syncwrite.asm
                cp $< $@
 
 %+clocks.inc:  make-clocks %.clocks
-               ./$+ $o
+               ./$+ $(CLOCKS) $o
 
 clean:         manypic-clean
index a121e62825fadfcf264656bceb7bdbe183706a46..b8708b144ab1b170684c4f306b587cbf27aa0056 100755 (executable)
@@ -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" };