source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRP2KernelObjectPlugin.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.0 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2017 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# Regionクラスにメソッドを追加
56=begin
57class Region
58 def get_params
59 return @region_type_param
60 end
61
62 def get_param
63 return @region_type_param[0]
64 end
65
66 def is_root
67 return self == @@root_namespace
68 end
69end
70=end
71
72# Cellクラスにインスタンス変数とメソッドを追加
73=begin
74class Cell
75 def set_referenced_region( region )
76 if @referenced_regions.nil?
77 @referenced_regions = Array.new
78 end
79 if !@referenced_regions.include?(region)
80 @referenced_regions << region
81 end
82 end
83
84 def get_referenced_regions
85 return @referenced_regions
86 end
87
88 # set_referenced_cellにしたほうがよい
89 # def set_referenced_region( region, port_name )
90 def set_referenced_cell( cell, port_name )
91 if @referenced_cells.nil?
92 @referenced_cells = Hash.new
93 end
94 if !@referenced_cells.include?(port_name)
95 @referenced_cells[port_name] = Array.new
96 end
97 if !@referenced_cells[port_name].include?(cell)
98 @referenced_cells[port_name] << cell
99 end
100
101 region = cell.get_region
102 puts "***** set_referenced_regions *****"
103 puts "region=#{region.get_name}, port=#{port_name}(#{port_name.class})"
104 if @referenced_regions.nil?
105 @referenced_regions = Hash.new
106 end
107 if !@referenced_regions.include?(port_name)
108 @referenced_regions[port_name] = Array.new
109 end
110 if !@referenced_regions[port_name].include?(region)
111 @referenced_regions[port_name] << region
112 end
113 puts "#{@referenced_regions[port_name]}"
114 end
115
116 def get_referenced_cells( port_name )
117 if !@referenced_cells.nil? && @referenced_cells.include?(port_name)
118 return @referenced_cells[port_name]
119 else
120 return nil
121 end
122 end
123
124 def get_referenced_regions( port_name )
125 if !@referenced_regions.nil? && @referenced_regions.include?(port_name)
126 return @referenced_regions[port_name]
127 else
128 return nil
129 end
130 end
131
132 def self.get_cell_list
133 return @@cell_list
134 end
135
136 def self.get_cell_list2
137 return @@cell_list2
138 end
139end
140=end
141
142#== celltype プラグインのå…
143±é€šã®è¦ªã‚¯ãƒ©ã‚¹
144class HRP2KernelObjectPlugin < CelltypePlugin
145 # @@obj_hash = {}
146
147 #@celltype:: Celltype
148 #@option:: String :オプション文字列
149 def initialize( celltype, option )
150 super
151 # それぞれのカーネルオブジェクトを解析対象セルタイプに追加
152 HRP2KernelObjectPlugin.set_celltype(celltype)
153 end
154
155 #=== HRP2KernelObjectPlugin#print_cfg_cre
156 # 各種カーネルオブジェクトのCRE_*の出力
157 # file:: FILE: 出力å…
158ˆãƒ•ã‚¡ã‚¤ãƒ«
159 # val :: string: カーネルオブジェクトの属性の解析結果
160 # tab :: string: インデント用のtab
161 def print_cfg_cre(file, cell, val, tab)
162 raise "called virtual method print_cfg_cre in #{@celltype.get_name} plugin"
163 end
164
165 #=== HRP2KernelObjectPlugin#print_cfg_sac
166 # 各種カーネルオブジェクトのSAC_*の出力
167 # file:: FILE: 出力å…
168ˆãƒ•ã‚¡ã‚¤ãƒ«
169 # val :: string: カーネルオブジェクトの属性の解析結果
170 # acv :: string: アクセスベクタ
171 def print_cfg_sac(file, val, acv)
172 raise "called virtual method print_cfg_sac in #{@celltype.get_name} plugin"
173 end
174
175 #=== HRP2KernelObjectPlugin#get_entry_ports_name_list
176 # カーネルオブジェクトの各種アクセスの種別の受け口名を取得
177 def get_entry_ports_name_list()
178 raise "called virtual method get_entry_ports_name_list in #{@celltype.get_name} plugin"
179 end
180
181 def string_cfg_cre(cell, val)
182 raise "called virtual method string_cfg_cre in #{@celltype.get_name} plugin"
183 end
184
185 def gen_factory file
186 puts "===== begin #{@celltype.get_name.to_s} plugin ====="
187
188 # 対象となるすべてのセルについて、受け口に結合されている
189 # セルの所属ドメインを解析
190 if !HRP2KernelObjectPlugin.isChecked()
191 HRP2KernelObjectPlugin.check_referenced_cells()
192 else
193 puts "***** already checked"
194 end
195
196 # 追記するために AppFile を使う(文字コード変換されない)
197 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
198 file2.print "\n/* Generated by #{self.class.name} */\n\n"
199
200 @celltype.get_cell_list.each { |cell|
201 if cell.is_generate?
202 puts "===== begin check my domain #{cell.get_name} ====="
203 # attrの値をハッシュにå…
204¥ã‚Œã‚‹
205 val = {}
206 @celltype.get_attribute_list.each{ |a|
207 # p a.get_name
208 if a.get_type.kind_of?( ArrayType )
209 val[a.get_name] = []
210 if j = cell.get_join_list.get_item(a.get_name)
211 # セル生成時に初期化する場合
212 j.get_rhs.each { |elem|
213 val[a.get_name] << elem.to_s
214 }
215 elsif i = a.get_initializer
216 # セルタイプの初期化値を使う場合
217 i.each { |elem|
218 val[a.get_name] << elem.to_s
219 }
220 else
221 raise "attribute is not initialized"
222 end
223 else
224 if j = cell.get_join_list.get_item(a.get_name)
225 # セル生成時に初期化する場合
226 val[a.get_name] = j.get_rhs.to_s
227 elsif i = a.get_initializer
228 # セルタイプの初期化値を使う場合
229 val[a.get_name] = i.to_s
230 else
231 raise "attribute is not initialized"
232 end
233 end
234 }
235 # generate.rbを参考に
236 # $id$を置換
237 if val[:id].nil? != true
238 puts val[:id]
239 #val[:id] = val[:id].gsub( /(^|[^\$])\$id\$/, "\\1#{@celltype.get_name.to_s}_#{cell.get_name.to_s}" )
240 val[:id] = @celltype.subst_name( val[:id], @celltype.get_name_array( cell ) )
241 end
242 # $cbp$の代わり
243 index = cell.get_id - @celltype.get_id_base
244 cell_CB_name = "#{@celltype.get_global_name}_CB_tab[#{index}]"
245 cell_domain_root = cell.get_region.get_domain_root
246 cell_domain_type = cell.get_region.get_domain_root.get_domain_type
247
248 # CRE_XXX/DEF_XXXの生成
249 if cell_domain_type.get_option.to_s != "OutOfDomain"
250 # 保護ドメインに属する場合
251 if !HRP2KernelObjectPlugin.include_region(cell_domain_root.get_name.to_s)
252 # その保護ドメインの.cfgが生成されていない場合
253 HRP2KernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s)
254 puts "~~~~~ #{cell_domain_root.get_name.to_s} is registered!"
255
256 # if cell.get_region.get_param == :KERNEL_DOMAIN
257 if cell_domain_type.get_option.to_s == "trusted"
258 # file2.print "#{cell.get_region.get_name.to_s}{\n"
259 file2.print "KERNEL_DOMAIN{\n"
260 else
261 file2.print "DOMAIN(#{cell_domain_root.get_name.to_s}){\n"
262 end
263 file2.puts "\tINCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");"
264 file2.puts "}\n"
265 else
266 dbgPrint "~~~~~ #{cell.get_region.get_name.to_s} is included in"
267 # p @@region_list
268 end
269 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg" )
270 print_cfg_cre(file3, cell, val,"")
271 file3.close
272 else
273 # 無所属の場合
274 puts "~~~~~ #{cell_domain_root.get_name.to_s} is OutOfDomain"
275 print_cfg_cre(file2, cell, val, "")
276 end
277
278 puts "===== end check my domain #{cell.get_name} ====="
279 # SAC_XXXの生成
280 if !val[:accessPattern].nil?
281 puts "===== begin check regions #{cell.get_name} ====="
282 # p val[:accessPattern]
283 # p val[:accessPattern].class
284
285 #ep = [ :eTaskActivate, :eTaskControl, :eTaskManage, :eTaskRefer ]
286 #各カーネルオブジェクトの受け口名を取得
287 # ep = get_entry_ports_name_list()
288 i = 0
289 acv = []
290 # アクセス許可ベクタの生成
291 val[:accessPattern].each { |acptnx|
292 # アクセス許可パターンの生成
293 if acptnx != "OMIT"
294 acv << acptnx
295 # p acv[i]
296 elsif cell_domain_type.get_option.to_s == "trusted"
297 acv << "TACP_KERNEL"
298 # p acv[i]
299 elsif cell_domain_type.get_option.to_s != "OutOfDomain"
300 acv << "TACP(#{cell_domain_root.get_name.to_s})"
301 else
302 acv << "TACP_SHARED"
303 end
304
305 i += 1
306 }
307
308 dbgPrint "acv = "
309 p acv
310
311 #各種SACの生成
312 domainOption = cell_domain_type.get_option
313 # if cell.get_region.get_region_type == :DOMAIN
314 if domainOption != "OutOfDomain"
315 # 保護ドメインに属する場合
316 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell.get_region.get_name.to_s}.cfg" )
317 print_cfg_sac(file3, val, acv)
318 file3.close
319 else
320 # 無所属の場合
321 print_cfg_sac(file2, val, acv)
322 end
323
324 puts "===== end check regions #{cell.get_name} ====="
325 end
326 end
327 }
328
329 puts "===== end #{@celltype.get_name.to_s} plugin ====="
330 file2.close
331 end
332
333 # カーネルオブジェクトセルタイプの管理
334 # HRP2KernelObjectPluginクラスに対してメソッド呼出しを行うことを想定
335 @@checked = false
336 @@celltype_list = []
337 @@region_list = []
338
339 def self.isChecked()
340 return @@checked
341 end
342
343 def self.check_referenced_cells()
344 dbgPrint "===== begin check registered celltype =====\n"
345 self.get_celltype_list.each { |ct|
346 dbgPrint( ct.get_name.to_s + "\n" )
347 }
348 dbgPrint "===== end check registered celltype =====\n"
349
350=begin
351 Cell.get_cell_list2.each { |cell|
352 cell.get_celltype.get_port_list.each{ |p|
353 next if p.get_port_type != :CALL
354 j = cell.get_join_list.get_item(p.get_name)
355 printf "===== check call port : "
356 # p p.get_name.to_s
357 next if j.nil? # 未結合の場合
358 if @@celltype_list.include?(j.get_celltype)
359 # j.get_cell.set_referenced_region(cell.get_region)
360 # j.get_cell.set_referenced_region(cell.get_region, j.get_port_name)
361 j.get_cell.set_referenced_cell(cell, j.get_port_name)
362 printf "===== check joined rhs cell : "
363 # p j.get_cell.get_name.to_s
364 printf "===== check joined rhs port_name : "
365 # p j.get_port_name
366 end
367 }
368 }
369=end
370 @@checked = true
371 end
372
373 def self.set_celltype( celltype )
374 @@celltype_list << celltype
375 end
376
377 def self.get_celltype_list
378 return @@celltype_list
379 end
380
381 def self.set_region_list( region )
382 @@region_list << region
383 end
384
385 def self.include_region( region )
386 return @@region_list.include?(region)
387 end
388
389 def self.include_celltype?( celltype )
390 return @@celltype_list.include?(celltype)
391 end
392
393end
394
Note: See TracBrowser for help on using the repository browser.