source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRP2KernelObjectPlugin.rb@ 389

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

ビルドが通るよう更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
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# 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13# スコード中に含まれていること.
14# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17# の無保証規定を掲載すること.
18# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20# と.
21# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22# 作権表示,この利用条件および下記の無保証規定を掲載すること.
23# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24# 報告すること.
25# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29# 免責すること.
30#
31# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35# の責任を負わない.
36#
37# $Id$
38#++
39
40# Regionクラスにメソッドを追加
41=begin
42class Region
43 def get_params
44 return @region_type_param
45 end
46
47 def get_param
48 return @region_type_param[0]
49 end
50
51 def is_root
52 return self == @@root_namespace
53 end
54end
55=end
56
57# Cellクラスにインスタンス変数とメソッドを追加
58=begin
59class Cell
60 def set_referenced_region( region )
61 if @referenced_regions.nil?
62 @referenced_regions = Array.new
63 end
64 if !@referenced_regions.include?(region)
65 @referenced_regions << region
66 end
67 end
68
69 def get_referenced_regions
70 return @referenced_regions
71 end
72
73 # set_referenced_cellにしたほうがよい
74 # def set_referenced_region( region, port_name )
75 def set_referenced_cell( cell, port_name )
76 if @referenced_cells.nil?
77 @referenced_cells = Hash.new
78 end
79 if !@referenced_cells.include?(port_name)
80 @referenced_cells[port_name] = Array.new
81 end
82 if !@referenced_cells[port_name].include?(cell)
83 @referenced_cells[port_name] << cell
84 end
85
86 region = cell.get_region
87 puts "***** set_referenced_regions *****"
88 puts "region=#{region.get_name}, port=#{port_name}(#{port_name.class})"
89 if @referenced_regions.nil?
90 @referenced_regions = Hash.new
91 end
92 if !@referenced_regions.include?(port_name)
93 @referenced_regions[port_name] = Array.new
94 end
95 if !@referenced_regions[port_name].include?(region)
96 @referenced_regions[port_name] << region
97 end
98 puts "#{@referenced_regions[port_name]}"
99 end
100
101 def get_referenced_cells( port_name )
102 if !@referenced_cells.nil? && @referenced_cells.include?(port_name)
103 return @referenced_cells[port_name]
104 else
105 return nil
106 end
107 end
108
109 def get_referenced_regions( port_name )
110 if !@referenced_regions.nil? && @referenced_regions.include?(port_name)
111 return @referenced_regions[port_name]
112 else
113 return nil
114 end
115 end
116
117 def self.get_cell_list
118 return @@cell_list
119 end
120
121 def self.get_cell_list2
122 return @@cell_list2
123 end
124end
125=end
126
127#== celltype プラグインの共通の親クラス
128class HRP2KernelObjectPlugin < CelltypePlugin
129 # @@obj_hash = {}
130
131 #@celltype:: Celltype
132 #@option:: String :オプション文字列
133 def initialize( celltype, option )
134 super
135 # それぞれのカーネルオブジェクトを解析対象セルタイプに追加
136 HRP2KernelObjectPlugin.set_celltype(celltype)
137 end
138
139 #=== HRP2KernelObjectPlugin#print_cfg_cre
140 # 各種カーネルオブジェクトのCRE_*の出力
141 # file:: FILE: 出力先ファイル
142 # val :: string: カーネルオブジェクトの属性の解析結果
143 # tab :: string: インデント用のtab
144 def print_cfg_cre(file, cell, val, tab)
145 raise "called virtual method print_cfg_cre in #{@celltype.get_name} plugin"
146 end
147
148 #=== HRP2KernelObjectPlugin#print_cfg_sac
149 # 各種カーネルオブジェクトのSAC_*の出力
150 # file:: FILE: 出力先ファイル
151 # val :: string: カーネルオブジェクトの属性の解析結果
152 # acv :: string: アクセスベクタ
153 def print_cfg_sac(file, val, acv)
154 raise "called virtual method print_cfg_sac in #{@celltype.get_name} plugin"
155 end
156
157 #=== HRP2KernelObjectPlugin#get_entry_ports_name_list
158 # カーネルオブジェクトの各種アクセスの種別の受け口名を取得
159 def get_entry_ports_name_list()
160 raise "called virtual method get_entry_ports_name_list in #{@celltype.get_name} plugin"
161 end
162
163 def string_cfg_cre(cell, val)
164 raise "called virtual method string_cfg_cre in #{@celltype.get_name} plugin"
165 end
166
167 def gen_factory file
168 puts "===== begin #{@celltype.get_name.to_s} plugin ====="
169
170 # 対象となるすべてのセルについて、受け口に結合されている
171 # セルの所属ドメインを解析
172 if !HRP2KernelObjectPlugin.isChecked()
173 HRP2KernelObjectPlugin.check_referenced_cells()
174 else
175 puts "***** already checked"
176 end
177
178 # 追記するために AppFile を使う(文字コード変換されない)
179 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
180 file2.print "\n/* Generated by #{self.class.name} */\n\n"
181
182 @celltype.get_cell_list.each { |cell|
183 if cell.is_generate?
184 puts "===== begin check my domain #{cell.get_name} ====="
185 # attrの値をハッシュに入れる
186 val = {}
187 @celltype.get_attribute_list.each{ |a|
188 # p a.get_name
189 if a.get_type.kind_of?( ArrayType )
190 val[a.get_name] = []
191 if j = cell.get_join_list.get_item(a.get_name)
192 # セル生成時に初期化する場合
193 j.get_rhs.each { |elem|
194 val[a.get_name] << elem.to_s
195 }
196 elsif i = a.get_initializer
197 # セルタイプの初期化値を使う場合
198 i.each { |elem|
199 val[a.get_name] << elem.to_s
200 }
201 else
202 raise "attribute is not initialized"
203 end
204 else
205 if j = cell.get_join_list.get_item(a.get_name)
206 # セル生成時に初期化する場合
207 val[a.get_name] = j.get_rhs.to_s
208 elsif i = a.get_initializer
209 # セルタイプの初期化値を使う場合
210 val[a.get_name] = i.to_s
211 else
212 raise "attribute is not initialized"
213 end
214 end
215 }
216 # generate.rbを参考に
217 # $id$を置換
218 if val[:id].nil? != true
219 puts val[:id]
220 #val[:id] = val[:id].gsub( /(^|[^\$])\$id\$/, "\\1#{@celltype.get_name.to_s}_#{cell.get_name.to_s}" )
221 val[:id] = @celltype.subst_name( val[:id], @celltype.get_name_array( cell ) )
222 end
223 # $cbp$の代わり
224 index = cell.get_id - @celltype.get_id_base
225 cell_CB_name = "#{@celltype.get_global_name}_CB_tab[#{index}]"
226 cell_domain_root = cell.get_region.get_domain_root
227 cell_domain_type = cell.get_region.get_domain_root.get_domain_type
228
229 # CRE_XXX/DEF_XXXの生成
230 if cell_domain_type.get_option.to_s != "OutOfDomain"
231 # 保護ドメインに属する場合
232 if !HRP2KernelObjectPlugin.include_region(cell_domain_root.get_name.to_s)
233 # その保護ドメインの.cfgが生成されていない場合
234 HRP2KernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s)
235 puts "~~~~~ #{cell_domain_root.get_name.to_s} is registered!"
236
237 # if cell.get_region.get_param == :KERNEL_DOMAIN
238 if cell_domain_type.get_option.to_s == "trusted"
239 # file2.print "#{cell.get_region.get_name.to_s}{\n"
240 file2.print "KERNEL_DOMAIN{\n"
241 else
242 file2.print "DOMAIN(#{cell_domain_root.get_name.to_s}){\n"
243 end
244 file2.puts "\tINCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");"
245 file2.puts "}\n"
246 else
247 dbgPrint "~~~~~ #{cell.get_region.get_name.to_s} is included in"
248 # p @@region_list
249 end
250 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg" )
251 print_cfg_cre(file3, cell, val,"")
252 file3.close
253 else
254 # 無所属の場合
255 puts "~~~~~ #{cell_domain_root.get_name.to_s} is OutOfDomain"
256 print_cfg_cre(file2, cell, val, "")
257 end
258
259 puts "===== end check my domain #{cell.get_name} ====="
260 # SAC_XXXの生成
261 if !val[:accessPattern].nil?
262 puts "===== begin check regions #{cell.get_name} ====="
263 # p val[:accessPattern]
264 # p val[:accessPattern].class
265
266 #ep = [ :eTaskActivate, :eTaskControl, :eTaskManage, :eTaskRefer ]
267 #各カーネルオブジェクトの受け口名を取得
268 # ep = get_entry_ports_name_list()
269 i = 0
270 acv = []
271 # アクセス許可ベクタの生成
272 val[:accessPattern].each { |acptnx|
273 # アクセス許可パターンの生成
274 if acptnx != "OMIT"
275 acv << acptnx
276 # p acv[i]
277 elsif cell_domain_type.get_option.to_s == "trusted"
278 acv << "TACP_KERNEL"
279 # p acv[i]
280 elsif cell_domain_type.get_option.to_s != "OutOfDomain"
281 acv << "TACP(#{cell_domain_root.get_name.to_s})"
282 else
283 acv << "TACP_SHARED"
284 end
285
286 i += 1
287 }
288
289 dbgPrint "acv = "
290 p acv
291
292 #各種SACの生成
293 domainOption = cell_domain_type.get_option
294 # if cell.get_region.get_region_type == :DOMAIN
295 if domainOption != "OutOfDomain"
296 # 保護ドメインに属する場合
297 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell.get_region.get_name.to_s}.cfg" )
298 print_cfg_sac(file3, val, acv)
299 file3.close
300 else
301 # 無所属の場合
302 print_cfg_sac(file2, val, acv)
303 end
304
305 puts "===== end check regions #{cell.get_name} ====="
306 end
307 end
308 }
309
310 puts "===== end #{@celltype.get_name.to_s} plugin ====="
311 file2.close
312 end
313
314 # カーネルオブジェクトセルタイプの管理
315 # HRP2KernelObjectPluginクラスに対してメソッド呼出しを行うことを想定
316 @@checked = false
317 @@celltype_list = []
318 @@region_list = []
319
320 def self.isChecked()
321 return @@checked
322 end
323
324 def self.check_referenced_cells()
325 dbgPrint "===== begin check registered celltype =====\n"
326 self.get_celltype_list.each { |ct|
327 dbgPrint( ct.get_name.to_s + "\n" )
328 }
329 dbgPrint "===== end check registered celltype =====\n"
330
331=begin
332 Cell.get_cell_list2.each { |cell|
333 cell.get_celltype.get_port_list.each{ |p|
334 next if p.get_port_type != :CALL
335 j = cell.get_join_list.get_item(p.get_name)
336 printf "===== check call port : "
337 # p p.get_name.to_s
338 next if j.nil? # 未結合の場合
339 if @@celltype_list.include?(j.get_celltype)
340 # j.get_cell.set_referenced_region(cell.get_region)
341 # j.get_cell.set_referenced_region(cell.get_region, j.get_port_name)
342 j.get_cell.set_referenced_cell(cell, j.get_port_name)
343 printf "===== check joined rhs cell : "
344 # p j.get_cell.get_name.to_s
345 printf "===== check joined rhs port_name : "
346 # p j.get_port_name
347 end
348 }
349 }
350=end
351 @@checked = true
352 end
353
354 def self.set_celltype( celltype )
355 @@celltype_list << celltype
356 end
357
358 def self.get_celltype_list
359 return @@celltype_list
360 end
361
362 def self.set_region_list( region )
363 @@region_list << region
364 end
365
366 def self.include_region( region )
367 return @@region_list.include?(region)
368 end
369
370 def self.include_celltype?( celltype )
371 return @@celltype_list.include?(celltype)
372 end
373
374end
375
Note: See TracBrowser for help on using the repository browser.