source: mypx/utils/genoffset @ 7

このファイルの 7 以降における最終更新内容7 で kominami が 2015/09/12 9:22:12 に更新しました

TOPPERS/ASP 1.9.1

ファイルサイズ: 5.9 KB
 
1#! /usr/bin/perl
2#
3#  TOPPERS Software
4#      Toyohashi Open Platform for Embedded Real-Time Systems
5#
6#  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7#                              Toyohashi Univ. of Technology, JAPAN
8#  Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory
9#              Graduate School of Information Science, Nagoya Univ., JAPAN
10#
11#  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
12#  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
13#  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
14#  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
15#      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
16#      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
17#  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
18#      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
19#      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
20#      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
21#  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
22#      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
23#      €È¡¥
24#    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
25#        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
26#    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
27#        Êó¹ð€¹€ë€³€È¡¥
28#  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
29#      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
30#      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
31#      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
32#      ÌÈÀÕ€¹€ë€³€È¡¥
33#
34#  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
35#  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
36#  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
37#  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
38#  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
39#
40#  @(#) $Id$
41#
42
43#
44#  œéŽü²œ
45#
46$infile = $ARGV[0];
47$sil_endian = "";
48
49#
50#  ²òŒá€Ç€­€ë¥Ç¥£¥ì¥¯¥Æ¥£¥Ö€Î¥Æ¡Œ¥Ö¥ë
51#
52%directives = (
53        "long", "",
54        "dword", "",
55        "word", "",
56        "hword", "",
57        "int", "",
58        "short", "",
59        "half", "",
60        "byte", "",
61        "value", "",
62        "uaword", "",
63        "uashort", "",
64        "data32", 4,
65        "data16", 2,
66        "data8", 1,
67        "zero", -1,
68        "space", -1,
69        "globl", 0,
70        "global", 0,
71        "align", 0,
72        "p2align", 0,
73        "even", 0,
74        "data", 0,
75        "stabs", 0,
76        "type", 0,
77        "size", 0,
78        "section", 0,
79        "sdata", 0,
80        "code", 0,
81);
82
83#
84#  ¥ª¥Õ¥»¥Ã¥ÈÃ̀ΜÐÎÏ
85#
86sub parse_offset {
87        my($label, $val) = @_;
88
89        printf "#define %s\t%d\n",$label,$val;
90}
91
92#
93#  ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö€ÎÆÉ€ßŒè€ê
94#
95sub ref_bit {
96        my($size) = @_;
97        my($dir, $directive);
98
99        while ($line = <INFILE>) {
100                chomp $line;
101                next if ($line =~ /^[ \t]*[#;].*$/);
102
103                if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
104                                                && defined($dir = $directives{$1})) {
105                        $directive = $1;
106                        if ($dir eq "") {
107                                # ÅÐÏ¿€¹€Ù€­¥Ç¥£¥ì¥¯¥Æ¥£¥Ö
108                                $directives{$directive} = $size;
109                        }
110                        last;
111                }
112                else {
113                        # ²òÀπǀ­€Ê€€¹Ô
114                        print STDERR "genoffset: cannot parse: $line\n";
115                        $error = 1;
116                }
117        }
118}
119
120#
121#  ¥Ó¥Ã¥È¥µ¡Œ¥Á
122#
123sub search_bit {
124        my($val) = @_;
125        my($val_bit);
126
127        return(-1) if ($val == 0);
128
129        $val_bit = 0;
130        while (($val & 1) == 0) {
131                $val >>= 1;
132                $val_bit++;
133        }
134        return($val_bit);
135}
136
137#
138#  ¥Ó¥Ã¥È°ÌÃրΜÐÎÏ
139#
140sub parse_bit {
141        my($endian, $size, $label) = @_;
142        my($offset, $dir, $val, $val_bit);
143
144        if ($sil_endian && $endian ne $sil_endian) {
145                # ¥š¥ó¥Ç¥£¥¢¥ó€ÎÉÔ°ìÃ×
146                print STDERR "genoffset: endian mismatch: $line\n";
147                $error = 1;
148        }
149
150        $offset = 0;
151        while ($line = <INFILE>) {
152                chomp $line;
153                next if ($line =~ /^[ \t]*[#;].*$/);
154
155                if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
156                                                && defined($dir = $directives{$1})) {
157                        $val = $2;
158
159                        # 16¿Ê¿ô€È8¿Ê¿ô€Î¿ôÃ̀؀ÎÊÑŽ¹œèÍý
160                        if ($val =~ /^0x(.+)$/) {
161                                $val = hex($1);
162                        }
163                        elsif ($val =~ /^0(.+)$/) {
164                                $val = oct($1);
165                        }
166
167                        if ($dir eq "") {
168                                # ¥µ¥€¥º€òÃ΀é€Ê€€¥Ç¥£¥ì¥¯¥Æ¥£¥Ö
169                                print STDERR "genoffset: unknown directive: $line\n";
170                                $error = 1;
171                        }
172                        elsif ($dir == 0) {
173                                # ÆÉ€ßÈô€Ð€¹€Ù€­¥Ç¥£¥ì¥¯¥Æ¥£¥Ö
174                        }
175                        elsif ($dir == -1) {
176                                # .zero¥Ç¥£¥ì¥¯¥Æ¥£¥Ö€ÎœèÍý
177                                $offset += $val;
178                        }
179                        elsif ($val == 0) {
180                                # ÃÍ€¬0€Î¥Õ¥£¡Œ¥ë¥É€ÎœèÍý
181                                $offset += $dir;
182                        }
183                        else {
184                                # ÃÍ€¬0€Ç€Ê€€¥Õ¥£¡Œ¥ë¥É€¬ž«€Ä€«€ì€Ð¥ë¡Œ¥×€òœªÎ»
185                                last;
186                        }
187                }
188                else {
189                        # ²òÀπǀ­€Ê€€¹Ô
190                        print STDERR "genoffset: cannot parse: $line\n";
191                        $error = 1;
192                }
193        }
194
195        # ¥Ó¥Ã¥È°ÌÃÖ€òõ€¹
196        $val_bit = search_bit($val);
197
198        # ¥Ð¥€¥Èñ°Ì€Ë޹»»€¹€ë
199        if ($endian eq "B") {
200                $offset += $dir - 1;
201                $offset -= $val_bit >> 3;
202        }
203        else {
204                $offset += $val_bit >> 3;
205        }
206        $val_bit &= 0x07;
207
208        # œÐÎÏñ°Ì€Ë޹»»€¹€ë
209        if ($size eq "W") {
210                if ($endian eq "B") {
211                        $val_bit += 24;
212                        $val_bit -= ($offset & 0x03) << 3;
213                }
214                else {
215                        $val_bit += ($offset & 0x03) << 3;
216                }
217                $offset &= ~0x03;
218        }
219        elsif ($size eq "H") {
220                if ($endian eq "B") {
221                        $val_bit += 8;
222                        $val_bit -= ($offset & 0x01) << 3;
223                }
224                else {
225                        $val_bit += ($offset & 0x01) << 3;
226                }
227                $offset &= ~0x01;
228        }
229
230        # ÄêµÁ€ÎœÐÎÏ
231        $label =~ s/^_//;
232        printf "#define %s\t%d\n",$label,$offset;
233        printf "#define %s_bit\t%d\n",$label,$val_bit;
234        printf "#define %s_mask\t0x%x\n",$label,(1 << $val_bit);
235}
236
237#
238#  ¥á¥€¥ó¥ë¡Œ¥Á¥ó
239#
240print "/* This file is generated by genoffset. */\n";
241print "\n";
242
243$error = 0;
244open(INFILE, $infile) || die "Cannot open $infile";
245while ($line = <INFILE>) {
246        chomp $line;
247
248        if ($line =~ /^[ \t]*OFFSET_DEF ([^ \t]+) = [#\$]?([^ \t]+)/) {
249                parse_offset($1, $2);
250        }
251        elsif ($line =~ /^[ \t]*_?BIT_REF_([0-9]+):/) {
252                ref_bit($1);
253        }
254        elsif ($line =~ /^[ \t]*SIL_ENDIAN = ([BL])/) {
255                $sil_endian = $1;
256        }
257}
258#
259#  ¥³¥ó¥Ñ¥€¥é€¬¥°¥í¡Œ¥Ð¥ëÊÑ¿ô€ÎÇÛÃÖœçœø€òÊѹ¹€¹€ë€È¡€BIT_REF_?€¬²Œ€Ë€Ê
260#  €ë²ÄÇœÀ­€¬€¢€ë€¿€á¡€Æ¬€«€éÆÉ€ßÄŸ€¹¡¥
261#
262seek(INFILE, 0, SEEK_SET);
263while ($line = <INFILE>) {
264        chomp $line;
265
266        if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])_([^ \t]+):/) {
267                parse_bit($1, $2, $3);
268        }
269}
270close(INFILE);
271exit($error);
詳しい使い方は TracBrowser を参照してください。