source: EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRP2SVCPlugin.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.3 KB
RevLine 
[270]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#++
53
54# mikan through plugin: namespace が考æ…
55®ã•ã‚Œã¦ã„ない
56# これを利用する場合、以下のように toppers_jsp.cdl sChannel.cdl を指定する必
57要がある
58# tecsgen toppers_jsp.cdl sChannel.cdl your_description.cdl
59
60# 以下を仮定(制限事項
61)
62# 呼びå…
63ƒã€å‘¼ã³å…
64ˆã®ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€char, short, int_t, long_t, intptr_t のサイズが同じ
65# 有符号、無符号でサイズが同じ
66
67class SVCManage
68 # TODO: デフォルトの拡張サービスコール分を予約しておく
69 # デフォルトの拡張サービスコール(syslogなど)もコンポーネント化するまで
70 @@id = 20
71 @@func_ids = {}
72 def self.get_func_id func_name
73 return @@func_ids[ func_name ]
74 end
75 def self.set_func_id func_name
76 @@func_ids[ func_name ] = self.assign_id
77 puts @@func_ids[ func_name ]
78 end
79 def self.include_func_id? func_name
80 return @@func_ids.has_key?( func_name )
81 end
82 def self.get_id
83 return @@id
84 end
85 def self.set_id id
86 @@id = id
87 end
88 def self.assign_id
89 @@id += 1
90 return @@id
91 end
92end
93
94#
95# 拡張サービスコールを用いたドメイン間通信の
96# throughプラグイン
97# HRP2ドメインプラグインによって挿å…
98¥ã•ã‚Œã‚‹
99#
100class HRP2SVCPlugin < ThroughPlugin
101
102 #=== RPCPlugin の initialize
103 # 説明は ThroughPlugin (plugin.rb) を参ç…
104§
105 @@generated_celltype_header = {}
106
107 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell )
108 super
109 @ct_name_body = "#{@ct_name}SVCBody_#{@next_cell.get_name}_#{@next_cell_port_name}".to_sym
110 @ct_name = "#{@ct_name}SVCCaller_#{@next_cell.get_name}_#{@next_cell_port_name}".to_sym
111 @cell_name_body = "#{@cell_name}SVCBody".to_sym
112 @cell_name = "#{@cell_name}SVCCaller".to_sym
113 puts "%%%% "
114 p @next_cell.get_name
115 p @caller_cell.get_name
116 end
117
118 #=== NamespacePath を得る
119 # 生成するセルの namespace path を生成する
120 def get_cell_namespace_path
121# nsp = @region.get_namespace.get_namespace_path
122 nsp = @start_region.get_namespace_path
123 return nsp.append( @cell_name )
124 end
125
126 def gen_plugin_decl_code( file )
127
128 # このセルタイプ(同じシグニチャ)は既に生成されているか?
129 if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype)
130 if @@generated_celltype[ @ct_name_body ] == nil then
131 @@generated_celltype[ @ct_name_body ] = [ self ]
132 file2 = CFile.open( "#{$gen}/#{@ct_name_body}.cdl", "w" )
133 file2.print <<EOT
134[active]
135celltype #{@ct_name_body} {
136 call #{@signature.get_name} #{@call_port_name};
137};
138EOT
139 file2.close
140 else
141 @@generated_celltype[ @ct_name_body ] << self
142 end
143 file.print "import( \"#{$gen}/#{@ct_name_body}.cdl\" );\n"
144 end
145
146 # このセルタイプ(同じシグニチャ)は既に生成されているか?
147 if @@generated_celltype[ @ct_name ] == nil then
148 @@generated_celltype[ @ct_name ] = [ self ]
149 file2 = CFile.open( "#{$gen}/#{@ct_name}.cdl", "w" )
150 if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype)
151 file2.print <<EOT
152celltype #{@ct_name} {
153 entry #{@signature.get_name} #{@entry_port_name};
154};
155EOT
156 else
157 # TODO inlineにした方が効率がよいが,tecsgenの生成したヘッダファイルの
158 # 読込順のためにエラーとなる
159 file2.print <<EOT
160celltype #{@ct_name} {
161 //[inline] entry #{@signature.get_name} #{@entry_port_name};
162 entry #{@signature.get_name} #{@entry_port_name};
163 call #{@signature.get_name} #{@call_port_name};
164};
165EOT
166 end
167
168 file2.close
169 else
170 @@generated_celltype[ @ct_name ] << self
171 end
172 file.print "import( \"#{$gen}/#{@ct_name}.cdl\" );\n"
173
174=begin
175 # TODO: send. receive 対応
176 send_receive = []
177 if @signature != nil then
178 @signature.each_param{ |fd,param|
179 dir =param.get_direction
180 case dir
181 when :SEND, :RECEIVE
182 send_receive << [ dir, fd, param ]
183 end
184 }
185 end
186=end
187
188=begin
189composite #{@ct_name} {
190 entry #{@signature.get_name} #{@entry_port_name};
191 call #{@signature.get_name} #{@call_port_name};
192
193 cell #{@ct_name}Client #{@cell_name}Client{
194 };
195
196 [active]
197 cell #{@ct_name}Server #{@cell_name}Server{
198 #{@call_port_name} => composite.#{@call_port_name};
199 };
200
201 composite.#{@entry_port_name} => #{@cell_name}.#{@entry_port_name};
202};
203=end
204
205 end
206
207 #=== through cell コードを生成
208 #
209 #
210 def gen_through_cell_code( file )
211 #require "HRP2Cache"
212
213 gen_plugin_decl_code( file )
214
215 if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype)
216 # セルを探す
217 # path =["::",@next_cell.get_name] # mikan namespace
218 # cell = Namespace.find( path )
219 # cell = Namespace.find( @next_cell.get_namespace_path )
220
221 ##### クライアント側のセルの生成 #####
222 # file.print "[domain(HRP2, \"trusted\")]"
223 nest = @start_region.gen_region_str_pre file
224 nest_str = " " * nest
225
226 # クライアント側チャンネルの生成
227 # 拡張サービスコール呼出し
228 file.print <<EOT
229#{nest_str} // Client Side Channel
230#{nest_str} cell #{@ct_name} #{@cell_name}{
231#{nest_str} };
232
233EOT
234
235 @start_region.gen_region_str_post file
236 file.print "\n\n"
237
238 ##### サーバー側のセルの生成 #####
239 nest = @end_region.gen_region_str_pre file
240 nest_str = " " * nest
241
242 # サーバー側チャンネルの生成
243 # 拡張サービスコール本体
244 file.print <<EOT
245
246#{nest_str} // Server Side Channel
247#{nest_str} cell #{@ct_name_body} #{@cell_name_body}{
248#{nest_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name};
249#{nest_str} };
250EOT
251
252 @end_region.gen_region_str_post file
253
254 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
255 file2.print "\n/* Generated by HRP2SVCPlugin */\n\n"
256 file2.print <<EOT
257#include "#{@ct_name_body}_factory.h"
258EOT
259 file2.close
260 else
261
262 ##### クライアント側のセルの生成 #####
263 nest = @start_region.gen_region_str_pre file
264 nest_str = " " * nest
265
266 # クライアント側チャンネルの生成
267 # 拡張サービスコール呼出し
268 file.print <<EOT
269#{nest_str} // Client Side Channel
270#{nest_str} cell #{@ct_name} #{@cell_name}{
271#{nest_str} #{@call_port_name} = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name};
272#{nest_str} };
273
274EOT
275
276 @start_region.gen_region_str_post file
277 file.print "\n\n"
278
279 end
280 end
281
282 #=== 受け口関数の本体(C言語)を生成する
283 # 通常であれば、ジェネレータは受け口関数のテンプレートを生成する
284 # プラグインの場合、変更する必
285要のないセルタイプコードを生成する
286 #file:: FILE 出力å…
287ˆãƒ•ã‚¡ã‚¤ãƒ«
288 #b_singleton:: bool true if singleton
289 #ct_name:: Symbol
290 #global_ct_name:: string
291 #sig_name:: string
292 #ep_name:: string
293 #func_name:: string
294 #func_global_name:: string
295 #func_type:: class derived from Type
296 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 )
297 puts "generate ep_func for #{ct_name}"
298
299 if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype)
300 # 拡張サービスコール呼出し
301 if ! func_type.get_type.kind_of?( VoidType ) then
302 file.print( " #{func_type.get_type_str} retval;\n" )
303 end
304
305 if ! b_singleton then
306
307 file.print <<EOT
308 #{ct_name}_CB *p_cellcb;
309 if( VALID_IDX( idx ) ){
310 p_cellcb = #{global_ct_name}_GET_CELLCB(idx);
311 }else{
312 /* エラー処理コードをここに記述 */
313 }
314
315EOT
316 end
317
318 # p "celltype_name, sig_name, func_name, func_global_name"
319 # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
320
321 delim = ""
322 if ! func_type.get_type.kind_of?( VoidType ) then
323 file.print( " retval = (#{func_type.get_type_str})" )
324 else
325 file.print( " " )
326 end
327
328 #file.print( "#{@call_port_name}_#{func_name}(" )
329 # svcid = SVCManage.assign_id
330 new_func = false
331 if SVCManage.include_func_id?( "#{@ct_name_body}_#{func_name}" ) == false
332 new_func = true
333 SVCManage.set_func_id( "#{@ct_name_body}_#{func_name}" )
334 end
335 svcid = SVCManage.get_func_id( "#{@ct_name_body}_#{func_name}" )
336 #file.print( "cal_svc( #{@ct_name_body}_#{func_name}" )
337 file.print( "cal_svc( #{svcid.to_s}" )
338
339 # if ( ! b_singleton ) then
340 # file.print( " tecs_this" )
341 # delim = ","
342 # end
343
344 i = 0
345 params.each{ |param|
346 delim = ","
347 file.printf( "#{delim} #{param.get_name}" )
348 i += 1
349 }
350
351 while(i < 5) do
352 delim = ","
353 file.printf( "#{delim} 0" )
354 i += 1
355 end
356
357 file.print( " );\n" )
358
359 if ! func_type.get_type.kind_of?( VoidType ) then
360 file.print( " return retval;\n" )
361 end
362
363 # 拡張サービスコール本体
364 if new_func
365 file2 = AppFile.open( "#{$gen}/#{@ct_name_body}.c" )
366
367# if @@generated_celltype_header[ @ct_name_body ].nil?
368# @@generated_celltype_header[ @ct_name_body ] = true
369# p @@generated_celltype_header[ @ct_name_body ]
370# file2.print <<EOT
371# /*
372# * このファイルは tecsgen により自動生成されました
373# * このファイルを編集して使用することは、意図されていません
374# */
375# /* #[<PREAMBLE>]#
376# * #[<...>]# から #[</...>]# で囲まれたコメントは編集しないでください
377# * tecsmerge によるマージに使用されます
378# *
379# * #[</PREAMBLE>]# */
380#
381# /* プロトタイプ宣言や変数の定義をここに書きます #_PAC_# */
382# #include "#{@ct_name_body}_tecsgen.h"
383#
384# #ifndef E_OK
385# #define E_OK 0 /* success */
386# #define E_ID (-18) /* illegal ID */
387# #endif
388#
389# EOT
390# end
391
392 if func_type.get_type.kind_of?( VoidType ) then
393 retval_assign = ""
394 retval_return = ""
395 else
396 retval_assign = "retval = (ER_UINT)"
397 retval_return = "retval"
398 end
399
400 file2.print <<EOT
401ER_UINT
402#{@ct_name_body}_#{func_name}(intptr_t par1, intptr_t par2, intptr_t par3, intptr_t par4, intptr_t par5, ID cdmid)
403{
404 #{@ct_name_body}_CB *p_cellcb;
405#if 0
406 if( VALID_IDX( idx ) ){
407 p_cellcb = #{@ct_name_body}_GET_CELLCB(idx);
408 }else{
409 /* エラー処理コードをここに記述 */
410 }
411#else
412 p_cellcb = NULL;
413#endif
414
415 ER_UINT retval = 0;
416
417EOT
418
419 num = 1
420 params.each{ |param|
421 if param.get_declarator.get_ptr_level > 0 then
422 if param.get_direction == :IN then
423 file2.print <<EOT
424 if(prb_mem((void *)par#{num.to_s}, sizeof(#{param.get_type.get_type_str}), TSK_SELF, TPM_READ) != E_OK){
425 return E_MACV;
426 }
427EOT
428
429 elsif param.get_direction == :OUT then
430 file2.print <<EOT
431 if(prb_mem((void *)par#{num.to_s}, sizeof(#{param.get_type.get_type_str}), TSK_SELF, TPM_WRITE) != E_OK){
432 return E_MACV;
433 }
434EOT
435
436 end
437 end
438 num += 1
439 }
440
441 file2.print" #{retval_assign}#{@call_port_name}_#{func_name}("
442
443 delim = ""
444 num = 1
445 params.each{ |param|
446 file2.print "#{delim}"
447 delim = ", "
448 file2.print "(#{param.get_type.get_type_str})"
449 file2.print "par" + num.to_s
450 file2.print param.get_type.get_type_str_post
451 num += 1
452 }
453
454 file2.print ");\n"
455
456 if !func_type.get_type.kind_of?( VoidType ) then
457 file2.print "\n return #{retval_return};\n"
458 end
459 file2.print "}\n\n"
460
461 file2.close
462
463 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
464 file2.print "\n/* Generated by HRP2SVCPlugin */\n\n"
465 # TODO: スタックサイズは適当
466 file2.print <<EOT
467KERNEL_DOMAIN{
468 DEF_SVC( #{svcid.to_s}, { TA_NULL, #{@ct_name_body}_#{func_name}, 256 } );
469}
470EOT
471 file2.close
472
473 file2 = AppFile.open( "#{$gen}/#{@ct_name_body}_factory.h" )
474 file2.print "\n/* Generated by HRP2SVCPlugin */\n\n"
475 file2.print <<EOT
476extern ER_UINT #{@ct_name_body}_#{func_name}(intptr_t par1, intptr_t par2, intptr_t par3, intptr_t par4, intptr_t par5, ID cdmid);
477EOT
478 file2.close
479 end
480 else
481 # カーネルドメインのセルは特別なことは何もせず,普通に呼び出す
482 super
483 end
484 end
485end
486
487
Note: See TracBrowser for help on using the repository browser.