summaryrefslogtreecommitdiff
path: root/cesar/common/tools/vcd-trace
blob: d669b5de739ac9b7c29023151e5583e290500fc2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/perl
use strict;
use warnings;

sub date
{
    my ($date, $offset) = (@_, 0);
    print '#' . ($offset + hex $date) . "\n";
}

my $sta = 'sta';
$sta = $ARGV[0] if defined $ARGV[0];

my $header = <<EOF;
\$version trace2vcd \$end
\$timescale 40 ns \$end
\$scope module $sta \$end
\$var real 1 ! medium \$end
\$var real 1 < rx \$end
\$var real 1 > tx \$end
\$upscope \$end
\$enddefinitions \$end
\$dumpvars
sIDLE !
sIDLE <
sIDLE >
\$end
EOF

my $pre = [ 'PRE', 1280 ];
my $pre10 = [ 'PRE', 1152 ];
my $fc = [ 'FC', 1482 ];
my $fc10 = [ 'FC10', 964 ];
my %pf = (
    '0' => [ $pre10, $fc10, $fc ],
    '1' => [ $pre10, $fc10, $fc, $fc ],
    '2' => [ $pre, $fc ],
    '3' => [ $pre, $fc, $fc ],
);
my $pre_detect_delay_tck = 500;

my ($dx417, $dx567, $dx3534) = (1163, 1213, 2202);
my %dx = ('0' => $dx417, '1' => $dx567, '2' => $dx3534);
my %gilpmod = ('0' => '0', '1' => '0', '2' => '1');

my $rx_fc_mode = '0';
my @fc_end_date;
my %tx_param;
my $tx_symb_nb;

print $header;

while (<>)
{
    chomp;
    s/\r$//;
    if (/^\[.\] rx param mode=(.+)$/) {
	$rx_fc_mode = $1;
    } elsif (/^\[(.+)\]  prp([01])$/) {
	date ($1);
	print "sPRP$2 !\n";
    } elsif (/^\[(.+)\]  slot count=(.+)$/ && $2 > 1) {
	date ($1);
	print "sCW$2 !\n";
    } elsif (/^\[(.+)\]  pre detect$/) {
	date ($1, -$pre_detect_delay_tck);
	print "sRX !\n";
	my $t = -$pre_detect_delay_tck;
	for my $s (@{$pf{$rx_fc_mode}})
	{
	    print "s$$s[0] <\n";
	    $t += $$s[1];
	    date ($1, $t);
	}
	@fc_end_date = ($1, $t);
    } elsif (/^\[\.\] rx prepare short=true.*/) {
	next unless @fc_end_date;
	print "sIDLE <\nsIDLE !\n";
	@fc_end_date = ();
    } elsif (/^\[\.\] rx prepare short=false.*mod=(.+?) .* gil=(.+?) .*symb_nb=(.+)$/) {
	next unless @fc_end_date;
	my $t = $fc_end_date[1];
	my $gil = exists $gilpmod{$1} ? $gilpmod{$1} : $2;
	for my $d (1 .. $3)
	{
	    print "sD$d <\n";
	    $t += $d <= 2 ? $dx567 : $dx{$gil};
	    date ($fc_end_date[0], $t);
	}
	print "sIDLE <\nsIDLE !\n";
	@fc_end_date = ();
    } elsif (/^\[\.\] tx param mode=(.+?) short=(.+?) mod=(.+?) .*gil=(.+?)/) {
	%tx_param = (fc_mode => $1, short => $2, mod => $3, gil => $4);
    } elsif (/^\[\.\]  tx symb_nb=(.*?)$/) {
	$tx_symb_nb = $1;
    } elsif (/^\[(.+)\]  tx frame$/) {
	next unless %tx_param;
	date ($1);
	print "sTX !\n";
	my $t = 0;
	for my $s (@{$pf{$tx_param{fc_mode}}})
	{
	    print "s$$s[0] >\n";
	    $t += $$s[1];
	    date ($1, $t);
	}
	@fc_end_date = ($1, $t);
	if ($tx_param{short} eq 'true')
	{
	    print "sIDLE >\nsIDLE !\n";
	    %tx_param = ();
	}
    } elsif (/^\[.*\]  tx mpdu/) {
	next unless %tx_param;
	next unless @fc_end_date;
	my $t = $fc_end_date[1];
	my $gil = exists $gilpmod{$tx_param{mod}}
	    ? $gilpmod{$tx_param{mod}} : $tx_param{gil};
	for my $d (1 .. $tx_symb_nb)
	{
	    print "sD$d >\n";
	    $t += $d <= 2 ? $dx567 : $dx{$gil};
	    date ($fc_end_date[0], $t);
	}
	print "sIDLE >\nsIDLE !\n";
	%tx_param = ();
	@fc_end_date = ();
    }
}