source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/ThroughPlugin.rb@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 15.3 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$
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#@next_cell_port_subscript::Nil|Integer 呼び口を結合する受口のé…
68åˆ—添数.受け口é…
69åˆ—でない場合 nil
70#@signature:: Signature シグニチャ
71#@celltype:: Celltype 呼びå…
72ˆã®ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—. through が連接する場合、最終的な呼びå…
73ˆã®ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—
74#@entry_port_name::Symbol 生成するセルの受け口名 "eThroughEntry"
75#@call_port_name:: Symbol 生成するセルの呼び口名 "cCall"
76#@ct_name:: Symbol 生成するセルのセルタイプ名 "t#{self.class.name}_#{@signature.get_global_name}"
77#@plugin_arg_list:: Hash プラグイン引数をパースした結果のハッシュ変数
78#@caller_cell:: Cell 呼びå…
79ƒã®ã‚»ãƒ«ï¼Žthrough プラグインが連接する場合では、最も呼びå…
80ƒã®ã‚»ãƒ«ï¼Ž($source$)
81# through プラグインが合流するケースでは、1つ目の呼びå…
82ƒã‚»ãƒ«ã®ã¿å¼•æ•°ã¨ã—て与えられる
83# 従って TracePlugin の呼びå…
84ƒã®åˆ¤åˆ¥ã«åˆ©ç”¨ã™ã‚‹å ´åˆã¯ã€ç•°ãªã‚‹å‘¼ã³å…
85ƒã‹ã‚‰å‘¼ã°ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ることに注意しなくてはならない
86#@callee_cell:: Cell 呼びå…
87ˆã®ã‚»ãƒ«($destination$)
88#@plugin_arg_check_proc_tab:: [string => Proc] プラグイン引数名⇒チェック関数
89# 以下の変数は、initialize ではなく、後から設定される
90#@start_@region:: Region 始まりのリージョン: caller_cell のリージョンとは異なる可能性がある ($start_region$)
91#@end_region:: Region 終わりのリージョン: next_cell のリージョンとは異なる可能性がある ($end_region$)
92#@region:: Region @start_region と @end_region のいずれかで、cell を置くのが好ましいリージョン ($preferred_region$)
93#@through_type:: Symbol :THROUGH, :TO_THROUGH, :IN_THROUGH, :OUT_THROUGH のいずれか
94
95 # この Plugin が生成したセルタイプのリスト
96 @@generated_celltype = {}
97
98 #=== ThroughPlugin の初期化
99 # through が指定された時点で生成が行われる
100 # 初期化では、指定された引数を記録するに留める
101 #cell_name:: Symbol 生成すべきセル名(受口側)
102 #plugin_arg:: string through で指定された引数
103 #next_cell:: Cell 呼び口を接続するセル
104 #next_cell_port_name:: Symbol 呼び口を接続する受口の名前
105 #next_cell_port_subscript:: Nil|Integer 呼び口を接続する受口é…
106åˆ—添数
107 #signature:: Signature シグニチャ
108 #celltype:: Celltype セルタイプ (呼びå…
109ˆã®ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—)
110 #caller_cell:: Cell 呼びå…
111ƒã®ã‚»ãƒ«ï¼Ž@caller_cell の項
112を参ç…
113§
114 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, next_cell_port_subscript, signature, celltype, caller_cell )
115 super()
116 @cell_name = cell_name # 生成すべきセル名(受け口側のセル名)
117 # この呼びå…
118ˆã«åˆ¥ã‚»ãƒ«ã‚’生成する場合、この名前を接頭辞とすべき
119 @next_cell = next_cell # 呼びå…
120ˆã®ã‚»ãƒ«
121 @next_cell_port_name = next_cell_port_name
122 @next_cell_port_subscript = next_cell_port_subscript
123 @signature = signature
124 @entry_port_name = :"eThroughEntry"
125 @call_port_name = :"cCall"
126 @ct_name = :"t#{self.class.name}_#{@signature.get_global_name}"
127 @celltype = celltype
128 @plugin_arg_str = plugin_arg
129 @plugin_arg_list = {} # プラグイン引数をパースした結果のハッシュ変数
130 @caller_cell = caller_cell
131 Join.set_through_info self # 引数で渡らない(後から追加された)ものは set_through_info で設定される
132 print( "#{self.class.name}.new( '#{cell_name}', '#{plugin_arg}', '#{next_cell.get_name}', '#{next_cell_port_name}', #{celltype.get_name} )\n" )
133 end
134
135 #=== 情
136報を設定する
137 # å…
138±æœ‰ãƒãƒ£ãƒ³ãƒãƒ«ã®å ´åˆ caller_cell, next_cell のいずれの region でもないケースがある
139 # 後から追加したので initialize の引数ではなく、別メソッドで設定
140 # このメソッドは、オーバーライドしないでください
141 # Join と ThrougPlugin の間の連絡用で、今後とも引数が追加される可能性があるため
142 # このメソッドは V1.C.0.34 で位置が移動され、ThroughPlugin#initialize で呼び出される
143 def set_through_info( start_region, end_region, through_type, join, callee_cell, count )
144 @start_region = start_region
145 @end_region = end_region
146 @through_type = through_type
147 @join = join
148 @callee_cell = callee_cell
149 @count = count
150
151 # preferred_region の設定
152 case through_type
153 when :IN_THROUGH, :THROUGH
154 @region = end_region
155 when :OUT_THROUGH, :TO_THROUGH
156 @region = start_region
157 else
158 raise "Unknown through_type #{through_type}"
159 end
160 end
161
162 #=== セルの名前を得る
163 def get_cell_name
164 @cell_name
165 end
166
167 #=== NamespacePath を得る
168 # 生成するセルの namespace path を生成する
169 def get_cell_namespace_path
170# nsp = @region.get_namespace.get_namespace_path
171 nsp = @region.get_namespace_path
172 return nsp.append( @cell_name )
173 end
174
175 #=== 生成されたセルの受け口の名前を得る
176 def get_through_entry_port_name
177 @entry_port_name
178 end
179
180 #=== 生成されたセルの受け口é…
181åˆ—添数を得る
182 def get_through_entry_port_subscript
183 @entry_port_subscript
184 end
185
186 #=== 宣言コードの生成
187 # typedef, signature, celltype など(cell 以外)のコードを生成
188 # 重複して生成してはならない(すでに生成されている場合は出力しないこと)
189 #file:: FILE 生成するファイル
190 def gen_plugin_decl_code( file )
191
192 # このセルタイプ(同じシグニチャ)は既に生成されているか?
193 if @@generated_celltype[ @ct_name ] == nil then
194 @@generated_celltype[ @ct_name ] = [ self ]
195 else
196 @@generated_celltype[ @ct_name ] << self
197 return
198 end
199
200 file2 = CFile.open( "#{$gen}/#{@ct_name}.cdl", "w" )
201
202 send_receive = []
203 if @signature != nil then
204 @signature.each_param{ |fd,param|
205 dir =param.get_direction
206 case dir
207 when :SEND, :RECEIVE
208 send_receive << [ dir, fd, param ]
209 end
210 }
211 end
212
213 file2.print <<EOT
214celltype #{@ct_name} {
215EOT
216
217 if send_receive.length > 0 then
218 file2.print " [ allocator(\n"
219 delim = ""
220 send_receive.each { |a|
221 file2.print "#{delim}\t#{a[1].get_name}.#{a[2].get_name}<=#{@call_port_name}.#{a[1].get_name}.#{a[2].get_name}"
222 delim = ",\n"
223 }
224 file2.print "\n )]\n"
225 end
226
227 file2.print <<EOT
228 entry #{@signature.get_namespace_path} #{@entry_port_name};
229 call #{@signature.get_namespace_path} #{@call_port_name};
230};
231EOT
232 file2.close
233
234 file.print "import( \"#{$gen}/#{@ct_name}.cdl\" );\n"
235 end
236
237 #=== CDL ファイルの生成
238 #file:: FILE 生成するファイル
239 def gen_cdl_file( file )
240 gen_plugin_decl_code( file )
241 gen_through_cell_code( file )
242 end
243
244 #=== セルコードの生成
245 # through 指定により生じるセルコード(CDL)を生成する
246 #file:: FILE 生成するファイル
247 def gen_through_cell_code( file )
248
249 nest = @region.gen_region_str_pre file
250 nest_str = " " * nest
251
252 file.print <<EOT
253#{nest_str}cell #{@ct_name} #{@cell_name} {
254#{nest_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name};
255#{nest_str}};
256EOT
257 @region.gen_region_str_post file
258
259 end
260
261 #=== 後ろのコードを生成
262 #プラグインの後ろのコード (CDL) を生成
263 #file:: File:
264 def self.gen_post_code( file )
265 # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
266 # file.print "/* '#{self.class.name}' post code */\n"
267 end
268
269 #=== 受け口関数の本体(C言語)を生成する
270 # 通常であれば、ジェネレータは受け口関数のテンプレートを生成する
271 # プラグインの場合、変更する必
272要のないセルタイプコードを生成する
273 #file:: FILE 出力å…
274ˆãƒ•ã‚¡ã‚¤ãƒ«
275 #b_singleton:: bool true if singleton
276 #ct_name:: Symbol
277 #global_ct_name:: string
278 #sig_name:: string
279 #ep_name:: string
280 #func_name:: string
281 #func_global_name:: string
282 #func_type:: class derived from Type
283 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 )
284
285 ret_type = func_type.get_type
286 b_ret_void = ret_type.is_void?
287
288 if ! b_ret_void then
289 file.print( " #{ret_type.get_type_str} retval;\n" )
290 end
291
292 if ! b_singleton then
293
294 file.print <<EOT
295 #{ct_name}_CB *p_cellcb;
296 if( VALID_IDX( idx ) ){
297 p_cellcb = #{global_ct_name}_GET_CELLCB(idx);
298 }else{
299 /* エラー処理コードをここに記述 */
300 }
301
302EOT
303 end
304
305 # p "celltype_name, sig_name, func_name, func_global_name"
306 # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
307
308 delim = ""
309 if ! b_ret_void then
310 file.print( " retval = " )
311 end
312
313 file.print( "#{@call_port_name}_#{func_name}(" )
314
315# if ( ! b_singleton ) then
316# file.print( " tecs_this" )
317# delim = ","
318# end
319
320 params.each{ |param|
321 file.printf( "#{delim} #{param.get_name}" )
322 delim = ","
323 }
324
325 file.print( " );\n" )
326
327 if ! b_ret_void then
328 file.print( " return retval;\n" )
329 end
330 end
331
332 #=== Through プラグインの引数の名前を置換する
333 def check_plugin_arg( ident, rhs )
334 rhs = subst_name rhs
335 super( ident, rhs )
336 end
337
338 #=== ThroughPlugin#名前の置換
339 # プラグインオプション引数内
340の文字列を置換する
341 # $source$ … 呼びå…
342ƒã®ã‚»ãƒ«å
343 # $destination$ … 呼びå…
344ˆã®ã‚»ãƒ«å
345 # $SOURCE$ … 呼びå…
346ƒã®ã‚»ãƒ«å (リージョン名を '_' で連結した global_name)
347 # $DESTINATION$ … 呼びå…
348ˆã®ã‚»ãƒ«å (リージョン名を '_' で連結した global_name)
349 # $next$ … 次のセル名
350 # 複数の through がつながっている場合、すぐ後ろに来るもの
351 # $NEXT$ … 次のセル名 (リージョン名を '_' で連結した global_name)
352 # 複数の through がつながっている場合、すぐ後ろに来るもの
353 # $start_region$ … $source$ のセルの存在する region (global_name)
354 # $end_region$ … $destination$ のセルの存在する region (global_name)
355 # $preferred_region$ … 適切な region (global_name), start_region または end_region
356 # $count$ … region 間の through の適用数
357 # $$ … $ に置換
358 def subst_name( str )
359 # セル名の置換
360 str = str.gsub( /(^|[^\$])\$source\$/, "\\1#{@caller_cell.get_name}" )
361 str = str.gsub( /(^|[^\$])\$destination\$/, "\\1#{@callee_cell.get_name}" )
362 str = str.gsub( /(^|[^\$])\$SOURCE\$/, "\\1#{@caller_cell.get_global_name}" )
363 str = str.gsub( /(^|[^\$])\$DESTINATION\$/, "\\1#{@callee_cell.get_global_name}" )
364 str = str.gsub( /(^|[^\$])\$next\$/, "\\1#{@next_cell.get_name}" )
365 str = str.gsub( /(^|[^\$])\$NEXT\$/, "\\1#{@next_cell.get_global_name}" )
366 # region 名の置換
367 str = str.gsub( /(^|[^\$])\$start_region\$/, "\\1#{@start_region.get_global_name}" )
368 str = str.gsub( /(^|[^\$])\$end_region\$/, "\\1#{@end_region.get_global_name}" )
369 str = str.gsub( /(^|[^\$])\$preferred_region\$/, "\\1#{@region.get_global_name}" )
370 str = str.gsub( /(^|[^\$])\$count\$/, "\\1#{@count}" )
371
372 str = str.gsub( /\$\$/, "\$" ) # $$ を $ に置換
373
374 return str
375 end
376
377 def show_tree( indent )
378 indent.times { print " " }
379 puts "Plugin: celltype: #{@ct_name} cell: #{@cell_name}"
380 (indent+1).times { print " " }
381 puts "next: signature: #{@signature.get_namespace_path} call = #{@next_cell.get_name}.#{@next_cell_port_name}"
382 end
383end
384
Note: See TracBrowser for help on using the repository browser.