Mercurial > hg > GearsTemplate
annotate src/parallel_execution/trans_impl.pl @ 585:b2157a88e0ef
tweak trans_impl
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 03 Dec 2019 08:21:48 +0900 |
parents | 823503ada47f |
children |
rev | line source |
---|---|
555 | 1 #!/usr/bin/env perl |
2 use strict; | |
3 use warnings; | |
4 | |
557 | 5 use FindBin; |
6 use lib "$FindBin::Bin/lib"; | |
7 use Gears::Util; | |
555 | 8 |
561 | 9 use Getopt::Std; |
10 | |
11 my %opt; | |
12 getopts("w" => \%opt); | |
555 | 13 |
557 | 14 my $impl_file = shift or die 'require impl file'; |
583 | 15 my $impl_ir = Gears::Util->parse_with_rewrite($impl_file); |
559 | 16 my $interface_file = Gears::Util->find_header($impl_ir->{isa},"$FindBin::Bin"); |
17 | |
583 | 18 my $inter_ir = Gears::Util->parse_with_rewrite($interface_file); |
561 | 19 |
20 | |
21 my $output_file = $impl_file; | |
22 $output_file =~ s/\.h/.cbc/; | |
23 open my $fh, '>', $output_file; | |
24 my $stdout = $fh; | |
25 | |
26 unless ($opt{w}) { | |
27 $stdout = *STDOUT; | |
28 } | |
29 | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
30 emit_include_part($stdout, $inter_ir->{name}); |
561 | 31 emit_impl_header_in_comment($stdout, $impl_file); |
559 | 32 emit_constracutor($stdout,$impl_ir,$inter_ir); |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
33 emit_code_gears($stdout,$impl_ir,$inter_ir); |
561 | 34 close $fh; |
559 | 35 |
36 sub emit_include_part { | |
37 my ($out, $interface) = @_; | |
38 print $out <<"EOF" | |
39 #include "../context.h"; | |
40 #interface "$interface.h"; | |
41 | |
42 EOF | |
43 } | |
44 | |
45 sub emit_impl_header_in_comment { | |
46 my ($out, $impl_file) = @_; | |
47 my $line = Gears::Util->slup($impl_file); | |
48 print $out "// ----\n"; | |
49 map { print $out "// $_\n" } split /\n/, $line; | |
561 | 50 print $out "// ----\n\n"; |
559 | 51 } |
558 | 52 |
559 | 53 sub emit_constracutor { |
54 my ($out, $impl_ir, $inter_ir) = @_; | |
55 | |
563 | 56 my @inter_data = @{$inter_ir->{data}}; |
57 my @impl_data = @{$impl_ir->{data}}; | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
58 my $instance_inter = shift @inter_data; |
563 | 59 |
559 | 60 if ($instance_inter =~ /union\s*Data\*\s*(\w+)/) { |
61 $instance_inter = $1; | |
62 } | |
563 | 63 |
64 my $instance_impl = lcfirst $impl_ir->{name}; | |
65 $instance_impl =~ s/([A-Z])/_\l$1/g; | |
559 | 66 |
67 print $out <<"EOF"; | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
68 $impl_ir->{isa}* create$impl_ir->{name}(struct Context* context) { |
559 | 69 struct $impl_ir->{isa}* $instance_inter = new $impl_ir->{isa}(); |
70 struct $impl_ir->{name}* $instance_impl = new $impl_ir->{name}(); | |
71 $instance_inter->$instance_inter = (union Data*)$instance_impl; | |
72 EOF | |
73 | |
563 | 74 for my $datum (@impl_data) { |
559 | 75 if ($datum =~ /\w+ \w+\* (\w+)/) { |
583 | 76 print $out " ${instance_impl}->$1 = NULL;\n"; |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
77 next; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
78 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
79 if ($datum =~ /\w+ \w+ (\w+)/) { |
583 | 80 print $out " ${instance_impl}->$1 = 0;\n"; |
563 | 81 } |
82 } | |
83 | |
84 for my $datum (@inter_data) { | |
85 if ($datum =~ /\w+ \w+\* (\w+)/) { | |
86 print $out " ${instance_inter}->$1 = NULL;\n"; | |
87 next; | |
88 } | |
89 if ($datum =~ /\w+ \w+ (\w+)/) { | |
90 print $out " ${instance_inter}->$1 = 0;\n"; | |
559 | 91 } |
92 } | |
93 | |
94 for my $code (@{$inter_ir->{codes}}) { | |
583 | 95 my $code_gear = $code->{name}; |
559 | 96 print $out " ${instance_inter}->$code_gear = C_$code_gear$impl_ir->{name};\n" |
97 } | |
98 | |
99 print $out " return $instance_inter;\n"; | |
100 print $out "}\n"; | |
101 } | |
102 | |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
103 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
104 sub emit_code_gears { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
105 my ($out, $impl_ir, $inter_ir) = @_; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
106 my $impl = $impl_ir->{name}; |
584
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
107 my $interface_name = $inter_ir->{name}; |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
108 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
109 my @inter_data = @{$inter_ir->{data}}; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
110 my $instance_inter = shift @inter_data; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
111 if ($instance_inter =~ /union\s*Data\*\s*(\w+)/) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
112 $instance_inter = $1; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
113 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
114 my $instance_impl = lcfirst $impl_ir->{name}; |
563 | 115 $instance_impl =~ s/([A-Z])/_\l$1/g; |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
116 my $data_gear_types = {}; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
117 |
584
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
118 if (defined $impl_ir->{codes}) { |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
119 for my $cg (@{$impl_ir->{codes}}) { |
585 | 120 my $data_gears = $cg->{args}; |
584
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
121 while ($data_gears =~ /Type\*\s*(\w+),/g) { |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
122 $data_gears =~ s/Type\*/struct $impl*/; |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
123 } |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
124 |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
125 while ($data_gears =~ /Isa\*\s*(\w+),/g) { |
585 | 126 $data_gears =~ s/Isa\*/struct $interface_name*/; |
584
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
127 } |
585 | 128 print $out "__code $cg->{name}$impl("; |
584
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
129 print $out "$data_gears) {\n\n"; |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
130 |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
131 #__code next(...), __code whenEmpty(...) |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
132 my @cg = (); |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
133 while ($data_gears =~ /__code ([\w(\.)\*\s,]+?\)),?/g) { |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
134 push(@cg, $1); |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
135 } |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
136 |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
137 if (@cg) { |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
138 if (@cg == 2) { |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
139 print $out " if (:TODO:) {\n"; |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
140 print $out " goto ",shift(@cg),";\n"; |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
141 print $out " }\n"; |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
142 print $out " goto ",shift(@cg),";\n"; |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
143 } else { |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
144 print $out " goto ",shift(@cg),";\n"; |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
145 } |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
146 } |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
147 print $out "}\n\n"; |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
148 } |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
149 } |
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
150 |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
151 for my $code_ir (@{$inter_ir->{codes}}) { |
583 | 152 my $data_gears = $code_ir->{args}; |
153 $data_gears =~ s/Impl/struct $impl/g; | |
584
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
154 |
562 | 155 while ($data_gears =~ /Type\*\s*(\w+),/g) { |
584
823503ada47f
add SingleLinkedStack.h
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
583
diff
changeset
|
156 $data_gears =~ s/Type\*/struct $interface_name*/; |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
157 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
158 |
583 | 159 print $out "__code $code_ir->{name}$impl("; |
560
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
160 print $out "$data_gears) {\n\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
161 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
162 #__code next(...), __code whenEmpty(...) |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
163 my @cg = (); |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
164 while ($data_gears =~ /__code ([\w(\.)\*\s,]+?\)),?/g) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
165 push(@cg, $1); |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
166 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
167 |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
168 if (@cg) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
169 if (@cg == 2) { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
170 print $out " if (:TODO:) {\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
171 print $out " goto ",shift(@cg),";\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
172 print $out " }\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
173 print $out " goto ",shift(@cg),";\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
174 } else { |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
175 print $out " goto ",shift(@cg),";\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
176 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
177 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
178 print $out "}\n\n"; |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
179 } |
2276952ed717
impl trans_impl.pl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
559
diff
changeset
|
180 } |