# ie cycles = interval * foscscale * msclock / prescale
# or msclock = cycles * prescale / (foscscale * interval)
-sub scaleable ($$$$$) {
- my ($width, $foscscale, $scalebitnums, $scales, $deadcycles) = @_;
+sub scaleable ($$$$$$) {
+ my ($width, $foscscale, $scalebitnums, $scales,
+ $deadcycles, $overflowp) = @_;
my ($maxcycles, $scalespec, $scalebits);
my ($cycles, $cyequ, @scalebits);
my ($prescale);
$maxcycles = (1 << $width) - $deadcycles;
foreach $scalespec (@$scales) {
- $scalespec =~ m/^(\d+)\:([01]+)$/;
+ $scalespec =~ m/^0*(\d+)\-([01]+)$/;
($prescale,$scalebits) = ($1,$2);
length($scalebits) == @$scalebitnums
or die "$scalespec @$scalebitnums";
$cyequ= "${name}cycles";
p(sprintf "%s equ %d\n", $cyequ, $cycles);
- if ($width == 16) {
- p("${name}inith equ $cyequ / 256\n");
- p("${name}initl equ $cyequ & 255\n");
- } elsif ($width == 8) {
- p("${name}init equ $cyequ\n");
- } else {
- die "$width";
+ if ($overflowp) {
+ p("${name}init equ ".(1<<$width)." - $cyequ\n");
+ if ($width == 16) {
+ p("${name}inith equ ${name}init / 256\n");
+ p("${name}initl equ ${name}init & 255\n");
+ }
}
return;
}
warn "clock speed too high for $name\n";
}
+sub do_T2period {
+ my (@scales, $pre, $prex, $prebits, $posti, $this);
+ for $pre (qw(1-00 4-01 16-10)) {
+ $pre =~ m/^(\d+)\-([01]+)$/;
+ ($prex,$prebits) = ($1,$2);
+ for ($posti=0; $posti<15; $posti++) {
+ $this= sprintf "%03d-%s%04b", $prex * ($posti+1), $prebits, $posti;
+ push @scales, $this;
+ }
+ }
+ local ($name) = "${name}_t2";
+ scaleable(8, 250.0, [qw(T2CKPS1 T2CKPS0 TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0)],
+ [ sort @scales ], 0, 0);
+}
+
sub do_T13ov ($) {
my ($n) = @_;
local ($name) = "${name}_t${n}";
scaleable(16, 250.0, ["T${n}CKPS1","T${n}CKPS0"],
- [qw(1:00 2:01 4:10 8:11)], 1);
+ [qw(1-00 2-01 4-10 8-11)], 1, 1);
}
sub do_T0ov ($) {
my ($w) = @_;
local ($name) = "${name}_t0";
scaleable($w, 250.0, ["PSA","T0PS2","T0PS1","T0PS0"],
- [qw(1:1000 2:0000 4:0001 8:0010 16:0011
- 32:0100 64:0101 128:0110 256:0111)], 1);
+ [qw(1-1000 2-0000 4-0001 8-0010 16-0011
+ 32-0100 64-0101 128-0110 256-0111)], 1, 1);
}
-sub do_T0ov8 { do_T0ov(8); }
sub do_T0ov16 { do_T0ov(16); }
sub do_T1ov { do_T13ov(1); }
sub do_T3ov { do_T13ov(3); }