use Data::Dumper;
use POSIX;
+sub xdata ($) {
+ my ($cb) = @_;
+ foreach my $count (qw(1 2 3)) {
+ foreach my $nspots (qw(1 2 3 4)) {
+ $_ = $cb->($count,$nspots)."\t".$_;
+ }
+ }
+}
+
$_=<DATA>; chomp or die;
+xdata sub {
+ my ($xcount,$xnspots) = @_;
+ "${xcount}x". (qw(X One Two Three Four)[$xnspots]);
+};
our @names = split /\t/, $_;
our %count;
foreach my $nspots (qw(1 2 3 4)) {
$_=<DATA>; chomp or die;
+ xdata sub {
+ my ($xcount,$xnspots) = @_;
+ $xnspots == $nspots and $xcount;
+ };
my @l = split /\t/, $_;
foreach my $i (0..$#names) { $count{$names[$i]}{$nspots} = $l[$i] || 0; }
}
s{^}{// }mg;
our $name;
+our $total_count;
+our $total_real_count;
+our $max_nrows=0;
+our $max_rowsz=0;
sub wrtoplevel () {
print "module $name(){ ////toplevel\n";
my $total = 0; $total += $_ foreach values %$cs;
my $rowsz = ceil(sqrt($total));
my $nrows = ceil($total / $rowsz);
+ $total_count += $total;
+ $total_real_count += $total if $name =~ m/^[A-Z][a-z]+$/;
+ $max_nrows = $nrows if $nrows > $max_nrows;
+ $max_rowsz = $rowsz if $rowsz > $max_rowsz;
my $ix = 0;
- print "// total=$total, rowsz=$rowsz, nrows=$nrows\n";
+ print "// $name: total=$total, rowsz=$rowsz, nrows=$nrows\n";
foreach my $nspots (sort keys %$cs) {
my $c = $cs->{$nspots};
print <<END;
union(){
- Frame(\$phase, token_pitch * [ $rowsz + 0.5, $nrows ]);
+ Frame(\$phase, token_pitch * [ $rowsz + 1.00, $nrows + 0.50 ]);
\$nspots = $nspots;
END
while ($c--) {
wrtoplevel();
}
+print <<END;
+// total_count=$total_count total_real_count=$total_real_count
+// max_rowsz=$max_rowsz max_nrows=$max_nrows
+END
+
STDOUT->error and die $!;
__DATA__