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
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<<$_)" }
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 ($) {
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" };