source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRPKernelObjectPlugin.rb@ 374

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

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 16.1 KB
Line 
1# coding: utf-8
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2018 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#
38# $Id$
39#++
40
41#== celltype プラグインの共通の親クラス
42class HRPKernelObjectPlugin < CelltypePlugin
43 # @@obj_hash = {}
44
45 #@celltype:: Celltype
46 #@option:: String :オプション文字列
47 def initialize( celltype, option )
48 super
49 #
50 # それぞれのカーネルオブジェクトを解析対象セルタイプに追加
51 # 目的:
52 # - カーネルオブジェクトのセルをメモリ保護対象外とする
53 # - カーネルオブジェクト本体の管理はTECSでなくOSで実施するため
54 # - カーネルオブジェクトのセルへのアクセスを直接関数呼出し
55 #  とする
56 # - システムサービス呼出しはOSが提供するため
57 HRPKernelObjectPlugin.set_celltype(celltype)
58 end
59
60 #=== HRPKernelObjectPlugin#print_cfg_cre
61 # 各種カーネルオブジェクトのCRE_*の出力
62 # file:: FILE: 出力先ファイル
63 # val :: string: カーネルオブジェクトの属性の解析結果
64 # tab :: string: インデント用のtab
65 def print_cfg_cre(file, cell, val, tab)
66 raise "called virtual method print_cfg_cre in #{@celltype.get_name} plugin"
67 end
68
69 #=== HRPKernelObjectPlugin#print_cfg_sac
70 # 各種カーネルオブジェクトのSAC_*の出力
71 # file:: FILE: 出力先ファイル
72 # val :: string: カーネルオブジェクトの属性の解析結果
73 # acv :: string: アクセスベクタ
74 def print_cfg_sac(file, val, acv)
75 raise "called virtual method print_cfg_sac in #{@celltype.get_name} plugin"
76 end
77
78 #
79 # セルタイププラグインの本体メソッド
80 # - 静的APIの生成
81 # file:: FILE: 出力先ファイル
82 #
83 def gen_factory file
84 dbgPrint "===== begin #{@celltype.get_name.to_s} plugin =====\n"
85
86 #
87 # 対象となるすべてのセルについて、受け口に結合されている
88 # セルの所属ドメインを解析
89 # - 生成すべきcfgファイル名を取得するために必要
90 #
91 if !HRPKernelObjectPlugin.isChecked()
92 HRPKernelObjectPlugin.check_referenced_cells()
93 else
94 dbgPrint "***** already checked\n"
95 end
96
97 # 追記するために AppFile を使う(文字コード変換されない)
98 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
99 file2.print "\n/* Generated by #{self.class.name} */\n\n"
100
101 @celltype.get_cell_list.each { |cell|
102 if cell.is_generate?
103 dbgPrint "===== begin check my domain #{cell.get_name} =====\n"
104 #
105 # カーネルオブジェクトの属性を,valにコピー
106 #
107 val = {}
108 @celltype.get_attribute_list.each{ |a|
109 # p a.get_name
110 if a.get_type.kind_of?( ArrayType )
111 val[a.get_name] = []
112 if j = cell.get_join_list.get_item(a.get_name)
113 # セル生成時に初期化する場合
114 j.get_rhs.each { |elem|
115 val[a.get_name] << elem.to_s
116 }
117 elsif i = a.get_initializer
118 # セルタイプの初期化値を使う場合
119 i.each { |elem|
120 val[a.get_name] << elem.to_s
121 }
122 else
123 raise "attribute is not initialized"
124 end
125 else
126 if j = cell.get_join_list.get_item(a.get_name)
127 # セル生成時に初期化する場合
128 val[a.get_name] = j.get_rhs.to_s
129 elsif i = a.get_initializer
130 # セルタイプの初期化値を使う場合
131 val[a.get_name] = i.to_s
132 else
133 raise "attribute is not initialized"
134 end
135 end
136 }
137 # generate.rbを参考に
138 # $id$を置換
139 if val[:id].nil? != true
140 name_array = @celltype.get_name_array( cell )
141 val[:id] = @celltype.subst_name( val[:id], name_array )
142 end
143 # $cbp$の代わり
144 cell_domain_root = cell.get_region.get_domain_root
145 cell_domain_type = cell.get_region.get_domain_root.get_domain_type
146
147 # CRE_XXX/DEF_XXXの生成
148 if cell_domain_type.get_option.to_s != "OutOfDomain"
149 # 保護ドメインに属する場合
150 if !HRPKernelObjectPlugin.include_region(cell_domain_root.get_name.to_s)
151 # その保護ドメインの.cfgが生成されていない場合
152 HRPKernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s)
153 dbgPrint "~~~~~ #{cell_domain_root.get_name.to_s} is registered!\n"
154
155# # if cell.get_region.get_param == :KERNEL_DOMAIN
156# if cell_domain_type.get_option.to_s == "kernel"
157# file2.print "KERNEL_DOMAIN{\n"
158# else
159# file2.print "DOMAIN(#{cell_domain_root.get_name.to_s}){\n"
160# end
161# file2.puts "\tINCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");"
162# file2.puts "}\n"
163 else
164 dbgPrint "~~~~~ #{cell.get_region.get_namespace_path} is included in"
165 #p @@region_list
166 end
167 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell_domain_root.get_global_name}.cfg" )
168 print_cfg_cre(file3, cell, val,"")
169 file3.close
170 else
171 # 無所属の場合
172 dbgPrint "~~~~~ #{cell_domain_root.get_namespace_path} is OutOfDomain\n"
173 # print "~~~~~ #{cell_domain_root.get_namespace_path} is OutOfDomain\n"
174 # p cell_domain_root.get_name
175 if cell_domain_root.get_name == "::" then
176 print_cfg_cre(file2, cell, val, "")
177 else
178# if !HRPKernelObjectPlugin.include_region(cell_domain_root.get_name.to_s)
179# # その保護ドメインの.cfgが生成されていない場合
180# HRPKernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s)
181# file2.puts "INCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");\n"
182# end
183 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg" )
184 print_cfg_cre(file3, cell, val,"")
185 file3.close
186 end
187
188 end
189
190 dbgPrint "===== end check my domain #{cell.get_name} =====\n"
191
192 #
193 # SAC_XXXの生成
194 #
195 if !val[:accessPattern1].nil?
196 dbgPrint "===== begin check regions #{cell.get_name} =====\n"
197 i = 0
198 acv = { \
199 :accessPattern1 => val[:accessPattern1], \
200 :accessPattern2 => val[:accessPattern2], \
201 :accessPattern3 => val[:accessPattern3], \
202 :accessPattern4 => val[:accessPattern4] \
203 }
204 acv_tmp = []
205 domain_roots = HRPPlugin.get_inter_domain_join_roots cell
206 # 結合先セルのドメインを加える
207 if cell_domain_type.get_kind != :OutOfDomain then
208 domain_roots << cell_domain_root
209 end
210 domain_roots.each{ |dr|
211 case dr.get_domain_type.get_kind
212 when :user
213 acv_tmp << "TACP(#{dr.get_name})"
214 when :kernel
215 acv_tmp << "TACP_KERNEL"
216 when :OutOfDomain
217 if cell_domain_type.get_kind == :OutOfDomain then
218 # 呼び元も、呼び先も OutOfDomain の場合
219 acv_tmp << "TACP_SHARED"
220 end
221 end
222 }
223 acv_tmp.uniq!
224 if acv_tmp.length == 0 then
225 # 呼び先セルが無所属かつ、呼び元も無所属のみ、または結合無しの場合
226 acv_tmp = [ "TACP_SHARED" ]
227 end
228 b_info = false
229 b_warn = false
230 acv.each { |key, acp|
231 if !acp.nil?
232 if acp != "OMIT"
233 elsif cell_domain_type.get_kind != :OutOfDomain
234 # p "UserDomainCell or KernelDomainCell"
235 domain_roots = HRPPlugin.get_inter_domain_join_roots cell
236 domain_roots.each{ |dr|
237 #
238 case dr.get_domain_type.get_kind
239 when :kernel
240 when :user
241 if dr.get_namespace_path != cell.get_region.get_domain_root.get_namespace_path
242 # 他のユーザードメインからの結合
243 if( b_warn == false ) then
244 cdl_error( "HRP9999 '$1': kernel object joined from other user domain. kernel object joined from multi-user-domain must be placed out of domain", cell.get_name )
245 b_warn = true
246 end
247 end
248 when :OutOfDomain
249 if( b_info == false ) then
250 # 無所属からの結合
251 # cdl_error( "HRP9999 kernel object joined from out of domain" )
252 if cell_domain_type.get_kind == :OutOfDomain
253 # この情報は、不要と判断する (無所属から無所属へ結合があると、アクセス許可ベクタが設定されない)
254 # cdl_info2( cell.get_locale, "HRP9999 '$1': kernel object joined from out of domain, access vector is not set", cell.get_name )
255 b_info = true
256 end
257 end
258 else
259 raise "unknown domain kind"
260 end
261 }
262 # acv[key] = "TACP(#{cell_domain_root.get_name.to_s})"
263 else
264 # p "OutOfDomainCell"
265 # 無所属のセル
266 # 結合元ドメインに許可する
267 # 結合元に無所属のセルがあると、TACP_SHARED が設定される. フロー解析してドメインを特定できるのが、あるべき仕様
268 end
269 if acp == "OMIT"
270 acv[key] = acv_tmp.join( '|' )
271 end
272 end
273 }
274 #各種SACの生成
275 domainOption = cell_domain_type.get_option
276 # p "domain_root ", cell.get_region.get_domain_root.get_name
277 if domainOption != "OutOfDomain" || cell.get_region.get_domain_root.get_name != "::"
278 # 保護ドメインに属する場合
279 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell.get_region.get_name.to_s}.cfg" )
280 print_cfg_sac(file3, val, acv)
281 file3.close
282 else
283 # 無所属の場合
284 print_cfg_sac(file2, val, acv)
285 end
286
287 dbgPrint "===== end check regions #{cell.get_name} =====\n"
288 end
289 end
290 }
291 dbgPrint "===== end #{@celltype.get_name.to_s} plugin =====\n"
292 file2.close
293 end
294
295 # カーネルオブジェクトセルタイプの管理
296 # HRPKernelObjectPluginクラスに対してメソッド呼出しを行うことを想定
297 @@checked = false
298 @@celltype_list = []
299 @@region_list = []
300
301 def self.isChecked()
302 return @@checked
303 end
304
305 def self.check_referenced_cells()
306 dbgPrint "===== begin check registered celltype =====\n"
307 self.get_celltype_list.each { |ct|
308 dbgPrint( ct.get_name.to_s + "\n" )
309 }
310 dbgPrint "===== end check registered celltype =====\n"
311
312 @@checked = true
313 end
314
315 def self.set_celltype( celltype )
316 @@celltype_list << celltype
317 end
318
319 def self.get_celltype_list
320 return @@celltype_list
321 end
322
323 def self.set_region_list( region )
324 @@region_list << region
325 end
326
327 def self.include_region( region )
328 return @@region_list.include?(region)
329 end
330
331 def self.include_celltype?( celltype )
332 return @@celltype_list.include?(celltype)
333 end
334
335end
336
Note: See TracBrowser for help on using the repository browser.