source: EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/ThroughPlugin.rb@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 15.0 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2014 by TOPPERS Project
7#--
8# 上記著作権者
9は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11# 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15# スコード中に含まれていること.
16# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17# 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20# 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22# の無保証規定を掲載すること.
23# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24# 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26# と.
27# (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30# 作権表示,この利用条件および下記の無保証規定を掲載すること.
31# (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34# 報告すること.
35# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36# 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40# 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42# å…
43è²¬ã™ã‚‹ã“と.
44#
45# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50# の責任を負わない.
51#
52# $Id: ThroughPlugin.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
53#++
54
55# mikan through plugin: namespace が考æ…
56®ã•ã‚Œã¦ã„ない
57
58#== スループラグインのå…
59±é€šã®è¦ªã‚¯ãƒ©ã‚¹ã€€ã‹ã¤ (何もせず)スルーするセルを挿å…
60¥ã™ã‚‹ã‚¹ãƒ«ãƒ¼ãƒ—ラグイン
61# スループラグインは ThroughPlugin の子クラスとして定義する
62class ThroughPlugin < Plugin
63#@cell_name:: Symbol 生成するセル名(複数セルを生成する場合、受け口側のセル)
64#@plugin_arg_str:: string through で指定された引数
65#@next_cell:: Cell 呼び口を結合するセル
66#@next_cell_port_name:: Symbol 呼び口を結合する受口の名前
67#@signature:: Signature シグニチャ
68#@celltype:: Celltype 呼びå…
69ˆã®ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—. through が連接する場合、最終的な呼びå…
70ˆã®ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—
71#@entry_port_name::Symbol 生成するセルの受け口名 "eThroughEntry"
72#@call_port_name:: Symbol 生成するセルの呼び口名 "cCall"
73#@ct_name:: Symbol 生成するセルのセルタイプ名 "t#{self.class.name}_#{@signature.get_global_name}"
74#@plugin_arg_list:: Hash プラグイン引数をパースした結果のハッシュ変数
75#@caller_cell:: Cell 呼びå…
76ƒã®ã‚»ãƒ«ï¼Žthrough プラグインが連接する場合では、最も呼びå…
77ƒã®ã‚»ãƒ«ï¼Ž($source$)
78# through プラグインが合流するケースでは、1つ目の呼びå…
79ƒã‚»ãƒ«ã®ã¿å¼•æ•°ã¨ã—て与えられる
80# 従って TracePlugin の呼びå…
81ƒã®åˆ¤åˆ¥ã«åˆ©ç”¨ã™ã‚‹å ´åˆã¯ã€ç•°ãªã‚‹å‘¼ã³å…
82ƒã‹ã‚‰å‘¼ã°ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ることに注意しなくてはならない
83#@callee_cell:: Cell 呼びå…
84ˆã®ã‚»ãƒ«($destination$)
85#@plugin_arg_check_proc_tab:: [string => Proc] プラグイン引数名⇒チェック関数
86# 以下の変数は、initialize ではなく、後から設定される
87#@start_@region:: Region 始まりのリージョン: caller_cell のリージョンとは異なる可能性がある ($start_region$)
88#@end_region:: Region 終わりのリージョン: next_cell のリージョンとは異なる可能性がある ($end_region$)
89#@region:: Region @start_region と @end_region のいずれかで、cell を置くのが好ましいリージョン ($preferred_region$)
90#@through_type:: Symbol :THROUGH, :TO_THROUGH, :IN_THROUGH, :OUT_THROUGH のいずれか
91
92 # この Plugin が生成したセルタイプのリスト
93 @@generated_celltype = {}
94
95 #=== ThroughPlugin の初期化
96 # through が指定された時点で生成が行われる
97 # 初期化では、指定された引数を記録するに留める
98 #cell_name:: Symbol 生成すべきセル名(受口側)
99 #plugin_arg:: string through で指定された引数
100 #next_cell:: Cell 呼び口を接続するセル
101 #next_cell_port_name:: Symbol 呼び口を接続する受口の名前
102 #signature:: Signature シグニチャ
103 #celltype:: Celltype セルタイプ (呼びå…
104ˆã®ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—)
105 #caller_cell:: Cell 呼びå…
106ƒã®ã‚»ãƒ«ï¼Ž@caller_cell の項
107を参ç…
108§
109 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell )
110 super()
111 @cell_name = cell_name # 生成すべきセル名(受け口側のセル名)
112 # この呼びå…
113ˆã«åˆ¥ã‚»ãƒ«ã‚’生成する場合、この名前を接頭辞とすべき
114 @next_cell = next_cell # 呼びå…
115ˆã®ã‚»ãƒ«
116 @next_cell_port_name = next_cell_port_name
117 @signature = signature
118 @entry_port_name = :"eThroughEntry"
119 @call_port_name = :"cCall"
120 @ct_name = :"t#{self.class.name}_#{@signature.get_global_name}"
121 @celltype = celltype
122 @plugin_arg_str = plugin_arg
123 @plugin_arg_list = {} # プラグイン引数をパースした結果のハッシュ変数
124 @caller_cell = caller_cell
125 Join.set_through_info self # 引数で渡らない(後から追加された)ものは set_through_info で設定される
126 print( "#{self.class.name}.new( '#{cell_name}', '#{plugin_arg}', '#{next_cell.get_name}', '#{next_cell_port_name}', #{celltype.get_name} )\n" )
127 end
128
129 #=== 情
130報を設定する
131 # å…
132±æœ‰ãƒãƒ£ãƒ³ãƒãƒ«ã®å ´åˆ caller_cell, next_cell のいずれの region でもないケースがある
133 # 後から追加したので initialize の引数ではなく、別メソッドで設定
134 # このメソッドは、オーバーライドしないでください
135 # Join と ThrougPlugin の間の連絡用で、今後とも引数が追加される可能性があるため
136 # このメソッドは V1.C.0.34 で位置が移動され、ThroughPlugin#initialize で呼び出される
137 def set_through_info( start_region, end_region, through_type, join, callee_cell, count )
138 @start_region = start_region
139 @end_region = end_region
140 @through_type = through_type
141 @join = join
142 @callee_cell = callee_cell
143 @count = count
144
145 # preferred_region の設定
146 case through_type
147 when :IN_THROUGH, :THROUGH
148 @region = end_region
149 when :OUT_THROUGH, :TO_THROUGH
150 @region = start_region
151 else
152 raise "Unknown through_type #{through_type}"
153 end
154 end
155
156 #=== セルの名前を得る
157 def get_cell_name
158 @cell_name
159 end
160
161 #=== NamespacePath を得る
162 # 生成するセルの namespace path を生成する
163 def get_cell_namespace_path
164# nsp = @region.get_namespace.get_namespace_path
165 nsp = @region.get_namespace_path
166 return nsp.append( @cell_name )
167 end
168
169 #=== 生成されたセルの受け口の名前を得る
170 def get_through_entry_port_name
171 @entry_port_name
172 end
173
174 #=== 宣言コードの生成
175 # typedef, signature, celltype など(cell 以外)のコードを生成
176 # 重複して生成してはならない(すでに生成されている場合は出力しないこと)
177 #file:: FILE 生成するファイル
178 def gen_plugin_decl_code( file )
179
180 # このセルタイプ(同じシグニチャ)は既に生成されているか?
181 if @@generated_celltype[ @ct_name ] == nil then
182 @@generated_celltype[ @ct_name ] = [ self ]
183 else
184 @@generated_celltype[ @ct_name ] << self
185 return
186 end
187
188 file2 = CFile.open( "#{$gen}/#{@ct_name}.cdl", "w" )
189
190 send_receive = []
191 if @signature != nil then
192 @signature.each_param{ |fd,param|
193 dir =param.get_direction
194 case dir
195 when :SEND, :RECEIVE
196 send_receive << [ dir, fd, param ]
197 end
198 }
199 end
200
201 file2.print <<EOT
202celltype #{@ct_name} {
203EOT
204
205 if send_receive.length > 0 then
206 file2.print " [ allocator(\n"
207 delim = ""
208 send_receive.each { |a|
209 file2.print "#{delim}\t#{a[1].get_name}.#{a[2].get_name}<=#{@call_port_name}.#{a[1].get_name}.#{a[2].get_name}"
210 delim = ",\n"
211 }
212 file2.print "\n )]\n"
213 end
214
215 file2.print <<EOT
216 entry #{@signature.get_namespace_path} #{@entry_port_name};
217 call #{@signature.get_namespace_path} #{@call_port_name};
218};
219EOT
220 file2.close
221
222 file.print "import( \"#{$gen}/#{@ct_name}.cdl\" );\n"
223 end
224
225 #=== CDL ファイルの生成
226 #file:: FILE 生成するファイル
227 def gen_cdl_file( file )
228 gen_plugin_decl_code( file )
229 gen_through_cell_code( file )
230 end
231
232 #=== セルコードの生成
233 # through 指定により生じるセルコード(CDL)を生成する
234 #file:: FILE 生成するファイル
235 def gen_through_cell_code( file )
236
237 nest = @region.gen_region_str_pre file
238 nest_str = " " * nest
239
240 file.print <<EOT
241#{nest_str}cell #{@ct_name} #{@cell_name} {
242#{nest_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name};
243#{nest_str}};
244EOT
245 @region.gen_region_str_post file
246
247 end
248
249 #=== 後ろのコードを生成
250 #プラグインの後ろのコード (CDL) を生成
251 #file:: File:
252 def self.gen_post_code( file )
253 # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
254 # file.print "/* '#{self.class.name}' post code */\n"
255 end
256
257 #=== 受け口関数の本体(C言語)を生成する
258 # 通常であれば、ジェネレータは受け口関数のテンプレートを生成する
259 # プラグインの場合、変更する必
260要のないセルタイプコードを生成する
261 #file:: FILE 出力å…
262ˆãƒ•ã‚¡ã‚¤ãƒ«
263 #b_singleton:: bool true if singleton
264 #ct_name:: Symbol
265 #global_ct_name:: string
266 #sig_name:: string
267 #ep_name:: string
268 #func_name:: string
269 #func_global_name:: string
270 #func_type:: class derived from Type
271 def gen_ep_func_body( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
272
273 ret_type = func_type.get_type
274 b_ret_void = ret_type.is_void?
275
276 if ! b_ret_void then
277 file.print( " #{ret_type.get_type_str} retval;\n" )
278 end
279
280 if ! b_singleton then
281
282 file.print <<EOT
283 #{ct_name}_CB *p_cellcb;
284 if( VALID_IDX( idx ) ){
285 p_cellcb = #{global_ct_name}_GET_CELLCB(idx);
286 }else{
287 /* エラー処理コードをここに記述 */
288 }
289
290EOT
291 end
292
293 # p "celltype_name, sig_name, func_name, func_global_name"
294 # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
295
296 delim = ""
297 if ! b_ret_void then
298 file.print( " retval = " )
299 end
300
301 file.print( "#{@call_port_name}_#{func_name}(" )
302
303# if ( ! b_singleton ) then
304# file.print( " tecs_this" )
305# delim = ","
306# end
307
308 params.each{ |param|
309 file.printf( "#{delim} #{param.get_name}" )
310 delim = ","
311 }
312
313 file.print( " );\n" )
314
315 if ! b_ret_void then
316 file.print( " return retval;\n" )
317 end
318 end
319
320 #=== Through プラグインの引数の名前を置換する
321 def check_plugin_arg( ident, rhs )
322 rhs = subst_name rhs
323 super( ident, rhs )
324 end
325
326 #=== ThroughPlugin#名前の置換
327 # プラグインオプション引数内
328の文字列を置換する
329 # $source$ … 呼びå…
330ƒã®ã‚»ãƒ«å
331 # $destination$ … 呼びå…
332ˆã®ã‚»ãƒ«å
333 # $SOURCE$ … 呼びå…
334ƒã®ã‚»ãƒ«å (リージョン名を '_' で連結した global_name)
335 # $DESTINATION$ … 呼びå…
336ˆã®ã‚»ãƒ«å (リージョン名を '_' で連結した global_name)
337 # $next$ … 次のセル名
338 # 複数の through がつながっている場合、すぐ後ろに来るもの
339 # $NEXT$ … 次のセル名 (リージョン名を '_' で連結した global_name)
340 # 複数の through がつながっている場合、すぐ後ろに来るもの
341 # $start_region$ … $source$ のセルの存在する region (global_name)
342 # $end_region$ … $destination$ のセルの存在する region (global_name)
343 # $preferred_region$ … 適切な region (global_name), start_region または end_region
344 # $count$ … region 間の through の適用数
345 # $$ … $ に置換
346 def subst_name( str )
347 # セル名の置換
348 str = str.gsub( /(^|[^\$])\$source\$/, "\\1#{@caller_cell.get_name}" )
349 str = str.gsub( /(^|[^\$])\$destination\$/, "\\1#{@callee_cell.get_name}" )
350 str = str.gsub( /(^|[^\$])\$SOURCE\$/, "\\1#{@caller_cell.get_global_name}" )
351 str = str.gsub( /(^|[^\$])\$DESTINATION\$/, "\\1#{@callee_cell.get_global_name}" )
352 str = str.gsub( /(^|[^\$])\$next\$/, "\\1#{@next_cell.get_name}" )
353 str = str.gsub( /(^|[^\$])\$NEXT\$/, "\\1#{@next_cell.get_global_name}" )
354 # region 名の置換
355 str = str.gsub( /(^|[^\$])\$start_region\$/, "\\1#{@start_region.get_global_name}" )
356 str = str.gsub( /(^|[^\$])\$end_region\$/, "\\1#{@end_region.get_global_name}" )
357 str = str.gsub( /(^|[^\$])\$preferred_region\$/, "\\1#{@region.get_global_name}" )
358 str = str.gsub( /(^|[^\$])\$count\$/, "\\1#{@count}" )
359
360 str = str.gsub( /\$\$/, "\$" ) # $$ を $ に置換
361
362 return str
363 end
364
365 def show_tree( indent )
366 indent.times { print " " }
367 puts "Plugin: celltype: #{@ct_name} cell: #{@cell_name}"
368 (indent+1).times { print " " }
369 puts "next: signature: #{@signature.get_namespace_path} call = #{@next_cell.get_name}.#{@next_cell_port_name}"
370 end
371end
372
Note: See TracBrowser for help on using the repository browser.